aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorJacek Antonelli2008-12-01 17:39:58 -0600
committerJacek Antonelli2008-12-01 17:40:06 -0600
commit7abecb48babe6a6f09bf6692ba55076546cfced9 (patch)
tree8d18a88513fb97adf32c10aae78f4be1984942db
parentSecond Life viewer sources 1.21.6 (diff)
downloadmeta-impy-7abecb48babe6a6f09bf6692ba55076546cfced9.zip
meta-impy-7abecb48babe6a6f09bf6692ba55076546cfced9.tar.gz
meta-impy-7abecb48babe6a6f09bf6692ba55076546cfced9.tar.bz2
meta-impy-7abecb48babe6a6f09bf6692ba55076546cfced9.tar.xz
Second Life viewer sources 1.22.0-RC
-rw-r--r--linden/doc/contributions.txt17
-rw-r--r--linden/etc/message.xml36
-rw-r--r--linden/indra/CMakeLists.txt4
-rw-r--r--linden/indra/cmake/00-Common.cmake8
-rw-r--r--linden/indra/cmake/APR.cmake21
-rw-r--r--linden/indra/cmake/CopyWinLibs.cmake55
-rw-r--r--linden/indra/cmake/DBusGlib.cmake29
-rw-r--r--linden/indra/cmake/DirectX.cmake22
-rw-r--r--linden/indra/cmake/FindMono.cmake18
-rw-r--r--linden/indra/cmake/GooglePerfTools.cmake6
-rw-r--r--linden/indra/cmake/LLAudio.cmake8
-rw-r--r--linden/indra/cmake/LLCharacter.cmake4
-rw-r--r--linden/indra/cmake/LLCommon.cmake8
-rw-r--r--linden/indra/cmake/LLCrashLogger.cmake4
-rw-r--r--linden/indra/cmake/LLDatabase.cmake5
-rw-r--r--linden/indra/cmake/LLImage.cmake6
-rw-r--r--linden/indra/cmake/LLImageJ2COJ.cmake5
-rw-r--r--linden/indra/cmake/LLInventory.cmake4
-rw-r--r--linden/indra/cmake/LLKDU.cmake2
-rw-r--r--linden/indra/cmake/LLMath.cmake4
-rw-r--r--linden/indra/cmake/LLMedia.cmake7
-rw-r--r--linden/indra/cmake/LLMessage.cmake9
-rw-r--r--linden/indra/cmake/LLPhysics.cmake76
-rw-r--r--linden/indra/cmake/LLPrimitive.cmake4
-rw-r--r--linden/indra/cmake/LLScene.cmake4
-rw-r--r--linden/indra/cmake/LLUI.cmake4
-rw-r--r--linden/indra/cmake/LLVFS.cmake6
-rw-r--r--linden/indra/cmake/LLXML.cmake7
-rw-r--r--linden/indra/cmake/Linking.cmake8
-rw-r--r--linden/indra/cmake/Python.cmake1
-rw-r--r--linden/indra/cmake/QuickTime.cmake22
-rwxr-xr-xlinden/indra/develop.py118
-rw-r--r--linden/indra/lib/python/indra/base/lllog.py2
-rw-r--r--linden/indra/lib/python/indra/base/llsd.py205
-rw-r--r--linden/indra/lib/python/indra/ipc/llmessage.py2
-rw-r--r--linden/indra/lib/python/indra/ipc/llsdhttp.py2
-rw-r--r--linden/indra/lib/python/indra/ipc/mysql_pool.py23
-rw-r--r--linden/indra/lib/python/indra/ipc/saranwrap.py651
-rw-r--r--linden/indra/lib/python/indra/ipc/siesta.py4
-rw-r--r--linden/indra/lib/python/indra/util/fastest_elementtree.py31
-rw-r--r--linden/indra/lib/python/indra/util/iterators.py63
-rwxr-xr-xlinden/indra/lib/python/indra/util/iterators_test.py72
-rw-r--r--linden/indra/lib/python/indra/util/llmanifest.py3
-rwxr-xr-xlinden/indra/lib/python/indra/util/llperformance.py158
-rw-r--r--linden/indra/lib/python/indra/util/named_query.py20
-rwxr-xr-xlinden/indra/lib/python/indra/util/simperf_host_xml_parser.py338
-rwxr-xr-xlinden/indra/lib/python/indra/util/simperf_oprof_interface.py160
-rwxr-xr-xlinden/indra/lib/python/indra/util/simperf_proc_interface.py164
-rw-r--r--linden/indra/linux_crash_logger/CMakeLists.txt7
-rw-r--r--linden/indra/llaudio/CMakeLists.txt7
-rw-r--r--linden/indra/llaudio/audioengine.cpp33
-rw-r--r--linden/indra/llaudio/audioengine.h27
-rw-r--r--linden/indra/llaudio/audioengine_fmod.cpp2
-rw-r--r--linden/indra/llcharacter/llbvhloader.cpp45
-rw-r--r--linden/indra/llcharacter/lleditingmotion.cpp4
-rw-r--r--linden/indra/llcharacter/llmotioncontroller.cpp5
-rw-r--r--linden/indra/llcommon/CMakeLists.txt7
-rw-r--r--linden/indra/llcommon/indra_constants.h1
-rw-r--r--linden/indra/llcommon/llcommon.cpp4
-rw-r--r--linden/indra/llcommon/llfasttimer.h1
-rw-r--r--linden/indra/llcommon/llfindlocale.cpp4
-rw-r--r--linden/indra/llcommon/llfindlocale.h4
-rw-r--r--linden/indra/llcommon/llkeythrottle.h2
-rw-r--r--linden/indra/llcommon/llprocessor.h20
-rw-r--r--linden/indra/llcommon/llsdserialize.cpp2
-rw-r--r--linden/indra/llcommon/llsdserialize_xml.cpp13
-rw-r--r--linden/indra/llcommon/llstat.cpp562
-rw-r--r--linden/indra/llcommon/llstat.h142
-rw-r--r--linden/indra/llcommon/llstatenums.h17
-rw-r--r--linden/indra/llcommon/llstl.h5
-rw-r--r--linden/indra/llcommon/llstring.h37
-rw-r--r--linden/indra/llcommon/llthread.cpp4
-rw-r--r--linden/indra/llcommon/llthread.h4
-rw-r--r--linden/indra/llcommon/lltimer.cpp53
-rw-r--r--linden/indra/llcommon/lltimer.h5
-rw-r--r--linden/indra/llcommon/llversionserver.h4
-rw-r--r--linden/indra/llcommon/llversionviewer.h4
-rwxr-xr-xlinden/indra/llcrashlogger/llcrashlogger.cpp38
-rw-r--r--linden/indra/llimage/CMakeLists.txt7
-rw-r--r--linden/indra/llimage/llimage.cpp75
-rw-r--r--linden/indra/llimage/llimage.h33
-rw-r--r--linden/indra/llimage/llimagej2c.cpp141
-rw-r--r--linden/indra/llimage/llimagej2c.h5
-rw-r--r--linden/indra/llimage/llimageworker.cpp4
-rw-r--r--linden/indra/llimage/llimageworker.h6
-rw-r--r--linden/indra/llimagej2coj/CMakeLists.txt4
-rw-r--r--linden/indra/llimagej2coj/llimagej2coj.cpp19
-rw-r--r--linden/indra/llinventory/llinventory.cpp43
-rw-r--r--linden/indra/llinventory/llparcel.cpp14
-rw-r--r--linden/indra/llinventory/llsaleinfo.cpp11
-rw-r--r--linden/indra/llmath/llmodularmath.h57
-rw-r--r--linden/indra/llmath/lloctree.h4
-rw-r--r--linden/indra/llmath/v3color.h77
-rw-r--r--linden/indra/llmath/v4color.cpp166
-rw-r--r--linden/indra/llmath/v4color.h109
-rw-r--r--linden/indra/llmath/v4coloru.cpp2
-rw-r--r--linden/indra/llmath/v4coloru.h89
-rw-r--r--linden/indra/llmedia/CMakeLists.txt7
-rw-r--r--linden/indra/llmedia/llmediaimplexample2.cpp2
-rw-r--r--linden/indra/llmedia/llmediaimplgstreamer.cpp3
-rw-r--r--linden/indra/llmessage/CMakeLists.txt8
-rw-r--r--linden/indra/llmessage/llcachename.cpp221
-rw-r--r--linden/indra/llmessage/llcachename.h14
-rw-r--r--linden/indra/llmessage/llcircuit.cpp11
-rw-r--r--linden/indra/llmessage/llcircuit.h7
-rw-r--r--linden/indra/llmessage/llcurl.cpp6
-rw-r--r--linden/indra/llmessage/llhttpassetstorage.cpp4
-rw-r--r--linden/indra/llmessage/llhttpclient.cpp36
-rw-r--r--linden/indra/llmessage/lliohttpserver.cpp7
-rw-r--r--linden/indra/llmessage/lliosocket.cpp3
-rw-r--r--linden/indra/llmessage/llmail.cpp36
-rw-r--r--linden/indra/llmessage/llmail.h61
-rw-r--r--linden/indra/llmessage/llmessagetemplate.cpp22
-rw-r--r--linden/indra/llmessage/llmessagetemplate.h12
-rw-r--r--linden/indra/llmessage/llnamevalue.cpp4
-rw-r--r--linden/indra/llmessage/llnamevalue.h4
-rw-r--r--linden/indra/llmessage/llpartdata.h1
-rw-r--r--linden/indra/llmessage/llpumpio.cpp30
-rw-r--r--linden/indra/llmessage/llpumpio.h9
-rw-r--r--linden/indra/llmessage/llqueryflags.h2
-rw-r--r--linden/indra/llmessage/llurlrequest.cpp23
-rw-r--r--linden/indra/llmessage/message.cpp34
-rw-r--r--linden/indra/llmessage/message.h16
-rw-r--r--linden/indra/llprimitive/lltree_common.h13
-rw-r--r--linden/indra/llrender/llcubemap.cpp54
-rw-r--r--linden/indra/llrender/llcubemap.h2
-rw-r--r--linden/indra/llrender/llfont.cpp31
-rw-r--r--linden/indra/llrender/llfont.h1
-rw-r--r--linden/indra/llrender/llfontgl.cpp20
-rw-r--r--linden/indra/llrender/llgl.cpp64
-rw-r--r--linden/indra/llrender/llgl.h6
-rw-r--r--linden/indra/llrender/llglimmediate.h4
-rw-r--r--linden/indra/llrender/llglslshader.cpp8
-rw-r--r--linden/indra/llrender/llglslshader.h5
-rw-r--r--linden/indra/llrender/llglstates.h22
-rw-r--r--linden/indra/llrender/llimagegl.cpp266
-rw-r--r--linden/indra/llrender/llimagegl.h26
-rw-r--r--linden/indra/llrender/llpostprocess.cpp18
-rw-r--r--linden/indra/llrender/llrender.cpp364
-rw-r--r--linden/indra/llrender/llrender.h124
-rw-r--r--linden/indra/llrender/llrendertarget.cpp56
-rw-r--r--linden/indra/llrender/llrendertarget.h15
-rw-r--r--linden/indra/llrender/llshadermgr.cpp2
-rw-r--r--linden/indra/llrender/llvertexbuffer.cpp8
-rw-r--r--linden/indra/llrender/llvertexbuffer.h16
-rw-r--r--linden/indra/llui/llfloater.cpp22
-rw-r--r--linden/indra/llui/lllineeditor.cpp29
-rw-r--r--linden/indra/llui/lllineeditor.h3
-rw-r--r--linden/indra/llui/llmenugl.cpp3
-rw-r--r--linden/indra/llui/llmultislider.cpp2
-rw-r--r--linden/indra/llui/llscrollcontainer.cpp2
-rw-r--r--linden/indra/llui/llscrolllistctrl.cpp4
-rw-r--r--linden/indra/llui/llslider.cpp2
-rw-r--r--linden/indra/llui/lltexteditor.cpp144
-rw-r--r--linden/indra/llui/lltexteditor.h20
-rw-r--r--linden/indra/llui/llui.cpp88
-rw-r--r--linden/indra/llui/llview.cpp4
-rw-r--r--linden/indra/llui/llviewborder.cpp8
-rw-r--r--linden/indra/llvfs/CMakeLists.txt6
-rw-r--r--linden/indra/llvfs/lldir.cpp23
-rw-r--r--linden/indra/llvfs/lldir.h14
-rw-r--r--linden/indra/llvfs/llvfile.cpp1
-rw-r--r--linden/indra/llvfs/llvfs.cpp2
-rw-r--r--linden/indra/llwindow/llwindow.cpp6
-rw-r--r--linden/indra/llwindow/llwindow.h1
-rw-r--r--linden/indra/llwindow/llwindowsdl.cpp65
-rw-r--r--linden/indra/llwindow/llwindowsdl.h25
-rw-r--r--linden/indra/llxml/CMakeLists.txt5
-rw-r--r--linden/indra/llxml/llcontrol.cpp4
-rw-r--r--linden/indra/lscript/lscript_byteconvert.h20
-rw-r--r--linden/indra/lscript/lscript_byteformat.h1
-rw-r--r--linden/indra/lscript/lscript_compile/lscript_tree.cpp37
-rw-r--r--linden/indra/lscript/lscript_execute.h57
-rw-r--r--linden/indra/lscript/lscript_execute/lscript_execute.cpp84
-rw-r--r--linden/indra/lscript/lscript_library/lscript_library.cpp1
-rw-r--r--linden/indra/mac_crash_logger/CMakeLists.txt13
-rw-r--r--linden/indra/mac_crash_logger/CrashReporter.nib/info.nib8
-rw-r--r--linden/indra/mac_updater/CMakeLists.txt13
-rw-r--r--linden/indra/newview/CMakeLists.txt105
-rw-r--r--linden/indra/newview/English.lproj/InfoPlist.strings4
-rw-r--r--linden/indra/newview/Info-SecondLife.plist2
-rw-r--r--linden/indra/newview/app_settings/keywords.ini10
-rw-r--r--linden/indra/newview/app_settings/settings.xml123
-rw-r--r--linden/indra/newview/app_settings/shaders/class1/objects/simpleV.glsl2
-rw-r--r--linden/indra/newview/featuretable.txt17
-rw-r--r--linden/indra/newview/featuretable_linux.txt17
-rw-r--r--linden/indra/newview/featuretable_mac.txt17
-rw-r--r--linden/indra/newview/gpu_table.txt51
-rw-r--r--linden/indra/newview/installers/darwin/releasecandidate-dmg/_DS_Storebin12292 -> 12292 bytes
-rw-r--r--linden/indra/newview/installers/windows/FILES_ARE_UNICODE_UTF-16LE.txt6
-rw-r--r--linden/indra/newview/installers/windows/installer_template.nsi473
-rw-r--r--linden/indra/newview/installers/windows/lang_de.nsibin3762 -> 8262 bytes
-rw-r--r--linden/indra/newview/installers/windows/lang_en-us.nsibin3211 -> 7162 bytes
-rw-r--r--linden/indra/newview/installers/windows/lang_es.nsibin0 -> 7612 bytes
-rw-r--r--linden/indra/newview/installers/windows/lang_fr.nsibin0 -> 7858 bytes
-rw-r--r--linden/indra/newview/installers/windows/lang_it.nsibin0 -> 7196 bytes
-rw-r--r--linden/indra/newview/installers/windows/lang_ja.nsibin3579 -> 6302 bytes
-rw-r--r--linden/indra/newview/installers/windows/lang_ko.nsibin3448 -> 6200 bytes
-rw-r--r--linden/indra/newview/installers/windows/lang_nl.nsibin0 -> 7160 bytes
-rw-r--r--linden/indra/newview/installers/windows/lang_pt-br.nsibin0 -> 7590 bytes
-rw-r--r--linden/indra/newview/installers/windows/lang_zh.nsibin0 -> 5354 bytes
-rw-r--r--linden/indra/newview/installers/windows/language_menu.nsibin0 -> 1292 bytes
-rw-r--r--linden/indra/newview/llagent.cpp278
-rw-r--r--linden/indra/newview/llagent.h4
-rw-r--r--linden/indra/newview/llappviewer.cpp226
-rw-r--r--linden/indra/newview/llappviewer.h25
-rw-r--r--linden/indra/newview/llappviewerlinux.cpp307
-rw-r--r--linden/indra/newview/llappviewerlinux.h34
-rw-r--r--linden/indra/newview/llappviewerlinux_api.h148
-rw-r--r--linden/indra/newview/llappviewerlinux_api.xml14
-rw-r--r--linden/indra/newview/llappviewerlinux_api_dbus.cpp131
-rw-r--r--linden/indra/newview/llappviewerlinux_api_dbus.h49
-rw-r--r--linden/indra/newview/llappviewerlinux_api_dbus_syms_raw.inc9
-rw-r--r--linden/indra/newview/llappviewermacosx.cpp101
-rw-r--r--linden/indra/newview/llappviewermacosx.h3
-rw-r--r--linden/indra/newview/llappviewerwin32.cpp104
-rw-r--r--linden/indra/newview/llappviewerwin32.h8
-rw-r--r--linden/indra/newview/llaudiosourcevo.cpp2
-rw-r--r--linden/indra/newview/llbox.cpp2
-rw-r--r--linden/indra/newview/llchatbar.cpp10
-rw-r--r--linden/indra/newview/llcommandlineparser.cpp12
-rw-r--r--linden/indra/newview/llcompilequeue.cpp17
-rw-r--r--linden/indra/newview/llcontainerview.cpp2
-rw-r--r--linden/indra/newview/lldrawable.cpp10
-rw-r--r--linden/indra/newview/lldrawpool.cpp9
-rw-r--r--linden/indra/newview/lldrawpoolalpha.cpp8
-rw-r--r--linden/indra/newview/lldrawpoolavatar.cpp14
-rw-r--r--linden/indra/newview/lldrawpoolbump.cpp55
-rw-r--r--linden/indra/newview/lldrawpoolground.cpp5
-rw-r--r--linden/indra/newview/lldrawpoolsky.cpp4
-rw-r--r--linden/indra/newview/lldrawpoolterrain.cpp124
-rw-r--r--linden/indra/newview/lldrawpooltree.cpp5
-rw-r--r--linden/indra/newview/lldrawpoolwater.cpp38
-rw-r--r--linden/indra/newview/lldrawpoolwlsky.cpp13
-rw-r--r--linden/indra/newview/lldynamictexture.cpp19
-rw-r--r--linden/indra/newview/lldynamictexture.h4
-rw-r--r--linden/indra/newview/llface.cpp16
-rw-r--r--linden/indra/newview/llface.h2
-rw-r--r--linden/indra/newview/llface.inl1
-rw-r--r--linden/indra/newview/llfasttimerview.cpp13
-rw-r--r--linden/indra/newview/llfeaturemanager.cpp2
-rw-r--r--linden/indra/newview/llfilepicker.cpp4
-rw-r--r--linden/indra/newview/llfloateractivespeakers.cpp6
-rw-r--r--linden/indra/newview/llfloateranimpreview.cpp9
-rw-r--r--linden/indra/newview/llfloaterauction.cpp4
-rw-r--r--linden/indra/newview/llfloaterbeacons.cpp150
-rw-r--r--linden/indra/newview/llfloaterbeacons.h56
-rw-r--r--linden/indra/newview/llfloaterbuy.cpp12
-rw-r--r--linden/indra/newview/llfloaterbuy.h3
-rw-r--r--linden/indra/newview/llfloaterbuycurrency.cpp14
-rw-r--r--linden/indra/newview/llfloatercolorpicker.cpp6
-rw-r--r--linden/indra/newview/llfloaterimagepreview.cpp117
-rw-r--r--linden/indra/newview/llfloaterimagepreview.h2
-rw-r--r--linden/indra/newview/llfloaterjoystick.cpp2
-rw-r--r--linden/indra/newview/llfloaterland.cpp2
-rw-r--r--linden/indra/newview/llfloaterlandmark.cpp56
-rw-r--r--linden/indra/newview/llfloaterlandmark.h2
-rw-r--r--linden/indra/newview/llfloaterpostcard.cpp12
-rw-r--r--linden/indra/newview/llfloaterpreference.cpp4
-rw-r--r--linden/indra/newview/llfloatersnapshot.cpp285
-rw-r--r--linden/indra/newview/llfloatertopobjects.cpp2
-rw-r--r--linden/indra/newview/llfolderview.cpp4
-rw-r--r--linden/indra/newview/llframestatview.cpp10
-rw-r--r--linden/indra/newview/llglsandbox.cpp59
-rw-r--r--linden/indra/newview/llgroupmgr.cpp17
-rw-r--r--linden/indra/newview/llhomelocationresponder.cpp108
-rw-r--r--linden/indra/newview/llhomelocationresponder.h47
-rw-r--r--linden/indra/newview/llhudeffectbeam.cpp2
-rw-r--r--linden/indra/newview/llhudeffectlookat.cpp4
-rw-r--r--linden/indra/newview/llhudeffectpointat.cpp4
-rw-r--r--linden/indra/newview/llhudicon.cpp6
-rw-r--r--linden/indra/newview/llhudtext.cpp127
-rw-r--r--linden/indra/newview/llhudtext.h2
-rw-r--r--linden/indra/newview/llinventorymodel.cpp536
-rw-r--r--linden/indra/newview/llinventorymodel.h38
-rw-r--r--linden/indra/newview/llinventoryview.cpp22
-rw-r--r--linden/indra/newview/llinventoryview.h4
-rw-r--r--linden/indra/newview/lljoystickbutton.cpp4
-rw-r--r--linden/indra/newview/llmanip.cpp8
-rw-r--r--linden/indra/newview/llmaniprotate.cpp12
-rw-r--r--linden/indra/newview/llmanipscale.cpp14
-rw-r--r--linden/indra/newview/llmaniptranslate.cpp44
-rw-r--r--linden/indra/newview/llmapresponders.cpp4
-rw-r--r--linden/indra/newview/llmemoryview.cpp2
-rw-r--r--linden/indra/newview/llmutelist.cpp45
-rw-r--r--linden/indra/newview/llmutelist.h3
-rw-r--r--linden/indra/newview/llnetmap.cpp26
-rw-r--r--linden/indra/newview/llnotify.cpp2
-rw-r--r--linden/indra/newview/llpaneldisplay.cpp66
-rw-r--r--linden/indra/newview/llpanelgeneral.cpp226
-rw-r--r--linden/indra/newview/llpanelgeneral.h35
-rw-r--r--linden/indra/newview/llpanelgrouplandmoney.cpp3
-rw-r--r--linden/indra/newview/llpanelinput.cpp87
-rw-r--r--linden/indra/newview/llpanelinput.h17
-rw-r--r--linden/indra/newview/llpanellogin.cpp39
-rw-r--r--linden/indra/newview/llpanelmsgs.cpp22
-rw-r--r--linden/indra/newview/llpanelnetwork.cpp46
-rw-r--r--linden/indra/newview/llpanelnetwork.h24
-rw-r--r--linden/indra/newview/llpanelobject.cpp14
-rw-r--r--linden/indra/newview/llpanelweb.cpp174
-rw-r--r--linden/indra/newview/llpanelweb.h29
-rw-r--r--linden/indra/newview/llpolymesh.h2
-rw-r--r--linden/indra/newview/llprefschat.cpp60
-rw-r--r--linden/indra/newview/llprefsim.cpp99
-rw-r--r--linden/indra/newview/llprefsvoice.cpp285
-rw-r--r--linden/indra/newview/llprefsvoice.h47
-rw-r--r--linden/indra/newview/llpreviewscript.cpp15
-rw-r--r--linden/indra/newview/llpreviewscript.h4
-rw-r--r--linden/indra/newview/llpreviewsound.cpp3
-rw-r--r--linden/indra/newview/llpreviewtexture.cpp26
-rw-r--r--linden/indra/newview/llprogressview.cpp6
-rw-r--r--linden/indra/newview/llselectmgr.cpp17
-rw-r--r--linden/indra/newview/llselectmgr.h2
-rw-r--r--linden/indra/newview/llsky.cpp6
-rw-r--r--linden/indra/newview/llspatialpartition.cpp77
-rw-r--r--linden/indra/newview/llspatialpartition.h7
-rw-r--r--linden/indra/newview/llsprite.cpp6
-rw-r--r--linden/indra/newview/llsprite.h2
-rw-r--r--linden/indra/newview/llstartup.cpp289
-rw-r--r--linden/indra/newview/llstatbar.cpp2
-rw-r--r--linden/indra/newview/llsurface.cpp6
-rw-r--r--linden/indra/newview/lltexlayer.cpp229
-rw-r--r--linden/indra/newview/lltexlayer.h39
-rw-r--r--linden/indra/newview/lltexturectrl.cpp4
-rw-r--r--linden/indra/newview/lltextureview.cpp16
-rw-r--r--linden/indra/newview/lltool.cpp6
-rw-r--r--linden/indra/newview/lltoolbrush.cpp4
-rw-r--r--linden/indra/newview/lltoolmorph.cpp7
-rw-r--r--linden/indra/newview/lltoolplacer.cpp4
-rw-r--r--linden/indra/newview/lltoolselectrect.cpp2
-rw-r--r--linden/indra/newview/lltracker.cpp7
-rw-r--r--linden/indra/newview/lluserauth.cpp16
-rw-r--r--linden/indra/newview/llvelocitybar.cpp2
-rw-r--r--linden/indra/newview/llvieweraudio.cpp8
-rw-r--r--linden/indra/newview/llviewerdisplay.cpp24
-rw-r--r--linden/indra/newview/llviewerimage.cpp99
-rw-r--r--linden/indra/newview/llviewerimage.h14
-rw-r--r--linden/indra/newview/llviewerimagelist.cpp27
-rw-r--r--linden/indra/newview/llviewerimagelist.h2
-rw-r--r--linden/indra/newview/llviewerinventory.cpp41
-rw-r--r--linden/indra/newview/llviewerjoint.cpp71
-rw-r--r--linden/indra/newview/llviewerjointattachment.cpp2
-rw-r--r--linden/indra/newview/llviewerjointmesh.cpp18
-rw-r--r--linden/indra/newview/llviewermedia.cpp1
-rw-r--r--linden/indra/newview/llviewermenu.cpp528
-rw-r--r--linden/indra/newview/llviewermenu.h1
-rw-r--r--linden/indra/newview/llviewermenufile.cpp18
-rw-r--r--linden/indra/newview/llviewermessage.cpp16
-rw-r--r--linden/indra/newview/llviewernetwork.cpp20
-rw-r--r--linden/indra/newview/llviewernetwork.h5
-rw-r--r--linden/indra/newview/llviewerobject.cpp82
-rw-r--r--linden/indra/newview/llviewerobject.h10
-rw-r--r--linden/indra/newview/llviewerobjectlist.cpp34
-rw-r--r--linden/indra/newview/llviewerparcelmedia.cpp2
-rw-r--r--linden/indra/newview/llviewerparceloverlay.cpp8
-rw-r--r--linden/indra/newview/llviewerpartsim.cpp22
-rw-r--r--linden/indra/newview/llviewerpartsim.h6
-rw-r--r--linden/indra/newview/llviewerpartsource.cpp9
-rw-r--r--linden/indra/newview/llviewerregion.cpp17
-rw-r--r--linden/indra/newview/llviewerregion.h1
-rw-r--r--linden/indra/newview/llviewershadermgr.cpp38
-rw-r--r--linden/indra/newview/llviewerstats.h3
-rw-r--r--linden/indra/newview/llviewertexteditor.cpp3
-rw-r--r--linden/indra/newview/llviewerwindow.cpp254
-rw-r--r--linden/indra/newview/llviewerwindow.h9
-rw-r--r--linden/indra/newview/llvoavatar.cpp189
-rw-r--r--linden/indra/newview/llvoavatar.h10
-rw-r--r--linden/indra/newview/llvograss.cpp153
-rw-r--r--linden/indra/newview/llvograss.h10
-rw-r--r--linden/indra/newview/llvoground.cpp2
-rw-r--r--linden/indra/newview/llvoicevisualizer.cpp17
-rw-r--r--linden/indra/newview/llvopartgroup.cpp61
-rw-r--r--linden/indra/newview/llvopartgroup.h17
-rw-r--r--linden/indra/newview/llvosky.cpp80
-rw-r--r--linden/indra/newview/llvosurfacepatch.cpp81
-rw-r--r--linden/indra/newview/llvosurfacepatch.h10
-rw-r--r--linden/indra/newview/llvotextbubble.cpp2
-rw-r--r--linden/indra/newview/llvotree.cpp72
-rw-r--r--linden/indra/newview/llvotree.h11
-rw-r--r--linden/indra/newview/llvovolume.cpp121
-rw-r--r--linden/indra/newview/llvovolume.h1
-rw-r--r--linden/indra/newview/llvowlsky.cpp6
-rw-r--r--linden/indra/newview/llwaterparammanager.cpp85
-rw-r--r--linden/indra/newview/llwaterparammanager.h3
-rw-r--r--linden/indra/newview/llwebbrowserctrl.cpp4
-rw-r--r--linden/indra/newview/llwindebug.cpp63
-rw-r--r--linden/indra/newview/llwindebug.h3
-rw-r--r--linden/indra/newview/llwlparammanager.cpp128
-rw-r--r--linden/indra/newview/llwlparammanager.h3
-rw-r--r--linden/indra/newview/llworld.cpp3
-rw-r--r--linden/indra/newview/llworldmap.cpp5
-rw-r--r--linden/indra/newview/llworldmapview.cpp40
-rw-r--r--linden/indra/newview/lsl_guide.html22078
-rw-r--r--linden/indra/newview/pipeline.cpp187
-rw-r--r--linden/indra/newview/pipeline.h3
-rw-r--r--linden/indra/newview/res/viewerRes.rc8
-rw-r--r--linden/indra/newview/secondlife setup build dazzle.bat4
-rw-r--r--linden/indra/newview/skins/default/xui/de/alerts.xml12
-rw-r--r--linden/indra/newview/skins/default/xui/de/floater_inventory.xml4
-rw-r--r--linden/indra/newview/skins/default/xui/de/floater_inventory_item_properties.xml6
-rw-r--r--linden/indra/newview/skins/default/xui/de/floater_lsl_guide.xml2
-rw-r--r--linden/indra/newview/skins/default/xui/de/floater_preview_gesture.xml2
-rw-r--r--linden/indra/newview/skins/default/xui/de/floater_snapshot.xml4
-rw-r--r--linden/indra/newview/skins/default/xui/de/floater_tools.xml20
-rw-r--r--linden/indra/newview/skins/default/xui/de/panel_avatar_classified.xml2
-rw-r--r--linden/indra/newview/skins/default/xui/de/panel_group_general.xml8
-rw-r--r--linden/indra/newview/skins/default/xui/de/panel_group_land_money.xml15
-rw-r--r--linden/indra/newview/skins/default/xui/de/panel_group_notices.xml6
-rw-r--r--linden/indra/newview/skins/default/xui/de/panel_group_roles.xml14
-rw-r--r--linden/indra/newview/skins/default/xui/de/panel_preferences_chat.xml2
-rw-r--r--linden/indra/newview/skins/default/xui/de/panel_preferences_input.xml12
-rw-r--r--linden/indra/newview/skins/default/xui/de/strings.xml4
-rw-r--r--linden/indra/newview/skins/default/xui/en-us/alerts.xml43
-rw-r--r--linden/indra/newview/skins/default/xui/en-us/floater_about.xml1
-rw-r--r--linden/indra/newview/skins/default/xui/en-us/floater_about_land.xml22
-rw-r--r--linden/indra/newview/skins/default/xui/en-us/floater_beacons.xml24
-rw-r--r--linden/indra/newview/skins/default/xui/en-us/floater_chat_history.xml9
-rw-r--r--linden/indra/newview/skins/default/xui/en-us/floater_instant_message.xml1
-rw-r--r--linden/indra/newview/skins/default/xui/en-us/floater_instant_message_ad_hoc.xml1
-rw-r--r--linden/indra/newview/skins/default/xui/en-us/floater_instant_message_group.xml1
-rw-r--r--linden/indra/newview/skins/default/xui/en-us/menu_pie_object.xml2
-rw-r--r--linden/indra/newview/skins/default/xui/en-us/menu_viewer.xml104
-rw-r--r--linden/indra/newview/skins/default/xui/en-us/notify.xml2
-rw-r--r--linden/indra/newview/skins/default/xui/en-us/panel_chat_bar.xml11
-rw-r--r--linden/indra/newview/skins/default/xui/en-us/panel_preferences_chat.xml24
-rw-r--r--linden/indra/newview/skins/default/xui/en-us/panel_preferences_general.xml59
-rw-r--r--linden/indra/newview/skins/default/xui/en-us/panel_preferences_im.xml20
-rw-r--r--linden/indra/newview/skins/default/xui/en-us/panel_preferences_input.xml38
-rw-r--r--linden/indra/newview/skins/default/xui/en-us/panel_preferences_network.xml8
-rw-r--r--linden/indra/newview/skins/default/xui/en-us/panel_preferences_popups.xml4
-rw-r--r--linden/indra/newview/skins/default/xui/en-us/panel_preferences_voice.xml10
-rw-r--r--linden/indra/newview/skins/default/xui/en-us/panel_preferences_web.xml8
-rw-r--r--linden/indra/newview/skins/default/xui/en-us/panel_status_bar.xml2
-rw-r--r--linden/indra/newview/skins/default/xui/es/alerts.xml29
-rw-r--r--linden/indra/newview/skins/default/xui/es/floater_about_land.xml21
-rw-r--r--linden/indra/newview/skins/default/xui/fr/alerts.xml1865
-rw-r--r--linden/indra/newview/skins/default/xui/fr/floater_about.xml4
-rw-r--r--linden/indra/newview/skins/default/xui/fr/floater_about_land.xml343
-rw-r--r--linden/indra/newview/skins/default/xui/fr/floater_active_speakers.xml6
-rw-r--r--linden/indra/newview/skins/default/xui/fr/floater_animation_preview.xml40
-rw-r--r--linden/indra/newview/skins/default/xui/fr/floater_avatar_picker.xml10
-rw-r--r--linden/indra/newview/skins/default/xui/fr/floater_buy_contents.xml10
-rw-r--r--linden/indra/newview/skins/default/xui/fr/floater_buy_currency.xml26
-rw-r--r--linden/indra/newview/skins/default/xui/fr/floater_buy_land.xml55
-rw-r--r--linden/indra/newview/skins/default/xui/fr/floater_buy_object.xml8
-rw-r--r--linden/indra/newview/skins/default/xui/fr/floater_chat_history.xml15
-rw-r--r--linden/indra/newview/skins/default/xui/fr/floater_color_picker.xml16
-rw-r--r--linden/indra/newview/skins/default/xui/fr/floater_customize.xml540
-rw-r--r--linden/indra/newview/skins/default/xui/fr/floater_directory.xml196
-rw-r--r--linden/indra/newview/skins/default/xui/fr/floater_env_settings.xml20
-rw-r--r--linden/indra/newview/skins/default/xui/fr/floater_god_tools.xml116
-rw-r--r--linden/indra/newview/skins/default/xui/fr/floater_group_info.xml126
-rw-r--r--linden/indra/newview/skins/default/xui/fr/floater_hardware_settings.xml19
-rw-r--r--linden/indra/newview/skins/default/xui/fr/floater_image_preview.xml8
-rw-r--r--linden/indra/newview/skins/default/xui/fr/floater_import.xml6
-rw-r--r--linden/indra/newview/skins/default/xui/fr/floater_instant_message.xml18
-rw-r--r--linden/indra/newview/skins/default/xui/fr/floater_instant_message_ad_hoc.xml11
-rw-r--r--linden/indra/newview/skins/default/xui/fr/floater_instant_message_group.xml14
-rw-r--r--linden/indra/newview/skins/default/xui/fr/floater_inventory.xml74
-rw-r--r--linden/indra/newview/skins/default/xui/fr/floater_inventory_item_properties.xml29
-rw-r--r--linden/indra/newview/skins/default/xui/fr/floater_inventory_view_finder.xml40
-rw-r--r--linden/indra/newview/skins/default/xui/fr/floater_lagmeter.xml18
-rw-r--r--linden/indra/newview/skins/default/xui/fr/floater_media_browser.xml22
-rw-r--r--linden/indra/newview/skins/default/xui/fr/floater_moveview.xml23
-rw-r--r--linden/indra/newview/skins/default/xui/fr/floater_mute_object.xml10
-rw-r--r--linden/indra/newview/skins/default/xui/fr/floater_name_description.xml6
-rw-r--r--linden/indra/newview/skins/default/xui/fr/floater_new_outfit_dialog.xml129
-rw-r--r--linden/indra/newview/skins/default/xui/fr/floater_pay.xml24
-rw-r--r--linden/indra/newview/skins/default/xui/fr/floater_pay_object.xml28
-rw-r--r--linden/indra/newview/skins/default/xui/fr/floater_preview_gesture.xml2
-rw-r--r--linden/indra/newview/skins/default/xui/fr/floater_price_for_listing.xml8
-rw-r--r--linden/indra/newview/skins/default/xui/fr/floater_region_info.xml4
-rw-r--r--linden/indra/newview/skins/default/xui/fr/floater_report_abuse.xml37
-rw-r--r--linden/indra/newview/skins/default/xui/fr/floater_report_bug.xml20
-rw-r--r--linden/indra/newview/skins/default/xui/fr/floater_sell_land.xml14
-rw-r--r--linden/indra/newview/skins/default/xui/fr/floater_skin_preview_template.xml23
-rw-r--r--linden/indra/newview/skins/default/xui/fr/floater_snapshot.xml41
-rw-r--r--linden/indra/newview/skins/default/xui/fr/floater_sound_preview.xml6
-rw-r--r--linden/indra/newview/skins/default/xui/fr/floater_texture_ctrl.xml26
-rw-r--r--linden/indra/newview/skins/default/xui/fr/floater_tools.xml354
-rw-r--r--linden/indra/newview/skins/default/xui/fr/floater_top_objects.xml28
-rw-r--r--linden/indra/newview/skins/default/xui/fr/floater_world_map.xml95
-rw-r--r--linden/indra/newview/skins/default/xui/fr/menu_inventory.xml125
-rw-r--r--linden/indra/newview/skins/default/xui/fr/menu_pie_avatar.xml26
-rw-r--r--linden/indra/newview/skins/default/xui/fr/menu_pie_land.xml16
-rw-r--r--linden/indra/newview/skins/default/xui/fr/menu_viewer.xml476
-rw-r--r--linden/indra/newview/skins/default/xui/fr/mime_types.xml8
-rw-r--r--linden/indra/newview/skins/default/xui/fr/notify.xml60
-rw-r--r--linden/indra/newview/skins/default/xui/fr/panel_audio.xml16
-rw-r--r--linden/indra/newview/skins/default/xui/fr/panel_audio_device.xml9
-rw-r--r--linden/indra/newview/skins/default/xui/fr/panel_avatar.xml124
-rw-r--r--linden/indra/newview/skins/default/xui/fr/panel_avatar_classified.xml32
-rw-r--r--linden/indra/newview/skins/default/xui/fr/panel_classified.xml22
-rw-r--r--linden/indra/newview/skins/default/xui/fr/panel_friends.xml37
-rw-r--r--linden/indra/newview/skins/default/xui/fr/panel_group_general.xml52
-rw-r--r--linden/indra/newview/skins/default/xui/fr/panel_group_invite.xml19
-rw-r--r--linden/indra/newview/skins/default/xui/fr/panel_group_land_money.xml38
-rw-r--r--linden/indra/newview/skins/default/xui/fr/panel_group_notices.xml70
-rw-r--r--linden/indra/newview/skins/default/xui/fr/panel_group_roles.xml86
-rw-r--r--linden/indra/newview/skins/default/xui/fr/panel_group_voting.xml44
-rw-r--r--linden/indra/newview/skins/default/xui/fr/panel_groups.xml26
-rw-r--r--linden/indra/newview/skins/default/xui/fr/panel_login.xml16
-rw-r--r--linden/indra/newview/skins/default/xui/fr/panel_master_volume.xml7
-rw-r--r--linden/indra/newview/skins/default/xui/fr/panel_media_controls.xml24
-rw-r--r--linden/indra/newview/skins/default/xui/fr/panel_media_remote.xml12
-rw-r--r--linden/indra/newview/skins/default/xui/fr/panel_media_remote_expanded.xml6
-rw-r--r--linden/indra/newview/skins/default/xui/fr/panel_overlaybar.xml15
-rw-r--r--linden/indra/newview/skins/default/xui/fr/panel_place.xml20
-rw-r--r--linden/indra/newview/skins/default/xui/fr/panel_place_small.xml24
-rw-r--r--linden/indra/newview/skins/default/xui/fr/panel_preferences_audio.xml39
-rw-r--r--linden/indra/newview/skins/default/xui/fr/panel_preferences_chat.xml75
-rw-r--r--linden/indra/newview/skins/default/xui/fr/panel_preferences_general.xml89
-rw-r--r--linden/indra/newview/skins/default/xui/fr/panel_preferences_graphics1.xml94
-rw-r--r--linden/indra/newview/skins/default/xui/fr/panel_preferences_im.xml44
-rw-r--r--linden/indra/newview/skins/default/xui/fr/panel_preferences_input.xml31
-rw-r--r--linden/indra/newview/skins/default/xui/fr/panel_preferences_network.xml21
-rw-r--r--linden/indra/newview/skins/default/xui/fr/panel_preferences_popups.xml26
-rw-r--r--linden/indra/newview/skins/default/xui/fr/panel_preferences_voice.xml20
-rw-r--r--linden/indra/newview/skins/default/xui/fr/panel_preferences_web.xml21
-rw-r--r--linden/indra/newview/skins/default/xui/fr/panel_region_debug.xml62
-rw-r--r--linden/indra/newview/skins/default/xui/fr/panel_region_estate.xml74
-rw-r--r--linden/indra/newview/skins/default/xui/fr/panel_region_general.xml57
-rw-r--r--linden/indra/newview/skins/default/xui/fr/panel_region_terrain.xml41
-rw-r--r--linden/indra/newview/skins/default/xui/fr/panel_speaker_controls.xml12
-rw-r--r--linden/indra/newview/skins/default/xui/fr/panel_status_bar.xml42
-rw-r--r--linden/indra/newview/skins/default/xui/fr/panel_toolbar.xml25
-rw-r--r--linden/indra/newview/skins/default/xui/fr/panel_voice_enable.xml4
-rw-r--r--linden/indra/newview/skins/default/xui/fr/panel_voice_options.xml14
-rw-r--r--linden/indra/newview/skins/default/xui/fr/strings.xml12
-rw-r--r--linden/indra/newview/skins/default/xui/ja/floater_about_land.xml3
-rw-r--r--linden/indra/newview/skins/default/xui/ja/floater_preview_gesture.xml2
-rw-r--r--linden/indra/newview/skins/default/xui/ja/floater_tools.xml2
-rw-r--r--linden/indra/newview/skins/default/xui/ja/panel_avatar.xml2
-rw-r--r--linden/indra/newview/skins/default/xui/ja/panel_preferences_chat.xml2
-rw-r--r--linden/indra/newview/skins/default/xui/ja/panel_preferences_input.xml12
-rw-r--r--linden/indra/newview/skins/default/xui/ja/panel_preferences_network.xml2
-rw-r--r--linden/indra/newview/skins/default/xui/ja/strings.xml4
-rw-r--r--linden/indra/newview/skins/default/xui/ko/floater_about_land.xml3
-rw-r--r--linden/indra/newview/skins/default/xui/ko/floater_preview_gesture.xml2
-rw-r--r--linden/indra/newview/skins/default/xui/ko/panel_preferences_chat.xml2
-rw-r--r--linden/indra/newview/skins/default/xui/ko/panel_preferences_input.xml12
-rw-r--r--linden/indra/newview/skins/default/xui/pt/alerts.xml2
-rw-r--r--linden/indra/newview/skins/default/xui/zh/alerts.xml14
-rw-r--r--linden/indra/newview/skins/default/xui/zh/floater_about_land.xml21
-rw-r--r--linden/indra/newview/skins/default/xui/zh/need_to_translate.xml908
-rw-r--r--linden/indra/newview/skins/silver/xui/en-us/floater_about_land.xml22
-rw-r--r--linden/indra/newview/skins/silver/xui/en-us/panel_status_bar.xml2
-rwxr-xr-xlinden/indra/newview/viewer_manifest.py114
-rw-r--r--linden/indra/test/CMakeLists.txt8
-rw-r--r--linden/indra/test/llapp_tut.cpp2
-rw-r--r--linden/indra/test/llblowfish_tut.cpp12
-rw-r--r--linden/indra/test/lliohttpserver_tut.cpp4
-rw-r--r--linden/indra/test/llmodularmath_tut.cpp80
-rw-r--r--linden/indra/test/llsd_new_tut.cpp11
-rw-r--r--linden/indra/test/llstring_tut.cpp7
-rw-r--r--linden/indra/test/math.cpp6
-rw-r--r--linden/indra/test/v4math_tut.cpp15
-rw-r--r--linden/indra/win_crash_logger/llcrashloggerwindows.cpp2
-rw-r--r--linden/indra/win_crash_logger/win_crash_logger.cpp49
-rw-r--r--linden/indra/win_updater/updater.cpp103
-rw-r--r--linden/install.xml642
-rwxr-xr-xlinden/scripts/install.py50
-rwxr-xr-xlinden/scripts/template_verifier.py32
563 files changed, 14309 insertions, 33421 deletions
diff --git a/linden/doc/contributions.txt b/linden/doc/contributions.txt
index ea5ba5d..54aad6e 100644
--- a/linden/doc/contributions.txt
+++ b/linden/doc/contributions.txt
@@ -1,3 +1,4 @@
1
1Linden Lab would like to acknowledge source code contributions from the 2Linden Lab would like to acknowledge source code contributions from the
2following residents. The Second Life resident name is given below, 3following residents. The Second Life resident name is given below,
3along with the issue identifier corresponding to the patches we've 4along with the issue identifier corresponding to the patches we've
@@ -10,10 +11,12 @@ Able Whitman
10 VWR-1691 11 VWR-1691
11 VWR-1735 12 VWR-1735
12Adam Marker 13Adam Marker
13 VWR-2755 14 VWR-2755
14Aimee Trescothick 15Aimee Trescothick
16 VWR-3336
15 VWR-3903 17 VWR-3903
16 VWR-4083 18 VWR-4083
19 VWR-9255
17Alejandro Rosenthal 20Alejandro Rosenthal
18 VWR-1184 21 VWR-1184
19Alissa Sabre 22Alissa Sabre
@@ -58,6 +61,8 @@ Angus Boyd
58 VWR-592 61 VWR-592
59Argent Stonecutter 62Argent Stonecutter
60 VWR-68 63 VWR-68
64Asuka Neely
65 VWR-3434
61Balp Allen 66Balp Allen
62 VWR-4157 67 VWR-4157
63Benja Kepler 68Benja Kepler
@@ -79,6 +84,7 @@ bushing Spatula
79 VWR-424 84 VWR-424
80Carjay McGinnis 85Carjay McGinnis
81 VWR-3737 86 VWR-3737
87 VWR-4070
82 VWR-6154 88 VWR-6154
83Catherine Pfeffer 89Catherine Pfeffer
84 VWR-1282 90 VWR-1282
@@ -184,10 +190,12 @@ Jacek Antonelli
184 VWR-188 190 VWR-188
185 VWR-427 191 VWR-427
186 VWR-597 192 VWR-597
193 VWR-2054
187 VWR-2448 194 VWR-2448
188 VWR-3605 195 VWR-3605
189JB Kraft 196JB Kraft
190 VWR-5283 197 VWR-5283
198 VWR-7802
191Joghert LeSabre 199Joghert LeSabre
192 VWR-64 200 VWR-64
193Kage Pixel 201Kage Pixel
@@ -205,13 +213,18 @@ Matthew Dowd
205 VWR-1761 213 VWR-1761
206McCabe Maxsted 214McCabe Maxsted
207 VWR-1318 215 VWR-1318
208 VWR-7893 216 VWR-7893
217 VWR-8689
209Michelle2 Zenovka 218Michelle2 Zenovka
210 VWR-2652 219 VWR-2652
211 VWR-2834 220 VWR-2834
212 VWR-3749 221 VWR-3749
222 VWR-4022
213 VWR-4506 223 VWR-4506
224 VWR-4981
214 VWR-7831 225 VWR-7831
226 VWR-8889
227 VWR-8310
215 VWR-4022 228 VWR-4022
216Mm Alder 229Mm Alder
217 VWR-3777 230 VWR-3777
diff --git a/linden/etc/message.xml b/linden/etc/message.xml
index 80dc560..d833074 100644
--- a/linden/etc/message.xml
+++ b/linden/etc/message.xml
@@ -441,6 +441,30 @@
441 <boolean>true</boolean> 441 <boolean>true</boolean>
442 </map> 442 </map>
443 443
444 <key>EnableSimulator</key>
445 <map>
446 <key>flavor</key>
447 <string>llsd</string>
448 <key>trusted-sender</key>
449 <boolean>true</boolean>
450 </map>
451
452 <key>TeleportFinish</key>
453 <map>
454 <key>flavor</key>
455 <string>llsd</string>
456 <key>trusted-sender</key>
457 <boolean>true</boolean>
458 </map>
459
460 <key>CrossedRegion</key>
461 <map>
462 <key>flavor</key>
463 <string>llsd</string>
464 <key>trusted-sender</key>
465 <boolean>true</boolean>
466 </map>
467
444 <!-- UDPDeprecated Messages --> 468 <!-- UDPDeprecated Messages -->
445 <key>ScriptRunningReply</key> 469 <key>ScriptRunningReply</key>
446 <map> 470 <map>
@@ -564,6 +588,18 @@
564 <boolean>true</boolean> 588 <boolean>true</boolean>
565 589
566 <key>FetchInventoryDescendents</key> 590 <key>FetchInventoryDescendents</key>
591 <boolean>false</boolean>
592
593 <key>WebFetchInventoryDescendents</key>
594 <boolean>true</boolean>
595
596 <key>FetchInventory</key>
597 <boolean>true</boolean>
598
599 <key>FetchLibDescendents</key>
600 <boolean>true</boolean>
601
602 <key>FetchLib</key>
567 <boolean>true</boolean> 603 <boolean>true</boolean>
568 </map> 604 </map>
569 605
diff --git a/linden/indra/CMakeLists.txt b/linden/indra/CMakeLists.txt
index fac2afa..c473b94 100644
--- a/linden/indra/CMakeLists.txt
+++ b/linden/indra/CMakeLists.txt
@@ -19,6 +19,10 @@ set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake")
19 19
20include(Variables) 20include(Variables)
21 21
22if (DARWIN)
23 cmake_minimum_required(VERSION 2.6.2 FATAL_ERROR)
24endif (DARWIN)
25
22if (NOT CMAKE_BUILD_TYPE) 26if (NOT CMAKE_BUILD_TYPE)
23 set(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING 27 set(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING
24 "Build type. One of: Debug Release RelWithDebInfo" FORCE) 28 "Build type. One of: Debug Release RelWithDebInfo" FORCE)
diff --git a/linden/indra/cmake/00-Common.cmake b/linden/indra/cmake/00-Common.cmake
index 240853a..bf2d2c3 100644
--- a/linden/indra/cmake/00-Common.cmake
+++ b/linden/indra/cmake/00-Common.cmake
@@ -49,6 +49,10 @@ if (WINDOWS)
49 ) 49 )
50 50
51 if(MSVC80 OR MSVC90) 51 if(MSVC80 OR MSVC90)
52 set(CMAKE_CXX_FLAGS_RELEASE
53 "${CMAKE_CXX_FLAGS_RELEASE} -D_SECURE_STL=0 -D_HAS_ITERATOR_DEBUGGING=0"
54 CACHE STRING "C++ compiler release options" FORCE)
55
52 add_definitions( 56 add_definitions(
53 /Zc:wchar_t- 57 /Zc:wchar_t-
54 ) 58 )
@@ -165,6 +169,10 @@ if (DARWIN)
165 set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_CXX_LINK_FLAGS}") 169 set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_CXX_LINK_FLAGS}")
166 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mlong-branch") 170 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mlong-branch")
167 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mlong-branch") 171 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mlong-branch")
172 # NOTE: it's critical that the optimization flag is put in front.
173 # NOTE: it's critical to have both CXX_FLAGS and C_FLAGS covered.
174 set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O0 ${CMAKE_CXX_FLAGS_RELWITHDEBINFO}")
175 set(CMAKE_C_FLAGS_RELWITHDEBINFO "-O0 ${CMAKE_C_FLAGS_RELWITHDEBINFO}")
168endif (DARWIN) 176endif (DARWIN)
169 177
170 178
diff --git a/linden/indra/cmake/APR.cmake b/linden/indra/cmake/APR.cmake
index 2a96d70..523d8ee 100644
--- a/linden/indra/cmake/APR.cmake
+++ b/linden/indra/cmake/APR.cmake
@@ -15,23 +15,17 @@ if (STANDALONE)
15else (STANDALONE) 15else (STANDALONE)
16 use_prebuilt_binary(apr_suite) 16 use_prebuilt_binary(apr_suite)
17 if (WINDOWS) 17 if (WINDOWS)
18 set(WINLIBS_PREBUILT_DEBUG_DIR
19 ${CMAKE_SOURCE_DIR}/../libraries/i686-win32/lib/debug
20 )
21 set(WINLIBS_PREBUILT_RELEASE_DIR
22 ${CMAKE_SOURCE_DIR}/../libraries/i686-win32/lib/release
23 )
24 set(APR_LIBRARIES 18 set(APR_LIBRARIES
25 debug ${WINLIBS_PREBUILT_DEBUG_DIR}/apr-1.lib 19 debug ${ARCH_PREBUILT_DIRS_DEBUG}/apr-1.lib
26 optimized ${WINLIBS_PREBUILT_RELEASE_DIR}/apr-1.lib 20 optimized ${ARCH_PREBUILT_DIRS_RELEASE}/apr-1.lib
27 ) 21 )
28 set(APRUTIL_LIBRARIES 22 set(APRUTIL_LIBRARIES
29 debug ${WINLIBS_PREBUILT_DEBUG_DIR}/aprutil-1.lib 23 debug ${ARCH_PREBUILT_DIRS_DEBUG}/aprutil-1.lib
30 optimized ${WINLIBS_PREBUILT_RELEASE_DIR}/aprutil-1.lib 24 optimized ${ARCH_PREBUILT_DIRS_RELEASE}/aprutil-1.lib
31 ) 25 )
32 set(APRICONV_LIBRARIES 26 set(APRICONV_LIBRARIES
33 debug ${WINLIBS_PREBUILT_DEBUG_DIR}/apriconv-1.lib 27 debug ${ARCH_PREBUILT_DIRS_DEBUG}/apriconv-1.lib
34 optimized ${WINLIBS_PREBUILT_RELEASE_DIR}/apriconv-1.lib 28 optimized ${ARCH_PREBUILT_DIRS_RELEASE}/apriconv-1.lib
35 ) 29 )
36 elseif (DARWIN) 30 elseif (DARWIN)
37 set(APR_LIBRARIES 31 set(APR_LIBRARIES
@@ -42,10 +36,11 @@ else (STANDALONE)
42 debug ${ARCH_PREBUILT_DIRS_DEBUG}/libaprutil-1.a 36 debug ${ARCH_PREBUILT_DIRS_DEBUG}/libaprutil-1.a
43 optimized ${ARCH_PREBUILT_DIRS_RELEASE}/libaprutil-1.a 37 optimized ${ARCH_PREBUILT_DIRS_RELEASE}/libaprutil-1.a
44 ) 38 )
45 set(APRICONV_LIBRARIES apriconv-1) 39 set(APRICONV_LIBRARIES iconv)
46 else (WINDOWS) 40 else (WINDOWS)
47 set(APR_LIBRARIES apr-1) 41 set(APR_LIBRARIES apr-1)
48 set(APRUTIL_LIBRARIES aprutil-1) 42 set(APRUTIL_LIBRARIES aprutil-1)
43 set(APRICONV_LIBRARIES iconv)
49 endif (WINDOWS) 44 endif (WINDOWS)
50 set(APR_INCLUDE_DIR ${LIBS_PREBUILT_DIR}/${LL_ARCH_DIR}/include/apr-1) 45 set(APR_INCLUDE_DIR ${LIBS_PREBUILT_DIR}/${LL_ARCH_DIR}/include/apr-1)
51 46
diff --git a/linden/indra/cmake/CopyWinLibs.cmake b/linden/indra/cmake/CopyWinLibs.cmake
index 345761a..b74ce4f 100644
--- a/linden/indra/cmake/CopyWinLibs.cmake
+++ b/linden/indra/cmake/CopyWinLibs.cmake
@@ -148,6 +148,61 @@ else(EXISTS ${internal_llkdu_path})
148 148
149endif (EXISTS ${internal_llkdu_path}) 149endif (EXISTS ${internal_llkdu_path})
150 150
151# Copy MS C runtime dlls, required for packaging.
152# *TODO - Adapt this to support VC9
153if (MSVC80)
154 FIND_PATH(debug_msvc8_redist_path msvcr80d.dll
155 PATHS
156 [HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\VisualStudio\\8.0\\Setup\\VC;ProductDir]/redist/Debug_NonRedist/x86/Microsoft.VC80.DebugCRT
157 )
158
159 if(EXISTS ${debug_msvc8_redist_path})
160 set(debug_msvc8_files
161 msvcr80d.dll
162 msvcp80d.dll
163 Microsoft.VC80.DebugCRT.manifest
164 )
165
166 copy_if_different(
167 ${debug_msvc8_redist_path}
168 "${CMAKE_CURRENT_BINARY_DIR}/Debug"
169 out_targets
170 ${debug_msvc8_files}
171 )
172 set(all_targets ${all_targets} ${out_targets})
173 endif (EXISTS ${debug_msvc8_redist_path})
174
175 FIND_PATH(release_msvc8_redist_path msvcr80.dll
176 PATHS
177 [HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\VisualStudio\\8.0\\Setup\\VC;ProductDir]/redist/x86/Microsoft.VC80.CRT
178 )
179
180 if(EXISTS ${release_msvc8_redist_path})
181 set(release_msvc8_files
182 msvcr80.dll
183 msvcp80.dll
184 Microsoft.VC80.CRT.manifest
185 )
186
187 copy_if_different(
188 ${release_msvc8_redist_path}
189 "${CMAKE_CURRENT_BINARY_DIR}/Release"
190 out_targets
191 ${release_msvc8_files}
192 )
193 set(all_targets ${all_targets} ${out_targets})
194
195 copy_if_different(
196 ${release_msvc8_redist_path}
197 "${CMAKE_CURRENT_BINARY_DIR}/RelWithDebInfo"
198 out_targets
199 ${release_msvc8_files}
200 )
201 set(all_targets ${all_targets} ${out_targets})
202
203 endif (EXISTS ${release_msvc8_redist_path})
204endif (MSVC80)
205
151add_custom_target(copy_win_libs ALL DEPENDS ${all_targets}) 206add_custom_target(copy_win_libs ALL DEPENDS ${all_targets})
152 207
153if(EXISTS ${internal_llkdu_path}) 208if(EXISTS ${internal_llkdu_path})
diff --git a/linden/indra/cmake/DBusGlib.cmake b/linden/indra/cmake/DBusGlib.cmake
new file mode 100644
index 0000000..cfc4ccd
--- /dev/null
+++ b/linden/indra/cmake/DBusGlib.cmake
@@ -0,0 +1,29 @@
1# -*- cmake -*-
2include(Prebuilt)
3
4if (STANDALONE)
5 include(FindPkgConfig)
6
7 pkg_check_modules(DBUSGLIB REQUIRED dbus-glib-1)
8
9elseif (LINUX)
10 use_prebuilt_binary(dbusglib)
11 set(DBUSGLIB_FOUND ON FORCE BOOL)
12 set(DBUSGLIB_INCLUDE_DIRS
13 ${LIBS_PREBUILT_DIR}/${LL_ARCH_DIR}/include/glib-2.0
14 )
15 # We don't need to explicitly link against dbus-glib itself, because
16 # the viewer probes for the system's copy at runtime.
17 set(DBUSGLIB_LIBRARIES
18 gobject-2.0
19 glib-2.0
20 )
21endif (STANDALONE)
22
23if (DBUSGLIB_FOUND)
24 set(DBUSGLIB ON CACHE BOOL "Build with dbus-glib message bus support.")
25endif (DBUSGLIB_FOUND)
26
27if (DBUSGLIB)
28 add_definitions(-DLL_DBUS_ENABLED=1)
29endif (DBUSGLIB)
diff --git a/linden/indra/cmake/DirectX.cmake b/linden/indra/cmake/DirectX.cmake
index 4d2d5e0..d406f37 100644
--- a/linden/indra/cmake/DirectX.cmake
+++ b/linden/indra/cmake/DirectX.cmake
@@ -3,12 +3,13 @@
3if (VIEWER AND WINDOWS) 3if (VIEWER AND WINDOWS)
4 find_path(DIRECTX_INCLUDE_DIR dxdiag.h 4 find_path(DIRECTX_INCLUDE_DIR dxdiag.h
5 "$ENV{DXSDK_DIR}/Include" 5 "$ENV{DXSDK_DIR}/Include"
6 "C:/Program Files/Microsoft DirectX SDK (June 2008)/Include" 6 "$ENV{PROGRAMFILES}/Microsoft DirectX SDK (August 2008)/Include"
7 "C:/Program Files/Microsoft DirectX SDK (March 2008)/Include" 7 "$ENV{PROGRAMFILES}/Microsoft DirectX SDK (June 2008)/Include"
8 "C:/Program Files/Microsoft DirectX SDK (November 2007)/Include" 8 "$ENV{PROGRAMFILES}/Microsoft DirectX SDK (March 2008)/Include"
9 "C:/Program Files/Microsoft DirectX SDK (August 2007)/Include" 9 "$ENV{PROGRAMFILES}/Microsoft DirectX SDK (November 2007)/Include"
10 "$ENV{PROGRAMFILES}/Microsoft DirectX SDK (August 2007)/Include"
10 "C:/DX90SDK/Include" 11 "C:/DX90SDK/Include"
11 "C:/Program Files/DX90SDK/Include" 12 "$ENV{PROGRAMFILES}/DX90SDK/Include"
12 ) 13 )
13 if (DIRECTX_INCLUDE_DIR) 14 if (DIRECTX_INCLUDE_DIR)
14 include_directories(${DIRECTX_INCLUDE_DIR}) 15 include_directories(${DIRECTX_INCLUDE_DIR})
@@ -22,12 +23,13 @@ if (VIEWER AND WINDOWS)
22 23
23 find_path(DIRECTX_LIBRARY_DIR dxguid.lib 24 find_path(DIRECTX_LIBRARY_DIR dxguid.lib
24 "$ENV{DXSDK_DIR}/Lib/x86" 25 "$ENV{DXSDK_DIR}/Lib/x86"
25 "C:/Program Files/Microsoft DirectX SDK (June 2008)/Lib/x86" 26 "$ENV{PROGRAMFILES}/Microsoft DirectX SDK (August 2008)/Lib/x86"
26 "C:/Program Files/Microsoft DirectX SDK (March 2008)/Lib/x86" 27 "$ENV{PROGRAMFILES}/Microsoft DirectX SDK (June 2008)/Lib/x86"
27 "C:/Program Files/Microsoft DirectX SDK (November 2007)/Lib/x86" 28 "$ENV{PROGRAMFILES}/Microsoft DirectX SDK (March 2008)/Lib/x86"
28 "C:/Program Files/Microsoft DirectX SDK (August 2007)/Lib/x86" 29 "$ENV{PROGRAMFILES}/Microsoft DirectX SDK (November 2007)/Lib/x86"
30 "$ENV{PROGRAMFILES}/Microsoft DirectX SDK (August 2007)/Lib/x86"
29 "C:/DX90SDK/Lib" 31 "C:/DX90SDK/Lib"
30 "C:/Program Files/DX90SDK/Lib" 32 "$ENV{PROGRAMFILES}/DX90SDK/Lib"
31 ) 33 )
32 if (DIRECTX_LIBRARY_DIR) 34 if (DIRECTX_LIBRARY_DIR)
33 if (DIRECTX_FIND_QUIETLY) 35 if (DIRECTX_FIND_QUIETLY)
diff --git a/linden/indra/cmake/FindMono.cmake b/linden/indra/cmake/FindMono.cmake
index f0a0705..c36d725 100644
--- a/linden/indra/cmake/FindMono.cmake
+++ b/linden/indra/cmake/FindMono.cmake
@@ -14,29 +14,29 @@
14# Removed the check for gmcs 14# Removed the check for gmcs
15 15
16FIND_PROGRAM (MONO_EXECUTABLE mono 16FIND_PROGRAM (MONO_EXECUTABLE mono
17 "C:/Program Files/Mono-1.9.1/bin" 17 "$ENV{PROGRAMFILES}/Mono-1.9.1/bin"
18 "C:/Program Files/Mono-1.2.6/bin" 18 "$ENV{PROGRAMFILES}/Mono-1.2.6/bin"
19 /bin 19 /bin
20 /usr/bin 20 /usr/bin
21 /usr/local/bin 21 /usr/local/bin
22) 22)
23FIND_PROGRAM (MCS_EXECUTABLE mcs 23FIND_PROGRAM (MCS_EXECUTABLE mcs
24 "C:/Program Files/Mono-1.9.1/bin" 24 "$ENV{PROGRAMFILES}/Mono-1.9.1/bin"
25 "C:/Program Files/Mono-1.2.6/bin" 25 "$ENV{PROGRAMFILES}/Mono-1.2.6/bin"
26 /bin 26 /bin
27 /usr/bin 27 /usr/bin
28 /usr/local/bin 28 /usr/local/bin
29) 29)
30FIND_PROGRAM (GMCS_EXECUTABLE gmcs 30FIND_PROGRAM (GMCS_EXECUTABLE gmcs
31 "C:/Program Files/Mono-1.9.1/bin" 31 "$ENV{PROGRAMFILES}/Mono-1.9.1/bin"
32 "C:/Program Files/Mono-1.2.6/bin" 32 "$ENV{PROGRAMFILES}/Mono-1.2.6/bin"
33 /bin 33 /bin
34 /usr/bin 34 /usr/bin
35 /usr/local/bin 35 /usr/local/bin
36) 36)
37FIND_PROGRAM (GACUTIL_EXECUTABLE gacutil 37FIND_PROGRAM (GACUTIL_EXECUTABLE gacutil
38 "C:/Program Files/Mono-1.9.1/bin" 38 "$ENV{PROGRAMFILES}/Mono-1.9.1/bin"
39 "C:/Program Files/Mono-1.2.6/bin" 39 "$ENV{PROGRAMFILES}/Mono-1.2.6/bin"
40 /bin 40 /bin
41 /usr/bin 41 /usr/bin
42 /usr/local/bin 42 /usr/local/bin
@@ -44,7 +44,7 @@ FIND_PROGRAM (GACUTIL_EXECUTABLE gacutil
44FIND_PROGRAM (ILASM_EXECUTABLE 44FIND_PROGRAM (ILASM_EXECUTABLE
45 ilasm 45 ilasm
46 NO_DEFAULT_PATH 46 NO_DEFAULT_PATH
47 PATHS "C:/Program Files/Mono-1.9.1/bin" "C:/Apps/Mono-1.2.6/bin" "C:/Program Files/Mono-1.2.6/bin" /bin /usr/bin /usr/local/bin 47 PATHS "$ENV{PROGRAMFILES}/Mono-1.9.1/bin" "$ENV{PROGRAMFILES}/Mono-1.2.6/bin" /bin /usr/bin /usr/local/bin
48) 48)
49 49
50SET (MONO_FOUND FALSE) 50SET (MONO_FOUND FALSE)
diff --git a/linden/indra/cmake/GooglePerfTools.cmake b/linden/indra/cmake/GooglePerfTools.cmake
index 9b3eca0..25e9f6d 100644
--- a/linden/indra/cmake/GooglePerfTools.cmake
+++ b/linden/indra/cmake/GooglePerfTools.cmake
@@ -19,10 +19,14 @@ if (GOOGLE_PERFTOOLS_FOUND)
19 set(USE_GOOGLE_PERFTOOLS ON CACHE BOOL "Build with Google PerfTools support.") 19 set(USE_GOOGLE_PERFTOOLS ON CACHE BOOL "Build with Google PerfTools support.")
20endif (GOOGLE_PERFTOOLS_FOUND) 20endif (GOOGLE_PERFTOOLS_FOUND)
21 21
22# XXX Disable temporarily, until we have compilation issues on 64-bit
23# Etch sorted.
24set(USE_GOOGLE_PERFTOOLS OFF)
25
22if (USE_GOOGLE_PERFTOOLS) 26if (USE_GOOGLE_PERFTOOLS)
23 set(TCMALLOC_FLAG -DLL_USE_TCMALLOC=1) 27 set(TCMALLOC_FLAG -DLL_USE_TCMALLOC=1)
24 include_directories(${GOOGLE_PERFTOOLS_INCLUDE_DIR}) 28 include_directories(${GOOGLE_PERFTOOLS_INCLUDE_DIR})
25 set(GOOGLE_PERFTOOLS_LIBRARIES ${TCMALLOC_LIBRARIES} ${STACKTRACE_LIBRARIES}) 29 set(GOOGLE_PERFTOOLS_LIBRARIES ${TCMALLOC_LIBRARIES} ${STACKTRACE_LIBRARIES} ${PROFILER_LIBRARIES})
26else (USE_GOOGLE_PERFTOOLS) 30else (USE_GOOGLE_PERFTOOLS)
27 set(TCMALLOC_FLAG -ULL_USE_TCMALLOC) 31 set(TCMALLOC_FLAG -ULL_USE_TCMALLOC)
28endif (USE_GOOGLE_PERFTOOLS) 32endif (USE_GOOGLE_PERFTOOLS)
diff --git a/linden/indra/cmake/LLAudio.cmake b/linden/indra/cmake/LLAudio.cmake
index 7b9f254..eff643d 100644
--- a/linden/indra/cmake/LLAudio.cmake
+++ b/linden/indra/cmake/LLAudio.cmake
@@ -6,10 +6,4 @@ set(LLAUDIO_INCLUDE_DIRS
6 ${LIBS_OPEN_DIR}/llaudio 6 ${LIBS_OPEN_DIR}/llaudio
7 ) 7 )
8 8
9set(LLAUDIO_LIBRARIES 9set(LLAUDIO_LIBRARIES llaudio)
10 llaudio
11 ${VORBISENC_LIBRARIES}
12 ${VORBISFILE_LIBRARIES}
13 ${VORBIS_LIBRARIES}
14 ${OGG_LIBRARIES}
15 )
diff --git a/linden/indra/cmake/LLCharacter.cmake b/linden/indra/cmake/LLCharacter.cmake
index c74092c..9b2f5c4 100644
--- a/linden/indra/cmake/LLCharacter.cmake
+++ b/linden/indra/cmake/LLCharacter.cmake
@@ -4,6 +4,4 @@ set(LLCHARACTER_INCLUDE_DIRS
4 ${LIBS_OPEN_DIR}/llcharacter 4 ${LIBS_OPEN_DIR}/llcharacter
5 ) 5 )
6 6
7set(LLCHARACTER_LIBRARIES 7set(LLCHARACTER_LIBRARIES llcharacter)
8 llcharacter
9 )
diff --git a/linden/indra/cmake/LLCommon.cmake b/linden/indra/cmake/LLCommon.cmake
index f4b251e..410766e 100644
--- a/linden/indra/cmake/LLCommon.cmake
+++ b/linden/indra/cmake/LLCommon.cmake
@@ -12,10 +12,4 @@ set(LLCOMMON_INCLUDE_DIRS
12 ${Boost_INCLUDE_DIRS} 12 ${Boost_INCLUDE_DIRS}
13 ) 13 )
14 14
15set(LLCOMMON_LIBRARIES 15set(LLCOMMON_LIBRARIES llcommon)
16 llcommon
17 ${APRUTIL_LIBRARIES}
18 ${APR_LIBRARIES}
19 ${EXPAT_LIBRARIES}
20 ${ZLIB_LIBRARIES}
21 )
diff --git a/linden/indra/cmake/LLCrashLogger.cmake b/linden/indra/cmake/LLCrashLogger.cmake
index 7b362d0..f2cb83e 100644
--- a/linden/indra/cmake/LLCrashLogger.cmake
+++ b/linden/indra/cmake/LLCrashLogger.cmake
@@ -4,6 +4,4 @@ set(LLCRASHLOGGER_INCLUDE_DIRS
4 ${LIBS_OPEN_DIR}/llcrashlogger 4 ${LIBS_OPEN_DIR}/llcrashlogger
5 ) 5 )
6 6
7set(LLCRASHLOGGER_LIBRARIES 7set(LLCRASHLOGGER_LIBRARIES llcrashlogger)
8 llcrashlogger
9 )
diff --git a/linden/indra/cmake/LLDatabase.cmake b/linden/indra/cmake/LLDatabase.cmake
index c3cf622..6526101 100644
--- a/linden/indra/cmake/LLDatabase.cmake
+++ b/linden/indra/cmake/LLDatabase.cmake
@@ -7,7 +7,4 @@ set(LLDATABASE_INCLUDE_DIRS
7 ${MYSQL_INCLUDE_DIR} 7 ${MYSQL_INCLUDE_DIR}
8 ) 8 )
9 9
10set(LLDATABASE_LIBRARIES 10set(LLDATABASE_LIBRARIES lldatabase)
11 lldatabase
12 ${MYSQL_LIBRARIES}
13 )
diff --git a/linden/indra/cmake/LLImage.cmake b/linden/indra/cmake/LLImage.cmake
index 8874fa5..ec3da89 100644
--- a/linden/indra/cmake/LLImage.cmake
+++ b/linden/indra/cmake/LLImage.cmake
@@ -8,8 +8,4 @@ set(LLIMAGE_INCLUDE_DIRS
8 ${JPEG_INCLUDE_DIRS} 8 ${JPEG_INCLUDE_DIRS}
9 ) 9 )
10 10
11set(LLIMAGE_LIBRARIES 11set(LLIMAGE_LIBRARIES llimage)
12 llimage
13 ${JPEG_LIBRARIES}
14 ${PNG_LIBRARIES}
15 )
diff --git a/linden/indra/cmake/LLImageJ2COJ.cmake b/linden/indra/cmake/LLImageJ2COJ.cmake
index 91973e0..1bcf205 100644
--- a/linden/indra/cmake/LLImageJ2COJ.cmake
+++ b/linden/indra/cmake/LLImageJ2COJ.cmake
@@ -2,7 +2,4 @@
2 2
3include(OpenJPEG) 3include(OpenJPEG)
4 4
5set(LLIMAGEJ2COJ_LIBRARIES 5set(LLIMAGEJ2COJ_LIBRARIES llimagej2coj)
6 llimagej2coj
7 ${OPENJPEG_LIBRARIES}
8 )
diff --git a/linden/indra/cmake/LLInventory.cmake b/linden/indra/cmake/LLInventory.cmake
index 7d5f492..c3dc077 100644
--- a/linden/indra/cmake/LLInventory.cmake
+++ b/linden/indra/cmake/LLInventory.cmake
@@ -4,6 +4,4 @@ set(LLINVENTORY_INCLUDE_DIRS
4 ${LIBS_OPEN_DIR}/llinventory 4 ${LIBS_OPEN_DIR}/llinventory
5 ) 5 )
6 6
7set(LLINVENTORY_LIBRARIES 7set(LLINVENTORY_LIBRARIES llinventory)
8 llinventory
9 )
diff --git a/linden/indra/cmake/LLKDU.cmake b/linden/indra/cmake/LLKDU.cmake
index a02b5d9..f103dcf 100644
--- a/linden/indra/cmake/LLKDU.cmake
+++ b/linden/indra/cmake/LLKDU.cmake
@@ -5,8 +5,6 @@ if (NOT STANDALONE AND EXISTS ${LIBS_CLOSED_DIR}/llkdu)
5 use_prebuilt_binary(kdu) 5 use_prebuilt_binary(kdu)
6 if (WINDOWS) 6 if (WINDOWS)
7 set(KDU_LIBRARY debug kdu_cored optimized kdu_core) 7 set(KDU_LIBRARY debug kdu_cored optimized kdu_core)
8 elseif (LINUX)
9 set(KDU_LIBRARY kdu_v42R)
10 else (WINDOWS) 8 else (WINDOWS)
11 set(KDU_LIBRARY kdu) 9 set(KDU_LIBRARY kdu)
12 endif (WINDOWS) 10 endif (WINDOWS)
diff --git a/linden/indra/cmake/LLMath.cmake b/linden/indra/cmake/LLMath.cmake
index 8afd45e..893920a 100644
--- a/linden/indra/cmake/LLMath.cmake
+++ b/linden/indra/cmake/LLMath.cmake
@@ -4,6 +4,4 @@ set(LLMATH_INCLUDE_DIRS
4 ${LIBS_OPEN_DIR}/llmath 4 ${LIBS_OPEN_DIR}/llmath
5 ) 5 )
6 6
7set(LLMATH_LIBRARIES 7set(LLMATH_LIBRARIES llmath)
8 llmath
9 )
diff --git a/linden/indra/cmake/LLMedia.cmake b/linden/indra/cmake/LLMedia.cmake
index b7bf11c..91c7818 100644
--- a/linden/indra/cmake/LLMedia.cmake
+++ b/linden/indra/cmake/LLMedia.cmake
@@ -7,9 +7,4 @@ set(LLMEDIA_INCLUDE_DIRS
7 ${LIBS_OPEN_DIR}/llmedia 7 ${LIBS_OPEN_DIR}/llmedia
8 ) 8 )
9 9
10set(LLMEDIA_LIBRARIES 10set(LLMEDIA_LIBRARIES llmedia)
11 llmedia
12 ${GSTREAMER_LIBRARIES}
13 ${GSTREAMER_PLUGINS_BASE_LIBRARIES}
14 ${QUICKTIME_LIBRARY}
15 )
diff --git a/linden/indra/cmake/LLMessage.cmake b/linden/indra/cmake/LLMessage.cmake
index 1cea03a..0143d04 100644
--- a/linden/indra/cmake/LLMessage.cmake
+++ b/linden/indra/cmake/LLMessage.cmake
@@ -12,11 +12,4 @@ set(LLMESSAGE_INCLUDE_DIRS
12 ${OPENSSL_INCLUDE_DIRS} 12 ${OPENSSL_INCLUDE_DIRS}
13 ) 13 )
14 14
15set(LLMESSAGE_LIBRARIES 15set(LLMESSAGE_LIBRARIES llmessage)
16 llmessage
17 ${CURL_LIBRARIES}
18 ${CARES_LIBRARIES}
19 ${OPENSSL_LIBRARIES}
20 ${CRYPTO_LIBRARIES}
21 ${XMLRPCEPI_LIBRARIES}
22 )
diff --git a/linden/indra/cmake/LLPhysics.cmake b/linden/indra/cmake/LLPhysics.cmake
deleted file mode 100644
index 3ae390e..0000000
--- a/linden/indra/cmake/LLPhysics.cmake
+++ /dev/null
@@ -1,76 +0,0 @@
1# -*- cmake -*-
2include(Prebuilt)
3
4use_prebuilt_binary(havok)
5
6set(HAVOK_VERSION 460)
7
8set(LLPHYSICS_INCLUDE_DIRS
9 ${LIBS_SERVER_DIR}/llphysics
10 ${LIBS_PREBUILT_DIR}/include/havok/hk${HAVOK_VERSION}/common
11 ${LIBS_PREBUILT_DIR}/include/havok/hk${HAVOK_VERSION}/physics
12 )
13
14add_definitions(-DLL_CURRENT_HAVOK_VERSION=${HAVOK_VERSION})
15
16if (LINUX OR DARWIN)
17 if (DARWIN)
18 link_directories(
19 ${LIBS_PREBUILT_DIR}/universal-darwin/lib_release/havok/hk460
20 )
21 else (DARWIN)
22 link_directories(
23 ${LIBS_PREBUILT_DIR}/${LL_ARCH_DIR}/lib_release/havok/hk460
24 )
25 endif (DARWIN)
26
27 set(LLPHYSICS_LIBRARIES
28 llphysics
29 hkcompat
30 hkutilities
31 hkvisualize
32 hkdynamics
33 hkvehicle
34 hkcollide
35 hkinternal
36 hkconstraintsolver
37 hkmath
38 hkscenedata
39 hkserialize
40 hkgraphicsogl
41 hkgraphicsbridge
42 hkgraphics
43 hkdemoframework
44 hkbase
45 )
46elseif (WINDOWS)
47 if (MSVC71)
48 set(HK_DEBUG ${WINLIBS_PREBUILT_DEBUG_DIR}/havok/hk460)
49 set(HK_RELEASE ${WINLIBS_PREBUILT_RELEASE_DIR}/havok/hk460)
50 else (MSVC71)
51 set(HK_DEBUG ${WINLIBS_PREBUILT_DEBUG_DIR}/havok/hk460_net_8-0)
52 set(HK_RELEASE ${WINLIBS_PREBUILT_RELEASE_DIR}/havok/hk460_net_8-0)
53 endif (MSVC71)
54
55 set(HAVOK_LIBS
56 hkbase
57 hkdynamics
58 hkmath
59 hkcollide
60 hkutilities
61 hkvisualize
62 hkinternal
63 hkconstraintsolver
64 hkcompat
65 hkserialize
66 hkvehicle
67 hkscenedata
68 )
69
70 set(LLPHYSICS_LIBRARIES llphysics)
71
72 foreach(lib ${HAVOK_LIBS})
73 list(APPEND LLPHYSICS_LIBRARIES
74 debug ${HK_DEBUG}/${lib} optimized ${HK_RELEASE}/${lib})
75 endforeach(lib)
76endif (LINUX OR DARWIN)
diff --git a/linden/indra/cmake/LLPrimitive.cmake b/linden/indra/cmake/LLPrimitive.cmake
index 0426ae5..d397b78 100644
--- a/linden/indra/cmake/LLPrimitive.cmake
+++ b/linden/indra/cmake/LLPrimitive.cmake
@@ -4,6 +4,4 @@ set(LLPRIMITIVE_INCLUDE_DIRS
4 ${LIBS_OPEN_DIR}/llprimitive 4 ${LIBS_OPEN_DIR}/llprimitive
5 ) 5 )
6 6
7set(LLPRIMITIVE_LIBRARIES 7set(LLPRIMITIVE_LIBRARIES llprimitive)
8 llprimitive
9 )
diff --git a/linden/indra/cmake/LLScene.cmake b/linden/indra/cmake/LLScene.cmake
index d1c32b3..96ad508 100644
--- a/linden/indra/cmake/LLScene.cmake
+++ b/linden/indra/cmake/LLScene.cmake
@@ -4,6 +4,4 @@ set(LLSCENE_INCLUDE_DIRS
4 ${LIBS_SERVER_DIR}/llscene 4 ${LIBS_SERVER_DIR}/llscene
5 ) 5 )
6 6
7set(LLSCENE_LIBRARIES 7set(LLSCENE_LIBRARIES llscene)
8 llscene
9 )
diff --git a/linden/indra/cmake/LLUI.cmake b/linden/indra/cmake/LLUI.cmake
index d1287de..34de571 100644
--- a/linden/indra/cmake/LLUI.cmake
+++ b/linden/indra/cmake/LLUI.cmake
@@ -4,6 +4,4 @@ set(LLUI_INCLUDE_DIRS
4 ${LIBS_OPEN_DIR}/llui 4 ${LIBS_OPEN_DIR}/llui
5 ) 5 )
6 6
7set(LLUI_LIBRARIES 7set(LLUI_LIBRARIES llui)
8 llui
9 )
diff --git a/linden/indra/cmake/LLVFS.cmake b/linden/indra/cmake/LLVFS.cmake
index 5ce3d25..0fe87cd 100644
--- a/linden/indra/cmake/LLVFS.cmake
+++ b/linden/indra/cmake/LLVFS.cmake
@@ -5,9 +5,3 @@ set(LLVFS_INCLUDE_DIRS
5 ) 5 )
6 6
7set(LLVFS_LIBRARIES llvfs) 7set(LLVFS_LIBRARIES llvfs)
8
9if (DARWIN)
10 include(CMakeFindFrameworks)
11 find_library(CARBON_LIBRARY Carbon)
12 list(APPEND LLVFS_LIBRARIES ${CARBON_LIBRARY})
13endif (DARWIN)
diff --git a/linden/indra/cmake/LLXML.cmake b/linden/indra/cmake/LLXML.cmake
index 1ce93c0..64dfdb6 100644
--- a/linden/indra/cmake/LLXML.cmake
+++ b/linden/indra/cmake/LLXML.cmake
@@ -1,13 +1,12 @@
1# -*- cmake -*- 1# -*- cmake -*-
2 2
3include(Boost)
3include(EXPAT) 4include(EXPAT)
4 5
5set(LLXML_INCLUDE_DIRS 6set(LLXML_INCLUDE_DIRS
6 ${LIBS_OPEN_DIR}/llxml 7 ${LIBS_OPEN_DIR}/llxml
8 ${Boost_INCLUDE_DIRS}
7 ${EXPAT_INCLUDE_DIRS} 9 ${EXPAT_INCLUDE_DIRS}
8 ) 10 )
9 11
10set(LLXML_LIBRARIES 12set(LLXML_LIBRARIES llxml)
11 llxml
12 ${EXPAT_LIBRARIES}
13 )
diff --git a/linden/indra/cmake/Linking.cmake b/linden/indra/cmake/Linking.cmake
index c9748e3..167c5dd 100644
--- a/linden/indra/cmake/Linking.cmake
+++ b/linden/indra/cmake/Linking.cmake
@@ -7,15 +7,15 @@ if (NOT STANDALONE)
7 set(ARCH_PREBUILT_DIRS_DEBUG ${LIBS_PREBUILT_DIR}/${LL_ARCH_DIR}/lib/debug) 7 set(ARCH_PREBUILT_DIRS_DEBUG ${LIBS_PREBUILT_DIR}/${LL_ARCH_DIR}/lib/debug)
8 elseif (LINUX) 8 elseif (LINUX)
9 if (VIEWER) 9 if (VIEWER)
10 set(ARCH_PREBUILT_DIRS 10 set(ARCH_PREBUILT_DIRS ${LIBS_PREBUILT_DIR}/${LL_ARCH_DIR}/lib_release_client)
11 ${LIBS_PREBUILT_DIR}/${LL_ARCH_DIR}/lib_release_client)
12 set(ARCH_PREBUILT_DIRS_RELEASE ${ARCH_PREBUILT_DIRS})
13 set(ARCH_PREBUILT_DIRS_DEBUG ${ARCH_PREBUILT_DIRS})
14 else (VIEWER) 11 else (VIEWER)
15 set(ARCH_PREBUILT_DIRS ${LIBS_PREBUILT_DIR}/${LL_ARCH_DIR}/lib_release) 12 set(ARCH_PREBUILT_DIRS ${LIBS_PREBUILT_DIR}/${LL_ARCH_DIR}/lib_release)
16 endif (VIEWER) 13 endif (VIEWER)
14 set(ARCH_PREBUILT_DIRS_RELEASE ${ARCH_PREBUILT_DIRS})
15 set(ARCH_PREBUILT_DIRS_DEBUG ${ARCH_PREBUILT_DIRS})
17 elseif (DARWIN) 16 elseif (DARWIN)
18 set(ARCH_PREBUILT_DIRS_RELEASE ${LIBS_PREBUILT_DIR}/${LL_ARCH_DIR}/lib_release) 17 set(ARCH_PREBUILT_DIRS_RELEASE ${LIBS_PREBUILT_DIR}/${LL_ARCH_DIR}/lib_release)
18 set(ARCH_PREBUILT_DIRS ${ARCH_PREBUILT_DIRS_RELEASE})
19 set(ARCH_PREBUILT_DIRS_DEBUG ${ARCH_PREBUILT_DIRS_RELEASE}) 19 set(ARCH_PREBUILT_DIRS_DEBUG ${ARCH_PREBUILT_DIRS_RELEASE})
20 endif (WINDOWS) 20 endif (WINDOWS)
21endif (NOT STANDALONE) 21endif (NOT STANDALONE)
diff --git a/linden/indra/cmake/Python.cmake b/linden/indra/cmake/Python.cmake
index e9505fb..4f86d32 100644
--- a/linden/indra/cmake/Python.cmake
+++ b/linden/indra/cmake/Python.cmake
@@ -9,6 +9,7 @@ if (WINDOWS)
9 NAMES python25.exe python23.exe python.exe 9 NAMES python25.exe python23.exe python.exe
10 NO_DEFAULT_PATH # added so that cmake does not find cygwin python 10 NO_DEFAULT_PATH # added so that cmake does not find cygwin python
11 PATHS 11 PATHS
12 [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\2.6\\InstallPath]
12 [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\2.5\\InstallPath] 13 [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\2.5\\InstallPath]
13 [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\2.4\\InstallPath] 14 [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\2.4\\InstallPath]
14 [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\2.3\\InstallPath] 15 [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\2.3\\InstallPath]
diff --git a/linden/indra/cmake/QuickTime.cmake b/linden/indra/cmake/QuickTime.cmake
index b79ac11..4352709 100644
--- a/linden/indra/cmake/QuickTime.cmake
+++ b/linden/indra/cmake/QuickTime.cmake
@@ -9,13 +9,29 @@ if (DARWIN)
9 include(CMakeFindFrameworks) 9 include(CMakeFindFrameworks)
10 find_library(QUICKTIME_LIBRARY QuickTime) 10 find_library(QUICKTIME_LIBRARY QuickTime)
11elseif (WINDOWS) 11elseif (WINDOWS)
12 set(QUICKTIME_SDK_DIR "C:\\Program Files\\QuickTime SDK" 12 set(QUICKTIME_SDK_DIR "$ENV{PROGRAMFILES}/QuickTime SDK"
13 CACHE PATH "Location of the QuickTime SDK.") 13 CACHE PATH "Location of the QuickTime SDK.")
14 find_library(QUICKTIME_LIBRARY qtmlclient 14
15 find_library(DEBUG_QUICKTIME_LIBRARY qtmlclient
16 PATHS
17 ${ARCH_PREBUILT_DIRS_DEBUG}
18 "${QUICKTIME_SDK_DIR}\\libraries"
19 )
20
21 find_library(RELEASE_QUICKTIME_LIBRARY qtmlclient
15 PATHS 22 PATHS
16 ${LIBS_PREBUILT_DIR}/${LL_ARCH_DIR}/lib/release 23 ${ARCH_PREBUILT_DIRS_RELEASE}
17 "${QUICKTIME_SDK_DIR}\\libraries" 24 "${QUICKTIME_SDK_DIR}\\libraries"
18 ) 25 )
26
27 if (DEBUG_QUICKTIME_LIBRARY AND RELEASE_QUICKTIME_LIBRARY)
28 set(QUICKTIME_LIBRARY
29 optimized ${RELEASE_QUICKTIME_LIBRARY}
30 debug ${DEBUG_QUICKTIME_LIBRARY}
31 )
32
33 endif (DEBUG_QUICKTIME_LIBRARY AND RELEASE_QUICKTIME_LIBRARY)
34
19 include_directories( 35 include_directories(
20 ${LIBS_PREBUILT_DIR}/${LL_ARCH_DIR}/include/quicktime 36 ${LIBS_PREBUILT_DIR}/${LL_ARCH_DIR}/include/quicktime
21 "${QUICKTIME_SDK_DIR}\\CIncludes" 37 "${QUICKTIME_SDK_DIR}\\CIncludes"
diff --git a/linden/indra/develop.py b/linden/indra/develop.py
index 8edfccc..c4a9d0d 100755
--- a/linden/indra/develop.py
+++ b/linden/indra/develop.py
@@ -53,6 +53,16 @@ def mkdir(path):
53 if err.errno != errno.EEXIST or not os.path.isdir(path): 53 if err.errno != errno.EEXIST or not os.path.isdir(path):
54 raise 54 raise
55 55
56def getcwd():
57 cwd = os.getcwd()
58 if 'a' <= cwd[0] <= 'z' and cwd[1] == ':':
59 # CMake wants DOS drive letters to be in uppercase. The above
60 # condition never asserts on platforms whose full path names
61 # always begin with a slash, so we don't need to test whether
62 # we are running on Windows.
63 cwd = cwd[0].upper() + cwd[1:]
64 return cwd
65
56def quote(opts): 66def quote(opts):
57 return '"' + '" "'.join([ opt.replace('"', '') for opt in opts ]) + '"' 67 return '"' + '" "'.join([ opt.replace('"', '') for opt in opts ]) + '"'
58 68
@@ -63,8 +73,8 @@ class PlatformSetup(object):
63 build_types[t.lower()] = t 73 build_types[t.lower()] = t
64 74
65 build_type = build_types['relwithdebinfo'] 75 build_type = build_types['relwithdebinfo']
66 standalone = 'FALSE' 76 standalone = 'OFF'
67 unattended = 'FALSE' 77 unattended = 'OFF'
68 distcc = True 78 distcc = True
69 cmake_opts = [] 79 cmake_opts = []
70 80
@@ -141,7 +151,7 @@ class PlatformSetup(object):
141 # do a sanity check to make sure we have a generator 151 # do a sanity check to make sure we have a generator
142 if not hasattr(self, 'generator'): 152 if not hasattr(self, 'generator'):
143 raise "No generator available for '%s'" % (self.__name__,) 153 raise "No generator available for '%s'" % (self.__name__,)
144 cwd = os.getcwd() 154 cwd = getcwd()
145 created = [] 155 created = []
146 try: 156 try:
147 for d in self.build_dirs(): 157 for d in self.build_dirs():
@@ -218,11 +228,15 @@ class UnixSetup(PlatformSetup):
218 elif cpu == 'Power Macintosh': 228 elif cpu == 'Power Macintosh':
219 cpu = 'ppc' 229 cpu = 'ppc'
220 return cpu 230 return cpu
221 231
222 232
223class LinuxSetup(UnixSetup): 233class LinuxSetup(UnixSetup):
224 def __init__(self): 234 def __init__(self):
225 super(LinuxSetup, self).__init__() 235 super(LinuxSetup, self).__init__()
236 try:
237 self.debian_sarge = open('/etc/debian_version').read().strip() == '3.1'
238 except:
239 self.debian_sarge = False
226 240
227 def os(self): 241 def os(self):
228 return 'linux' 242 return 'linux'
@@ -230,10 +244,17 @@ class LinuxSetup(UnixSetup):
230 def build_dirs(self): 244 def build_dirs(self):
231 # Only build the server code if (a) we have it and (b) we're 245 # Only build the server code if (a) we have it and (b) we're
232 # on 32-bit x86. 246 # on 32-bit x86.
247 platform_build = '%s-%s' % (self.platform(), self.build_type.lower())
248
233 if self.arch() == 'i686' and self.is_internal_tree(): 249 if self.arch() == 'i686' and self.is_internal_tree():
234 return ['viewer-' + self.platform(), 'server-' + self.platform()] 250 return ['viewer-' + platform_build, 'server-' + platform_build]
251 elif self.arch() == 'x86_64' and self.is_internal_tree():
252 # the viewer does not build in 64bit -- kdu5 issues
253 # we can either use openjpeg, or overhaul our viewer to handle kdu5 or higher
254 # doug knows about kdu issues
255 return ['server-' + platform_build]
235 else: 256 else:
236 return ['viewer-' + self.platform()] 257 return ['viewer-' + platform_build]
237 258
238 def find_in_path(self, name, defval=None, basename=False): 259 def find_in_path(self, name, defval=None, basename=False):
239 for p in os.getenv('PATH', '/usr/bin').split(':'): 260 for p in os.getenv('PATH', '/usr/bin').split(':'):
@@ -254,7 +275,7 @@ class LinuxSetup(UnixSetup):
254 type=self.build_type.upper() 275 type=self.build_type.upper()
255 ) 276 )
256 if not self.is_internal_tree(): 277 if not self.is_internal_tree():
257 args.update({'cxx':'g++', 'server':'FALSE', 'viewer':'TRUE'}) 278 args.update({'cxx':'g++', 'server':'OFF', 'viewer':'ON'})
258 else: 279 else:
259 if self.distcc: 280 if self.distcc:
260 distcc = self.find_in_path('distcc') 281 distcc = self.find_in_path('distcc')
@@ -263,18 +284,16 @@ class LinuxSetup(UnixSetup):
263 distcc = [] 284 distcc = []
264 baseonly = False 285 baseonly = False
265 if 'server' in build_dir: 286 if 'server' in build_dir:
266 gcc33 = distcc + self.find_in_path('g++-3.3', 'g++', baseonly) 287 gcc = distcc + self.find_in_path(
267 args.update({'cxx':' '.join(gcc33), 'server':'TRUE', 288 self.debian_sarge and 'g++-3.3' or 'g++-4.1',
268 'viewer':'FALSE'}) 289 'g++', baseonly)
290 args.update({'cxx': ' '.join(gcc), 'server': 'ON',
291 'viewer': 'OFF'})
269 else: 292 else:
270 gcc41 = distcc + self.find_in_path('g++-4.1', 'g++', baseonly) 293 gcc41 = distcc + self.find_in_path('g++-4.1', 'g++', baseonly)
271 args.update({'cxx': ' '.join(gcc41), 'server':'FALSE', 294 args.update({'cxx': ' '.join(gcc41),
272 'viewer':'TRUE'}) 295 'server': 'OFF',
273 #if simple: 296 'viewer': 'ON'})
274 # return (('cmake %(opts)s '
275 # '-DSERVER:BOOL=%(server)s '
276 # '-DVIEWER:BOOL=%(viewer)s '
277 # '%(dir)r') % args)
278 cmd = (('cmake -DCMAKE_BUILD_TYPE:STRING=%(type)s ' 297 cmd = (('cmake -DCMAKE_BUILD_TYPE:STRING=%(type)s '
279 '-G %(generator)r -DSERVER:BOOL=%(server)s ' 298 '-G %(generator)r -DSERVER:BOOL=%(server)s '
280 '-DVIEWER:BOOL=%(viewer)s -DSTANDALONE:BOOL=%(standalone)s ' 299 '-DVIEWER:BOOL=%(viewer)s -DSTANDALONE:BOOL=%(standalone)s '
@@ -369,7 +388,7 @@ class DarwinSetup(UnixSetup):
369 return 'darwin' 388 return 'darwin'
370 389
371 def arch(self): 390 def arch(self):
372 if self.unattended == 'TRUE': 391 if self.unattended == 'ON':
373 return 'universal' 392 return 'universal'
374 else: 393 else:
375 return UnixSetup.arch(self) 394 return UnixSetup.arch(self)
@@ -384,7 +403,7 @@ class DarwinSetup(UnixSetup):
384 universal='', 403 universal='',
385 type=self.build_type.upper() 404 type=self.build_type.upper()
386 ) 405 )
387 if self.unattended == 'TRUE': 406 if self.unattended == 'ON':
388 args['universal'] = '-DCMAKE_OSX_ARCHITECTURES:STRING=\'i386;ppc\'' 407 args['universal'] = '-DCMAKE_OSX_ARCHITECTURES:STRING=\'i386;ppc\''
389 #if simple: 408 #if simple:
390 # return 'cmake %(opts)s %(dir)r' % args 409 # return 'cmake %(opts)s %(dir)r' % args
@@ -396,7 +415,7 @@ class DarwinSetup(UnixSetup):
396 '%(opts)s %(dir)r' % args) 415 '%(opts)s %(dir)r' % args)
397 416
398 def run_build(self, opts, targets): 417 def run_build(self, opts, targets):
399 cwd = os.getcwd() 418 cwd = getcwd()
400 if targets: 419 if targets:
401 targets = ' '.join(['-target ' + repr(t) for t in targets]) 420 targets = ' '.join(['-target ' + repr(t) for t in targets])
402 else: 421 else:
@@ -439,7 +458,7 @@ class WindowsSetup(PlatformSetup):
439 458
440 def _get_generator(self): 459 def _get_generator(self):
441 if self._generator is None: 460 if self._generator is None:
442 for version in 'vc71 vc80 vc90'.split(): 461 for version in 'vc80 vc90 vc71'.split():
443 if self.find_visual_studio(version): 462 if self.find_visual_studio(version):
444 self._generator = version 463 self._generator = version
445 print 'Building with ', self.gens[version]['gen'] 464 print 'Building with ', self.gens[version]['gen']
@@ -523,18 +542,30 @@ class WindowsSetup(PlatformSetup):
523 def run_cmake(self, args=[]): 542 def run_cmake(self, args=[]):
524 '''Override to add the vstool.exe call after running cmake.''' 543 '''Override to add the vstool.exe call after running cmake.'''
525 PlatformSetup.run_cmake(self, args) 544 PlatformSetup.run_cmake(self, args)
526 if self.unattended == 'FALSE': 545 if self.unattended == 'OFF':
527 for build_dir in self.build_dirs(): 546 self.run_vstool()
528 vstool_cmd = os.path.join('tools','vstool','VSTool.exe') \ 547
529 + ' --solution ' \ 548 def run_vstool(self):
530 + os.path.join(build_dir,'SecondLife.sln') \ 549 for build_dir in self.build_dirs():
531 + ' --config RelWithDebInfo' \ 550 stamp = os.path.join(build_dir, 'vstool.txt')
532 + ' --startup secondlife-bin' 551 try:
533 print 'Running %r in %r' % (vstool_cmd, os.getcwd()) 552 prev_build = open(stamp).read().strip()
534 self.run(vstool_cmd) 553 except IOError:
554 prev_build = ''
555 if prev_build == self.build_type:
556 # Only run vstool if the build type has changed.
557 continue
558 vstool_cmd = (os.path.join('tools','vstool','VSTool.exe') +
559 ' --solution ' +
560 os.path.join(build_dir,'SecondLife.sln') +
561 ' --config ' + self.build_type +
562 ' --startup secondlife-bin')
563 print 'Running %r in %r' % (vstool_cmd, getcwd())
564 self.run(vstool_cmd)
565 print >> open(stamp, 'w'), self.build_type
535 566
536 def run_build(self, opts, targets): 567 def run_build(self, opts, targets):
537 cwd = os.getcwd() 568 cwd = getcwd()
538 build_cmd = self.get_build_cmd() 569 build_cmd = self.get_build_cmd()
539 570
540 for d in self.build_dirs(): 571 for d in self.build_dirs():
@@ -555,7 +586,7 @@ class WindowsSetup(PlatformSetup):
555class CygwinSetup(WindowsSetup): 586class CygwinSetup(WindowsSetup):
556 def __init__(self): 587 def __init__(self):
557 super(CygwinSetup, self).__init__() 588 super(CygwinSetup, self).__init__()
558 self.generator = 'vc71' 589 self.generator = 'vc80'
559 590
560 def cmake_commandline(self, src_dir, build_dir, opts, simple): 591 def cmake_commandline(self, src_dir, build_dir, opts, simple):
561 dos_dir = commands.getoutput("cygpath -w %s" % src_dir) 592 dos_dir = commands.getoutput("cygpath -w %s" % src_dir)
@@ -601,6 +632,13 @@ Commands:
601 configure configure project by running cmake 632 configure configure project by running cmake
602 633
603If you do not specify a command, the default is "configure". 634If you do not specify a command, the default is "configure".
635
636Examples:
637 Set up a viewer-only project for your system:
638 develop.py configure -DSERVER:BOOL=OFF
639
640 Set up a Visual Studio 2005 project with package target (to build installer):
641 develop.py -G vc80 configure -DPACKAGE:BOOL=ON
604''' 642'''
605 643
606def main(arguments): 644def main(arguments):
@@ -612,6 +650,9 @@ def main(arguments):
612 ['help', 'standalone', 'no-distcc', 'unattended', 'type=', 'incredibuild', 'generator=']) 650 ['help', 'standalone', 'no-distcc', 'unattended', 'type=', 'incredibuild', 'generator='])
613 except getopt.GetoptError, err: 651 except getopt.GetoptError, err:
614 print >> sys.stderr, 'Error:', err 652 print >> sys.stderr, 'Error:', err
653 print >> sys.stderr, """
654Note: You must pass -D options to cmake after the "configure" command
655For example: develop.py configure -DSERVER:BOOL=OFF"""
615 sys.exit(1) 656 sys.exit(1)
616 657
617 for o, a in opts: 658 for o, a in opts:
@@ -619,9 +660,9 @@ def main(arguments):
619 print usage_msg.strip() 660 print usage_msg.strip()
620 sys.exit(0) 661 sys.exit(0)
621 elif o in ('--standalone',): 662 elif o in ('--standalone',):
622 setup.standalone = 'TRUE' 663 setup.standalone = 'ON'
623 elif o in ('--unattended',): 664 elif o in ('--unattended',):
624 setup.unattended = 'TRUE' 665 setup.unattended = 'ON'
625 elif o in ('-t', '--type'): 666 elif o in ('-t', '--type'):
626 try: 667 try:
627 setup.build_type = setup.build_types[a.lower()] 668 setup.build_type = setup.build_types[a.lower()]
@@ -664,13 +705,14 @@ def main(arguments):
664 print >> sys.stderr, 'Error: unknown subcommand', repr(cmd) 705 print >> sys.stderr, 'Error: unknown subcommand', repr(cmd)
665 print >> sys.stderr, "(run 'develop.py --help' for help)" 706 print >> sys.stderr, "(run 'develop.py --help' for help)"
666 sys.exit(1) 707 sys.exit(1)
667 except CommandError, err:
668 print >> sys.stderr, 'Error:', err
669 sys.exit(1)
670 except getopt.GetoptError, err: 708 except getopt.GetoptError, err:
671 print >> sys.stderr, 'Error with %r subcommand: %s' % (cmd, err) 709 print >> sys.stderr, 'Error with %r subcommand: %s' % (cmd, err)
672 sys.exit(1) 710 sys.exit(1)
673 711
674 712
675if __name__ == '__main__': 713if __name__ == '__main__':
676 main(sys.argv[1:]) 714 try:
715 main(sys.argv[1:])
716 except CommandError, err:
717 print >> sys.stderr, 'Error:', err
718 sys.exit(1)
diff --git a/linden/indra/lib/python/indra/base/lllog.py b/linden/indra/lib/python/indra/base/lllog.py
index 99c50ef..1301894 100644
--- a/linden/indra/lib/python/indra/base/lllog.py
+++ b/linden/indra/lib/python/indra/base/lllog.py
@@ -59,7 +59,7 @@ class Logger(object):
59 return self._sequence 59 return self._sequence
60 60
61 def log(self, msg, llsd): 61 def log(self, msg, llsd):
62 payload = 'LLLOGMESSAGE (%d) %s %s' % (self.next(), msg, 62 payload = 'INFO: log: LLLOGMESSAGE (%d) %s %s' % (self.next(), msg,
63 format_notation(llsd)) 63 format_notation(llsd))
64 syslog.syslog(payload) 64 syslog.syslog(payload)
65 65
diff --git a/linden/indra/lib/python/indra/base/llsd.py b/linden/indra/lib/python/indra/base/llsd.py
index 995ace7..5b8f5d7 100644
--- a/linden/indra/lib/python/indra/base/llsd.py
+++ b/linden/indra/lib/python/indra/base/llsd.py
@@ -33,19 +33,26 @@ import time
33import types 33import types
34import re 34import re
35 35
36from indra.util.fastest_elementtree import fromstring 36from indra.util.fastest_elementtree import ElementTreeError, fromstring
37from indra.base import lluuid 37from indra.base import lluuid
38 38
39int_regex = re.compile("[-+]?\d+") 39try:
40real_regex = re.compile("[-+]?(\d+(\.\d*)?|\d*\.\d+)([eE][-+]?\d+)?") 40 import cllsd
41alpha_regex = re.compile("[a-zA-Z]+") 41except ImportError:
42date_regex = re.compile("(?P<year>\d{4})-(?P<month>\d{2})-(?P<day>\d{2})T(?P<hour>\d{2}):(?P<minute>\d{2}):(?P<second>\d{2})(?P<second_float>\.\d{2})?Z") 42 cllsd = None
43#date: d"YYYY-MM-DDTHH:MM:SS.FFZ" 43
44int_regex = re.compile(r"[-+]?\d+")
45real_regex = re.compile(r"[-+]?(\d+(\.\d*)?|\d*\.\d+)([eE][-+]?\d+)?")
46alpha_regex = re.compile(r"[a-zA-Z]+")
47date_regex = re.compile(r"(?P<year>\d{4})-(?P<month>\d{2})-(?P<day>\d{2})T"
48 r"(?P<hour>\d{2}):(?P<minute>\d{2}):(?P<second>\d{2})"
49 r"(?P<second_float>(\.\d+)?)Z")
50#date: d"YYYY-MM-DDTHH:MM:SS.FFFFFFZ"
44 51
45class LLSDParseError(Exception): 52class LLSDParseError(Exception):
46 pass 53 pass
47 54
48class LLSDSerializationError(Exception): 55class LLSDSerializationError(TypeError):
49 pass 56 pass
50 57
51 58
@@ -62,14 +69,7 @@ BOOL_FALSE = ('0', '0.0', 'false', '')
62 69
63def format_datestr(v): 70def format_datestr(v):
64 """ Formats a datetime object into the string format shared by xml and notation serializations.""" 71 """ Formats a datetime object into the string format shared by xml and notation serializations."""
65 second_str = "" 72 return v.isoformat() + 'Z'
66 if v.microsecond > 0:
67 seconds = v.second + float(v.microsecond) / 1000000
68 second_str = "%05.2f" % seconds
69 else:
70 second_str = "%d" % v.second
71 return '%s%sZ' % (v.strftime('%Y-%m-%dT%H:%M:'), second_str)
72
73 73
74def parse_datestr(datestr): 74def parse_datestr(datestr):
75 """Parses a datetime object from the string format shared by xml and notation serializations.""" 75 """Parses a datetime object from the string format shared by xml and notation serializations."""
@@ -89,7 +89,7 @@ def parse_datestr(datestr):
89 seconds_float = match.group('second_float') 89 seconds_float = match.group('second_float')
90 microsecond = 0 90 microsecond = 0
91 if seconds_float: 91 if seconds_float:
92 microsecond = int(seconds_float[1:]) * 10000 92 microsecond = int(float('0' + seconds_float) * 1e6)
93 return datetime.datetime(year, month, day, hour, minute, second, microsecond) 93 return datetime.datetime(year, month, day, hour, minute, second, microsecond)
94 94
95 95
@@ -116,7 +116,7 @@ def uuid_to_python(node):
116 return lluuid.UUID(node.text) 116 return lluuid.UUID(node.text)
117 117
118def str_to_python(node): 118def str_to_python(node):
119 return unicode(node.text or '').encode('utf8', 'replace') 119 return node.text or ''
120 120
121def bin_to_python(node): 121def bin_to_python(node):
122 return binary(base64.decodestring(node.text or '')) 122 return binary(base64.decodestring(node.text or ''))
@@ -189,9 +189,13 @@ class LLSDXMLFormatter(object):
189 if(contents is None or contents is ''): 189 if(contents is None or contents is ''):
190 return "<%s />" % (name,) 190 return "<%s />" % (name,)
191 else: 191 else:
192 if type(contents) is unicode:
193 contents = contents.encode('utf-8')
192 return "<%s>%s</%s>" % (name, contents, name) 194 return "<%s>%s</%s>" % (name, contents, name)
193 195
194 def xml_esc(self, v): 196 def xml_esc(self, v):
197 if type(v) is unicode:
198 v = v.encode('utf-8')
195 return v.replace('&', '&amp;').replace('<', '&lt;').replace('>', '&gt;') 199 return v.replace('&', '&amp;').replace('<', '&lt;').replace('>', '&gt;')
196 200
197 def LLSD(self, v): 201 def LLSD(self, v):
@@ -237,9 +241,14 @@ class LLSDXMLFormatter(object):
237 raise LLSDSerializationError("Cannot serialize unknown type: %s (%s)" % ( 241 raise LLSDSerializationError("Cannot serialize unknown type: %s (%s)" % (
238 t, something)) 242 t, something))
239 243
240 def format(self, something): 244 def _format(self, something):
241 return '<?xml version="1.0" ?>' + self.elt("llsd", self.generate(something)) 245 return '<?xml version="1.0" ?>' + self.elt("llsd", self.generate(something))
242 246
247 def format(self, something):
248 if cllsd:
249 return cllsd.llsd_to_xml(something)
250 return self._format(something)
251
243_g_xml_formatter = None 252_g_xml_formatter = None
244def format_xml(something): 253def format_xml(something):
245 global _g_xml_formatter 254 global _g_xml_formatter
@@ -356,8 +365,10 @@ class LLSDNotationFormatter(object):
356 def UUID(self, v): 365 def UUID(self, v):
357 return "u%s" % v 366 return "u%s" % v
358 def BINARY(self, v): 367 def BINARY(self, v):
359 raise LLSDSerializationError("binary notation not yet supported") 368 return 'b64"' + base64.encodestring(v) + '"'
360 def STRING(self, v): 369 def STRING(self, v):
370 if isinstance(v, unicode):
371 v = v.encode('utf-8')
361 return "'%s'" % v.replace("\\", "\\\\").replace("'", "\\'") 372 return "'%s'" % v.replace("\\", "\\\\").replace("'", "\\'")
362 def URI(self, v): 373 def URI(self, v):
363 return 'l"%s"' % str(v).replace("\\", "\\\\").replace('"', '\\"') 374 return 'l"%s"' % str(v).replace("\\", "\\\\").replace('"', '\\"')
@@ -366,16 +377,24 @@ class LLSDNotationFormatter(object):
366 def ARRAY(self, v): 377 def ARRAY(self, v):
367 return "[%s]" % ','.join([self.generate(item) for item in v]) 378 return "[%s]" % ','.join([self.generate(item) for item in v])
368 def MAP(self, v): 379 def MAP(self, v):
369 return "{%s}" % ','.join(["'%s':%s" % (key.replace("\\", "\\\\").replace("'", "\\'"), self.generate(value)) 380 def fix(key):
381 if isinstance(key, unicode):
382 return key.encode('utf-8')
383 return key
384 return "{%s}" % ','.join(["'%s':%s" % (fix(key).replace("\\", "\\\\").replace("'", "\\'"), self.generate(value))
370 for key, value in v.items()]) 385 for key, value in v.items()])
371 386
372 def generate(self, something): 387 def generate(self, something):
373 t = type(something) 388 t = type(something)
374 if self.type_map.has_key(t): 389 handler = self.type_map.get(t)
375 return self.type_map[t](something) 390 if handler:
391 return handler(something)
376 else: 392 else:
377 raise LLSDSerializationError("Cannot serialize unknown type: %s (%s)" % ( 393 try:
378 t, something)) 394 return self.ARRAY(iter(something))
395 except TypeError:
396 raise LLSDSerializationError(
397 "Cannot serialize unknown type: %s (%s)" % (t, something))
379 398
380 def format(self, something): 399 def format(self, something):
381 return self.generate(something) 400 return self.generate(something)
@@ -479,7 +498,6 @@ class LLSDBinaryParser(object):
479 raise LLSDParseError("invalid map key at byte %d." % ( 498 raise LLSDParseError("invalid map key at byte %d." % (
480 self._index - 1,)) 499 self._index - 1,))
481 value = self._parse() 500 value = self._parse()
482 #print "kv:",key,value
483 rv[key] = value 501 rv[key] = value
484 count += 1 502 count += 1
485 cc = self._buffer[self._index] 503 cc = self._buffer[self._index]
@@ -636,11 +654,23 @@ class LLSDNotationParser(object):
636 # 'd' = date in seconds since epoch 654 # 'd' = date in seconds since epoch
637 return self._parse_date() 655 return self._parse_date()
638 elif cc == 'b': 656 elif cc == 'b':
639 raise LLSDParseError("binary notation not yet supported") 657 return self._parse_binary()
640 else: 658 else:
641 raise LLSDParseError("invalid token at index %d: %d" % ( 659 raise LLSDParseError("invalid token at index %d: %d" % (
642 self._index - 1, ord(cc))) 660 self._index - 1, ord(cc)))
643 661
662 def _parse_binary(self):
663 i = self._index
664 if self._buffer[i:i+2] == '64':
665 q = self._buffer[i+2]
666 e = self._buffer.find(q, i+3)
667 try:
668 return base64.decodestring(self._buffer[i+3:e])
669 finally:
670 self._index = e + 1
671 else:
672 raise LLSDParseError('random horrible binary format not supported')
673
644 def _parse_map(self): 674 def _parse_map(self):
645 """ map: { string:object, string:object } """ 675 """ map: { string:object, string:object } """
646 rv = {} 676 rv = {}
@@ -653,30 +683,23 @@ class LLSDNotationParser(object):
653 if cc in ("'", '"', 's'): 683 if cc in ("'", '"', 's'):
654 key = self._parse_string(cc) 684 key = self._parse_string(cc)
655 found_key = True 685 found_key = True
656 #print "key:",key
657 elif cc.isspace() or cc == ',': 686 elif cc.isspace() or cc == ',':
658 cc = self._buffer[self._index] 687 cc = self._buffer[self._index]
659 self._index += 1 688 self._index += 1
660 else: 689 else:
661 raise LLSDParseError("invalid map key at byte %d." % ( 690 raise LLSDParseError("invalid map key at byte %d." % (
662 self._index - 1,)) 691 self._index - 1,))
692 elif cc.isspace() or cc == ':':
693 cc = self._buffer[self._index]
694 self._index += 1
695 continue
663 else: 696 else:
664 if cc.isspace() or cc == ':':
665 #print "skipping whitespace '%s'" % cc
666 cc = self._buffer[self._index]
667 self._index += 1
668 continue
669 self._index += 1 697 self._index += 1
670 value = self._parse() 698 value = self._parse()
671 #print "kv:",key,value
672 rv[key] = value 699 rv[key] = value
673 found_key = False 700 found_key = False
674 cc = self._buffer[self._index] 701 cc = self._buffer[self._index]
675 self._index += 1 702 self._index += 1
676 #if cc == '}':
677 # break
678 #cc = self._buffer[self._index]
679 #self._index += 1
680 703
681 return rv 704 return rv
682 705
@@ -840,6 +863,14 @@ def format_binary(something):
840 return '<?llsd/binary?>\n' + _format_binary_recurse(something) 863 return '<?llsd/binary?>\n' + _format_binary_recurse(something)
841 864
842def _format_binary_recurse(something): 865def _format_binary_recurse(something):
866 def _format_list(something):
867 array_builder = []
868 array_builder.append('[' + struct.pack('!i', len(something)))
869 for item in something:
870 array_builder.append(_format_binary_recurse(item))
871 array_builder.append(']')
872 return ''.join(array_builder)
873
843 if something is None: 874 if something is None:
844 return '!' 875 return '!'
845 elif isinstance(something, LLSD): 876 elif isinstance(something, LLSD):
@@ -857,7 +888,10 @@ def _format_binary_recurse(something):
857 return 'u' + something._bits 888 return 'u' + something._bits
858 elif isinstance(something, binary): 889 elif isinstance(something, binary):
859 return 'b' + struct.pack('!i', len(something)) + something 890 return 'b' + struct.pack('!i', len(something)) + something
860 elif isinstance(something, (str, unicode)): 891 elif isinstance(something, str):
892 return 's' + struct.pack('!i', len(something)) + something
893 elif isinstance(something, unicode):
894 something = something.encode('utf-8')
861 return 's' + struct.pack('!i', len(something)) + something 895 return 's' + struct.pack('!i', len(something)) + something
862 elif isinstance(something, uri): 896 elif isinstance(something, uri):
863 return 'l' + struct.pack('!i', len(something)) + something 897 return 'l' + struct.pack('!i', len(something)) + something
@@ -865,35 +899,50 @@ def _format_binary_recurse(something):
865 seconds_since_epoch = time.mktime(something.timetuple()) 899 seconds_since_epoch = time.mktime(something.timetuple())
866 return 'd' + struct.pack('!d', seconds_since_epoch) 900 return 'd' + struct.pack('!d', seconds_since_epoch)
867 elif isinstance(something, (list, tuple)): 901 elif isinstance(something, (list, tuple)):
868 array_builder = [] 902 return _format_list(something)
869 array_builder.append('[' + struct.pack('!i', len(something)))
870 for item in something:
871 array_builder.append(_format_binary_recurse(item))
872 array_builder.append(']')
873 return ''.join(array_builder)
874 elif isinstance(something, dict): 903 elif isinstance(something, dict):
875 map_builder = [] 904 map_builder = []
876 map_builder.append('{' + struct.pack('!i', len(something))) 905 map_builder.append('{' + struct.pack('!i', len(something)))
877 for key, value in something.items(): 906 for key, value in something.items():
907 if isinstance(key, unicode):
908 key = key.encode('utf-8')
878 map_builder.append('k' + struct.pack('!i', len(key)) + key) 909 map_builder.append('k' + struct.pack('!i', len(key)) + key)
879 map_builder.append(_format_binary_recurse(value)) 910 map_builder.append(_format_binary_recurse(value))
880 map_builder.append('}') 911 map_builder.append('}')
881 return ''.join(map_builder) 912 return ''.join(map_builder)
882 else: 913 else:
883 raise LLSDSerializationError("Cannot serialize unknown type: %s (%s)" % ( 914 try:
884 type(something), something)) 915 return _format_list(list(something))
916 except TypeError:
917 raise LLSDSerializationError(
918 "Cannot serialize unknown type: %s (%s)" %
919 (type(something), something))
920
921
922def parse_binary(something):
923 header = '<?llsd/binary?>\n'
924 if not something.startswith(header):
925 raise LLSDParseError('LLSD binary encoding header not found')
926 return LLSDBinaryParser().parse(something[len(header):])
927
928def parse_xml(something):
929 try:
930 return to_python(fromstring(something)[0])
931 except ElementTreeError, err:
932 raise LLSDParseError(*err.args)
885 933
934def parse_notation(something):
935 return LLSDNotationParser().parse(something)
886 936
887def parse(something): 937def parse(something):
888 try: 938 try:
889 if something.startswith('<?llsd/binary?>'): 939 if something.startswith('<?llsd/binary?>'):
890 just_binary = something.split('\n', 1)[1] 940 return parse_binary(something)
891 return LLSDBinaryParser().parse(just_binary)
892 # This should be better. 941 # This should be better.
893 elif something.startswith('<'): 942 elif something.startswith('<'):
894 return to_python(fromstring(something)[0]) 943 return parse_xml(something)
895 else: 944 else:
896 return LLSDNotationParser().parse(something) 945 return parse_notation(something)
897 except KeyError, e: 946 except KeyError, e:
898 raise Exception('LLSD could not be parsed: %s' % (e,)) 947 raise Exception('LLSD could not be parsed: %s' % (e,))
899 948
@@ -913,6 +962,9 @@ class LLSD(object):
913 962
914undef = LLSD(None) 963undef = LLSD(None)
915 964
965XML_MIME_TYPE = 'application/llsd+xml'
966BINARY_MIME_TYPE = 'application/llsd+binary'
967
916# register converters for llsd in mulib, if it is available 968# register converters for llsd in mulib, if it is available
917try: 969try:
918 from mulib import stacked, mu 970 from mulib import stacked, mu
@@ -922,7 +974,7 @@ except:
922 # mulib not available, don't print an error message since this is normal 974 # mulib not available, don't print an error message since this is normal
923 pass 975 pass
924else: 976else:
925 mu.add_parser(parse, 'application/llsd+xml') 977 mu.add_parser(parse, XML_MIME_TYPE)
926 mu.add_parser(parse, 'application/llsd+binary') 978 mu.add_parser(parse, 'application/llsd+binary')
927 979
928 def llsd_convert_xml(llsd_stuff, request): 980 def llsd_convert_xml(llsd_stuff, request):
@@ -931,11 +983,58 @@ else:
931 def llsd_convert_binary(llsd_stuff, request): 983 def llsd_convert_binary(llsd_stuff, request):
932 request.write(format_binary(llsd_stuff)) 984 request.write(format_binary(llsd_stuff))
933 985
934 for typ in [LLSD, dict, list, tuple, str, int, float, bool, unicode, type(None)]: 986 for typ in [LLSD, dict, list, tuple, str, int, long, float, bool, unicode, type(None)]:
935 stacked.add_producer(typ, llsd_convert_xml, 'application/llsd+xml') 987 stacked.add_producer(typ, llsd_convert_xml, XML_MIME_TYPE)
936 stacked.add_producer(typ, llsd_convert_xml, 'application/xml') 988 stacked.add_producer(typ, llsd_convert_xml, 'application/xml')
937 stacked.add_producer(typ, llsd_convert_xml, 'text/xml') 989 stacked.add_producer(typ, llsd_convert_xml, 'text/xml')
938 990
939 stacked.add_producer(typ, llsd_convert_binary, 'application/llsd+binary') 991 stacked.add_producer(typ, llsd_convert_binary, 'application/llsd+binary')
940 992
941 stacked.add_producer(LLSD, llsd_convert_xml, '*/*') 993 stacked.add_producer(LLSD, llsd_convert_xml, '*/*')
994
995 # in case someone is using the legacy mu.xml wrapper, we need to
996 # tell mu to produce application/xml or application/llsd+xml
997 # (based on the accept header) from raw xml. Phoenix 2008-07-21
998 stacked.add_producer(mu.xml, mu.produce_raw, XML_MIME_TYPE)
999 stacked.add_producer(mu.xml, mu.produce_raw, 'application/xml')
1000
1001
1002
1003# mulib wsgi stuff
1004# try:
1005# from mulib import mu, adapters
1006#
1007# # try some known attributes from mulib to be ultra-sure we've imported it
1008# mu.get_current
1009# adapters.handlers
1010# except:
1011# # mulib not available, don't print an error message since this is normal
1012# pass
1013# else:
1014# def llsd_xml_handler(content_type):
1015# def handle_llsd_xml(env, start_response):
1016# llsd_stuff, _ = mu.get_current(env)
1017# result = format_xml(llsd_stuff)
1018# start_response("200 OK", [('Content-Type', content_type)])
1019# env['mu.negotiated_type'] = content_type
1020# yield result
1021# return handle_llsd_xml
1022#
1023# def llsd_binary_handler(content_type):
1024# def handle_llsd_binary(env, start_response):
1025# llsd_stuff, _ = mu.get_current(env)
1026# result = format_binary(llsd_stuff)
1027# start_response("200 OK", [('Content-Type', content_type)])
1028# env['mu.negotiated_type'] = content_type
1029# yield result
1030# return handle_llsd_binary
1031#
1032# adapters.DEFAULT_PARSERS[XML_MIME_TYPE] = parse
1033
1034# for typ in [LLSD, dict, list, tuple, str, int, float, bool, unicode, type(None)]:
1035# for content_type in (XML_MIME_TYPE, 'application/xml'):
1036# adapters.handlers.set_handler(typ, llsd_xml_handler(content_type), content_type)
1037#
1038# adapters.handlers.set_handler(typ, llsd_binary_handler(BINARY_MIME_TYPE), BINARY_MIME_TYPE)
1039#
1040# adapters.handlers.set_handler(LLSD, llsd_xml_handler(XML_MIME_TYPE), '*/*')
diff --git a/linden/indra/lib/python/indra/ipc/llmessage.py b/linden/indra/lib/python/indra/ipc/llmessage.py
index 446679d..c2f3fd4 100644
--- a/linden/indra/lib/python/indra/ipc/llmessage.py
+++ b/linden/indra/lib/python/indra/ipc/llmessage.py
@@ -88,7 +88,7 @@ class Message:
88 UDPDEPRECATED = "UDPDeprecated" 88 UDPDEPRECATED = "UDPDeprecated"
89 UDPBLACKLISTED = "UDPBlackListed" 89 UDPBLACKLISTED = "UDPBlackListed"
90 deprecations = [ NOTDEPRECATED, UDPDEPRECATED, UDPBLACKLISTED, DEPRECATED ] 90 deprecations = [ NOTDEPRECATED, UDPDEPRECATED, UDPBLACKLISTED, DEPRECATED ]
91 # in order of increasing deprecation 91 # in order of increasing deprecation
92 92
93 def __init__(self, name, number, priority, trust, coding): 93 def __init__(self, name, number, priority, trust, coding):
94 self.name = name 94 self.name = name
diff --git a/linden/indra/lib/python/indra/ipc/llsdhttp.py b/linden/indra/lib/python/indra/ipc/llsdhttp.py
index 1cf1146..ed64899 100644
--- a/linden/indra/lib/python/indra/ipc/llsdhttp.py
+++ b/linden/indra/lib/python/indra/ipc/llsdhttp.py
@@ -51,6 +51,8 @@ request_ = suite.request_
51# import every httpc error exception into our namespace for convenience 51# import every httpc error exception into our namespace for convenience
52for x in httpc.status_to_error_map.itervalues(): 52for x in httpc.status_to_error_map.itervalues():
53 globals()[x.__name__] = x 53 globals()[x.__name__] = x
54ConnectionError = httpc.ConnectionError
55Retriable = httpc.Retriable
54 56
55for x in (httpc.ConnectionError,): 57for x in (httpc.ConnectionError,):
56 globals()[x.__name__] = x 58 globals()[x.__name__] = x
diff --git a/linden/indra/lib/python/indra/ipc/mysql_pool.py b/linden/indra/lib/python/indra/ipc/mysql_pool.py
index 507b185..25a66cf 100644
--- a/linden/indra/lib/python/indra/ipc/mysql_pool.py
+++ b/linden/indra/lib/python/indra/ipc/mysql_pool.py
@@ -30,8 +30,10 @@ import MySQLdb
30from eventlet import db_pool 30from eventlet import db_pool
31 31
32class DatabaseConnector(db_pool.DatabaseConnector): 32class DatabaseConnector(db_pool.DatabaseConnector):
33 def __init__(self, credentials, min_size = 0, max_size = 4, *args, **kwargs): 33 def __init__(self, credentials, *args, **kwargs):
34 super(DatabaseConnector, self).__init__(MySQLdb, credentials, min_size, max_size, conn_pool=db_pool.ConnectionPool, *args, **kwargs) 34 super(DatabaseConnector, self).__init__(MySQLdb, credentials,
35 conn_pool=db_pool.ConnectionPool,
36 *args, **kwargs)
35 37
36 # get is extended relative to eventlet.db_pool to accept a port argument 38 # get is extended relative to eventlet.db_pool to accept a port argument
37 def get(self, host, dbname, port=3306): 39 def get(self, host, dbname, port=3306):
@@ -42,7 +44,7 @@ class DatabaseConnector(db_pool.DatabaseConnector):
42 new_kwargs['host'] = host 44 new_kwargs['host'] = host
43 new_kwargs['port'] = port 45 new_kwargs['port'] = port
44 new_kwargs.update(self.credentials_for(host)) 46 new_kwargs.update(self.credentials_for(host))
45 dbpool = ConnectionPool(self._min_size, self._max_size, *self._args, **new_kwargs) 47 dbpool = ConnectionPool(*self._args, **new_kwargs)
46 self._databases[key] = dbpool 48 self._databases[key] = dbpool
47 49
48 return self._databases[key] 50 return self._databases[key]
@@ -51,8 +53,8 @@ class ConnectionPool(db_pool.TpooledConnectionPool):
51 """A pool which gives out saranwrapped MySQLdb connections from a pool 53 """A pool which gives out saranwrapped MySQLdb connections from a pool
52 """ 54 """
53 55
54 def __init__(self, min_size = 0, max_size = 4, *args, **kwargs): 56 def __init__(self, *args, **kwargs):
55 super(ConnectionPool, self).__init__(MySQLdb, min_size, max_size, *args, **kwargs) 57 super(ConnectionPool, self).__init__(MySQLdb, *args, **kwargs)
56 58
57 def get(self): 59 def get(self):
58 conn = super(ConnectionPool, self).get() 60 conn = super(ConnectionPool, self).get()
@@ -77,14 +79,3 @@ class ConnectionPool(db_pool.TpooledConnectionPool):
77 conn.connection_parameters = converted_kwargs 79 conn.connection_parameters = converted_kwargs
78 return conn 80 return conn
79 81
80 def clear(self):
81 """ Close all connections that this pool still holds a reference to, leaving it empty."""
82 for conn in self.free_items:
83 try:
84 conn.close()
85 except:
86 pass # even if stuff happens here, we still want to at least try to close all the other connections
87 self.free_items.clear()
88
89 def __del__(self):
90 self.clear()
diff --git a/linden/indra/lib/python/indra/ipc/saranwrap.py b/linden/indra/lib/python/indra/ipc/saranwrap.py
deleted file mode 100644
index e0205bf..0000000
--- a/linden/indra/lib/python/indra/ipc/saranwrap.py
+++ /dev/null
@@ -1,651 +0,0 @@
1"""\
2@file saranwrap.py
3@author Phoenix
4@date 2007-07-13
5@brief A simple, pickle based rpc mechanism which reflects python
6objects and callables.
7
8$LicenseInfo:firstyear=2007&license=mit$
9
10Copyright (c) 2007-2008, Linden Research, Inc.
11
12Permission is hereby granted, free of charge, to any person obtaining a copy
13of this software and associated documentation files (the "Software"), to deal
14in the Software without restriction, including without limitation the rights
15to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
16copies of the Software, and to permit persons to whom the Software is
17furnished to do so, subject to the following conditions:
18
19The above copyright notice and this permission notice shall be included in
20all copies or substantial portions of the Software.
21
22THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
23IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
24FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
25AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
26LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
27OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
28THE SOFTWARE.
29$/LicenseInfo$
30
31This file provides classes and exceptions used for simple python level
32remote procedure calls. This is achieved by intercepting the basic
33getattr and setattr calls in a client proxy, which commnicates those
34down to the server which will dispatch them to objects in it's process
35space.
36
37The basic protocol to get and set attributes is for the client proxy
38to issue the command:
39
40getattr $id $name
41setattr $id $name $value
42
43getitem $id $item
44setitem $id $item $value
45eq $id $rhs
46del $id
47
48When the get returns a callable, the client proxy will provide a
49callable proxy which will invoke a remote procedure call. The command
50issued from the callable proxy to server is:
51
52call $id $name $args $kwargs
53
54If the client supplies an id of None, then the get/set/call is applied
55to the object(s) exported from the server.
56
57The server will parse the get/set/call, take the action indicated, and
58return back to the caller one of:
59
60value $val
61callable
62object $id
63exception $excp
64
65To handle object expiration, the proxy will instruct the rpc server to
66discard objects which are no longer in use. This is handled by
67catching proxy deletion and sending the command:
68
69del $id
70
71The server will handle this by removing clearing it's own internal
72references. This does not mean that the object will necessarily be
73cleaned from the server, but no artificial references will remain
74after successfully completing. On completion, the server will return
75one of:
76
77value None
78exception $excp
79
80The server also accepts a special command for debugging purposes:
81
82status
83
84Which will be intercepted by the server to write back:
85
86status {...}
87
88The wire protocol is to pickle the Request class in this file. The
89request class is basically an action and a map of parameters'
90"""
91
92import os
93import cPickle
94import struct
95import sys
96
97try:
98 set = set
99 frozenset = frozenset
100except NameError:
101 from sets import Set as set, ImmutableSet as frozenset
102
103from eventlet.processes import Process
104from eventlet import api
105
106#
107# debugging hooks
108#
109_g_debug_mode = False
110if _g_debug_mode:
111 import traceback
112
113def pythonpath_sync():
114 """
115@brief apply the current sys.path to the environment variable PYTHONPATH, so that child processes have the same paths as the caller does.
116"""
117 pypath = os.pathsep.join(sys.path)
118 os.environ['PYTHONPATH'] = pypath
119
120def wrap(obj, dead_callback = None):
121 """
122@brief wrap in object in another process through a saranwrap proxy
123@param object The object to wrap.
124@param dead_callback A callable to invoke if the process exits."""
125
126 if type(obj).__name__ == 'module':
127 return wrap_module(obj.__name__, dead_callback)
128 pythonpath_sync()
129 p = Process('python', [__file__, '--child'], dead_callback)
130 prox = Proxy(p, p)
131 prox.obj = obj
132 return prox.obj
133
134def wrap_module(fqname, dead_callback = None):
135 """
136@brief wrap a module in another process through a saranwrap proxy
137@param fqname The fully qualified name of the module.
138@param dead_callback A callable to invoke if the process exits."""
139 pythonpath_sync()
140 global _g_debug_mode
141 if _g_debug_mode:
142 p = Process('python', [__file__, '--module', fqname, '--logfile', '/tmp/saranwrap.log'], dead_callback)
143 else:
144 p = Process('python', [__file__, '--module', fqname,], dead_callback)
145 prox = Proxy(p, p)
146 return prox
147
148def status(proxy):
149 """
150@brief get the status from the server through a proxy
151@param proxy a saranwrap.Proxy object connected to a server."""
152 _write_request(Request('status', {}), proxy.__local_dict['_out'])
153 return _read_response(None, None, proxy.__local_dict['_in'], proxy.__local_dict['_out'], None)
154
155class BadResponse(Exception):
156 """"This exception is raised by an saranwrap client when it could
157 parse but cannot understand the response from the server."""
158 pass
159
160class BadRequest(Exception):
161 """"This exception is raised by a saranwrap server when it could parse
162 but cannot understand the response from the server."""
163 pass
164
165class UnrecoverableError(Exception):
166 pass
167
168class Request(object):
169 "@brief A wrapper class for proxy requests to the server."
170 def __init__(self, action, param):
171 self._action = action
172 self._param = param
173 def __str__(self):
174 return "Request `"+self._action+"` "+str(self._param)
175 def __getitem__(self, name):
176 return self._param[name]
177 def action(self):
178 return self._action
179
180def _read_lp_hunk(stream):
181 len_bytes = stream.read(4)
182 length = struct.unpack('I', len_bytes)[0]
183 body = stream.read(length)
184 return body
185
186def _read_response(id, attribute, input, output, dead_list):
187 """@brief local helper method to read respones from the rpc server."""
188 try:
189 str = _read_lp_hunk(input)
190 _prnt(`str`)
191 response = cPickle.loads(str)
192 except AttributeError, e:
193 raise UnrecoverableError(e)
194 _prnt("response: %s" % response)
195 if response[0] == 'value':
196 return response[1]
197 elif response[0] == 'callable':
198 return CallableProxy(id, attribute, input, output, dead_list)
199 elif response[0] == 'object':
200 return ObjectProxy(input, output, response[1], dead_list)
201 elif response[0] == 'exception':
202 exp = response[1]
203 raise exp
204 else:
205 raise BadResponse(response[0])
206
207def _write_lp_hunk(stream, hunk):
208 write_length = struct.pack('I', len(hunk))
209 stream.write(write_length + hunk)
210 if hasattr(stream, 'flush'):
211 stream.flush()
212
213def _write_request(param, output):
214 _prnt("request: %s" % param)
215 str = cPickle.dumps(param)
216 _write_lp_hunk(output, str)
217
218def _is_local(attribute):
219 "Return true if the attribute should be handled locally"
220# return attribute in ('_in', '_out', '_id', '__getattribute__', '__setattr__', '__dict__')
221 # good enough for now. :)
222 if '__local_dict' in attribute:
223 return True
224 return False
225
226def _prnt(message):
227 global _g_debug_mode
228 if _g_debug_mode:
229 print message
230
231_g_logfile = None
232def _log(message):
233 global _g_logfile
234 if _g_logfile:
235 _g_logfile.write(str(os.getpid()) + ' ' + message)
236 _g_logfile.write('\n')
237 _g_logfile.flush()
238
239def _unmunge_attr_name(name):
240 """ Sometimes attribute names come in with classname prepended, not sure why.
241 This function removes said classname, because we're huge hackers and we didn't
242 find out what the true right thing to do is. *FIX: find out. """
243 if(name.startswith('_Proxy')):
244 name = name[len('_Proxy'):]
245 if(name.startswith('_ObjectProxy')):
246 name = name[len('_ObjectProxy'):]
247 return name
248
249
250class Proxy(object):
251 """\
252@class Proxy
253@brief This class wraps a remote python process, presumably available
254in an instance of an Server.
255
256This is the class you will typically use as a client to a child
257process. Simply instantiate one around a file-like interface and start
258calling methods on the thing that is exported. The dir() builtin is
259not supported, so you have to know what has been exported.
260"""
261 def __init__(self, input, output, dead_list = None):
262 """\
263@param input a file-like object which supports read().
264@param output a file-like object which supports write() and flush().
265@param id an identifier for the remote object. humans do not provide this.
266"""
267 # default dead_list inside the function because all objects in method
268 # argument lists are init-ed only once globally
269 if dead_list is None:
270 dead_list = set()
271 #_prnt("Proxy::__init__")
272 self.__local_dict = dict(
273 _in = input,
274 _out = output,
275 _dead_list = dead_list,
276 _id = None)
277
278 def __getattribute__(self, attribute):
279 #_prnt("Proxy::__getattr__: %s" % attribute)
280 if _is_local(attribute):
281 # call base class getattribute so we actually get the local variable
282 attribute = _unmunge_attr_name(attribute)
283 return super(Proxy, self).__getattribute__(attribute)
284 else:
285 my_in = self.__local_dict['_in']
286 my_out = self.__local_dict['_out']
287 my_id = self.__local_dict['_id']
288
289 _dead_list = self.__local_dict['_dead_list']
290 for dead_object in _dead_list.copy():
291 request = Request('del', {'id':dead_object})
292 _write_request(request, my_out)
293 response = _read_response(my_id, attribute, my_in, my_out, _dead_list)
294 _dead_list.remove(dead_object)
295
296 # Pass all public attributes across to find out if it is
297 # callable or a simple attribute.
298 request = Request('getattr', {'id':my_id, 'attribute':attribute})
299 _write_request(request, my_out)
300 return _read_response(my_id, attribute, my_in, my_out, _dead_list)
301
302 def __setattr__(self, attribute, value):
303 #_prnt("Proxy::__setattr__: %s" % attribute)
304 if _is_local(attribute):
305 # It must be local to this actual object, so we have to apply
306 # it to the dict in a roundabout way
307 attribute = _unmunge_attr_name(attribute)
308 super(Proxy, self).__getattribute__('__dict__')[attribute]=value
309 else:
310 my_in = self.__local_dict['_in']
311 my_out = self.__local_dict['_out']
312 my_id = self.__local_dict['_id']
313 _dead_list = self.__local_dict['_dead_list']
314 # Pass the set attribute across
315 request = Request('setattr', {'id':my_id, 'attribute':attribute, 'value':value})
316 _write_request(request, my_out)
317 return _read_response(my_id, attribute, my_in, my_out, _dead_list)
318
319class ObjectProxy(Proxy):
320 """\
321@class ObjectProxy
322@brief This class wraps a remote object in the Server
323
324This class will be created during normal operation, and users should
325not need to deal with this class directly."""
326
327 def __init__(self, input, output, id, dead_list):
328 """\
329@param input a file-like object which supports read().
330@param output a file-like object which supports write() and flush().
331@param id an identifier for the remote object. humans do not provide this.
332"""
333 Proxy.__init__(self, input, output, dead_list)
334 self.__local_dict['_id'] = id
335 #_prnt("ObjectProxy::__init__ %s" % self._id)
336
337 def __del__(self):
338 my_id = self.__local_dict['_id']
339 _prnt("ObjectProxy::__del__ %s" % my_id)
340 self.__local_dict['_dead_list'].add(my_id)
341
342 def __getitem__(self, key):
343 my_in = self.__local_dict['_in']
344 my_out = self.__local_dict['_out']
345 my_id = self.__local_dict['_id']
346 _dead_list = self.__local_dict['_dead_list']
347 request = Request('getitem', {'id':my_id, 'key':key})
348 _write_request(request, my_out)
349 return _read_response(my_id, key, my_in, my_out, _dead_list)
350
351 def __setitem__(self, key, value):
352 my_in = self.__local_dict['_in']
353 my_out = self.__local_dict['_out']
354 my_id = self.__local_dict['_id']
355 _dead_list = self.__local_dict['_dead_list']
356 request = Request('setitem', {'id':my_id, 'key':key, 'value':value})
357 _write_request(request, my_out)
358 return _read_response(my_id, key, my_in, my_out, _dead_list)
359
360 def __eq__(self, rhs):
361 my_in = self.__local_dict['_in']
362 my_out = self.__local_dict['_out']
363 my_id = self.__local_dict['_id']
364 _dead_list = self.__local_dict['_dead_list']
365 request = Request('eq', {'id':my_id, 'rhs':rhs.__local_dict['_id']})
366 _write_request(request, my_out)
367 return _read_response(my_id, None, my_in, my_out, _dead_list)
368
369 def __repr__(self):
370 # apparently repr(obj) skips the whole getattribute thing and just calls __repr__
371 # directly. Therefore we just pass it through the normal call pipeline, and
372 # tack on a little header so that you can tell it's an object proxy.
373 val = self.__repr__()
374 return "saran:%s" % val
375
376 def __str__(self):
377 # see description for __repr__, because str(obj) works the same. We don't
378 # tack anything on to the return value here because str values are used as data.
379 return self.__str__()
380
381 def __len__(self):
382 # see description for __repr__, len(obj) is the same. Unfortunately, __len__ is also
383 # used when determining whether an object is boolean or not, e.g. if proxied_object:
384 return self.__len__()
385
386def proxied_type(self):
387 if type(self) is not ObjectProxy:
388 return type(self)
389
390 my_in = self.__local_dict['_in']
391 my_out = self.__local_dict['_out']
392 my_id = self.__local_dict['_id']
393 request = Request('type', {'id':my_id})
394 _write_request(request, my_out)
395 # dead list can be none because we know the result will always be
396 # a value and not an ObjectProxy itself
397 return _read_response(my_id, None, my_in, my_out, None)
398
399class CallableProxy(object):
400 """\
401@class CallableProxy
402@brief This class wraps a remote function in the Server
403
404This class will be created by an Proxy during normal operation,
405and users should not need to deal with this class directly."""
406
407 def __init__(self, object_id, name, input, output, dead_list):
408 #_prnt("CallableProxy::__init__: %s, %s" % (object_id, name))
409 self._object_id = object_id
410 self._name = name
411 self._in = input
412 self._out = output
413 self._dead_list = dead_list
414
415 def __call__(self, *args, **kwargs):
416 #_prnt("CallableProxy::__call__: %s, %s" % (args, kwargs))
417
418 # Pass the call across. We never build a callable without
419 # having already checked if the method starts with '_' so we
420 # can safely pass this one to the remote object.
421 #_prnt("calling %s %s" % (self._object_id, self._name)
422 request = Request('call', {'id':self._object_id, 'name':self._name, 'args':args, 'kwargs':kwargs})
423 _write_request(request, self._out)
424 return _read_response(self._object_id, self._name, self._in, self._out, self._dead_list)
425
426class Server(object):
427 def __init__(self, input, output, export):
428 """\
429@param input a file-like object which supports read().
430@param output a file-like object which supports write() and flush().
431@param export an object, function, or map which is exported to clients
432when the id is None."""
433 #_log("Server::__init__")
434 self._in = input
435 self._out = output
436 self._export = export
437 self._next_id = 1
438 self._objects = {}
439
440 def handle_status(self, object, req):
441 return {
442 'object_count':len(self._objects),
443 'next_id':self._next_id,
444 'pid':os.getpid()}
445
446 def handle_getattr(self, object, req):
447 try:
448 return getattr(object, req['attribute'])
449 except AttributeError, e:
450 if hasattr(object, "__getitem__"):
451 return object[req['attribute']]
452 else:
453 raise e
454 #_log('getattr: %s' % str(response))
455
456 def handle_setattr(self, object, req):
457 try:
458 return setattr(object, req['attribute'], req['value'])
459 except AttributeError, e:
460 if hasattr(object, "__setitem__"):
461 return object.__setitem__(req['attribute'], req['value'])
462 else:
463 raise e
464
465 def handle_getitem(self, object, req):
466 return object[req['key']]
467
468 def handle_setitem(self, object, req):
469 object[req['key']] = req['value']
470 return None # *TODO figure out what the actual return value of __setitem__ should be
471
472 def handle_eq(self, object, req):
473 #_log("__eq__ %s %s" % (object, req))
474 rhs = None
475 try:
476 rhs = self._objects[req['rhs']]
477 except KeyError, e:
478 return False
479 return (object == rhs)
480
481 def handle_call(self, object, req):
482 #_log("calling %s " % (req['name']))
483 try:
484 fn = getattr(object, req['name'])
485 except AttributeError, e:
486 if hasattr(object, "__setitem__"):
487 fn = object[req['name']]
488 else:
489 raise e
490
491 return fn(*req['args'],**req['kwargs'])
492
493 def handle_del(self, object, req):
494 id = req['id']
495 _log("del %s from %s" % (id, self._objects))
496
497 # *TODO what does __del__ actually return?
498 del self._objects[id]
499 return None
500
501 def handle_type(self, object, req):
502 return type(object)
503
504 def loop(self):
505 """@brief Loop forever and respond to all requests."""
506 _log("Server::loop")
507 while True:
508 try:
509 try:
510 str = _read_lp_hunk(self._in)
511 except EOFError:
512 sys.exit(0) # normal exit
513 request = cPickle.loads(str)
514 _log("request: %s (%s)" % (request, self._objects))
515 req = request
516 id = None
517 object = None
518 try:
519 id = req['id']
520 if id:
521 id = int(id)
522 object = self._objects[id]
523 #_log("id, object: %d %s" % (id, object))
524 except Exception, e:
525 #_log("Exception %s" % str(e))
526 pass
527 if object is None or id is None:
528 id = None
529 object = self._export
530 #_log("found object %s" % str(object))
531
532 # Handle the request via a method with a special name on the server
533 handler_name = 'handle_%s' % request.action()
534
535 try:
536 handler = getattr(self, handler_name)
537 except AttributeError:
538 raise BadRequest, request.action()
539
540 response = handler(object, request)
541
542 # figure out what to do with the response, and respond
543 # apprpriately.
544 if request.action() in ['status', 'type']:
545 # have to handle these specially since we want to
546 # pickle up the actual value and not return a proxy
547 self.respond(['value', response])
548 elif callable(response):
549 #_log("callable %s" % response)
550 self.respond(['callable'])
551 elif self.is_value(response):
552 self.respond(['value', response])
553 else:
554 self._objects[self._next_id] = response
555 #_log("objects: %s" % str(self._objects))
556 self.respond(['object', self._next_id])
557 self._next_id += 1
558 except SystemExit, e:
559 raise e
560 except Exception, e:
561 self.write_exception(e)
562 except:
563 self.write_exception(sys.exc_info()[0])
564
565 def is_value(self, value):
566 """\
567@brief Test if value should be serialized as a simple dataset.
568@param value The value to test.
569@return Returns true if value is a simple serializeable set of data.
570"""
571 return type(value) in (str,unicode,int,float,long,bool,type(None))
572
573 def respond(self, body):
574 _log("responding with: %s" % body)
575 #_log("objects: %s" % self._objects)
576 s = cPickle.dumps(body)
577 _log(`s`)
578 str = _write_lp_hunk(self._out, s)
579
580 def write_exception(self, e):
581 """@brief Helper method to respond with an exception."""
582 #_log("exception: %s" % sys.exc_info()[0])
583 # TODO: serialize traceback using generalization of code from mulib.htmlexception
584 self.respond(['exception', e])
585 global _g_debug_mode
586 if _g_debug_mode:
587 _log("traceback: %s" % traceback.format_tb(sys.exc_info()[2]))
588
589
590# test function used for testing that final except clause
591def raise_a_weird_error():
592 raise "oh noes you can raise a string"
593
594# test function used for testing return of unpicklable exceptions
595def raise_an_unpicklable_error():
596 class Unpicklable(Exception):
597 pass
598 raise Unpicklable()
599
600# test function used for testing return of picklable exceptions
601def raise_standard_error():
602 raise FloatingPointError()
603
604# test function to make sure print doesn't break the wrapper
605def print_string(str):
606 print str
607
608# test function to make sure printing on stdout doesn't break the
609# wrapper
610def err_string(str):
611 print >>sys.stderr, str
612
613def main():
614 import optparse
615 parser = optparse.OptionParser(
616 usage="usage: %prog [options]",
617 description="Simple saranwrap.Server wrapper")
618 parser.add_option(
619 '-c', '--child', default=False, action='store_true',
620 help='Wrap an object serialed via setattr.')
621 parser.add_option(
622 '-m', '--module', type='string', dest='module', default=None,
623 help='a module to load and export.')
624 parser.add_option(
625 '-l', '--logfile', type='string', dest='logfile', default=None,
626 help='file to log to.')
627 options, args = parser.parse_args()
628 global _g_logfile
629 if options.logfile:
630 _g_logfile = open(options.logfile, 'a')
631 if options.module:
632 export = api.named(options.module)
633 server = Server(sys.stdin, sys.stdout, export)
634 elif options.child:
635 server = Server(sys.stdin, sys.stdout, {})
636
637 # *HACK: some modules may emit on stderr, which breaks everything.
638 class NullSTDOut(object):
639 def write(a, b):
640 pass
641 sys.stderr = NullSTDOut()
642 sys.stdout = NullSTDOut()
643
644 # Loop until EOF
645 server.loop()
646 if _g_logfile:
647 _g_logfile.close()
648
649
650if __name__ == "__main__":
651 main()
diff --git a/linden/indra/lib/python/indra/ipc/siesta.py b/linden/indra/lib/python/indra/ipc/siesta.py
index 5fbea29..b206f18 100644
--- a/linden/indra/lib/python/indra/ipc/siesta.py
+++ b/linden/indra/lib/python/indra/ipc/siesta.py
@@ -24,9 +24,9 @@ except ImportError:
24 24
25llsd_parsers = { 25llsd_parsers = {
26 'application/json': json_decode, 26 'application/json': json_decode,
27 'application/llsd+binary': llsd.parse_binary, 27 llsd.BINARY_MIME_TYPE: llsd.parse_binary,
28 'application/llsd+notation': llsd.parse_notation, 28 'application/llsd+notation': llsd.parse_notation,
29 'application/llsd+xml': llsd.parse_xml, 29 llsd.XML_MIME_TYPE: llsd.parse_xml,
30 'application/xml': llsd.parse_xml, 30 'application/xml': llsd.parse_xml,
31 } 31 }
32 32
diff --git a/linden/indra/lib/python/indra/util/fastest_elementtree.py b/linden/indra/lib/python/indra/util/fastest_elementtree.py
index 64aed09..2470143 100644
--- a/linden/indra/lib/python/indra/util/fastest_elementtree.py
+++ b/linden/indra/lib/python/indra/util/fastest_elementtree.py
@@ -2,9 +2,9 @@
2@file fastest_elementtree.py 2@file fastest_elementtree.py
3@brief Concealing some gnarly import logic in here. This should export the interface of elementtree. 3@brief Concealing some gnarly import logic in here. This should export the interface of elementtree.
4 4
5$LicenseInfo:firstyear=2006&license=mit$ 5$LicenseInfo:firstyear=2008&license=mit$
6 6
7Copyright (c) 2006-2008, Linden Research, Inc. 7Copyright (c) 2008, Linden Research, Inc.
8 8
9Permission is hereby granted, free of charge, to any person obtaining a copy 9Permission is hereby granted, free of charge, to any person obtaining a copy
10of this software and associated documentation files (the "Software"), to deal 10of this software and associated documentation files (the "Software"), to deal
@@ -26,27 +26,40 @@ THE SOFTWARE.
26$/LicenseInfo$ 26$/LicenseInfo$
27""" 27"""
28 28
29# Using celementree might cause some unforeseen problems so here's a 29# The parsing exception raised by the underlying library depends
30# on the ElementTree implementation we're using, so we provide an
31# alias here.
32#
33# Use ElementTreeError as the exception type for catching parsing
34# errors.
35
36
37# Using cElementTree might cause some unforeseen problems, so here's a
30# convenient off switch. 38# convenient off switch.
31 39
32# *NOTE: turned off cause of problems. :-( *TODO: debug 40use_celementree = True
33use_celementree = False
34 41
35try: 42try:
36 if not use_celementree: 43 if not use_celementree:
37 raise ImportError() 44 raise ImportError()
38 from cElementTree import * ## This does not work under Windows 45 # Python 2.3 and 2.4.
46 from cElementTree import *
47 ElementTreeError = SyntaxError
39except ImportError: 48except ImportError:
40 try: 49 try:
41 if not use_celementree: 50 if not use_celementree:
42 raise ImportError() 51 raise ImportError()
43 ## This is the name of cElementTree under python 2.5 52 # Python 2.5 and above.
44 from xml.etree.cElementTree import * 53 from xml.etree.cElementTree import *
54 ElementTreeError = SyntaxError
45 except ImportError: 55 except ImportError:
56 # Pure Python code.
46 try: 57 try:
47 ## This is the old name of elementtree, for use with 2.3 58 # Python 2.3 and 2.4.
48 from elementtree.ElementTree import * 59 from elementtree.ElementTree import *
49 except ImportError: 60 except ImportError:
50 ## This is the name of elementtree under python 2.5 61 # Python 2.5 and above.
51 from xml.etree.ElementTree import * 62 from xml.etree.ElementTree import *
52 63
64 # The pure Python ElementTree module uses Expat for parsing.
65 from xml.parsers.expat import ExpatError as ElementTreeError
diff --git a/linden/indra/lib/python/indra/util/iterators.py b/linden/indra/lib/python/indra/util/iterators.py
new file mode 100644
index 0000000..6a98c97
--- /dev/null
+++ b/linden/indra/lib/python/indra/util/iterators.py
@@ -0,0 +1,63 @@
1"""\
2@file iterators.py
3@brief Useful general-purpose iterators.
4
5$LicenseInfo:firstyear=2008&license=mit$
6
7Copyright (c) 2008, Linden Research, Inc.
8
9Permission is hereby granted, free of charge, to any person obtaining a copy
10of this software and associated documentation files (the "Software"), to deal
11in the Software without restriction, including without limitation the rights
12to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
13copies of the Software, and to permit persons to whom the Software is
14furnished to do so, subject to the following conditions:
15
16The above copyright notice and this permission notice shall be included in
17all copies or substantial portions of the Software.
18
19THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
22AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
24OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
25THE SOFTWARE.
26$/LicenseInfo$
27"""
28
29from __future__ import nested_scopes
30
31def iter_chunks(rows, aggregate_size=100):
32 """
33 Given an iterable set of items (@p rows), produces lists of up to @p
34 aggregate_size items at a time, for example:
35
36 iter_chunks([1,2,3,4,5,6,7,8,9,10], 3)
37
38 Values for @p aggregate_size < 1 will raise ValueError.
39
40 Will return a generator that produces, in the following order:
41 - [1, 2, 3]
42 - [4, 5, 6]
43 - [7, 8, 9]
44 - [10]
45 """
46 if aggregate_size < 1:
47 raise ValueError()
48
49 def iter_chunks_inner():
50 row_iter = iter(rows)
51 done = False
52 agg = []
53 while not done:
54 try:
55 row = row_iter.next()
56 agg.append(row)
57 except StopIteration:
58 done = True
59 if agg and (len(agg) >= aggregate_size or done):
60 yield agg
61 agg = []
62
63 return iter_chunks_inner()
diff --git a/linden/indra/lib/python/indra/util/iterators_test.py b/linden/indra/lib/python/indra/util/iterators_test.py
new file mode 100755
index 0000000..7fd9e73
--- /dev/null
+++ b/linden/indra/lib/python/indra/util/iterators_test.py
@@ -0,0 +1,72 @@
1"""\
2@file iterators_test.py
3@brief Test cases for iterators module.
4
5$LicenseInfo:firstyear=2008&license=mit$
6
7Copyright (c) 2008, Linden Research, Inc.
8
9Permission is hereby granted, free of charge, to any person obtaining a copy
10of this software and associated documentation files (the "Software"), to deal
11in the Software without restriction, including without limitation the rights
12to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
13copies of the Software, and to permit persons to whom the Software is
14furnished to do so, subject to the following conditions:
15
16The above copyright notice and this permission notice shall be included in
17all copies or substantial portions of the Software.
18
19THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
22AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
24OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
25THE SOFTWARE.
26$/LicenseInfo$
27"""
28
29import unittest
30
31from indra.util.iterators import iter_chunks
32
33class TestIterChunks(unittest.TestCase):
34 """Unittests for iter_chunks"""
35 def test_bad_agg_size(self):
36 rows = [1,2,3,4]
37 self.assertRaises(ValueError, iter_chunks, rows, 0)
38 self.assertRaises(ValueError, iter_chunks, rows, -1)
39
40 try:
41 for i in iter_chunks(rows, 0):
42 pass
43 except ValueError:
44 pass
45 else:
46 self.fail()
47
48 try:
49 result = list(iter_chunks(rows, 0))
50 except ValueError:
51 pass
52 else:
53 self.fail()
54 def test_empty(self):
55 rows = []
56 result = list(iter_chunks(rows))
57 self.assertEqual(result, [])
58 def test_small(self):
59 rows = [[1]]
60 result = list(iter_chunks(rows, 2))
61 self.assertEqual(result, [[[1]]])
62 def test_size(self):
63 rows = [[1],[2]]
64 result = list(iter_chunks(rows, 2))
65 self.assertEqual(result, [[[1],[2]]])
66 def test_multi_agg(self):
67 rows = [[1],[2],[3],[4],[5]]
68 result = list(iter_chunks(rows, 2))
69 self.assertEqual(result, [[[1],[2]],[[3],[4]],[[5]]])
70
71if __name__ == "__main__":
72 unittest.main()
diff --git a/linden/indra/lib/python/indra/util/llmanifest.py b/linden/indra/lib/python/indra/util/llmanifest.py
index 4675177..a00d242 100644
--- a/linden/indra/lib/python/indra/util/llmanifest.py
+++ b/linden/indra/lib/python/indra/util/llmanifest.py
@@ -584,7 +584,7 @@ class LLManifest(object):
584 584
585 def wildcard_regex(self, src_glob, dst_glob): 585 def wildcard_regex(self, src_glob, dst_glob):
586 src_re = re.escape(src_glob) 586 src_re = re.escape(src_glob)
587 src_re = src_re.replace('\*', '([-a-zA-Z0-9._ ]+)') 587 src_re = src_re.replace('\*', '([-a-zA-Z0-9._ ]*)')
588 dst_temp = dst_glob 588 dst_temp = dst_glob
589 i = 1 589 i = 1
590 while dst_temp.count("*") > 0: 590 while dst_temp.count("*") > 0:
@@ -621,6 +621,7 @@ class LLManifest(object):
621 count = 0 621 count = 0
622 if self.wildcard_pattern.search(src): 622 if self.wildcard_pattern.search(src):
623 for s,d in self.expand_globs(src, dst): 623 for s,d in self.expand_globs(src, dst):
624 assert(s != d)
624 count += self.process_file(s, d) 625 count += self.process_file(s, d)
625 else: 626 else:
626 # if we're specifying a single path (not a glob), 627 # if we're specifying a single path (not a glob),
diff --git a/linden/indra/lib/python/indra/util/llperformance.py b/linden/indra/lib/python/indra/util/llperformance.py
new file mode 100755
index 0000000..7c52730
--- /dev/null
+++ b/linden/indra/lib/python/indra/util/llperformance.py
@@ -0,0 +1,158 @@
1#!/usr/bin/python
2
3# ------------------------------------------------
4# Sim metrics utility functions.
5
6import glob, os, time, sys, stat, exceptions
7
8from indra.base import llsd
9
10gBlockMap = {} #Map of performance metric data with function hierarchy information.
11gCurrentStatPath = ""
12
13gIsLoggingEnabled=False
14
15class LLPerfStat:
16 def __init__(self,key):
17 self.mTotalTime = 0
18 self.mNumRuns = 0
19 self.mName=key
20 self.mTimeStamp = int(time.time()*1000)
21 self.mUTCTime = time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime())
22
23 def __str__(self):
24 return "%f" % self.mTotalTime
25
26 def start(self):
27 self.mStartTime = int(time.time() * 1000000)
28 self.mNumRuns += 1
29
30 def stop(self):
31 execution_time = int(time.time() * 1000000) - self.mStartTime
32 self.mTotalTime += execution_time
33
34 def get_map(self):
35 results={}
36 results['name']=self.mName
37 results['utc_time']=self.mUTCTime
38 results['timestamp']=self.mTimeStamp
39 results['us']=self.mTotalTime
40 results['count']=self.mNumRuns
41 return results
42
43class PerfError(exceptions.Exception):
44 def __init__(self):
45 return
46
47 def __Str__(self):
48 print "","Unfinished LLPerfBlock"
49
50class LLPerfBlock:
51 def __init__( self, key ):
52 global gBlockMap
53 global gCurrentStatPath
54 global gIsLoggingEnabled
55
56 #Check to see if we're running metrics right now.
57 if gIsLoggingEnabled:
58 self.mRunning = True #Mark myself as running.
59
60 self.mPreviousStatPath = gCurrentStatPath
61 gCurrentStatPath += "/" + key
62 if gCurrentStatPath not in gBlockMap:
63 gBlockMap[gCurrentStatPath] = LLPerfStat(key)
64
65 self.mStat = gBlockMap[gCurrentStatPath]
66 self.mStat.start()
67
68 def finish( self ):
69 global gBlockMap
70 global gIsLoggingEnabled
71
72 if gIsLoggingEnabled:
73 self.mStat.stop()
74 self.mRunning = False
75 gCurrentStatPath = self.mPreviousStatPath
76
77# def __del__( self ):
78# if self.mRunning:
79# #SPATTERS FIXME
80# raise PerfError
81
82class LLPerformance:
83 #--------------------------------------------------
84 # Determine whether or not we want to log statistics
85
86 def __init__( self, process_name = "python" ):
87 self.process_name = process_name
88 self.init_testing()
89 self.mTimeStamp = int(time.time()*1000)
90 self.mUTCTime = time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime())
91
92 def init_testing( self ):
93 global gIsLoggingEnabled
94
95 host_performance_file = "/dev/shm/simperf/simperf_proc_config.llsd"
96
97 #If file exists, open
98 if os.path.exists(host_performance_file):
99 file = open (host_performance_file,'r')
100
101 #Read serialized LLSD from file.
102 body = llsd.parse(file.read())
103
104 #Calculate time since file last modified.
105 stats = os.stat(host_performance_file)
106 now = time.time()
107 mod = stats[stat.ST_MTIME]
108 age = now - mod
109
110 if age < ( body['duration'] ):
111 gIsLoggingEnabled = True
112
113
114 def get ( self ):
115 global gIsLoggingEnabled
116 return gIsLoggingEnabled
117
118 #def output(self,ptr,path):
119 # if 'stats' in ptr:
120 # stats = ptr['stats']
121 # self.mOutputPtr[path] = stats.get_map()
122
123 # if 'children' in ptr:
124 # children=ptr['children']
125
126 # curptr = self.mOutputPtr
127 # curchildren={}
128 # curptr['children'] = curchildren
129
130 # for key in children:
131 # curchildren[key]={}
132 # self.mOutputPtr = curchildren[key]
133 # self.output(children[key],path + '/' + key)
134
135 def done(self):
136 global gBlockMap
137
138 if not self.get():
139 return
140
141 output_name = "/dev/shm/simperf/%s_proc.%d.llsd" % (self.process_name, os.getpid())
142 output_file = open(output_name, 'w')
143 process_info = {
144 "name" : self.process_name,
145 "pid" : os.getpid(),
146 "ppid" : os.getppid(),
147 "timestamp" : self.mTimeStamp,
148 "utc_time" : self.mUTCTime,
149 }
150 output_file.write(llsd.format_notation(process_info))
151 output_file.write('\n')
152
153 for key in gBlockMap.keys():
154 gBlockMap[key] = gBlockMap[key].get_map()
155 output_file.write(llsd.format_notation(gBlockMap))
156 output_file.write('\n')
157 output_file.close()
158
diff --git a/linden/indra/lib/python/indra/util/named_query.py b/linden/indra/lib/python/indra/util/named_query.py
index 20f2ec7..c5fb498 100644
--- a/linden/indra/lib/python/indra/util/named_query.py
+++ b/linden/indra/lib/python/indra/util/named_query.py
@@ -63,7 +63,7 @@ def _init_g_named_manager(sql_dir = None):
63 63
64 # extra fallback directory in case config doesn't return what we want 64 # extra fallback directory in case config doesn't return what we want
65 if sql_dir is None: 65 if sql_dir is None:
66 sql_dir = os.path.dirname(__file__) + "../../../../web/dataservice/sql" 66 sql_dir = os.path.join(os.path.dirname(__file__), "..", "..", "..", "..", "web", "dataservice", "sql")
67 67
68 global _g_named_manager 68 global _g_named_manager
69 _g_named_manager = NamedQueryManager( 69 _g_named_manager = NamedQueryManager(
@@ -103,11 +103,12 @@ class NamedQuery(object):
103 def __init__(self, name, filename): 103 def __init__(self, name, filename):
104 """ Construct a NamedQuery object. The name argument is an 104 """ Construct a NamedQuery object. The name argument is an
105 arbitrary name as a handle for the query, and the filename is 105 arbitrary name as a handle for the query, and the filename is
106 a path to a file containing an llsd named query document.""" 106 a path to a file or a file-like object containing an llsd named
107 query document."""
107 self._stat_interval_seconds = 5 # 5 seconds 108 self._stat_interval_seconds = 5 # 5 seconds
108 self._name = name 109 self._name = name
109 if (filename is not None) \ 110 if (filename is not None and isinstance(filename, (str, unicode))
110 and (NQ_FILE_SUFFIX != filename[-NQ_FILE_SUFFIX_LEN:]): 111 and NQ_FILE_SUFFIX != filename[-NQ_FILE_SUFFIX_LEN:]):
111 filename = filename + NQ_FILE_SUFFIX 112 filename = filename + NQ_FILE_SUFFIX
112 self._location = filename 113 self._location = filename
113 self._alternative = dict() 114 self._alternative = dict()
@@ -122,8 +123,8 @@ class NamedQuery(object):
122 123
123 def get_modtime(self): 124 def get_modtime(self):
124 """ Returns the mtime (last modified time) of the named query 125 """ Returns the mtime (last modified time) of the named query
125 file, if such exists.""" 126 filename. For file-like objects, expect a modtime of 0"""
126 if self._location: 127 if self._location and isinstance(self._location, (str, unicode)):
127 return os.path.getmtime(self._location) 128 return os.path.getmtime(self._location)
128 return 0 129 return 0
129 130
@@ -131,7 +132,12 @@ class NamedQuery(object):
131 """ Loads and parses the named query file into self. Does 132 """ Loads and parses the named query file into self. Does
132 nothing if self.location is nonexistant.""" 133 nothing if self.location is nonexistant."""
133 if self._location: 134 if self._location:
134 self._reference_contents(llsd.parse(open(self._location).read())) 135 if isinstance(self._location, (str, unicode)):
136 contents = llsd.parse(open(self._location).read())
137 else:
138 # we probably have a file-like object. Godspeed!
139 contents = llsd.parse(self._location.read())
140 self._reference_contents(contents)
135 # Check for alternative implementations 141 # Check for alternative implementations
136 try: 142 try:
137 for name, alt in self._contents['alternative'].items(): 143 for name, alt in self._contents['alternative'].items():
diff --git a/linden/indra/lib/python/indra/util/simperf_host_xml_parser.py b/linden/indra/lib/python/indra/util/simperf_host_xml_parser.py
new file mode 100755
index 0000000..b608415
--- /dev/null
+++ b/linden/indra/lib/python/indra/util/simperf_host_xml_parser.py
@@ -0,0 +1,338 @@
1#!/usr/bin/env python
2"""\
3@file simperf_host_xml_parser.py
4@brief Digest collector's XML dump and convert to simple dict/list structure
5
6$LicenseInfo:firstyear=2008&license=mit$
7
8Copyright (c) 2008, Linden Research, Inc.
9
10Permission is hereby granted, free of charge, to any person obtaining a copy
11of this software and associated documentation files (the "Software"), to deal
12in the Software without restriction, including without limitation the rights
13to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
14copies of the Software, and to permit persons to whom the Software is
15furnished to do so, subject to the following conditions:
16
17The above copyright notice and this permission notice shall be included in
18all copies or substantial portions of the Software.
19
20THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
21IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
22FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
23AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
24LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
25OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
26THE SOFTWARE.
27$/LicenseInfo$
28"""
29
30import sys, os, getopt, time
31import simplejson
32from xml import sax
33
34
35def usage():
36 print "Usage:"
37 print sys.argv[0] + " [options]"
38 print " Convert RRD's XML dump to JSON. Script to convert the simperf_host_collector-"
39 print " generated RRD dump into JSON. Steps include converting selected named"
40 print " fields from GAUGE type to COUNTER type by computing delta with preceding"
41 print " values. Top-level named fields are:"
42 print
43 print " lastupdate Time (javascript timestamp) of last data sample"
44 print " step Time in seconds between samples"
45 print " ds Data specification (name/type) for each column"
46 print " database Table of data samples, one time step per row"
47 print
48 print "Options:"
49 print " -i, --in Input settings filename. (Default: stdin)"
50 print " -o, --out Output settings filename. (Default: stdout)"
51 print " -h, --help Print this message and exit."
52 print
53 print "Example: %s -i rrddump.xml -o rrddump.json" % sys.argv[0]
54 print
55 print "Interfaces:"
56 print " class SimPerfHostXMLParser() # SAX content handler"
57 print " def simperf_host_xml_fixup(parser) # post-parse value fixup"
58
59class SimPerfHostXMLParser(sax.handler.ContentHandler):
60
61 def __init__(self):
62 pass
63
64 def startDocument(self):
65 self.rrd_last_update = 0 # public
66 self.rrd_step = 0 # public
67 self.rrd_ds = [] # public
68 self.rrd_records = [] # public
69 self._rrd_level = 0
70 self._rrd_parse_state = 0
71 self._rrd_chars = ""
72 self._rrd_capture = False
73 self._rrd_ds_val = {}
74 self._rrd_data_row = []
75 self._rrd_data_row_has_nan = False
76
77 def endDocument(self):
78 pass
79
80 # Nasty little ad-hoc state machine to extract the elements that are
81 # necessary from the 'rrdtool dump' XML output. The same element
82 # name '<ds>' is used for two different data sets so we need to pay
83 # some attention to the actual structure to get the ones we want
84 # and ignore the ones we don't.
85
86 def startElement(self, name, attrs):
87 self._rrd_level = self._rrd_level + 1
88 self._rrd_capture = False
89 if self._rrd_level == 1:
90 if name == "rrd" and self._rrd_parse_state == 0:
91 self._rrd_parse_state = 1 # In <rrd>
92 self._rrd_capture = True
93 self._rrd_chars = ""
94 elif self._rrd_level == 2:
95 if self._rrd_parse_state == 1:
96 if name == "lastupdate":
97 self._rrd_parse_state = 2 # In <rrd><lastupdate>
98 self._rrd_capture = True
99 self._rrd_chars = ""
100 elif name == "step":
101 self._rrd_parse_state = 3 # In <rrd><step>
102 self._rrd_capture = True
103 self._rrd_chars = ""
104 elif name == "ds":
105 self._rrd_parse_state = 4 # In <rrd><ds>
106 self._rrd_ds_val = {}
107 self._rrd_chars = ""
108 elif name == "rra":
109 self._rrd_parse_state = 5 # In <rrd><rra>
110 elif self._rrd_level == 3:
111 if self._rrd_parse_state == 4:
112 if name == "name":
113 self._rrd_parse_state = 6 # In <rrd><ds><name>
114 self._rrd_capture = True
115 self._rrd_chars = ""
116 elif name == "type":
117 self._rrd_parse_state = 7 # In <rrd><ds><type>
118 self._rrd_capture = True
119 self._rrd_chars = ""
120 elif self._rrd_parse_state == 5:
121 if name == "database":
122 self._rrd_parse_state = 8 # In <rrd><rra><database>
123 elif self._rrd_level == 4:
124 if self._rrd_parse_state == 8:
125 if name == "row":
126 self._rrd_parse_state = 9 # In <rrd><rra><database><row>
127 self._rrd_data_row = []
128 self._rrd_data_row_has_nan = False
129 elif self._rrd_level == 5:
130 if self._rrd_parse_state == 9:
131 if name == "v":
132 self._rrd_parse_state = 10 # In <rrd><rra><database><row><v>
133 self._rrd_capture = True
134 self._rrd_chars = ""
135
136 def endElement(self, name):
137 self._rrd_capture = False
138 if self._rrd_parse_state == 10:
139 self._rrd_capture = self._rrd_level == 6
140 if self._rrd_level == 5:
141 if self._rrd_chars == "NaN":
142 self._rrd_data_row_has_nan = True
143 else:
144 self._rrd_data_row.append(self._rrd_chars)
145 self._rrd_parse_state = 9 # In <rrd><rra><database><row>
146 elif self._rrd_parse_state == 9:
147 if self._rrd_level == 4:
148 if not self._rrd_data_row_has_nan:
149 self.rrd_records.append(self._rrd_data_row)
150 self._rrd_parse_state = 8 # In <rrd><rra><database>
151 elif self._rrd_parse_state == 8:
152 if self._rrd_level == 3:
153 self._rrd_parse_state = 5 # In <rrd><rra>
154 elif self._rrd_parse_state == 7:
155 if self._rrd_level == 3:
156 self._rrd_ds_val["type"] = self._rrd_chars
157 self._rrd_parse_state = 4 # In <rrd><ds>
158 elif self._rrd_parse_state == 6:
159 if self._rrd_level == 3:
160 self._rrd_ds_val["name"] = self._rrd_chars
161 self._rrd_parse_state = 4 # In <rrd><ds>
162 elif self._rrd_parse_state == 5:
163 if self._rrd_level == 2:
164 self._rrd_parse_state = 1 # In <rrd>
165 elif self._rrd_parse_state == 4:
166 if self._rrd_level == 2:
167 self.rrd_ds.append(self._rrd_ds_val)
168 self._rrd_parse_state = 1 # In <rrd>
169 elif self._rrd_parse_state == 3:
170 if self._rrd_level == 2:
171 self.rrd_step = long(self._rrd_chars)
172 self._rrd_parse_state = 1 # In <rrd>
173 elif self._rrd_parse_state == 2:
174 if self._rrd_level == 2:
175 self.rrd_last_update = long(self._rrd_chars)
176 self._rrd_parse_state = 1 # In <rrd>
177 elif self._rrd_parse_state == 1:
178 if self._rrd_level == 1:
179 self._rrd_parse_state = 0 # At top
180
181 if self._rrd_level:
182 self._rrd_level = self._rrd_level - 1
183
184 def characters(self, content):
185 if self._rrd_capture:
186 self._rrd_chars = self._rrd_chars + content.strip()
187
188def _make_numeric(value):
189 try:
190 value = float(value)
191 except:
192 value = ""
193 return value
194
195def simperf_host_xml_fixup(parser, filter_start_time = None, filter_end_time = None):
196 # Fixup for GAUGE fields that are really COUNTS. They
197 # were forced to GAUGE to try to disable rrdtool's
198 # data interpolation/extrapolation for non-uniform time
199 # samples.
200 fixup_tags = [ "cpu_user",
201 "cpu_nice",
202 "cpu_sys",
203 "cpu_idle",
204 "cpu_waitio",
205 "cpu_intr",
206 # "file_active",
207 # "file_free",
208 # "inode_active",
209 # "inode_free",
210 "netif_in_kb",
211 "netif_in_pkts",
212 "netif_in_errs",
213 "netif_in_drop",
214 "netif_out_kb",
215 "netif_out_pkts",
216 "netif_out_errs",
217 "netif_out_drop",
218 "vm_page_in",
219 "vm_page_out",
220 "vm_swap_in",
221 "vm_swap_out",
222 #"vm_mem_total",
223 #"vm_mem_used",
224 #"vm_mem_active",
225 #"vm_mem_inactive",
226 #"vm_mem_free",
227 #"vm_mem_buffer",
228 #"vm_swap_cache",
229 #"vm_swap_total",
230 #"vm_swap_used",
231 #"vm_swap_free",
232 "cpu_interrupts",
233 "cpu_switches",
234 "cpu_forks" ]
235
236 col_count = len(parser.rrd_ds)
237 row_count = len(parser.rrd_records)
238
239 # Process the last row separately, just to make all values numeric.
240 for j in range(col_count):
241 parser.rrd_records[row_count - 1][j] = _make_numeric(parser.rrd_records[row_count - 1][j])
242
243 # Process all other row/columns.
244 last_different_row = row_count - 1
245 current_row = row_count - 2
246 while current_row >= 0:
247 # Check for a different value than the previous row. If everything is the same
248 # then this is probably just a filler/bogus entry.
249 is_different = False
250 for j in range(col_count):
251 parser.rrd_records[current_row][j] = _make_numeric(parser.rrd_records[current_row][j])
252 if parser.rrd_records[current_row][j] != parser.rrd_records[last_different_row][j]:
253 # We're good. This is a different row.
254 is_different = True
255
256 if not is_different:
257 # This is a filler/bogus entry. Just ignore it.
258 for j in range(col_count):
259 parser.rrd_records[current_row][j] = float('nan')
260 else:
261 # Some tags need to be converted into deltas.
262 for j in range(col_count):
263 if parser.rrd_ds[j]["name"] in fixup_tags:
264 parser.rrd_records[last_different_row][j] = \
265 parser.rrd_records[last_different_row][j] - parser.rrd_records[current_row][j]
266 last_different_row = current_row
267
268 current_row -= 1
269
270 # Set fixup_tags in the first row to 'nan' since they aren't useful anymore.
271 for j in range(col_count):
272 if parser.rrd_ds[j]["name"] in fixup_tags:
273 parser.rrd_records[0][j] = float('nan')
274
275 # Add a timestamp to each row and to the catalog. Format and name
276 # chosen to match other simulator logging (hopefully).
277 start_time = parser.rrd_last_update - (parser.rrd_step * (row_count - 1))
278 # Build a filtered list of rrd_records if we are limited to a time range.
279 filter_records = False
280 if filter_start_time is not None or filter_end_time is not None:
281 filter_records = True
282 filtered_rrd_records = []
283 if filter_start_time is None:
284 filter_start_time = start_time * 1000
285 if filter_end_time is None:
286 filter_end_time = parser.rrd_last_update * 1000
287
288 for i in range(row_count):
289 record_timestamp = (start_time + (i * parser.rrd_step)) * 1000
290 parser.rrd_records[i].insert(0, record_timestamp)
291 if filter_records:
292 if filter_start_time <= record_timestamp and record_timestamp <= filter_end_time:
293 filtered_rrd_records.append(parser.rrd_records[i])
294
295 if filter_records:
296 parser.rrd_records = filtered_rrd_records
297
298 parser.rrd_ds.insert(0, {"type": "GAUGE", "name": "javascript_timestamp"})
299
300
301def main(argv=None):
302 opts, args = getopt.getopt(sys.argv[1:], "i:o:h", ["in=", "out=", "help"])
303 input_file = sys.stdin
304 output_file = sys.stdout
305 for o, a in opts:
306 if o in ("-i", "--in"):
307 input_file = open(a, 'r')
308 if o in ("-o", "--out"):
309 output_file = open(a, 'w')
310 if o in ("-h", "--help"):
311 usage()
312 sys.exit(0)
313
314 # Using the SAX parser as it is at least 4X faster and far, far
315 # smaller on this dataset than the DOM-based interface in xml.dom.minidom.
316 # With SAX and a 5.4MB xml file, this requires about seven seconds of
317 # wall-clock time and 32MB VSZ. With the DOM interface, about 22 seconds
318 # and over 270MB VSZ.
319
320 handler = SimPerfHostXMLParser()
321 sax.parse(input_file, handler)
322 if input_file != sys.stdin:
323 input_file.close()
324
325 # Various format fixups: string-to-num, gauge-to-counts, add
326 # a time stamp, etc.
327 simperf_host_xml_fixup(handler)
328
329 # Create JSONable dict with interesting data and format/print it
330 print >>output_file, simplejson.dumps({ "step" : handler.rrd_step,
331 "lastupdate": handler.rrd_last_update * 1000,
332 "ds" : handler.rrd_ds,
333 "database" : handler.rrd_records })
334
335 return 0
336
337if __name__ == "__main__":
338 sys.exit(main())
diff --git a/linden/indra/lib/python/indra/util/simperf_oprof_interface.py b/linden/indra/lib/python/indra/util/simperf_oprof_interface.py
new file mode 100755
index 0000000..a7e9a4c
--- /dev/null
+++ b/linden/indra/lib/python/indra/util/simperf_oprof_interface.py
@@ -0,0 +1,160 @@
1#!/usr/bin/env python
2"""\
3@file simperf_oprof_interface.py
4@brief Manage OProfile data collection on a host
5
6$LicenseInfo:firstyear=2008&license=internal$
7
8Copyright (c) 2008, Linden Research, Inc.
9
10The following source code is PROPRIETARY AND CONFIDENTIAL. Use of
11this source code is governed by the Linden Lab Source Code Disclosure
12Agreement ("Agreement") previously entered between you and Linden
13Lab. By accessing, using, copying, modifying or distributing this
14software, you acknowledge that you have been informed of your
15obligations under the Agreement and agree to abide by those obligations.
16
17ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
18WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
19COMPLETENESS OR PERFORMANCE.
20$/LicenseInfo$
21"""
22
23import sys, os, getopt
24import simplejson
25
26
27def usage():
28 print "Usage:"
29 print sys.argv[0] + " [options]"
30 print " Digest the OProfile report forms that come out of the"
31 print " simperf_oprof_ctl program's -r/--report command. The result"
32 print " is an array of dictionaires with the following keys:"
33 print
34 print " symbol Name of sampled, calling, or called procedure"
35 print " file Executable or library where symbol resides"
36 print " percentage Percentage contribution to profile, calls or called"
37 print " samples Sample count"
38 print " calls Methods called by the method in question (full only)"
39 print " called_by Methods calling the method (full only)"
40 print
41 print " For 'full' reports the two keys 'calls' and 'called_by' are"
42 print " themselves arrays of dictionaries based on the first four keys."
43 print
44 print "Return Codes:"
45 print " None. Aggressively digests everything. Will likely mung results"
46 print " if a program or library has whitespace in its name."
47 print
48 print "Options:"
49 print " -i, --in Input settings filename. (Default: stdin)"
50 print " -o, --out Output settings filename. (Default: stdout)"
51 print " -h, --help Print this message and exit."
52 print
53 print "Interfaces:"
54 print " class SimPerfOProfileInterface()"
55
56class SimPerfOProfileInterface:
57 def __init__(self):
58 self.isBrief = True # public
59 self.isValid = False # public
60 self.result = [] # public
61
62 def parse(self, input):
63 in_samples = False
64 for line in input:
65 if in_samples:
66 if line[0:6] == "------":
67 self.isBrief = False
68 self._parseFull(input)
69 else:
70 self._parseBrief(input, line)
71 self.isValid = True
72 return
73 try:
74 hd1, remain = line.split(None, 1)
75 if hd1 == "samples":
76 in_samples = True
77 except ValueError:
78 pass
79
80 def _parseBrief(self, input, line1):
81 try:
82 fld1, fld2, fld3, fld4 = line1.split(None, 3)
83 self.result.append({"samples" : fld1,
84 "percentage" : fld2,
85 "file" : fld3,
86 "symbol" : fld4.strip("\n")})
87 except ValueError:
88 pass
89 for line in input:
90 try:
91 fld1, fld2, fld3, fld4 = line.split(None, 3)
92 self.result.append({"samples" : fld1,
93 "percentage" : fld2,
94 "file" : fld3,
95 "symbol" : fld4.strip("\n")})
96 except ValueError:
97 pass
98
99 def _parseFull(self, input):
100 state = 0 # In 'called_by' section
101 calls = []
102 called_by = []
103 current = {}
104 for line in input:
105 if line[0:6] == "------":
106 if len(current):
107 current["calls"] = calls
108 current["called_by"] = called_by
109 self.result.append(current)
110 state = 0
111 calls = []
112 called_by = []
113 current = {}
114 else:
115 try:
116 fld1, fld2, fld3, fld4 = line.split(None, 3)
117 tmp = {"samples" : fld1,
118 "percentage" : fld2,
119 "file" : fld3,
120 "symbol" : fld4.strip("\n")}
121 except ValueError:
122 continue
123 if line[0] != " ":
124 current = tmp
125 state = 1 # In 'calls' section
126 elif state == 0:
127 called_by.append(tmp)
128 else:
129 calls.append(tmp)
130 if len(current):
131 current["calls"] = calls
132 current["called_by"] = called_by
133 self.result.append(current)
134
135
136def main(argv=None):
137 opts, args = getopt.getopt(sys.argv[1:], "i:o:h", ["in=", "out=", "help"])
138 input_file = sys.stdin
139 output_file = sys.stdout
140 for o, a in opts:
141 if o in ("-i", "--in"):
142 input_file = open(a, 'r')
143 if o in ("-o", "--out"):
144 output_file = open(a, 'w')
145 if o in ("-h", "--help"):
146 usage()
147 sys.exit(0)
148
149 oprof = SimPerfOProfileInterface()
150 oprof.parse(input_file)
151 if input_file != sys.stdin:
152 input_file.close()
153
154 # Create JSONable dict with interesting data and format/print it
155 print >>output_file, simplejson.dumps(oprof.result)
156
157 return 0
158
159if __name__ == "__main__":
160 sys.exit(main())
diff --git a/linden/indra/lib/python/indra/util/simperf_proc_interface.py b/linden/indra/lib/python/indra/util/simperf_proc_interface.py
new file mode 100755
index 0000000..62a63fa
--- /dev/null
+++ b/linden/indra/lib/python/indra/util/simperf_proc_interface.py
@@ -0,0 +1,164 @@
1#!/usr/bin/python
2
3# ----------------------------------------------------
4# Utility to extract log messages from *.<pid>.llsd
5# files that contain performance statistics.
6
7# ----------------------------------------------------
8import sys, os
9
10if os.path.exists("setup-path.py"):
11 execfile("setup-path.py")
12
13from indra.base import llsd
14
15DEFAULT_PATH="/dev/shm/simperf/"
16
17
18# ----------------------------------------------------
19# Pull out the stats and return a single document
20def parse_logfile(filename, target_column=None, verbose=False):
21 full_doc = []
22 # Open source temp log file. Let exceptions percolate up.
23 sourcefile = open( filename,'r')
24
25 if verbose:
26 print "Reading " + filename
27
28 # Parse and output all lines from the temp file
29 for line in sourcefile.xreadlines():
30 partial_doc = llsd.parse(line)
31 if partial_doc is not None:
32 if target_column is None:
33 full_doc.append(partial_doc)
34 else:
35 trim_doc = { target_column: partial_doc[target_column] }
36 if target_column != "fps":
37 trim_doc[ 'fps' ] = partial_doc[ 'fps' ]
38 trim_doc[ '/total_time' ] = partial_doc[ '/total_time' ]
39 trim_doc[ 'utc_time' ] = partial_doc[ 'utc_time' ]
40 full_doc.append(trim_doc)
41
42 sourcefile.close()
43 return full_doc
44
45# Extract just the meta info line, and the timestamp of the first/last frame entry.
46def parse_logfile_info(filename, verbose=False):
47 # Open source temp log file. Let exceptions percolate up.
48 sourcefile = open(filename, 'rU') # U is to open with Universal newline support
49
50 if verbose:
51 print "Reading " + filename
52
53 # The first line is the meta info line.
54 info_line = sourcefile.readline()
55 if not info_line:
56 sourcefile.close()
57 return None
58
59 # The rest of the lines are frames. Read the first and last to get the time range.
60 info = llsd.parse( info_line )
61 info['start_time'] = None
62 info['end_time'] = None
63 first_frame = sourcefile.readline()
64 if first_frame:
65 try:
66 info['start_time'] = int(llsd.parse(first_frame)['timestamp'])
67 except:
68 pass
69
70 # Read the file backwards to find the last two lines.
71 sourcefile.seek(0, 2)
72 file_size = sourcefile.tell()
73 offset = 1024
74 num_attempts = 0
75 end_time = None
76 if file_size < offset:
77 offset = file_size
78 while 1:
79 sourcefile.seek(-1*offset, 2)
80 read_str = sourcefile.read(offset)
81 # Remove newline at the end
82 if read_str[offset - 1] == '\n':
83 read_str = read_str[0:-1]
84 lines = read_str.split('\n')
85 full_line = None
86 if len(lines) > 2: # Got two line
87 try:
88 end_time = llsd.parse(lines[-1])['timestamp']
89 except:
90 # We couldn't parse this line. Try once more.
91 try:
92 end_time = llsd.parse(lines[-2])['timestamp']
93 except:
94 # Nope. Just move on.
95 pass
96 break
97 if len(read_str) == file_size: # Reached the beginning
98 break
99 offset += 1024
100
101 info['end_time'] = int(end_time)
102
103 sourcefile.close()
104 return info
105
106
107def parse_proc_filename(filename):
108 try:
109 name_as_list = filename.split(".")
110 cur_stat_type = name_as_list[0].split("_")[0]
111 cur_pid = name_as_list[1]
112 except IndexError, ValueError:
113 return (None, None)
114 return (cur_pid, cur_stat_type)
115
116# ----------------------------------------------------
117def get_simstats_list(path=None):
118 """ Return stats (pid, type) listed in <type>_proc.<pid>.llsd """
119 if path is None:
120 path = DEFAULT_PATH
121 simstats_list = []
122 for file_name in os.listdir(path):
123 if file_name.endswith(".llsd") and file_name != "simperf_proc_config.llsd":
124 simstats_info = parse_logfile_info(path + file_name)
125 if simstats_info is not None:
126 simstats_list.append(simstats_info)
127 return simstats_list
128
129def get_log_info_list(pid=None, stat_type=None, path=None, target_column=None, verbose=False):
130 """ Return data from all llsd files matching the pid and stat type """
131 if path is None:
132 path = DEFAULT_PATH
133 log_info_list = {}
134 for file_name in os.listdir ( path ):
135 if file_name.endswith(".llsd") and file_name != "simperf_proc_config.llsd":
136 (cur_pid, cur_stat_type) = parse_proc_filename(file_name)
137 if cur_pid is None:
138 continue
139 if pid is not None and pid != cur_pid:
140 continue
141 if stat_type is not None and stat_type != cur_stat_type:
142 continue
143 log_info_list[cur_pid] = parse_logfile(path + file_name, target_column, verbose)
144 return log_info_list
145
146def delete_simstats_files(pid=None, stat_type=None, path=None):
147 """ Delete *.<pid>.llsd files """
148 if path is None:
149 path = DEFAULT_PATH
150 del_list = []
151 for file_name in os.listdir(path):
152 if file_name.endswith(".llsd") and file_name != "simperf_proc_config.llsd":
153 (cur_pid, cur_stat_type) = parse_proc_filename(file_name)
154 if cur_pid is None:
155 continue
156 if pid is not None and pid != cur_pid:
157 continue
158 if stat_type is not None and stat_type != cur_stat_type:
159 continue
160 del_list.append(cur_pid)
161 # Allow delete related exceptions to percolate up if this fails.
162 os.unlink(os.path.join(DEFAULT_PATH, file_name))
163 return del_list
164
diff --git a/linden/indra/linux_crash_logger/CMakeLists.txt b/linden/indra/linux_crash_logger/CMakeLists.txt
index 628d4ac..6f6754e 100644
--- a/linden/indra/linux_crash_logger/CMakeLists.txt
+++ b/linden/indra/linux_crash_logger/CMakeLists.txt
@@ -3,7 +3,6 @@
3project(linux_crash_logger) 3project(linux_crash_logger)
4 4
5include(00-Common) 5include(00-Common)
6include(Boost)
7include(LLCommon) 6include(LLCommon)
8include(LLCrashLogger) 7include(LLCrashLogger)
9include(LLMath) 8include(LLMath)
@@ -52,17 +51,15 @@ target_link_libraries(linux-crash-logger
52 ${LLMATH_LIBRARIES} 51 ${LLMATH_LIBRARIES}
53 ${LLCOMMON_LIBRARIES} 52 ${LLCOMMON_LIBRARIES}
54 ${UI_LIBRARIES} 53 ${UI_LIBRARIES}
55 ${BOOST_SIGNALS_LIBRARY}
56 ${DB_LIBRARIES} 54 ${DB_LIBRARIES}
57 ) 55 )
58 56
59add_custom_command( 57add_custom_command(
60 OUTPUT linux-crash-logger-stripped 58 OUTPUT linux-crash-logger-stripped
61 COMMAND strip 59 COMMAND strip
62 ARGS --strip-debug -o linux-crash-logger-stripped 60 ARGS --strip-debug -o linux-crash-logger-stripped linux-crash-logger
63 linux-crash-logger
64 DEPENDS linux-crash-logger 61 DEPENDS linux-crash-logger
65 ) 62 )
66 63
67add_custom_target(linux-crash-logger-stripped ALL 64add_custom_target(linux-crash-logger-strip-target ALL
68 DEPENDS linux-crash-logger-stripped) 65 DEPENDS linux-crash-logger-stripped)
diff --git a/linden/indra/llaudio/CMakeLists.txt b/linden/indra/llaudio/CMakeLists.txt
index b662023..ebedcab 100644
--- a/linden/indra/llaudio/CMakeLists.txt
+++ b/linden/indra/llaudio/CMakeLists.txt
@@ -65,3 +65,10 @@ set_source_files_properties(${llaudio_HEADER_FILES}
65list(APPEND llaudio_SOURCE_FILES ${llaudio_HEADER_FILES}) 65list(APPEND llaudio_SOURCE_FILES ${llaudio_HEADER_FILES})
66 66
67add_library (llaudio ${llaudio_SOURCE_FILES}) 67add_library (llaudio ${llaudio_SOURCE_FILES})
68target_link_libraries(
69 llaudio
70 ${VORBISENC_LIBRARIES}
71 ${VORBISFILE_LIBRARIES}
72 ${VORBIS_LIBRARIES}
73 ${OGG_LIBRARIES}
74 )
diff --git a/linden/indra/llaudio/audioengine.cpp b/linden/indra/llaudio/audioengine.cpp
index 5dd5b28..298ab1d 100644
--- a/linden/indra/llaudio/audioengine.cpp
+++ b/linden/indra/llaudio/audioengine.cpp
@@ -96,6 +96,9 @@ void LLAudioEngine::setDefaults()
96 mMasterGain = 1.f; 96 mMasterGain = 1.f;
97 mInternetStreamGain = 0.125f; 97 mInternetStreamGain = 0.125f;
98 mNextWindUpdate = 0.f; 98 mNextWindUpdate = 0.f;
99
100 for (U32 i = 0; i < LLAudioEngine::AUDIO_TYPE_COUNT; i++)
101 mSecondaryGain[i] = 1.0f;
99} 102}
100 103
101 104
@@ -167,6 +170,13 @@ void LLAudioEngine::updateChannels()
167 { 170 {
168 if (mChannels[i]) 171 if (mChannels[i])
169 { 172 {
173 // set secondary gain if type is available
174 LLAudioSource* source = mChannels[i]->getSource();
175 if (source)
176 {
177 mChannels[i]->setSecondaryGain(mSecondaryGain[source->getType()]);
178 }
179
170 mChannels[i]->updateBuffer(); 180 mChannels[i]->updateBuffer();
171 mChannels[i]->update3DPosition(); 181 mChannels[i]->update3DPosition();
172 mChannels[i]->updateLoop(); 182 mChannels[i]->updateLoop();
@@ -643,6 +653,18 @@ F32 LLAudioEngine::getMasterGain()
643 return mMasterGain; 653 return mMasterGain;
644} 654}
645 655
656void LLAudioEngine::setSecondaryGain(S32 type, F32 gain)
657{
658 llassert(type < LLAudioEngine::AUDIO_TYPE_COUNT);
659
660 mSecondaryGain[type] = gain;
661}
662
663F32 LLAudioEngine::getSecondaryGain(S32 type)
664{
665 return mSecondaryGain[type];
666}
667
646F32 LLAudioEngine::getInternetStreamGain() 668F32 LLAudioEngine::getInternetStreamGain()
647{ 669{
648 return mInternetStreamGain; 670 return mInternetStreamGain;
@@ -718,7 +740,8 @@ F64 LLAudioEngine::mapWindVecToPan(LLVector3 wind_vec)
718} 740}
719 741
720 742
721void LLAudioEngine::triggerSound(const LLUUID &audio_uuid, const LLUUID& owner_id, const F32 gain, const LLVector3d &pos_global) 743void LLAudioEngine::triggerSound(const LLUUID &audio_uuid, const LLUUID& owner_id, const F32 gain,
744 const S32 type, const LLVector3d &pos_global)
722{ 745{
723 // Create a new source (since this can't be associated with an existing source. 746 // Create a new source (since this can't be associated with an existing source.
724 //llinfos << "Localized: " << audio_uuid << llendl; 747 //llinfos << "Localized: " << audio_uuid << llendl;
@@ -731,7 +754,7 @@ void LLAudioEngine::triggerSound(const LLUUID &audio_uuid, const LLUUID& owner_i
731 LLUUID source_id; 754 LLUUID source_id;
732 source_id.generate(); 755 source_id.generate();
733 756
734 LLAudioSource *asp = new LLAudioSource(source_id, owner_id, gain); 757 LLAudioSource *asp = new LLAudioSource(source_id, owner_id, gain, type);
735 gAudiop->addAudioSource(asp); 758 gAudiop->addAudioSource(asp);
736 if (pos_global.isExactlyZero()) 759 if (pos_global.isExactlyZero())
737 { 760 {
@@ -1180,11 +1203,12 @@ void LLAudioEngine::assetCallback(LLVFS *vfs, const LLUUID &uuid, LLAssetType::E
1180// 1203//
1181 1204
1182 1205
1183LLAudioSource::LLAudioSource(const LLUUID& id, const LLUUID& owner_id, const F32 gain) 1206LLAudioSource::LLAudioSource(const LLUUID& id, const LLUUID& owner_id, const F32 gain, const S32 type)
1184: mID(id), 1207: mID(id),
1185 mOwnerID(owner_id), 1208 mOwnerID(owner_id),
1186 mPriority(0.f), 1209 mPriority(0.f),
1187 mGain(gain), 1210 mGain(gain),
1211 mType(type),
1188 mAmbient(FALSE), 1212 mAmbient(FALSE),
1189 mLoop(FALSE), 1213 mLoop(FALSE),
1190 mSyncMaster(FALSE), 1214 mSyncMaster(FALSE),
@@ -1515,7 +1539,8 @@ LLAudioChannel::LLAudioChannel() :
1515 mCurrentSourcep(NULL), 1539 mCurrentSourcep(NULL),
1516 mCurrentBufferp(NULL), 1540 mCurrentBufferp(NULL),
1517 mLoopedThisFrame(FALSE), 1541 mLoopedThisFrame(FALSE),
1518 mWaiting(FALSE) 1542 mWaiting(FALSE),
1543 mSecondaryGain(1.0f)
1519{ 1544{
1520} 1545}
1521 1546
diff --git a/linden/indra/llaudio/audioengine.h b/linden/indra/llaudio/audioengine.h
index e38413f..b8153a3 100644
--- a/linden/indra/llaudio/audioengine.h
+++ b/linden/indra/llaudio/audioengine.h
@@ -78,6 +78,15 @@ class LLAudioBuffer;
78class LLAudioEngine 78class LLAudioEngine
79{ 79{
80public: 80public:
81 enum LLAudioType
82 {
83 AUDIO_TYPE_NONE = 0,
84 AUDIO_TYPE_SFX = 1,
85 AUDIO_TYPE_UI = 2,
86 AUDIO_TYPE_AMBIENT = 3,
87 AUDIO_TYPE_COUNT = 4 // last
88 };
89
81 LLAudioEngine(); 90 LLAudioEngine();
82 virtual ~LLAudioEngine(); 91 virtual ~LLAudioEngine();
83 92
@@ -109,6 +118,9 @@ public:
109 F32 getMasterGain(); 118 F32 getMasterGain();
110 void setMasterGain(F32 gain); 119 void setMasterGain(F32 gain);
111 120
121 F32 getSecondaryGain(S32 type);
122 void setSecondaryGain(S32 type, F32 gain);
123
112 F32 getInternetStreamGain(); 124 F32 getInternetStreamGain();
113 125
114 virtual void setDopplerFactor(F32 factor); 126 virtual void setDopplerFactor(F32 factor);
@@ -122,7 +134,9 @@ public:
122 134
123 // Methods actually related to setting up and removing sounds 135 // Methods actually related to setting up and removing sounds
124 // Owner ID is the owner of the object making the request 136 // Owner ID is the owner of the object making the request
125 void triggerSound(const LLUUID &sound_id, const LLUUID& owner_id, const F32 gain, const LLVector3d &pos_global = LLVector3d::zero); 137 void triggerSound(const LLUUID &sound_id, const LLUUID& owner_id, const F32 gain,
138 const S32 type = LLAudioEngine::AUDIO_TYPE_NONE,
139 const LLVector3d &pos_global = LLVector3d::zero);
126 BOOL preloadSound(const LLUUID &id); 140 BOOL preloadSound(const LLUUID &id);
127 141
128 void addAudioSource(LLAudioSource *asp); 142 void addAudioSource(LLAudioSource *asp);
@@ -222,6 +236,7 @@ protected:
222 LLAudioBuffer *mBuffers[MAX_BUFFERS]; 236 LLAudioBuffer *mBuffers[MAX_BUFFERS];
223 237
224 F32 mMasterGain; 238 F32 mMasterGain;
239 F32 mSecondaryGain[AUDIO_TYPE_COUNT];
225 240
226 // Hack! Internet streams are treated differently from other sources! 241 // Hack! Internet streams are treated differently from other sources!
227 F32 mInternetStreamGain; 242 F32 mInternetStreamGain;
@@ -247,7 +262,7 @@ class LLAudioSource
247public: 262public:
248 // owner_id is the id of the agent responsible for making this sound 263 // owner_id is the id of the agent responsible for making this sound
249 // play, for example, the owner of the object currently playing it 264 // play, for example, the owner of the object currently playing it
250 LLAudioSource(const LLUUID &id, const LLUUID& owner_id, const F32 gain); 265 LLAudioSource(const LLUUID &id, const LLUUID& owner_id, const F32 gain, const S32 type = LLAudioEngine::AUDIO_TYPE_NONE);
251 virtual ~LLAudioSource(); 266 virtual ~LLAudioSource();
252 267
253 virtual void update(); // Update this audio source 268 virtual void update(); // Update this audio source
@@ -274,6 +289,9 @@ public:
274 289
275 void setPlayedOnce(const BOOL played_once) { mPlayedOnce = played_once; } 290 void setPlayedOnce(const BOOL played_once) { mPlayedOnce = played_once; }
276 291
292 void setType(S32 type) { mType = type; }
293 S32 getType() { return mType; }
294
277 void setPositionGlobal(const LLVector3d &position_global) { mPositionGlobal = position_global; } 295 void setPositionGlobal(const LLVector3d &position_global) { mPositionGlobal = position_global; }
278 LLVector3d getPositionGlobal() const { return mPositionGlobal; } 296 LLVector3d getPositionGlobal() const { return mPositionGlobal; }
279 LLVector3 getVelocity() const { return mVelocity; } 297 LLVector3 getVelocity() const { return mVelocity; }
@@ -312,6 +330,7 @@ protected:
312 BOOL mSyncSlave; 330 BOOL mSyncSlave;
313 BOOL mQueueSounds; 331 BOOL mQueueSounds;
314 BOOL mPlayedOnce; 332 BOOL mPlayedOnce;
333 S32 mType;
315 LLVector3d mPositionGlobal; 334 LLVector3d mPositionGlobal;
316 LLVector3 mVelocity; 335 LLVector3 mVelocity;
317 336
@@ -380,6 +399,9 @@ public:
380 virtual void setSource(LLAudioSource *sourcep); 399 virtual void setSource(LLAudioSource *sourcep);
381 LLAudioSource *getSource() const { return mCurrentSourcep; } 400 LLAudioSource *getSource() const { return mCurrentSourcep; }
382 401
402 void setSecondaryGain(F32 gain) { mSecondaryGain = gain; }
403 F32 getSecondaryGain() { return mSecondaryGain; }
404
383 friend class LLAudioEngine; 405 friend class LLAudioEngine;
384 friend class LLAudioSource; 406 friend class LLAudioSource;
385protected: 407protected:
@@ -398,6 +420,7 @@ protected:
398 LLAudioBuffer *mCurrentBufferp; 420 LLAudioBuffer *mCurrentBufferp;
399 BOOL mLoopedThisFrame; 421 BOOL mLoopedThisFrame;
400 BOOL mWaiting; // Waiting for sync. 422 BOOL mWaiting; // Waiting for sync.
423 F32 mSecondaryGain;
401}; 424};
402 425
403 426
diff --git a/linden/indra/llaudio/audioengine_fmod.cpp b/linden/indra/llaudio/audioengine_fmod.cpp
index 16d820c..4bf0c95 100644
--- a/linden/indra/llaudio/audioengine_fmod.cpp
+++ b/linden/indra/llaudio/audioengine_fmod.cpp
@@ -488,7 +488,7 @@ BOOL LLAudioChannelFMOD::updateBuffer()
488 if (mCurrentSourcep) 488 if (mCurrentSourcep)
489 { 489 {
490 // SJB: warnings can spam and hurt framerate, disabling 490 // SJB: warnings can spam and hurt framerate, disabling
491 if (!FSOUND_SetVolume(mChannelID, llround(mCurrentSourcep->getGain() * 255.0f))) 491 if (!FSOUND_SetVolume(mChannelID, llround(getSecondaryGain() * mCurrentSourcep->getGain() * 255.0f)))
492 { 492 {
493// llwarns << "LLAudioChannelFMOD::updateBuffer error: " << FMOD_ErrorString(FSOUND_GetError()) << llendl; 493// llwarns << "LLAudioChannelFMOD::updateBuffer error: " << FMOD_ErrorString(FSOUND_GetError()) << llendl;
494 } 494 }
diff --git a/linden/indra/llcharacter/llbvhloader.cpp b/linden/indra/llcharacter/llbvhloader.cpp
index cd1f492..938f47d 100644
--- a/linden/indra/llcharacter/llbvhloader.cpp
+++ b/linden/indra/llcharacter/llbvhloader.cpp
@@ -1133,6 +1133,8 @@ void LLBVHLoader::optimize()
1133 1133
1134 F32 rot_threshold = ROTATION_KEYFRAME_THRESHOLD / llmax((F32)joint->mChildTreeMaxDepth * 0.33f, 1.f); 1134 F32 rot_threshold = ROTATION_KEYFRAME_THRESHOLD / llmax((F32)joint->mChildTreeMaxDepth * 0.33f, 1.f);
1135 1135
1136 double diff_max = 0;
1137 KeyVector::iterator ki_max = ki;
1136 for (; ki != joint->mKeys.end(); ++ki) 1138 for (; ki != joint->mKeys.end(); ++ki)
1137 { 1139 {
1138 if (ki_prev == ki_last_good_pos) 1140 if (ki_prev == ki_last_good_pos)
@@ -1193,30 +1195,55 @@ void LLBVHLoader::optimize()
1193 F32 x_delta; 1195 F32 x_delta;
1194 F32 y_delta; 1196 F32 y_delta;
1195 F32 rot_test; 1197 F32 rot_test;
1196 1198
1199 // Test if the rotation has changed significantly since the very first frame. If false
1200 // for all frames, then we'll just throw out this joint's rotation entirely.
1197 x_delta = dist_vec(LLVector3::x_axis * first_frame_rot, LLVector3::x_axis * test_rot); 1201 x_delta = dist_vec(LLVector3::x_axis * first_frame_rot, LLVector3::x_axis * test_rot);
1198 y_delta = dist_vec(LLVector3::y_axis * first_frame_rot, LLVector3::y_axis * test_rot); 1202 y_delta = dist_vec(LLVector3::y_axis * first_frame_rot, LLVector3::y_axis * test_rot);
1199 rot_test = x_delta + y_delta; 1203 rot_test = x_delta + y_delta;
1200
1201 if (rot_test > ROTATION_MOTION_THRESHOLD) 1204 if (rot_test > ROTATION_MOTION_THRESHOLD)
1202 { 1205 {
1203 rot_changed = TRUE; 1206 rot_changed = TRUE;
1204 } 1207 }
1205
1206 x_delta = dist_vec(LLVector3::x_axis * interp_rot, LLVector3::x_axis * test_rot); 1208 x_delta = dist_vec(LLVector3::x_axis * interp_rot, LLVector3::x_axis * test_rot);
1207 y_delta = dist_vec(LLVector3::y_axis * interp_rot, LLVector3::y_axis * test_rot); 1209 y_delta = dist_vec(LLVector3::y_axis * interp_rot, LLVector3::y_axis * test_rot);
1208 rot_test = x_delta + y_delta; 1210 rot_test = x_delta + y_delta;
1209 1211
1210 if (rot_test < rot_threshold) 1212 // Draw a line between the last good keyframe and current. Test the distance between the last frame (current-1, i.e. ki_prev)
1211 { 1213 // and the line. If it's greater than some threshold, then it represents a significant frame and we want to include it.
1212 ki_prev->mIgnoreRot = TRUE; 1214 if (rot_test >= rot_threshold ||
1213 numRotFramesConsidered++; 1215 (ki+1 == joint->mKeys.end() && numRotFramesConsidered > 2))
1214 }
1215 else
1216 { 1216 {
1217 // Add the current test keyframe (which is technically the previous key, i.e. ki_prev).
1217 numRotFramesConsidered = 2; 1218 numRotFramesConsidered = 2;
1218 ki_last_good_rot = ki_prev; 1219 ki_last_good_rot = ki_prev;
1219 joint->mNumRotKeys++; 1220 joint->mNumRotKeys++;
1221
1222 // Add another keyframe between the last good keyframe and current, at whatever point was the most "significant" (i.e.
1223 // had the largest deviation from the earlier tests). Note that a more robust approach would be test all intermediate
1224 // keyframes against the line between the last good keyframe and current, but we're settling for this other method
1225 // because it's significantly faster.
1226 if (diff_max > 0)
1227 {
1228 if (ki_max->mIgnoreRot == TRUE)
1229 {
1230 ki_max->mIgnoreRot = FALSE;
1231 joint->mNumRotKeys++;
1232 }
1233 diff_max = 0;
1234 }
1235 }
1236 else
1237 {
1238 // This keyframe isn't significant enough, throw it away.
1239 ki_prev->mIgnoreRot = TRUE;
1240 numRotFramesConsidered++;
1241 // Store away the keyframe that has the largest deviation from the interpolated line, for insertion later.
1242 if (rot_test > diff_max)
1243 {
1244 diff_max = rot_test;
1245 ki_max = ki;
1246 }
1220 } 1247 }
1221 } 1248 }
1222 1249
diff --git a/linden/indra/llcharacter/lleditingmotion.cpp b/linden/indra/llcharacter/lleditingmotion.cpp
index b7539ee..3590097 100644
--- a/linden/indra/llcharacter/lleditingmotion.cpp
+++ b/linden/indra/llcharacter/lleditingmotion.cpp
@@ -190,7 +190,7 @@ BOOL LLEditingMotion::onUpdate(F32 time, U8* joint_mask)
190 { 190 {
191 LLVector3 tmp = mCharacter->getCharacterPosition() ; 191 LLVector3 tmp = mCharacter->getCharacterPosition() ;
192 llerrs << "Non finite focus point in editing motion. focus point: " << focus_pt << " and character position: " << 192 llerrs << "Non finite focus point in editing motion. focus point: " << focus_pt << " and character position: " <<
193 tmp << " and pointAtPt: " << pointAtPt << llendl; 193 tmp << " and pointAtPt: " << *pointAtPt << llendl;
194 } 194 }
195 195
196 // propagate joint positions to kinematic chain 196 // propagate joint positions to kinematic chain
@@ -226,7 +226,7 @@ BOOL LLEditingMotion::onUpdate(F32 time, U8* joint_mask)
226 if (!target.isFinite()) 226 if (!target.isFinite())
227 { 227 {
228 llerrs << "Non finite target in editing motion with target distance of " << target_dist << 228 llerrs << "Non finite target in editing motion with target distance of " << target_dist <<
229 " and focus point " << focus_pt << " and pointAtPt: " << pointAtPt << llendl; 229 " and focus point " << focus_pt << " and pointAtPt: " << *pointAtPt << llendl;
230 } 230 }
231 231
232 mTarget.setPosition( target + mParentJoint.getPosition()); 232 mTarget.setPosition( target + mParentJoint.getPosition());
diff --git a/linden/indra/llcharacter/llmotioncontroller.cpp b/linden/indra/llcharacter/llmotioncontroller.cpp
index 90a3d74..fadf1a5 100644
--- a/linden/indra/llcharacter/llmotioncontroller.cpp
+++ b/linden/indra/llcharacter/llmotioncontroller.cpp
@@ -783,6 +783,11 @@ void LLMotionController::updateLoadingMotions()
783 llinfos << "Motion " << motionp->getID() << " init failed." << llendl; 783 llinfos << "Motion " << motionp->getID() << " init failed." << llendl;
784 sRegistry.markBad(motionp->getID()); 784 sRegistry.markBad(motionp->getID());
785 mLoadingMotions.erase(curiter); 785 mLoadingMotions.erase(curiter);
786 motion_set_t::iterator found_it = mDeprecatedMotions.find(motionp);
787 if (found_it != mDeprecatedMotions.end())
788 {
789 mDeprecatedMotions.erase(found_it);
790 }
786 mAllMotions.erase(motionp->getID()); 791 mAllMotions.erase(motionp->getID());
787 delete motionp; 792 delete motionp;
788 } 793 }
diff --git a/linden/indra/llcommon/CMakeLists.txt b/linden/indra/llcommon/CMakeLists.txt
index 8810549..4001e1f 100644
--- a/linden/indra/llcommon/CMakeLists.txt
+++ b/linden/indra/llcommon/CMakeLists.txt
@@ -187,3 +187,10 @@ set_source_files_properties(${llcommon_HEADER_FILES}
187list(APPEND llcommon_SOURCE_FILES ${llcommon_HEADER_FILES}) 187list(APPEND llcommon_SOURCE_FILES ${llcommon_HEADER_FILES})
188 188
189add_library (llcommon ${llcommon_SOURCE_FILES}) 189add_library (llcommon ${llcommon_SOURCE_FILES})
190target_link_libraries(
191 llcommon
192 ${APRUTIL_LIBRARIES}
193 ${APR_LIBRARIES}
194 ${EXPAT_LIBRARIES}
195 ${ZLIB_LIBRARIES}
196 )
diff --git a/linden/indra/llcommon/indra_constants.h b/linden/indra/llcommon/indra_constants.h
index 1c48a5c..fcb2aaf 100644
--- a/linden/indra/llcommon/indra_constants.h
+++ b/linden/indra/llcommon/indra_constants.h
@@ -251,6 +251,7 @@ const U8 GOD_NOT = 0;
251const LLUUID LL_UUID_ALL_AGENTS("44e87126-e794-4ded-05b3-7c42da3d5cdb"); 251const LLUUID LL_UUID_ALL_AGENTS("44e87126-e794-4ded-05b3-7c42da3d5cdb");
252 252
253// Governor Linden's agent id. 253// Governor Linden's agent id.
254const LLUUID ALEXANDRIA_LINDEN_ID("ba2a564a-f0f1-4b82-9c61-b7520bfcd09f");
254const LLUUID GOVERNOR_LINDEN_ID("3d6181b0-6a4b-97ef-18d8-722652995cf1"); 255const LLUUID GOVERNOR_LINDEN_ID("3d6181b0-6a4b-97ef-18d8-722652995cf1");
255const LLUUID REALESTATE_LINDEN_ID("3d6181b0-6a4b-97ef-18d8-722652995cf1"); 256const LLUUID REALESTATE_LINDEN_ID("3d6181b0-6a4b-97ef-18d8-722652995cf1");
256// Maintenance's group id. 257// Maintenance's group id.
diff --git a/linden/indra/llcommon/llcommon.cpp b/linden/indra/llcommon/llcommon.cpp
index b21b687..cdaa7f9 100644
--- a/linden/indra/llcommon/llcommon.cpp
+++ b/linden/indra/llcommon/llcommon.cpp
@@ -46,7 +46,7 @@ void LLCommon::initClass()
46 sAprInitialized = TRUE; 46 sAprInitialized = TRUE;
47 } 47 }
48 LLTimer::initClass(); 48 LLTimer::initClass();
49 LLThreadSafeRefCount::initClass(); 49 LLThreadSafeRefCount::initThreadSafeRefCount();
50// LLWorkerThread::initClass(); 50// LLWorkerThread::initClass();
51// LLFrameCallbackManager::initClass(); 51// LLFrameCallbackManager::initClass();
52} 52}
@@ -56,7 +56,7 @@ void LLCommon::cleanupClass()
56{ 56{
57// LLFrameCallbackManager::cleanupClass(); 57// LLFrameCallbackManager::cleanupClass();
58// LLWorkerThread::cleanupClass(); 58// LLWorkerThread::cleanupClass();
59 LLThreadSafeRefCount::cleanupClass(); 59 LLThreadSafeRefCount::cleanupThreadSafeRefCount();
60 LLTimer::cleanupClass(); 60 LLTimer::cleanupClass();
61 if (sAprInitialized) 61 if (sAprInitialized)
62 { 62 {
diff --git a/linden/indra/llcommon/llfasttimer.h b/linden/indra/llcommon/llfasttimer.h
index 8ad2667..80ed26b 100644
--- a/linden/indra/llcommon/llfasttimer.h
+++ b/linden/indra/llcommon/llfasttimer.h
@@ -165,6 +165,7 @@ public:
165 FTM_FILTER, 165 FTM_FILTER,
166 FTM_REFRESH, 166 FTM_REFRESH,
167 FTM_SORT, 167 FTM_SORT,
168 FTM_PICK,
168 169
169 // Temp 170 // Temp
170 FTM_TEMP1, 171 FTM_TEMP1,
diff --git a/linden/indra/llcommon/llfindlocale.cpp b/linden/indra/llcommon/llfindlocale.cpp
index 47da974..344041c 100644
--- a/linden/indra/llcommon/llfindlocale.cpp
+++ b/linden/indra/llcommon/llfindlocale.cpp
@@ -180,10 +180,10 @@ canonise_fl(FL_Locale *l) {
180#define ML(pn,sn) MAKELANGID(LANG_##pn, SUBLANG_##pn##_##sn) 180#define ML(pn,sn) MAKELANGID(LANG_##pn, SUBLANG_##pn##_##sn)
181#define MLN(pn) MAKELANGID(LANG_##pn, SUBLANG_DEFAULT) 181#define MLN(pn) MAKELANGID(LANG_##pn, SUBLANG_DEFAULT)
182#define RML(pn,sn) MAKELANGID(LANG_##pn, SUBLANG_##sn) 182#define RML(pn,sn) MAKELANGID(LANG_##pn, SUBLANG_##sn)
183typedef struct { 183struct IDToCode {
184 LANGID id; 184 LANGID id;
185 char* code; 185 char* code;
186} IDToCode; 186};
187static const IDToCode both_to_code[] = { 187static const IDToCode both_to_code[] = {
188 {ML(ENGLISH,US), "en_US.ISO_8859-1"}, 188 {ML(ENGLISH,US), "en_US.ISO_8859-1"},
189 {ML(ENGLISH,CAN), "en_CA"}, /* english / canadian */ 189 {ML(ENGLISH,CAN), "en_CA"}, /* english / canadian */
diff --git a/linden/indra/llcommon/llfindlocale.h b/linden/indra/llcommon/llfindlocale.h
index 6cc2dbb..bc253c3 100644
--- a/linden/indra/llcommon/llfindlocale.h
+++ b/linden/indra/llcommon/llfindlocale.h
@@ -36,11 +36,11 @@ typedef const char* FL_Lang;
36typedef const char* FL_Country; 36typedef const char* FL_Country;
37typedef const char* FL_Variant; 37typedef const char* FL_Variant;
38 38
39typedef struct { 39struct FL_Locale {
40 FL_Lang lang; 40 FL_Lang lang;
41 FL_Country country; 41 FL_Country country;
42 FL_Variant variant; 42 FL_Variant variant;
43} FL_Locale; 43};
44 44
45typedef enum { 45typedef enum {
46 /* for some reason we failed to even guess: this should never happen */ 46 /* for some reason we failed to even guess: this should never happen */
diff --git a/linden/indra/llcommon/llkeythrottle.h b/linden/indra/llcommon/llkeythrottle.h
index eb1519a..25d0fe0 100644
--- a/linden/indra/llcommon/llkeythrottle.h
+++ b/linden/indra/llcommon/llkeythrottle.h
@@ -243,7 +243,7 @@ public:
243 } 243 }
244 244
245 // Set the throttling behavior 245 // Set the throttling behavior
246 void setParameters( U32 limit, F32 interval, BOOL realtime ) 246 void setParameters( U32 limit, F32 interval, BOOL realtime = TRUE )
247 { 247 {
248 // limit is the maximum number of keys 248 // limit is the maximum number of keys
249 // allowed per interval (in seconds or frames) 249 // allowed per interval (in seconds or frames)
diff --git a/linden/indra/llcommon/llprocessor.h b/linden/indra/llcommon/llprocessor.h
index 6abbd96..06dc72a 100644
--- a/linden/indra/llcommon/llprocessor.h
+++ b/linden/indra/llcommon/llprocessor.h
@@ -58,7 +58,7 @@
58#endif 58#endif
59 59
60 60
61typedef struct ProcessorExtensions 61struct ProcessorExtensions
62{ 62{
63 bool FPU_FloatingPointUnit; 63 bool FPU_FloatingPointUnit;
64 bool VME_Virtual8086ModeEnhancements; 64 bool VME_Virtual8086ModeEnhancements;
@@ -97,9 +97,9 @@ typedef struct ProcessorExtensions
97 bool _3DNOW_InstructionExtensions; 97 bool _3DNOW_InstructionExtensions;
98 bool _E3DNOW_InstructionExtensions; 98 bool _E3DNOW_InstructionExtensions;
99 bool AA64_AMD64BitArchitecture; 99 bool AA64_AMD64BitArchitecture;
100} ProcessorExtensions; 100};
101 101
102typedef struct ProcessorCache 102struct ProcessorCache
103{ 103{
104 bool bPresent; 104 bool bPresent;
105 char strSize[32]; /* Flawfinder: ignore */ 105 char strSize[32]; /* Flawfinder: ignore */
@@ -107,24 +107,24 @@ typedef struct ProcessorCache
107 unsigned int uiLineSize; 107 unsigned int uiLineSize;
108 bool bSectored; 108 bool bSectored;
109 char strCache[128]; /* Flawfinder: ignore */ 109 char strCache[128]; /* Flawfinder: ignore */
110} ProcessorCache; 110};
111 111
112typedef struct ProcessorL1Cache 112struct ProcessorL1Cache
113{ 113{
114 ProcessorCache Instruction; 114 ProcessorCache Instruction;
115 ProcessorCache Data; 115 ProcessorCache Data;
116} ProcessorL1Cache; 116};
117 117
118typedef struct ProcessorTLB 118struct ProcessorTLB
119{ 119{
120 bool bPresent; 120 bool bPresent;
121 char strPageSize[32]; /* Flawfinder: ignore */ 121 char strPageSize[32]; /* Flawfinder: ignore */
122 unsigned int uiAssociativeWays; 122 unsigned int uiAssociativeWays;
123 unsigned int uiEntries; 123 unsigned int uiEntries;
124 char strTLB[128]; /* Flawfinder: ignore */ 124 char strTLB[128]; /* Flawfinder: ignore */
125} ProcessorTLB; 125};
126 126
127typedef struct ProcessorInfo 127struct ProcessorInfo
128{ 128{
129 char strVendor[16]; /* Flawfinder: ignore */ 129 char strVendor[16]; /* Flawfinder: ignore */
130 unsigned int uiFamily; 130 unsigned int uiFamily;
@@ -148,7 +148,7 @@ typedef struct ProcessorInfo
148 ProcessorCache _Trace; 148 ProcessorCache _Trace;
149 ProcessorTLB _Instruction; 149 ProcessorTLB _Instruction;
150 ProcessorTLB _Data; 150 ProcessorTLB _Data;
151} ProcessorInfo; 151};
152 152
153 153
154// CProcessor 154// CProcessor
diff --git a/linden/indra/llcommon/llsdserialize.cpp b/linden/indra/llcommon/llsdserialize.cpp
index d42842d..f21ff68 100644
--- a/linden/indra/llcommon/llsdserialize.cpp
+++ b/linden/indra/llcommon/llsdserialize.cpp
@@ -324,7 +324,7 @@ S32 LLSDParser::parse(std::istream& istr, LLSD& data, S32 max_bytes)
324S32 LLSDParser::parseLines(std::istream& istr, LLSD& data) 324S32 LLSDParser::parseLines(std::istream& istr, LLSD& data)
325{ 325{
326 mCheckLimits = false; 326 mCheckLimits = false;
327 mParseLines = false; // was true, Emergency fix DEV-17785 parsing newline failure 327 mParseLines = true;
328 return doParse(istr, data); 328 return doParse(istr, data);
329} 329}
330 330
diff --git a/linden/indra/llcommon/llsdserialize_xml.cpp b/linden/indra/llcommon/llsdserialize_xml.cpp
index 690ab67..9c3f85e 100644
--- a/linden/indra/llcommon/llsdserialize_xml.cpp
+++ b/linden/indra/llcommon/llsdserialize_xml.cpp
@@ -461,11 +461,11 @@ S32 LLSDXMLParser::Impl::parseLines(std::istream& input, LLSD& data)
461 input.clear(); 461 input.clear();
462 } 462 }
463 463
464 // Don't parse the NULL at the end which might be added if \n was absorbed by getline() 464 // Re-insert with the \n that was absorbed by getline()
465 char * text = (char *) buffer; 465 char * text = (char *) buffer;
466 if ( text[num_read - 1] == 0) 466 if ( text[num_read - 1] == 0)
467 { 467 {
468 num_read--; 468 text[num_read - 1] = '\n';
469 } 469 }
470 } 470 }
471 471
@@ -808,12 +808,11 @@ void LLSDXMLParser::parsePart(const char *buf, int len)
808// virtual 808// virtual
809S32 LLSDXMLParser::doParse(std::istream& input, LLSD& data) const 809S32 LLSDXMLParser::doParse(std::istream& input, LLSD& data) const
810{ 810{
811// Remove code - emergency fix DEV-17785 parsing newline failure 811 if (mParseLines)
812// if (mParseLines) 812 {
813// {
814 // Use line-based reading (faster code) 813 // Use line-based reading (faster code)
815// return impl.parseLines(input, data); 814 return impl.parseLines(input, data);
816// } 815 }
817 816
818 return impl.parse(input, data); 817 return impl.parse(input, data);
819} 818}
diff --git a/linden/indra/llcommon/llstat.cpp b/linden/indra/llcommon/llstat.cpp
index 4b79fcb..706acdb 100644
--- a/linden/indra/llcommon/llstat.cpp
+++ b/linden/indra/llcommon/llstat.cpp
@@ -31,55 +31,288 @@
31#include "linden_common.h" 31#include "linden_common.h"
32 32
33#include "llstat.h" 33#include "llstat.h"
34#include "lllivefile.h"
35#include "llerrorcontrol.h"
34#include "llframetimer.h" 36#include "llframetimer.h"
35#include "timing.h" 37#include "timing.h"
38#include "llsd.h"
39#include "llsdserialize.h"
40#include "llstl.h"
41#include "u64.h"
36 42
37class LLStatAccum::impl 43
44// statics
45BOOL LLPerfBlock::sStatsEnabled = FALSE; // Flag for detailed information
46LLPerfBlock::stat_map_t LLPerfBlock::sStatMap; // Map full path string to LLStatTime objects, tracks all active objects
47std::string LLPerfBlock::sCurrentStatPath = ""; // Something like "/total_time/physics/physics step"
48
49//------------------------------------------------------------------------
50// Live config file to trigger stats logging
51static const char STATS_CONFIG_FILE_NAME[] = "/dev/shm/simperf/simperf_proc_config.llsd";
52static const F32 STATS_CONFIG_REFRESH_RATE = 5.0; // seconds
53
54class LLStatsConfigFile : public LLLiveFile
38{ 55{
39public: 56public:
40 static const TimeScale IMPL_NUM_SCALES = (TimeScale)(SCALE_TWO_MINUTE + 1); 57 LLStatsConfigFile()
41 static U64 sScaleTimes[IMPL_NUM_SCALES]; 58 : LLLiveFile(filename(), STATS_CONFIG_REFRESH_RATE),
59 mChanged(false), mStatsp(NULL) { }
42 60
43 BOOL mUseFrameTimer; 61 static std::string filename();
62
63protected:
64 /* virtual */ void loadFile();
44 65
45 BOOL mRunning; 66public:
46 U64 mLastTime; 67 void init(LLPerfStats* statsp);
47 68 static LLStatsConfigFile& instance();
48 struct Bucket 69 // return the singleton stats config file
49 {
50 F64 accum;
51 U64 endTime;
52 70
53 BOOL lastValid; 71 bool mChanged;
54 F64 lastAccum;
55 };
56 72
57 Bucket mBuckets[IMPL_NUM_SCALES]; 73protected:
74 LLPerfStats* mStatsp;
75};
58 76
59 BOOL mLastSampleValid; 77std::string LLStatsConfigFile::filename()
60 F64 mLastSampleValue; 78{
79 return STATS_CONFIG_FILE_NAME;
80}
61 81
82void LLStatsConfigFile::init(LLPerfStats* statsp)
83{
84 mStatsp = statsp;
85}
62 86
63 impl(bool useFrameTimer); 87LLStatsConfigFile& LLStatsConfigFile::instance()
88{
89 static LLStatsConfigFile the_file;
90 return the_file;
91}
64 92
65 void reset(U64 when);
66 93
67 void sum(F64 value); 94/* virtual */
68 void sum(F64 value, U64 when); 95// Load and parse the stats configuration file
96void LLStatsConfigFile::loadFile()
97{
98 if (!mStatsp)
99 {
100 llwarns << "Tries to load performance configure file without initializing LPerfStats" << llendl;
101 return;
102 }
103 mChanged = true;
104
105 LLSD stats_config;
106 {
107 llifstream file(filename().c_str());
108 if (file.is_open())
109 {
110 LLSDSerialize::fromXML(stats_config, file);
111 if (stats_config.isUndefined())
112 {
113 llinfos << "Performance statistics configuration file ill-formed, not recording statistics" << llendl;
114 mStatsp->setReportPerformanceDuration( 0.f );
115 return;
116 }
117 }
118 else
119 { // File went away, turn off stats if it was on
120 if ( mStatsp->frameStatsIsRunning() )
121 {
122 llinfos << "Performance statistics configuration file deleted, not recording statistics" << llendl;
123 mStatsp->setReportPerformanceDuration( 0.f );
124 }
125 return;
126 }
127 }
128
129 F32 duration = 0.f;
130 F32 interval = 0.f;
131
132 const char * w = "duration";
133 if (stats_config.has(w))
134 {
135 duration = (F32)stats_config[w].asReal();
136 }
137 w = "interval";
138 if (stats_config.has(w))
139 {
140 interval = (F32)stats_config[w].asReal();
141 }
142
143 mStatsp->setReportPerformanceDuration( duration );
144 mStatsp->setReportPerformanceInterval( interval );
145
146 if ( duration > 0 )
147 {
148 if ( interval == 0.f )
149 {
150 llinfos << "Recording performance stats every frame for " << duration << " sec" << llendl;
151 }
152 else
153 {
154 llinfos << "Recording performance stats every " << interval << " seconds for " << duration << " seconds" << llendl;
155 }
156 }
157 else
158 {
159 llinfos << "Performance stats recording turned off" << llendl;
160 }
161}
69 162
70 F32 meanValue(TimeScale scale) const;
71 163
72 U64 getCurrentUsecs() const; 164//------------------------------------------------------------------------
73 // Get current microseconds based on timer type
74};
75 165
166LLPerfStats::LLPerfStats(const std::string& process_name, S32 process_pid) :
167 mFrameStatsFileFailure(FALSE),
168 mSkipFirstFrameStats(FALSE),
169 mProcessName(process_name),
170 mProcessPID(process_pid),
171 mReportPerformanceStatInterval(1.f),
172 mReportPerformanceStatEnd(0.0)
173{ }
76 174
77U64 LLStatAccum::impl::sScaleTimes[IMPL_NUM_SCALES] = 175LLPerfStats::~LLPerfStats()
176{
177 LLPerfBlock::clearDynamicStats();
178 mFrameStatsFile.close();
179}
180
181void LLPerfStats::init()
182{
183 // Initialize the stats config file instance.
184 (void) LLStatsConfigFile::instance().init(this);
185 (void) LLStatsConfigFile::instance().checkAndReload();
186}
187
188// Open file for statistics
189void LLPerfStats::openPerfStatsFile()
190{
191 if ( !mFrameStatsFile
192 && !mFrameStatsFileFailure )
193 {
194 std::string stats_file = llformat("/dev/shm/simperf/%s_proc.%d.llsd", mProcessName.c_str(), mProcessPID);
195 mFrameStatsFile.close();
196 mFrameStatsFile.clear();
197 mFrameStatsFile.open(stats_file, llofstream::out);
198 if ( mFrameStatsFile.fail() )
199 {
200 llinfos << "Error opening statistics log file " << stats_file << llendl;
201 mFrameStatsFileFailure = TRUE;
202 }
203 else
204 {
205 LLSD process_info = LLSD::emptyMap();
206 process_info["name"] = mProcessName;
207 process_info["pid"] = (LLSD::Integer) mProcessPID;
208 process_info["stat_rate"] = (LLSD::Integer) mReportPerformanceStatInterval;
209 // Add process-specific info.
210 addProcessHeaderInfo(process_info);
211
212 mFrameStatsFile << LLSDNotationStreamer(process_info) << std::endl;
213 }
214 }
215}
216
217// Dump out performance metrics over some time interval
218void LLPerfStats::dumpIntervalPerformanceStats()
219{
220 // Ensure output file is OK
221 openPerfStatsFile();
222
223 if ( mFrameStatsFile )
224 {
225 LLSD stats = LLSD::emptyMap();
226
227 LLStatAccum::TimeScale scale;
228 if ( getReportPerformanceInterval() == 0.f )
229 {
230 scale = LLStatAccum::SCALE_PER_FRAME;
231 }
232 else if ( getReportPerformanceInterval() < 0.5f )
233 {
234 scale = LLStatAccum::SCALE_100MS;
235 }
236 else
237 {
238 scale = LLStatAccum::SCALE_SECOND;
239 }
240
241 // Write LLSD into log
242 stats["utc_time"] = (LLSD::String) LLError::utcTime();
243 stats["timestamp"] = U64_to_str((totalTime() / 1000) + (gUTCOffset * 1000)); // milliseconds since epoch
244 stats["frame_number"] = (LLSD::Integer) LLFrameTimer::getFrameCount();
245
246 // Add process-specific frame info.
247 addProcessFrameInfo(stats, scale);
248 LLPerfBlock::addStatsToLLSDandReset( stats, scale );
249
250 mFrameStatsFile << LLSDNotationStreamer(stats) << std::endl;
251 }
252}
253
254// Set length of performance stat recording
255void LLPerfStats::setReportPerformanceDuration( F32 seconds )
256{
257 if ( seconds <= 0.f )
258 {
259 mReportPerformanceStatEnd = 0.0;
260 LLPerfBlock::setStatsEnabled( FALSE );
261 mFrameStatsFile.close();
262 LLPerfBlock::clearDynamicStats();
263 }
264 else
265 {
266 mReportPerformanceStatEnd = LLFrameTimer::getElapsedSeconds() + ((F64) seconds);
267 // Clear failure flag to try and create the log file once
268 mFrameStatsFileFailure = FALSE;
269 LLPerfBlock::setStatsEnabled( TRUE );
270 mSkipFirstFrameStats = TRUE; // Skip the first report (at the end of this frame)
271 }
272}
273
274void LLPerfStats::updatePerFrameStats()
275{
276 (void) LLStatsConfigFile::instance().checkAndReload();
277 static LLFrameTimer performance_stats_timer;
278 if ( frameStatsIsRunning() )
279 {
280 if ( mReportPerformanceStatInterval == 0 )
281 { // Record info every frame
282 if ( mSkipFirstFrameStats )
283 { // Skip the first time - was started this frame
284 mSkipFirstFrameStats = FALSE;
285 }
286 else
287 {
288 dumpIntervalPerformanceStats();
289 }
290 }
291 else
292 {
293 performance_stats_timer.setTimerExpirySec( getReportPerformanceInterval() );
294 if (performance_stats_timer.checkExpirationAndReset( mReportPerformanceStatInterval ))
295 {
296 dumpIntervalPerformanceStats();
297 }
298 }
299
300 if ( LLFrameTimer::getElapsedSeconds() > mReportPerformanceStatEnd )
301 { // Reached end of time, clear it to stop reporting
302 setReportPerformanceDuration(0.f); // Don't set mReportPerformanceStatEnd directly
303 llinfos << "Recording performance stats completed" << llendl;
304 }
305 }
306}
307
308
309//------------------------------------------------------------------------
310
311U64 LLStatAccum::sScaleTimes[NUM_SCALES] =
78{ 312{
79 USEC_PER_SEC / 10, // 100 millisec 313 USEC_PER_SEC / 10, // 100 millisec
80 USEC_PER_SEC * 1, // seconds 314 USEC_PER_SEC * 1, // seconds
81 USEC_PER_SEC * 60, // minutes 315 USEC_PER_SEC * 60, // minutes
82 USEC_PER_SEC * 60 * 2 // two minutes
83#if ENABLE_LONG_TIME_STATS 316#if ENABLE_LONG_TIME_STATS
84 // enable these when more time scales are desired 317 // enable these when more time scales are desired
85 USEC_PER_SEC * 60*60, // hours 318 USEC_PER_SEC * 60*60, // hours
@@ -89,19 +322,27 @@ U64 LLStatAccum::impl::sScaleTimes[IMPL_NUM_SCALES] =
89}; 322};
90 323
91 324
92LLStatAccum::impl::impl(bool useFrameTimer) 325
326LLStatAccum::LLStatAccum(bool useFrameTimer)
327 : mUseFrameTimer(useFrameTimer),
328 mRunning(FALSE),
329 mLastSampleValue(0.0),
330 mLastSampleValid(FALSE)
331{
332}
333
334LLStatAccum::~LLStatAccum()
93{ 335{
94 mUseFrameTimer = useFrameTimer;
95 mRunning = FALSE;
96 mLastSampleValid = FALSE;
97} 336}
98 337
99void LLStatAccum::impl::reset(U64 when) 338
339
340void LLStatAccum::reset(U64 when)
100{ 341{
101 mRunning = TRUE; 342 mRunning = TRUE;
102 mLastTime = when; 343 mLastTime = when;
103 344
104 for (int i = 0; i < IMPL_NUM_SCALES; ++i) 345 for (int i = 0; i < NUM_SCALES; ++i)
105 { 346 {
106 mBuckets[i].accum = 0.0; 347 mBuckets[i].accum = 0.0;
107 mBuckets[i].endTime = when + sScaleTimes[i]; 348 mBuckets[i].endTime = when + sScaleTimes[i];
@@ -109,12 +350,12 @@ void LLStatAccum::impl::reset(U64 when)
109 } 350 }
110} 351}
111 352
112void LLStatAccum::impl::sum(F64 value) 353void LLStatAccum::sum(F64 value)
113{ 354{
114 sum(value, getCurrentUsecs()); 355 sum(value, getCurrentUsecs());
115} 356}
116 357
117void LLStatAccum::impl::sum(F64 value, U64 when) 358void LLStatAccum::sum(F64 value, U64 when)
118{ 359{
119 if (!mRunning) 360 if (!mRunning)
120 { 361 {
@@ -131,7 +372,10 @@ void LLStatAccum::impl::sum(F64 value, U64 when)
131 return; 372 return;
132 } 373 }
133 374
134 for (int i = 0; i < IMPL_NUM_SCALES; ++i) 375 // how long is this value for
376 U64 timeSpan = when - mLastTime;
377
378 for (int i = 0; i < NUM_SCALES; ++i)
135 { 379 {
136 Bucket& bucket = mBuckets[i]; 380 Bucket& bucket = mBuckets[i];
137 381
@@ -143,8 +387,6 @@ void LLStatAccum::impl::sum(F64 value, U64 when)
143 { 387 {
144 U64 timeScale = sScaleTimes[i]; 388 U64 timeScale = sScaleTimes[i];
145 389
146 U64 timeSpan = when - mLastTime;
147 // how long is this value for
148 U64 timeLeft = when - bucket.endTime; 390 U64 timeLeft = when - bucket.endTime;
149 // how much time is left after filling this bucket 391 // how much time is left after filling this bucket
150 392
@@ -173,13 +415,18 @@ void LLStatAccum::impl::sum(F64 value, U64 when)
173} 415}
174 416
175 417
176F32 LLStatAccum::impl::meanValue(TimeScale scale) const 418F32 LLStatAccum::meanValue(TimeScale scale) const
177{ 419{
178 if (!mRunning) 420 if (!mRunning)
179 { 421 {
180 return 0.0; 422 return 0.0;
181 } 423 }
182 if (scale < 0 || scale >= IMPL_NUM_SCALES) 424 if ( scale == SCALE_PER_FRAME )
425 { // Per-frame not supported here
426 scale = SCALE_100MS;
427 }
428
429 if (scale < 0 || scale >= NUM_SCALES)
183 { 430 {
184 llwarns << "llStatAccum::meanValue called for unsupported scale: " 431 llwarns << "llStatAccum::meanValue called for unsupported scale: "
185 << scale << llendl; 432 << scale << llendl;
@@ -209,7 +456,7 @@ F32 LLStatAccum::impl::meanValue(TimeScale scale) const
209} 456}
210 457
211 458
212U64 LLStatAccum::impl::getCurrentUsecs() const 459U64 LLStatAccum::getCurrentUsecs() const
213{ 460{
214 if (mUseFrameTimer) 461 if (mUseFrameTimer)
215 { 462 {
@@ -222,25 +469,44 @@ U64 LLStatAccum::impl::getCurrentUsecs() const
222} 469}
223 470
224 471
472// ------------------------------------------------------------------------
225 473
226 474LLStatRate::LLStatRate(bool use_frame_timer)
227 475 : LLStatAccum(use_frame_timer)
228LLStatAccum::LLStatAccum(bool useFrameTimer)
229 : m(* new impl(useFrameTimer))
230{ 476{
231} 477}
232 478
233LLStatAccum::~LLStatAccum() 479void LLStatRate::count(U32 value)
234{ 480{
235 delete &m; 481 sum((F64)value * sScaleTimes[SCALE_SECOND]);
236} 482}
237 483
238F32 LLStatAccum::meanValue(TimeScale scale) const 484
239{ 485void LLStatRate::mark()
240 return m.meanValue(scale); 486 {
241} 487 // Effectively the same as count(1), but sets mLastSampleValue
488 U64 when = getCurrentUsecs();
489
490 if ( mRunning
491 && (when > mLastTime) )
492 { // Set mLastSampleValue to the time from the last mark()
493 F64 duration = ((F64)(when - mLastTime)) / sScaleTimes[SCALE_SECOND];
494 if ( duration > 0.0 )
495 {
496 mLastSampleValue = 1.0 / duration;
497 }
498 else
499 {
500 mLastSampleValue = 0.0;
501 }
502 }
503
504 sum( (F64) sScaleTimes[SCALE_SECOND], when);
505 }
242 506
243 507
508// ------------------------------------------------------------------------
509
244 510
245LLStatMeasure::LLStatMeasure(bool use_frame_timer) 511LLStatMeasure::LLStatMeasure(bool use_frame_timer)
246 : LLStatAccum(use_frame_timer) 512 : LLStatAccum(use_frame_timer)
@@ -249,53 +515,209 @@ LLStatMeasure::LLStatMeasure(bool use_frame_timer)
249 515
250void LLStatMeasure::sample(F64 value) 516void LLStatMeasure::sample(F64 value)
251{ 517{
252 U64 when = m.getCurrentUsecs(); 518 U64 when = getCurrentUsecs();
253 519
254 if (m.mLastSampleValid) 520 if (mLastSampleValid)
255 { 521 {
256 F64 avgValue = (value + m.mLastSampleValue) / 2.0; 522 F64 avgValue = (value + mLastSampleValue) / 2.0;
257 F64 interval = (F64)(when - m.mLastTime); 523 F64 interval = (F64)(when - mLastTime);
258 524
259 m.sum(avgValue * interval, when); 525 sum(avgValue * interval, when);
260 } 526 }
261 else 527 else
262 { 528 {
263 m.reset(when); 529 reset(when);
264 } 530 }
265 531
266 m.mLastSampleValid = TRUE; 532 mLastSampleValid = TRUE;
267 m.mLastSampleValue = value; 533 mLastSampleValue = value;
268} 534}
269 535
270 536
271LLStatRate::LLStatRate(bool use_frame_timer) 537// ------------------------------------------------------------------------
272 : LLStatAccum(use_frame_timer) 538
539LLStatTime::LLStatTime(const std::string & key)
540 : LLStatAccum(false),
541 mFrameNumber(LLFrameTimer::getFrameCount()),
542 mTotalTimeInFrame(0),
543 mKey(key)
544#if LL_DEBUG
545 , mRunning(FALSE)
546#endif
273{ 547{
274} 548}
275 549
276void LLStatRate::count(U32 value) 550void LLStatTime::start()
551{
552 // Reset frame accumluation if the frame number has changed
553 U32 frame_number = LLFrameTimer::getFrameCount();
554 if ( frame_number != mFrameNumber )
555 {
556 mFrameNumber = frame_number;
557 mTotalTimeInFrame = 0;
558 }
559
560 sum(0.0);
561
562#if LL_DEBUG
563 // Shouldn't be running already
564 llassert( !mRunning );
565 mRunning = TRUE;
566#endif
567}
568
569void LLStatTime::stop()
570{
571 U64 end_time = getCurrentUsecs();
572 U64 duration = end_time - mLastTime;
573 sum(F64(duration), end_time);
574 //llinfos << "mTotalTimeInFrame incremented from " << mTotalTimeInFrame << " to " << (mTotalTimeInFrame + duration) << llendl;
575 mTotalTimeInFrame += duration;
576
577#if LL_DEBUG
578 mRunning = FALSE;
579#endif
580}
581
582/* virtual */ F32 LLStatTime::meanValue(TimeScale scale) const
277{ 583{
278 m.sum((F64)value * impl::sScaleTimes[SCALE_SECOND]); 584 if ( LLStatAccum::SCALE_PER_FRAME == scale )
585 {
586 return mTotalTimeInFrame;
587 }
588 else
589 {
590 return LLStatAccum::meanValue(scale);
591 }
279} 592}
280 593
281 594
282LLStatTime::LLStatTime(bool use_frame_timer) 595// ------------------------------------------------------------------------
283 : LLStatAccum(use_frame_timer) 596
597
598// Use this constructor for pre-defined LLStatTime objects
599LLPerfBlock::LLPerfBlock(LLStatTime* stat ) : mPredefinedStat(stat), mDynamicStat(NULL)
284{ 600{
601 if (mPredefinedStat)
602 {
603 // If dynamic stats are turned on, this will create a separate entry in the stat map.
604 initDynamicStat(mPredefinedStat->mKey);
605
606 // Start predefined stats. These stats are not part of the stat map.
607 mPredefinedStat->start();
608 }
285} 609}
286 610
287void LLStatTime::start() 611// Use this constructor for dynamically created LLStatTime objects (not pre-defined) with a multi-part key.
612// These are also turned on or off via the switch passed in
613LLPerfBlock::LLPerfBlock( const char* key1, const char* key2 ) : mPredefinedStat(NULL), mDynamicStat(NULL)
288{ 614{
289 m.sum(0.0); 615 if (!sStatsEnabled) return;
616
617 if (NULL == key2 || strlen(key2) == 0)
618 {
619 initDynamicStat(key1);
620 }
621 else
622 {
623 std::ostringstream key;
624 key << key1 << "_" << key2;
625 initDynamicStat(key.str());
626 }
290} 627}
291 628
292void LLStatTime::stop() 629void LLPerfBlock::initDynamicStat(const std::string& key)
630{
631 // Early exit if dynamic stats aren't enabled.
632 if (!sStatsEnabled) return;
633
634 mLastPath = sCurrentStatPath; // Save and restore current path
635 sCurrentStatPath += "/" + key; // Add key to current path
636
637 // See if the LLStatTime object already exists
638 stat_map_t::iterator iter = sStatMap.find(sCurrentStatPath);
639 if ( iter == sStatMap.end() )
640 {
641 // StatEntry object doesn't exist, so create it
642 mDynamicStat = new StatEntry( key );
643 sStatMap[ sCurrentStatPath ] = mDynamicStat; // Set the entry for this path
644 }
645 else
646 {
647 // Found this path in the map, use the object there
648 mDynamicStat = (*iter).second; // Get StatEntry for the current path
649 }
650
651 if (mDynamicStat)
652 {
653 mDynamicStat->mStat.start();
654 mDynamicStat->mCount++;
655 }
656 else
657 {
658 llwarns << "Initialized NULL dynamic stat at '" << sCurrentStatPath << "'" << llendl;
659 sCurrentStatPath = mLastPath;
660 }
661}
662
663
664// Destructor does the time accounting
665LLPerfBlock::~LLPerfBlock()
666{
667 if (mPredefinedStat) mPredefinedStat->stop();
668 if (mDynamicStat)
669 {
670 mDynamicStat->mStat.stop();
671 sCurrentStatPath = mLastPath; // Restore the path in case sStatsEnabled changed during this block
672 }
673}
674
675
676// Clear the map of any dynamic stats. Static routine
677void LLPerfBlock::clearDynamicStats()
678{
679 std::for_each(sStatMap.begin(), sStatMap.end(), DeletePairedPointer());
680 sStatMap.clear();
681}
682
683// static - Extract the stat info into LLSD
684void LLPerfBlock::addStatsToLLSDandReset( LLSD & stats,
685 LLStatAccum::TimeScale scale )
293{ 686{
294 U64 endTime = m.getCurrentUsecs(); 687 // If we aren't in per-frame scale, we need to go from second to microsecond.
295 m.sum((F64)(endTime - m.mLastTime), endTime); 688 U32 scale_adjustment = 1;
689 if (LLStatAccum::SCALE_PER_FRAME != scale)
690 {
691 scale_adjustment = USEC_PER_SEC;
692 }
693 stat_map_t::iterator iter = sStatMap.begin();
694 for ( ; iter != sStatMap.end(); ++iter )
695 { // Put the entry into LLSD "/full/path/to/stat/" = microsecond total time
696 const std::string & stats_full_path = (*iter).first;
697
698 StatEntry * stat = (*iter).second;
699 if (stat)
700 {
701 if (stat->mCount > 0)
702 {
703 stats[stats_full_path] = LLSD::emptyMap();
704 stats[stats_full_path]["us"] = (LLSD::Integer) (scale_adjustment * stat->mStat.meanValue(scale));
705 if (stat->mCount > 1)
706 {
707 stats[stats_full_path]["count"] = (LLSD::Integer) stat->mCount;
708 }
709 stat->mCount = 0;
710 }
711 }
712 else
713 { // WTF? Shouldn't have a NULL pointer in the map.
714 llwarns << "Unexpected NULL dynamic stat at '" << stats_full_path << "'" << llendl;
715 }
716 }
296} 717}
297 718
298 719
720// ------------------------------------------------------------------------
299 721
300LLTimer LLStat::sTimer; 722LLTimer LLStat::sTimer;
301LLFrameTimer LLStat::sFrameTimer; 723LLFrameTimer LLStat::sFrameTimer;
diff --git a/linden/indra/llcommon/llstat.h b/linden/indra/llcommon/llstat.h
index 0a7e014..63813e2 100644
--- a/linden/indra/llcommon/llstat.h
+++ b/linden/indra/llcommon/llstat.h
@@ -33,9 +33,13 @@
33#define LL_LLSTAT_H 33#define LL_LLSTAT_H
34 34
35#include <deque> 35#include <deque>
36#include <map>
36 37
37#include "lltimer.h" 38#include "lltimer.h"
38#include "llframetimer.h" 39#include "llframetimer.h"
40#include "llfile.h"
41
42class LLSD;
39 43
40// Set this if longer stats are needed 44// Set this if longer stats are needed
41#define ENABLE_LONG_TIME_STATS 0 45#define ENABLE_LONG_TIME_STATS 0
@@ -58,25 +62,50 @@ public:
58 SCALE_100MS, 62 SCALE_100MS,
59 SCALE_SECOND, 63 SCALE_SECOND,
60 SCALE_MINUTE, 64 SCALE_MINUTE,
61 SCALE_TWO_MINUTE,
62#if ENABLE_LONG_TIME_STATS 65#if ENABLE_LONG_TIME_STATS
63 SCALE_HOUR, 66 SCALE_HOUR,
64 SCALE_DAY, 67 SCALE_DAY,
65 SCALE_WEEK, 68 SCALE_WEEK,
66#endif 69#endif
67 NUM_SCALES 70 NUM_SCALES, // Use to size storage arrays
71 SCALE_PER_FRAME // For latest frame information - should be after NUM_SCALES since this doesn't go into the time buckets
68 }; 72 };
69 73
70 F32 meanValue(TimeScale scale) const; 74 static U64 sScaleTimes[NUM_SCALES];
75
76 virtual F32 meanValue(TimeScale scale) const;
71 // see the subclasses for the specific meaning of value 77 // see the subclasses for the specific meaning of value
72 78
73 F32 meanValueOverLast100ms() const { return meanValue(SCALE_100MS); } 79 F32 meanValueOverLast100ms() const { return meanValue(SCALE_100MS); }
74 F32 meanValueOverLastSecond() const { return meanValue(SCALE_SECOND); } 80 F32 meanValueOverLastSecond() const { return meanValue(SCALE_SECOND); }
75 F32 meanValueOverLastMinute() const { return meanValue(SCALE_MINUTE); } 81 F32 meanValueOverLastMinute() const { return meanValue(SCALE_MINUTE); }
76 82
77protected: 83 void reset(U64 when);
78 class impl; 84
79 impl& m; 85 void sum(F64 value);
86 void sum(F64 value, U64 when);
87
88 U64 getCurrentUsecs() const;
89 // Get current microseconds based on timer type
90
91 BOOL mUseFrameTimer;
92 BOOL mRunning;
93
94 U64 mLastTime;
95
96 struct Bucket
97 {
98 F64 accum;
99 U64 endTime;
100
101 BOOL lastValid;
102 F64 lastAccum;
103 };
104
105 Bucket mBuckets[NUM_SCALES];
106
107 BOOL mLastSampleValid;
108 F64 mLastSampleValue;
80}; 109};
81 110
82class LLStatMeasure : public LLStatAccum 111class LLStatMeasure : public LLStatAccum
@@ -105,39 +134,120 @@ public:
105 void count(U32); 134 void count(U32);
106 // used to note that n items have occured 135 // used to note that n items have occured
107 136
108 void mark() { count(1); } 137 void mark();
109 // used for counting the rate thorugh a point in the code 138 // used for counting the rate thorugh a point in the code
110}; 139};
111 140
112 141
113class LLTimeBlock;
114
115class LLStatTime : public LLStatAccum 142class LLStatTime : public LLStatAccum
116 // gathers statistics about time spent in a block of code 143 // gathers statistics about time spent in a block of code
117 // measure average duration per second in the block 144 // measure average duration per second in the block
118{ 145{
119public: 146public:
120 LLStatTime(bool use_frame_timer = false); 147 LLStatTime( const std::string & key = "undefined" );
148
149 U32 mFrameNumber; // Current frame number
150 U64 mTotalTimeInFrame; // Total time (microseconds) accumulated during the last frame
151
152 void setKey( const std::string & key ) { mKey = key; };
153
154 virtual F32 meanValue(TimeScale scale) const;
121 155
122private: 156private:
123 void start(); 157 void start(); // Start and stop measuring time block
124 void stop(); 158 void stop();
125 friend class LLTimeBlock; 159
160 std::string mKey; // Tag representing this time block
161
162#if LL_DEBUG
163 BOOL mRunning; // TRUE if start() has been called
164#endif
165
166 friend class LLPerfBlock;
126}; 167};
127 168
128class LLTimeBlock 169// ----------------------------------------------------------------------------
170
171
172// Use this class on the stack to record statistics about an area of code
173class LLPerfBlock
129{ 174{
130public: 175public:
131 LLTimeBlock(LLStatTime& stat) : mStat(stat) { mStat.start(); } 176 struct StatEntry
132 ~LLTimeBlock() { mStat.stop(); } 177 {
178 StatEntry(const std::string& key) : mStat(LLStatTime(key)), mCount(0) {}
179 LLStatTime mStat;
180 U32 mCount;
181 };
182 typedef std::map<std::string, StatEntry*> stat_map_t;
183
184 // Use this constructor for pre-defined LLStatTime objects
185 LLPerfBlock(LLStatTime* stat);
186
187 // Use this constructor for dynamically created LLStatTime objects (not pre-defined) with a multi-part key
188 LLPerfBlock( const char* key1, const char* key2 = NULL);
189
190
191 ~LLPerfBlock();
192
193 static void setStatsEnabled( BOOL enable ) { sStatsEnabled = enable; };
194 static S32 getStatsEnabled() { return sStatsEnabled; };
195
196 static void clearDynamicStats(); // Reset maps to clear out dynamic objects
197 static void addStatsToLLSDandReset( LLSD & stats, // Get current information and clear time bin
198 LLStatAccum::TimeScale scale );
199
133private: 200private:
134 LLStatTime& mStat; 201 // Initialize dynamically created LLStatTime objects
202 void initDynamicStat(const std::string& key);
203
204 std::string mLastPath; // Save sCurrentStatPath when this is called
205 LLStatTime * mPredefinedStat; // LLStatTime object to get data
206 StatEntry * mDynamicStat; // StatEntryobject to get data
207
208 static BOOL sStatsEnabled; // Normally FALSE
209 static stat_map_t sStatMap; // Map full path string to LLStatTime objects
210 static std::string sCurrentStatPath; // Something like "frame/physics/physics step"
135}; 211};
136 212
213// ----------------------------------------------------------------------------
137 214
215class LLPerfStats
216{
217public:
218 LLPerfStats(const std::string& process_name = "unknown", S32 process_pid = 0);
219 virtual ~LLPerfStats();
220
221 virtual void init(); // Reset and start all stat timers
222 virtual void updatePerFrameStats();
223 // Override these function to add process-specific information to the performance log header and per-frame logging.
224 virtual void addProcessHeaderInfo(LLSD& info) { /* not implemented */ }
225 virtual void addProcessFrameInfo(LLSD& info, LLStatAccum::TimeScale scale) { /* not implemented */ }
226
227 // High-resolution frame stats
228 BOOL frameStatsIsRunning() { return (mReportPerformanceStatEnd > 0.); };
229 F32 getReportPerformanceInterval() const { return mReportPerformanceStatInterval; };
230 void setReportPerformanceInterval( F32 interval ) { mReportPerformanceStatInterval = interval; };
231 void setReportPerformanceDuration( F32 seconds );
232 void setProcessName(const std::string& process_name) { mProcessName = process_name; }
233 void setProcessPID(S32 process_pid) { mProcessPID = process_pid; }
138 234
235protected:
236 void openPerfStatsFile(); // Open file for high resolution metrics logging
237 void dumpIntervalPerformanceStats();
238
239 llofstream mFrameStatsFile; // File for per-frame stats
240 BOOL mFrameStatsFileFailure; // Flag to prevent repeat opening attempts
241 BOOL mSkipFirstFrameStats; // Flag to skip one (partial) frame report
242 std::string mProcessName;
243 S32 mProcessPID;
139 244
245private:
246 F32 mReportPerformanceStatInterval; // Seconds between performance stats
247 F64 mReportPerformanceStatEnd; // End time (seconds) for performance stats
248};
140 249
250// ----------------------------------------------------------------------------
141class LLStat 251class LLStat
142{ 252{
143public: 253public:
diff --git a/linden/indra/llcommon/llstatenums.h b/linden/indra/llcommon/llstatenums.h
index 6866586..1d9b863 100644
--- a/linden/indra/llcommon/llstatenums.h
+++ b/linden/indra/llcommon/llstatenums.h
@@ -33,38 +33,41 @@
33 33
34enum 34enum
35{ 35{
36 LL_SIM_STAT_TIME_DILATION, 36 LL_SIM_STAT_TIME_DILATION, // 0
37 LL_SIM_STAT_FPS, 37 LL_SIM_STAT_FPS,
38 LL_SIM_STAT_PHYSFPS, 38 LL_SIM_STAT_PHYSFPS,
39 LL_SIM_STAT_AGENTUPS, 39 LL_SIM_STAT_AGENTUPS,
40 LL_SIM_STAT_FRAMEMS, 40 LL_SIM_STAT_FRAMEMS,
41 LL_SIM_STAT_NETMS, 41 LL_SIM_STAT_NETMS, // 5
42 LL_SIM_STAT_SIMOTHERMS, 42 LL_SIM_STAT_SIMOTHERMS,
43 LL_SIM_STAT_SIMPHYSICSMS, 43 LL_SIM_STAT_SIMPHYSICSMS,
44 LL_SIM_STAT_AGENTMS, 44 LL_SIM_STAT_AGENTMS,
45 LL_SIM_STAT_IMAGESMS, 45 LL_SIM_STAT_IMAGESMS,
46 LL_SIM_STAT_SCRIPTMS, 46 LL_SIM_STAT_SCRIPTMS, // 10
47 LL_SIM_STAT_NUMTASKS, 47 LL_SIM_STAT_NUMTASKS,
48 LL_SIM_STAT_NUMTASKSACTIVE, 48 LL_SIM_STAT_NUMTASKSACTIVE,
49 LL_SIM_STAT_NUMAGENTMAIN, 49 LL_SIM_STAT_NUMAGENTMAIN,
50 LL_SIM_STAT_NUMAGENTCHILD, 50 LL_SIM_STAT_NUMAGENTCHILD,
51 LL_SIM_STAT_NUMSCRIPTSACTIVE, 51 LL_SIM_STAT_NUMSCRIPTSACTIVE, // 15
52 LL_SIM_STAT_LSLIPS, 52 LL_SIM_STAT_LSLIPS,
53 LL_SIM_STAT_INPPS, 53 LL_SIM_STAT_INPPS,
54 LL_SIM_STAT_OUTPPS, 54 LL_SIM_STAT_OUTPPS,
55 LL_SIM_STAT_PENDING_DOWNLOADS, 55 LL_SIM_STAT_PENDING_DOWNLOADS,
56 LL_SIM_STAT_PENDING_UPLOADS, 56 LL_SIM_STAT_PENDING_UPLOADS, // 20
57 LL_SIM_STAT_VIRTUAL_SIZE_KB, 57 LL_SIM_STAT_VIRTUAL_SIZE_KB,
58 LL_SIM_STAT_RESIDENT_SIZE_KB, 58 LL_SIM_STAT_RESIDENT_SIZE_KB,
59 LL_SIM_STAT_PENDING_LOCAL_UPLOADS, 59 LL_SIM_STAT_PENDING_LOCAL_UPLOADS,
60 LL_SIM_STAT_TOTAL_UNACKED_BYTES, 60 LL_SIM_STAT_TOTAL_UNACKED_BYTES,
61 LL_SIM_STAT_PHYSICS_PINNED_TASKS, 61 LL_SIM_STAT_PHYSICS_PINNED_TASKS, // 25
62 LL_SIM_STAT_PHYSICS_LOD_TASKS, 62 LL_SIM_STAT_PHYSICS_LOD_TASKS,
63 LL_SIM_STAT_SIMPHYSICSSTEPMS, 63 LL_SIM_STAT_SIMPHYSICSSTEPMS,
64 LL_SIM_STAT_SIMPHYSICSSHAPEMS, 64 LL_SIM_STAT_SIMPHYSICSSHAPEMS,
65 LL_SIM_STAT_SIMPHYSICSOTHERMS, 65 LL_SIM_STAT_SIMPHYSICSOTHERMS,
66 LL_SIM_STAT_SIMPHYSICSMEMORY, 66 LL_SIM_STAT_SIMPHYSICSMEMORY, // 30
67 LL_SIM_STAT_SCRIPT_EPS, 67 LL_SIM_STAT_SCRIPT_EPS,
68 LL_SIM_STAT_SIMSPARETIME,
69 LL_SIM_STAT_SIMSLEEPTIME,
70 LL_SIM_STAT_IOPUMPTIME,
68}; 71};
69 72
70#endif 73#endif
diff --git a/linden/indra/llcommon/llstl.h b/linden/indra/llcommon/llstl.h
index 4486727..70a2cc0 100644
--- a/linden/indra/llcommon/llstl.h
+++ b/linden/indra/llcommon/llstl.h
@@ -79,6 +79,9 @@ struct compare_pointer_contents
79// The general form is: 79// The general form is:
80// 80//
81// std::for_each(cont.begin(), cont.end(), DeletePointer()); 81// std::for_each(cont.begin(), cont.end(), DeletePointer());
82// somemap.clear();
83//
84// Don't forget to clear()!
82 85
83struct DeletePointer 86struct DeletePointer
84{ 87{
@@ -95,7 +98,7 @@ struct DeletePointerArray
95 } 98 }
96}; 99};
97 100
98// DeletePointer is a simple helper for deleting all pointers in a map. 101// DeletePairedPointer is a simple helper for deleting all pointers in a map.
99// The general form is: 102// The general form is:
100// 103//
101// std::for_each(somemap.begin(), somemap.end(), DeletePairedPointer()); 104// std::for_each(somemap.begin(), somemap.end(), DeletePairedPointer());
diff --git a/linden/indra/llcommon/llstring.h b/linden/indra/llcommon/llstring.h
index 7b08fd3..5e75188 100644
--- a/linden/indra/llcommon/llstring.h
+++ b/linden/indra/llcommon/llstring.h
@@ -133,26 +133,32 @@ struct char_traits<U16>
133class LLStringOps 133class LLStringOps
134{ 134{
135public: 135public:
136 static char toUpper(char elem) { return toupper(elem); } 136 static char toUpper(char elem) { return toupper((unsigned char)elem); }
137 static llwchar toUpper(llwchar elem) { return towupper(elem); } 137 static llwchar toUpper(llwchar elem) { return towupper(elem); }
138 138
139 static char toLower(char elem) { return tolower(elem); } 139 static char toLower(char elem) { return tolower((unsigned char)elem); }
140 static llwchar toLower(llwchar elem) { return towlower(elem); } 140 static llwchar toLower(llwchar elem) { return towlower(elem); }
141 141
142 static BOOL isSpace(char elem) { return isspace(elem) != 0; } 142 static bool isSpace(char elem) { return isspace((unsigned char)elem) != 0; }
143 static BOOL isSpace(llwchar elem) { return iswspace(elem) != 0; } 143 static bool isSpace(llwchar elem) { return iswspace(elem) != 0; }
144 144
145 static BOOL isUpper(char elem) { return isupper(elem) != 0; } 145 static bool isUpper(char elem) { return isupper((unsigned char)elem) != 0; }
146 static BOOL isUpper(llwchar elem) { return iswupper(elem) != 0; } 146 static bool isUpper(llwchar elem) { return iswupper(elem) != 0; }
147 147
148 static BOOL isLower(char elem) { return islower(elem) != 0; } 148 static bool isLower(char elem) { return islower((unsigned char)elem) != 0; }
149 static BOOL isLower(llwchar elem) { return iswlower(elem) != 0; } 149 static bool isLower(llwchar elem) { return iswlower(elem) != 0; }
150
151 static bool isDigit(char a) { return isdigit((unsigned char)a) != 0; }
152 static bool isDigit(llwchar a) { return iswdigit(a) != 0; }
153
154 static bool isPunct(char a) { return ispunct((unsigned char)a) != 0; }
155 static bool isPunct(llwchar a) { return iswpunct(a) != 0; }
156
157 static bool isAlnum(char a) { return isalnum((unsigned char)a) != 0; }
158 static bool isAlnum(llwchar a) { return iswalnum(a) != 0; }
150 159
151 static S32 collate(const char* a, const char* b) { return strcoll(a, b); } 160 static S32 collate(const char* a, const char* b) { return strcoll(a, b); }
152 static S32 collate(const llwchar* a, const llwchar* b); 161 static S32 collate(const llwchar* a, const llwchar* b);
153
154 static BOOL isDigit(char a) { return isdigit(a) != 0; }
155 static BOOL isDigit(llwchar a) { return iswdigit(a) != 0; }
156}; 162};
157 163
158/** 164/**
@@ -194,7 +200,7 @@ public:
194 typedef std::map<LLFormatMapString, LLFormatMapString> format_map_t; 200 typedef std::map<LLFormatMapString, LLFormatMapString> format_map_t;
195 static S32 format(std::basic_string<T>& s, const format_map_t& fmt_map); 201 static S32 format(std::basic_string<T>& s, const format_map_t& fmt_map);
196 202
197 static BOOL isValidIndex(const std::basic_string<T>& string, size_type i) 203 static bool isValidIndex(const std::basic_string<T>& string, size_type i)
198 { 204 {
199 return !string.empty() && (0 <= i) && (i <= string.size()); 205 return !string.empty() && (0 <= i) && (i <= string.size());
200 } 206 }
@@ -1155,13 +1161,6 @@ BOOL LLStringUtilBase<T>::convertToU32(const std::basic_string<T>& string, U32&
1155 std::basic_istringstream<T> i_stream((std::basic_string<T>)temp); 1161 std::basic_istringstream<T> i_stream((std::basic_string<T>)temp);
1156 if(i_stream >> v) 1162 if(i_stream >> v)
1157 { 1163 {
1158 //TODO: figure out overflow reporting here
1159 //if( ULONG_MAX == v )
1160 //{
1161 // // Underflow or overflow
1162 // return FALSE;
1163 //}
1164
1165 value = v; 1164 value = v;
1166 return TRUE; 1165 return TRUE;
1167 } 1166 }
diff --git a/linden/indra/llcommon/llthread.cpp b/linden/indra/llcommon/llthread.cpp
index 822adc2..8bc9aac 100644
--- a/linden/indra/llcommon/llthread.cpp
+++ b/linden/indra/llcommon/llthread.cpp
@@ -359,7 +359,7 @@ void LLCondition::broadcast()
359LLMutex* LLThreadSafeRefCount::sMutex = 0; 359LLMutex* LLThreadSafeRefCount::sMutex = 0;
360 360
361//static 361//static
362void LLThreadSafeRefCount::initClass() 362void LLThreadSafeRefCount::initThreadSafeRefCount()
363{ 363{
364 if (!sMutex) 364 if (!sMutex)
365 { 365 {
@@ -368,7 +368,7 @@ void LLThreadSafeRefCount::initClass()
368} 368}
369 369
370//static 370//static
371void LLThreadSafeRefCount::cleanupClass() 371void LLThreadSafeRefCount::cleanupThreadSafeRefCount()
372{ 372{
373 delete sMutex; 373 delete sMutex;
374 sMutex = NULL; 374 sMutex = NULL;
diff --git a/linden/indra/llcommon/llthread.h b/linden/indra/llcommon/llthread.h
index 9da3134..923de56 100644
--- a/linden/indra/llcommon/llthread.h
+++ b/linden/indra/llcommon/llthread.h
@@ -191,8 +191,8 @@ void LLThread::unlockData()
191class LLThreadSafeRefCount 191class LLThreadSafeRefCount
192{ 192{
193public: 193public:
194 static void initClass(); // creates sMutex 194 static void initThreadSafeRefCount(); // creates sMutex
195 static void cleanupClass(); // destroys sMutex 195 static void cleanupThreadSafeRefCount(); // destroys sMutex
196 196
197private: 197private:
198 static LLMutex* sMutex; 198 static LLMutex* sMutex;
diff --git a/linden/indra/llcommon/lltimer.cpp b/linden/indra/llcommon/lltimer.cpp
index 967570d..47edfd0 100644
--- a/linden/indra/llcommon/lltimer.cpp
+++ b/linden/indra/llcommon/lltimer.cpp
@@ -83,15 +83,20 @@ void ms_sleep(U32 ms)
83{ 83{
84 Sleep(ms); 84 Sleep(ms);
85} 85}
86
87U32 micro_sleep(U64 us, U32 max_yields)
88{
89 // max_yields is unused; just fiddle with it to avoid warnings.
90 max_yields = 0;
91 ms_sleep(us / 1000);
92 return 0;
93}
86#elif LL_LINUX || LL_SOLARIS || LL_DARWIN 94#elif LL_LINUX || LL_SOLARIS || LL_DARWIN
87void ms_sleep(U32 ms) 95static void _sleep_loop(struct timespec& thiswait)
88{ 96{
89 long mslong = ms; // tv_nsec is a long 97 struct timespec nextwait;
90 struct timespec thiswait, nextwait;
91 bool sleep_more = false; 98 bool sleep_more = false;
92 99
93 thiswait.tv_sec = ms / 1000;
94 thiswait.tv_nsec = (mslong % 1000) * 1000000l;
95 do { 100 do {
96 int result = nanosleep(&thiswait, &nextwait); 101 int result = nanosleep(&thiswait, &nextwait);
97 102
@@ -127,6 +132,44 @@ void ms_sleep(U32 ms)
127 } 132 }
128 } while (sleep_more); 133 } while (sleep_more);
129} 134}
135
136U32 micro_sleep(U64 us, U32 max_yields)
137{
138 U64 start = get_clock_count();
139 // This is kernel dependent. Currently, our kernel generates software clock
140 // interrupts at 250 Hz (every 4,000 microseconds).
141 const U64 KERNEL_SLEEP_INTERVAL_US = 4000;
142
143 S32 num_sleep_intervals = (us - (KERNEL_SLEEP_INTERVAL_US >> 1)) / KERNEL_SLEEP_INTERVAL_US;
144 if (num_sleep_intervals > 0)
145 {
146 U64 sleep_time = (num_sleep_intervals * KERNEL_SLEEP_INTERVAL_US) - (KERNEL_SLEEP_INTERVAL_US >> 1);
147 struct timespec thiswait;
148 thiswait.tv_sec = sleep_time / 1000000;
149 thiswait.tv_nsec = (sleep_time % 1000000) * 1000l;
150 _sleep_loop(thiswait);
151 }
152
153 U64 current_clock = get_clock_count();
154 U32 yields = 0;
155 while ( (yields < max_yields)
156 && (current_clock - start < us) )
157 {
158 sched_yield();
159 ++yields;
160 current_clock = get_clock_count();
161 }
162 return yields;
163}
164
165void ms_sleep(U32 ms)
166{
167 long mslong = ms; // tv_nsec is a long
168 struct timespec thiswait;
169 thiswait.tv_sec = ms / 1000;
170 thiswait.tv_nsec = (mslong % 1000) * 1000000l;
171 _sleep_loop(thiswait);
172}
130#else 173#else
131# error "architecture not supported" 174# error "architecture not supported"
132#endif 175#endif
diff --git a/linden/indra/llcommon/lltimer.h b/linden/indra/llcommon/lltimer.h
index 8d94276..766645b 100644
--- a/linden/indra/llcommon/lltimer.h
+++ b/linden/indra/llcommon/lltimer.h
@@ -39,6 +39,8 @@
39 39
40#include "stdtypes.h" 40#include "stdtypes.h"
41 41
42#include <string>
43#include <list>
42// units conversions 44// units conversions
43#ifndef USEC_PER_SEC 45#ifndef USEC_PER_SEC
44 const U32 USEC_PER_SEC = 1000000; 46 const U32 USEC_PER_SEC = 1000000;
@@ -115,6 +117,7 @@ void update_clock_frequencies();
115 117
116// Sleep for milliseconds 118// Sleep for milliseconds
117void ms_sleep(U32 ms); 119void ms_sleep(U32 ms);
120U32 micro_sleep(U64 us, U32 max_yields = 0xFFFFFFFF);
118 121
119// Returns the correct UTC time in seconds, like time(NULL). 122// Returns the correct UTC time in seconds, like time(NULL).
120// Useful on the viewer, which may have its local clock set wrong. 123// Useful on the viewer, which may have its local clock set wrong.
@@ -184,7 +187,7 @@ protected:
184 187
185private: 188private:
186 //list of active timers 189 //list of active timers
187 static std::list<LLEventTimer*> sActiveList; 190 static std::list<LLEventTimer*> sActiveList; // TODO should this be a vector
188}; 191};
189 192
190#endif 193#endif
diff --git a/linden/indra/llcommon/llversionserver.h b/linden/indra/llcommon/llversionserver.h
index 0b88ce8..2861428 100644
--- a/linden/indra/llcommon/llversionserver.h
+++ b/linden/indra/llcommon/llversionserver.h
@@ -34,8 +34,8 @@
34 34
35const S32 LL_VERSION_MAJOR = 1; 35const S32 LL_VERSION_MAJOR = 1;
36const S32 LL_VERSION_MINOR = 24; 36const S32 LL_VERSION_MINOR = 24;
37const S32 LL_VERSION_PATCH = 0; 37const S32 LL_VERSION_PATCH = 9;
38const S32 LL_VERSION_BUILD = 93453; 38const S32 LL_VERSION_BUILD = 98650;
39 39
40const char * const LL_CHANNEL = "Second Life Server"; 40const char * const LL_CHANNEL = "Second Life Server";
41 41
diff --git a/linden/indra/llcommon/llversionviewer.h b/linden/indra/llcommon/llversionviewer.h
index 66462b3..6e7d6ce 100644
--- a/linden/indra/llcommon/llversionviewer.h
+++ b/linden/indra/llcommon/llversionviewer.h
@@ -33,8 +33,8 @@
33#define LL_LLVERSIONVIEWER_H 33#define LL_LLVERSIONVIEWER_H
34 34
35const S32 LL_VERSION_MAJOR = 1; 35const S32 LL_VERSION_MAJOR = 1;
36const S32 LL_VERSION_MINOR = 21; 36const S32 LL_VERSION_MINOR = 22;
37const S32 LL_VERSION_PATCH = 6; 37const S32 LL_VERSION_PATCH = 0;
38const S32 LL_VERSION_BUILD = 0; 38const S32 LL_VERSION_BUILD = 0;
39 39
40const char * const LL_CHANNEL = "Second Life Release"; 40const char * const LL_CHANNEL = "Second Life Release";
diff --git a/linden/indra/llcrashlogger/llcrashlogger.cpp b/linden/indra/llcrashlogger/llcrashlogger.cpp
index 77274b0..3abbb2d 100755
--- a/linden/indra/llcrashlogger/llcrashlogger.cpp
+++ b/linden/indra/llcrashlogger/llcrashlogger.cpp
@@ -154,6 +154,9 @@ void LLCrashLogger::gatherFiles()
154 if (debug_log_file.is_open()) 154 if (debug_log_file.is_open())
155 { 155 {
156 LLSDSerialize::fromXML(mDebugLog, debug_log_file); 156 LLSDSerialize::fromXML(mDebugLog, debug_log_file);
157
158 mCrashInPreviousExec = mDebugLog["CrashNotHandled"].asBoolean();
159
157 mFileMap["SecondLifeLog"] = mDebugLog["SLLog"].asString(); 160 mFileMap["SecondLifeLog"] = mDebugLog["SLLog"].asString();
158 mFileMap["SettingsXml"] = mDebugLog["SettingsFilename"].asString(); 161 mFileMap["SettingsXml"] = mDebugLog["SettingsFilename"].asString();
159 if(mDebugLog.has("CAFilename")) 162 if(mDebugLog.has("CAFilename"))
@@ -176,6 +179,16 @@ void LLCrashLogger::gatherFiles()
176 mFileMap["SettingsXml"] = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS,"settings.xml"); 179 mFileMap["SettingsXml"] = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS,"settings.xml");
177 } 180 }
178 181
182 if(mCrashInPreviousExec)
183 {
184 // Replace the log file ext with .old, since the
185 // instance that launched this process has overwritten
186 // SecondLife.log
187 std::string log_filename = mFileMap["SecondLifeLog"];
188 log_filename.replace(log_filename.size() - 4, 4, ".old");
189 mFileMap["SecondLifeLog"] = log_filename;
190 }
191
179 gatherPlatformSpecificFiles(); 192 gatherPlatformSpecificFiles();
180 193
181 //Use the debug log to reconstruct the URL to send the crash report to 194 //Use the debug log to reconstruct the URL to send the crash report to
@@ -229,12 +242,6 @@ void LLCrashLogger::gatherFiles()
229LLSD LLCrashLogger::constructPostData() 242LLSD LLCrashLogger::constructPostData()
230{ 243{
231 LLSD ret; 244 LLSD ret;
232
233 if(mCrashInPreviousExec)
234 {
235 mCrashInfo["CrashInPreviousExecution"] = "Y";
236 }
237
238 return mCrashInfo; 245 return mCrashInfo;
239} 246}
240 247
@@ -338,25 +345,6 @@ bool LLCrashLogger::init()
338 llinfos << "Loading crash behavior setting" << llendl; 345 llinfos << "Loading crash behavior setting" << llendl;
339 mCrashBehavior = loadCrashBehaviorSetting(); 346 mCrashBehavior = loadCrashBehaviorSetting();
340 347
341 //Run through command line options
342 if(getOption("previous").isDefined())
343 {
344 llinfos << "Previous execution did not remove SecondLife.exec_marker" << llendl;
345 mCrashInPreviousExec = TRUE;
346 }
347
348 if(getOption("dialog").isDefined())
349 {
350 llinfos << "Show the user dialog" << llendl;
351 mCrashBehavior = CRASH_BEHAVIOR_ASK;
352 }
353
354 LLSD name = getOption("name");
355 if(name.isDefined())
356 {
357 mProductName = name.asString();
358 }
359
360 // If user doesn't want to send, bail out 348 // If user doesn't want to send, bail out
361 if (mCrashBehavior == CRASH_BEHAVIOR_NEVER_SEND) 349 if (mCrashBehavior == CRASH_BEHAVIOR_NEVER_SEND)
362 { 350 {
diff --git a/linden/indra/llimage/CMakeLists.txt b/linden/indra/llimage/CMakeLists.txt
index 5593b4a..1a4d92b 100644
--- a/linden/indra/llimage/CMakeLists.txt
+++ b/linden/indra/llimage/CMakeLists.txt
@@ -7,6 +7,7 @@ include(LLCommon)
7include(LLImage) 7include(LLImage)
8include(LLMath) 8include(LLMath)
9include(LLVFS) 9include(LLVFS)
10include(ZLIB)
10 11
11include_directories( 12include_directories(
12 ${LLCOMMON_INCLUDE_DIRS} 13 ${LLCOMMON_INCLUDE_DIRS}
@@ -48,3 +49,9 @@ set_source_files_properties(${llimage_HEADER_FILES}
48list(APPEND llimage_SOURCE_FILES ${llimage_HEADER_FILES}) 49list(APPEND llimage_SOURCE_FILES ${llimage_HEADER_FILES})
49 50
50add_library (llimage ${llimage_SOURCE_FILES}) 51add_library (llimage ${llimage_SOURCE_FILES})
52target_link_libraries(
53 llimage
54 ${JPEG_LIBRARIES}
55 ${PNG_LIBRARIES}
56 ${ZLIB_LIBRARIES}
57 )
diff --git a/linden/indra/llimage/llimage.cpp b/linden/indra/llimage/llimage.cpp
index 814e82f..71e7b41 100644
--- a/linden/indra/llimage/llimage.cpp
+++ b/linden/indra/llimage/llimage.cpp
@@ -43,6 +43,49 @@
43#include "llimagejpeg.h" 43#include "llimagejpeg.h"
44#include "llimagepng.h" 44#include "llimagepng.h"
45#include "llimagedxt.h" 45#include "llimagedxt.h"
46#include "llimageworker.h"
47
48//---------------------------------------------------------------------------
49// LLImage
50//---------------------------------------------------------------------------
51
52//static
53std::string LLImage::sLastErrorMessage;
54LLMutex* LLImage::sMutex = NULL;
55
56//static
57void LLImage::initClass(LLWorkerThread* workerthread)
58{
59 sMutex = new LLMutex(NULL);
60 if (workerthread)
61 {
62 LLImageWorker::initImageWorker(workerthread);
63 }
64 LLImageJ2C::openDSO();
65}
66
67//static
68void LLImage::cleanupClass()
69{
70 LLImageJ2C::closeDSO();
71 LLImageWorker::cleanupImageWorker();
72 delete sMutex;
73 sMutex = NULL;
74}
75
76//static
77const std::string& LLImage::getLastError()
78{
79 static const std::string noerr("No Error");
80 return sLastErrorMessage.empty() ? noerr : sLastErrorMessage;
81}
82
83//static
84void LLImage::setLastError(const std::string& message)
85{
86 LLMutexLock m(sMutex);
87 sLastErrorMessage = message;
88}
46 89
47//--------------------------------------------------------------------------- 90//---------------------------------------------------------------------------
48// LLImageBase 91// LLImageBase
@@ -95,21 +138,8 @@ void LLImageBase::sanityCheck()
95 } 138 }
96} 139}
97 140
98std::string LLImageBase::sLastErrorMessage;
99BOOL LLImageBase::sSizeOverride = FALSE; 141BOOL LLImageBase::sSizeOverride = FALSE;
100 142
101BOOL LLImageBase::setLastError(const std::string& message, const std::string& filename)
102{
103 sLastErrorMessage = message;
104 if (!filename.empty())
105 {
106 sLastErrorMessage += " FILE:";
107 sLastErrorMessage += filename;
108 }
109 llwarns << sLastErrorMessage << llendl;
110 return FALSE;
111}
112
113// virtual 143// virtual
114void LLImageBase::deleteData() 144void LLImageBase::deleteData()
115{ 145{
@@ -136,8 +166,6 @@ U8* LLImageBase::allocateData(S32 size)
136 llerrs << "LLImageBase::allocateData: bad size: " << size << llendl; 166 llerrs << "LLImageBase::allocateData: bad size: " << size << llendl;
137 } 167 }
138 168
139 resetLastError();
140
141 if (!mData || size != mDataSize) 169 if (!mData || size != mDataSize)
142 { 170 {
143 deleteData(); // virtual 171 deleteData(); // virtual
@@ -1269,6 +1297,23 @@ LLImageFormatted::~LLImageFormatted()
1269 1297
1270//---------------------------------------------------------------------------- 1298//----------------------------------------------------------------------------
1271 1299
1300//virtual
1301void LLImageFormatted::resetLastError()
1302{
1303 LLImage::setLastError("");
1304}
1305
1306//virtual
1307void LLImageFormatted::setLastError(const std::string& message, const std::string& filename)
1308{
1309 std::string error = message;
1310 if (!filename.empty())
1311 error += std::string(" FILE: ") + filename;
1312 LLImage::setLastError(error);
1313}
1314
1315//----------------------------------------------------------------------------
1316
1272// static 1317// static
1273LLImageFormatted* LLImageFormatted::createFromType(S8 codec) 1318LLImageFormatted* LLImageFormatted::createFromType(S8 codec)
1274{ 1319{
diff --git a/linden/indra/llimage/llimage.h b/linden/indra/llimage/llimage.h
index 98a98c2..8a08c89 100644
--- a/linden/indra/llimage/llimage.h
+++ b/linden/indra/llimage/llimage.h
@@ -59,6 +59,7 @@ const S32 MAX_IMG_PACKET_SIZE = 1000;
59class LLImageFormatted; 59class LLImageFormatted;
60class LLImageRaw; 60class LLImageRaw;
61class LLColor4U; 61class LLColor4U;
62class LLWorkerThread;
62 63
63typedef enum e_image_codec 64typedef enum e_image_codec
64{ 65{
@@ -74,6 +75,24 @@ typedef enum e_image_codec
74} EImageCodec; 75} EImageCodec;
75 76
76//============================================================================ 77//============================================================================
78// library initialization class
79
80class LLImage
81{
82public:
83 static void initClass(LLWorkerThread* workerthread);
84 static void cleanupClass();
85
86 static const std::string& getLastError();
87 static void setLastError(const std::string& message);
88
89protected:
90 static LLMutex* sMutex;
91 static std::string sLastErrorMessage;
92};
93
94//============================================================================
95// Image base class
77 96
78class LLImageBase : public LLThreadSafeRefCount 97class LLImageBase : public LLThreadSafeRefCount
79{ 98{
@@ -113,10 +132,6 @@ protected:
113 void setDataAndSize(U8 *data, S32 size) { mData = data; mDataSize = size; }; 132 void setDataAndSize(U8 *data, S32 size) { mData = data; mDataSize = size; };
114 133
115public: 134public:
116 static const std::string& getLastError() {return sLastErrorMessage;};
117 static void resetLastError() {sLastErrorMessage = "No Error"; };
118 static BOOL setLastError(const std::string& message, const std::string& filename = std::string()); // returns FALSE
119
120 static void generateMip(const U8 *indata, U8* mipdata, int width, int height, S32 nchannels); 135 static void generateMip(const U8 *indata, U8* mipdata, int width, int height, S32 nchannels);
121 136
122 // Function for calculating the download priority for textures 137 // Function for calculating the download priority for textures
@@ -141,8 +156,6 @@ private:
141public: 156public:
142 S16 mMemType; // debug 157 S16 mMemType; // debug
143 158
144 static std::string sLastErrorMessage;
145
146 static BOOL sSizeOverride; 159 static BOOL sSizeOverride;
147}; 160};
148 161
@@ -245,7 +258,6 @@ public:
245 LLImageFormatted(S8 codec); 258 LLImageFormatted(S8 codec);
246 259
247 // LLImageBase 260 // LLImageBase
248public:
249 /*virtual*/ void deleteData(); 261 /*virtual*/ void deleteData();
250 /*virtual*/ U8* allocateData(S32 size = -1); 262 /*virtual*/ U8* allocateData(S32 size = -1);
251 /*virtual*/ U8* reallocateData(S32 size); 263 /*virtual*/ U8* reallocateData(S32 size);
@@ -254,7 +266,6 @@ public:
254 /*virtual*/ void sanityCheck(); 266 /*virtual*/ void sanityCheck();
255 267
256 // New methods 268 // New methods
257public:
258 // subclasses must return a prefered file extension (lowercase without a leading dot) 269 // subclasses must return a prefered file extension (lowercase without a leading dot)
259 virtual std::string getExtension() = 0; 270 virtual std::string getExtension() = 0;
260 // calcHeaderSize() returns the maximum size of header; 271 // calcHeaderSize() returns the maximum size of header;
@@ -287,6 +298,10 @@ public:
287 void setDiscardLevel(S8 discard_level) { mDiscardLevel = discard_level; } 298 void setDiscardLevel(S8 discard_level) { mDiscardLevel = discard_level; }
288 S8 getDiscardLevel() const { return mDiscardLevel; } 299 S8 getDiscardLevel() const { return mDiscardLevel; }
289 300
301 // setLastError needs to be deferred for J2C images since it may be called from a DLL
302 virtual void resetLastError();
303 virtual void setLastError(const std::string& message, const std::string& filename = std::string());
304
290protected: 305protected:
291 BOOL copyData(U8 *data, S32 size); // calls updateData() 306 BOOL copyData(U8 *data, S32 size); // calls updateData()
292 307
@@ -295,7 +310,7 @@ protected:
295 S8 mDecoding; 310 S8 mDecoding;
296 S8 mDecoded; 311 S8 mDecoded;
297 S8 mDiscardLevel; 312 S8 mDiscardLevel;
298 313
299public: 314public:
300 static S32 sGlobalFormattedMemory; 315 static S32 sGlobalFormattedMemory;
301}; 316};
diff --git a/linden/indra/llimage/llimagej2c.cpp b/linden/indra/llimage/llimagej2c.cpp
index 510b303..95abbae 100644
--- a/linden/indra/llimage/llimagej2c.cpp
+++ b/linden/indra/llimage/llimagej2c.cpp
@@ -219,32 +219,54 @@ LLImageJ2C::~LLImageJ2C()
219} 219}
220 220
221// virtual 221// virtual
222void LLImageJ2C::resetLastError()
223{
224 mLastError.clear();
225}
226
227//virtual
228void LLImageJ2C::setLastError(const std::string& message, const std::string& filename)
229{
230 mLastError = message;
231 if (!filename.empty())
232 mLastError += std::string(" FILE: ") + filename;
233}
234
235// virtual
222S8 LLImageJ2C::getRawDiscardLevel() 236S8 LLImageJ2C::getRawDiscardLevel()
223{ 237{
224 return mRawDiscardLevel; 238 return mRawDiscardLevel;
225} 239}
226 240
227BOOL LLImageJ2C::updateData() 241BOOL LLImageJ2C::updateData()
228{ 242{
243 BOOL res = TRUE;
229 resetLastError(); 244 resetLastError();
230 245
231 // Check to make sure that this instance has been initialized with data 246 // Check to make sure that this instance has been initialized with data
232 if (!getData() || (getDataSize() < 16)) 247 if (!getData() || (getDataSize() < 16))
233 { 248 {
234 setLastError("LLImageJ2C uninitialized"); 249 setLastError("LLImageJ2C uninitialized");
235 return FALSE; 250 res = FALSE;
251 }
252 else
253 {
254 res = mImpl->getMetadata(*this);
236 } 255 }
237 256
238 if (!mImpl->getMetadata(*this)) 257 if (res)
239 { 258 {
240 return FALSE; 259 // SJB: override discard based on mMaxBytes elsewhere
260 S32 max_bytes = getDataSize(); // mMaxBytes ? mMaxBytes : getDataSize();
261 S32 discard = calcDiscardLevelBytes(max_bytes);
262 setDiscardLevel(discard);
241 } 263 }
242 // SJB: override discard based on mMaxBytes elsewhere
243 S32 max_bytes = getDataSize(); // mMaxBytes ? mMaxBytes : getDataSize();
244 S32 discard = calcDiscardLevelBytes(max_bytes);
245 setDiscardLevel(discard);
246 264
247 return TRUE; 265 if (!mLastError.empty())
266 {
267 LLImage::setLastError(mLastError);
268 }
269 return res;
248} 270}
249 271
250 272
@@ -258,20 +280,24 @@ BOOL LLImageJ2C::decodeChannels(LLImageRaw *raw_imagep, F32 decode_time, S32 fir
258{ 280{
259 LLMemType mt1((LLMemType::EMemType)mMemType); 281 LLMemType mt1((LLMemType::EMemType)mMemType);
260 282
283 BOOL res = TRUE;
284
261 resetLastError(); 285 resetLastError();
262 286
263 // Check to make sure that this instance has been initialized with data 287 // Check to make sure that this instance has been initialized with data
264 if (!getData() || (getDataSize() < 16)) 288 if (!getData() || (getDataSize() < 16))
265 { 289 {
266 setLastError("LLImageJ2C uninitialized"); 290 setLastError("LLImageJ2C uninitialized");
267 return FALSE; 291 res = FALSE;
268 } 292 }
269 293 else
270 // Update the raw discard level 294 {
271 updateRawDiscardLevel(); 295 // Update the raw discard level
272 296 updateRawDiscardLevel();
273 mDecoding = TRUE; 297 mDecoding = TRUE;
274 BOOL res = mImpl->decodeImpl(*this, *raw_imagep, decode_time, first_channel, max_channel_count); 298 res = mImpl->decodeImpl(*this, *raw_imagep, decode_time, first_channel, max_channel_count);
299 }
300
275 if (res) 301 if (res)
276 { 302 {
277 if (!mDecoding) 303 if (!mDecoding)
@@ -283,9 +309,14 @@ BOOL LLImageJ2C::decodeChannels(LLImageRaw *raw_imagep, F32 decode_time, S32 fir
283 { 309 {
284 mDecoding = FALSE; 310 mDecoding = FALSE;
285 } 311 }
286 return TRUE; // done
287 } 312 }
288 return FALSE; 313
314 if (!mLastError.empty())
315 {
316 LLImage::setLastError(mLastError);
317 }
318
319 return res;
289} 320}
290 321
291 322
@@ -298,7 +329,13 @@ BOOL LLImageJ2C::encode(const LLImageRaw *raw_imagep, F32 encode_time)
298BOOL LLImageJ2C::encode(const LLImageRaw *raw_imagep, const char* comment_text, F32 encode_time) 329BOOL LLImageJ2C::encode(const LLImageRaw *raw_imagep, const char* comment_text, F32 encode_time)
299{ 330{
300 LLMemType mt1((LLMemType::EMemType)mMemType); 331 LLMemType mt1((LLMemType::EMemType)mMemType);
301 return mImpl->encodeImpl(*this, *raw_imagep, comment_text, encode_time, mReversible); 332 resetLastError();
333 BOOL res = mImpl->encodeImpl(*this, *raw_imagep, comment_text, encode_time, mReversible);
334 if (!mLastError.empty())
335 {
336 LLImage::setLastError(mLastError);
337 }
338 return res;
302} 339}
303 340
304//static 341//static
@@ -376,6 +413,8 @@ void LLImageJ2C::setReversible(const BOOL reversible)
376 413
377BOOL LLImageJ2C::loadAndValidate(const std::string &filename) 414BOOL LLImageJ2C::loadAndValidate(const std::string &filename)
378{ 415{
416 BOOL res = TRUE;
417
379 resetLastError(); 418 resetLastError();
380 419
381 S32 file_size = 0; 420 S32 file_size = 0;
@@ -383,27 +422,38 @@ BOOL LLImageJ2C::loadAndValidate(const std::string &filename)
383 if (!apr_file) 422 if (!apr_file)
384 { 423 {
385 setLastError("Unable to open file for reading", filename); 424 setLastError("Unable to open file for reading", filename);
386 return FALSE; 425 res = FALSE;
387 } 426 }
388 if (file_size == 0) 427 else if (file_size == 0)
389 { 428 {
390 setLastError("File is empty",filename); 429 setLastError("File is empty",filename);
391 apr_file_close(apr_file); 430 apr_file_close(apr_file);
392 return FALSE; 431 res = FALSE;
393 } 432 }
394 433 else
395 U8 *data = new U8[file_size];
396 apr_size_t bytes_read = file_size;
397 apr_status_t s = apr_file_read(apr_file, data, &bytes_read); // modifies bytes_read
398 if (s != APR_SUCCESS || (S32)bytes_read != file_size)
399 { 434 {
400 delete[] data; 435 U8 *data = new U8[file_size];
401 setLastError("Unable to read entire file"); 436 apr_size_t bytes_read = file_size;
402 return FALSE; 437 apr_status_t s = apr_file_read(apr_file, data, &bytes_read); // modifies bytes_read
438 apr_file_close(apr_file);
439 if (s != APR_SUCCESS || (S32)bytes_read != file_size)
440 {
441 delete[] data;
442 setLastError("Unable to read entire file");
443 res = FALSE;
444 }
445 else
446 {
447 res = validate(data, file_size);
448 }
403 } 449 }
404 apr_file_close(apr_file);
405 450
406 return validate(data, file_size); 451 if (!mLastError.empty())
452 {
453 LLImage::setLastError(mLastError);
454 }
455
456 return res;
407} 457}
408 458
409 459
@@ -411,21 +461,30 @@ BOOL LLImageJ2C::validate(U8 *data, U32 file_size)
411{ 461{
412 LLMemType mt1((LLMemType::EMemType)mMemType); 462 LLMemType mt1((LLMemType::EMemType)mMemType);
413 463
464 resetLastError();
465
414 setData(data, file_size); 466 setData(data, file_size);
467
415 BOOL res = updateData(); 468 BOOL res = updateData();
416 if ( !res ) 469 if ( res )
417 { 470 {
418 return FALSE; 471 // Check to make sure that this instance has been initialized with data
472 if (!getData() || (0 == getDataSize()))
473 {
474 setLastError("LLImageJ2C uninitialized");
475 res = FALSE;
476 }
477 else
478 {
479 res = mImpl->getMetadata(*this);
480 }
419 } 481 }
420 482
421 // Check to make sure that this instance has been initialized with data 483 if (!mLastError.empty())
422 if (!getData() || (0 == getDataSize()))
423 { 484 {
424 setLastError("LLImageJ2C uninitialized"); 485 LLImage::setLastError(mLastError);
425 return FALSE;
426 } 486 }
427 487 return res;
428 return mImpl->getMetadata(*this);
429} 488}
430 489
431void LLImageJ2C::decodeFailed() 490void LLImageJ2C::decodeFailed()
diff --git a/linden/indra/llimage/llimagej2c.h b/linden/indra/llimage/llimagej2c.h
index 2b4a3ec..f4d651f 100644
--- a/linden/indra/llimage/llimagej2c.h
+++ b/linden/indra/llimage/llimagej2c.h
@@ -54,6 +54,10 @@ public:
54 /*virtual*/ S32 calcDataSize(S32 discard_level = 0); 54 /*virtual*/ S32 calcDataSize(S32 discard_level = 0);
55 /*virtual*/ S32 calcDiscardLevelBytes(S32 bytes); 55 /*virtual*/ S32 calcDiscardLevelBytes(S32 bytes);
56 /*virtual*/ S8 getRawDiscardLevel(); 56 /*virtual*/ S8 getRawDiscardLevel();
57 // Override these so that we don't try to set a global variable from a DLL
58 /*virtual*/ void resetLastError();
59 /*virtual*/ void setLastError(const std::string& message, const std::string& filename = std::string());
60
57 61
58 // Encode with comment text 62 // Encode with comment text
59 BOOL encode(const LLImageRaw *raw_imagep, const char* comment_text, F32 encode_time=0.0); 63 BOOL encode(const LLImageRaw *raw_imagep, const char* comment_text, F32 encode_time=0.0);
@@ -86,6 +90,7 @@ protected:
86 F32 mRate; 90 F32 mRate;
87 BOOL mReversible; 91 BOOL mReversible;
88 LLImageJ2CImpl *mImpl; 92 LLImageJ2CImpl *mImpl;
93 std::string mLastError;
89}; 94};
90 95
91// Derive from this class to implement JPEG2000 decoding 96// Derive from this class to implement JPEG2000 decoding
diff --git a/linden/indra/llimage/llimageworker.cpp b/linden/indra/llimage/llimageworker.cpp
index dc6f2e4..93ce19b 100644
--- a/linden/indra/llimage/llimageworker.cpp
+++ b/linden/indra/llimage/llimageworker.cpp
@@ -41,13 +41,13 @@ LLWorkerThread* LLImageWorker::sWorkerThread = NULL;
41S32 LLImageWorker::sCount = 0; 41S32 LLImageWorker::sCount = 0;
42 42
43//static 43//static
44void LLImageWorker::initClass(LLWorkerThread* workerthread) 44void LLImageWorker::initImageWorker(LLWorkerThread* workerthread)
45{ 45{
46 sWorkerThread = workerthread; 46 sWorkerThread = workerthread;
47} 47}
48 48
49//static 49//static
50void LLImageWorker::cleanupClass() 50void LLImageWorker::cleanupImageWorker()
51{ 51{
52} 52}
53 53
diff --git a/linden/indra/llimage/llimageworker.h b/linden/indra/llimage/llimageworker.h
index bf6c3f2..3ee6b8e 100644
--- a/linden/indra/llimage/llimageworker.h
+++ b/linden/indra/llimage/llimageworker.h
@@ -38,8 +38,10 @@
38class LLImageWorker : public LLWorkerClass 38class LLImageWorker : public LLWorkerClass
39{ 39{
40public: 40public:
41 static void initClass(LLWorkerThread* workerthread); 41 static void initImageWorker(LLWorkerThread* workerthread);
42 static void cleanupClass(); 42 static void cleanupImageWorker();
43
44public:
43 static LLWorkerThread* getWorkerThread() { return sWorkerThread; } 45 static LLWorkerThread* getWorkerThread() { return sWorkerThread; }
44 46
45 // LLWorkerThread 47 // LLWorkerThread
diff --git a/linden/indra/llimagej2coj/CMakeLists.txt b/linden/indra/llimagej2coj/CMakeLists.txt
index ed3ff3c..97d22cf 100644
--- a/linden/indra/llimagej2coj/CMakeLists.txt
+++ b/linden/indra/llimagej2coj/CMakeLists.txt
@@ -29,3 +29,7 @@ set_source_files_properties(${llimagej2coj_HEADER_FILES}
29list(APPEND llimagej2coj_SOURCE_FILES ${llimagej2coj_HEADER_FILES}) 29list(APPEND llimagej2coj_SOURCE_FILES ${llimagej2coj_HEADER_FILES})
30 30
31add_library (llimagej2coj ${llimagej2coj_SOURCE_FILES}) 31add_library (llimagej2coj ${llimagej2coj_SOURCE_FILES})
32target_link_libraries(
33 llimagej2coj
34 ${OPENJPEG_LIBRARIES}
35 )
diff --git a/linden/indra/llimagej2coj/llimagej2coj.cpp b/linden/indra/llimagej2coj/llimagej2coj.cpp
index 983241c..7a62cfd 100644
--- a/linden/indra/llimagej2coj/llimagej2coj.cpp
+++ b/linden/indra/llimagej2coj/llimagej2coj.cpp
@@ -151,9 +151,11 @@ BOOL LLImageJ2COJ::decodeImpl(LLImageJ2C &base, LLImageRaw &raw_image, F32 decod
151 // dereference the array. 151 // dereference the array.
152 if(!image || !image->numcomps) 152 if(!image || !image->numcomps)
153 { 153 {
154 fprintf(stderr, "ERROR -> decodeImpl: failed to decode image!\n"); 154 llwarns << "ERROR -> decodeImpl: failed to decode image!" << llendl;
155 if (image) 155 if (image)
156 {
156 opj_image_destroy(image); 157 opj_image_destroy(image);
158 }
157 159
158 return TRUE; // done 160 return TRUE; // done
159 } 161 }
@@ -170,6 +172,17 @@ BOOL LLImageJ2COJ::decodeImpl(LLImageJ2C &base, LLImageRaw &raw_image, F32 decod
170 } 172 }
171 } 173 }
172 174
175 if(image->numcomps <= first_channel)
176 {
177 llwarns << "trying to decode more channels than are present in image: numcomps: " << image->numcomps << " first_channel: " << first_channel << llendl;
178 if (image)
179 {
180 opj_image_destroy(image);
181 }
182
183 return TRUE;
184 }
185
173 // Copy image data into our raw image format (instead of the separate channel format 186 // Copy image data into our raw image format (instead of the separate channel format
174 187
175 S32 img_components = image->numcomps; 188 S32 img_components = image->numcomps;
@@ -211,7 +224,7 @@ BOOL LLImageJ2COJ::decodeImpl(LLImageJ2C &base, LLImageRaw &raw_image, F32 decod
211 } 224 }
212 else // Some rare OpenJPEG versions have this bug. 225 else // Some rare OpenJPEG versions have this bug.
213 { 226 {
214 fprintf(stderr, "ERROR -> decodeImpl: failed to decode image! (NULL comp data - OpenJPEG bug)\n"); 227 llwarns << "ERROR -> decodeImpl: failed to decode image! (NULL comp data - OpenJPEG bug)" << llendl;
215 opj_image_destroy(image); 228 opj_image_destroy(image);
216 229
217 return TRUE; // done 230 return TRUE; // done
@@ -430,7 +443,7 @@ BOOL LLImageJ2COJ::getMetadata(LLImageJ2C &base)
430 443
431 if(!image) 444 if(!image)
432 { 445 {
433 fprintf(stderr, "ERROR -> getMetadata: failed to decode image!\n"); 446 llwarns << "ERROR -> getMetadata: failed to decode image!" << llendl;
434 return FALSE; 447 return FALSE;
435 } 448 }
436 449
diff --git a/linden/indra/llinventory/llinventory.cpp b/linden/indra/llinventory/llinventory.cpp
index 457a0cb..0c7e0ed 100644
--- a/linden/indra/llinventory/llinventory.cpp
+++ b/linden/indra/llinventory/llinventory.cpp
@@ -60,6 +60,9 @@ static const std::string INV_SALE_INFO_LABEL("sale_info");
60static const std::string INV_FLAGS_LABEL("flags"); 60static const std::string INV_FLAGS_LABEL("flags");
61static const std::string INV_CREATION_DATE_LABEL("created_at"); 61static const std::string INV_CREATION_DATE_LABEL("created_at");
62 62
63// key used by agent-inventory-service
64static const std::string INV_ASSET_TYPE_LABEL_WS("type_default");
65static const std::string INV_FOLDER_ID_LABEL_WS("category_id");
63///---------------------------------------------------------------------------- 66///----------------------------------------------------------------------------
64/// Local function declarations, constants, enums, and typedefs 67/// Local function declarations, constants, enums, and typedefs
65///---------------------------------------------------------------------------- 68///----------------------------------------------------------------------------
@@ -949,11 +952,13 @@ LLSD LLInventoryItem::asLLSD() const
949 sd[INV_SHADOW_ID_LABEL] = shadow_id; 952 sd[INV_SHADOW_ID_LABEL] = shadow_id;
950 } 953 }
951 sd[INV_ASSET_TYPE_LABEL] = LLAssetType::lookup(mType); 954 sd[INV_ASSET_TYPE_LABEL] = LLAssetType::lookup(mType);
955 sd[INV_INVENTORY_TYPE_LABEL] = mInventoryType;
952 const char* inv_type_str = LLInventoryType::lookup(mInventoryType); 956 const char* inv_type_str = LLInventoryType::lookup(mInventoryType);
953 if(inv_type_str) 957 if(inv_type_str)
954 { 958 {
955 sd[INV_INVENTORY_TYPE_LABEL] = inv_type_str; 959 sd[INV_INVENTORY_TYPE_LABEL] = inv_type_str;
956 } 960 }
961 //sd[INV_FLAGS_LABEL] = (S32)mFlags;
957 sd[INV_FLAGS_LABEL] = ll_sd_from_U32(mFlags); 962 sd[INV_FLAGS_LABEL] = ll_sd_from_U32(mFlags);
958 sd[INV_SALE_INFO_LABEL] = mSaleInfo; 963 sd[INV_SALE_INFO_LABEL] = mSaleInfo;
959 sd[INV_NAME_LABEL] = mName; 964 sd[INV_NAME_LABEL] = mName;
@@ -1026,17 +1031,40 @@ bool LLInventoryItem::fromLLSD(LLSD& sd)
1026 w = INV_ASSET_TYPE_LABEL; 1031 w = INV_ASSET_TYPE_LABEL;
1027 if (sd.has(w)) 1032 if (sd.has(w))
1028 { 1033 {
1029 mType = LLAssetType::lookup(sd[w].asString()); 1034 if (sd[w].isString())
1035 {
1036 mType = LLAssetType::lookup(sd[w].asString().c_str());
1037 }
1038 else if (sd[w].isInteger())
1039 {
1040 S8 type = (U8)sd[w].asInteger();
1041 mType = static_cast<LLAssetType::EType>(type);
1042 }
1030 } 1043 }
1031 w = INV_INVENTORY_TYPE_LABEL; 1044 w = INV_INVENTORY_TYPE_LABEL;
1032 if (sd.has(w)) 1045 if (sd.has(w))
1033 { 1046 {
1034 mInventoryType = LLInventoryType::lookup(sd[w].asString()); 1047 if (sd[w].isString())
1048 {
1049 mInventoryType = LLInventoryType::lookup(sd[w].asString().c_str());
1050 }
1051 else if (sd[w].isInteger())
1052 {
1053 S8 type = (U8)sd[w].asInteger();
1054 mInventoryType = static_cast<LLInventoryType::EType>(type);
1055 }
1035 } 1056 }
1036 w = INV_FLAGS_LABEL; 1057 w = INV_FLAGS_LABEL;
1037 if (sd.has(w)) 1058 if (sd.has(w))
1038 { 1059 {
1039 mFlags = ll_U32_from_sd(sd[w]); 1060 if (sd[w].isBinary())
1061 {
1062 mFlags = ll_U32_from_sd(sd[w]);
1063 }
1064 else if(sd[w].isInteger())
1065 {
1066 mFlags = sd[w].asInteger();
1067 }
1040 } 1068 }
1041 w = INV_NAME_LABEL; 1069 w = INV_NAME_LABEL;
1042 if (sd.has(w)) 1070 if (sd.has(w))
@@ -1394,7 +1422,7 @@ bool LLInventoryCategory::fromLLSD(LLSD& sd)
1394{ 1422{
1395 std::string w; 1423 std::string w;
1396 1424
1397 w = INV_ITEM_ID_LABEL; 1425 w = INV_FOLDER_ID_LABEL_WS;
1398 if (sd.has(w)) 1426 if (sd.has(w))
1399 { 1427 {
1400 mUUID = sd[w]; 1428 mUUID = sd[w];
@@ -1410,6 +1438,13 @@ bool LLInventoryCategory::fromLLSD(LLSD& sd)
1410 S8 type = (U8)sd[w].asInteger(); 1438 S8 type = (U8)sd[w].asInteger();
1411 mPreferredType = static_cast<LLAssetType::EType>(type); 1439 mPreferredType = static_cast<LLAssetType::EType>(type);
1412 } 1440 }
1441 w = INV_ASSET_TYPE_LABEL_WS;
1442 if (sd.has(w))
1443 {
1444 S8 type = (U8)sd[w].asInteger();
1445 mPreferredType = static_cast<LLAssetType::EType>(type);
1446 }
1447
1413 w = INV_NAME_LABEL; 1448 w = INV_NAME_LABEL;
1414 if (sd.has(w)) 1449 if (sd.has(w))
1415 { 1450 {
diff --git a/linden/indra/llinventory/llparcel.cpp b/linden/indra/llinventory/llparcel.cpp
index 2b9c201..911e257 100644
--- a/linden/indra/llinventory/llparcel.cpp
+++ b/linden/indra/llinventory/llparcel.cpp
@@ -1398,7 +1398,7 @@ void LLParcel::unpackMessage(LLMessageSystem* msg)
1398 1398
1399 // New Media Data 1399 // New Media Data
1400 // Note: the message has been converted to TCP 1400 // Note: the message has been converted to TCP
1401 if(msg->getNumberOfBlocks("MediaData") > 0) 1401 if(msg->has("MediaData"))
1402 { 1402 {
1403 msg->getString("MediaData", "MediaDesc", buffer); 1403 msg->getString("MediaData", "MediaDesc", buffer);
1404 setMediaDesc(buffer); 1404 setMediaDesc(buffer);
@@ -1761,7 +1761,11 @@ void LLParcel::startSale(const LLUUID& buyer_id, BOOL is_buyer_group)
1761 setCleanOtherTime(0); 1761 setCleanOtherTime(0);
1762} 1762}
1763 1763
1764void LLParcel::expireSale(U32& type, U8& flags, LLUUID& from_id, LLUUID& to_id) 1764void LLParcel::expireSale(
1765 U32& type,
1766 U8& flags,
1767 LLUUID& from_id,
1768 LLUUID& to_id)
1765{ 1769{
1766 mSaleTimerExpires.setTimerExpirySec(0.0); 1770 mSaleTimerExpires.setTimerExpirySec(0.0);
1767 mSaleTimerExpires.stop(); 1771 mSaleTimerExpires.stop();
@@ -1777,8 +1781,10 @@ void LLParcel::expireSale(U32& type, U8& flags, LLUUID& from_id, LLUUID& to_id)
1777 to_id.setNull(); 1781 to_id.setNull();
1778} 1782}
1779 1783
1780void LLParcel::completeSale(U32& type, U8& flags, 1784void LLParcel::completeSale(
1781 LLUUID& to_id) 1785 U32& type,
1786 U8& flags,
1787 LLUUID& to_id)
1782{ 1788{
1783 mSaleTimerExpires.setTimerExpirySec(0.0); 1789 mSaleTimerExpires.setTimerExpirySec(0.0);
1784 mSaleTimerExpires.stop(); 1790 mSaleTimerExpires.stop();
diff --git a/linden/indra/llinventory/llsaleinfo.cpp b/linden/indra/llinventory/llsaleinfo.cpp
index 4895378..fef6b05 100644
--- a/linden/indra/llinventory/llsaleinfo.cpp
+++ b/linden/indra/llinventory/llsaleinfo.cpp
@@ -114,7 +114,16 @@ bool LLSaleInfo::fromLLSD(LLSD& sd, BOOL& has_perm_mask, U32& perm_mask)
114{ 114{
115 const char *w; 115 const char *w;
116 116
117 mSaleType = lookup(sd["sale_type"].asString().c_str()); 117 if (sd["sale_type"].isString())
118 {
119 mSaleType = lookup(sd["sale_type"].asString().c_str());
120 }
121 else if(sd["sale_type"].isInteger())
122 {
123 S8 type = (U8)sd["sale_type"].asInteger();
124 mSaleType = static_cast<LLSaleInfo::EForSale>(type);
125 }
126
118 mSalePrice = llclamp(sd["sale_price"].asInteger(), 0, S32_MAX); 127 mSalePrice = llclamp(sd["sale_price"].asInteger(), 0, S32_MAX);
119 w = "perm_mask"; 128 w = "perm_mask";
120 if (sd.has(w)) 129 if (sd.has(w))
diff --git a/linden/indra/llmath/llmodularmath.h b/linden/indra/llmath/llmodularmath.h
new file mode 100644
index 0000000..076f5da
--- /dev/null
+++ b/linden/indra/llmath/llmodularmath.h
@@ -0,0 +1,57 @@
1/**
2 * @file llmodularmath.h
3 * @brief Useful modular math functions.
4 *
5 * $LicenseInfo:firstyear=2008&license=viewergpl$
6 *
7 * Copyright (c) 2008, Linden Research, Inc.
8 *
9 * Second Life Viewer Source Code
10 * The source code in this file ("Source Code") is provided by Linden Lab
11 * to you under the terms of the GNU General Public License, version 2.0
12 * ("GPL"), unless you have obtained a separate licensing agreement
13 * ("Other License"), formally executed by you and Linden Lab. Terms of
14 * the GPL can be found in doc/GPL-license.txt in this distribution, or
15 * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
16 *
17 * There are special exceptions to the terms and conditions of the GPL as
18 * it is applied to this Source Code. View the full text of the exception
19 * in the file doc/FLOSS-exception.txt in this software distribution, or
20 * online at 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 * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
27 * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
28 * COMPLETENESS OR PERFORMANCE.
29 * $/LicenseInfo$
30 */
31
32#ifndef LLMODULARMATH_H
33#define LLMODULARMATH_H
34
35namespace LLModularMath
36{
37 // Return difference between lhs and rhs
38 // treating the U32 operands and result
39 // as unsigned values of given width.
40 template<int width>
41 inline U32 subtract(U32 lhs, U32 rhs)
42 {
43 // Generate a bit mask which will truncate
44 // unsigned values to given width at compile time.
45 const U32 mask = (1 << width) - 1;
46
47 // Operands are unsigned, so modular
48 // arithmetic applies. If lhs < rhs,
49 // difference will wrap in to lower
50 // bits of result, which is then masked
51 // to give a value that can be represented
52 // by an unsigned value of width bits.
53 return mask & (lhs - rhs);
54 }
55}
56
57#endif
diff --git a/linden/indra/llmath/lloctree.h b/linden/indra/llmath/lloctree.h
index 57b359f..c37f887 100644
--- a/linden/indra/llmath/lloctree.h
+++ b/linden/indra/llmath/lloctree.h
@@ -38,9 +38,9 @@
38#include <set> 38#include <set>
39 39
40#if LL_RELEASE_WITH_DEBUG_INFO || LL_DEBUG 40#if LL_RELEASE_WITH_DEBUG_INFO || LL_DEBUG
41#define OCT_ERRS LL_WARNS("OctreeErrors")
42#else
43#define OCT_ERRS LL_ERRS("OctreeErrors") 41#define OCT_ERRS LL_ERRS("OctreeErrors")
42#else
43#define OCT_ERRS LL_WARNS("OctreeErrors")
44#endif 44#endif
45 45
46#define LL_OCTREE_PARANOIA_CHECK 0 46#define LL_OCTREE_PARANOIA_CHECK 0
diff --git a/linden/indra/llmath/v3color.h b/linden/indra/llmath/v3color.h
index b9bc641..111a871 100644
--- a/linden/indra/llmath/v3color.h
+++ b/linden/indra/llmath/v3color.h
@@ -82,13 +82,23 @@ public:
82 82
83 const LLColor3& setToBlack(); // Clears LLColor3 to (0, 0, 0) 83 const LLColor3& setToBlack(); // Clears LLColor3 to (0, 0, 0)
84 const LLColor3& setToWhite(); // Zero LLColor3 to (0, 0, 0) 84 const LLColor3& setToWhite(); // Zero LLColor3 to (0, 0, 0)
85 const LLColor3& setVec(F32 x, F32 y, F32 z); // Sets LLColor3 to (x, y, z) 85
86 const LLColor3& setVec(const LLColor3 &vec); // Sets LLColor3 to vec 86 const LLColor3& setVec(F32 x, F32 y, F32 z); // deprecated
87 const LLColor3& setVec(const F32 *vec); // Sets LLColor3 to vec 87 const LLColor3& setVec(const LLColor3 &vec); // deprecated
88 const LLColor3& setVec(const F32 *vec); // deprecated
89
90 const LLColor3& set(F32 x, F32 y, F32 z); // Sets LLColor3 to (x, y, z)
91 const LLColor3& set(const LLColor3 &vec); // Sets LLColor3 to vec
92 const LLColor3& set(const F32 *vec); // Sets LLColor3 to vec
93
94 F32 magVec() const; // deprecated
95 F32 magVecSquared() const; // deprecated
96 F32 normVec(); // deprecated
97
98 F32 length() const; // Returns magnitude of LLColor3
99 F32 lengthSquared() const; // Returns magnitude squared of LLColor3
100 F32 normalize(); // Normalizes and returns the magnitude of LLColor3
88 101
89 F32 magVec() const; // Returns magnitude of LLColor3
90 F32 magVecSquared() const; // Returns magnitude squared of LLColor3
91 F32 normVec(); // Normalizes and returns the magnitude of LLColor3
92 F32 brightness() const; // Returns brightness of LLColor3 102 F32 brightness() const; // Returns brightness of LLColor3
93 103
94 const LLColor3& operator=(const LLColor4 &a); 104 const LLColor3& operator=(const LLColor4 &a);
@@ -214,6 +224,31 @@ inline const LLColor3& LLColor3::setToWhite(void)
214 return (*this); 224 return (*this);
215} 225}
216 226
227inline const LLColor3& LLColor3::set(F32 r, F32 g, F32 b)
228{
229 mV[0] = r;
230 mV[1] = g;
231 mV[2] = b;
232 return (*this);
233}
234
235inline const LLColor3& LLColor3::set(const LLColor3 &vec)
236{
237 mV[0] = vec.mV[0];
238 mV[1] = vec.mV[1];
239 mV[2] = vec.mV[2];
240 return (*this);
241}
242
243inline const LLColor3& LLColor3::set(const F32 *vec)
244{
245 mV[0] = vec[0];
246 mV[1] = vec[1];
247 mV[2] = vec[2];
248 return (*this);
249}
250
251// deprecated
217inline const LLColor3& LLColor3::setVec(F32 r, F32 g, F32 b) 252inline const LLColor3& LLColor3::setVec(F32 r, F32 g, F32 b)
218{ 253{
219 mV[0] = r; 254 mV[0] = r;
@@ -222,6 +257,7 @@ inline const LLColor3& LLColor3::setVec(F32 r, F32 g, F32 b)
222 return (*this); 257 return (*this);
223} 258}
224 259
260// deprecated
225inline const LLColor3& LLColor3::setVec(const LLColor3 &vec) 261inline const LLColor3& LLColor3::setVec(const LLColor3 &vec)
226{ 262{
227 mV[0] = vec.mV[0]; 263 mV[0] = vec.mV[0];
@@ -230,6 +266,7 @@ inline const LLColor3& LLColor3::setVec(const LLColor3 &vec)
230 return (*this); 266 return (*this);
231} 267}
232 268
269// deprecated
233inline const LLColor3& LLColor3::setVec(const F32 *vec) 270inline const LLColor3& LLColor3::setVec(const F32 *vec)
234{ 271{
235 mV[0] = vec[0]; 272 mV[0] = vec[0];
@@ -243,16 +280,44 @@ inline F32 LLColor3::brightness(void) const
243 return (mV[0] + mV[1] + mV[2]) / 3.0f; 280 return (mV[0] + mV[1] + mV[2]) / 3.0f;
244} 281}
245 282
283inline F32 LLColor3::length(void) const
284{
285 return fsqrtf(mV[0]*mV[0] + mV[1]*mV[1] + mV[2]*mV[2]);
286}
287
288inline F32 LLColor3::lengthSquared(void) const
289{
290 return mV[0]*mV[0] + mV[1]*mV[1] + mV[2]*mV[2];
291}
292
293inline F32 LLColor3::normalize(void)
294{
295 F32 mag = fsqrtf(mV[0]*mV[0] + mV[1]*mV[1] + mV[2]*mV[2]);
296 F32 oomag;
297
298 if (mag)
299 {
300 oomag = 1.f/mag;
301 mV[0] *= oomag;
302 mV[1] *= oomag;
303 mV[2] *= oomag;
304 }
305 return (mag);
306}
307
308// deprecated
246inline F32 LLColor3::magVec(void) const 309inline F32 LLColor3::magVec(void) const
247{ 310{
248 return fsqrtf(mV[0]*mV[0] + mV[1]*mV[1] + mV[2]*mV[2]); 311 return fsqrtf(mV[0]*mV[0] + mV[1]*mV[1] + mV[2]*mV[2]);
249} 312}
250 313
314// deprecated
251inline F32 LLColor3::magVecSquared(void) const 315inline F32 LLColor3::magVecSquared(void) const
252{ 316{
253 return mV[0]*mV[0] + mV[1]*mV[1] + mV[2]*mV[2]; 317 return mV[0]*mV[0] + mV[1]*mV[1] + mV[2]*mV[2];
254} 318}
255 319
320// deprecated
256inline F32 LLColor3::normVec(void) 321inline F32 LLColor3::normVec(void)
257{ 322{
258 F32 mag = fsqrtf(mV[0]*mV[0] + mV[1]*mV[1] + mV[2]*mV[2]); 323 F32 mag = fsqrtf(mV[0]*mV[0] + mV[1]*mV[1] + mV[2]*mV[2]);
diff --git a/linden/indra/llmath/v4color.cpp b/linden/indra/llmath/v4color.cpp
index 88237a0..b105769 100644
--- a/linden/indra/llmath/v4color.cpp
+++ b/linden/indra/llmath/v4color.cpp
@@ -161,6 +161,38 @@ LLColor4::LLColor4(const LLVector4& vector4)
161 mV[VW] = vector4.mV[VW]; 161 mV[VW] = vector4.mV[VW];
162} 162}
163 163
164const LLColor4& LLColor4::set(const LLColor4U& color4u)
165{
166 const F32 SCALE = 1.f/255.f;
167 mV[VX] = color4u.mV[VX] * SCALE;
168 mV[VY] = color4u.mV[VY] * SCALE;
169 mV[VZ] = color4u.mV[VZ] * SCALE;
170 mV[VW] = color4u.mV[VW] * SCALE;
171 return (*this);
172}
173
174const LLColor4& LLColor4::set(const LLColor3 &vec)
175{
176 mV[VX] = vec.mV[VX];
177 mV[VY] = vec.mV[VY];
178 mV[VZ] = vec.mV[VZ];
179
180// no change to alpha!
181// mV[VW] = 1.f;
182
183 return (*this);
184}
185
186const LLColor4& LLColor4::set(const LLColor3 &vec, F32 a)
187{
188 mV[VX] = vec.mV[VX];
189 mV[VY] = vec.mV[VY];
190 mV[VZ] = vec.mV[VZ];
191 mV[VW] = a;
192 return (*this);
193}
194
195// deprecated -- use set()
164const LLColor4& LLColor4::setVec(const LLColor4U& color4u) 196const LLColor4& LLColor4::setVec(const LLColor4U& color4u)
165{ 197{
166 const F32 SCALE = 1.f/255.f; 198 const F32 SCALE = 1.f/255.f;
@@ -171,6 +203,7 @@ const LLColor4& LLColor4::setVec(const LLColor4U& color4u)
171 return (*this); 203 return (*this);
172} 204}
173 205
206// deprecated -- use set()
174const LLColor4& LLColor4::setVec(const LLColor3 &vec) 207const LLColor4& LLColor4::setVec(const LLColor3 &vec)
175{ 208{
176 mV[VX] = vec.mV[VX]; 209 mV[VX] = vec.mV[VX];
@@ -183,6 +216,7 @@ const LLColor4& LLColor4::setVec(const LLColor3 &vec)
183 return (*this); 216 return (*this);
184} 217}
185 218
219// deprecated -- use set()
186const LLColor4& LLColor4::setVec(const LLColor3 &vec, F32 a) 220const LLColor4& LLColor4::setVec(const LLColor3 &vec, F32 a)
187{ 221{
188 mV[VX] = vec.mV[VX]; 222 mV[VX] = vec.mV[VX];
@@ -338,270 +372,270 @@ BOOL LLColor4::parseColor(const std::string& buf, LLColor4* color)
338 { 372 {
339 v = v * (1.f / 255.f); 373 v = v * (1.f / 255.f);
340 } 374 }
341 color->setVec( v ); 375 color->set( v );
342 } 376 }
343 else // Single value. Read as a named color. 377 else // Single value. Read as a named color.
344 { 378 {
345 // We have a color name 379 // We have a color name
346 if ( "red" == color_name ) 380 if ( "red" == color_name )
347 { 381 {
348 color->setVec(LLColor4::red); 382 color->set(LLColor4::red);
349 } 383 }
350 else if ( "red1" == color_name ) 384 else if ( "red1" == color_name )
351 { 385 {
352 color->setVec(LLColor4::red1); 386 color->set(LLColor4::red1);
353 } 387 }
354 else if ( "red2" == color_name ) 388 else if ( "red2" == color_name )
355 { 389 {
356 color->setVec(LLColor4::red2); 390 color->set(LLColor4::red2);
357 } 391 }
358 else if ( "red3" == color_name ) 392 else if ( "red3" == color_name )
359 { 393 {
360 color->setVec(LLColor4::red3); 394 color->set(LLColor4::red3);
361 } 395 }
362 else if ( "red4" == color_name ) 396 else if ( "red4" == color_name )
363 { 397 {
364 color->setVec(LLColor4::red4); 398 color->set(LLColor4::red4);
365 } 399 }
366 else if ( "red5" == color_name ) 400 else if ( "red5" == color_name )
367 { 401 {
368 color->setVec(LLColor4::red5); 402 color->set(LLColor4::red5);
369 } 403 }
370 else if( "green" == color_name ) 404 else if( "green" == color_name )
371 { 405 {
372 color->setVec(LLColor4::green); 406 color->set(LLColor4::green);
373 } 407 }
374 else if( "green1" == color_name ) 408 else if( "green1" == color_name )
375 { 409 {
376 color->setVec(LLColor4::green1); 410 color->set(LLColor4::green1);
377 } 411 }
378 else if( "green2" == color_name ) 412 else if( "green2" == color_name )
379 { 413 {
380 color->setVec(LLColor4::green2); 414 color->set(LLColor4::green2);
381 } 415 }
382 else if( "green3" == color_name ) 416 else if( "green3" == color_name )
383 { 417 {
384 color->setVec(LLColor4::green3); 418 color->set(LLColor4::green3);
385 } 419 }
386 else if( "green4" == color_name ) 420 else if( "green4" == color_name )
387 { 421 {
388 color->setVec(LLColor4::green4); 422 color->set(LLColor4::green4);
389 } 423 }
390 else if( "green5" == color_name ) 424 else if( "green5" == color_name )
391 { 425 {
392 color->setVec(LLColor4::green5); 426 color->set(LLColor4::green5);
393 } 427 }
394 else if( "green6" == color_name ) 428 else if( "green6" == color_name )
395 { 429 {
396 color->setVec(LLColor4::green6); 430 color->set(LLColor4::green6);
397 } 431 }
398 else if( "blue" == color_name ) 432 else if( "blue" == color_name )
399 { 433 {
400 color->setVec(LLColor4::blue); 434 color->set(LLColor4::blue);
401 } 435 }
402 else if( "blue1" == color_name ) 436 else if( "blue1" == color_name )
403 { 437 {
404 color->setVec(LLColor4::blue1); 438 color->set(LLColor4::blue1);
405 } 439 }
406 else if( "blue2" == color_name ) 440 else if( "blue2" == color_name )
407 { 441 {
408 color->setVec(LLColor4::blue2); 442 color->set(LLColor4::blue2);
409 } 443 }
410 else if( "blue3" == color_name ) 444 else if( "blue3" == color_name )
411 { 445 {
412 color->setVec(LLColor4::blue3); 446 color->set(LLColor4::blue3);
413 } 447 }
414 else if( "blue4" == color_name ) 448 else if( "blue4" == color_name )
415 { 449 {
416 color->setVec(LLColor4::blue4); 450 color->set(LLColor4::blue4);
417 } 451 }
418 else if( "blue5" == color_name ) 452 else if( "blue5" == color_name )
419 { 453 {
420 color->setVec(LLColor4::blue5); 454 color->set(LLColor4::blue5);
421 } 455 }
422 else if( "blue6" == color_name ) 456 else if( "blue6" == color_name )
423 { 457 {
424 color->setVec(LLColor4::blue6); 458 color->set(LLColor4::blue6);
425 } 459 }
426 else if( "black" == color_name ) 460 else if( "black" == color_name )
427 { 461 {
428 color->setVec(LLColor4::black); 462 color->set(LLColor4::black);
429 } 463 }
430 else if( "white" == color_name ) 464 else if( "white" == color_name )
431 { 465 {
432 color->setVec(LLColor4::white); 466 color->set(LLColor4::white);
433 } 467 }
434 else if( "yellow" == color_name ) 468 else if( "yellow" == color_name )
435 { 469 {
436 color->setVec(LLColor4::yellow); 470 color->set(LLColor4::yellow);
437 } 471 }
438 else if( "yellow1" == color_name ) 472 else if( "yellow1" == color_name )
439 { 473 {
440 color->setVec(LLColor4::yellow1); 474 color->set(LLColor4::yellow1);
441 } 475 }
442 else if( "yellow2" == color_name ) 476 else if( "yellow2" == color_name )
443 { 477 {
444 color->setVec(LLColor4::yellow2); 478 color->set(LLColor4::yellow2);
445 } 479 }
446 else if( "yellow3" == color_name ) 480 else if( "yellow3" == color_name )
447 { 481 {
448 color->setVec(LLColor4::yellow3); 482 color->set(LLColor4::yellow3);
449 } 483 }
450 else if( "yellow4" == color_name ) 484 else if( "yellow4" == color_name )
451 { 485 {
452 color->setVec(LLColor4::yellow4); 486 color->set(LLColor4::yellow4);
453 } 487 }
454 else if( "yellow5" == color_name ) 488 else if( "yellow5" == color_name )
455 { 489 {
456 color->setVec(LLColor4::yellow5); 490 color->set(LLColor4::yellow5);
457 } 491 }
458 else if( "yellow6" == color_name ) 492 else if( "yellow6" == color_name )
459 { 493 {
460 color->setVec(LLColor4::yellow6); 494 color->set(LLColor4::yellow6);
461 } 495 }
462 else if( "magenta" == color_name ) 496 else if( "magenta" == color_name )
463 { 497 {
464 color->setVec(LLColor4::magenta); 498 color->set(LLColor4::magenta);
465 } 499 }
466 else if( "magenta1" == color_name ) 500 else if( "magenta1" == color_name )
467 { 501 {
468 color->setVec(LLColor4::magenta1); 502 color->set(LLColor4::magenta1);
469 } 503 }
470 else if( "magenta2" == color_name ) 504 else if( "magenta2" == color_name )
471 { 505 {
472 color->setVec(LLColor4::magenta2); 506 color->set(LLColor4::magenta2);
473 } 507 }
474 else if( "magenta3" == color_name ) 508 else if( "magenta3" == color_name )
475 { 509 {
476 color->setVec(LLColor4::magenta3); 510 color->set(LLColor4::magenta3);
477 } 511 }
478 else if( "magenta4" == color_name ) 512 else if( "magenta4" == color_name )
479 { 513 {
480 color->setVec(LLColor4::magenta4); 514 color->set(LLColor4::magenta4);
481 } 515 }
482 else if( "purple" == color_name ) 516 else if( "purple" == color_name )
483 { 517 {
484 color->setVec(LLColor4::purple); 518 color->set(LLColor4::purple);
485 } 519 }
486 else if( "purple1" == color_name ) 520 else if( "purple1" == color_name )
487 { 521 {
488 color->setVec(LLColor4::purple1); 522 color->set(LLColor4::purple1);
489 } 523 }
490 else if( "purple2" == color_name ) 524 else if( "purple2" == color_name )
491 { 525 {
492 color->setVec(LLColor4::purple2); 526 color->set(LLColor4::purple2);
493 } 527 }
494 else if( "purple3" == color_name ) 528 else if( "purple3" == color_name )
495 { 529 {
496 color->setVec(LLColor4::purple3); 530 color->set(LLColor4::purple3);
497 } 531 }
498 else if( "purple4" == color_name ) 532 else if( "purple4" == color_name )
499 { 533 {
500 color->setVec(LLColor4::purple4); 534 color->set(LLColor4::purple4);
501 } 535 }
502 else if( "purple5" == color_name ) 536 else if( "purple5" == color_name )
503 { 537 {
504 color->setVec(LLColor4::purple5); 538 color->set(LLColor4::purple5);
505 } 539 }
506 else if( "purple6" == color_name ) 540 else if( "purple6" == color_name )
507 { 541 {
508 color->setVec(LLColor4::purple6); 542 color->set(LLColor4::purple6);
509 } 543 }
510 else if( "pink" == color_name ) 544 else if( "pink" == color_name )
511 { 545 {
512 color->setVec(LLColor4::pink); 546 color->set(LLColor4::pink);
513 } 547 }
514 else if( "pink1" == color_name ) 548 else if( "pink1" == color_name )
515 { 549 {
516 color->setVec(LLColor4::pink1); 550 color->set(LLColor4::pink1);
517 } 551 }
518 else if( "pink2" == color_name ) 552 else if( "pink2" == color_name )
519 { 553 {
520 color->setVec(LLColor4::pink2); 554 color->set(LLColor4::pink2);
521 } 555 }
522 else if( "cyan" == color_name ) 556 else if( "cyan" == color_name )
523 { 557 {
524 color->setVec(LLColor4::cyan); 558 color->set(LLColor4::cyan);
525 } 559 }
526 else if( "cyan1" == color_name ) 560 else if( "cyan1" == color_name )
527 { 561 {
528 color->setVec(LLColor4::cyan1); 562 color->set(LLColor4::cyan1);
529 } 563 }
530 else if( "cyan2" == color_name ) 564 else if( "cyan2" == color_name )
531 { 565 {
532 color->setVec(LLColor4::cyan2); 566 color->set(LLColor4::cyan2);
533 } 567 }
534 else if( "cyan3" == color_name ) 568 else if( "cyan3" == color_name )
535 { 569 {
536 color->setVec(LLColor4::cyan3); 570 color->set(LLColor4::cyan3);
537 } 571 }
538 else if( "cyan4" == color_name ) 572 else if( "cyan4" == color_name )
539 { 573 {
540 color->setVec(LLColor4::cyan4); 574 color->set(LLColor4::cyan4);
541 } 575 }
542 else if( "cyan5" == color_name ) 576 else if( "cyan5" == color_name )
543 { 577 {
544 color->setVec(LLColor4::cyan5); 578 color->set(LLColor4::cyan5);
545 } 579 }
546 else if( "cyan6" == color_name ) 580 else if( "cyan6" == color_name )
547 { 581 {
548 color->setVec(LLColor4::cyan6); 582 color->set(LLColor4::cyan6);
549 } 583 }
550 else if( "smoke" == color_name ) 584 else if( "smoke" == color_name )
551 { 585 {
552 color->setVec(LLColor4::smoke); 586 color->set(LLColor4::smoke);
553 } 587 }
554 else if( "grey" == color_name ) 588 else if( "grey" == color_name )
555 { 589 {
556 color->setVec(LLColor4::grey); 590 color->set(LLColor4::grey);
557 } 591 }
558 else if( "grey1" == color_name ) 592 else if( "grey1" == color_name )
559 { 593 {
560 color->setVec(LLColor4::grey1); 594 color->set(LLColor4::grey1);
561 } 595 }
562 else if( "grey2" == color_name ) 596 else if( "grey2" == color_name )
563 { 597 {
564 color->setVec(LLColor4::grey2); 598 color->set(LLColor4::grey2);
565 } 599 }
566 else if( "grey3" == color_name ) 600 else if( "grey3" == color_name )
567 { 601 {
568 color->setVec(LLColor4::grey3); 602 color->set(LLColor4::grey3);
569 } 603 }
570 else if( "grey4" == color_name ) 604 else if( "grey4" == color_name )
571 { 605 {
572 color->setVec(LLColor4::grey4); 606 color->set(LLColor4::grey4);
573 } 607 }
574 else if( "orange" == color_name ) 608 else if( "orange" == color_name )
575 { 609 {
576 color->setVec(LLColor4::orange); 610 color->set(LLColor4::orange);
577 } 611 }
578 else if( "orange1" == color_name ) 612 else if( "orange1" == color_name )
579 { 613 {
580 color->setVec(LLColor4::orange1); 614 color->set(LLColor4::orange1);
581 } 615 }
582 else if( "orange2" == color_name ) 616 else if( "orange2" == color_name )
583 { 617 {
584 color->setVec(LLColor4::orange2); 618 color->set(LLColor4::orange2);
585 } 619 }
586 else if( "orange3" == color_name ) 620 else if( "orange3" == color_name )
587 { 621 {
588 color->setVec(LLColor4::orange3); 622 color->set(LLColor4::orange3);
589 } 623 }
590 else if( "orange4" == color_name ) 624 else if( "orange4" == color_name )
591 { 625 {
592 color->setVec(LLColor4::orange4); 626 color->set(LLColor4::orange4);
593 } 627 }
594 else if( "orange5" == color_name ) 628 else if( "orange5" == color_name )
595 { 629 {
596 color->setVec(LLColor4::orange5); 630 color->set(LLColor4::orange5);
597 } 631 }
598 else if( "orange6" == color_name ) 632 else if( "orange6" == color_name )
599 { 633 {
600 color->setVec(LLColor4::orange6); 634 color->set(LLColor4::orange6);
601 } 635 }
602 else if ( "clear" == color_name ) 636 else if ( "clear" == color_name )
603 { 637 {
604 color->setVec(0.f, 0.f, 0.f, 0.f); 638 color->set(0.f, 0.f, 0.f, 0.f);
605 } 639 }
606 else 640 else
607 { 641 {
diff --git a/linden/indra/llmath/v4color.h b/linden/indra/llmath/v4color.h
index 53e4407..b01e881 100644
--- a/linden/indra/llmath/v4color.h
+++ b/linden/indra/llmath/v4color.h
@@ -84,20 +84,33 @@ class LLColor4
84 const LLColor4& setToBlack(); // zero LLColor4 to (0, 0, 0, 1) 84 const LLColor4& setToBlack(); // zero LLColor4 to (0, 0, 0, 1)
85 const LLColor4& setToWhite(); // zero LLColor4 to (0, 0, 0, 1) 85 const LLColor4& setToWhite(); // zero LLColor4 to (0, 0, 0, 1)
86 86
87 const LLColor4& setVec(F32 r, F32 g, F32 b, F32 a); // Sets LLColor4 to (r, g, b, a) 87 const LLColor4& setVec(F32 r, F32 g, F32 b, F32 a); // deprecated -- use set()
88 const LLColor4& setVec(F32 r, F32 g, F32 b); // Sets LLColor4 to (r, g, b) (no change in a) 88 const LLColor4& setVec(F32 r, F32 g, F32 b); // deprecated -- use set()
89 const LLColor4& setVec(const LLColor4 &vec); // Sets LLColor4 to vec 89 const LLColor4& setVec(const LLColor4 &vec); // deprecated -- use set()
90 const LLColor4& setVec(const LLColor3 &vec); // Sets LLColor4 to LLColor3 vec (no change in alpha) 90 const LLColor4& setVec(const LLColor3 &vec); // deprecated -- use set()
91 const LLColor4& setVec(const LLColor3 &vec, F32 a); // Sets LLColor4 to LLColor3 vec, with alpha specified 91 const LLColor4& setVec(const LLColor3 &vec, F32 a); // deprecated -- use set()
92 const LLColor4& setVec(const F32 *vec); // Sets LLColor4 to vec 92 const LLColor4& setVec(const F32 *vec); // deprecated -- use set()
93 const LLColor4& setVec(const LLColor4U& color4u); // Sets LLColor4 to color4u, rescaled. 93 const LLColor4& setVec(const LLColor4U& color4u); // deprecated -- use set()
94
95 const LLColor4& set(F32 r, F32 g, F32 b, F32 a); // Sets LLColor4 to (r, g, b, a)
96 const LLColor4& set(F32 r, F32 g, F32 b); // Sets LLColor4 to (r, g, b) (no change in a)
97 const LLColor4& set(const LLColor4 &vec); // Sets LLColor4 to vec
98 const LLColor4& set(const LLColor3 &vec); // Sets LLColor4 to LLColor3 vec (no change in alpha)
99 const LLColor4& set(const LLColor3 &vec, F32 a); // Sets LLColor4 to LLColor3 vec, with alpha specified
100 const LLColor4& set(const F32 *vec); // Sets LLColor4 to vec
101 const LLColor4& set(const LLColor4U& color4u); // Sets LLColor4 to color4u, rescaled.
94 102
95 103
96 const LLColor4& setAlpha(F32 a); 104 const LLColor4& setAlpha(F32 a);
97 105
98 F32 magVec() const; // Returns magnitude of LLColor4 106 F32 magVec() const; // deprecated -- use length()
99 F32 magVecSquared() const; // Returns magnitude squared of LLColor4 107 F32 magVecSquared() const; // deprecated -- use lengthSquared()
100 F32 normVec(); // Normalizes and returns the magnitude of LLColor4 108 F32 normVec(); // deprecated -- use normalize()
109
110 F32 length() const; // Returns magnitude of LLColor4
111 F32 lengthSquared() const; // Returns magnitude squared of LLColor4
112 F32 normalize(); // deprecated -- use normalize()
113
101 BOOL isOpaque() { return mV[VALPHA] == 1.f; } 114 BOOL isOpaque() { return mV[VALPHA] == 1.f; }
102 115
103 F32 operator[](int idx) const { return mV[idx]; } 116 F32 operator[](int idx) const { return mV[idx]; }
@@ -289,6 +302,47 @@ inline const LLColor4& LLColor4::setToWhite(void)
289 return (*this); 302 return (*this);
290} 303}
291 304
305inline const LLColor4& LLColor4::set(F32 x, F32 y, F32 z)
306{
307 mV[VX] = x;
308 mV[VY] = y;
309 mV[VZ] = z;
310
311// no change to alpha!
312// mV[VW] = 1.f;
313
314 return (*this);
315}
316
317inline const LLColor4& LLColor4::set(F32 x, F32 y, F32 z, F32 a)
318{
319 mV[VX] = x;
320 mV[VY] = y;
321 mV[VZ] = z;
322 mV[VW] = a;
323 return (*this);
324}
325
326inline const LLColor4& LLColor4::set(const LLColor4 &vec)
327{
328 mV[VX] = vec.mV[VX];
329 mV[VY] = vec.mV[VY];
330 mV[VZ] = vec.mV[VZ];
331 mV[VW] = vec.mV[VW];
332 return (*this);
333}
334
335
336inline const LLColor4& LLColor4::set(const F32 *vec)
337{
338 mV[VX] = vec[VX];
339 mV[VY] = vec[VY];
340 mV[VZ] = vec[VZ];
341 mV[VW] = vec[VW];
342 return (*this);
343}
344
345// deprecated
292inline const LLColor4& LLColor4::setVec(F32 x, F32 y, F32 z) 346inline const LLColor4& LLColor4::setVec(F32 x, F32 y, F32 z)
293{ 347{
294 mV[VX] = x; 348 mV[VX] = x;
@@ -301,6 +355,7 @@ inline const LLColor4& LLColor4::setVec(F32 x, F32 y, F32 z)
301 return (*this); 355 return (*this);
302} 356}
303 357
358// deprecated
304inline const LLColor4& LLColor4::setVec(F32 x, F32 y, F32 z, F32 a) 359inline const LLColor4& LLColor4::setVec(F32 x, F32 y, F32 z, F32 a)
305{ 360{
306 mV[VX] = x; 361 mV[VX] = x;
@@ -310,6 +365,7 @@ inline const LLColor4& LLColor4::setVec(F32 x, F32 y, F32 z, F32 a)
310 return (*this); 365 return (*this);
311} 366}
312 367
368// deprecated
313inline const LLColor4& LLColor4::setVec(const LLColor4 &vec) 369inline const LLColor4& LLColor4::setVec(const LLColor4 &vec)
314{ 370{
315 mV[VX] = vec.mV[VX]; 371 mV[VX] = vec.mV[VX];
@@ -320,6 +376,7 @@ inline const LLColor4& LLColor4::setVec(const LLColor4 &vec)
320} 376}
321 377
322 378
379// deprecated
323inline const LLColor4& LLColor4::setVec(const F32 *vec) 380inline const LLColor4& LLColor4::setVec(const F32 *vec)
324{ 381{
325 mV[VX] = vec[VX]; 382 mV[VX] = vec[VX];
@@ -337,16 +394,44 @@ inline const LLColor4& LLColor4::setAlpha(F32 a)
337 394
338// LLColor4 Magnitude and Normalization Functions 395// LLColor4 Magnitude and Normalization Functions
339 396
397inline F32 LLColor4::length(void) const
398{
399 return fsqrtf(mV[VX]*mV[VX] + mV[VY]*mV[VY] + mV[VZ]*mV[VZ]);
400}
401
402inline F32 LLColor4::lengthSquared(void) const
403{
404 return mV[VX]*mV[VX] + mV[VY]*mV[VY] + mV[VZ]*mV[VZ];
405}
406
407inline F32 LLColor4::normalize(void)
408{
409 F32 mag = fsqrtf(mV[VX]*mV[VX] + mV[VY]*mV[VY] + mV[VZ]*mV[VZ]);
410 F32 oomag;
411
412 if (mag)
413 {
414 oomag = 1.f/mag;
415 mV[VX] *= oomag;
416 mV[VY] *= oomag;
417 mV[VZ] *= oomag;
418 }
419 return (mag);
420}
421
422// deprecated
340inline F32 LLColor4::magVec(void) const 423inline F32 LLColor4::magVec(void) const
341{ 424{
342 return fsqrtf(mV[VX]*mV[VX] + mV[VY]*mV[VY] + mV[VZ]*mV[VZ]); 425 return fsqrtf(mV[VX]*mV[VX] + mV[VY]*mV[VY] + mV[VZ]*mV[VZ]);
343} 426}
344 427
428// deprecated
345inline F32 LLColor4::magVecSquared(void) const 429inline F32 LLColor4::magVecSquared(void) const
346{ 430{
347 return mV[VX]*mV[VX] + mV[VY]*mV[VY] + mV[VZ]*mV[VZ]; 431 return mV[VX]*mV[VX] + mV[VY]*mV[VY] + mV[VZ]*mV[VZ];
348} 432}
349 433
434// deprecated
350inline F32 LLColor4::normVec(void) 435inline F32 LLColor4::normVec(void)
351{ 436{
352 F32 mag = fsqrtf(mV[VX]*mV[VX] + mV[VY]*mV[VY] + mV[VZ]*mV[VZ]); 437 F32 mag = fsqrtf(mV[VX]*mV[VX] + mV[VY]*mV[VY] + mV[VZ]*mV[VZ]);
@@ -497,13 +582,13 @@ inline const LLColor4& operator%=(LLColor4 &a, F32 k)
497inline F32 distVec(const LLColor4 &a, const LLColor4 &b) 582inline F32 distVec(const LLColor4 &a, const LLColor4 &b)
498{ 583{
499 LLColor4 vec = a - b; 584 LLColor4 vec = a - b;
500 return (vec.magVec()); 585 return (vec.length());
501} 586}
502 587
503inline F32 distVec_squared(const LLColor4 &a, const LLColor4 &b) 588inline F32 distVec_squared(const LLColor4 &a, const LLColor4 &b)
504{ 589{
505 LLColor4 vec = a - b; 590 LLColor4 vec = a - b;
506 return (vec.magVecSquared()); 591 return (vec.lengthSquared());
507} 592}
508 593
509inline LLColor4 lerp(const LLColor4 &a, const LLColor4 &b, F32 u) 594inline LLColor4 lerp(const LLColor4 &a, const LLColor4 &b, F32 u)
diff --git a/linden/indra/llmath/v4coloru.cpp b/linden/indra/llmath/v4coloru.cpp
index 7ad7eb2..fdad596 100644
--- a/linden/indra/llmath/v4coloru.cpp
+++ b/linden/indra/llmath/v4coloru.cpp
@@ -120,6 +120,6 @@ BOOL LLColor4U::parseColor4U(const std::string& buf, LLColor4U* value)
120 } 120 }
121 } 121 }
122 122
123 value->setVec( U8(v[0]), U8(v[1]), U8(v[2]), U8(v[3]) ); 123 value->set( U8(v[0]), U8(v[1]), U8(v[2]), U8(v[3]) );
124 return TRUE; 124 return TRUE;
125} 125}
diff --git a/linden/indra/llmath/v4coloru.h b/linden/indra/llmath/v4coloru.h
index 910a081..d46ca52 100644
--- a/linden/indra/llmath/v4coloru.h
+++ b/linden/indra/llmath/v4coloru.h
@@ -97,15 +97,23 @@ public:
97 const LLColor4U& setToBlack(); // zero LLColor4U to (0, 0, 0, 1) 97 const LLColor4U& setToBlack(); // zero LLColor4U to (0, 0, 0, 1)
98 const LLColor4U& setToWhite(); // zero LLColor4U to (0, 0, 0, 1) 98 const LLColor4U& setToWhite(); // zero LLColor4U to (0, 0, 0, 1)
99 99
100 const LLColor4U& setVec(U8 r, U8 g, U8 b, U8 a); // Sets LLColor4U to (r, g, b, a) 100 const LLColor4U& set(U8 r, U8 g, U8 b, U8 a);// Sets LLColor4U to (r, g, b, a)
101 const LLColor4U& setVec(U8 r, U8 g, U8 b); // Sets LLColor4U to (r, g, b) (no change in a) 101 const LLColor4U& set(U8 r, U8 g, U8 b); // Sets LLColor4U to (r, g, b) (no change in a)
102 const LLColor4U& setVec(const LLColor4U &vec); // Sets LLColor4U to vec 102 const LLColor4U& set(const LLColor4U &vec); // Sets LLColor4U to vec
103 const LLColor4U& setVec(const U8 *vec); // Sets LLColor4U to vec 103 const LLColor4U& set(const U8 *vec); // Sets LLColor4U to vec
104
105 const LLColor4U& setVec(U8 r, U8 g, U8 b, U8 a); // deprecated -- use set()
106 const LLColor4U& setVec(U8 r, U8 g, U8 b); // deprecated -- use set()
107 const LLColor4U& setVec(const LLColor4U &vec); // deprecated -- use set()
108 const LLColor4U& setVec(const U8 *vec); // deprecated -- use set()
104 109
105 const LLColor4U& setAlpha(U8 a); 110 const LLColor4U& setAlpha(U8 a);
106 111
107 F32 magVec() const; // Returns magnitude of LLColor4U 112 F32 magVec() const; // deprecated -- use length()
108 F32 magVecSquared() const; // Returns magnitude squared of LLColor4U 113 F32 magVecSquared() const; // deprecated -- use lengthSquared()
114
115 F32 length() const; // Returns magnitude squared of LLColor4U
116 F32 lengthSquared() const; // Returns magnitude squared of LLColor4U
109 117
110 friend std::ostream& operator<<(std::ostream& s, const LLColor4U &a); // Print a 118 friend std::ostream& operator<<(std::ostream& s, const LLColor4U &a); // Print a
111 friend LLColor4U operator+(const LLColor4U &a, const LLColor4U &b); // Return vector a + b 119 friend LLColor4U operator+(const LLColor4U &a, const LLColor4U &b); // Return vector a + b
@@ -199,7 +207,7 @@ inline const LLColor4U& LLColor4U::setToWhite(void)
199 return (*this); 207 return (*this);
200} 208}
201 209
202inline const LLColor4U& LLColor4U::setVec(const U8 x, const U8 y, const U8 z) 210inline const LLColor4U& LLColor4U::set(const U8 x, const U8 y, const U8 z)
203{ 211{
204 mV[VX] = x; 212 mV[VX] = x;
205 mV[VY] = y; 213 mV[VY] = y;
@@ -211,7 +219,7 @@ inline const LLColor4U& LLColor4U::setVec(const U8 x, const U8 y, const U8 z)
211 return (*this); 219 return (*this);
212} 220}
213 221
214inline const LLColor4U& LLColor4U::setVec(const U8 r, const U8 g, const U8 b, U8 a) 222inline const LLColor4U& LLColor4U::set(const U8 r, const U8 g, const U8 b, U8 a)
215{ 223{
216 mV[0] = r; 224 mV[0] = r;
217 mV[1] = g; 225 mV[1] = g;
@@ -220,7 +228,7 @@ inline const LLColor4U& LLColor4U::setVec(const U8 r, const U8 g, const U8 b, U8
220 return (*this); 228 return (*this);
221} 229}
222 230
223inline const LLColor4U& LLColor4U::setVec(const LLColor4U &vec) 231inline const LLColor4U& LLColor4U::set(const LLColor4U &vec)
224{ 232{
225 mV[VX] = vec.mV[VX]; 233 mV[VX] = vec.mV[VX];
226 mV[VY] = vec.mV[VY]; 234 mV[VY] = vec.mV[VY];
@@ -229,17 +237,49 @@ inline const LLColor4U& LLColor4U::setVec(const LLColor4U &vec)
229 return (*this); 237 return (*this);
230} 238}
231 239
232/* 240inline const LLColor4U& LLColor4U::set(const U8 *vec)
233inline const LLColor4U& LLColor4U::setVec(const LLColor4 &vec)
234{ 241{
235 mV[VX] = (U8) (llmin(1.f, vec.mV[VX]) * 255.f); 242 mV[VX] = vec[VX];
236 mV[VY] = (U8) (llmin(1.f, vec.mV[VY]) * 255.f); 243 mV[VY] = vec[VY];
237 mV[VZ] = (U8) (llmin(1.f, vec.mV[VZ]) * 255.f); 244 mV[VZ] = vec[VZ];
238 mV[VW] = (U8) (llmin(1.f, vec.mV[VW]) * 255.f); 245 mV[VW] = vec[VW];
239 return (*this); 246 return (*this);
240} 247}
241*/
242 248
249// deprecated
250inline const LLColor4U& LLColor4U::setVec(const U8 x, const U8 y, const U8 z)
251{
252 mV[VX] = x;
253 mV[VY] = y;
254 mV[VZ] = z;
255
256// no change to alpha!
257// mV[VW] = 255;
258
259 return (*this);
260}
261
262// deprecated
263inline const LLColor4U& LLColor4U::setVec(const U8 r, const U8 g, const U8 b, U8 a)
264{
265 mV[0] = r;
266 mV[1] = g;
267 mV[2] = b;
268 mV[3] = a;
269 return (*this);
270}
271
272// deprecated
273inline const LLColor4U& LLColor4U::setVec(const LLColor4U &vec)
274{
275 mV[VX] = vec.mV[VX];
276 mV[VY] = vec.mV[VY];
277 mV[VZ] = vec.mV[VZ];
278 mV[VW] = vec.mV[VW];
279 return (*this);
280}
281
282// deprecated
243inline const LLColor4U& LLColor4U::setVec(const U8 *vec) 283inline const LLColor4U& LLColor4U::setVec(const U8 *vec)
244{ 284{
245 mV[VX] = vec[VX]; 285 mV[VX] = vec[VX];
@@ -256,13 +296,24 @@ inline const LLColor4U& LLColor4U::setAlpha(U8 a)
256} 296}
257 297
258// LLColor4U Magnitude and Normalization Functions 298// LLColor4U Magnitude and Normalization Functions
259// bookmark
260 299
300inline F32 LLColor4U::length(void) const
301{
302 return fsqrtf( ((F32)mV[VX]) * mV[VX] + ((F32)mV[VY]) * mV[VY] + ((F32)mV[VZ]) * mV[VZ] );
303}
304
305inline F32 LLColor4U::lengthSquared(void) const
306{
307 return ((F32)mV[VX]) * mV[VX] + ((F32)mV[VY]) * mV[VY] + ((F32)mV[VZ]) * mV[VZ];
308}
309
310// deprecated
261inline F32 LLColor4U::magVec(void) const 311inline F32 LLColor4U::magVec(void) const
262{ 312{
263 return fsqrtf( ((F32)mV[VX]) * mV[VX] + ((F32)mV[VY]) * mV[VY] + ((F32)mV[VZ]) * mV[VZ] ); 313 return fsqrtf( ((F32)mV[VX]) * mV[VX] + ((F32)mV[VY]) * mV[VY] + ((F32)mV[VZ]) * mV[VZ] );
264} 314}
265 315
316// deprecated
266inline F32 LLColor4U::magVecSquared(void) const 317inline F32 LLColor4U::magVecSquared(void) const
267{ 318{
268 return ((F32)mV[VX]) * mV[VX] + ((F32)mV[VY]) * mV[VY] + ((F32)mV[VZ]) * mV[VZ]; 319 return ((F32)mV[VX]) * mV[VX] + ((F32)mV[VY]) * mV[VY] + ((F32)mV[VZ]) * mV[VZ];
@@ -407,13 +458,13 @@ inline const LLColor4U& operator%=(LLColor4U &a, U8 k)
407inline F32 distVec(const LLColor4U &a, const LLColor4U &b) 458inline F32 distVec(const LLColor4U &a, const LLColor4U &b)
408{ 459{
409 LLColor4U vec = a - b; 460 LLColor4U vec = a - b;
410 return (vec.magVec()); 461 return (vec.length());
411} 462}
412 463
413inline F32 distVec_squared(const LLColor4U &a, const LLColor4U &b) 464inline F32 distVec_squared(const LLColor4U &a, const LLColor4U &b)
414{ 465{
415 LLColor4U vec = a - b; 466 LLColor4U vec = a - b;
416 return (vec.magVecSquared()); 467 return (vec.lengthSquared());
417} 468}
418 469
419void LLColor4U::setVecScaleClamp(const LLColor4& color) 470void LLColor4U::setVecScaleClamp(const LLColor4& color)
diff --git a/linden/indra/llmedia/CMakeLists.txt b/linden/indra/llmedia/CMakeLists.txt
index 8ef8006..0c892f9 100644
--- a/linden/indra/llmedia/CMakeLists.txt
+++ b/linden/indra/llmedia/CMakeLists.txt
@@ -11,6 +11,7 @@ include(LLMedia)
11include(LLMessage) 11include(LLMessage)
12include(LLWindow) 12include(LLWindow)
13include(Mozlib) 13include(Mozlib)
14include(QuickTime)
14 15
15include_directories( 16include_directories(
16 ${GSTREAMER_INCLUDE_DIRS} 17 ${GSTREAMER_INCLUDE_DIRS}
@@ -92,3 +93,9 @@ set_source_files_properties(${llmedia_HEADER_FILES}
92list(APPEND llmedia_SOURCE_FILES ${llmedia_HEADER_FILES}) 93list(APPEND llmedia_SOURCE_FILES ${llmedia_HEADER_FILES})
93 94
94add_library (llmedia ${llmedia_SOURCE_FILES}) 95add_library (llmedia ${llmedia_SOURCE_FILES})
96target_link_libraries(
97 llmedia
98 ${GSTREAMER_LIBRARIES}
99 ${GSTREAMER_PLUGINS_BASE_LIBRARIES}
100 ${QUICKTIME_LIBRARY}
101 )
diff --git a/linden/indra/llmedia/llmediaimplexample2.cpp b/linden/indra/llmedia/llmediaimplexample2.cpp
index 13036f9..dc19f55 100644
--- a/linden/indra/llmedia/llmediaimplexample2.cpp
+++ b/linden/indra/llmedia/llmediaimplexample2.cpp
@@ -45,7 +45,7 @@ static LLMediaImplRegister sLLMediaImplExample2Reg( "LLMediaImplExample2", new L
45LLMediaImplExample2Maker::LLMediaImplExample2Maker() 45LLMediaImplExample2Maker::LLMediaImplExample2Maker()
46{ 46{
47 // Register to handle the scheme 47 // Register to handle the scheme
48 mSchema.push_back( "example2" ); 48 mSchema.push_back( "example2." );
49} 49}
50 50
51/////////////////////////////////////////////////////////////////////////////// 51///////////////////////////////////////////////////////////////////////////////
diff --git a/linden/indra/llmedia/llmediaimplgstreamer.cpp b/linden/indra/llmedia/llmediaimplgstreamer.cpp
index 51a5bca..b1d36f0 100644
--- a/linden/indra/llmedia/llmediaimplgstreamer.cpp
+++ b/linden/indra/llmedia/llmediaimplgstreamer.cpp
@@ -171,6 +171,9 @@ startup ( LLMediaManagerData* init_data )
171 static bool done_init = false; 171 static bool done_init = false;
172 if (!done_init) 172 if (!done_init)
173 { 173 {
174 // Init the glib type system - we need it.
175 g_type_init();
176
174 // Get symbols! 177 // Get symbols!
175 if (! grab_gst_syms("libgstreamer-0.10.so.0", 178 if (! grab_gst_syms("libgstreamer-0.10.so.0",
176 "libgstvideo-0.10.so.0", 179 "libgstvideo-0.10.so.0",
diff --git a/linden/indra/llmessage/CMakeLists.txt b/linden/indra/llmessage/CMakeLists.txt
index ba17265..fd22de9 100644
--- a/linden/indra/llmessage/CMakeLists.txt
+++ b/linden/indra/llmessage/CMakeLists.txt
@@ -189,3 +189,11 @@ set_source_files_properties(${llmessage_HEADER_FILES}
189list(APPEND llmessage_SOURCE_FILES ${llmessage_HEADER_FILES}) 189list(APPEND llmessage_SOURCE_FILES ${llmessage_HEADER_FILES})
190 190
191add_library (llmessage ${llmessage_SOURCE_FILES}) 191add_library (llmessage ${llmessage_SOURCE_FILES})
192target_link_libraries(
193 llmessage
194 ${CURL_LIBRARIES}
195 ${CARES_LIBRARIES}
196 ${OPENSSL_LIBRARIES}
197 ${CRYPTO_LIBRARIES}
198 ${XMLRPCEPI_LIBRARIES}
199 )
diff --git a/linden/indra/llmessage/llcachename.cpp b/linden/indra/llmessage/llcachename.cpp
index 70e1ccf..8f02358 100644
--- a/linden/indra/llmessage/llcachename.cpp
+++ b/linden/indra/llmessage/llcachename.cpp
@@ -41,7 +41,8 @@
41#include "llsdserialize.h" 41#include "llsdserialize.h"
42#include "lluuid.h" 42#include "lluuid.h"
43#include "message.h" 43#include "message.h"
44 44#include "llservicebuilder.h"
45#include "llframetimer.h"
45// Constants 46// Constants
46static const std::string CN_WAITING("(Loading...)"); // *TODO: translate 47static const std::string CN_WAITING("(Loading...)"); // *TODO: translate
47static const std::string CN_NOBODY("(nobody)"); // *TODO: translate 48static const std::string CN_NOBODY("(nobody)"); // *TODO: translate
@@ -196,6 +197,8 @@ class LLCacheName::Impl
196public: 197public:
197 LLMessageSystem* mMsg; 198 LLMessageSystem* mMsg;
198 LLHost mUpstreamHost; 199 LLHost mUpstreamHost;
200 std::string mGroupNameURL;
201 std::string mAgentNameURL;
199 202
200 Cache mCache; 203 Cache mCache;
201 // the map of UUIDs to names 204 // the map of UUIDs to names
@@ -221,6 +224,8 @@ public:
221 void processPendingReplies(); 224 void processPendingReplies();
222 void sendRequest(const char* msg_name, const AskQueue& queue); 225 void sendRequest(const char* msg_name, const AskQueue& queue);
223 bool isRequestPending(const LLUUID& id); 226 bool isRequestPending(const LLUUID& id);
227 void getAgentName(const AskQueue&);
228 void getGroupName(const AskQueue&);
224 229
225 // Message system callbacks. 230 // Message system callbacks.
226 void processUUIDRequest(LLMessageSystem* msg, bool isGroup); 231 void processUUIDRequest(LLMessageSystem* msg, bool isGroup);
@@ -234,6 +239,35 @@ public:
234 void notifyObservers(const LLUUID& id, const std::string& first, const std::string& last, BOOL group); 239 void notifyObservers(const LLUUID& id, const std::string& first, const std::string& last, BOOL group);
235}; 240};
236 241
242class LLHTTPAgentNamesResponse : public LLHTTPClient::Responder
243{
244public:
245 LLHTTPAgentNamesResponse(const LLSD& agent_ids)
246 : mAgentIDs(agent_ids)
247 { }
248 void result(const LLSD& content);
249private:
250 LLHost mSender;
251 LLSD mAgentIDs;
252
253};
254
255class LLHTTPGroupNamesResponse : public LLHTTPClient::Responder
256{
257public:
258 LLHTTPGroupNamesResponse(const LLSD& group_ids)
259 : mGroupIDs(group_ids)
260 { };
261
262 void result(const LLSD& content);
263private:
264 LLHost mSender;
265 LLSD mGroupIDs;
266
267};
268
269
270
237 271
238/// -------------------------------------------------------------------------- 272/// --------------------------------------------------------------------------
239/// class LLCacheName 273/// class LLCacheName
@@ -319,6 +353,57 @@ void LLCacheName::cancelCallback(const LLUUID& id, LLCacheNameCallback callback,
319 } 353 }
320} 354}
321 355
356void LLCacheName::sendAgentNames(const LLUUID& id, std::string& first, std::string& last)
357{
358
359 LLCacheNameEntry* entry = get_ptr_in_map(impl.mCache, id);
360 if (!entry)
361 {
362 entry = new LLCacheNameEntry;
363 impl.mCache[id] = entry;
364
365 }
366 entry->mIsGroup = false;
367 entry->mCreateTime = (U32)LLFrameTimer::getTotalSeconds();
368 //entry->mFirstName = first;
369 //entry->mLastName = last;
370 //LLStringUtil::truncate(entry->mFirstName, DB_FIRST_NAME_BUF_SIZE);
371 //LLStringUtil::truncate(entry->mLastName, DB_LAST_NAME_BUF_SIZE);
372 entry->mFirstName = std::string(first, DB_FIRST_NAME_BUF_SIZE);
373 entry->mLastName = std::string(last, DB_LAST_NAME_BUF_SIZE);
374
375 impl.mPendingQueue.erase(id);
376 impl.notifyObservers(id,
377 entry->mFirstName, entry->mLastName,
378 FALSE);
379
380}
381
382void LLCacheName::sendGroupNames(const LLUUID& id, std::string& name)
383{
384
385 LLCacheNameEntry* entry = get_ptr_in_map(impl.mCache, id);
386 if (!entry)
387 {
388 entry = new LLCacheNameEntry;
389 impl.mCache[id] = entry;
390
391 }
392
393 entry->mIsGroup = true;
394 entry->mCreateTime = (U32)time(NULL);
395
396 entry->mGroupName = std::string(name, DB_GROUP_NAME_BUF_SIZE);
397
398 impl.mPendingQueue.erase(id);
399
400 impl.notifyObservers(id,
401 entry->mFirstName, entry->mLastName,
402 FALSE);
403
404
405}
406
322void LLCacheName::importFile(LLFILE* fp) 407void LLCacheName::importFile(LLFILE* fp)
323{ 408{
324 S32 count = 0; 409 S32 count = 0;
@@ -524,6 +609,16 @@ BOOL LLCacheName::getFullName(const LLUUID& id, std::string& fullname)
524 return res; 609 return res;
525} 610}
526 611
612void LLCacheName::setGroupURL(const std::string& group_url)
613{
614 impl.mGroupNameURL = group_url;
615}
616
617void LLCacheName::setAgentURL(const std::string& agent_url)
618{
619 impl.mAgentNameURL = agent_url;
620}
621
527BOOL LLCacheName::getGroupName(const LLUUID& id, std::string& group) 622BOOL LLCacheName::getGroupName(const LLUUID& id, std::string& group)
528{ 623{
529 if(id.isNull()) 624 if(id.isNull())
@@ -558,6 +653,111 @@ BOOL LLCacheName::getGroupName(const LLUUID& id, std::string& group)
558 } 653 }
559} 654}
560 655
656void LLCacheName::Impl::getAgentName(const AskQueue &queue)
657{
658
659 // get the names from backbone module
660 if(queue.empty())
661 {
662 return;
663 }
664
665 LLSD request;
666 request["action"] = "GET";
667 LLSD id_block = LLSD::emptyArray();
668 AskQueue::const_iterator it = queue.begin();
669 AskQueue::const_iterator end = queue.end();
670 for(;it!=end;++it)
671 {
672 id_block.append(*it);
673 }
674 lldebugs<<LLSDOStreamer<LLSDNotationFormatter>(id_block) <<llendl;
675
676 request["agents"] = id_block;
677
678 LLHTTPClient::post(
679 mAgentNameURL,
680 request,
681 new LLHTTPAgentNamesResponse(id_block));
682
683
684 lldebugs<<"Service builder call to agent-name "<<mAgentNameURL<<llendl;
685
686}
687
688void LLHTTPAgentNamesResponse::result(const LLSD& content)
689{
690 LLUUID id;
691 lldebugs<<LLSDOStreamer<LLSDNotationFormatter>(content) <<llendl;
692
693 LLSD::map_const_iterator iter = content.beginMap();
694 for ( ; iter != content.endMap(); ++iter)
695 {
696 id.set((*iter).first);
697 LLSD name = (*iter).second;
698 LLCacheNameEntry* entry = new LLCacheNameEntry;
699 entry->mIsGroup = FALSE;
700 entry->mCreateTime = (U32)LLFrameTimer::getTotalSeconds();
701 std::string first = name["first"];
702 std::string last = name["last"];
703 entry->mFirstName = std::string(first, DB_FIRST_NAME_BUF_SIZE);
704 entry->mLastName = std::string(last, DB_LAST_NAME_BUF_SIZE);
705
706 gCacheName->sendAgentNames(id,first,last);
707 }
708}
709
710
711void LLCacheName::Impl::getGroupName(const AskQueue &queue)
712{
713 // get the group names from backbone module
714 if(queue.empty())
715 {
716 return;
717 }
718
719 LLSD request;
720 request["action"] = "GET";
721 LLSD id_block = LLSD::emptyArray();
722 AskQueue::const_iterator it = queue.begin();
723 AskQueue::const_iterator end = queue.end();
724 for(;it!=end;++it)
725 {
726 id_block.append(*it);
727 }
728
729 request["groups"] = id_block;
730
731 if(!mGroupNameURL.empty())
732 {
733 LLHTTPClient::post(
734 mGroupNameURL,
735 request,
736 new LLHTTPGroupNamesResponse(id_block));
737 }
738 lldebugs<<"Service builder call to group-name "<< mGroupNameURL<<llendl;
739}
740
741void LLHTTPGroupNamesResponse::result(const LLSD& content)
742{
743 lldebugs<<"Result"<<LLSDOStreamer<LLSDNotationFormatter>(content) << llendl;
744 LLUUID id;
745
746 LLSD::map_const_iterator iter = content.beginMap();
747 for ( ; iter != content.endMap(); ++iter)
748 {
749
750 id.set((*iter).first);
751 std::string name = (*iter).second.asString();
752 LLCacheNameEntry* entry = new LLCacheNameEntry;
753 entry->mIsGroup = TRUE;
754 entry->mCreateTime = (U32)time(NULL);
755 entry->mGroupName = std::string(name, DB_GROUP_NAME_BUF_SIZE);
756 lldebugs<<"Group Name"<<name<<llendl;
757 gCacheName->sendGroupNames(id,name);
758 }
759}
760
561// TODO: Make the cache name callback take a SINGLE std::string, 761// TODO: Make the cache name callback take a SINGLE std::string,
562// not a separate first and last name. 762// not a separate first and last name.
563void LLCacheName::get(const LLUUID& id, BOOL is_group, LLCacheNameCallback callback, void* user_data) 763void LLCacheName::get(const LLUUID& id, BOOL is_group, LLCacheNameCallback callback, void* user_data)
@@ -606,12 +806,14 @@ void LLCacheName::processPending()
606 return; 806 return;
607 } 807 }
608 808
809 /*
609 if(!impl.mUpstreamHost.isOk()) 810 if(!impl.mUpstreamHost.isOk())
610 { 811 {
611 lldebugs << "LLCacheName::processPending() - bad upstream host." 812 lldebugs << "LLCacheName::processPending() - bad upstream host."
612 << llendl; 813 << llendl;
613 return; 814 return;
614 } 815 }
816 */
615 817
616 impl.processPendingAsks(); 818 impl.processPendingAsks();
617 impl.processPendingReplies(); 819 impl.processPendingReplies();
@@ -693,8 +895,16 @@ std::string LLCacheName::getDefaultName()
693 895
694void LLCacheName::Impl::processPendingAsks() 896void LLCacheName::Impl::processPendingAsks()
695{ 897{
696 sendRequest(_PREHASH_UUIDNameRequest, mAskNameQueue); 898 if (mUpstreamHost.isOk()) //its the vuewer asking for names send request to simulator
697 sendRequest(_PREHASH_UUIDGroupNameRequest, mAskGroupQueue); 899 {
900 sendRequest(_PREHASH_UUIDNameRequest, mAskNameQueue);
901 sendRequest(_PREHASH_UUIDGroupNameRequest, mAskGroupQueue);
902 }
903 else //its simulator asking for names ask the backbone
904 {
905 getAgentName(mAskNameQueue);
906 getGroupName(mAskGroupQueue);
907 }
698 mAskNameQueue.clear(); 908 mAskNameQueue.clear();
699 mAskGroupQueue.clear(); 909 mAskGroupQueue.clear();
700} 910}
@@ -815,12 +1025,15 @@ void LLCacheName::Impl::processUUIDRequest(LLMessageSystem* msg, bool isGroup)
815{ 1025{
816 // You should only get this message if the cache is at the simulator 1026 // You should only get this message if the cache is at the simulator
817 // level, hence having an upstream provider. 1027 // level, hence having an upstream provider.
1028 // 03/31/2008 Simulator is talking to backbone and not dataserver
1029 // This check was for dataserver
1030 /*
818 if (!mUpstreamHost.isOk()) 1031 if (!mUpstreamHost.isOk())
819 { 1032 {
820 llwarns << "LLCacheName - got UUID name/group request, but no upstream provider!" << llendl; 1033 llwarns << "LLCacheName - got UUID name/group request, but no upstream provider!" << llendl;
821 return; 1034 return;
822 } 1035 }
823 1036 */
824 LLHost fromHost = msg->getSender(); 1037 LLHost fromHost = msg->getSender();
825 ReplySender sender(msg); 1038 ReplySender sender(msg);
826 1039
diff --git a/linden/indra/llmessage/llcachename.h b/linden/indra/llmessage/llcachename.h
index 965b4ba..af644d0 100644
--- a/linden/indra/llmessage/llcachename.h
+++ b/linden/indra/llmessage/llcachename.h
@@ -31,7 +31,9 @@
31 31
32#ifndef LL_LLCACHENAME_H 32#ifndef LL_LLCACHENAME_H
33#define LL_LLCACHENAME_H 33#define LL_LLCACHENAME_H
34 34#include "llhttpclient.h"
35#include "llhost.h"
36#include "lluri.h"
35class LLMessageSystem; 37class LLMessageSystem;
36class LLHost; 38class LLHost;
37class LLUUID; 39class LLUUID;
@@ -97,10 +99,15 @@ public:
97 // This method needs to be called from time to time to send out 99 // This method needs to be called from time to time to send out
98 // requests. 100 // requests.
99 void processPending(); 101 void processPending();
100 102 void setAgentURL(const std::string& url);
103 void setGroupURL(const std::string& url);
104
101 // Expire entries created more than "secs" seconds ago. 105 // Expire entries created more than "secs" seconds ago.
102 void deleteEntriesOlderThan(S32 secs); 106 void deleteEntriesOlderThan(S32 secs);
103 107
108 //send the information retrived from backbone
109 void sendAgentNames(const LLUUID& id, std::string& first, std::string& last);
110 void sendGroupNames(const LLUUID& id, std::string& name);
104 // Debugging 111 // Debugging
105 void dump(); // Dumps the contents of the cache 112 void dump(); // Dumps the contents of the cache
106 void dumpStats(); // Dumps the sizes of the cache and associated queues. 113 void dumpStats(); // Dumps the sizes of the cache and associated queues.
@@ -111,9 +118,8 @@ private:
111 118
112 class Impl; 119 class Impl;
113 Impl& impl; 120 Impl& impl;
114};
115
116 121
122};
117 123
118extern LLCacheName* gCacheName; 124extern LLCacheName* gCacheName;
119 125
diff --git a/linden/indra/llmessage/llcircuit.cpp b/linden/indra/llmessage/llcircuit.cpp
index 12a1520..7b2f241 100644
--- a/linden/indra/llmessage/llcircuit.cpp
+++ b/linden/indra/llmessage/llcircuit.cpp
@@ -60,6 +60,7 @@
60#include "llrand.h" 60#include "llrand.h"
61#include "llstl.h" 61#include "llstl.h"
62#include "lltransfermanager.h" 62#include "lltransfermanager.h"
63#include "llmodularmath.h"
63 64
64const F32 PING_INTERVAL = 5.f; // seconds 65const F32 PING_INTERVAL = 5.f; // seconds
65const S32 PING_START_BLOCK = 3; // How many pings behind we have to be to consider ourself blocked. 66const S32 PING_START_BLOCK = 3; // How many pings behind we have to be to consider ourself blocked.
@@ -676,6 +677,8 @@ void LLCircuitData::checkPacketInID(TPACKETID id, BOOL receive_resent)
676 mPacketsIn++; 677 mPacketsIn++;
677 setPacketInID((id + 1) % LL_MAX_OUT_PACKET_ID); 678 setPacketInID((id + 1) % LL_MAX_OUT_PACKET_ID);
678 679
680 mLastPacketGap = 0;
681 mOutOfOrderRate.count(0);
679 return; 682 return;
680 } 683 }
681 684
@@ -683,6 +686,7 @@ void LLCircuitData::checkPacketInID(TPACKETID id, BOOL receive_resent)
683 686
684 687
685 // now, check to see if we've got a gap 688 // now, check to see if we've got a gap
689 U32 gap = 0;
686 if ((mPacketsInID == id)) 690 if ((mPacketsInID == id))
687 { 691 {
688 // nope! bump and wrap the counter, then return 692 // nope! bump and wrap the counter, then return
@@ -704,6 +708,11 @@ void LLCircuitData::checkPacketInID(TPACKETID id, BOOL receive_resent)
704 // otherwise, walk from mCurrentCircuit->mPacketsInID to id with wrapping, adding the values to the map 708 // otherwise, walk from mCurrentCircuit->mPacketsInID to id with wrapping, adding the values to the map
705 // and setting mPacketsInID to id + 1 % LL_MAX_OUT_PACKET_ID 709 // and setting mPacketsInID to id + 1 % LL_MAX_OUT_PACKET_ID
706 710
711 // babbage: all operands in expression are unsigned, so modular
712 // arithmetic will always find correct gap, regardless of wrap arounds.
713 const U8 width = 24;
714 gap = LLModularMath::subtract<width>(mPacketsInID, id);
715
707 if (mPotentialLostPackets.find(id) != mPotentialLostPackets.end()) 716 if (mPotentialLostPackets.find(id) != mPotentialLostPackets.end())
708 { 717 {
709 if(gMessageSystem->mVerboseLog) 718 if(gMessageSystem->mVerboseLog)
@@ -765,6 +774,8 @@ void LLCircuitData::checkPacketInID(TPACKETID id, BOOL receive_resent)
765 774
766 } 775 }
767 } 776 }
777 mOutOfOrderRate.count(gap);
778 mLastPacketGap = gap;
768} 779}
769 780
770 781
diff --git a/linden/indra/llmessage/llcircuit.h b/linden/indra/llmessage/llcircuit.h
index 552b50f..3b9df02 100644
--- a/linden/indra/llmessage/llcircuit.h
+++ b/linden/indra/llmessage/llcircuit.h
@@ -45,6 +45,7 @@
45#include "llpacketack.h" 45#include "llpacketack.h"
46#include "lluuid.h" 46#include "lluuid.h"
47#include "llthrottle.h" 47#include "llthrottle.h"
48#include "llstat.h"
48 49
49// 50//
50// Constants 51// Constants
@@ -133,6 +134,10 @@ public:
133 S32 getUnackedPacketCount() const { return mUnackedPacketCount; } 134 S32 getUnackedPacketCount() const { return mUnackedPacketCount; }
134 S32 getUnackedPacketBytes() const { return mUnackedPacketBytes; } 135 S32 getUnackedPacketBytes() const { return mUnackedPacketBytes; }
135 F64 getNextPingSendTime() const { return mNextPingSendTime; } 136 F64 getNextPingSendTime() const { return mNextPingSendTime; }
137 F32 getOutOfOrderRate(LLStatAccum::TimeScale scale = LLStatAccum::SCALE_MINUTE)
138 { return mOutOfOrderRate.meanValue(scale); }
139 U32 getLastPacketGap() const { return mLastPacketGap; }
140 LLHost getHost() const { return mHost; }
136 141
137 LLThrottleGroup &getThrottleGroup() { return mThrottles; } 142 LLThrottleGroup &getThrottleGroup() { return mThrottles; }
138 143
@@ -276,6 +281,8 @@ protected:
276 LLTimer mExistenceTimer; // initialized when circuit created, used to track bandwidth numbers 281 LLTimer mExistenceTimer; // initialized when circuit created, used to track bandwidth numbers
277 282
278 S32 mCurrentResendCount; // Number of resent packets since last spam 283 S32 mCurrentResendCount; // Number of resent packets since last spam
284 LLStatRate mOutOfOrderRate; // Rate of out of order packets coming in.
285 U32 mLastPacketGap; // Gap in sequence number of last packet.
279}; 286};
280 287
281 288
diff --git a/linden/indra/llmessage/llcurl.cpp b/linden/indra/llmessage/llcurl.cpp
index 834ec4b..167e237 100644
--- a/linden/indra/llmessage/llcurl.cpp
+++ b/linden/indra/llmessage/llcurl.cpp
@@ -265,6 +265,10 @@ LLCurl::Easy* LLCurl::Easy::getEasy()
265 delete easy; 265 delete easy;
266 return NULL; 266 return NULL;
267 } 267 }
268
269 // set no DMS caching as default for all easy handles. This prevents them adopting a
270 // multi handles cache if they are added to one.
271 curl_easy_setopt(easy->mCurlEasyHandle, CURLOPT_DNS_CACHE_TIMEOUT, 0);
268 ++gCurlEasyCount; 272 ++gCurlEasyCount;
269 return easy; 273 return easy;
270} 274}
@@ -747,7 +751,7 @@ bool LLCurlRequest::post(const std::string& url, const LLSD& data, LLCurl::Respo
747 easy->setopt(CURLOPT_POSTFIELDS, (void*)NULL); 751 easy->setopt(CURLOPT_POSTFIELDS, (void*)NULL);
748 easy->setopt(CURLOPT_POSTFIELDSIZE, bytes); 752 easy->setopt(CURLOPT_POSTFIELDSIZE, bytes);
749 753
750 easy->slist_append("Content-Type: application/xml"); 754 easy->slist_append("Content-Type: application/llsd+xml");
751 easy->setHeaders(); 755 easy->setHeaders();
752 756
753 lldebugs << "POSTING: " << bytes << " bytes." << llendl; 757 lldebugs << "POSTING: " << bytes << " bytes." << llendl;
diff --git a/linden/indra/llmessage/llhttpassetstorage.cpp b/linden/indra/llmessage/llhttpassetstorage.cpp
index fdd521f..6d5a716 100644
--- a/linden/indra/llmessage/llhttpassetstorage.cpp
+++ b/linden/indra/llmessage/llhttpassetstorage.cpp
@@ -256,6 +256,10 @@ void LLHTTPAssetRequest::setupCurlHandle()
256 // disable use of proxy, which can't handle chunked transfers 256 // disable use of proxy, which can't handle chunked transfers
257 } 257 }
258 mHTTPHeaders = curl_slist_append(mHTTPHeaders, "Pragma:"); 258 mHTTPHeaders = curl_slist_append(mHTTPHeaders, "Pragma:");
259
260 // bug in curl causes DNS to be cached for too long a time, 0 sets it to never cache DNS results internally (to curl)
261 curl_easy_setopt(mCurlHandle, CURLOPT_DNS_CACHE_TIMEOUT, 0);
262
259 // resist the temptation to explicitly add the Transfer-Encoding: chunked 263 // resist the temptation to explicitly add the Transfer-Encoding: chunked
260 // header here - invokes a libCURL bug 264 // header here - invokes a libCURL bug
261 curl_easy_setopt(mCurlHandle, CURLOPT_HTTPHEADER, mHTTPHeaders); 265 curl_easy_setopt(mCurlHandle, CURLOPT_HTTPHEADER, mHTTPHeaders);
diff --git a/linden/indra/llmessage/llhttpclient.cpp b/linden/indra/llmessage/llhttpclient.cpp
index fc2612f..fb43861 100644
--- a/linden/indra/llmessage/llhttpclient.cpp
+++ b/linden/indra/llmessage/llhttpclient.cpp
@@ -106,7 +106,7 @@ namespace
106 LLSDInjector(const LLSD& sd) : mSD(sd) {} 106 LLSDInjector(const LLSD& sd) : mSD(sd) {}
107 virtual ~LLSDInjector() {} 107 virtual ~LLSDInjector() {}
108 108
109 const char* contentType() { return "application/xml"; } 109 const char* contentType() { return "application/llsd+xml"; }
110 110
111 virtual EStatus process_impl(const LLChannelDescriptors& channels, 111 virtual EStatus process_impl(const LLChannelDescriptors& channels,
112 buffer_ptr_t& buffer, bool& eos, LLSD& context, LLPumpIO* pump) 112 buffer_ptr_t& buffer, bool& eos, LLSD& context, LLPumpIO* pump)
@@ -238,7 +238,8 @@ static void request(
238 //the Pragma header it so gratuitously inserts 238 //the Pragma header it so gratuitously inserts
239 //Before inserting the header, force libcurl 239 //Before inserting the header, force libcurl
240 //to not use the proxy (read: llurlrequest.cpp) 240 //to not use the proxy (read: llurlrequest.cpp)
241 if ((iter->first == "Pragma") && (iter->second.asString() == "")) 241 static const std::string PRAGMA("Pragma");
242 if ((iter->first == PRAGMA) && (iter->second.asString().empty()))
242 { 243 {
243 req->useProxy(false); 244 req->useProxy(false);
244 } 245 }
@@ -247,6 +248,19 @@ static void request(
247 req->addHeader(header.str().c_str()); 248 req->addHeader(header.str().c_str());
248 } 249 }
249 } 250 }
251
252 // Check to see if we have already set Accept or not. If no one
253 // set it, set it to application/llsd+xml since that's what we
254 // almost always want.
255 if( method != LLURLRequest::HTTP_PUT && method != LLURLRequest::HTTP_POST )
256 {
257 static const std::string ACCEPT("Accept");
258 if(!headers.has(ACCEPT))
259 {
260 req->addHeader("Accept: application/llsd+xml");
261 }
262 }
263
250 req->setCallback(new LLHTTPClientURLAdaptor(responder)); 264 req->setCallback(new LLHTTPClientURLAdaptor(responder));
251 265
252 if (method == LLURLRequest::HTTP_POST && gMessageSystem) 266 if (method == LLURLRequest::HTTP_POST && gMessageSystem)
@@ -254,12 +268,22 @@ static void request(
254 req->addHeader(llformat("X-SecondLife-UDP-Listen-Port: %d", 268 req->addHeader(llformat("X-SecondLife-UDP-Listen-Port: %d",
255 gMessageSystem->mPort).c_str()); 269 gMessageSystem->mPort).c_str());
256 } 270 }
257 271
258 if (method == LLURLRequest::HTTP_PUT || method == LLURLRequest::HTTP_POST) 272 if (method == LLURLRequest::HTTP_PUT || method == LLURLRequest::HTTP_POST)
259 { 273 {
260 req->addHeader(llformat("Content-Type: %s", 274 static const std::string CONTENT_TYPE("Content-Type");
261 body_injector->contentType()).c_str()); 275 if(!headers.has(CONTENT_TYPE))
262 276 {
277 // If the Content-Type header was passed in, it has
278 // already been added as a header through req->addHeader
279 // in the loop above. We defer to the caller's wisdom, but
280 // if they did not specify a Content-Type, then ask the
281 // injector.
282 req->addHeader(
283 llformat(
284 "Content-Type: %s",
285 body_injector->contentType()).c_str());
286 }
263 chain.push_back(LLIOPipe::ptr_t(body_injector)); 287 chain.push_back(LLIOPipe::ptr_t(body_injector));
264 } 288 }
265 289
diff --git a/linden/indra/llmessage/lliohttpserver.cpp b/linden/indra/llmessage/lliohttpserver.cpp
index d4155f6..64222ff 100644
--- a/linden/indra/llmessage/lliohttpserver.cpp
+++ b/linden/indra/llmessage/lliohttpserver.cpp
@@ -47,6 +47,7 @@
47#include "llpumpio.h" 47#include "llpumpio.h"
48#include "llsd.h" 48#include "llsd.h"
49#include "llsdserialize_xml.h" 49#include "llsdserialize_xml.h"
50#include "llstat.h"
50#include "llstl.h" 51#include "llstl.h"
51#include "lltimer.h" 52#include "lltimer.h"
52 53
@@ -171,22 +172,26 @@ LLIOPipe::EStatus LLHTTPPipe::process_impl(
171 std::string verb = context[CONTEXT_REQUEST][CONTEXT_VERB]; 172 std::string verb = context[CONTEXT_REQUEST][CONTEXT_VERB];
172 if(verb == HTTP_VERB_GET) 173 if(verb == HTTP_VERB_GET)
173 { 174 {
175 LLPerfBlock getblock("http_get");
174 mNode.get(LLHTTPNode::ResponsePtr(mResponse), context); 176 mNode.get(LLHTTPNode::ResponsePtr(mResponse), context);
175 } 177 }
176 else if(verb == HTTP_VERB_PUT) 178 else if(verb == HTTP_VERB_PUT)
177 { 179 {
180 LLPerfBlock putblock("http_put");
178 LLSD input; 181 LLSD input;
179 LLSDSerialize::fromXML(input, istr); 182 LLSDSerialize::fromXML(input, istr);
180 mNode.put(LLHTTPNode::ResponsePtr(mResponse), context, input); 183 mNode.put(LLHTTPNode::ResponsePtr(mResponse), context, input);
181 } 184 }
182 else if(verb == HTTP_VERB_POST) 185 else if(verb == HTTP_VERB_POST)
183 { 186 {
187 LLPerfBlock postblock("http_post");
184 LLSD input; 188 LLSD input;
185 LLSDSerialize::fromXML(input, istr); 189 LLSDSerialize::fromXML(input, istr);
186 mNode.post(LLHTTPNode::ResponsePtr(mResponse), context, input); 190 mNode.post(LLHTTPNode::ResponsePtr(mResponse), context, input);
187 } 191 }
188 else if(verb == HTTP_VERB_DELETE) 192 else if(verb == HTTP_VERB_DELETE)
189 { 193 {
194 LLPerfBlock delblock("http_delete");
190 mNode.del(LLHTTPNode::ResponsePtr(mResponse), context); 195 mNode.del(LLHTTPNode::ResponsePtr(mResponse), context);
191 } 196 }
192 else if(verb == HTTP_VERB_OPTIONS) 197 else if(verb == HTTP_VERB_OPTIONS)
@@ -240,7 +245,7 @@ LLIOPipe::EStatus LLHTTPPipe::process_impl(
240 case STATE_GOOD_RESULT: 245 case STATE_GOOD_RESULT:
241 { 246 {
242 LLSD headers = mHeaders; 247 LLSD headers = mHeaders;
243 headers["Content-Type"] = "application/xml"; 248 headers["Content-Type"] = "application/llsd+xml";
244 context[CONTEXT_RESPONSE][CONTEXT_HEADERS] = headers; 249 context[CONTEXT_RESPONSE][CONTEXT_HEADERS] = headers;
245 LLBufferStream ostr(channels, buffer.get()); 250 LLBufferStream ostr(channels, buffer.get());
246 LLSDSerialize::toXML(mGoodResult, ostr); 251 LLSDSerialize::toXML(mGoodResult, ostr);
diff --git a/linden/indra/llmessage/lliosocket.cpp b/linden/indra/llmessage/lliosocket.cpp
index dec83b0..28fee37 100644
--- a/linden/indra/llmessage/lliosocket.cpp
+++ b/linden/indra/llmessage/lliosocket.cpp
@@ -355,8 +355,11 @@ LLIOPipe::EStatus LLIOSocketReader::process_impl(
355 } 355 }
356 else if(APR_STATUS_IS_EAGAIN(status)) 356 else if(APR_STATUS_IS_EAGAIN(status))
357 { 357 {
358/*Commented out by Aura 9-9-8 for DEV-19961.
358 // everything is fine, but we can terminate this process pump. 359 // everything is fine, but we can terminate this process pump.
360
359 rv = STATUS_BREAK; 361 rv = STATUS_BREAK;
362*/
360 } 363 }
361 else 364 else
362 { 365 {
diff --git a/linden/indra/llmessage/llmail.cpp b/linden/indra/llmessage/llmail.cpp
index 8ae7206..181f378 100644
--- a/linden/indra/llmessage/llmail.cpp
+++ b/linden/indra/llmessage/llmail.cpp
@@ -51,6 +51,7 @@
51#include "llblowfishcipher.h" 51#include "llblowfishcipher.h"
52#include "llerror.h" 52#include "llerror.h"
53#include "llhost.h" 53#include "llhost.h"
54#include "llsd.h"
54#include "llstring.h" 55#include "llstring.h"
55#include "lluuid.h" 56#include "lluuid.h"
56#include "net.h" 57#include "net.h"
@@ -111,16 +112,22 @@ void disconnect_smtp()
111// Returns TRUE on success. 112// Returns TRUE on success.
112// message should NOT be SMTP escaped. 113// message should NOT be SMTP escaped.
113// static 114// static
114BOOL LLMail::send(const char* from_name, const char* from_address, 115BOOL LLMail::send(
115 const char* to_name, const char* to_address, 116 const char* from_name,
116 const char* subject, const char* message) 117 const char* from_address,
118 const char* to_name,
119 const char* to_address,
120 const char* subject,
121 const char* message,
122 const LLSD& headers)
117{ 123{
118 std::string header = buildSMTPTransaction( 124 std::string header = buildSMTPTransaction(
119 from_name, 125 from_name,
120 from_address, 126 from_address,
121 to_name, 127 to_name,
122 to_address, 128 to_address,
123 subject); 129 subject,
130 headers);
124 if(header.empty()) 131 if(header.empty())
125 { 132 {
126 return FALSE; 133 return FALSE;
@@ -192,7 +199,8 @@ std::string LLMail::buildSMTPTransaction(
192 const char* from_address, 199 const char* from_address,
193 const char* to_name, 200 const char* to_name,
194 const char* to_address, 201 const char* to_address,
195 const char* subject) 202 const char* subject,
203 const LLSD& headers)
196{ 204{
197 if(!from_address || !to_address) 205 if(!from_address || !to_address)
198 { 206 {
@@ -236,8 +244,20 @@ std::string LLMail::buildSMTPTransaction(
236 << "DATA\r\n" 244 << "DATA\r\n"
237 << "From: " << from_fmt.str() << "\r\n" 245 << "From: " << from_fmt.str() << "\r\n"
238 << "To: " << to_fmt.str() << "\r\n" 246 << "To: " << to_fmt.str() << "\r\n"
239 << "Subject: " << subject << "\r\n" 247 << "Subject: " << subject << "\r\n";
240 << "\r\n"; 248
249 if(headers.isMap())
250 {
251 LLSD::map_const_iterator iter = headers.beginMap();
252 LLSD::map_const_iterator end = headers.endMap();
253 for(; iter != end; ++iter)
254 {
255 header << (*iter).first << ": " << ((*iter).second).asString()
256 << "\r\n";
257 }
258 }
259
260 header << "\r\n";
241 return header.str(); 261 return header.str();
242} 262}
243 263
@@ -324,7 +344,7 @@ bool LLMail::send(
324 << "when sending messages larger than " << LL_MAX_KNOWN_GOOD_MAIL_SIZE 344 << "when sending messages larger than " << LL_MAX_KNOWN_GOOD_MAIL_SIZE
325 << " bytes. The next log about success is potentially a lie." << llendl; 345 << " bytes. The next log about success is potentially a lie." << llendl;
326 } 346 }
327 llinfos << "send_mail success: " 347 lldebugs << "send_mail success: "
328 << "to=<" << to_address 348 << "to=<" << to_address
329 << ">, from=<" << from_address << ">" 349 << ">, from=<" << from_address << ">"
330 << ", bytes=" << original_size 350 << ", bytes=" << original_size
diff --git a/linden/indra/llmessage/llmail.h b/linden/indra/llmessage/llmail.h
index 86b7793..018e180 100644
--- a/linden/indra/llmessage/llmail.h
+++ b/linden/indra/llmessage/llmail.h
@@ -34,7 +34,7 @@
34 34
35typedef struct apr_pool_t apr_pool_t; 35typedef struct apr_pool_t apr_pool_t;
36 36
37class LLUUID; 37#include "llsd.h"
38 38
39class LLMail 39class LLMail
40{ 40{
@@ -45,34 +45,51 @@ public:
45 // Allow all email transmission to be disabled/enabled. 45 // Allow all email transmission to be disabled/enabled.
46 static void enable(bool mail_enabled); 46 static void enable(bool mail_enabled);
47 47
48 // returns TRUE if the call succeeds, FALSE otherwise. 48 /**
49 // 49 * @brief send an email
50 // Results in: 50 * @param from_name The name of the email sender
51 // From: "from_name" <from_address> 51 * @param from_address The email address for the sender
52 // To: "to_name" <to_address> 52 * @param to_name The name of the email recipient
53 // Subject: subject 53 * @param to_address The email recipient address
54 // message 54 * @param subject The subject of the email
55 static BOOL send(const char* from_name, const char* from_address, 55 * @param headers optional X-Foo headers in an llsd map.
56 const char* to_name, const char* to_address, 56 * @return Returns TRUE if the call succeeds, FALSE otherwise.
57 const char* subject, const char* message); 57 *
58 * Results in:
59 * From: "from_name" <from_address>
60 * To: "to_name" <to_address>
61 * Subject: subject
62 *
63 * message
64 */
65 static BOOL send(
66 const char* from_name,
67 const char* from_address,
68 const char* to_name,
69 const char* to_address,
70 const char* subject,
71 const char* message,
72 const LLSD& headers = LLSD());
58 73
59 /** 74 /**
60 * @brief build the complete smtp transaction & header for use in an 75 * @brief build the complete smtp transaction & header for use in an
61 * mail. 76 * mail.
62 * 77 *
63 * @param from_name The name of the email sender 78 * @param from_name The name of the email sender
64 * @param from_address The email address for the sender 79 * @param from_address The email address for the sender
65 * @param to_name The name of the email recipient 80 * @param to_name The name of the email recipient
66 * @param to_name The email recipient address 81 * @param to_address The email recipient address
67 * @param subject The subject of the email 82 * @param subject The subject of the email
68 * @return Returns the complete SMTP transaction mail header. 83 * @param headers optional X-Foo headers in an llsd map.
69 */ 84 * @return Returns the complete SMTP transaction mail header.
85 */
70 static std::string buildSMTPTransaction( 86 static std::string buildSMTPTransaction(
71 const char* from_name, 87 const char* from_name,
72 const char* from_address, 88 const char* from_address,
73 const char* to_name, 89 const char* to_name,
74 const char* to_address, 90 const char* to_address,
75 const char* subject); 91 const char* subject,
92 const LLSD& headers = LLSD());
76 93
77 /** 94 /**
78 * @brief send an email with header and body. 95 * @brief send an email with header and body.
diff --git a/linden/indra/llmessage/llmessagetemplate.cpp b/linden/indra/llmessage/llmessagetemplate.cpp
index 4a560ca..ff44d45 100644
--- a/linden/indra/llmessage/llmessagetemplate.cpp
+++ b/linden/indra/llmessage/llmessagetemplate.cpp
@@ -50,7 +50,7 @@ void LLMsgVarData::addData(const void *data, S32 size, EMsgVariableType type, S3
50 } 50 }
51 if(size) 51 if(size)
52 { 52 {
53 delete mData; // Delete it if it already exists 53 delete[] mData; // Delete it if it already exists
54 mData = new U8[size]; 54 mData = new U8[size];
55 htonmemcpy(mData, data, mType, size); 55 htonmemcpy(mData, data, mType, size);
56 } 56 }
@@ -175,3 +175,23 @@ std::ostream& operator<<(std::ostream& s, LLMessageTemplate &msg)
175 175
176 return s; 176 return s;
177} 177}
178
179void LLMessageTemplate::banUdp()
180{
181 static const char* deprecation[] = {
182 "NotDeprecated",
183 "Deprecated",
184 "UDPDeprecated",
185 "UDPBlackListed"
186 };
187 if (mDeprecation != MD_DEPRECATED)
188 {
189 llinfos << "Setting " << mName << " to UDPBlackListed was " << deprecation[mDeprecation] << llendl;
190 mDeprecation = MD_UDPBLACKLISTED;
191 }
192 else
193 {
194 llinfos << mName << " is already more deprecated than UDPBlackListed" << llendl;
195 }
196}
197
diff --git a/linden/indra/llmessage/llmessagetemplate.h b/linden/indra/llmessage/llmessagetemplate.h
index 716c618..445d1a8 100644
--- a/linden/indra/llmessage/llmessagetemplate.h
+++ b/linden/indra/llmessage/llmessagetemplate.h
@@ -34,6 +34,7 @@
34 34
35#include "lldarray.h" 35#include "lldarray.h"
36#include "message.h" // TODO: babbage: Remove... 36#include "message.h" // TODO: babbage: Remove...
37#include "llstat.h"
37#include "llstl.h" 38#include "llstl.h"
38 39
39class LLMsgVarData 40class LLMsgVarData
@@ -370,20 +371,23 @@ public:
370 { 371 {
371 if (mHandlerFunc) 372 if (mHandlerFunc)
372 { 373 {
374 LLPerfBlock msg_cb_time("msg_cb", mName);
373 mHandlerFunc(msgsystem, mUserData); 375 mHandlerFunc(msgsystem, mUserData);
374 return TRUE; 376 return TRUE;
375 } 377 }
376 return FALSE; 378 return FALSE;
377 } 379 }
378 380
379 bool isBanned(bool trustedSource) const 381 bool isUdpBanned() const
380 { 382 {
381 return trustedSource ? mBanFromTrusted : mBanFromUntrusted; 383 return mDeprecation == MD_UDPBLACKLISTED;
382 } 384 }
383 385
384 bool isUdpBanned() const 386 void banUdp();
387
388 bool isBanned(bool trustedSource) const
385 { 389 {
386 return mDeprecation == MD_UDPBLACKLISTED; 390 return trustedSource ? mBanFromTrusted : mBanFromUntrusted;
387 } 391 }
388 392
389 friend std::ostream& operator<<(std::ostream& s, LLMessageTemplate &msg); 393 friend std::ostream& operator<<(std::ostream& s, LLMessageTemplate &msg);
diff --git a/linden/indra/llmessage/llnamevalue.cpp b/linden/indra/llmessage/llnamevalue.cpp
index c44f6ce..f661261 100644
--- a/linden/indra/llmessage/llnamevalue.cpp
+++ b/linden/indra/llmessage/llnamevalue.cpp
@@ -896,7 +896,7 @@ void LLNameValue::setVec3(const LLVector3 &a)
896} 896}
897 897
898 898
899std::string LLNameValue::printNameValue() 899std::string LLNameValue::printNameValue() const
900{ 900{
901 std::string buffer; 901 std::string buffer;
902 buffer = llformat("%s %s %s %s ", mName, mStringType, mStringClass, mStringSendto); 902 buffer = llformat("%s %s %s %s ", mName, mStringType, mStringClass, mStringSendto);
@@ -905,7 +905,7 @@ std::string LLNameValue::printNameValue()
905 return buffer; 905 return buffer;
906} 906}
907 907
908std::string LLNameValue::printData() 908std::string LLNameValue::printData() const
909{ 909{
910 std::string buffer; 910 std::string buffer;
911 switch(mType) 911 switch(mType)
diff --git a/linden/indra/llmessage/llnamevalue.h b/linden/indra/llmessage/llnamevalue.h
index 52beb07..f6c5040 100644
--- a/linden/indra/llmessage/llnamevalue.h
+++ b/linden/indra/llmessage/llnamevalue.h
@@ -148,8 +148,8 @@ public:
148 BOOL sendToViewer() const; 148 BOOL sendToViewer() const;
149 149
150 void callCallback(); 150 void callCallback();
151 std::string printNameValue(); 151 std::string printNameValue() const;
152 std::string printData(); 152 std::string printData() const;
153 153
154 ENameValueType getTypeEnum() const { return mType; } 154 ENameValueType getTypeEnum() const { return mType; }
155 ENameValueClass getClassEnum() const { return mClass; } 155 ENameValueClass getClassEnum() const { return mClass; }
diff --git a/linden/indra/llmessage/llpartdata.h b/linden/indra/llmessage/llpartdata.h
index 82757ec..58a1fae 100644
--- a/linden/indra/llmessage/llpartdata.h
+++ b/linden/indra/llmessage/llpartdata.h
@@ -114,6 +114,7 @@ public:
114 //LL_PART_TRAIL_MASK = 0x400, // Particles have historical "trails" 114 //LL_PART_TRAIL_MASK = 0x400, // Particles have historical "trails"
115 115
116 // Viewer side use only! 116 // Viewer side use only!
117 LL_PART_HUD = 0x40000000,
117 LL_PART_DEAD_MASK = 0x80000000, 118 LL_PART_DEAD_MASK = 0x80000000,
118 }; 119 };
119 120
diff --git a/linden/indra/llmessage/llpumpio.cpp b/linden/indra/llmessage/llpumpio.cpp
index c92612f..467502b 100644
--- a/linden/indra/llmessage/llpumpio.cpp
+++ b/linden/indra/llmessage/llpumpio.cpp
@@ -41,6 +41,7 @@
41#include "llapr.h" 41#include "llapr.h"
42#include "llmemtype.h" 42#include "llmemtype.h"
43#include "llstl.h" 43#include "llstl.h"
44#include "llstat.h"
44 45
45// These should not be enabled in production, but they can be 46// These should not be enabled in production, but they can be
46// intensely useful during development for finding certain kinds of 47// intensely useful during development for finding certain kinds of
@@ -176,7 +177,8 @@ LLPumpIO::LLPumpIO(apr_pool_t* pool) :
176 mCurrentPool(NULL), 177 mCurrentPool(NULL),
177 mCurrentPoolReallocCount(0), 178 mCurrentPoolReallocCount(0),
178 mChainsMutex(NULL), 179 mChainsMutex(NULL),
179 mCallbackMutex(NULL) 180 mCallbackMutex(NULL),
181 mCurrentChain(mRunningChains.end())
180{ 182{
181 LLMemType m1(LLMemType::MTYPE_IO_PUMP); 183 LLMemType m1(LLMemType::MTYPE_IO_PUMP);
182 initialize(pool); 184 initialize(pool);
@@ -269,6 +271,16 @@ bool LLPumpIO::setTimeoutSeconds(F32 timeout)
269 return true; 271 return true;
270} 272}
271 273
274void LLPumpIO::adjustTimeoutSeconds(F32 delta)
275{
276 // If no chain is running, bail
277 if(mRunningChains.end() == mCurrentChain)
278 {
279 return;
280 }
281 (*mCurrentChain).adjustTimeoutSeconds(delta);
282}
283
272static std::string events_2_string(apr_int16_t events) 284static std::string events_2_string(apr_int16_t events)
273{ 285{
274 std::ostringstream ostr; 286 std::ostringstream ostr;
@@ -514,7 +526,10 @@ void LLPumpIO::pump(const S32& poll_timeout)
514 //llinfos << "polling" << llendl; 526 //llinfos << "polling" << llendl;
515 S32 count = 0; 527 S32 count = 0;
516 S32 client_id = 0; 528 S32 client_id = 0;
517 apr_pollset_poll(mPollset, poll_timeout, &count, &poll_fd); 529 {
530 LLPerfBlock polltime("pump_poll");
531 apr_pollset_poll(mPollset, poll_timeout, &count, &poll_fd);
532 }
518 PUMP_DEBUG; 533 PUMP_DEBUG;
519 for(S32 ii = 0; ii < count; ++ii) 534 for(S32 ii = 0; ii < count; ++ii)
520 { 535 {
@@ -1161,3 +1176,14 @@ void LLPumpIO::LLChainInfo::setTimeoutSeconds(F32 timeout)
1161 mTimer.stop(); 1176 mTimer.stop();
1162 } 1177 }
1163} 1178}
1179
1180void LLPumpIO::LLChainInfo::adjustTimeoutSeconds(F32 delta)
1181{
1182 LLMemType m1(LLMemType::MTYPE_IO_PUMP);
1183 if(mTimer.getStarted())
1184 {
1185 F64 expiry = mTimer.expiresAt();
1186 expiry += delta;
1187 mTimer.setExpiryAt(expiry);
1188 }
1189}
diff --git a/linden/indra/llmessage/llpumpio.h b/linden/indra/llmessage/llpumpio.h
index d2392a3..daff723 100644
--- a/linden/indra/llmessage/llpumpio.h
+++ b/linden/indra/llmessage/llpumpio.h
@@ -166,6 +166,14 @@ public:
166 bool setTimeoutSeconds(F32 timeout); 166 bool setTimeoutSeconds(F32 timeout);
167 167
168 /** 168 /**
169 * @brief Adjust the timeout of the running chain.
170 *
171 * This method has no effect if there is no timeout on the chain.
172 * @param delta The number of seconds to add to/remove from the timeout.
173 */
174 void adjustTimeoutSeconds(F32 delta);
175
176 /**
169 * @brief Set up file descriptors for for the running chain. 177 * @brief Set up file descriptors for for the running chain.
170 * @see rebuildPollset() 178 * @see rebuildPollset()
171 * 179 *
@@ -349,6 +357,7 @@ protected:
349 // methods 357 // methods
350 LLChainInfo(); 358 LLChainInfo();
351 void setTimeoutSeconds(F32 timeout); 359 void setTimeoutSeconds(F32 timeout);
360 void adjustTimeoutSeconds(F32 delta);
352 361
353 // basic member data 362 // basic member data
354 bool mInit; 363 bool mInit;
diff --git a/linden/indra/llmessage/llqueryflags.h b/linden/indra/llmessage/llqueryflags.h
index 1d8d500..6740d46 100644
--- a/linden/indra/llmessage/llqueryflags.h
+++ b/linden/indra/llmessage/llqueryflags.h
@@ -38,7 +38,7 @@
38const U32 DFQ_PEOPLE = 0x1 << 0; 38const U32 DFQ_PEOPLE = 0x1 << 0;
39const U32 DFQ_ONLINE = 0x1 << 1; 39const U32 DFQ_ONLINE = 0x1 << 1;
40//const U32 DFQ_PLACES = 0x1 << 2; 40//const U32 DFQ_PLACES = 0x1 << 2;
41const U32 DFQ_EVENTS = 0x1 << 3; 41const U32 DFQ_EVENTS = 0x1 << 3; // This is not set by the 1.21 viewer, but I don't know about older versions. JC
42const U32 DFQ_GROUPS = 0x1 << 4; 42const U32 DFQ_GROUPS = 0x1 << 4;
43const U32 DFQ_DATE_EVENTS = 0x1 << 5; 43const U32 DFQ_DATE_EVENTS = 0x1 << 5;
44 44
diff --git a/linden/indra/llmessage/llurlrequest.cpp b/linden/indra/llmessage/llurlrequest.cpp
index ee62798..e561597 100644
--- a/linden/indra/llmessage/llurlrequest.cpp
+++ b/linden/indra/llmessage/llurlrequest.cpp
@@ -68,6 +68,7 @@ public:
68 LLChannelDescriptors mChannels; 68 LLChannelDescriptors mChannels;
69 U8* mLastRead; 69 U8* mLastRead;
70 U32 mBodyLimit; 70 U32 mBodyLimit;
71 S32 mByteAccumulator;
71 bool mIsBodyLimitSet; 72 bool mIsBodyLimitSet;
72}; 73};
73 74
@@ -76,8 +77,8 @@ LLURLRequestDetail::LLURLRequestDetail() :
76 mResponseBuffer(NULL), 77 mResponseBuffer(NULL),
77 mLastRead(NULL), 78 mLastRead(NULL),
78 mBodyLimit(0), 79 mBodyLimit(0),
80 mByteAccumulator(0),
79 mIsBodyLimitSet(false) 81 mIsBodyLimitSet(false)
80
81{ 82{
82 LLMemType m1(LLMemType::MTYPE_IO_URL_REQUEST); 83 LLMemType m1(LLMemType::MTYPE_IO_URL_REQUEST);
83 mCurlRequest = new LLCurlEasyRequest(); 84 mCurlRequest = new LLCurlEasyRequest();
@@ -264,8 +265,25 @@ LLIOPipe::EStatus LLURLRequest::process_impl(
264 { 265 {
265 CURLcode result; 266 CURLcode result;
266 bool newmsg = mDetail->mCurlRequest->getResult(&result); 267 bool newmsg = mDetail->mCurlRequest->getResult(&result);
267 if (!newmsg) 268 if(!newmsg)
268 { 269 {
270 // we're still waiting or prcessing, check how many
271 // bytes we have accumulated.
272 const S32 MIN_ACCUMULATION = 100000;
273 if(pump && (mDetail->mByteAccumulator > MIN_ACCUMULATION))
274 {
275 // This is a pretty sloppy calculation, but this
276 // tries to make the gross assumption that if data
277 // is coming in at 56kb/s, then this transfer will
278 // probably succeed. So, if we're accumlated
279 // 100,000 bytes (MIN_ACCUMULATION) then let's
280 // give this client another 2s to complete.
281 const F32 TIMEOUT_ADJUSTMENT = 2.0f;
282 mDetail->mByteAccumulator = 0;
283 pump->adjustTimeoutSeconds(TIMEOUT_ADJUSTMENT);
284 }
285
286 // keep processing
269 break; 287 break;
270 } 288 }
271 289
@@ -434,6 +452,7 @@ size_t LLURLRequest::downCallback(
434 req->mDetail->mChannels.out(), 452 req->mDetail->mChannels.out(),
435 (U8*)data, 453 (U8*)data,
436 bytes); 454 bytes);
455 req->mDetail->mByteAccumulator += bytes;
437 return bytes; 456 return bytes;
438} 457}
439 458
diff --git a/linden/indra/llmessage/message.cpp b/linden/indra/llmessage/message.cpp
index b20731a..9ca7211 100644
--- a/linden/indra/llmessage/message.cpp
+++ b/linden/indra/llmessage/message.cpp
@@ -763,7 +763,7 @@ BOOL LLMessageSystem::checkMessages( S64 frame_count )
763 clearReceiveState(); 763 clearReceiveState();
764 valid_packet = FALSE; 764 valid_packet = FALSE;
765 } 765 }
766 766
767 if( valid_packet ) 767 if( valid_packet )
768 { 768 {
769 logValidMsg(cdp, host, recv_reliable, recv_resent, (BOOL)(acks>0) ); 769 logValidMsg(cdp, host, recv_reliable, recv_resent, (BOOL)(acks>0) );
@@ -3956,22 +3956,27 @@ void LLMessageSystem::getString(const char *block, const char *var,
3956 blocknum); 3956 blocknum);
3957} 3957}
3958 3958
3959S32 LLMessageSystem::getNumberOfBlocksFast(const char *blockname) 3959BOOL LLMessageSystem::has(const char *blockname) const
3960{
3961 return getNumberOfBlocks(blockname) > 0;
3962}
3963
3964S32 LLMessageSystem::getNumberOfBlocksFast(const char *blockname) const
3960{ 3965{
3961 return mMessageReader->getNumberOfBlocks(blockname); 3966 return mMessageReader->getNumberOfBlocks(blockname);
3962} 3967}
3963 3968
3964S32 LLMessageSystem::getNumberOfBlocks(const char *blockname) 3969S32 LLMessageSystem::getNumberOfBlocks(const char *blockname) const
3965{ 3970{
3966 return getNumberOfBlocksFast(LLMessageStringTable::getInstance()->getString(blockname)); 3971 return getNumberOfBlocksFast(LLMessageStringTable::getInstance()->getString(blockname));
3967} 3972}
3968 3973
3969S32 LLMessageSystem::getSizeFast(const char *blockname, const char *varname) 3974S32 LLMessageSystem::getSizeFast(const char *blockname, const char *varname) const
3970{ 3975{
3971 return mMessageReader->getSize(blockname, varname); 3976 return mMessageReader->getSize(blockname, varname);
3972} 3977}
3973 3978
3974S32 LLMessageSystem::getSize(const char *blockname, const char *varname) 3979S32 LLMessageSystem::getSize(const char *blockname, const char *varname) const
3975{ 3980{
3976 return getSizeFast(LLMessageStringTable::getInstance()->getString(blockname), 3981 return getSizeFast(LLMessageStringTable::getInstance()->getString(blockname),
3977 LLMessageStringTable::getInstance()->getString(varname)); 3982 LLMessageStringTable::getInstance()->getString(varname));
@@ -3979,13 +3984,13 @@ S32 LLMessageSystem::getSize(const char *blockname, const char *varname)
3979 3984
3980// size in bytes of variable length data 3985// size in bytes of variable length data
3981S32 LLMessageSystem::getSizeFast(const char *blockname, S32 blocknum, 3986S32 LLMessageSystem::getSizeFast(const char *blockname, S32 blocknum,
3982 const char *varname) 3987 const char *varname) const
3983{ 3988{
3984 return mMessageReader->getSize(blockname, blocknum, varname); 3989 return mMessageReader->getSize(blockname, blocknum, varname);
3985} 3990}
3986 3991
3987S32 LLMessageSystem::getSize(const char *blockname, S32 blocknum, 3992S32 LLMessageSystem::getSize(const char *blockname, S32 blocknum,
3988 const char *varname) 3993 const char *varname) const
3989{ 3994{
3990 return getSizeFast(LLMessageStringTable::getInstance()->getString(blockname), blocknum, 3995 return getSizeFast(LLMessageStringTable::getInstance()->getString(blockname), blocknum,
3991 LLMessageStringTable::getInstance()->getString(varname)); 3996 LLMessageStringTable::getInstance()->getString(varname));
@@ -4021,3 +4026,18 @@ bool LLMessageSystem::checkAllMessages(S64 frame_count, LLPumpIO* http_pump)
4021 http_pump->callback(); 4026 http_pump->callback();
4022 return (mPacketsIn - packetsIn) > 0; 4027 return (mPacketsIn - packetsIn) > 0;
4023} 4028}
4029
4030void LLMessageSystem::banUdpMessage(const std::string& name)
4031{
4032 message_template_name_map_t::iterator itt = mMessageTemplates.find(
4033 LLMessageStringTable::getInstance()->getString(name.c_str())
4034 );
4035 if(itt != mMessageTemplates.end())
4036 {
4037 itt->second->banUdp();
4038 }
4039 else
4040 {
4041 llwarns << "Attempted to ban an unknown message: " << name << "." << llendl;
4042 }
4043}
diff --git a/linden/indra/llmessage/message.h b/linden/indra/llmessage/message.h
index 8807521..b72aa9a 100644
--- a/linden/indra/llmessage/message.h
+++ b/linden/indra/llmessage/message.h
@@ -562,6 +562,9 @@ public:
562 /** Return false true if name is unknown or trusted */ 562 /** Return false true if name is unknown or trusted */
563 bool isUntrustedMessage(const std::string& name) const; 563 bool isUntrustedMessage(const std::string& name) const;
564 564
565 // Change this message to be UDP black listed.
566 void banUdpMessage(const std::string& name);
567
565private: 568private:
566 // A list of the circuits that need to be sent DenyTrustedCircuit messages. 569 // A list of the circuits that need to be sent DenyTrustedCircuit messages.
567 typedef std::set<LLHost> host_set_t; 570 typedef std::set<LLHost> host_set_t;
@@ -591,13 +594,14 @@ public:
591 LLHost findHost(const U32 circuit_code); 594 LLHost findHost(const U32 circuit_code);
592 void sanityCheck(); 595 void sanityCheck();
593 596
594 S32 getNumberOfBlocksFast(const char *blockname); 597 BOOL has(const char *blockname) const;
595 S32 getNumberOfBlocks(const char *blockname); 598 S32 getNumberOfBlocksFast(const char *blockname) const;
596 S32 getSizeFast(const char *blockname, const char *varname); 599 S32 getNumberOfBlocks(const char *blockname) const;
597 S32 getSize(const char *blockname, const char *varname); 600 S32 getSizeFast(const char *blockname, const char *varname) const;
601 S32 getSize(const char *blockname, const char *varname) const;
598 S32 getSizeFast(const char *blockname, S32 blocknum, 602 S32 getSizeFast(const char *blockname, S32 blocknum,
599 const char *varname); // size in bytes of data 603 const char *varname) const; // size in bytes of data
600 S32 getSize(const char *blockname, S32 blocknum, const char *varname); 604 S32 getSize(const char *blockname, S32 blocknum, const char *varname) const;
601 605
602 void resetReceiveCounts(); // resets receive counts for all message types to 0 606 void resetReceiveCounts(); // resets receive counts for all message types to 0
603 void dumpReceiveCounts(); // dumps receive count for each message type to llinfos 607 void dumpReceiveCounts(); // dumps receive count for each message type to llinfos
diff --git a/linden/indra/llprimitive/lltree_common.h b/linden/indra/llprimitive/lltree_common.h
index b63e00a..4708c5f 100644
--- a/linden/indra/llprimitive/lltree_common.h
+++ b/linden/indra/llprimitive/lltree_common.h
@@ -36,6 +36,19 @@
36 36
37struct LLTree_gene_0 37struct LLTree_gene_0
38{ 38{
39 LLTree_gene_0()
40 : scale(0),
41 branches(0),
42 twist(0),
43 droop(0),
44 species(0),
45 trunk_depth(0),
46 branch_thickness(0),
47 max_depth(0),
48 scale_step(0)
49 {
50 }
51
39 // 52 //
40 // The genome for a tree, species 0 53 // The genome for a tree, species 0
41 // 54 //
diff --git a/linden/indra/llrender/llcubemap.cpp b/linden/indra/llrender/llcubemap.cpp
index 563d616..878ae17 100644
--- a/linden/indra/llrender/llcubemap.cpp
+++ b/linden/indra/llrender/llcubemap.cpp
@@ -92,11 +92,11 @@ void LLCubeMap::initGL()
92 for (int i = 0; i < 6; i++) 92 for (int i = 0; i < 6; i++)
93 { 93 {
94 mImages[i] = new LLImageGL(64, 64, 4, (use_cube_mipmaps? TRUE : FALSE)); 94 mImages[i] = new LLImageGL(64, 64, 4, (use_cube_mipmaps? TRUE : FALSE));
95 mImages[i]->setTarget(mTargets[i], GL_TEXTURE_CUBE_MAP_ARB); 95 mImages[i]->setTarget(mTargets[i], LLTexUnit::TT_CUBE_MAP);
96 mRawImages[i] = new LLImageRaw(64, 64, 4); 96 mRawImages[i] = new LLImageRaw(64, 64, 4);
97 mImages[i]->createGLTexture(0, mRawImages[i], texname); 97 mImages[i]->createGLTexture(0, mRawImages[i], texname);
98 98
99 glBindTexture(GL_TEXTURE_CUBE_MAP_ARB, texname); 99 gGL.getTexUnit(0)->bindManual(LLTexUnit::TT_CUBE_MAP, texname);
100 mImages[i]->setClampCubemap (TRUE, TRUE, TRUE); 100 mImages[i]->setClampCubemap (TRUE, TRUE, TRUE);
101 stop_glerror(); 101 stop_glerror();
102 } 102 }
@@ -180,26 +180,7 @@ GLuint LLCubeMap::getGLName()
180 180
181void LLCubeMap::bind() 181void LLCubeMap::bind()
182{ 182{
183 if (gGLManager.mHasCubeMap && LLCubeMap::sUseCubeMaps) 183 gGL.getTexUnit(mTextureStage)->bind(this);
184 {
185 // We assume that if they have cube mapping, they have multitexturing.
186 if (mTextureStage > 0)
187 {
188 gGL.getTexUnit(mTextureStage)->activate();
189 }
190 glEnable(GL_TEXTURE_CUBE_MAP_ARB);
191 glBindTexture(GL_TEXTURE_CUBE_MAP_ARB, mImages[0]->getTexName());
192
193 mImages[0]->setMipFilterNearest (FALSE, FALSE);
194 if (mTextureStage > 0)
195 {
196 gGL.getTexUnit(0)->activate();
197 }
198 }
199 else
200 {
201 llwarns << "Using cube map without extension!" << llendl
202 }
203} 184}
204 185
205void LLCubeMap::enable(S32 stage) 186void LLCubeMap::enable(S32 stage)
@@ -213,17 +194,7 @@ void LLCubeMap::enableTexture(S32 stage)
213 mTextureStage = stage; 194 mTextureStage = stage;
214 if (gGLManager.mHasCubeMap && stage >= 0 && LLCubeMap::sUseCubeMaps) 195 if (gGLManager.mHasCubeMap && stage >= 0 && LLCubeMap::sUseCubeMaps)
215 { 196 {
216 if (stage > 0) 197 gGL.getTexUnit(stage)->enable(LLTexUnit::TT_CUBE_MAP);
217 {
218 gGL.getTexUnit(stage)->activate();
219 }
220
221 glEnable(GL_TEXTURE_CUBE_MAP_ARB);
222
223 if (stage > 0)
224 {
225 gGL.getTexUnit(0)->activate();
226 }
227 } 198 }
228} 199}
229 200
@@ -262,15 +233,10 @@ void LLCubeMap::disableTexture(void)
262{ 233{
263 if (gGLManager.mHasCubeMap && mTextureStage >= 0 && LLCubeMap::sUseCubeMaps) 234 if (gGLManager.mHasCubeMap && mTextureStage >= 0 && LLCubeMap::sUseCubeMaps)
264 { 235 {
265 if (mTextureStage > 0) 236 gGL.getTexUnit(mTextureStage)->disable();
237 if (mTextureStage == 0)
266 { 238 {
267 gGL.getTexUnit(mTextureStage)->activate(); 239 gGL.getTexUnit(0)->enable(LLTexUnit::TT_TEXTURE);
268 }
269 glBindTexture(GL_TEXTURE_CUBE_MAP_ARB, 0);
270 glDisable(GL_TEXTURE_CUBE_MAP_ARB);
271 if (mTextureStage > 0)
272 {
273 gGL.getTexUnit(0)->activate();
274 } 240 }
275 } 241 }
276} 242}
@@ -297,6 +263,8 @@ void LLCubeMap::setMatrix(S32 stage)
297{ 263{
298 mMatrixStage = stage; 264 mMatrixStage = stage;
299 265
266 if (mMatrixStage < 0) return;
267
300 if (stage > 0) 268 if (stage > 0)
301 { 269 {
302 gGL.getTexUnit(stage)->activate(); 270 gGL.getTexUnit(stage)->activate();
@@ -324,6 +292,8 @@ void LLCubeMap::setMatrix(S32 stage)
324 292
325void LLCubeMap::restoreMatrix() 293void LLCubeMap::restoreMatrix()
326{ 294{
295 if (mMatrixStage < 0) return;
296
327 if (mMatrixStage > 0) 297 if (mMatrixStage > 0)
328 { 298 {
329 gGL.getTexUnit(mMatrixStage)->activate(); 299 gGL.getTexUnit(mMatrixStage)->activate();
@@ -340,7 +310,7 @@ void LLCubeMap::restoreMatrix()
340 310
341void LLCubeMap::setReflection (void) 311void LLCubeMap::setReflection (void)
342{ 312{
343 glBindTexture (GL_TEXTURE_CUBE_MAP_ARB, getGLName()); 313 gGL.getTexUnit(mTextureStage)->bindManual(LLTexUnit::TT_CUBE_MAP, getGLName());
344 mImages[0]->setMipFilterNearest (FALSE, FALSE); 314 mImages[0]->setMipFilterNearest (FALSE, FALSE);
345 mImages[0]->setClampCubemap (TRUE, TRUE); 315 mImages[0]->setClampCubemap (TRUE, TRUE);
346} 316}
diff --git a/linden/indra/llrender/llcubemap.h b/linden/indra/llrender/llcubemap.h
index 45bfa16..15ca7db 100644
--- a/linden/indra/llrender/llcubemap.h
+++ b/linden/indra/llrender/llcubemap.h
@@ -53,6 +53,7 @@ public:
53 53
54 void enableTexture(S32 stage); 54 void enableTexture(S32 stage);
55 void enableTextureCoords(S32 stage); 55 void enableTextureCoords(S32 stage);
56 S32 getStage(void) { return mTextureStage; }
56 57
57 void disable(void); 58 void disable(void);
58 void disableTexture(void); 59 void disableTexture(void);
@@ -77,6 +78,7 @@ public:
77 static bool sUseCubeMaps; 78 static bool sUseCubeMaps;
78 79
79protected: 80protected:
81 friend class LLTexUnit;
80 ~LLCubeMap(); 82 ~LLCubeMap();
81 LLGLenum mTargets[6]; 83 LLGLenum mTargets[6];
82 LLPointer<LLImageGL> mImages[6]; 84 LLPointer<LLImageGL> mImages[6];
diff --git a/linden/indra/llrender/llfont.cpp b/linden/indra/llrender/llfont.cpp
index 4b5ee64..bcd0aca 100644
--- a/linden/indra/llrender/llfont.cpp
+++ b/linden/indra/llrender/llfont.cpp
@@ -92,18 +92,18 @@ LLFontManager::~LLFontManager()
92 92
93 93
94LLFontGlyphInfo::LLFontGlyphInfo(U32 index) 94LLFontGlyphInfo::LLFontGlyphInfo(U32 index)
95{ 95: mGlyphIndex(index),
96 mGlyphIndex = index; 96 mXBitmapOffset(0), // Offset to the origin in the bitmap
97 mXBitmapOffset = 0; // Offset to the origin in the bitmap 97 mYBitmapOffset(0), // Offset to the origin in the bitmap
98 mYBitmapOffset = 0; // Offset to the origin in the bitmap 98 mXBearing(0), // Distance from baseline to left in pixels
99 mXBearing = 0; // Distance from baseline to left in pixels 99 mYBearing(0), // Distance from baseline to top in pixels
100 mYBearing = 0; // Distance from baseline to top in pixels 100 mWidth(0), // In pixels
101 mWidth = 0; // In pixels 101 mHeight(0), // In pixels
102 mHeight = 0; // In pixels 102 mXAdvance(0.f), // In pixels
103 mXAdvance = 0.f; // In pixels 103 mYAdvance(0.f), // In pixels
104 mYAdvance = 0.f; // In pixels 104 mIsRendered(FALSE),
105 mIsRendered = FALSE; 105 mMetricsValid(FALSE)
106} 106{}
107 107
108LLFontList::LLFontList() 108LLFontList::LLFontList()
109{ 109{
@@ -303,6 +303,9 @@ void LLFont::resetBitmap()
303 iter != mCharGlyphInfoMap.end(); ++iter) 303 iter != mCharGlyphInfoMap.end(); ++iter)
304 { 304 {
305 iter->second->mIsRendered = FALSE; 305 iter->second->mIsRendered = FALSE;
306 //FIXME: this is only strictly necessary when resetting the entire font,
307 //not just flushing the bitmap
308 iter->second->mMetricsValid = FALSE;
306 } 309 }
307 mRawImagep->clear(255, 0); 310 mRawImagep->clear(255, 0);
308 mCurrentOffsetX = 1; 311 mCurrentOffsetX = 1;
@@ -439,6 +442,7 @@ BOOL LLFont::addGlyphFromFont(LLFont *fontp, const llwchar wch, const U32 glyph_
439 gi->mXAdvance = fontp->mFTFace->glyph->advance.x / 64.f; 442 gi->mXAdvance = fontp->mFTFace->glyph->advance.x / 64.f;
440 gi->mYAdvance = fontp->mFTFace->glyph->advance.y / 64.f; 443 gi->mYAdvance = fontp->mFTFace->glyph->advance.y / 64.f;
441 gi->mIsRendered = TRUE; 444 gi->mIsRendered = TRUE;
445 gi->mMetricsValid = TRUE;
442 446
443 insertGlyphInfo(wch, gi); 447 insertGlyphInfo(wch, gi);
444 448
@@ -528,7 +532,7 @@ F32 LLFont::getXAdvance(const llwchar wch) const
528 532
529 // Return existing info only if it is current 533 // Return existing info only if it is current
530 LLFontGlyphInfo* gi = getGlyphInfo(wch); 534 LLFontGlyphInfo* gi = getGlyphInfo(wch);
531 if (gi && gi->mIsRendered) 535 if (gi && gi->mMetricsValid)
532 { 536 {
533 return gi->mXAdvance; 537 return gi->mXAdvance;
534 } 538 }
@@ -573,6 +577,7 @@ F32 LLFont::getXAdvance(const llwchar wch) const
573 // Convert these from 26.6 units to float pixels. 577 // Convert these from 26.6 units to float pixels.
574 gi->mXAdvance = fontp->mFTFace->glyph->advance.x / 64.f; 578 gi->mXAdvance = fontp->mFTFace->glyph->advance.x / 64.f;
575 gi->mYAdvance = fontp->mFTFace->glyph->advance.y / 64.f; 579 gi->mYAdvance = fontp->mFTFace->glyph->advance.y / 64.f;
580 gi->mMetricsValid = TRUE;
576 return gi->mXAdvance; 581 return gi->mXAdvance;
577 } 582 }
578 else 583 else
diff --git a/linden/indra/llrender/llfont.h b/linden/indra/llrender/llfont.h
index d937dfd..2054832 100644
--- a/linden/indra/llrender/llfont.h
+++ b/linden/indra/llrender/llfont.h
@@ -72,6 +72,7 @@ public:
72 S32 mHeight; // In pixels 72 S32 mHeight; // In pixels
73 F32 mXAdvance; // In pixels 73 F32 mXAdvance; // In pixels
74 F32 mYAdvance; // In pixels 74 F32 mYAdvance; // In pixels
75 BOOL mMetricsValid; // We have up-to-date metrics for this glyph
75 76
76 // Information for actually rendering 77 // Information for actually rendering
77 BOOL mIsRendered; // We actually have rendered this glyph 78 BOOL mIsRendered; // We actually have rendered this glyph
diff --git a/linden/indra/llrender/llfontgl.cpp b/linden/indra/llrender/llfontgl.cpp
index a328196..2705516 100644
--- a/linden/indra/llrender/llfontgl.cpp
+++ b/linden/indra/llrender/llfontgl.cpp
@@ -148,7 +148,7 @@ void LLFontGL::init()
148 { 148 {
149 mImageGLp = new LLImageGL(FALSE); 149 mImageGLp = new LLImageGL(FALSE);
150 //RN: use nearest mipmap filtering to obviate the need to do pixel-accurate positioning 150 //RN: use nearest mipmap filtering to obviate the need to do pixel-accurate positioning
151 mImageGLp->bind(); 151 gGL.getTexUnit(0)->bind(mImageGLp);
152 // we allow bilinear filtering to get sub-pixel positioning for drop shadows 152 // we allow bilinear filtering to get sub-pixel positioning for drop shadows
153 //mImageGLp->setMipFilterNearest(TRUE, TRUE); 153 //mImageGLp->setMipFilterNearest(TRUE, TRUE);
154 } 154 }
@@ -533,7 +533,7 @@ BOOL LLFontGL::loadFace(const std::string& filename,
533 return FALSE; 533 return FALSE;
534 } 534 }
535 mImageGLp->createGLTexture(0, mRawImageGLp); 535 mImageGLp->createGLTexture(0, mRawImageGLp);
536 mImageGLp->bind(); 536 gGL.getTexUnit(0)->bind(mImageGLp);
537 mImageGLp->setMipFilterNearest(TRUE, TRUE); 537 mImageGLp->setMipFilterNearest(TRUE, TRUE);
538 return TRUE; 538 return TRUE;
539} 539}
@@ -547,7 +547,7 @@ BOOL LLFontGL::addChar(const llwchar wch)
547 547
548 stop_glerror(); 548 stop_glerror();
549 mImageGLp->setSubImage(mRawImageGLp, 0, 0, mImageGLp->getWidth(), mImageGLp->getHeight()); 549 mImageGLp->setSubImage(mRawImageGLp, 0, 0, mImageGLp->getWidth(), mImageGLp->getHeight());
550 mImageGLp->bind(); 550 gGL.getTexUnit(0)->bind(mImageGLp);
551 mImageGLp->setMipFilterNearest(TRUE, TRUE); 551 mImageGLp->setMipFilterNearest(TRUE, TRUE);
552 stop_glerror(); 552 stop_glerror();
553 return TRUE; 553 return TRUE;
@@ -583,7 +583,7 @@ S32 LLFontGL::render(const LLWString &wstr,
583 return wstr.length() ; 583 return wstr.length() ;
584 } 584 }
585 585
586 LLGLEnable tex(GL_TEXTURE_2D); 586 gGL.getTexUnit(0)->enable(LLTexUnit::TT_TEXTURE);
587 587
588 if (wstr.empty()) 588 if (wstr.empty())
589 { 589 {
@@ -663,7 +663,7 @@ S32 LLFontGL::render(const LLWString &wstr,
663 663
664 // Bind the font texture 664 // Bind the font texture
665 665
666 mImageGLp->bind(0); 666 gGL.getTexUnit(0)->bind(mImageGLp);
667 667
668 // Not guaranteed to be set correctly 668 // Not guaranteed to be set correctly
669 gGL.setSceneBlendType(LLRender::BT_ALPHA); 669 gGL.setSceneBlendType(LLRender::BT_ALPHA);
@@ -761,7 +761,7 @@ S32 LLFontGL::render(const LLWString &wstr,
761 break; 761 break;
762 } 762 }
763 763
764 ext_image->bind(); 764 gGL.getTexUnit(0)->bind(ext_image);
765 const F32 ext_x = cur_render_x + (EXT_X_BEARING * sScaleX); 765 const F32 ext_x = cur_render_x + (EXT_X_BEARING * sScaleX);
766 const F32 ext_y = cur_render_y + (EXT_Y_BEARING * sScaleY + mAscender - mLineHeight); 766 const F32 ext_y = cur_render_y + (EXT_Y_BEARING * sScaleY + mAscender - mLineHeight);
767 767
@@ -795,7 +795,7 @@ S32 LLFontGL::render(const LLWString &wstr,
795 cur_render_x = cur_x; 795 cur_render_x = cur_x;
796 796
797 // Bind the font texture 797 // Bind the font texture
798 mImageGLp->bind(); 798 gGL.getTexUnit(0)->bind(mImageGLp);
799 } 799 }
800 else 800 else
801 { 801 {
@@ -863,8 +863,8 @@ S32 LLFontGL::render(const LLWString &wstr,
863 863
864 if (style & UNDERLINE) 864 if (style & UNDERLINE)
865 { 865 {
866 LLGLSNoTexture no_texture; 866 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
867 gGL.begin(LLVertexBuffer::LINES); 867 gGL.begin(LLRender::LINES);
868 gGL.vertex2f(start_x, cur_y - (mDescender)); 868 gGL.vertex2f(start_x, cur_y - (mDescender));
869 gGL.vertex2f(cur_x, cur_y - (mDescender)); 869 gGL.vertex2f(cur_x, cur_y - (mDescender));
870 gGL.end(); 870 gGL.end();
@@ -1359,7 +1359,7 @@ void LLFontGL::drawGlyph(const LLRectf& screen_rect, const LLRectf& uv_rect, con
1359 F32 slant_offset; 1359 F32 slant_offset;
1360 slant_offset = ((style & ITALIC) ? ( -mAscender * 0.2f) : 0.f); 1360 slant_offset = ((style & ITALIC) ? ( -mAscender * 0.2f) : 0.f);
1361 1361
1362 gGL.begin(LLVertexBuffer::QUADS); 1362 gGL.begin(LLRender::QUADS);
1363 { 1363 {
1364 //FIXME: bold and drop shadow are mutually exclusive only for convenience 1364 //FIXME: bold and drop shadow are mutually exclusive only for convenience
1365 //Allow both when we need them. 1365 //Allow both when we need them.
diff --git a/linden/indra/llrender/llgl.cpp b/linden/indra/llrender/llgl.cpp
index 843bc79..67d258e 100644
--- a/linden/indra/llrender/llgl.cpp
+++ b/linden/indra/llrender/llgl.cpp
@@ -263,7 +263,6 @@ LLGLManager::LLGLManager() :
263 mHasMultitexture(FALSE), 263 mHasMultitexture(FALSE),
264 mNumTextureUnits(1), 264 mNumTextureUnits(1),
265 mHasMipMapGeneration(FALSE), 265 mHasMipMapGeneration(FALSE),
266 mHasPalettedTextures(FALSE),
267 mHasCompressedTextures(FALSE), 266 mHasCompressedTextures(FALSE),
268 mHasFramebufferObject(FALSE), 267 mHasFramebufferObject(FALSE),
269 268
@@ -566,7 +565,6 @@ void LLGLManager::initExtensions()
566 mHasFramebufferObject = FALSE; 565 mHasFramebufferObject = FALSE;
567# endif 566# endif
568 mHasMipMapGeneration = FALSE; 567 mHasMipMapGeneration = FALSE;
569 mHasPalettedTextures = FALSE;
570 mHasSeparateSpecularColor = FALSE; 568 mHasSeparateSpecularColor = FALSE;
571 mHasAnisotropic = FALSE; 569 mHasAnisotropic = FALSE;
572 mHasCubeMap = FALSE; 570 mHasCubeMap = FALSE;
@@ -578,7 +576,6 @@ void LLGLManager::initExtensions()
578#else // LL_MESA_HEADLESS 576#else // LL_MESA_HEADLESS
579 mHasMultitexture = glh_init_extensions("GL_ARB_multitexture"); 577 mHasMultitexture = glh_init_extensions("GL_ARB_multitexture");
580 mHasMipMapGeneration = glh_init_extensions("GL_SGIS_generate_mipmap"); 578 mHasMipMapGeneration = glh_init_extensions("GL_SGIS_generate_mipmap");
581 mHasPalettedTextures = glh_init_extension("GL_EXT_paletted_texture");
582 mHasSeparateSpecularColor = glh_init_extensions("GL_EXT_separate_specular_color"); 579 mHasSeparateSpecularColor = glh_init_extensions("GL_EXT_separate_specular_color");
583 mHasAnisotropic = glh_init_extensions("GL_EXT_texture_filter_anisotropic"); 580 mHasAnisotropic = glh_init_extensions("GL_EXT_texture_filter_anisotropic");
584 glh_init_extensions("GL_ARB_texture_cube_map"); 581 glh_init_extensions("GL_ARB_texture_cube_map");
@@ -610,7 +607,6 @@ void LLGLManager::initExtensions()
610 mHasVertexBufferObject = FALSE; 607 mHasVertexBufferObject = FALSE;
611 mHasFramebufferObject = FALSE; 608 mHasFramebufferObject = FALSE;
612 mHasMipMapGeneration = FALSE; 609 mHasMipMapGeneration = FALSE;
613 mHasPalettedTextures = FALSE;
614 mHasSeparateSpecularColor = FALSE; 610 mHasSeparateSpecularColor = FALSE;
615 mHasAnisotropic = FALSE; 611 mHasAnisotropic = FALSE;
616 mHasCubeMap = FALSE; 612 mHasCubeMap = FALSE;
@@ -628,7 +624,6 @@ void LLGLManager::initExtensions()
628 // bug reports. This should be the default until we get a 624 // bug reports. This should be the default until we get a
629 // proper blacklist/whitelist on Linux. 625 // proper blacklist/whitelist on Linux.
630 mHasMipMapGeneration = FALSE; 626 mHasMipMapGeneration = FALSE;
631 mHasPalettedTextures = FALSE;
632 mHasAnisotropic = FALSE; 627 mHasAnisotropic = FALSE;
633 //mHasCubeMap = FALSE; // apparently fatal on Intel 915 & similar 628 //mHasCubeMap = FALSE; // apparently fatal on Intel 915 & similar
634 //mHasOcclusionQuery = FALSE; // source of many ATI system hangs 629 //mHasOcclusionQuery = FALSE; // source of many ATI system hangs
@@ -648,7 +643,6 @@ void LLGLManager::initExtensions()
648 if (strchr(blacklist,'b')) mHasCompressedTextures = FALSE; 643 if (strchr(blacklist,'b')) mHasCompressedTextures = FALSE;
649 if (strchr(blacklist,'c')) mHasVertexBufferObject = FALSE; 644 if (strchr(blacklist,'c')) mHasVertexBufferObject = FALSE;
650 if (strchr(blacklist,'d')) mHasMipMapGeneration = FALSE;//S 645 if (strchr(blacklist,'d')) mHasMipMapGeneration = FALSE;//S
651 if (strchr(blacklist,'e')) mHasPalettedTextures = FALSE;//S
652// if (strchr(blacklist,'f')) mHasNVVertexArrayRange = FALSE;//S 646// if (strchr(blacklist,'f')) mHasNVVertexArrayRange = FALSE;//S
653// if (strchr(blacklist,'g')) mHasNVFence = FALSE;//S 647// if (strchr(blacklist,'g')) mHasNVFence = FALSE;//S
654 if (strchr(blacklist,'h')) mHasSeparateSpecularColor = FALSE; 648 if (strchr(blacklist,'h')) mHasSeparateSpecularColor = FALSE;
@@ -663,13 +657,6 @@ void LLGLManager::initExtensions()
663 if (strchr(blacklist,'q')) mHasFramebufferObject = FALSE;//S 657 if (strchr(blacklist,'q')) mHasFramebufferObject = FALSE;//S
664 } 658 }
665#endif // LL_LINUX 659#endif // LL_LINUX
666
667#if LL_DARWIN || LL_LINUX
668 // MBW -- 12/4/2003 -- Using paletted textures causes a bunch of avatar rendering problems on the Mac.
669 // Not sure if this is due to driver problems or incorrect use of the extension, but I'm disabling it for now.
670 // Tofu - 2006-10-03 -- Same problem on Linux.
671 mHasPalettedTextures = false;
672#endif
673 660
674 if (!mHasMultitexture) 661 if (!mHasMultitexture)
675 { 662 {
@@ -683,10 +670,6 @@ void LLGLManager::initExtensions()
683 { 670 {
684 LL_INFOS("RenderInit") << "Couldn't initialize GL_ARB_texture_env_combine" << LL_ENDL; 671 LL_INFOS("RenderInit") << "Couldn't initialize GL_ARB_texture_env_combine" << LL_ENDL;
685 } 672 }
686 if (!mHasPalettedTextures)
687 {
688 LL_INFOS("RenderInit") << "Couldn't initialize GL_EXT_paletted_texture" << LL_ENDL;
689 }
690 if (!mHasSeparateSpecularColor) 673 if (!mHasSeparateSpecularColor)
691 { 674 {
692 LL_INFOS("RenderInit") << "Couldn't initialize separate specular color" << LL_ENDL; 675 LL_INFOS("RenderInit") << "Couldn't initialize separate specular color" << LL_ENDL;
@@ -788,13 +771,7 @@ void LLGLManager::initExtensions()
788 mGLMaxIndexRange = 0; 771 mGLMaxIndexRange = 0;
789 } 772 }
790#endif // !LL_LINUX 773#endif // !LL_LINUX
791#if LL_LINUX 774
792 // On Linux we need to get glColorTableEXT dynamically.
793 if (mHasPalettedTextures)
794 {
795 glColorTableEXT = (PFNGLCOLORTABLEEXTPROC)GLH_EXT_GET_PROC_ADDRESS("glColorTableEXT");
796 }
797#endif // LL_LINUX
798 if (mHasOcclusionQuery) 775 if (mHasOcclusionQuery)
799 { 776 {
800 glGenQueriesARB = (PFNGLGENQUERIESARBPROC)GLH_EXT_GET_PROC_ADDRESS("glGenQueriesARB"); 777 glGenQueriesARB = (PFNGLGENQUERIESARBPROC)GLH_EXT_GET_PROC_ADDRESS("glGenQueriesARB");
@@ -960,7 +937,8 @@ void assert_glerror()
960 GLubyte const * gl_error_msg = gluErrorString(error); 937 GLubyte const * gl_error_msg = gluErrorString(error);
961 if (NULL != gl_error_msg) 938 if (NULL != gl_error_msg)
962 { 939 {
963 LL_WARNS("RenderState") << "GL Error:" << gl_error_msg << LL_ENDL; 940 LL_WARNS("RenderState") << "GL Error:" << error<< LL_ENDL;
941 LL_WARNS("RenderState") << "GL Error String:" << gl_error_msg << LL_ENDL;
964 } 942 }
965 else 943 else
966 { 944 {
@@ -1001,7 +979,7 @@ GLboolean LLGLDepthTest::sWriteEnabled = GL_TRUE; // OpenGL default
1001void LLGLState::initClass() 979void LLGLState::initClass()
1002{ 980{
1003 sStateMap[GL_DITHER] = GL_TRUE; 981 sStateMap[GL_DITHER] = GL_TRUE;
1004 sStateMap[GL_TEXTURE_2D] = GL_TRUE; 982 // sStateMap[GL_TEXTURE_2D] = GL_TRUE;
1005 983
1006 //make sure multisample defaults to disabled 984 //make sure multisample defaults to disabled
1007 sStateMap[GL_MULTISAMPLE_ARB] = GL_FALSE; 985 sStateMap[GL_MULTISAMPLE_ARB] = GL_FALSE;
@@ -1030,7 +1008,7 @@ void LLGLState::resetTextureStates()
1030 { 1008 {
1031 gGL.getTexUnit(j)->activate(); 1009 gGL.getTexUnit(j)->activate();
1032 glClientActiveTextureARB(GL_TEXTURE0_ARB+j); 1010 glClientActiveTextureARB(GL_TEXTURE0_ARB+j);
1033 j == 0 ? glEnable(GL_TEXTURE_2D) : glDisable(GL_TEXTURE_2D); 1011 j == 0 ? gGL.getTexUnit(j)->enable(LLTexUnit::TT_TEXTURE) : gGL.getTexUnit(j)->disable();
1034 } 1012 }
1035} 1013}
1036 1014
@@ -1053,14 +1031,6 @@ void LLGLState::checkStates(const std::string& msg)
1053 1031
1054 stop_glerror(); 1032 stop_glerror();
1055 1033
1056 GLint activeTexture;
1057 glGetIntegerv(GL_ACTIVE_TEXTURE_ARB, &activeTexture);
1058
1059 if (activeTexture != GL_TEXTURE0_ARB)
1060 {
1061 LL_GL_ERRS << "Texture channel corrupted. " << LL_ENDL;
1062 }
1063
1064 GLint src; 1034 GLint src;
1065 GLint dst; 1035 GLint dst;
1066 glGetIntegerv(GL_BLEND_SRC, &src); 1036 glGetIntegerv(GL_BLEND_SRC, &src);
@@ -1099,17 +1069,7 @@ void LLGLState::checkTextureChannels(const std::string& msg)
1099 1069
1100 BOOL error = FALSE; 1070 BOOL error = FALSE;
1101 1071
1102 if (activeTexture != GL_TEXTURE0_ARB) 1072 if (activeTexture == GL_TEXTURE0_ARB)
1103 {
1104 error = TRUE;
1105 LL_WARNS("RenderState") << "Active texture channel corrupted. " << LL_ENDL;
1106 }
1107 else if (!glIsEnabled(GL_TEXTURE_2D))
1108 {
1109 error = TRUE;
1110 LL_WARNS("RenderState") << "GL_TEXTURE_2D not enabled on texture channel 0." << LL_ENDL;
1111 }
1112 else
1113 { 1073 {
1114 GLint tex_env_mode = 0; 1074 GLint tex_env_mode = 0;
1115 1075
@@ -1152,7 +1112,7 @@ void LLGLState::checkTextureChannels(const std::string& msg)
1152 LLMatrix4 identity; 1112 LLMatrix4 identity;
1153 LLMatrix4 matrix; 1113 LLMatrix4 matrix;
1154 1114
1155 for (GLint i = 0; i < maxTextureUnits; i++) 1115 for (GLint i = 1; i < maxTextureUnits; i++)
1156 { 1116 {
1157 gGL.getTexUnit(i)->activate(); 1117 gGL.getTexUnit(i)->activate();
1158 glClientActiveTextureARB(GL_TEXTURE0_ARB+i); 1118 glClientActiveTextureARB(GL_TEXTURE0_ARB+i);
@@ -1459,16 +1419,6 @@ void set_binormals(const S32 index, const U32 stride,const LLVector3 *binormals)
1459#endif 1419#endif
1460} 1420}
1461 1421
1462
1463void set_palette(U8 *palette_data)
1464{
1465 if (gGLManager.mHasPalettedTextures)
1466 {
1467 glColorTableEXT(GL_TEXTURE_2D, GL_RGBA8, 256, GL_RGBA, GL_UNSIGNED_BYTE, palette_data);
1468 }
1469}
1470
1471
1472void parse_gl_version( S32* major, S32* minor, S32* release, std::string* vendor_specific ) 1422void parse_gl_version( S32* major, S32* minor, S32* release, std::string* vendor_specific )
1473{ 1423{
1474 // GL_VERSION returns a null-terminated string with the format: 1424 // GL_VERSION returns a null-terminated string with the format:
diff --git a/linden/indra/llrender/llgl.h b/linden/indra/llrender/llgl.h
index cb368d7..8433348 100644
--- a/linden/indra/llrender/llgl.h
+++ b/linden/indra/llrender/llgl.h
@@ -74,7 +74,6 @@ public:
74 BOOL mHasMultitexture; 74 BOOL mHasMultitexture;
75 S32 mNumTextureUnits; 75 S32 mNumTextureUnits;
76 BOOL mHasMipMapGeneration; 76 BOOL mHasMipMapGeneration;
77 BOOL mHasPalettedTextures;
78 BOOL mHasCompressedTextures; 77 BOOL mHasCompressedTextures;
79 BOOL mHasFramebufferObject; 78 BOOL mHasFramebufferObject;
80 79
@@ -318,11 +317,11 @@ public:
318class LLGLNamePool 317class LLGLNamePool
319{ 318{
320public: 319public:
321 typedef struct 320 struct NameEntry
322 { 321 {
323 GLuint name; 322 GLuint name;
324 BOOL used; 323 BOOL used;
325 } NameEntry; 324 };
326 325
327 struct CompareUsed 326 struct CompareUsed
328 { 327 {
@@ -370,7 +369,6 @@ void disable_cloth_weights(const S32 index);
370void set_vertex_weights(const S32 index, const U32 stride, const F32 *weights); 369void set_vertex_weights(const S32 index, const U32 stride, const F32 *weights);
371void set_vertex_clothing_weights(const S32 index, const U32 stride, const LLVector4 *weights); 370void set_vertex_clothing_weights(const S32 index, const U32 stride, const LLVector4 *weights);
372void set_binormals(const S32 index, const U32 stride, const LLVector3 *binormals); 371void set_binormals(const S32 index, const U32 stride, const LLVector3 *binormals);
373void set_palette(U8* palette_data);
374void parse_gl_version( S32* major, S32* minor, S32* release, std::string* vendor_specific ); 372void parse_gl_version( S32* major, S32* minor, S32* release, std::string* vendor_specific );
375 373
376extern BOOL gClothRipple; 374extern BOOL gClothRipple;
diff --git a/linden/indra/llrender/llglimmediate.h b/linden/indra/llrender/llglimmediate.h
index 2d7d768..cd2af8b 100644
--- a/linden/indra/llrender/llglimmediate.h
+++ b/linden/indra/llrender/llglimmediate.h
@@ -76,12 +76,12 @@ public:
76 void color3fv(const GLfloat* c); 76 void color3fv(const GLfloat* c);
77 void color4ubv(const GLubyte* c); 77 void color4ubv(const GLubyte* c);
78 78
79 typedef struct Vertex 79 typedef struct
80 { 80 {
81 GLfloat v[3]; 81 GLfloat v[3];
82 GLubyte c[4]; 82 GLubyte c[4];
83 GLfloat uv[2]; 83 GLfloat uv[2];
84 }; 84 } Vertex;
85 85
86private: 86private:
87 U32 mCount; 87 U32 mCount;
diff --git a/linden/indra/llrender/llglslshader.cpp b/linden/indra/llrender/llglslshader.cpp
index 26984e1..5d7375c 100644
--- a/linden/indra/llrender/llglslshader.cpp
+++ b/linden/indra/llrender/llglslshader.cpp
@@ -365,7 +365,7 @@ void LLGLSLShader::bindNoShader(void)
365 glUseProgramObjectARB(0); 365 glUseProgramObjectARB(0);
366} 366}
367 367
368S32 LLGLSLShader::enableTexture(S32 uniform, S32 mode) 368S32 LLGLSLShader::enableTexture(S32 uniform, LLTexUnit::eTextureType mode)
369{ 369{
370 if (uniform < 0 || uniform >= (S32)mTexture.size()) 370 if (uniform < 0 || uniform >= (S32)mTexture.size())
371 { 371 {
@@ -376,12 +376,12 @@ S32 LLGLSLShader::enableTexture(S32 uniform, S32 mode)
376 if (index != -1) 376 if (index != -1)
377 { 377 {
378 gGL.getTexUnit(index)->activate(); 378 gGL.getTexUnit(index)->activate();
379 glEnable(mode); 379 gGL.getTexUnit(index)->enable(mode);
380 } 380 }
381 return index; 381 return index;
382} 382}
383 383
384S32 LLGLSLShader::disableTexture(S32 uniform, S32 mode) 384S32 LLGLSLShader::disableTexture(S32 uniform, LLTexUnit::eTextureType mode)
385{ 385{
386 if (uniform < 0 || uniform >= (S32)mTexture.size()) 386 if (uniform < 0 || uniform >= (S32)mTexture.size())
387 { 387 {
@@ -392,7 +392,7 @@ S32 LLGLSLShader::disableTexture(S32 uniform, S32 mode)
392 if (index != -1) 392 if (index != -1)
393 { 393 {
394 gGL.getTexUnit(index)->activate(); 394 gGL.getTexUnit(index)->activate();
395 glDisable(mode); 395 gGL.getTexUnit(index)->disable();
396 } 396 }
397 return index; 397 return index;
398} 398}
diff --git a/linden/indra/llrender/llglslshader.h b/linden/indra/llrender/llglslshader.h
index 0fa8e41..cd787cc 100644
--- a/linden/indra/llrender/llglslshader.h
+++ b/linden/indra/llrender/llglslshader.h
@@ -33,6 +33,7 @@
33#define LL_LLGLSLSHADER_H 33#define LL_LLGLSLSHADER_H
34 34
35#include "llgl.h" 35#include "llgl.h"
36#include "llrender.h"
36 37
37class LLShaderFeatures 38class LLShaderFeatures
38{ 39{
@@ -111,8 +112,8 @@ public:
111 //if given texture uniform is active in the shader, 112 //if given texture uniform is active in the shader,
112 //the corresponding channel will be active upon return 113 //the corresponding channel will be active upon return
113 //returns channel texture is enabled in from [0-MAX) 114 //returns channel texture is enabled in from [0-MAX)
114 S32 enableTexture(S32 uniform, S32 mode = GL_TEXTURE_2D); 115 S32 enableTexture(S32 uniform, LLTexUnit::eTextureType mode = LLTexUnit::TT_TEXTURE);
115 S32 disableTexture(S32 uniform, S32 mode = GL_TEXTURE_2D); 116 S32 disableTexture(S32 uniform, LLTexUnit::eTextureType mode = LLTexUnit::TT_TEXTURE);
116 117
117 BOOL link(BOOL suppress_errors = FALSE); 118 BOOL link(BOOL suppress_errors = FALSE);
118 void bind(); 119 void bind();
diff --git a/linden/indra/llrender/llglstates.h b/linden/indra/llrender/llglstates.h
index e53640c..bb8b8df 100644
--- a/linden/indra/llrender/llglstates.h
+++ b/linden/indra/llrender/llglstates.h
@@ -87,13 +87,6 @@ public:
87 { } 87 { }
88}; 88};
89 89
90class LLGLSNoTexture
91{
92public:
93 LLGLSNoTexture()
94 { LLImageGL::unbindTexture(0); }
95};
96
97class LLGLSObjectSelect 90class LLGLSObjectSelect
98{ 91{
99protected: 92protected:
@@ -104,7 +97,7 @@ public:
104 : mBlend(GL_BLEND), mFog(GL_FOG), 97 : mBlend(GL_BLEND), mFog(GL_FOG),
105 mAlphaTest(GL_ALPHA_TEST), 98 mAlphaTest(GL_ALPHA_TEST),
106 mCullFace(GL_CULL_FACE) 99 mCullFace(GL_CULL_FACE)
107 { LLImageGL::unbindTexture(0); } 100 { }
108}; 101};
109 102
110class LLGLSObjectSelectAlpha 103class LLGLSObjectSelectAlpha
@@ -143,17 +136,6 @@ public:
143 {} 136 {}
144}; 137};
145 138
146class LLGLSNoTextureNoAlphaTest // : public LLGLSUIDefault
147{
148protected:
149 LLGLDisable mAlphaTest;
150public:
151 LLGLSNoTextureNoAlphaTest()
152 : mAlphaTest(GL_ALPHA_TEST)
153
154 { LLImageGL::unbindTexture(0); }
155};
156
157//---------------------------------------------------------------------------- 139//----------------------------------------------------------------------------
158 140
159class LLGLSFog 141class LLGLSFog
@@ -251,7 +233,7 @@ public:
251 mBlend(GL_BLEND), 233 mBlend(GL_BLEND),
252 mAlphaTest(GL_ALPHA_TEST) 234 mAlphaTest(GL_ALPHA_TEST)
253 235
254 { LLImageGL::unbindTexture(0); } 236 { }
255}; 237};
256 238
257//---------------------------------------------------------------------------- 239//----------------------------------------------------------------------------
diff --git a/linden/indra/llrender/llimagegl.cpp b/linden/indra/llrender/llimagegl.cpp
index a871758..d9b22c5 100644
--- a/linden/indra/llrender/llimagegl.cpp
+++ b/linden/indra/llrender/llimagegl.cpp
@@ -125,49 +125,6 @@ S32 LLImageGL::dataFormatComponents(S32 dataformat)
125//---------------------------------------------------------------------------- 125//----------------------------------------------------------------------------
126 126
127// static 127// static
128void LLImageGL::bindExternalTexture(LLGLuint gl_name, S32 stage, LLGLenum bind_target )
129{
130 gGL.flush();
131 if (stage > 0)
132 {
133 gGL.getTexUnit(stage)->activate();
134 }
135 glBindTexture(bind_target, gl_name);
136 sCurrentBoundTextures[stage] = gl_name;
137 if (stage > 0)
138 {
139 gGL.getTexUnit(0)->activate();
140 }
141}
142
143// static
144void LLImageGL::unbindTexture(S32 stage, LLGLenum bind_target)
145{
146 // LLGLSLShader can return -1
147 if (stage >= 0)
148 {
149 gGL.flush();
150 if (stage > 0)
151 {
152 gGL.getTexUnit(stage)->activate();
153 glBindTexture(GL_TEXTURE_2D, 0);
154 gGL.getTexUnit(0)->activate();
155 }
156 else
157 {
158 glBindTexture(GL_TEXTURE_2D, 0);
159 }
160 sCurrentBoundTextures[stage] = 0;
161 }
162}
163
164// static (duplicated for speed and to avoid GL_TEXTURE_2D default argument which requires GL header dependency)
165void LLImageGL::unbindTexture(S32 stage)
166{
167 unbindTexture(stage, GL_TEXTURE_2D);
168}
169
170// static
171void LLImageGL::updateStats(F32 current_time) 128void LLImageGL::updateStats(F32 current_time)
172{ 129{
173 sLastFrameTime = current_time; 130 sLastFrameTime = current_time;
@@ -189,7 +146,7 @@ void LLImageGL::destroyGL(BOOL save_state)
189{ 146{
190 for (S32 stage = 0; stage < gGLManager.mNumTextureUnits; stage++) 147 for (S32 stage = 0; stage < gGLManager.mNumTextureUnits; stage++)
191 { 148 {
192 LLImageGL::unbindTexture(stage, GL_TEXTURE_2D); 149 gGL.getTexUnit(stage)->unbind(LLTexUnit::TT_TEXTURE);
193 } 150 }
194 for (std::set<LLImageGL*>::iterator iter = sImageList.begin(); 151 for (std::set<LLImageGL*>::iterator iter = sImageList.begin();
195 iter != sImageList.end(); iter++) 152 iter != sImageList.end(); iter++)
@@ -284,6 +241,8 @@ LLImageGL::~LLImageGL()
284{ 241{
285 LLImageGL::cleanup(); 242 LLImageGL::cleanup();
286 sImageList.erase(this); 243 sImageList.erase(this);
244 delete [] mPickMask;
245 mPickMask = NULL;
287 sCount--; 246 sCount--;
288} 247}
289 248
@@ -293,11 +252,12 @@ void LLImageGL::init(BOOL usemipmaps)
293 mMissed = FALSE; 252 mMissed = FALSE;
294#endif 253#endif
295 254
255 mPickMask = NULL;
296 mTextureMemory = 0; 256 mTextureMemory = 0;
297 mLastBindTime = 0.f; 257 mLastBindTime = 0.f;
298 258
299 mTarget = GL_TEXTURE_2D; 259 mTarget = GL_TEXTURE_2D;
300 mBindTarget = GL_TEXTURE_2D; 260 mBindTarget = LLTexUnit::TT_TEXTURE;
301 mUseMipMaps = usemipmaps; 261 mUseMipMaps = usemipmaps;
302 mHasMipMaps = FALSE; 262 mHasMipMaps = FALSE;
303 mAutoGenMips = FALSE; 263 mAutoGenMips = FALSE;
@@ -321,6 +281,8 @@ void LLImageGL::init(BOOL usemipmaps)
321 mFormatType = GL_UNSIGNED_BYTE; 281 mFormatType = GL_UNSIGNED_BYTE;
322 mFormatSwapBytes = FALSE; 282 mFormatSwapBytes = FALSE;
323 mHasExplicitFormat = FALSE; 283 mHasExplicitFormat = FALSE;
284
285 mInitialized = true;
324} 286}
325 287
326void LLImageGL::cleanup() 288void LLImageGL::cleanup()
@@ -421,41 +383,14 @@ void LLImageGL::dump()
421 383
422//---------------------------------------------------------------------------- 384//----------------------------------------------------------------------------
423 385
424BOOL LLImageGL::bindTextureInternal(const S32 stage) const 386void LLImageGL::updateBindStats(void) const
425{ 387{
426 if (gGLManager.mIsDisabled)
427 {
428 llwarns << "Trying to bind a texture while GL is disabled!" << llendl;
429 }
430
431
432 if (sCurrentBoundTextures[stage] && sCurrentBoundTextures[stage] == mTexName)
433 {
434 // already set!
435 return TRUE;
436 }
437
438 if (mTexName != 0) 388 if (mTexName != 0)
439 { 389 {
440#ifdef DEBUG_MISS 390#ifdef DEBUG_MISS
441 mMissed = ! getIsResident(TRUE); 391 mMissed = ! getIsResident(TRUE);
442#endif 392#endif
443
444 gGL.flush();
445 if (stage > 0)
446 {
447 gGL.getTexUnit(stage)->activate();
448 }
449
450 glBindTexture(mBindTarget, mTexName);
451 sCurrentBoundTextures[stage] = mTexName;
452 sBindCount++; 393 sBindCount++;
453
454 if (stage > 0)
455 {
456 gGL.getTexUnit(0)->activate();
457 }
458
459 if (mLastBindTime != sLastFrameTime) 394 if (mLastBindTime != sLastFrameTime)
460 { 395 {
461 // we haven't accounted for this texture yet this frame 396 // we haven't accounted for this texture yet this frame
@@ -463,38 +398,22 @@ BOOL LLImageGL::bindTextureInternal(const S32 stage) const
463 updateBoundTexMem(mTextureMemory); 398 updateBoundTexMem(mTextureMemory);
464 mLastBindTime = sLastFrameTime; 399 mLastBindTime = sLastFrameTime;
465 } 400 }
466
467 return TRUE;
468 }
469 else
470 {
471 gGL.flush();
472 if (stage > 0)
473 {
474 gGL.getTexUnit(stage)->activate();
475 }
476 glBindTexture(mBindTarget, 0);
477 if (stage > 0)
478 {
479 gGL.getTexUnit(0)->activate();
480 }
481 sCurrentBoundTextures[stage] = 0;
482 return FALSE;
483 } 401 }
484} 402}
485 403
486//virtual 404//virtual
487BOOL LLImageGL::bind(const S32 stage) const 405bool LLImageGL::bindError(const S32 stage) const
488{ 406{
489 if (stage == -1) 407 return false;
490 { 408}
491 return FALSE; 409
492 } 410//virtual
493 BOOL res = bindTextureInternal(stage); 411bool LLImageGL::bindDefaultImage(const S32 stage) const
494 //llassert(res); 412{
495 return res; 413 return false;
496} 414}
497 415
416
498void LLImageGL::setExplicitFormat( LLGLint internal_format, LLGLenum primary_format, LLGLenum type_format, BOOL swap_bytes ) 417void LLImageGL::setExplicitFormat( LLGLint internal_format, LLGLenum primary_format, LLGLenum type_format, BOOL swap_bytes )
499{ 418{
500 // Note: must be called before createTexture() 419 // Note: must be called before createTexture()
@@ -532,7 +451,7 @@ void LLImageGL::setImage(const U8* data_in, BOOL data_hasmips)
532 451
533 { 452 {
534// LLFastTimer t2(LLFastTimer::FTM_TEMP2); 453// LLFastTimer t2(LLFastTimer::FTM_TEMP2);
535 llverify(bindTextureInternal(0)); 454 llverify(gGL.getTexUnit(0)->bind(this));
536 } 455 }
537 456
538 if (mUseMipMaps) 457 if (mUseMipMaps)
@@ -569,7 +488,8 @@ void LLImageGL::setImage(const U8* data_in, BOOL data_hasmips)
569 } 488 }
570 489
571 glTexImage2D(mTarget, gl_level, mFormatInternal, w, h, 0, mFormatPrimary, GL_UNSIGNED_BYTE, (GLvoid*)data_in); 490 glTexImage2D(mTarget, gl_level, mFormatInternal, w, h, 0, mFormatPrimary, GL_UNSIGNED_BYTE, (GLvoid*)data_in);
572 491 updatePickMask(w, h, data_in);
492
573 if(mFormatSwapBytes) 493 if(mFormatSwapBytes)
574 { 494 {
575 glPixelStorei(GL_UNPACK_SWAP_BYTES, 0); 495 glPixelStorei(GL_UNPACK_SWAP_BYTES, 0);
@@ -585,7 +505,7 @@ void LLImageGL::setImage(const U8* data_in, BOOL data_hasmips)
585 { 505 {
586 if (mAutoGenMips) 506 if (mAutoGenMips)
587 { 507 {
588 glTexParameteri(mBindTarget, GL_GENERATE_MIPMAP_SGIS, TRUE); 508 glTexParameteri(LLTexUnit::getInternalType(mBindTarget), GL_GENERATE_MIPMAP_SGIS, TRUE);
589 stop_glerror(); 509 stop_glerror();
590 { 510 {
591// LLFastTimer t2(LLFastTimer::FTM_TEMP4); 511// LLFastTimer t2(LLFastTimer::FTM_TEMP4);
@@ -596,12 +516,17 @@ void LLImageGL::setImage(const U8* data_in, BOOL data_hasmips)
596 stop_glerror(); 516 stop_glerror();
597 } 517 }
598 518
519 S32 w = getWidth(mCurrentDiscardLevel);
520 S32 h = getHeight(mCurrentDiscardLevel);
521
599 glTexImage2D(mTarget, 0, mFormatInternal, 522 glTexImage2D(mTarget, 0, mFormatInternal,
600 getWidth(mCurrentDiscardLevel), getHeight(mCurrentDiscardLevel), 0, 523 w, h, 0,
601 mFormatPrimary, mFormatType, 524 mFormatPrimary, mFormatType,
602 data_in); 525 data_in);
603 stop_glerror(); 526 stop_glerror();
604 527
528 updatePickMask(w, h, data_in);
529
605 if(mFormatSwapBytes) 530 if(mFormatSwapBytes)
606 { 531 {
607 glPixelStorei(GL_UNPACK_SWAP_BYTES, 0); 532 glPixelStorei(GL_UNPACK_SWAP_BYTES, 0);
@@ -651,6 +576,10 @@ void LLImageGL::setImage(const U8* data_in, BOOL data_hasmips)
651 576
652 glTexImage2D(mTarget, m, mFormatInternal, w, h, 0, mFormatPrimary, mFormatType, cur_mip_data); 577 glTexImage2D(mTarget, m, mFormatInternal, w, h, 0, mFormatPrimary, mFormatType, cur_mip_data);
653 stop_glerror(); 578 stop_glerror();
579 if (m == 0)
580 {
581 updatePickMask(w, h, cur_mip_data);
582 }
654 583
655 if(mFormatSwapBytes) 584 if(mFormatSwapBytes)
656 { 585 {
@@ -701,6 +630,8 @@ void LLImageGL::setImage(const U8* data_in, BOOL data_hasmips)
701 630
702 glTexImage2D(mTarget, 0, mFormatInternal, w, h, 0, 631 glTexImage2D(mTarget, 0, mFormatInternal, w, h, 0,
703 mFormatPrimary, mFormatType, (GLvoid *)data_in); 632 mFormatPrimary, mFormatType, (GLvoid *)data_in);
633 updatePickMask(w, h, data_in);
634
704 stop_glerror(); 635 stop_glerror();
705 636
706 if(mFormatSwapBytes) 637 if(mFormatSwapBytes)
@@ -713,6 +644,7 @@ void LLImageGL::setImage(const U8* data_in, BOOL data_hasmips)
713 mHasMipMaps = FALSE; 644 mHasMipMaps = FALSE;
714 } 645 }
715 stop_glerror(); 646 stop_glerror();
647 mInitialized = true;
716} 648}
717 649
718BOOL LLImageGL::setSubImage(const U8* datap, S32 data_width, S32 data_height, S32 x_pos, S32 y_pos, S32 width, S32 height) 650BOOL LLImageGL::setSubImage(const U8* datap, S32 data_width, S32 data_height, S32 x_pos, S32 y_pos, S32 width, S32 height)
@@ -786,12 +718,10 @@ BOOL LLImageGL::setSubImage(const U8* datap, S32 data_width, S32 data_height, S3
786 718
787 datap += (y_pos * data_width + x_pos) * getComponents(); 719 datap += (y_pos * data_width + x_pos) * getComponents();
788 // Update the GL texture 720 // Update the GL texture
789 BOOL res = bindTextureInternal(0); 721 BOOL res = gGL.getTexUnit(0)->bindManual(mBindTarget, mTexName);
790 if (!res) llerrs << "LLImageGL::setSubImage(): bindTexture failed" << llendl; 722 if (!res) llerrs << "LLImageGL::setSubImage(): bindTexture failed" << llendl;
791 stop_glerror(); 723 stop_glerror();
792 724
793 LLGLEnable tex( GL_TEXTURE_2D );
794
795 glTexSubImage2D(mTarget, 0, x_pos, y_pos, 725 glTexSubImage2D(mTarget, 0, x_pos, y_pos,
796 width, height, mFormatPrimary, mFormatType, datap); 726 width, height, mFormatPrimary, mFormatType, datap);
797 stop_glerror(); 727 stop_glerror();
@@ -804,6 +734,7 @@ BOOL LLImageGL::setSubImage(const U8* datap, S32 data_width, S32 data_height, S3
804 734
805 glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); 735 glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
806 stop_glerror(); 736 stop_glerror();
737 mInitialized = true;
807 } 738 }
808 739
809 return TRUE; 740 return TRUE;
@@ -817,9 +748,10 @@ BOOL LLImageGL::setSubImage(const LLImageRaw* imageraw, S32 x_pos, S32 y_pos, S3
817// Copy sub image from frame buffer 748// Copy sub image from frame buffer
818BOOL LLImageGL::setSubImageFromFrameBuffer(S32 fb_x, S32 fb_y, S32 x_pos, S32 y_pos, S32 width, S32 height) 749BOOL LLImageGL::setSubImageFromFrameBuffer(S32 fb_x, S32 fb_y, S32 x_pos, S32 y_pos, S32 width, S32 height)
819{ 750{
820 if (bindTextureInternal(0)) 751 if (gGL.getTexUnit(0)->bind(this))
821 { 752 {
822 glCopyTexSubImage2D(GL_TEXTURE_2D, 0, fb_x, fb_y, x_pos, y_pos, width, height); 753 glCopyTexSubImage2D(GL_TEXTURE_2D, 0, fb_x, fb_y, x_pos, y_pos, width, height);
754 mInitialized = true;
823 stop_glerror(); 755 stop_glerror();
824 return TRUE; 756 return TRUE;
825 } 757 }
@@ -919,9 +851,9 @@ BOOL LLImageGL::createGLTexture(S32 discard_level, const U8* data_in, BOOL data_
919 stop_glerror(); 851 stop_glerror();
920 { 852 {
921// LLFastTimer t1(LLFastTimer::FTM_TEMP6); 853// LLFastTimer t1(LLFastTimer::FTM_TEMP6);
922 llverify(bindTextureInternal(0)); 854 llverify(gGL.getTexUnit(0)->bind(this));
923 glTexParameteri(mBindTarget, GL_TEXTURE_BASE_LEVEL, 0); 855 glTexParameteri(LLTexUnit::getInternalType(mBindTarget), GL_TEXTURE_BASE_LEVEL, 0);
924 glTexParameteri(mBindTarget, GL_TEXTURE_MAX_LEVEL, mMaxDiscardLevel-discard_level); 856 glTexParameteri(LLTexUnit::getInternalType(mBindTarget), GL_TEXTURE_MAX_LEVEL, mMaxDiscardLevel-discard_level);
925 } 857 }
926 } 858 }
927 if (!mTexName) 859 if (!mTexName)
@@ -949,7 +881,7 @@ BOOL LLImageGL::createGLTexture(S32 discard_level, const U8* data_in, BOOL data_
949 setMipFilterNearest(mMagFilterNearest); 881 setMipFilterNearest(mMagFilterNearest);
950 882
951 // things will break if we don't unbind after creation 883 // things will break if we don't unbind after creation
952 unbindTexture(0, mBindTarget); 884 gGL.getTexUnit(0)->unbind(mBindTarget);
953 stop_glerror(); 885 stop_glerror();
954 886
955 if (old_name != 0) 887 if (old_name != 0)
@@ -1050,8 +982,8 @@ BOOL LLImageGL::readBackRaw(S32 discard_level, LLImageRaw* imageraw, bool compre
1050 S32 gl_discard = discard_level - mCurrentDiscardLevel; 982 S32 gl_discard = discard_level - mCurrentDiscardLevel;
1051 983
1052 //explicitly unbind texture 984 //explicitly unbind texture
1053 LLImageGL::unbindTexture(0, mTarget); 985 gGL.getTexUnit(0)->unbind(mBindTarget);
1054 llverify(bindTextureInternal(0)); 986 llverify(gGL.getTexUnit(0)->bind(this));
1055 987
1056 if (gDebugGL) 988 if (gDebugGL)
1057 { 989 {
@@ -1148,15 +1080,15 @@ BOOL LLImageGL::readBackRaw(S32 discard_level, LLImageRaw* imageraw, bool compre
1148 1080
1149void LLImageGL::destroyGLTexture() 1081void LLImageGL::destroyGLTexture()
1150{ 1082{
1151 stop_glerror();
1152
1153 if (mTexName != 0) 1083 if (mTexName != 0)
1154 { 1084 {
1085 stop_glerror();
1086
1155 for (int i = 0; i < gGLManager.mNumTextureUnits; i++) 1087 for (int i = 0; i < gGLManager.mNumTextureUnits; i++)
1156 { 1088 {
1157 if (sCurrentBoundTextures[i] == mTexName) 1089 if (sCurrentBoundTextures[i] == mTexName)
1158 { 1090 {
1159 unbindTexture(i, GL_TEXTURE_2D); 1091 gGL.getTexUnit(i)->unbind(LLTexUnit::TT_TEXTURE);
1160 stop_glerror(); 1092 stop_glerror();
1161 } 1093 }
1162 } 1094 }
@@ -1184,8 +1116,8 @@ void LLImageGL::glClamp (BOOL clamps, BOOL clampt)
1184{ 1116{
1185 if (mTexName != 0) 1117 if (mTexName != 0)
1186 { 1118 {
1187 glTexParameteri (mBindTarget, GL_TEXTURE_WRAP_S, clamps ? GL_CLAMP_TO_EDGE : GL_REPEAT); 1119 glTexParameteri (LLTexUnit::getInternalType(mBindTarget), GL_TEXTURE_WRAP_S, clamps ? GL_CLAMP_TO_EDGE : GL_REPEAT);
1188 glTexParameteri (mBindTarget, GL_TEXTURE_WRAP_T, clampt ? GL_CLAMP_TO_EDGE : GL_REPEAT); 1120 glTexParameteri (LLTexUnit::getInternalType(mBindTarget), GL_TEXTURE_WRAP_T, clampt ? GL_CLAMP_TO_EDGE : GL_REPEAT);
1189 } 1121 }
1190} 1122}
1191 1123
@@ -1223,23 +1155,23 @@ void LLImageGL::setMipFilterNearest(BOOL mag_nearest, BOOL min_nearest)
1223 { 1155 {
1224 if (mMinFilterNearest) 1156 if (mMinFilterNearest)
1225 { 1157 {
1226 glTexParameteri(mBindTarget, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 1158 glTexParameteri(LLTexUnit::getInternalType(mBindTarget), GL_TEXTURE_MIN_FILTER, GL_NEAREST);
1227 } 1159 }
1228 else if (mHasMipMaps) 1160 else if (mHasMipMaps)
1229 { 1161 {
1230 glTexParameteri(mBindTarget, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); 1162 glTexParameteri(LLTexUnit::getInternalType(mBindTarget), GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
1231 } 1163 }
1232 else 1164 else
1233 { 1165 {
1234 glTexParameteri(mBindTarget, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 1166 glTexParameteri(LLTexUnit::getInternalType(mBindTarget), GL_TEXTURE_MIN_FILTER, GL_LINEAR);
1235 } 1167 }
1236 if (mMagFilterNearest) 1168 if (mMagFilterNearest)
1237 { 1169 {
1238 glTexParameteri(mBindTarget, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 1170 glTexParameteri(LLTexUnit::getInternalType(mBindTarget), GL_TEXTURE_MAG_FILTER, GL_NEAREST);
1239 } 1171 }
1240 else 1172 else
1241 { 1173 {
1242 glTexParameteri(mBindTarget, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 1174 glTexParameteri(LLTexUnit::getInternalType(mBindTarget), GL_TEXTURE_MAG_FILTER, GL_LINEAR);
1243 } 1175 }
1244 if (gGLManager.mHasAnisotropic) 1176 if (gGLManager.mHasAnisotropic)
1245 { 1177 {
@@ -1247,16 +1179,15 @@ void LLImageGL::setMipFilterNearest(BOOL mag_nearest, BOOL min_nearest)
1247 { 1179 {
1248 F32 largest_anisotropy; 1180 F32 largest_anisotropy;
1249 glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &largest_anisotropy); 1181 glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &largest_anisotropy);
1250 glTexParameterf(mBindTarget, GL_TEXTURE_MAX_ANISOTROPY_EXT, largest_anisotropy); 1182 glTexParameterf(LLTexUnit::getInternalType(mBindTarget), GL_TEXTURE_MAX_ANISOTROPY_EXT, largest_anisotropy);
1251 } 1183 }
1252 else 1184 else
1253 { 1185 {
1254 glTexParameterf(mBindTarget, GL_TEXTURE_MAX_ANISOTROPY_EXT, 1.f); 1186 glTexParameterf(LLTexUnit::getInternalType(mBindTarget), GL_TEXTURE_MAX_ANISOTROPY_EXT, 1.f);
1255 } 1187 }
1256 } 1188 }
1257 } 1189 stop_glerror();
1258 1190 }
1259 stop_glerror();
1260} 1191}
1261 1192
1262BOOL LLImageGL::getIsResident(BOOL test_now) 1193BOOL LLImageGL::getIsResident(BOOL test_now)
@@ -1337,14 +1268,93 @@ BOOL LLImageGL::getBoundRecently() const
1337 return (BOOL)(sLastFrameTime - mLastBindTime < MIN_TEXTURE_LIFETIME); 1268 return (BOOL)(sLastFrameTime - mLastBindTime < MIN_TEXTURE_LIFETIME);
1338} 1269}
1339 1270
1340void LLImageGL::setTarget(const LLGLenum target, const LLGLenum bind_target) 1271void LLImageGL::setTarget(const LLGLenum target, const LLTexUnit::eTextureType bind_target)
1341{ 1272{
1342 mTarget = target; 1273 mTarget = target;
1343 mBindTarget = bind_target; 1274 mBindTarget = bind_target;
1344} 1275}
1345 1276
1277void LLImageGL::updatePickMask(S32 width, S32 height, const U8* data_in)
1278{
1279 if (mFormatType != GL_UNSIGNED_BYTE ||
1280 mFormatPrimary != GL_RGBA)
1281 {
1282 //cannot generate a pick mask for this texture
1283 delete [] mPickMask;
1284 mPickMask = NULL;
1285 return;
1286 }
1287
1288 U32 pick_width = width/2;
1289 U32 pick_height = height/2;
1290
1291 U32 size = llmax(pick_width, (U32) 1) * llmax(pick_height, (U32) 1);
1292
1293 size = size/8 + 1;
1294
1295 delete[] mPickMask;
1296 mPickMask = new U8[size];
1297
1298 memset(mPickMask, 0, sizeof(U8) * size);
1299
1300 U32 pick_bit = 0;
1301
1302 for (S32 y = 0; y < height; y += 2)
1303 {
1304 for (S32 x = 0; x < width; x += 2)
1305 {
1306 U8 alpha = data_in[(y*width+x)*4+3];
1307
1308 if (alpha > 32)
1309 {
1310 U32 pick_idx = pick_bit/8;
1311 U32 pick_offset = pick_bit%8;
1312 if (pick_idx >= size)
1313 {
1314 llerrs << "WTF?" << llendl;
1315 }
1316
1317 mPickMask[pick_idx] |= 1 << pick_offset;
1318 }
1319
1320 ++pick_bit;
1321 }
1322 }
1323}
1324
1325BOOL LLImageGL::getMask(const LLVector2 &tc)
1326{
1327 BOOL res = TRUE;
1328
1329 if (mPickMask)
1330 {
1331 S32 width = getWidth()/2;
1332 S32 height = getHeight()/2;
1333
1334 F32 u = tc.mV[0] - floorf(tc.mV[0]);
1335 F32 v = tc.mV[1] - floorf(tc.mV[1]);
1336
1337 if (u < 0.f || u > 1.f ||
1338 v < 0.f || v > 1.f)
1339 {
1340 llerrs << "WTF?" << llendl;
1341 }
1342
1343 S32 x = (S32)(u * width);
1344 S32 y = (S32)(v * height);
1345
1346 S32 idx = y*width+x;
1347 S32 offset = idx%8;
1348
1349 res = mPickMask[idx/8] & (1 << offset) ? TRUE : FALSE;
1350 }
1351
1352 return res;
1353}
1354
1346//---------------------------------------------------------------------------- 1355//----------------------------------------------------------------------------
1347 1356
1357
1348// Manual Mip Generation 1358// Manual Mip Generation
1349/* 1359/*
1350 S32 width = getWidth(discard_level); 1360 S32 width = getWidth(discard_level);
diff --git a/linden/indra/llrender/llimagegl.h b/linden/indra/llrender/llimagegl.h
index 3f231ee..dbe11da 100644
--- a/linden/indra/llrender/llimagegl.h
+++ b/linden/indra/llrender/llimagegl.h
@@ -37,6 +37,9 @@
37 37
38#include "llgltypes.h" 38#include "llgltypes.h"
39#include "llmemory.h" 39#include "llmemory.h"
40#include "v2math.h"
41
42#include "llrender.h"
40 43
41//============================================================================ 44//============================================================================
42 45
@@ -48,11 +51,7 @@ public:
48 static S32 dataFormatBytes(S32 dataformat, S32 width, S32 height); 51 static S32 dataFormatBytes(S32 dataformat, S32 width, S32 height);
49 static S32 dataFormatComponents(S32 dataformat); 52 static S32 dataFormatComponents(S32 dataformat);
50 53
51 // Wrapper for glBindTexture that keeps LLImageGL in sync. 54 void updateBindStats(void) const;
52 // Usually you want stage = 0 and bind_target = GL_TEXTURE_2D
53 static void bindExternalTexture( LLGLuint gl_name, S32 stage, LLGLenum bind_target);
54 static void unbindTexture(S32 stage, LLGLenum target);
55 static void unbindTexture(S32 stage); // Uses GL_TEXTURE_2D (not a default arg to avoid gl.h dependency)
56 55
57 // needs to be called every frame 56 // needs to be called every frame
58 static void updateStats(F32 current_time); 57 static void updateStats(F32 current_time);
@@ -79,7 +78,6 @@ public:
79 78
80protected: 79protected:
81 virtual ~LLImageGL(); 80 virtual ~LLImageGL();
82 BOOL bindTextureInternal(const S32 stage = 0) const;
83 81
84private: 82private:
85 void glClamp (BOOL clamps, BOOL clampt); 83 void glClamp (BOOL clamps, BOOL clampt);
@@ -87,7 +85,8 @@ private:
87 85
88public: 86public:
89 virtual void dump(); // debugging info to llinfos 87 virtual void dump(); // debugging info to llinfos
90 virtual BOOL bind(const S32 stage = 0) const; 88 virtual bool bindError(const S32 stage = 0) const;
89 virtual bool bindDefaultImage(const S32 stage = 0) const;
91 90
92 void setSize(S32 width, S32 height, S32 ncomponents); 91 void setSize(S32 width, S32 height, S32 ncomponents);
93 92
@@ -132,7 +131,11 @@ public:
132 131
133 BOOL getIsResident(BOOL test_now = FALSE); // not const 132 BOOL getIsResident(BOOL test_now = FALSE); // not const
134 133
135 void setTarget(const LLGLenum target, const LLGLenum bind_target); 134 void setTarget(const LLGLenum target, const LLTexUnit::eTextureType bind_target);
135
136 LLTexUnit::eTextureType getTarget(void) const { return mBindTarget; }
137 bool isInitialized(void) const { return mInitialized; }
138 void setInitialized (bool initialized) { mInitialized = initialized; }
136 139
137 BOOL getUseMipMaps() const { return mUseMipMaps; } 140 BOOL getUseMipMaps() const { return mUseMipMaps; }
138 void setUseMipMaps(BOOL usemips) { mUseMipMaps = usemips; } 141 void setUseMipMaps(BOOL usemips) { mUseMipMaps = usemips; }
@@ -141,6 +144,9 @@ public:
141 144
142 BOOL isValidForSculpt(S32 discard_level, S32 image_width, S32 image_height, S32 ncomponents) ; 145 BOOL isValidForSculpt(S32 discard_level, S32 image_width, S32 image_height, S32 ncomponents) ;
143 146
147 void updatePickMask(S32 width, S32 height, const U8* data_in);
148 BOOL getMask(const LLVector2 &tc);
149
144protected: 150protected:
145 void init(BOOL usemipmaps); 151 void init(BOOL usemipmaps);
146 virtual void cleanup(); // Clean up the LLImageGL so it can be reinitialized. Be careful when using this in derived class destructors 152 virtual void cleanup(); // Clean up the LLImageGL so it can be reinitialized. Be careful when using this in derived class destructors
@@ -152,6 +158,7 @@ public:
152 158
153private: 159private:
154 LLPointer<LLImageRaw> mSaveData; // used for destroyGL/restoreGL 160 LLPointer<LLImageRaw> mSaveData; // used for destroyGL/restoreGL
161 U8* mPickMask; //downsampled bitmap approximation of alpha channel. NULL if no alpha channel
155 S8 mUseMipMaps; 162 S8 mUseMipMaps;
156 S8 mHasMipMaps; 163 S8 mHasMipMaps;
157 S8 mHasExplicitFormat; // If false (default), GL format is f(mComponents) 164 S8 mHasExplicitFormat; // If false (default), GL format is f(mComponents)
@@ -159,7 +166,8 @@ private:
159 166
160protected: 167protected:
161 LLGLenum mTarget; // Normally GL_TEXTURE2D, sometimes something else (ex. cube maps) 168 LLGLenum mTarget; // Normally GL_TEXTURE2D, sometimes something else (ex. cube maps)
162 LLGLenum mBindTarget; // NOrmally GL_TEXTURE2D, sometimes something else (ex. cube maps) 169 LLTexUnit::eTextureType mBindTarget; // Normally TT_TEXTURE, sometimes something else (ex. cube maps)
170 bool mInitialized;
163 171
164 LLGLuint mTexName; 172 LLGLuint mTexName;
165 173
diff --git a/linden/indra/llrender/llpostprocess.cpp b/linden/indra/llrender/llpostprocess.cpp
index c884951..0f1ad5c 100644
--- a/linden/indra/llrender/llpostprocess.cpp
+++ b/linden/indra/llrender/llpostprocess.cpp
@@ -220,9 +220,9 @@ void LLPostProcess::applyColorFilterShader(void)
220 gPostColorFilterProgram.bind(); 220 gPostColorFilterProgram.bind();
221 221
222 gGL.getTexUnit(0)->activate(); 222 gGL.getTexUnit(0)->activate();
223 glEnable(GL_TEXTURE_RECTANGLE_ARB); 223 gGL.getTexUnit(0)->enable(LLTexUnit::TT_RECT_TEXTURE);
224 224
225 glBindTexture(GL_TEXTURE_RECTANGLE_ARB, sceneRenderTexture); 225 gGL.getTexUnit(0)->bindManual(LLTexUnit::TT_RECT_TEXTURE, sceneRenderTexture);
226 226
227 getShaderUniforms(colorFilterUniforms, gPostColorFilterProgram.mProgramObject); 227 getShaderUniforms(colorFilterUniforms, gPostColorFilterProgram.mProgramObject);
228 glUniform1iARB(colorFilterUniforms["RenderTexture"], 0); 228 glUniform1iARB(colorFilterUniforms["RenderTexture"], 0);
@@ -264,16 +264,16 @@ void LLPostProcess::applyNightVisionShader(void)
264 gPostNightVisionProgram.bind(); 264 gPostNightVisionProgram.bind();
265 265
266 gGL.getTexUnit(0)->activate(); 266 gGL.getTexUnit(0)->activate();
267 glEnable(GL_TEXTURE_RECTANGLE_ARB); 267 gGL.getTexUnit(0)->enable(LLTexUnit::TT_RECT_TEXTURE);
268 268
269 getShaderUniforms(nightVisionUniforms, gPostNightVisionProgram.mProgramObject); 269 getShaderUniforms(nightVisionUniforms, gPostNightVisionProgram.mProgramObject);
270 glBindTexture(GL_TEXTURE_RECTANGLE_ARB, sceneRenderTexture); 270 gGL.getTexUnit(0)->bindManual(LLTexUnit::TT_RECT_TEXTURE, sceneRenderTexture);
271 glUniform1iARB(nightVisionUniforms["RenderTexture"], 0); 271 glUniform1iARB(nightVisionUniforms["RenderTexture"], 0);
272 272
273 gGL.getTexUnit(1)->activate(); 273 gGL.getTexUnit(1)->activate();
274 glEnable(GL_TEXTURE_2D); 274 gGL.getTexUnit(1)->enable(LLTexUnit::TT_TEXTURE);
275 275
276 glBindTexture(GL_TEXTURE_2D, noiseTexture); 276 gGL.getTexUnit(1)->bindManual(LLTexUnit::TT_TEXTURE, noiseTexture);
277 glUniform1iARB(nightVisionUniforms["NoiseTexture"], 1); 277 glUniform1iARB(nightVisionUniforms["NoiseTexture"], 1);
278 278
279 279
@@ -373,7 +373,7 @@ void LLPostProcess::doEffects(void)
373 373
374void LLPostProcess::copyFrameBuffer(GLuint & texture, unsigned int width, unsigned int height) 374void LLPostProcess::copyFrameBuffer(GLuint & texture, unsigned int width, unsigned int height)
375{ 375{
376 glBindTexture(GL_TEXTURE_RECTANGLE_ARB, texture); 376 gGL.getTexUnit(0)->bindManual(LLTexUnit::TT_RECT_TEXTURE, texture);
377 glCopyTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, GL_RGBA, 0, 0, width, height, 0); 377 glCopyTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, GL_RGBA, 0, 0, width, height, 0);
378} 378}
379 379
@@ -487,7 +487,7 @@ void LLPostProcess::createTexture(GLuint & texture, unsigned int width, unsigned
487 std::vector<GLubyte> data(width * height * 4, 0); 487 std::vector<GLubyte> data(width * height * 4, 0);
488 488
489 glGenTextures(1, &texture); 489 glGenTextures(1, &texture);
490 glBindTexture(GL_TEXTURE_RECTANGLE_ARB, texture); 490 gGL.getTexUnit(0)->bindManual(LLTexUnit::TT_RECT_TEXTURE, texture);
491 glTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, 4, width, height, 0, 491 glTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, 4, width, height, 0,
492 GL_RGBA, GL_UNSIGNED_BYTE, &data[0]); 492 GL_RGBA, GL_UNSIGNED_BYTE, &data[0]);
493 glTexParameteri(GL_TEXTURE_RECTANGLE_ARB,GL_TEXTURE_MIN_FILTER,GL_LINEAR); 493 glTexParameteri(GL_TEXTURE_RECTANGLE_ARB,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
@@ -509,7 +509,7 @@ void LLPostProcess::createNoiseTexture(GLuint & texture)
509 buffer[(i * NOISE_SIZE) + k] = (GLubyte)((double) rand() / ((double) RAND_MAX + 1.f) * 255.f); 509 buffer[(i * NOISE_SIZE) + k] = (GLubyte)((double) rand() / ((double) RAND_MAX + 1.f) * 255.f);
510 } 510 }
511 } 511 }
512 glBindTexture(GL_TEXTURE_2D, texture); 512 gGL.getTexUnit(0)->bindManual(LLTexUnit::TT_TEXTURE, texture);
513 glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, NOISE_SIZE, NOISE_SIZE, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, &buffer[0]); 513 glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, NOISE_SIZE, NOISE_SIZE, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, &buffer[0]);
514 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,GL_LINEAR); 514 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,GL_LINEAR);
515 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,GL_LINEAR); 515 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,GL_LINEAR);
diff --git a/linden/indra/llrender/llrender.cpp b/linden/indra/llrender/llrender.cpp
index 7be06af..80fed06 100644
--- a/linden/indra/llrender/llrender.cpp
+++ b/linden/indra/llrender/llrender.cpp
@@ -32,7 +32,11 @@
32#include "linden_common.h" 32#include "linden_common.h"
33 33
34#include "llrender.h" 34#include "llrender.h"
35
35#include "llvertexbuffer.h" 36#include "llvertexbuffer.h"
37#include "llcubemap.h"
38#include "llimagegl.h"
39#include "llrendertarget.h"
36 40
37LLRender gGL; 41LLRender gGL;
38 42
@@ -44,6 +48,20 @@ S32 gGLViewport[4];
44 48
45static const U32 LL_NUM_TEXTURE_LAYERS = 8; 49static const U32 LL_NUM_TEXTURE_LAYERS = 8;
46 50
51static GLenum sGLTextureType[] =
52{
53 GL_TEXTURE_2D,
54 GL_TEXTURE_RECTANGLE_ARB,
55 GL_TEXTURE_CUBE_MAP_ARB
56};
57
58static GLint sGLAddressMode[] =
59{
60 GL_REPEAT,
61 GL_MIRRORED_REPEAT,
62 GL_CLAMP_TO_EDGE
63};
64
47static GLenum sGLCompareFunc[] = 65static GLenum sGLCompareFunc[] =
48{ 66{
49 GL_NEVER, 67 GL_NEVER,
@@ -72,82 +90,217 @@ static GLenum sGLBlendFactor[] =
72 GL_ONE_MINUS_SRC_ALPHA 90 GL_ONE_MINUS_SRC_ALPHA
73}; 91};
74 92
75LLTexUnit::LLTexUnit(U32 index) 93LLTexUnit::LLTexUnit(S32 index)
76: mIsEnabled(false), mCurrBlendType(TB_MULT), 94: mCurrTexType(TT_NONE), mCurrBlendType(TB_MULT),
77mCurrColorOp(TBO_MULT), mCurrAlphaOp(TBO_MULT), 95mCurrColorOp(TBO_MULT), mCurrAlphaOp(TBO_MULT),
78mCurrColorSrc1(TBS_TEX_COLOR), mCurrColorSrc2(TBS_PREV_COLOR), 96mCurrColorSrc1(TBS_TEX_COLOR), mCurrColorSrc2(TBS_PREV_COLOR),
79mCurrAlphaSrc1(TBS_TEX_ALPHA), mCurrAlphaSrc2(TBS_PREV_ALPHA), 97mCurrAlphaSrc1(TBS_TEX_ALPHA), mCurrAlphaSrc2(TBS_PREV_ALPHA),
80mCurrColorScale(1), mCurrAlphaScale(1) 98mCurrColorScale(1), mCurrAlphaScale(1), mCurrTexture(0)
81{ 99{
82 llassert_always(index < LL_NUM_TEXTURE_LAYERS); 100 llassert_always(index < LL_NUM_TEXTURE_LAYERS);
83 mIndex = index; 101 mIndex = index;
84} 102}
85 103
86U32 LLTexUnit::getIndex(void) 104//static
105U32 LLTexUnit::getInternalType(eTextureType type)
87{ 106{
88 return mIndex; 107 return sGLTextureType[type];
89} 108}
90 109
91void LLTexUnit::enable(void) 110void LLTexUnit::refreshState(void)
92{ 111{
93 if (!mIsEnabled) 112 // We set dirty to true so that the tex unit knows to ignore caching
113 // and we reset the cached tex unit state
114
115 glActiveTextureARB(GL_TEXTURE0_ARB + mIndex);
116 if (mCurrTexType != TT_NONE)
94 { 117 {
95 activate(); 118 glEnable(sGLTextureType[mCurrTexType]);
96 glEnable(GL_TEXTURE_2D); 119 glBindTexture(sGLTextureType[mCurrTexType], mCurrTexture);
97 mIsEnabled = true;
98 } 120 }
99} 121 else
100
101void LLTexUnit::disable(void)
102{
103 if (mIsEnabled)
104 { 122 {
105 activate();
106 glDisable(GL_TEXTURE_2D); 123 glDisable(GL_TEXTURE_2D);
107 mIsEnabled = false; 124 glBindTexture(GL_TEXTURE_2D, 0);
125 }
126
127 if (mCurrBlendType != TB_COMBINE)
128 {
129 setTextureBlendType(mCurrBlendType);
130 }
131 else
132 {
133 setTextureCombiner(mCurrColorOp, mCurrColorSrc1, mCurrColorSrc2, false);
134 setTextureCombiner(mCurrAlphaOp, mCurrAlphaSrc1, mCurrAlphaSrc2, true);
108 } 135 }
109} 136}
110 137
111void LLTexUnit::activate(void) 138void LLTexUnit::activate(void)
112{ 139{
113 //if (gGL.mCurrTextureUnitIndex != mIndex) 140 if (mIndex < 0) return;
141
142 if (gGL.mCurrTextureUnitIndex != mIndex || gGL.mDirty)
114 { 143 {
115 glActiveTextureARB(GL_TEXTURE0_ARB + mIndex); 144 glActiveTextureARB(GL_TEXTURE0_ARB + mIndex);
116 gGL.mCurrTextureUnitIndex = mIndex; 145 gGL.mCurrTextureUnitIndex = mIndex;
117 } 146 }
118} 147}
119 148
120// Useful for debugging that you've manually assigned a texture operation to the correct 149void LLTexUnit::enable(eTextureType type)
121// texture unit based on the currently set active texture in opengl.
122void LLTexUnit::debugTextureUnit(void)
123{ 150{
124 GLint activeTexture; 151 if (mIndex < 0) return;
125 glGetIntegerv(GL_ACTIVE_TEXTURE_ARB, &activeTexture); 152
126 if ((GL_TEXTURE0_ARB + mIndex) != activeTexture) 153 if ( (mCurrTexType != type || gGL.mDirty) && (type != TT_NONE) )
154 {
155 activate();
156 if (mCurrTexType != TT_NONE && !gGL.mDirty)
157 {
158 disable(); // Force a disable of a previous texture type if it's enabled.
159 }
160 mCurrTexType = type;
161 glEnable(sGLTextureType[type]);
162 }
163}
164
165void LLTexUnit::disable(void)
166{
167 if (mIndex < 0) return;
168
169 if (mCurrTexType != TT_NONE)
127 { 170 {
128 llerrs << "Incorrect Texture Unit! Expected: " << (activeTexture - GL_TEXTURE0_ARB) << " Actual: " << mIndex << llendl; 171 activate();
172 unbind(mCurrTexType);
173 glDisable(sGLTextureType[mCurrTexType]);
174 mCurrTexType = TT_NONE;
129 } 175 }
130} 176}
131 177
132void LLTexUnit::bindTexture(const LLImageGL* texture) 178bool LLTexUnit::bind(const LLImageGL* texture)
133{ 179{
180 if (mIndex < 0) return false;
181
182 gGL.flush();
183
184 if (texture == NULL)
185 {
186 return texture->bindError(mIndex);
187 }
188
189 if (!texture->isInitialized())
190 {
191 return texture->bindDefaultImage(mIndex);
192 }
193
194 // Disabled caching of binding state.
134 if (texture != NULL) 195 if (texture != NULL)
135 { 196 {
136 activate(); 197 activate();
137 texture->bind(mIndex); 198 enable(texture->getTarget());
199 mCurrTexture = texture->getTexName();
200 glBindTexture(sGLTextureType[texture->getTarget()], mCurrTexture);
201 texture->updateBindStats();
202 return true;
138 } 203 }
204 return false;
139} 205}
140 206
141void LLTexUnit::unbindTexture(void) 207bool LLTexUnit::bind(LLCubeMap* cubeMap)
142{ 208{
209 if (mIndex < 0) return false;
210
211 gGL.flush();
212
213 // Disabled caching of binding state.
214 if (cubeMap != NULL)
215 {
216 if (gGLManager.mHasCubeMap && LLCubeMap::sUseCubeMaps)
217 {
218 activate();
219 enable(LLTexUnit::TT_CUBE_MAP);
220 mCurrTexture = cubeMap->mImages[0]->getTexName();
221 glBindTexture(GL_TEXTURE_CUBE_MAP_ARB, mCurrTexture);
222 cubeMap->mImages[0]->updateBindStats();
223 cubeMap->mImages[0]->setMipFilterNearest (FALSE, FALSE);
224 return true;
225 }
226 else
227 {
228 llwarns << "Using cube map without extension!" << llendl
229 }
230 }
231 return false;
232}
233
234bool LLTexUnit::bind(LLRenderTarget* renderTarget, bool bindDepth)
235{
236 if (mIndex < 0) return false;
237
238 gGL.flush();
239
240 if (bindDepth)
241 {
242 bindManual(renderTarget->getUsage(), renderTarget->getDepth());
243 }
244 else
245 {
246 bindManual(renderTarget->getUsage(), renderTarget->getTexture());
247 }
248
249 return true;
250}
251
252bool LLTexUnit::bindManual(eTextureType type, U32 texture)
253{
254 if (mIndex < 0) return false;
255
256 // Disabled caching of binding state.
257 gGL.flush();
258
143 activate(); 259 activate();
144 glBindTexture(GL_TEXTURE_2D, 0); 260 enable(type);
261 mCurrTexture = texture;
262 glBindTexture(sGLTextureType[type], texture);
263 return true;
264}
265
266void LLTexUnit::unbind(eTextureType type)
267{
268 if (mIndex < 0) return;
269
270 // Disabled caching of binding state.
271 if (mCurrTexType == type)
272 {
273 gGL.flush();
274
275 activate();
276 mCurrTexture = 0;
277 glBindTexture(sGLTextureType[type], 0);
278 }
279}
280
281void LLTexUnit::setTextureAddressMode(eTextureAddressMode mode)
282{
283 if (mIndex < 0) return;
284
285 if (true)
286 {
287 activate();
288
289 glTexParameteri (sGLTextureType[mCurrTexType], GL_TEXTURE_WRAP_S, sGLAddressMode[mode]);
290 glTexParameteri (sGLTextureType[mCurrTexType], GL_TEXTURE_WRAP_T, sGLAddressMode[mode]);
291 if (mCurrTexType == TT_CUBE_MAP)
292 {
293 glTexParameteri (GL_TEXTURE_CUBE_MAP_ARB, GL_TEXTURE_WRAP_R, sGLAddressMode[mode]);
294 }
295 }
145} 296}
146 297
147void LLTexUnit::setTextureBlendType(eTextureBlendType type) 298void LLTexUnit::setTextureBlendType(eTextureBlendType type)
148{ 299{
300 if (mIndex < 0) return;
301
149 // Do nothing if it's already correctly set. 302 // Do nothing if it's already correctly set.
150 if (mCurrBlendType == type) 303 if (mCurrBlendType == type && !gGL.mDirty)
151 { 304 {
152 return; 305 return;
153 } 306 }
@@ -262,16 +415,18 @@ GLint LLTexUnit::getTextureSourceType(eTextureBlendSrc src, bool isAlpha)
262 415
263void LLTexUnit::setTextureCombiner(eTextureBlendOp op, eTextureBlendSrc src1, eTextureBlendSrc src2, bool isAlpha) 416void LLTexUnit::setTextureCombiner(eTextureBlendOp op, eTextureBlendSrc src1, eTextureBlendSrc src2, bool isAlpha)
264{ 417{
418 if (mIndex < 0) return;
419
265 activate(); 420 activate();
266 if (mCurrBlendType != TB_COMBINE) 421 if (mCurrBlendType != TB_COMBINE || gGL.mDirty)
267 { 422 {
268 mCurrBlendType = TB_COMBINE; 423 mCurrBlendType = TB_COMBINE;
269 glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_ARB); 424 glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_ARB);
270 } 425 }
271 426
272 // We want an early out, because this function does a LOT of stuff. 427 // We want an early out, because this function does a LOT of stuff.
273 if ( (isAlpha && (mCurrAlphaOp == op) && (mCurrAlphaSrc1 == src1) && (mCurrAlphaSrc2 == src2) ) 428 if ( ( (isAlpha && (mCurrAlphaOp == op) && (mCurrAlphaSrc1 == src1) && (mCurrAlphaSrc2 == src2))
274 || (!isAlpha && (mCurrColorOp == op) && (mCurrColorSrc1 == src1) && (mCurrColorSrc2 == src2) )) 429 || (!isAlpha && (mCurrColorOp == op) && (mCurrColorSrc1 == src1) && (mCurrColorSrc2 == src2)) ) && !gGL.mDirty)
275 { 430 {
276 return; 431 return;
277 } 432 }
@@ -304,7 +459,7 @@ void LLTexUnit::setTextureCombiner(eTextureBlendOp op, eTextureBlendSrc src1, eT
304 } 459 }
305 else 460 else
306 { 461 {
307 // Set enums to ALPHA ones 462 // Set enums to RGB ones
308 comb_enum = GL_COMBINE_RGB_ARB; 463 comb_enum = GL_COMBINE_RGB_ARB;
309 src0_enum = GL_SOURCE0_RGB_ARB; 464 src0_enum = GL_SOURCE0_RGB_ARB;
310 src1_enum = GL_SOURCE1_RGB_ARB; 465 src1_enum = GL_SOURCE1_RGB_ARB;
@@ -405,7 +560,7 @@ void LLTexUnit::setTextureCombiner(eTextureBlendOp op, eTextureBlendSrc src1, eT
405 560
406void LLTexUnit::setColorScale(S32 scale) 561void LLTexUnit::setColorScale(S32 scale)
407{ 562{
408 if (mCurrColorScale != scale) 563 if (mCurrColorScale != scale || gGL.mDirty)
409 { 564 {
410 mCurrColorScale = scale; 565 mCurrColorScale = scale;
411 glTexEnvi( GL_TEXTURE_ENV, GL_RGB_SCALE, scale ); 566 glTexEnvi( GL_TEXTURE_ENV, GL_RGB_SCALE, scale );
@@ -414,27 +569,52 @@ void LLTexUnit::setColorScale(S32 scale)
414 569
415void LLTexUnit::setAlphaScale(S32 scale) 570void LLTexUnit::setAlphaScale(S32 scale)
416{ 571{
417 if (mCurrAlphaScale != scale) 572 if (mCurrAlphaScale != scale || gGL.mDirty)
418 { 573 {
419 mCurrAlphaScale = scale; 574 mCurrAlphaScale = scale;
420 glTexEnvi( GL_TEXTURE_ENV, GL_ALPHA_SCALE, scale ); 575 glTexEnvi( GL_TEXTURE_ENV, GL_ALPHA_SCALE, scale );
421 } 576 }
422} 577}
423 578
579// Useful for debugging that you've manually assigned a texture operation to the correct
580// texture unit based on the currently set active texture in opengl.
581void LLTexUnit::debugTextureUnit(void)
582{
583 if (mIndex < 0) return;
584
585 GLint activeTexture;
586 glGetIntegerv(GL_ACTIVE_TEXTURE_ARB, &activeTexture);
587 if ((GL_TEXTURE0_ARB + mIndex) != activeTexture)
588 {
589 U32 set_unit = (activeTexture - GL_TEXTURE0_ARB);
590 llwarns << "Incorrect Texture Unit! Expected: " << set_unit << " Actual: " << mIndex << llendl;
591 }
592}
593
594
424LLRender::LLRender() 595LLRender::LLRender()
596: mDirty(false), mCount(0), mMode(LLRender::TRIANGLES)
425{ 597{
426 mCount = 0;
427 mMode = LLVertexBuffer::TRIANGLES;
428 mBuffer = new LLVertexBuffer(immediate_mask, 0); 598 mBuffer = new LLVertexBuffer(immediate_mask, 0);
429 mBuffer->allocateBuffer(4096, 0, TRUE); 599 mBuffer->allocateBuffer(4096, 0, TRUE);
430 mBuffer->getVertexStrider(mVerticesp); 600 mBuffer->getVertexStrider(mVerticesp);
431 mBuffer->getTexCoordStrider(mTexcoordsp); 601 mBuffer->getTexCoordStrider(mTexcoordsp);
432 mBuffer->getColorStrider(mColorsp); 602 mBuffer->getColorStrider(mColorsp);
433 603
434 for (unsigned int i = 0; i < LL_NUM_TEXTURE_LAYERS; i++) 604 mTexUnits.reserve(LL_NUM_TEXTURE_LAYERS);
605 for (U32 i = 0; i < LL_NUM_TEXTURE_LAYERS; i++)
435 { 606 {
436 mTexUnits.push_back(new LLTexUnit(i)); 607 mTexUnits.push_back(new LLTexUnit(i));
437 } 608 }
609 mDummyTexUnit = new LLTexUnit(-1);
610
611 for (U32 i = 0; i < 4; i++)
612 {
613 mCurrColorMask[i] = true;
614 }
615
616 mCurrAlphaFunc = CF_DEFAULT;
617 mCurrAlphaFuncVal = 0.01f;
438} 618}
439 619
440LLRender::~LLRender() 620LLRender::~LLRender()
@@ -449,6 +629,28 @@ void LLRender::shutdown()
449 delete mTexUnits[i]; 629 delete mTexUnits[i];
450 } 630 }
451 mTexUnits.clear(); 631 mTexUnits.clear();
632 delete mDummyTexUnit;
633 mDummyTexUnit = NULL;
634}
635
636void LLRender::refreshState(void)
637{
638 mDirty = true;
639
640 U32 active_unit = mCurrTextureUnitIndex;
641
642 for (U32 i = 0; i < mTexUnits.size(); i++)
643 {
644 mTexUnits[i]->refreshState();
645 }
646
647 mTexUnits[active_unit]->activate();
648
649 setColorMask(mCurrColorMask[0], mCurrColorMask[1], mCurrColorMask[2], mCurrColorMask[3]);
650
651 setAlphaRejectSettings(mCurrAlphaFunc, mCurrAlphaFuncVal);
652
653 mDirty = false;
452} 654}
453 655
454void LLRender::translatef(const GLfloat& x, const GLfloat& y, const GLfloat& z) 656void LLRender::translatef(const GLfloat& x, const GLfloat& y, const GLfloat& z)
@@ -483,6 +685,12 @@ void LLRender::setColorMask(bool writeColor, bool writeAlpha)
483void LLRender::setColorMask(bool writeColorR, bool writeColorG, bool writeColorB, bool writeAlpha) 685void LLRender::setColorMask(bool writeColorR, bool writeColorG, bool writeColorB, bool writeAlpha)
484{ 686{
485 flush(); 687 flush();
688
689 mCurrColorMask[0] = writeColorR;
690 mCurrColorMask[1] = writeColorG;
691 mCurrColorMask[2] = writeColorB;
692 mCurrColorMask[3] = writeAlpha;
693
486 glColorMask(writeColorR, writeColorG, writeColorB, writeAlpha); 694 glColorMask(writeColorR, writeColorG, writeColorB, writeAlpha);
487} 695}
488 696
@@ -518,6 +726,9 @@ void LLRender::setSceneBlendType(eBlendType type)
518void LLRender::setAlphaRejectSettings(eCompareFunc func, F32 value) 726void LLRender::setAlphaRejectSettings(eCompareFunc func, F32 value)
519{ 727{
520 flush(); 728 flush();
729
730 mCurrAlphaFunc = func;
731 mCurrAlphaFuncVal = value;
521 if (func == CF_DEFAULT) 732 if (func == CF_DEFAULT)
522 { 733 {
523 glAlphaFunc(GL_GREATER, 0.01f); 734 glAlphaFunc(GL_GREATER, 0.01f);
@@ -536,22 +747,38 @@ void LLRender::blendFunc(eBlendFactor sfactor, eBlendFactor dfactor)
536 747
537LLTexUnit* LLRender::getTexUnit(U32 index) 748LLTexUnit* LLRender::getTexUnit(U32 index)
538{ 749{
539 if (index < mTexUnits.size()) 750 if ((index >= 0) && (index < mTexUnits.size()))
540 { 751 {
541 return mTexUnits[index]; 752 return mTexUnits[index];
542 } 753 }
543 llerrs << "Non-existing texture unit layer requested: " << index << llendl; 754 else
544 return NULL; 755 {
756 lldebugs << "Non-existing texture unit layer requested: " << index << llendl;
757 return mDummyTexUnit;
758 }
759}
760
761bool LLRender::verifyTexUnitActive(U32 unitToVerify)
762{
763 if (mCurrTextureUnitIndex == unitToVerify)
764 {
765 return true;
766 }
767 else
768 {
769 llwarns << "TexUnit currently active: " << mCurrTextureUnitIndex << " (expecting " << unitToVerify << ")" << llendl;
770 return false;
771 }
545} 772}
546 773
547void LLRender::begin(const GLuint& mode) 774void LLRender::begin(const GLuint& mode)
548{ 775{
549 if (mode != mMode) 776 if (mode != mMode)
550 { 777 {
551 if (mMode == LLVertexBuffer::QUADS || 778 if (mMode == LLRender::QUADS ||
552 mMode == LLVertexBuffer::LINES || 779 mMode == LLRender::LINES ||
553 mMode == LLVertexBuffer::TRIANGLES || 780 mMode == LLRender::TRIANGLES ||
554 mMode == LLVertexBuffer::POINTS) 781 mMode == LLRender::POINTS)
555 { 782 {
556 flush(); 783 flush();
557 } 784 }
@@ -572,10 +799,10 @@ void LLRender::end()
572 //IMM_ERRS << "GL begin and end called with no vertices specified." << llendl; 799 //IMM_ERRS << "GL begin and end called with no vertices specified." << llendl;
573 } 800 }
574 801
575 if ((mMode != LLVertexBuffer::QUADS && 802 if ((mMode != LLRender::QUADS &&
576 mMode != LLVertexBuffer::LINES && 803 mMode != LLRender::LINES &&
577 mMode != LLVertexBuffer::TRIANGLES && 804 mMode != LLRender::TRIANGLES &&
578 mMode != LLVertexBuffer::POINTS) || 805 mMode != LLRender::POINTS) ||
579 mCount > 2048) 806 mCount > 2048)
580 { 807 {
581 flush(); 808 flush();
@@ -638,7 +865,8 @@ void LLRender::flush()
638} 865}
639void LLRender::vertex3f(const GLfloat& x, const GLfloat& y, const GLfloat& z) 866void LLRender::vertex3f(const GLfloat& x, const GLfloat& y, const GLfloat& z)
640{ 867{
641 if (mCount >= 4096) 868 //the range of mVerticesp, mColorsp and mTexcoordsp is [0, 4095]
869 if (mCount > 4094)
642 { 870 {
643 // llwarns << "GL immediate mode overflow. Some geometry not drawn." << llendl; 871 // llwarns << "GL immediate mode overflow. Some geometry not drawn." << llendl;
644 return; 872 return;
@@ -720,3 +948,35 @@ void LLRender::color3fv(const GLfloat* c)
720 color4f(c[0],c[1],c[2],1); 948 color4f(c[0],c[1],c[2],1);
721} 949}
722 950
951void LLRender::debugTexUnits(void)
952{
953 LL_INFOS("TextureUnit") << "Active TexUnit: " << mCurrTextureUnitIndex << LL_ENDL;
954 std::string active_enabled = "false";
955 for (U32 i = 0; i < mTexUnits.size(); i++)
956 {
957 if (getTexUnit(i)->mCurrTexType != LLTexUnit::TT_NONE)
958 {
959 if (i == mCurrTextureUnitIndex) active_enabled = "true";
960 LL_INFOS("TextureUnit") << "TexUnit: " << i << " Enabled" << LL_ENDL;
961 LL_INFOS("TextureUnit") << "Enabled As: " ;
962 switch (getTexUnit(i)->mCurrTexType)
963 {
964 case LLTexUnit::TT_TEXTURE:
965 LL_CONT << "Texture 2D";
966 break;
967 case LLTexUnit::TT_RECT_TEXTURE:
968 LL_CONT << "Texture Rectangle";
969 break;
970 case LLTexUnit::TT_CUBE_MAP:
971 LL_CONT << "Cube Map";
972 break;
973 default:
974 LL_CONT << "ARGH!!! NONE!";
975 break;
976 }
977 LL_CONT << ", Texture Bound: " << getTexUnit(i)->mCurrTexture << LL_ENDL;
978 }
979 }
980 LL_INFOS("TextureUnit") << "Active TexUnit Enabled : " << active_enabled << LL_ENDL;
981}
982
diff --git a/linden/indra/llrender/llrender.h b/linden/indra/llrender/llrender.h
index 15360a3..8c648f3 100644
--- a/linden/indra/llrender/llrender.h
+++ b/linden/indra/llrender/llrender.h
@@ -37,14 +37,39 @@
37#ifndef LL_LLGLRENDER_H 37#ifndef LL_LLGLRENDER_H
38#define LL_LLGLRENDER_H 38#define LL_LLGLRENDER_H
39 39
40#include "stdtypes.h" 40//#include "linden_common.h"
41#include "llgltypes.h" 41
42#include "v2math.h"
43#include "v3math.h"
44#include "v4coloru.h"
45#include "llstrider.h"
46#include "llmemory.h"
42#include "llglheaders.h" 47#include "llglheaders.h"
43#include "llvertexbuffer.h" 48
49class LLVertexBuffer;
50class LLCubeMap;
51class LLImageGL;
52class LLRenderTarget;
44 53
45class LLTexUnit 54class LLTexUnit
46{ 55{
56 friend class LLRender;
47public: 57public:
58 typedef enum
59 {
60 TT_TEXTURE = 0, // Standard 2D Texture
61 TT_RECT_TEXTURE, // Non power of 2 texture
62 TT_CUBE_MAP, // 6-sided cube map texture
63 TT_NONE // No texture type is currently enabled
64 } eTextureType;
65
66 typedef enum
67 {
68 TAM_WRAP = 0, // Standard 2D Texture
69 TAM_MIRROR, // Non power of 2 texture
70 TAM_CLAMP // No texture type is currently enabled
71 } eTextureAddressMode;
72
48 typedef enum 73 typedef enum
49 { 74 {
50 TB_REPLACE = 0, 75 TB_REPLACE = 0,
@@ -93,15 +118,36 @@ public:
93 TBS_ONE_MINUS_CONST_ALPHA 118 TBS_ONE_MINUS_CONST_ALPHA
94 } eTextureBlendSrc; 119 } eTextureBlendSrc;
95 120
96 LLTexUnit(U32 index); 121 LLTexUnit(S32 index);
97 U32 getIndex(void); 122
123 // Refreshes renderer state of the texture unit to the cached values
124 // Needed when the render context has changed and invalidated the current state
125 void refreshState(void);
126
127 // returns the index of this texture unit
128 S32 getIndex(void) const { return mIndex; }
98 129
99 void enable(void); 130 // Sets this tex unit to be the currently active one
100 void disable(void); 131 void activate(void);
101 void activate(void); 132
133 // Enables this texture unit for the given texture type (automatically disables any previously enabled texture type)
134 void enable(eTextureType type);
135 // Disables the current texture unit
136 void disable(void);
137
138 // Binds the LLImageGL to this texture unit (automatically enables the unit for the LLImageGL's texture type)
139 bool bind(const LLImageGL* texture);
140 // Binds a cubemap to this texture unit (automatically enables the texture unit for cubemaps)
141 bool bind(LLCubeMap* cubeMap);
142 // Binds a render target to this texture unit (automatically enables the texture unit for the RT's texture type)
143 bool bind(LLRenderTarget * renderTarget, bool bindDepth = false);
144 // Manually binds a texture to the texture unit (automatically enables the tex unit for the given texture type)
145 bool bindManual(eTextureType type, U32 texture);
146
147 // Unbinds the currently bound texture of the given type (only if there's a texture of the given type currently bound)
148 void unbind(eTextureType type);
102 149
103 void bindTexture(const LLImageGL* texture); 150 void setTextureAddressMode(eTextureAddressMode mode);
104 void unbindTexture(void);
105 151
106 void setTextureBlendType(eTextureBlendType type); 152 void setTextureBlendType(eTextureBlendType type);
107 153
@@ -110,11 +156,14 @@ public:
110 156
111 // NOTE: If *_COLOR enums are passed to src1 or src2, the corresponding *_ALPHA enum will be used instead. 157 // NOTE: If *_COLOR enums are passed to src1 or src2, the corresponding *_ALPHA enum will be used instead.
112 inline void setTextureAlphaBlend(eTextureBlendOp op, eTextureBlendSrc src1, eTextureBlendSrc src2 = TBS_PREV_ALPHA) 158 inline void setTextureAlphaBlend(eTextureBlendOp op, eTextureBlendSrc src1, eTextureBlendSrc src2 = TBS_PREV_ALPHA)
113 { setTextureCombiner(op, src1, src2, true); } 159 { setTextureCombiner(op, src1, src2, true); }
114 160
115private: 161 static U32 getInternalType(eTextureType type);
116 U32 mIndex; 162
117 bool mIsEnabled; 163protected:
164 S32 mIndex;
165 U32 mCurrTexture;
166 eTextureType mCurrTexType;
118 eTextureBlendType mCurrBlendType; 167 eTextureBlendType mCurrBlendType;
119 eTextureBlendOp mCurrColorOp; 168 eTextureBlendOp mCurrColorOp;
120 eTextureBlendSrc mCurrColorSrc1; 169 eTextureBlendSrc mCurrColorSrc1;
@@ -137,6 +186,19 @@ class LLRender
137{ 186{
138 friend class LLTexUnit; 187 friend class LLTexUnit;
139public: 188public:
189
190 typedef enum {
191 TRIANGLES = 0,
192 TRIANGLE_STRIP,
193 TRIANGLE_FAN,
194 POINTS,
195 LINES,
196 LINE_STRIP,
197 QUADS,
198 LINE_LOOP,
199 NUM_MODES
200 } eGeomModes;
201
140 typedef enum 202 typedef enum
141 { 203 {
142 CF_NEVER = 0, 204 CF_NEVER = 0,
@@ -178,6 +240,10 @@ public:
178 ~LLRender(); 240 ~LLRender();
179 void shutdown(); 241 void shutdown();
180 242
243 // Refreshes renderer state to the cached values
244 // Needed when the render context has changed and invalidated the current state
245 void refreshState(void);
246
181 void translatef(const GLfloat& x, const GLfloat& y, const GLfloat& z); 247 void translatef(const GLfloat& x, const GLfloat& y, const GLfloat& z);
182 void scalef(const GLfloat& x, const GLfloat& y, const GLfloat& z); 248 void scalef(const GLfloat& x, const GLfloat& y, const GLfloat& z);
183 void pushMatrix(); 249 void pushMatrix();
@@ -214,7 +280,13 @@ public:
214 280
215 LLTexUnit* getTexUnit(U32 index); 281 LLTexUnit* getTexUnit(U32 index);
216 282
217 typedef struct Vertex 283 U32 getCurrentTexUnitIndex(void) const { return mCurrTextureUnitIndex; }
284
285 bool verifyTexUnitActive(U32 unitToVerify);
286
287 void debugTexUnits(void);
288
289 struct Vertex
218 { 290 {
219 GLfloat v[3]; 291 GLfloat v[3];
220 GLubyte c[4]; 292 GLubyte c[4];
@@ -224,14 +296,20 @@ public:
224public: 296public:
225 297
226private: 298private:
227 U32 mCount; 299 bool mDirty;
228 U32 mMode; 300 U32 mCount;
229 U32 mCurrTextureUnitIndex; 301 U32 mMode;
230 LLPointer<LLVertexBuffer> mBuffer; 302 U32 mCurrTextureUnitIndex;
231 LLStrider<LLVector3> mVerticesp; 303 bool mCurrColorMask[4];
232 LLStrider<LLVector2> mTexcoordsp; 304 eCompareFunc mCurrAlphaFunc;
233 LLStrider<LLColor4U> mColorsp; 305 F32 mCurrAlphaFuncVal;
234 std::vector<LLTexUnit*> mTexUnits; 306
307 LLPointer<LLVertexBuffer> mBuffer;
308 LLStrider<LLVector3> mVerticesp;
309 LLStrider<LLVector2> mTexcoordsp;
310 LLStrider<LLColor4U> mColorsp;
311 std::vector<LLTexUnit*> mTexUnits;
312 LLTexUnit* mDummyTexUnit;
235}; 313};
236 314
237extern F64 gGLModelView[16]; 315extern F64 gGLModelView[16];
diff --git a/linden/indra/llrender/llrendertarget.cpp b/linden/indra/llrender/llrendertarget.cpp
index e18ec56..9d693a7 100644
--- a/linden/indra/llrender/llrendertarget.cpp
+++ b/linden/indra/llrender/llrendertarget.cpp
@@ -47,7 +47,7 @@ LLRenderTarget::LLRenderTarget() :
47 mStencil(0), 47 mStencil(0),
48 mUseDepth(FALSE), 48 mUseDepth(FALSE),
49 mRenderDepth(FALSE), 49 mRenderDepth(FALSE),
50 mUsage(GL_TEXTURE_2D) 50 mUsage(LLTexUnit::TT_TEXTURE)
51{ 51{
52} 52}
53 53
@@ -56,7 +56,7 @@ LLRenderTarget::~LLRenderTarget()
56 release(); 56 release();
57} 57}
58 58
59void LLRenderTarget::allocate(U32 resx, U32 resy, U32 color_fmt, BOOL depth, U32 usage, BOOL use_fbo) 59void LLRenderTarget::allocate(U32 resx, U32 resy, U32 color_fmt, BOOL depth, LLTexUnit::eTextureType usage, BOOL use_fbo)
60{ 60{
61 stop_glerror(); 61 stop_glerror();
62 mResX = resx; 62 mResX = resx;
@@ -67,22 +67,22 @@ void LLRenderTarget::allocate(U32 resx, U32 resy, U32 color_fmt, BOOL depth, U32
67 release(); 67 release();
68 68
69 glGenTextures(1, (GLuint *) &mTex); 69 glGenTextures(1, (GLuint *) &mTex);
70 glBindTexture(mUsage, mTex); 70 gGL.getTexUnit(0)->bindManual(mUsage, mTex);
71 glTexImage2D(mUsage, 0, color_fmt, mResX, mResY, 0, color_fmt, GL_UNSIGNED_BYTE, NULL); 71 glTexImage2D(LLTexUnit::getInternalType(mUsage), 0, color_fmt, mResX, mResY, 0, color_fmt, GL_UNSIGNED_BYTE, NULL);
72 72
73 glTexParameteri(mUsage, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 73 glTexParameteri(LLTexUnit::getInternalType(mUsage), GL_TEXTURE_MAG_FILTER, GL_LINEAR);
74 glTexParameteri(mUsage, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 74 glTexParameteri(LLTexUnit::getInternalType(mUsage), GL_TEXTURE_MIN_FILTER, GL_LINEAR);
75 75
76 if (mUsage != GL_TEXTURE_RECTANGLE_ARB) 76 if (mUsage != LLTexUnit::TT_RECT_TEXTURE)
77 { 77 {
78 glTexParameteri(mUsage, GL_TEXTURE_WRAP_S, GL_MIRRORED_REPEAT); 78 glTexParameteri(LLTexUnit::getInternalType(mUsage), GL_TEXTURE_WRAP_S, GL_MIRRORED_REPEAT);
79 glTexParameteri(mUsage, GL_TEXTURE_WRAP_T, GL_MIRRORED_REPEAT); 79 glTexParameteri(LLTexUnit::getInternalType(mUsage), GL_TEXTURE_WRAP_T, GL_MIRRORED_REPEAT);
80 } 80 }
81 else 81 else
82 { 82 {
83 // ATI doesn't support mirrored repeat for rectangular textures. 83 // ATI doesn't support mirrored repeat for rectangular textures.
84 glTexParameteri(mUsage, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 84 glTexParameteri(LLTexUnit::getInternalType(mUsage), GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
85 glTexParameteri(mUsage, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 85 glTexParameteri(LLTexUnit::getInternalType(mUsage), GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
86 } 86 }
87 87
88 stop_glerror(); 88 stop_glerror();
@@ -107,14 +107,14 @@ void LLRenderTarget::allocate(U32 resx, U32 resy, U32 color_fmt, BOOL depth, U32
107 107
108 if (mDepth) 108 if (mDepth)
109 { 109 {
110 glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, mUsage, mDepth, 0); 110 glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, LLTexUnit::getInternalType(mUsage), mDepth, 0);
111 stop_glerror(); 111 stop_glerror();
112 glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_STENCIL_ATTACHMENT_EXT, mUsage, mDepth, 0); 112 glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_STENCIL_ATTACHMENT_EXT, LLTexUnit::getInternalType(mUsage), mDepth, 0);
113 stop_glerror(); 113 stop_glerror();
114 } 114 }
115 115
116 glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, 116 glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT,
117 mUsage, mTex, 0); 117 LLTexUnit::getInternalType(mUsage), mTex, 0);
118 stop_glerror(); 118 stop_glerror();
119 119
120 glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); 120 glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
@@ -125,10 +125,11 @@ void LLRenderTarget::allocate(U32 resx, U32 resy, U32 color_fmt, BOOL depth, U32
125void LLRenderTarget::allocateDepth() 125void LLRenderTarget::allocateDepth()
126{ 126{
127 glGenTextures(1, (GLuint *) &mDepth); 127 glGenTextures(1, (GLuint *) &mDepth);
128 glBindTexture(mUsage, mDepth); 128 gGL.getTexUnit(0)->bindManual(mUsage, mDepth);
129 glTexParameteri(mUsage, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 129 U32 internal_type = LLTexUnit::getInternalType(mUsage);
130 glTexParameteri(mUsage, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 130 glTexParameteri(internal_type, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
131 glTexImage2D(mUsage, 0, GL_DEPTH24_STENCIL8_EXT, mResX, mResY, 0, GL_DEPTH_STENCIL_EXT, GL_UNSIGNED_INT_24_8_EXT, NULL); 131 glTexParameteri(internal_type, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
132 glTexImage2D(internal_type, 0, GL_DEPTH24_STENCIL8_EXT, mResX, mResY, 0, GL_DEPTH_STENCIL_EXT, GL_UNSIGNED_INT_24_8_EXT, NULL);
132} 133}
133 134
134void LLRenderTarget::release() 135void LLRenderTarget::release()
@@ -191,24 +192,13 @@ void LLRenderTarget::clear()
191 } 192 }
192} 193}
193 194
194void LLRenderTarget::bindTexture()
195{
196 glBindTexture(mUsage, mTex);
197}
198
199void LLRenderTarget::bindDepth()
200{
201 glBindTexture(mUsage, mDepth);
202}
203
204
205void LLRenderTarget::flush(BOOL fetch_depth) 195void LLRenderTarget::flush(BOOL fetch_depth)
206{ 196{
207 gGL.flush(); 197 gGL.flush();
208 if (!mFBO) 198 if (!mFBO)
209 { 199 {
210 bindTexture(); 200 gGL.getTexUnit(0)->bind(this);
211 glCopyTexSubImage2D(mUsage, 0, 0, 0, 0, 0, mResX, mResY); 201 glCopyTexSubImage2D(LLTexUnit::getInternalType(mUsage), 0, 0, 0, 0, 0, mResX, mResY);
212 202
213 if (fetch_depth) 203 if (fetch_depth)
214 { 204 {
@@ -217,8 +207,8 @@ void LLRenderTarget::flush(BOOL fetch_depth)
217 allocateDepth(); 207 allocateDepth();
218 } 208 }
219 209
220 bindDepth(); 210 gGL.getTexUnit(0)->bind(this, true);
221 glCopyTexImage2D(mUsage, 0, GL_DEPTH24_STENCIL8_EXT, 0, 0, mResX, mResY, 0); 211 glCopyTexImage2D(LLTexUnit::getInternalType(mUsage), 0, GL_DEPTH24_STENCIL8_EXT, 0, 0, mResX, mResY, 0);
222 } 212 }
223 } 213 }
224 else 214 else
diff --git a/linden/indra/llrender/llrendertarget.h b/linden/indra/llrender/llrendertarget.h
index 5e3c4d9..65bab8b 100644
--- a/linden/indra/llrender/llrendertarget.h
+++ b/linden/indra/llrender/llrendertarget.h
@@ -33,6 +33,7 @@
33#define LL_LLRENDERTARGET_H 33#define LL_LLRENDERTARGET_H
34 34
35#include "llgl.h" 35#include "llgl.h"
36#include "llrender.h"
36 37
37/* 38/*
38 SAMPLE USAGE: 39 SAMPLE USAGE:
@@ -53,7 +54,7 @@
53 ... 54 ...
54 55
55 //use target as a texture 56 //use target as a texture
56 target.bindTexture(); 57 gGL.getTexUnit(INDEX)->bind(&target);
57 ... <issue drawing commands> ... 58 ... <issue drawing commands> ...
58 59
59*/ 60*/
@@ -71,7 +72,7 @@ public:
71 //allocate resources for rendering 72 //allocate resources for rendering
72 //must be called before use 73 //must be called before use
73 //multiple calls will release previously allocated resources 74 //multiple calls will release previously allocated resources
74 void allocate(U32 resx, U32 resy, U32 color_fmt, BOOL depth, U32 usage = GL_TEXTURE_2D, BOOL use_fbo = FALSE); 75 void allocate(U32 resx, U32 resy, U32 color_fmt, BOOL depth, LLTexUnit::eTextureType usage = LLTexUnit::TT_TEXTURE, BOOL use_fbo = FALSE);
75 76
76 //allocate a depth texture 77 //allocate a depth texture
77 void allocateDepth(); 78 void allocateDepth();
@@ -100,11 +101,11 @@ public:
100 //get Y resolution 101 //get Y resolution
101 U32 getHeight() const { return mResY; } 102 U32 getHeight() const { return mResY; }
102 103
103 //bind results of render for sampling 104 LLTexUnit::eTextureType getUsage(void) const { return mUsage; }
104 void bindTexture();
105 105
106 //bind results of render for sampling depth buffer 106 U32 getTexture(void) const { return mTex; }
107 void bindDepth(); 107
108 U32 getDepth(void) const { return mDepth; }
108 109
109 //flush rendering operations 110 //flush rendering operations
110 //must be called when rendering is complete 111 //must be called when rendering is complete
@@ -128,7 +129,7 @@ private:
128 U32 mStencil; 129 U32 mStencil;
129 BOOL mUseDepth; 130 BOOL mUseDepth;
130 BOOL mRenderDepth; 131 BOOL mRenderDepth;
131 U32 mUsage; 132 LLTexUnit::eTextureType mUsage;
132 133
133}; 134};
134 135
diff --git a/linden/indra/llrender/llshadermgr.cpp b/linden/indra/llrender/llshadermgr.cpp
index 4416775..d884c15 100644
--- a/linden/indra/llrender/llshadermgr.cpp
+++ b/linden/indra/llrender/llshadermgr.cpp
@@ -307,7 +307,7 @@ void LLShaderMgr::dumpObjectLog(GLhandleARB ret, BOOL warns)
307 { 307 {
308 LL_DEBUGS("ShaderLoading") << log << LL_ENDL; 308 LL_DEBUGS("ShaderLoading") << log << LL_ENDL;
309 } 309 }
310} 310 }
311} 311}
312 312
313GLhandleARB LLShaderMgr::loadShaderFile(const std::string& filename, S32 & shader_level, GLenum type) 313GLhandleARB LLShaderMgr::loadShaderFile(const std::string& filename, S32 & shader_level, GLenum type)
diff --git a/linden/indra/llrender/llvertexbuffer.cpp b/linden/indra/llrender/llvertexbuffer.cpp
index 547663b..465c4ca 100644
--- a/linden/indra/llrender/llvertexbuffer.cpp
+++ b/linden/indra/llrender/llvertexbuffer.cpp
@@ -76,7 +76,7 @@ S32 LLVertexBuffer::sTypeOffsets[LLVertexBuffer::TYPE_MAX] =
76 sizeof(LLVector4), // TYPE_CLOTHWEIGHT, 76 sizeof(LLVector4), // TYPE_CLOTHWEIGHT,
77}; 77};
78 78
79U32 LLVertexBuffer::sGLMode[LLVertexBuffer::NUM_MODES] = 79U32 LLVertexBuffer::sGLMode[LLRender::NUM_MODES] =
80{ 80{
81 GL_TRIANGLES, 81 GL_TRIANGLES,
82 GL_TRIANGLE_STRIP, 82 GL_TRIANGLE_STRIP,
@@ -187,7 +187,7 @@ void LLVertexBuffer::drawRange(U32 mode, U32 start, U32 end, U32 count, U32 indi
187 llerrs << "Wrong vertex buffer bound." << llendl; 187 llerrs << "Wrong vertex buffer bound." << llendl;
188 } 188 }
189 189
190 if (mode > NUM_MODES) 190 if (mode > LLRender::NUM_MODES)
191 { 191 {
192 llerrs << "Invalid draw mode: " << mode << llendl; 192 llerrs << "Invalid draw mode: " << mode << llendl;
193 return; 193 return;
@@ -216,7 +216,7 @@ void LLVertexBuffer::draw(U32 mode, U32 count, U32 indices_offset) const
216 llerrs << "Wrong vertex buffer bound." << llendl; 216 llerrs << "Wrong vertex buffer bound." << llendl;
217 } 217 }
218 218
219 if (mode > NUM_MODES) 219 if (mode > LLRender::NUM_MODES)
220 { 220 {
221 llerrs << "Invalid draw mode: " << mode << llendl; 221 llerrs << "Invalid draw mode: " << mode << llendl;
222 return; 222 return;
@@ -240,7 +240,7 @@ void LLVertexBuffer::drawArrays(U32 mode, U32 first, U32 count) const
240 llerrs << "Wrong vertex buffer bound." << llendl; 240 llerrs << "Wrong vertex buffer bound." << llendl;
241 } 241 }
242 242
243 if (mode > NUM_MODES) 243 if (mode > LLRender::NUM_MODES)
244 { 244 {
245 llerrs << "Invalid draw mode: " << mode << llendl; 245 llerrs << "Invalid draw mode: " << mode << llendl;
246 return; 246 return;
diff --git a/linden/indra/llrender/llvertexbuffer.h b/linden/indra/llrender/llvertexbuffer.h
index 8edcf69..a97c74e 100644
--- a/linden/indra/llrender/llvertexbuffer.h
+++ b/linden/indra/llrender/llvertexbuffer.h
@@ -39,6 +39,7 @@
39#include "v4coloru.h" 39#include "v4coloru.h"
40#include "llstrider.h" 40#include "llstrider.h"
41#include "llmemory.h" 41#include "llmemory.h"
42#include "llrender.h"
42#include <set> 43#include <set>
43#include <vector> 44#include <vector>
44#include <list> 45#include <list>
@@ -123,19 +124,8 @@ public:
123 MAP_UNMAPPED = 0x8000 // Indicates that buffer has been logically un-mapped 124 MAP_UNMAPPED = 0x8000 // Indicates that buffer has been logically un-mapped
124 }; 125 };
125 126
126 enum {
127 TRIANGLES = 0,
128 TRIANGLE_STRIP,
129 TRIANGLE_FAN,
130 POINTS,
131 LINES,
132 LINE_STRIP,
133 QUADS,
134 LINE_LOOP,
135 NUM_MODES
136 };
137protected: 127protected:
138 friend class LLGLImmediate; 128 friend class LLRender;
139 129
140 virtual ~LLVertexBuffer(); // use unref() 130 virtual ~LLVertexBuffer(); // use unref()
141 131
@@ -255,7 +245,7 @@ public:
255 245
256 static BOOL sEnableVBOs; 246 static BOOL sEnableVBOs;
257 static S32 sTypeOffsets[TYPE_MAX]; 247 static S32 sTypeOffsets[TYPE_MAX];
258 static U32 sGLMode[NUM_MODES]; 248 static U32 sGLMode[LLRender::NUM_MODES];
259 static U32 sGLRenderBuffer; 249 static U32 sGLRenderBuffer;
260 static U32 sGLRenderIndices; 250 static U32 sGLRenderIndices;
261 static BOOL sVBOActive; 251 static BOOL sVBOActive;
diff --git a/linden/indra/llui/llfloater.cpp b/linden/indra/llui/llfloater.cpp
index 9f8cd65..047342f 100644
--- a/linden/indra/llui/llfloater.cpp
+++ b/linden/indra/llui/llfloater.cpp
@@ -127,6 +127,7 @@ LLFloaterView* gFloaterView = NULL;
127 127
128LLFloater::LLFloater() : 128LLFloater::LLFloater() :
129 //FIXME: we should initialize *all* member variables here 129 //FIXME: we should initialize *all* member variables here
130 LLPanel(), mAutoFocus(TRUE),
130 mResizable(FALSE), 131 mResizable(FALSE),
131 mDragOnLeft(FALSE), 132 mDragOnLeft(FALSE),
132 mMinWidth(0), 133 mMinWidth(0),
@@ -139,6 +140,11 @@ LLFloater::LLFloater() :
139 mButtonsEnabled[i] = FALSE; 140 mButtonsEnabled[i] = FALSE;
140 mButtons[i] = NULL; 141 mButtons[i] = NULL;
141 } 142 }
143 for (S32 i = 0; i < 4; i++)
144 {
145 mResizeBar[i] = NULL;
146 mResizeHandle[i] = NULL;
147 }
142 mDragHandle = NULL; 148 mDragHandle = NULL;
143 mHandle.bind(this); 149 mHandle.bind(this);
144} 150}
@@ -151,6 +157,11 @@ LLFloater::LLFloater(const std::string& name)
151 mButtonsEnabled[i] = FALSE; 157 mButtonsEnabled[i] = FALSE;
152 mButtons[i] = NULL; 158 mButtons[i] = NULL;
153 } 159 }
160 for (S32 i = 0; i < 4; i++)
161 {
162 mResizeBar[i] = NULL;
163 mResizeHandle[i] = NULL;
164 }
154 std::string title; // null string 165 std::string title; // null string
155 initFloater(title, FALSE, DEFAULT_MIN_WIDTH, DEFAULT_MIN_HEIGHT, FALSE, TRUE, TRUE); // defaults 166 initFloater(title, FALSE, DEFAULT_MIN_WIDTH, DEFAULT_MIN_HEIGHT, FALSE, TRUE, TRUE); // defaults
156} 167}
@@ -171,6 +182,11 @@ LLFloater::LLFloater(const std::string& name, const LLRect& rect, const std::str
171 mButtonsEnabled[i] = FALSE; 182 mButtonsEnabled[i] = FALSE;
172 mButtons[i] = NULL; 183 mButtons[i] = NULL;
173 } 184 }
185 for (S32 i = 0; i < 4; i++)
186 {
187 mResizeBar[i] = NULL;
188 mResizeHandle[i] = NULL;
189 }
174 initFloater( title, resizable, min_width, min_height, drag_on_left, minimizable, close_btn); 190 initFloater( title, resizable, min_width, min_height, drag_on_left, minimizable, close_btn);
175} 191}
176 192
@@ -189,6 +205,11 @@ LLFloater::LLFloater(const std::string& name, const std::string& rect_control, c
189 mButtonsEnabled[i] = FALSE; 205 mButtonsEnabled[i] = FALSE;
190 mButtons[i] = NULL; 206 mButtons[i] = NULL;
191 } 207 }
208 for (S32 i = 0; i < 4; i++)
209 {
210 mResizeBar[i] = NULL;
211 mResizeHandle[i] = NULL;
212 }
192 initFloater( title, resizable, min_width, min_height, drag_on_left, minimizable, close_btn); 213 initFloater( title, resizable, min_width, min_height, drag_on_left, minimizable, close_btn);
193} 214}
194 215
@@ -1580,6 +1601,7 @@ void LLFloater::updateButtons()
1580 S32 button_count = 0; 1601 S32 button_count = 0;
1581 for (S32 i = 0; i < BUTTON_COUNT; i++) 1602 for (S32 i = 0; i < BUTTON_COUNT; i++)
1582 { 1603 {
1604 if(!mButtons[i]) continue;
1583 mButtons[i]->setEnabled(mButtonsEnabled[i]); 1605 mButtons[i]->setEnabled(mButtonsEnabled[i]);
1584 1606
1585 if (mButtonsEnabled[i] 1607 if (mButtonsEnabled[i]
diff --git a/linden/indra/llui/lllineeditor.cpp b/linden/indra/llui/lllineeditor.cpp
index 12d1929..a0af463 100644
--- a/linden/indra/llui/lllineeditor.cpp
+++ b/linden/indra/llui/lllineeditor.cpp
@@ -35,6 +35,7 @@
35 35
36#include "lllineeditor.h" 36#include "lllineeditor.h"
37 37
38#include "lltexteditor.h"
38#include "audioengine.h" 39#include "audioengine.h"
39#include "llmath.h" 40#include "llmath.h"
40#include "llfontgl.h" 41#include "llfontgl.h"
@@ -450,19 +451,19 @@ BOOL LLLineEditor::handleDoubleClick(S32 x, S32 y, MASK mask)
450 BOOL doSelectAll = TRUE; 451 BOOL doSelectAll = TRUE;
451 452
452 // Select the word we're on 453 // Select the word we're on
453 if( isPartOfWord( wtext[mCursorPos] ) ) 454 if( LLTextEditor::isPartOfWord( wtext[mCursorPos] ) )
454 { 455 {
455 S32 old_selection_start = mLastSelectionStart; 456 S32 old_selection_start = mLastSelectionStart;
456 S32 old_selection_end = mLastSelectionEnd; 457 S32 old_selection_end = mLastSelectionEnd;
457 458
458 // Select word the cursor is over 459 // Select word the cursor is over
459 while ((mCursorPos > 0) && isPartOfWord( wtext[mCursorPos-1] )) 460 while ((mCursorPos > 0) && LLTextEditor::isPartOfWord( wtext[mCursorPos-1] ))
460 { // Find the start of the word 461 { // Find the start of the word
461 mCursorPos--; 462 mCursorPos--;
462 } 463 }
463 startSelection(); 464 startSelection();
464 465
465 while ((mCursorPos < (S32)wtext.length()) && isPartOfWord( wtext[mCursorPos] ) ) 466 while ((mCursorPos < (S32)wtext.length()) && LLTextEditor::isPartOfWord( wtext[mCursorPos] ) )
466 { // Find the end of the word 467 { // Find the end of the word
467 mCursorPos++; 468 mCursorPos++;
468 } 469 }
@@ -764,7 +765,7 @@ S32 LLLineEditor::prevWordPos(S32 cursorPos) const
764 { 765 {
765 cursorPos--; 766 cursorPos--;
766 } 767 }
767 while( (cursorPos > 0) && isPartOfWord( wtext[cursorPos-1] ) ) 768 while( (cursorPos > 0) && LLTextEditor::isPartOfWord( wtext[cursorPos-1] ) )
768 { 769 {
769 cursorPos--; 770 cursorPos--;
770 } 771 }
@@ -774,7 +775,7 @@ S32 LLLineEditor::prevWordPos(S32 cursorPos) const
774S32 LLLineEditor::nextWordPos(S32 cursorPos) const 775S32 LLLineEditor::nextWordPos(S32 cursorPos) const
775{ 776{
776 const LLWString& wtext = mText.getWString(); 777 const LLWString& wtext = mText.getWString();
777 while( (cursorPos < getLength()) && isPartOfWord( wtext[cursorPos] ) ) 778 while( (cursorPos < getLength()) && LLTextEditor::isPartOfWord( wtext[cursorPos] ) )
778 { 779 {
779 cursorPos++; 780 cursorPos++;
780 } 781 }
@@ -1422,7 +1423,7 @@ void LLLineEditor::draw()
1422#else // the old programmer art. 1423#else // the old programmer art.
1423 // drawing solids requires texturing be disabled 1424 // drawing solids requires texturing be disabled
1424 { 1425 {
1425 LLGLSNoTexture no_texture; 1426 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
1426 // draw background for text 1427 // draw background for text
1427 if( !mReadOnly ) 1428 if( !mReadOnly )
1428 { 1429 {
@@ -1817,9 +1818,6 @@ BOOL LLLineEditor::prevalidateFloat(const LLWString &str)
1817 return success; 1818 return success;
1818} 1819}
1819 1820
1820//static
1821BOOL LLLineEditor::isPartOfWord(llwchar c) { return (c == '_') || isalnum(c); }
1822
1823// static 1821// static
1824BOOL LLLineEditor::postvalidateFloat(const std::string &str) 1822BOOL LLLineEditor::postvalidateFloat(const std::string &str)
1825{ 1823{
@@ -1993,7 +1991,7 @@ BOOL LLLineEditor::prevalidateAlphaNum(const LLWString &str)
1993 if(len == 0) return rv; 1991 if(len == 0) return rv;
1994 while(len--) 1992 while(len--)
1995 { 1993 {
1996 if( !isalnum(str[len]) ) 1994 if( !LLStringOps::isAlnum((char)str[len]) )
1997 { 1995 {
1998 rv = FALSE; 1996 rv = FALSE;
1999 break; 1997 break;
@@ -2012,7 +2010,7 @@ BOOL LLLineEditor::prevalidateAlphaNumSpace(const LLWString &str)
2012 if(len == 0) return rv; 2010 if(len == 0) return rv;
2013 while(len--) 2011 while(len--)
2014 { 2012 {
2015 if(!(isalnum(str[len]) || (' ' == str[len]))) 2013 if(!(LLStringOps::isAlnum((char)str[len]) || (' ' == str[len])))
2016 { 2014 {
2017 rv = FALSE; 2015 rv = FALSE;
2018 break; 2016 break;
@@ -2034,7 +2032,7 @@ BOOL LLLineEditor::prevalidatePrintableNotPipe(const LLWString &str)
2034 rv = FALSE; 2032 rv = FALSE;
2035 break; 2033 break;
2036 } 2034 }
2037 if(!((' ' == str[len]) || isalnum(str[len]) || ispunct(str[len]))) 2035 if(!((' ' == str[len]) || LLStringOps::isAlnum((char)str[len]) || LLStringOps::isPunct((char)str[len])))
2038 { 2036 {
2039 rv = FALSE; 2037 rv = FALSE;
2040 break; 2038 break;
@@ -2052,12 +2050,13 @@ BOOL LLLineEditor::prevalidatePrintableNoSpace(const LLWString &str)
2052 if(len == 0) return rv; 2050 if(len == 0) return rv;
2053 while(len--) 2051 while(len--)
2054 { 2052 {
2055 if(iswspace(str[len])) 2053 if(LLStringOps::isSpace(str[len]))
2056 { 2054 {
2057 rv = FALSE; 2055 rv = FALSE;
2058 break; 2056 break;
2059 } 2057 }
2060 if( !(isalnum(str[len]) || ispunct(str[len]) ) ) 2058 if( !(LLStringOps::isAlnum((char)str[len]) ||
2059 LLStringOps::isPunct((char)str[len]) ) )
2061 { 2060 {
2062 rv = FALSE; 2061 rv = FALSE;
2063 break; 2062 break;
@@ -2282,7 +2281,7 @@ LLView* LLLineEditor::fromXML(LLXMLNodePtr node, LLView *parent, LLUICtrlFactory
2282} 2281}
2283 2282
2284//static 2283//static
2285void LLLineEditor::cleanupClass() 2284void LLLineEditor::cleanupLineEditor()
2286{ 2285{
2287 sImage = NULL; 2286 sImage = NULL;
2288} 2287}
diff --git a/linden/indra/llui/lllineeditor.h b/linden/indra/llui/lllineeditor.h
index 09a240b..bc9e406 100644
--- a/linden/indra/llui/lllineeditor.h
+++ b/linden/indra/llui/lllineeditor.h
@@ -82,7 +82,7 @@ public:
82 virtual LLXMLNodePtr getXML(bool save_children = true) const; 82 virtual LLXMLNodePtr getXML(bool save_children = true) const;
83 void setColorParameters(LLXMLNodePtr node); 83 void setColorParameters(LLXMLNodePtr node);
84 static LLView* fromXML(LLXMLNodePtr node, LLView *parent, LLUICtrlFactory *factory); 84 static LLView* fromXML(LLXMLNodePtr node, LLView *parent, LLUICtrlFactory *factory);
85 static void cleanupClass(); 85 static void cleanupLineEditor();
86 86
87 // mousehandler overrides 87 // mousehandler overrides
88 /*virtual*/ BOOL handleMouseDown(S32 x, S32 y, MASK mask); 88 /*virtual*/ BOOL handleMouseDown(S32 x, S32 y, MASK mask);
@@ -194,7 +194,6 @@ public:
194 void setMaxTextLength(S32 max_text_length); 194 void setMaxTextLength(S32 max_text_length);
195 void setTextPadding(S32 left, S32 right); // Used to specify room for children before or after text. 195 void setTextPadding(S32 left, S32 right); // Used to specify room for children before or after text.
196 196
197 static BOOL isPartOfWord(llwchar c);
198 // Prevalidation controls which keystrokes can affect the editor 197 // Prevalidation controls which keystrokes can affect the editor
199 void setPrevalidate( BOOL (*func)(const LLWString &) ); 198 void setPrevalidate( BOOL (*func)(const LLWString &) );
200 static BOOL prevalidateFloat(const LLWString &str ); 199 static BOOL prevalidateFloat(const LLWString &str );
diff --git a/linden/indra/llui/llmenugl.cpp b/linden/indra/llui/llmenugl.cpp
index 24cc47e..4766267 100644
--- a/linden/indra/llui/llmenugl.cpp
+++ b/linden/indra/llui/llmenugl.cpp
@@ -1309,6 +1309,7 @@ void LLMenuItemBranchGL::openMenu()
1309 } 1309 }
1310 mBranch->translate( delta_x, delta_y ); 1310 mBranch->translate( delta_x, delta_y );
1311 mBranch->setVisible( TRUE ); 1311 mBranch->setVisible( TRUE );
1312 mBranch->getParent()->sendChildToFront(mBranch);
1312 } 1313 }
1313} 1314}
1314 1315
@@ -1427,6 +1428,7 @@ void LLMenuItemBranchDownGL::openMenu( void )
1427 1428
1428 setHighlight(TRUE); 1429 setHighlight(TRUE);
1429 branch->setVisible( TRUE ); 1430 branch->setVisible( TRUE );
1431 branch->getParent()->sendChildToFront(branch);
1430 } 1432 }
1431 } 1433 }
1432} 1434}
@@ -2958,6 +2960,7 @@ void LLMenuGL::showPopup(LLView* spawning_view, LLMenuGL* menu, S32 x, S32 y)
2958 } 2960 }
2959 menu->translate( delta_x, delta_y ); 2961 menu->translate( delta_x, delta_y );
2960 menu->setVisible( TRUE ); 2962 menu->setVisible( TRUE );
2963 menu->getParent()->sendChildToFront(menu);
2961} 2964}
2962 2965
2963//----------------------------------------------------------------------------- 2966//-----------------------------------------------------------------------------
diff --git a/linden/indra/llui/llmultislider.cpp b/linden/indra/llui/llmultislider.cpp
index 227cf98..11c2cba 100644
--- a/linden/indra/llui/llmultislider.cpp
+++ b/linden/indra/llui/llmultislider.cpp
@@ -431,7 +431,7 @@ void LLMultiSlider::draw()
431 // Draw background and thumb. 431 // Draw background and thumb.
432 432
433 // drawing solids requires texturing be disabled 433 // drawing solids requires texturing be disabled
434 LLGLSNoTexture no_texture; 434 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
435 435
436 LLRect rect(mDragStartThumbRect); 436 LLRect rect(mDragStartThumbRect);
437 437
diff --git a/linden/indra/llui/llscrollcontainer.cpp b/linden/indra/llui/llscrollcontainer.cpp
index 1ba2923..51face6 100644
--- a/linden/indra/llui/llscrollcontainer.cpp
+++ b/linden/indra/llui/llscrollcontainer.cpp
@@ -425,7 +425,7 @@ void LLScrollableContainerView::draw()
425 // Draw background 425 // Draw background
426 if( mIsOpaque ) 426 if( mIsOpaque )
427 { 427 {
428 LLGLSNoTexture no_texture; 428 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
429 gGL.color4fv( mBackgroundColor.mV ); 429 gGL.color4fv( mBackgroundColor.mV );
430 gl_rect_2d( mInnerRect ); 430 gl_rect_2d( mInnerRect );
431 } 431 }
diff --git a/linden/indra/llui/llscrolllistctrl.cpp b/linden/indra/llui/llscrolllistctrl.cpp
index d342378..92bcb88 100644
--- a/linden/indra/llui/llscrolllistctrl.cpp
+++ b/linden/indra/llui/llscrolllistctrl.cpp
@@ -435,7 +435,7 @@ void LLScrollListItem::draw(const LLRect& rect, const LLColor4& fg_color, const
435 // draw background rect 435 // draw background rect
436 LLRect bg_rect = rect; 436 LLRect bg_rect = rect;
437 { 437 {
438 LLGLSNoTexture no_texture; 438 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
439 gGL.color4fv(bg_color.mV); 439 gGL.color4fv(bg_color.mV);
440 gl_rect_2d( bg_rect ); 440 gl_rect_2d( bg_rect );
441 } 441 }
@@ -1758,7 +1758,7 @@ void LLScrollListCtrl::draw()
1758 // Draw background 1758 // Draw background
1759 if (mBackgroundVisible) 1759 if (mBackgroundVisible)
1760 { 1760 {
1761 LLGLSNoTexture no_texture; 1761 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
1762 gGL.color4fv( getEnabled() ? mBgWriteableColor.mV : mBgReadOnlyColor.mV ); 1762 gGL.color4fv( getEnabled() ? mBgWriteableColor.mV : mBgReadOnlyColor.mV );
1763 gl_rect_2d(background); 1763 gl_rect_2d(background);
1764 } 1764 }
diff --git a/linden/indra/llui/llslider.cpp b/linden/indra/llui/llslider.cpp
index 4cc558f..b2438af 100644
--- a/linden/indra/llui/llslider.cpp
+++ b/linden/indra/llui/llslider.cpp
@@ -253,7 +253,7 @@ void LLSlider::draw()
253 // Draw background and thumb. 253 // Draw background and thumb.
254 254
255 // drawing solids requires texturing be disabled 255 // drawing solids requires texturing be disabled
256 LLGLSNoTexture no_texture; 256 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
257 257
258 F32 opacity = getEnabled() ? 1.f : 0.3f; 258 F32 opacity = getEnabled() ? 1.f : 0.3f;
259 LLColor4 center_color = (mThumbCenterColor % opacity); 259 LLColor4 center_color = (mThumbCenterColor % opacity);
diff --git a/linden/indra/llui/lltexteditor.cpp b/linden/indra/llui/lltexteditor.cpp
index e56002f..281dbe4 100644
--- a/linden/indra/llui/lltexteditor.cpp
+++ b/linden/indra/llui/lltexteditor.cpp
@@ -260,7 +260,7 @@ LLTextEditor::LLTextEditor(
260 mIsSelecting( FALSE ), 260 mIsSelecting( FALSE ),
261 mSelectionStart( 0 ), 261 mSelectionStart( 0 ),
262 mSelectionEnd( 0 ), 262 mSelectionEnd( 0 ),
263 mScrolledToBottom( FALSE ), 263 mScrolledToBottom( TRUE ),
264 mOnScrollEndCallback( NULL ), 264 mOnScrollEndCallback( NULL ),
265 mOnScrollEndData( NULL ), 265 mOnScrollEndData( NULL ),
266 mCursorColor( LLUI::sColorsGroup->getColor( "TextCursorColor" ) ), 266 mCursorColor( LLUI::sColorsGroup->getColor( "TextCursorColor" ) ),
@@ -277,14 +277,16 @@ LLTextEditor::LLTextEditor(
277 mCommitOnFocusLost( FALSE ), 277 mCommitOnFocusLost( FALSE ),
278 mHideScrollbarForShortDocs( FALSE ), 278 mHideScrollbarForShortDocs( FALSE ),
279 mTakesNonScrollClicks( TRUE ), 279 mTakesNonScrollClicks( TRUE ),
280 mTrackBottom( TRUE ), 280 mTrackBottom( FALSE ),
281 mAllowEmbeddedItems( allow_embedded_items ), 281 mAllowEmbeddedItems( allow_embedded_items ),
282 mAcceptCallingCardNames(FALSE), 282 mAcceptCallingCardNames(FALSE),
283 mHandleEditKeysDirectly( FALSE ), 283 mHandleEditKeysDirectly( FALSE ),
284 mMouseDownX(0), 284 mMouseDownX(0),
285 mMouseDownY(0), 285 mMouseDownY(0),
286 mLastSelectionX(-1), 286 mLastSelectionX(-1),
287 mLastSelectionY(-1) 287 mLastSelectionY(-1),
288 mReflowNeeded(FALSE),
289 mScrollNeeded(FALSE)
288{ 290{
289 mSourceID.generate(); 291 mSourceID.generate();
290 292
@@ -468,6 +470,13 @@ void LLTextEditor::updateLineStartList(S32 startpos)
468 mScrollbar->setVisible(!short_doc); 470 mScrollbar->setVisible(!short_doc);
469 } 471 }
470 472
473 // if scrolled to bottom, stay at bottom
474 // unless user is editing text
475 // do this after updating page size
476 if (mScrolledToBottom && mTrackBottom && !hasFocus())
477 {
478 endOfDoc();
479 }
471} 480}
472 481
473//////////////////////////////////////////////////////////// 482////////////////////////////////////////////////////////////
@@ -511,8 +520,7 @@ void LLTextEditor::setText(const LLStringExplicit &utf8str)
511 setCursorPos(0); 520 setCursorPos(0);
512 deselect(); 521 deselect();
513 522
514 updateLineStartList(); 523 needsReflow();
515 updateScrollFromCursor();
516 524
517 resetDirty(); 525 resetDirty();
518} 526}
@@ -529,8 +537,7 @@ void LLTextEditor::setWText(const LLWString &wtext)
529 setCursorPos(0); 537 setCursorPos(0);
530 deselect(); 538 deselect();
531 539
532 updateLineStartList(); 540 needsReflow();
533 updateScrollFromCursor();
534 541
535 resetDirty(); 542 resetDirty();
536} 543}
@@ -568,8 +575,7 @@ void LLTextEditor::setWordWrap(BOOL b)
568 setCursorPos(0); 575 setCursorPos(0);
569 deselect(); 576 deselect();
570 577
571 updateLineStartList(); 578 needsReflow();
572 updateScrollFromCursor();
573} 579}
574 580
575 581
@@ -734,6 +740,7 @@ S32 LLTextEditor::getLineStart( S32 line ) const
734 { 740 {
735 return 0; 741 return 0;
736 } 742 }
743
737 line = llclamp(line, 0, num_lines-1); 744 line = llclamp(line, 0, num_lines-1);
738 S32 segidx = mLineStartList[line].mSegment; 745 S32 segidx = mLineStartList[line].mSegment;
739 S32 segoffset = mLineStartList[line].mOffset; 746 S32 segoffset = mLineStartList[line].mOffset;
@@ -781,14 +788,14 @@ void LLTextEditor::getSegmentAndOffset( S32 startpos, S32* segidxp, S32* offsetp
781 *offsetp = startpos - (*seg_iter)->getStart(); 788 *offsetp = startpos - (*seg_iter)->getStart();
782} 789}
783 790
784const LLTextSegment* LLTextEditor::getPreviousSegment() 791const LLTextSegment* LLTextEditor::getPreviousSegment() const
785{ 792{
786 // find segment index at character to left of cursor (or rightmost edge of selection) 793 // find segment index at character to left of cursor (or rightmost edge of selection)
787 S32 idx = llmax(0, getSegmentIdxAtOffset(mCursorPos) - 1); 794 S32 idx = llmax(0, getSegmentIdxAtOffset(mCursorPos) - 1);
788 return idx >= 0 ? mSegments[idx] : NULL; 795 return idx >= 0 ? mSegments[idx] : NULL;
789} 796}
790 797
791void LLTextEditor::getSelectedSegments(std::vector<const LLTextSegment*>& segments) 798void LLTextEditor::getSelectedSegments(std::vector<const LLTextSegment*>& segments) const
792{ 799{
793 S32 left = hasSelection() ? llmin(mSelectionStart, mSelectionEnd) : mCursorPos; 800 S32 left = hasSelection() ? llmin(mSelectionStart, mSelectionEnd) : mCursorPos;
794 S32 right = hasSelection() ? llmax(mSelectionStart, mSelectionEnd) : mCursorPos; 801 S32 right = hasSelection() ? llmax(mSelectionStart, mSelectionEnd) : mCursorPos;
@@ -875,13 +882,12 @@ void LLTextEditor::setCursor(S32 row, S32 column)
875 } 882 }
876 doc += column; 883 doc += column;
877 setCursorPos(doc - mWText.c_str()); 884 setCursorPos(doc - mWText.c_str());
878 updateScrollFromCursor();
879} 885}
880 886
881void LLTextEditor::setCursorPos(S32 offset) 887void LLTextEditor::setCursorPos(S32 offset)
882{ 888{
883 mCursorPos = llclamp(offset, 0, (S32)getLength()); 889 mCursorPos = llclamp(offset, 0, (S32)getLength());
884 updateScrollFromCursor(); 890 needsScroll();
885 // reset desired x cursor position 891 // reset desired x cursor position
886 mDesiredXPixel = -1; 892 mDesiredXPixel = -1;
887} 893}
@@ -1222,8 +1228,6 @@ BOOL LLTextEditor::handleHover(S32 x, S32 y, MASK mask)
1222 1228
1223 setCursorAtLocalPos( x, y, TRUE ); 1229 setCursorAtLocalPos( x, y, TRUE );
1224 mSelectionEnd = mCursorPos; 1230 mSelectionEnd = mCursorPos;
1225
1226 updateScrollFromCursor();
1227 } 1231 }
1228 1232
1229 lldebugst(LLERR_USER_INPUT) << "hover handled by " << getName() << " (active)" << llendl; 1233 lldebugst(LLERR_USER_INPUT) << "hover handled by " << getName() << " (active)" << llendl;
@@ -1317,8 +1321,6 @@ BOOL LLTextEditor::handleMouseUp(S32 x, S32 y, MASK mask)
1317 1321
1318 setCursorAtLocalPos( x, y, TRUE ); 1322 setCursorAtLocalPos( x, y, TRUE );
1319 endSelection(); 1323 endSelection();
1320
1321 updateScrollFromCursor();
1322 } 1324 }
1323 1325
1324 if( !hasSelection() ) 1326 if( !hasSelection() )
@@ -1839,8 +1841,7 @@ void LLTextEditor::cut()
1839 gClipboard.copyFromSubstring( mWText, left_pos, length, mSourceID ); 1841 gClipboard.copyFromSubstring( mWText, left_pos, length, mSourceID );
1840 deleteSelection( FALSE ); 1842 deleteSelection( FALSE );
1841 1843
1842 updateLineStartList(); 1844 needsReflow();
1843 updateScrollFromCursor();
1844} 1845}
1845 1846
1846BOOL LLTextEditor::canCopy() const 1847BOOL LLTextEditor::canCopy() const
@@ -1910,8 +1911,7 @@ void LLTextEditor::paste()
1910 setCursorPos(mCursorPos + insert(mCursorPos, clean_string, FALSE)); 1911 setCursorPos(mCursorPos + insert(mCursorPos, clean_string, FALSE));
1911 deselect(); 1912 deselect();
1912 1913
1913 updateLineStartList(); 1914 needsReflow();
1914 updateScrollFromCursor();
1915} 1915}
1916 1916
1917 1917
@@ -2235,9 +2235,9 @@ BOOL LLTextEditor::handleKeyHere(KEY key, MASK mask )
2235 2235
2236 if(text_may_have_changed) 2236 if(text_may_have_changed)
2237 { 2237 {
2238 updateLineStartList(); 2238 needsReflow();
2239 } 2239 }
2240 updateScrollFromCursor(); 2240 needsScroll();
2241 } 2241 }
2242 } 2242 }
2243 2243
@@ -2280,8 +2280,7 @@ BOOL LLTextEditor::handleUnicodeCharHere(llwchar uni_char)
2280 // Most keystrokes will make the selection box go away, but not all will. 2280 // Most keystrokes will make the selection box go away, but not all will.
2281 deselect(); 2281 deselect();
2282 2282
2283 updateLineStartList(); 2283 needsReflow();
2284 updateScrollFromCursor();
2285 } 2284 }
2286 } 2285 }
2287 2286
@@ -2339,8 +2338,7 @@ void LLTextEditor::doDelete()
2339 } 2338 }
2340 } 2339 }
2341 2340
2342 updateLineStartList(); 2341 needsReflow();
2343 updateScrollFromCursor();
2344} 2342}
2345 2343
2346//---------------------------------------------------------------------------- 2344//----------------------------------------------------------------------------
@@ -2383,8 +2381,7 @@ void LLTextEditor::undo()
2383 2381
2384 setCursorPos(pos); 2382 setCursorPos(pos);
2385 2383
2386 updateLineStartList(); 2384 needsReflow();
2387 updateScrollFromCursor();
2388} 2385}
2389 2386
2390BOOL LLTextEditor::canRedo() const 2387BOOL LLTextEditor::canRedo() const
@@ -2426,8 +2423,7 @@ void LLTextEditor::redo()
2426 2423
2427 setCursorPos(pos); 2424 setCursorPos(pos);
2428 2425
2429 updateLineStartList(); 2426 needsReflow();
2430 updateScrollFromCursor();
2431} 2427}
2432 2428
2433void LLTextEditor::onFocusReceived() 2429void LLTextEditor::onFocusReceived()
@@ -2594,7 +2590,7 @@ void LLTextEditor::drawSelectionBackground()
2594 BOOL selection_visible = (left_visible_pos <= selection_right) && (selection_left <= right_visible_pos); 2590 BOOL selection_visible = (left_visible_pos <= selection_right) && (selection_left <= right_visible_pos);
2595 if( selection_visible ) 2591 if( selection_visible )
2596 { 2592 {
2597 LLGLSNoTexture no_texture; 2593 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
2598 const LLColor4& color = mReadOnly ? mReadOnlyBgColor : mWriteableBgColor; 2594 const LLColor4& color = mReadOnly ? mReadOnlyBgColor : mWriteableBgColor;
2599 F32 alpha = hasFocus() ? 1.f : 0.5f; 2595 F32 alpha = hasFocus() ? 1.f : 0.5f;
2600 gGL.color4f( 1.f - color.mV[0], 1.f - color.mV[1], 1.f - color.mV[2], alpha ); 2596 gGL.color4f( 1.f - color.mV[0], 1.f - color.mV[1], 1.f - color.mV[2], alpha );
@@ -2729,7 +2725,7 @@ void LLTextEditor::drawCursor()
2729 } 2725 }
2730 } 2726 }
2731 2727
2732 LLGLSNoTexture no_texture; 2728 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
2733 2729
2734 gGL.color4fv( mCursorColor.mV ); 2730 gGL.color4fv( mCursorColor.mV );
2735 2731
@@ -3100,6 +3096,20 @@ void LLTextEditor::drawClippedSegment(const LLWString &text, S32 seg_start, S32
3100 3096
3101void LLTextEditor::draw() 3097void LLTextEditor::draw()
3102{ 3098{
3099 // do on-demand reflow
3100 if (mReflowNeeded)
3101 {
3102 updateLineStartList();
3103 mReflowNeeded = FALSE;
3104 }
3105
3106 // then update scroll position, as cursor may have moved
3107 if (mScrollNeeded)
3108 {
3109 updateScrollFromCursor();
3110 mScrollNeeded = FALSE;
3111 }
3112
3103 { 3113 {
3104 LLLocalClipRect clip(LLRect(0, getRect().getHeight(), getRect().getWidth() - (mScrollbar->getVisible() ? SCROLLBAR_SIZE : 0), 0)); 3114 LLLocalClipRect clip(LLRect(0, getRect().getHeight(), getRect().getWidth() - (mScrollbar->getVisible() ? SCROLLBAR_SIZE : 0), 0));
3105 3115
@@ -3118,10 +3128,10 @@ void LLTextEditor::draw()
3118 mBorder->setKeyboardFocusHighlight( gFocusMgr.getKeyboardFocus() == this);// && !mReadOnly); 3128 mBorder->setKeyboardFocusHighlight( gFocusMgr.getKeyboardFocus() == this);// && !mReadOnly);
3119 } 3129 }
3120 3130
3131 LLView::draw(); // Draw children (scrollbar and border)
3132
3121 // remember if we are supposed to be at the bottom of the buffer 3133 // remember if we are supposed to be at the bottom of the buffer
3122 mScrolledToBottom = isScrolledToBottom(); 3134 mScrolledToBottom = isScrolledToBottom();
3123
3124 LLView::draw(); // Draw children (scrollbar and border)
3125} 3135}
3126 3136
3127 3137
@@ -3311,7 +3321,7 @@ void LLTextEditor::setCursorAndScrollToEnd()
3311{ 3321{
3312 deselect(); 3322 deselect();
3313 endOfDoc(); 3323 endOfDoc();
3314 updateScrollFromCursor(); 3324 needsScroll();
3315} 3325}
3316 3326
3317void LLTextEditor::getLineAndColumnForPosition( S32 position, S32* line, S32* col, BOOL include_wordwrap ) 3327void LLTextEditor::getLineAndColumnForPosition( S32 position, S32* line, S32* col, BOOL include_wordwrap )
@@ -3438,7 +3448,7 @@ void LLTextEditor::reshape(S32 width, S32 height, BOOL called_from_parent)
3438 // up-to-date mTextRect 3448 // up-to-date mTextRect
3439 updateTextRect(); 3449 updateTextRect();
3440 3450
3441 updateLineStartList(); 3451 needsReflow();
3442 3452
3443 // propagate shape information to scrollbar 3453 // propagate shape information to scrollbar
3444 mScrollbar->setDocSize( getLineCount() ); 3454 mScrollbar->setDocSize( getLineCount() );
@@ -3446,14 +3456,6 @@ void LLTextEditor::reshape(S32 width, S32 height, BOOL called_from_parent)
3446 S32 line_height = llround( mGLFont->getLineHeight() ); 3456 S32 line_height = llround( mGLFont->getLineHeight() );
3447 S32 page_lines = mTextRect.getHeight() / line_height; 3457 S32 page_lines = mTextRect.getHeight() / line_height;
3448 mScrollbar->setPageSize( page_lines ); 3458 mScrollbar->setPageSize( page_lines );
3449
3450 // if scrolled to bottom, stay at bottom
3451 // unless user is editing text
3452 // do this after updating page size
3453 if (mScrolledToBottom && mTrackBottom && !hasFocus())
3454 {
3455 endOfDoc();
3456 }
3457} 3459}
3458 3460
3459void LLTextEditor::autoIndent() 3461void LLTextEditor::autoIndent()
@@ -3500,8 +3502,7 @@ void LLTextEditor::insertText(const std::string &new_text)
3500 3502
3501 setCursorPos(mCursorPos + insert( mCursorPos, utf8str_to_wstring(new_text), FALSE )); 3503 setCursorPos(mCursorPos + insert( mCursorPos, utf8str_to_wstring(new_text), FALSE ));
3502 3504
3503 updateLineStartList(); 3505 needsReflow();
3504 updateScrollFromCursor();
3505 3506
3506 setEnabled( enabled ); 3507 setEnabled( enabled );
3507} 3508}
@@ -3600,7 +3601,7 @@ void LLTextEditor::appendText(const std::string &new_text, bool allow_undo, bool
3600 mSegments.push_back(segment); 3601 mSegments.push_back(segment);
3601 } 3602 }
3602 3603
3603 updateLineStartList(old_length); 3604 needsReflow();
3604 3605
3605 // Set the cursor and scroll position 3606 // Set the cursor and scroll position
3606 // Maintain the scroll position unless the scroll was at the end of the doc (in which 3607 // Maintain the scroll position unless the scroll was at the end of the doc (in which
@@ -3639,14 +3640,6 @@ void LLTextEditor::appendText(const std::string &new_text, bool allow_undo, bool
3639 { 3640 {
3640 blockUndo(); 3641 blockUndo();
3641 } 3642 }
3642
3643 // if scrolled to bottom, stay at bottom
3644 // unless user is editing text
3645 // do this after updating page size
3646 if (mScrolledToBottom && mTrackBottom && !hasFocus())
3647 {
3648 endOfDoc();
3649 }
3650} 3643}
3651 3644
3652void LLTextEditor::removeTextFromEnd(S32 num_chars) 3645void LLTextEditor::removeTextFromEnd(S32 num_chars)
@@ -3661,7 +3654,10 @@ void LLTextEditor::removeTextFromEnd(S32 num_chars)
3661 mSelectionEnd = llclamp(mSelectionEnd, 0, len); 3654 mSelectionEnd = llclamp(mSelectionEnd, 0, len);
3662 3655
3663 pruneSegments(); 3656 pruneSegments();
3657
3658 // pruneSegments will invalidate mLineStartList.
3664 updateLineStartList(); 3659 updateLineStartList();
3660 needsScroll();
3665} 3661}
3666 3662
3667/////////////////////////////////////////////////////////////////// 3663///////////////////////////////////////////////////////////////////
@@ -3759,8 +3755,7 @@ BOOL LLTextEditor::tryToRevertToPristineState()
3759 } 3755 }
3760 } 3756 }
3761 3757
3762 updateLineStartList(); 3758 needsReflow();
3763 updateScrollFromCursor();
3764 } 3759 }
3765 3760
3766 return isPristine(); // TRUE => success 3761 return isPristine(); // TRUE => success
@@ -3808,6 +3803,7 @@ void LLTextEditor::updateSegments()
3808 { 3803 {
3809 findEmbeddedItemSegments(); 3804 findEmbeddedItemSegments();
3810 } 3805 }
3806
3811 // Make sure we have at least one segment 3807 // Make sure we have at least one segment
3812 if (mSegments.size() == 1 && mSegments[0]->getIsDefault()) 3808 if (mSegments.size() == 1 && mSegments[0]->getIsDefault())
3813 { 3809 {
@@ -3824,6 +3820,7 @@ void LLTextEditor::updateSegments()
3824} 3820}
3825 3821
3826// Only effective if text was removed from the end of the editor 3822// Only effective if text was removed from the end of the editor
3823// *NOTE: Using this will invalidate references to mSegments from mLineStartList.
3827void LLTextEditor::pruneSegments() 3824void LLTextEditor::pruneSegments()
3828{ 3825{
3829 S32 len = mWText.length(); 3826 S32 len = mWText.length();
@@ -4066,9 +4063,7 @@ BOOL LLTextEditor::importBuffer(const char* buffer, S32 length )
4066 setCursorPos(0); 4063 setCursorPos(0);
4067 deselect(); 4064 deselect();
4068 4065
4069 updateLineStartList(); 4066 needsReflow();
4070 updateScrollFromCursor();
4071
4072 return success; 4067 return success;
4073} 4068}
4074 4069
@@ -4260,35 +4255,35 @@ S32 LLTextEditor::findHTMLToken(const std::string &line, S32 pos, BOOL reverse)
4260 std::string openers=" \t\n('\"[{<>"; 4255 std::string openers=" \t\n('\"[{<>";
4261 std::string closers=" \t\n)'\"]}><;"; 4256 std::string closers=" \t\n)'\"]}><;";
4262 4257
4263 S32 m2 = 0; 4258 S32 index = 0;
4264 S32 retval = 0;
4265 4259
4266 if (reverse) 4260 if (reverse)
4267 { 4261 {
4268 4262 for (index=pos; index >= 0; index--)
4269 for (retval=pos; retval >= 0; retval--)
4270 { 4263 {
4271 m2 = openers.find(line.substr(retval,1)); 4264 char c = line[index];
4265 S32 m2 = openers.find(c);
4272 if (m2 >= 0) 4266 if (m2 >= 0)
4273 { 4267 {
4274 break; 4268 return index+1;
4275 } 4269 }
4276 } 4270 }
4277 return retval+1;
4278 } 4271 }
4279 else 4272 else
4280 { 4273 {
4281 4274
4282 for (retval=pos; retval<(S32)line.length(); retval++) 4275 for (index=pos; index<(S32)line.length(); index++)
4283 { 4276 {
4284 m2 = closers.find(line.substr(retval,1)); 4277 char c = line[index];
4278 S32 m2 = closers.find(c);
4285 if (m2 >= 0) 4279 if (m2 >= 0)
4286 { 4280 {
4287 break; 4281 return index;
4288 } 4282 }
4289 } 4283 }
4290 return retval; 4284 }
4291 } 4285
4286 return index;
4292} 4287}
4293 4288
4294BOOL LLTextEditor::findHTML(const std::string &line, S32 *begin, S32 *end) const 4289BOOL LLTextEditor::findHTML(const std::string &line, S32 *begin, S32 *end) const
@@ -4476,9 +4471,8 @@ void LLTextEditor::updatePreedit(const LLWString &preedit_string,
4476 4471
4477 mPreeditStandouts = preedit_standouts; 4472 mPreeditStandouts = preedit_standouts;
4478 4473
4479 updateLineStartList(); 4474 needsReflow();
4480 setCursorPos(insert_preedit_at + caret_position); 4475 setCursorPos(insert_preedit_at + caret_position);
4481 // updateScrollFromCursor();
4482 4476
4483 // Update of the preedit should be caused by some key strokes. 4477 // Update of the preedit should be caused by some key strokes.
4484 mKeystrokeTimer.reset(); 4478 mKeystrokeTimer.reset();
diff --git a/linden/indra/llui/lltexteditor.h b/linden/indra/llui/lltexteditor.h
index 3cff91d..3604cf6 100644
--- a/linden/indra/llui/lltexteditor.h
+++ b/linden/indra/llui/lltexteditor.h
@@ -245,9 +245,11 @@ public:
245 llwchar getWChar(S32 pos) const { return mWText[pos]; } 245 llwchar getWChar(S32 pos) const { return mWText[pos]; }
246 LLWString getWSubString(S32 pos, S32 len) const { return mWText.substr(pos, len); } 246 LLWString getWSubString(S32 pos, S32 len) const { return mWText.substr(pos, len); }
247 247
248 const LLTextSegment* getCurrentSegment() { return getSegmentAtOffset(mCursorPos); } 248 const LLTextSegment* getCurrentSegment() const { return getSegmentAtOffset(mCursorPos); }
249 const LLTextSegment* getPreviousSegment(); 249 const LLTextSegment* getPreviousSegment() const;
250 void getSelectedSegments(std::vector<const LLTextSegment*>& segments); 250 void getSelectedSegments(std::vector<const LLTextSegment*>& segments) const;
251
252 static bool isPartOfWord(llwchar c) { return (c == '_') || LLStringOps::isAlnum((char)c); }
251 253
252protected: 254protected:
253 // 255 //
@@ -266,8 +268,6 @@ protected:
266 void assignEmbedded(const std::string &s); 268 void assignEmbedded(const std::string &s);
267 BOOL truncate(); // Returns true if truncation occurs 269 BOOL truncate(); // Returns true if truncation occurs
268 270
269 static BOOL isPartOfWord(llwchar c) { return (c == '_') || isalnum(c); }
270
271 void removeCharOrTab(); 271 void removeCharOrTab();
272 void setCursorAtLocalPos(S32 x, S32 y, BOOL round); 272 void setCursorAtLocalPos(S32 x, S32 y, BOOL round);
273 S32 getCursorPosFromLocalCoord( S32 local_x, S32 local_y, BOOL round ) const; 273 S32 getCursorPosFromLocalCoord( S32 local_x, S32 local_y, BOOL round ) const;
@@ -433,6 +433,14 @@ private:
433 void drawText(); 433 void drawText();
434 void drawClippedSegment(const LLWString &wtext, S32 seg_start, S32 seg_end, F32 x, F32 y, S32 selection_left, S32 selection_right, const LLStyleSP& color, F32* right_x); 434 void drawClippedSegment(const LLWString &wtext, S32 seg_start, S32 seg_end, F32 x, F32 y, S32 selection_left, S32 selection_right, const LLStyleSP& color, F32* right_x);
435 435
436 void needsReflow()
437 {
438 mReflowNeeded = TRUE;
439 // cursor might have moved, need to scroll
440 mScrollNeeded = TRUE;
441 }
442 void needsScroll() { mScrollNeeded = TRUE; }
443
436 // 444 //
437 // Data 445 // Data
438 // 446 //
@@ -489,6 +497,8 @@ private:
489 }; 497 };
490 typedef std::vector<line_info> line_list_t; 498 typedef std::vector<line_info> line_list_t;
491 line_list_t mLineStartList; 499 line_list_t mLineStartList;
500 BOOL mReflowNeeded;
501 BOOL mScrollNeeded;
492 502
493 LLFrameTimer mKeystrokeTimer; 503 LLFrameTimer mKeystrokeTimer;
494 504
diff --git a/linden/indra/llui/llui.cpp b/linden/indra/llui/llui.cpp
index 734aecf..5502246 100644
--- a/linden/indra/llui/llui.cpp
+++ b/linden/indra/llui/llui.cpp
@@ -143,11 +143,11 @@ void gl_state_for_2d(S32 width, S32 height)
143 143
144void gl_draw_x(const LLRect& rect, const LLColor4& color) 144void gl_draw_x(const LLRect& rect, const LLColor4& color)
145{ 145{
146 LLGLSNoTexture no_texture; 146 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
147 147
148 gGL.color4fv( color.mV ); 148 gGL.color4fv( color.mV );
149 149
150 gGL.begin( LLVertexBuffer::LINES ); 150 gGL.begin( LLRender::LINES );
151 gGL.vertex2i( rect.mLeft, rect.mTop ); 151 gGL.vertex2i( rect.mLeft, rect.mTop );
152 gGL.vertex2i( rect.mRight, rect.mBottom ); 152 gGL.vertex2i( rect.mRight, rect.mBottom );
153 gGL.vertex2i( rect.mLeft, rect.mBottom ); 153 gGL.vertex2i( rect.mLeft, rect.mBottom );
@@ -183,12 +183,12 @@ void gl_rect_2d_offset_local( S32 left, S32 top, S32 right, S32 bottom, S32 pixe
183void gl_rect_2d(S32 left, S32 top, S32 right, S32 bottom, BOOL filled ) 183void gl_rect_2d(S32 left, S32 top, S32 right, S32 bottom, BOOL filled )
184{ 184{
185 stop_glerror(); 185 stop_glerror();
186 LLGLSNoTexture no_texture; 186 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
187 187
188 // Counterclockwise quad will face the viewer 188 // Counterclockwise quad will face the viewer
189 if( filled ) 189 if( filled )
190 { 190 {
191 gGL.begin( LLVertexBuffer::QUADS ); 191 gGL.begin( LLRender::QUADS );
192 gGL.vertex2i(left, top); 192 gGL.vertex2i(left, top);
193 gGL.vertex2i(left, bottom); 193 gGL.vertex2i(left, bottom);
194 gGL.vertex2i(right, bottom); 194 gGL.vertex2i(right, bottom);
@@ -200,7 +200,7 @@ void gl_rect_2d(S32 left, S32 top, S32 right, S32 bottom, BOOL filled )
200 if( gGLManager.mATIOffsetVerticalLines ) 200 if( gGLManager.mATIOffsetVerticalLines )
201 { 201 {
202 // Work around bug in ATI driver: vertical lines are offset by (-1,-1) 202 // Work around bug in ATI driver: vertical lines are offset by (-1,-1)
203 gGL.begin( LLVertexBuffer::LINES ); 203 gGL.begin( LLRender::LINES );
204 204
205 // Verticals 205 // Verticals
206 gGL.vertex2i(left + 1, top); 206 gGL.vertex2i(left + 1, top);
@@ -223,7 +223,7 @@ void gl_rect_2d(S32 left, S32 top, S32 right, S32 bottom, BOOL filled )
223 { 223 {
224 top--; 224 top--;
225 right--; 225 right--;
226 gGL.begin( LLVertexBuffer::LINE_STRIP ); 226 gGL.begin( LLRender::LINE_STRIP );
227 gGL.vertex2i(left, top); 227 gGL.vertex2i(left, top);
228 gGL.vertex2i(left, bottom); 228 gGL.vertex2i(left, bottom);
229 gGL.vertex2i(right, bottom); 229 gGL.vertex2i(right, bottom);
@@ -254,7 +254,7 @@ void gl_rect_2d( const LLRect& rect, const LLColor4& color, BOOL filled )
254void gl_drop_shadow(S32 left, S32 top, S32 right, S32 bottom, const LLColor4 &start_color, S32 lines) 254void gl_drop_shadow(S32 left, S32 top, S32 right, S32 bottom, const LLColor4 &start_color, S32 lines)
255{ 255{
256 stop_glerror(); 256 stop_glerror();
257 LLGLSNoTexture no_texture; 257 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
258 258
259 // HACK: Overlap with the rectangle by a single pixel. 259 // HACK: Overlap with the rectangle by a single pixel.
260 right--; 260 right--;
@@ -264,7 +264,7 @@ void gl_drop_shadow(S32 left, S32 top, S32 right, S32 bottom, const LLColor4 &st
264 LLColor4 end_color = start_color; 264 LLColor4 end_color = start_color;
265 end_color.mV[VALPHA] = 0.f; 265 end_color.mV[VALPHA] = 0.f;
266 266
267 gGL.begin(LLVertexBuffer::QUADS); 267 gGL.begin(LLRender::QUADS);
268 268
269 // Right edge, CCW faces screen 269 // Right edge, CCW faces screen
270 gGL.color4fv(start_color.mV); 270 gGL.color4fv(start_color.mV);
@@ -324,9 +324,9 @@ void gl_line_2d(S32 x1, S32 y1, S32 x2, S32 y2 )
324 y2++; 324 y2++;
325 } 325 }
326 326
327 LLGLSNoTexture no_texture; 327 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
328 328
329 gGL.begin(LLVertexBuffer::LINES); 329 gGL.begin(LLRender::LINES);
330 gGL.vertex2i(x1, y1); 330 gGL.vertex2i(x1, y1);
331 gGL.vertex2i(x2, y2); 331 gGL.vertex2i(x2, y2);
332 gGL.end(); 332 gGL.end();
@@ -343,11 +343,11 @@ void gl_line_2d(S32 x1, S32 y1, S32 x2, S32 y2, const LLColor4 &color )
343 y2++; 343 y2++;
344 } 344 }
345 345
346 LLGLSNoTexture no_texture; 346 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
347 347
348 gGL.color4fv( color.mV ); 348 gGL.color4fv( color.mV );
349 349
350 gGL.begin(LLVertexBuffer::LINES); 350 gGL.begin(LLRender::LINES);
351 gGL.vertex2i(x1, y1); 351 gGL.vertex2i(x1, y1);
352 gGL.vertex2i(x2, y2); 352 gGL.vertex2i(x2, y2);
353 gGL.end(); 353 gGL.end();
@@ -355,17 +355,17 @@ void gl_line_2d(S32 x1, S32 y1, S32 x2, S32 y2, const LLColor4 &color )
355 355
356void gl_triangle_2d(S32 x1, S32 y1, S32 x2, S32 y2, S32 x3, S32 y3, const LLColor4& color, BOOL filled) 356void gl_triangle_2d(S32 x1, S32 y1, S32 x2, S32 y2, S32 x3, S32 y3, const LLColor4& color, BOOL filled)
357{ 357{
358 LLGLSNoTexture no_texture; 358 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
359 359
360 gGL.color4fv(color.mV); 360 gGL.color4fv(color.mV);
361 361
362 if (filled) 362 if (filled)
363 { 363 {
364 gGL.begin(LLVertexBuffer::TRIANGLES); 364 gGL.begin(LLRender::TRIANGLES);
365 } 365 }
366 else 366 else
367 { 367 {
368 gGL.begin(LLVertexBuffer::LINE_LOOP); 368 gGL.begin(LLRender::LINE_LOOP);
369 } 369 }
370 gGL.vertex2i(x1, y1); 370 gGL.vertex2i(x1, y1);
371 gGL.vertex2i(x2, y2); 371 gGL.vertex2i(x2, y2);
@@ -375,11 +375,11 @@ void gl_triangle_2d(S32 x1, S32 y1, S32 x2, S32 y2, S32 x3, S32 y3, const LLColo
375 375
376void gl_corners_2d(S32 left, S32 top, S32 right, S32 bottom, S32 length, F32 max_frac) 376void gl_corners_2d(S32 left, S32 top, S32 right, S32 bottom, S32 length, F32 max_frac)
377{ 377{
378 LLGLSNoTexture no_texture; 378 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
379 379
380 length = llmin((S32)(max_frac*(right - left)), length); 380 length = llmin((S32)(max_frac*(right - left)), length);
381 length = llmin((S32)(max_frac*(top - bottom)), length); 381 length = llmin((S32)(max_frac*(top - bottom)), length);
382 gGL.begin(LLVertexBuffer::LINES); 382 gGL.begin(LLRender::LINES);
383 gGL.vertex2i(left, top); 383 gGL.vertex2i(left, top);
384 gGL.vertex2i(left + length, top); 384 gGL.vertex2i(left + length, top);
385 385
@@ -496,11 +496,11 @@ void gl_draw_scaled_image_with_border(S32 x, S32 y, S32 width, S32 height, LLIma
496 { 496 {
497 gGL.translatef((F32)x, (F32)y, 0.f); 497 gGL.translatef((F32)x, (F32)y, 0.f);
498 498
499 image->bind(); 499 gGL.getTexUnit(0)->bind(image);
500 500
501 gGL.color4fv(color.mV); 501 gGL.color4fv(color.mV);
502 502
503 gGL.begin(LLVertexBuffer::QUADS); 503 gGL.begin(LLRender::QUADS);
504 { 504 {
505 // draw bottom left 505 // draw bottom left
506 gGL.texCoord2f(uv_rect.mLeft, uv_rect.mBottom); 506 gGL.texCoord2f(uv_rect.mLeft, uv_rect.mBottom);
@@ -656,11 +656,11 @@ void gl_draw_scaled_rotated_image(S32 x, S32 y, S32 width, S32 height, F32 degre
656 gGL.translatef( -offset_x, -offset_y, 0.f ); 656 gGL.translatef( -offset_x, -offset_y, 0.f );
657 } 657 }
658 658
659 image->bind(); 659 gGL.getTexUnit(0)->bind(image);
660 660
661 gGL.color4fv(color.mV); 661 gGL.color4fv(color.mV);
662 662
663 gGL.begin(LLVertexBuffer::QUADS); 663 gGL.begin(LLRender::QUADS);
664 { 664 {
665 gGL.texCoord2f(uv_rect.mRight, uv_rect.mTop); 665 gGL.texCoord2f(uv_rect.mRight, uv_rect.mTop);
666 gGL.vertex2i(width, height ); 666 gGL.vertex2i(width, height );
@@ -694,11 +694,11 @@ void gl_draw_scaled_image_inverted(S32 x, S32 y, S32 width, S32 height, LLImageG
694 { 694 {
695 gGL.translatef((F32)x, (F32)y, 0.f); 695 gGL.translatef((F32)x, (F32)y, 0.f);
696 696
697 image->bind(); 697 gGL.getTexUnit(0)->bind(image);
698 698
699 gGL.color4fv(color.mV); 699 gGL.color4fv(color.mV);
700 700
701 gGL.begin(LLVertexBuffer::QUADS); 701 gGL.begin(LLRender::QUADS);
702 { 702 {
703 gGL.texCoord2f(uv_rect.mRight, uv_rect.mBottom); 703 gGL.texCoord2f(uv_rect.mRight, uv_rect.mBottom);
704 gGL.vertex2i(width, height ); 704 gGL.vertex2i(width, height );
@@ -733,7 +733,7 @@ void gl_stippled_line_3d( const LLVector3& start, const LLVector3& end, const LL
733 glLineWidth(2.5f); 733 glLineWidth(2.5f);
734 glLineStipple(2, 0x3333 << shift); 734 glLineStipple(2, 0x3333 << shift);
735 735
736 gGL.begin(LLVertexBuffer::LINES); 736 gGL.begin(LLRender::LINES);
737 { 737 {
738 gGL.vertex3fv( start.mV ); 738 gGL.vertex3fv( start.mV );
739 gGL.vertex3fv( end.mV ); 739 gGL.vertex3fv( end.mV );
@@ -750,7 +750,7 @@ void gl_rect_2d_xor(S32 left, S32 top, S32 right, S32 bottom)
750 glLogicOp( GL_XOR ); 750 glLogicOp( GL_XOR );
751 stop_glerror(); 751 stop_glerror();
752 752
753 gGL.begin(LLVertexBuffer::QUADS); 753 gGL.begin(LLRender::QUADS);
754 gGL.vertex2i(left, top); 754 gGL.vertex2i(left, top);
755 gGL.vertex2i(left, bottom); 755 gGL.vertex2i(left, bottom);
756 gGL.vertex2i(right, bottom); 756 gGL.vertex2i(right, bottom);
@@ -782,14 +782,14 @@ void gl_arc_2d(F32 center_x, F32 center_y, F32 radius, S32 steps, BOOL filled, F
782 782
783 if (filled) 783 if (filled)
784 { 784 {
785 gGL.begin(LLVertexBuffer::TRIANGLE_FAN); 785 gGL.begin(LLRender::TRIANGLE_FAN);
786 gGL.vertex2f(0.f, 0.f); 786 gGL.vertex2f(0.f, 0.f);
787 // make sure circle is complete 787 // make sure circle is complete
788 steps += 1; 788 steps += 1;
789 } 789 }
790 else 790 else
791 { 791 {
792 gGL.begin(LLVertexBuffer::LINE_STRIP); 792 gGL.begin(LLRender::LINE_STRIP);
793 } 793 }
794 794
795 while( steps-- ) 795 while( steps-- )
@@ -809,7 +809,7 @@ void gl_circle_2d(F32 center_x, F32 center_y, F32 radius, S32 steps, BOOL filled
809{ 809{
810 gGL.pushMatrix(); 810 gGL.pushMatrix();
811 { 811 {
812 LLGLSNoTexture gls_no_texture; 812 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
813 gGL.translatef(center_x, center_y, 0.f); 813 gGL.translatef(center_x, center_y, 0.f);
814 814
815 // Inexact, but reasonably fast. 815 // Inexact, but reasonably fast.
@@ -821,14 +821,14 @@ void gl_circle_2d(F32 center_x, F32 center_y, F32 radius, S32 steps, BOOL filled
821 821
822 if (filled) 822 if (filled)
823 { 823 {
824 gGL.begin(LLVertexBuffer::TRIANGLE_FAN); 824 gGL.begin(LLRender::TRIANGLE_FAN);
825 gGL.vertex2f(0.f, 0.f); 825 gGL.vertex2f(0.f, 0.f);
826 // make sure circle is complete 826 // make sure circle is complete
827 steps += 1; 827 steps += 1;
828 } 828 }
829 else 829 else
830 { 830 {
831 gGL.begin(LLVertexBuffer::LINE_LOOP); 831 gGL.begin(LLRender::LINE_LOOP);
832 } 832 }
833 833
834 while( steps-- ) 834 while( steps-- )
@@ -850,7 +850,7 @@ void gl_deep_circle( F32 radius, F32 depth, S32 steps )
850 F32 x = radius; 850 F32 x = radius;
851 F32 y = 0.f; 851 F32 y = 0.f;
852 F32 angle_delta = F_TWO_PI / (F32)steps; 852 F32 angle_delta = F_TWO_PI / (F32)steps;
853 gGL.begin( LLVertexBuffer::TRIANGLE_STRIP ); 853 gGL.begin( LLRender::TRIANGLE_STRIP );
854 { 854 {
855 S32 step = steps + 1; // An extra step to close the circle. 855 S32 step = steps + 1; // An extra step to close the circle.
856 while( step-- ) 856 while( step-- )
@@ -905,7 +905,7 @@ void gl_rect_2d_checkerboard(const LLRect& rect)
905 first = FALSE; 905 first = FALSE;
906 } 906 }
907 907
908 LLGLSNoTexture gls_no_texture; 908 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
909 909
910 // ...white squares 910 // ...white squares
911 gGL.color3f( 1.f, 1.f, 1.f ); 911 gGL.color3f( 1.f, 1.f, 1.f );
@@ -935,9 +935,9 @@ void gl_washer_2d(F32 outer_radius, F32 inner_radius, S32 steps, const LLColor4&
935 F32 x2 = inner_radius; 935 F32 x2 = inner_radius;
936 F32 y2 = 0.f; 936 F32 y2 = 0.f;
937 937
938 LLGLSNoTexture gls_no_texture; 938 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
939 939
940 gGL.begin( LLVertexBuffer::TRIANGLE_STRIP ); 940 gGL.begin( LLRender::TRIANGLE_STRIP );
941 { 941 {
942 steps += 1; // An extra step to close the circle. 942 steps += 1; // An extra step to close the circle.
943 while( steps-- ) 943 while( steps-- )
@@ -972,8 +972,8 @@ void gl_washer_segment_2d(F32 outer_radius, F32 inner_radius, F32 start_radians,
972 F32 x2 = inner_radius * cos( start_radians ); 972 F32 x2 = inner_radius * cos( start_radians );
973 F32 y2 = inner_radius * sin( start_radians ); 973 F32 y2 = inner_radius * sin( start_radians );
974 974
975 LLGLSNoTexture gls_no_texture; 975 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
976 gGL.begin( LLVertexBuffer::TRIANGLE_STRIP ); 976 gGL.begin( LLRender::TRIANGLE_STRIP );
977 { 977 {
978 steps += 1; // An extra step to close the circle. 978 steps += 1; // An extra step to close the circle.
979 while( steps-- ) 979 while( steps-- )
@@ -1008,9 +1008,9 @@ void gl_washer_spokes_2d(F32 outer_radius, F32 inner_radius, S32 count, const LL
1008 F32 x2 = inner_radius * cos( HALF_DELTA ); 1008 F32 x2 = inner_radius * cos( HALF_DELTA );
1009 F32 y2 = inner_radius * sin( HALF_DELTA ); 1009 F32 y2 = inner_radius * sin( HALF_DELTA );
1010 1010
1011 LLGLSNoTexture gls_no_texture; 1011 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
1012 1012
1013 gGL.begin( LLVertexBuffer::LINES ); 1013 gGL.begin( LLRender::LINES );
1014 { 1014 {
1015 while( count-- ) 1015 while( count-- )
1016 { 1016 {
@@ -1033,7 +1033,7 @@ void gl_washer_spokes_2d(F32 outer_radius, F32 inner_radius, S32 count, const LL
1033 1033
1034void gl_rect_2d_simple_tex( S32 width, S32 height ) 1034void gl_rect_2d_simple_tex( S32 width, S32 height )
1035{ 1035{
1036 gGL.begin( LLVertexBuffer::QUADS ); 1036 gGL.begin( LLRender::QUADS );
1037 1037
1038 gGL.texCoord2f(1.f, 1.f); 1038 gGL.texCoord2f(1.f, 1.f);
1039 gGL.vertex2i(width, height); 1039 gGL.vertex2i(width, height);
@@ -1052,7 +1052,7 @@ void gl_rect_2d_simple_tex( S32 width, S32 height )
1052 1052
1053void gl_rect_2d_simple( S32 width, S32 height ) 1053void gl_rect_2d_simple( S32 width, S32 height )
1054{ 1054{
1055 gGL.begin( LLVertexBuffer::QUADS ); 1055 gGL.begin( LLRender::QUADS );
1056 gGL.vertex2i(width, height); 1056 gGL.vertex2i(width, height);
1057 gGL.vertex2i(0, height); 1057 gGL.vertex2i(0, height);
1058 gGL.vertex2i(0, 0); 1058 gGL.vertex2i(0, 0);
@@ -1094,7 +1094,7 @@ void gl_segmented_rect_2d_tex(const S32 left,
1094 LLVector2 width_vec((F32)width, 0.f); 1094 LLVector2 width_vec((F32)width, 0.f);
1095 LLVector2 height_vec(0.f, (F32)height); 1095 LLVector2 height_vec(0.f, (F32)height);
1096 1096
1097 gGL.begin(LLVertexBuffer::QUADS); 1097 gGL.begin(LLRender::QUADS);
1098 { 1098 {
1099 // draw bottom left 1099 // draw bottom left
1100 gGL.texCoord2f(0.f, 0.f); 1100 gGL.texCoord2f(0.f, 0.f);
@@ -1262,7 +1262,7 @@ void gl_segmented_rect_2d_fragment_tex(const S32 left,
1262 LLVector2 x_min; 1262 LLVector2 x_min;
1263 LLVector2 x_max; 1263 LLVector2 x_max;
1264 1264
1265 gGL.begin(LLVertexBuffer::QUADS); 1265 gGL.begin(LLRender::QUADS);
1266 { 1266 {
1267 if (start_fragment < middle_start) 1267 if (start_fragment < middle_start)
1268 { 1268 {
@@ -1419,7 +1419,7 @@ void gl_segmented_rect_3d_tex(const LLVector2& border_scale, const LLVector3& bo
1419 LLVector3 bottom_border_height = ((edges & (~(U32)ROUNDED_RECT_TOP)) != 0) ? border_height : LLVector3::zero; 1419 LLVector3 bottom_border_height = ((edges & (~(U32)ROUNDED_RECT_TOP)) != 0) ? border_height : LLVector3::zero;
1420 1420
1421 1421
1422 gGL.begin(LLVertexBuffer::QUADS); 1422 gGL.begin(LLRender::QUADS);
1423 { 1423 {
1424 // draw bottom left 1424 // draw bottom left
1425 gGL.texCoord2f(0.f, 0.f); 1425 gGL.texCoord2f(0.f, 0.f);
@@ -1575,7 +1575,7 @@ void LLUI::initClass(LLControlGroup* config,
1575void LLUI::cleanupClass() 1575void LLUI::cleanupClass()
1576{ 1576{
1577 sImageProvider->cleanUp(); 1577 sImageProvider->cleanUp();
1578 LLLineEditor::cleanupClass(); 1578 LLLineEditor::cleanupLineEditor();
1579} 1579}
1580 1580
1581 1581
diff --git a/linden/indra/llui/llview.cpp b/linden/indra/llui/llview.cpp
index 034c49b..bc6fe7e 100644
--- a/linden/indra/llui/llview.cpp
+++ b/linden/indra/llui/llview.cpp
@@ -1281,7 +1281,7 @@ void LLView::drawDebugRect()
1281 LLUI::pushMatrix(); 1281 LLUI::pushMatrix();
1282 { 1282 {
1283 // drawing solids requires texturing be disabled 1283 // drawing solids requires texturing be disabled
1284 LLGLSNoTexture no_texture; 1284 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
1285 1285
1286 if (mUseBoundingRect) 1286 if (mUseBoundingRect)
1287 { 1287 {
@@ -1303,7 +1303,7 @@ void LLView::drawDebugRect()
1303 1303
1304 gGL.color4fv( border_color.mV ); 1304 gGL.color4fv( border_color.mV );
1305 1305
1306 gGL.begin(LLVertexBuffer::LINES); 1306 gGL.begin(LLRender::LINES);
1307 gGL.vertex2i(0, debug_rect.getHeight() - 1); 1307 gGL.vertex2i(0, debug_rect.getHeight() - 1);
1308 gGL.vertex2i(0, 0); 1308 gGL.vertex2i(0, 0);
1309 1309
diff --git a/linden/indra/llui/llviewborder.cpp b/linden/indra/llui/llviewborder.cpp
index 8a5beea..a1c26d6 100644
--- a/linden/indra/llui/llviewborder.cpp
+++ b/linden/indra/llui/llviewborder.cpp
@@ -111,7 +111,7 @@ void LLViewBorder::draw()
111 111
112void LLViewBorder::drawOnePixelLines() 112void LLViewBorder::drawOnePixelLines()
113{ 113{
114 LLGLSNoTexture uiNoTexture; 114 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
115 115
116 LLColor4 top_color = mHighlightLight; 116 LLColor4 top_color = mHighlightLight;
117 LLColor4 bottom_color = mHighlightLight; 117 LLColor4 bottom_color = mHighlightLight;
@@ -158,7 +158,7 @@ void LLViewBorder::drawOnePixelLines()
158 158
159void LLViewBorder::drawTwoPixelLines() 159void LLViewBorder::drawTwoPixelLines()
160{ 160{
161 LLGLSNoTexture no_texture; 161 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
162 162
163 LLColor4 focus_color = gFocusMgr.getFocusColor(); 163 LLColor4 focus_color = gFocusMgr.getFocusColor();
164 164
@@ -230,7 +230,7 @@ void LLViewBorder::drawTextures()
230 230
231 //gGL.color4fv(UI_VERTEX_COLOR.mV); 231 //gGL.color4fv(UI_VERTEX_COLOR.mV);
232 232
233 //mTexture->bind(); 233 //gGL.getTexUnit(0)->bind(mTexture);
234 //glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT ); 234 //glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT );
235 //glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT ); 235 //glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT );
236 236
@@ -248,7 +248,7 @@ void LLViewBorder::drawTextureTrapezoid( F32 degrees, S32 width, S32 length, F32
248 gGL.translatef(start_x, start_y, 0.f); 248 gGL.translatef(start_x, start_y, 0.f);
249 glRotatef( degrees, 0, 0, 1 ); 249 glRotatef( degrees, 0, 0, 1 );
250 250
251 gGL.begin(LLVertexBuffer::QUADS); 251 gGL.begin(LLRender::QUADS);
252 { 252 {
253 // width, width /---------\ length-width, width // 253 // width, width /---------\ length-width, width //
254 // / \ // 254 // / \ //
diff --git a/linden/indra/llvfs/CMakeLists.txt b/linden/indra/llvfs/CMakeLists.txt
index 9f136f7..c3c12ef 100644
--- a/linden/indra/llvfs/CMakeLists.txt
+++ b/linden/indra/llvfs/CMakeLists.txt
@@ -56,3 +56,9 @@ set_source_files_properties(${llvfs_HEADER_FILES}
56list(APPEND llvfs_SOURCE_FILES ${llvfs_HEADER_FILES}) 56list(APPEND llvfs_SOURCE_FILES ${llvfs_HEADER_FILES})
57 57
58add_library (llvfs ${llvfs_SOURCE_FILES}) 58add_library (llvfs ${llvfs_SOURCE_FILES})
59
60if (DARWIN)
61 include(CMakeFindFrameworks)
62 find_library(CARBON_LIBRARY Carbon)
63 target_link_libraries(llvfs ${CARBON_LIBRARY})
64endif (DARWIN)
diff --git a/linden/indra/llvfs/lldir.cpp b/linden/indra/llvfs/lldir.cpp
index 0e014d9..5bfe11f 100644
--- a/linden/indra/llvfs/lldir.cpp
+++ b/linden/indra/llvfs/lldir.cpp
@@ -497,6 +497,29 @@ std::string LLDir::getTempFilename() const
497 return temp_filename; 497 return temp_filename;
498} 498}
499 499
500// static
501std::string LLDir::getScrubbedFileName(const std::string uncleanFileName)
502{
503 std::string name(uncleanFileName);
504 const std::string illegalChars(getForbiddenFileChars());
505 // replace any illegal file chars with and underscore '_'
506 for( unsigned int i = 0; i < illegalChars.length(); i++ )
507 {
508 int j = -1;
509 while((j = name.find(illegalChars[i])) > -1)
510 {
511 name[j] = '_';
512 }
513 }
514 return name;
515}
516
517// static
518std::string LLDir::getForbiddenFileChars()
519{
520 return "\\/:*?\"<>|";
521}
522
500void LLDir::setLindenUserDir(const std::string &first, const std::string &last) 523void LLDir::setLindenUserDir(const std::string &first, const std::string &last)
501{ 524{
502 // if both first and last aren't set, assume we're grabbing the cached dir 525 // if both first and last aren't set, assume we're grabbing the cached dir
diff --git a/linden/indra/llvfs/lldir.h b/linden/indra/llvfs/lldir.h
index dbddf7d..2626d19 100644
--- a/linden/indra/llvfs/lldir.h
+++ b/linden/indra/llvfs/lldir.h
@@ -64,12 +64,12 @@ class LLDir
64 64
65 virtual void initAppDirs(const std::string &app_name) = 0; 65 virtual void initAppDirs(const std::string &app_name) = 0;
66 public: 66 public:
67 virtual S32 deleteFilesInDir(const std::string &dirname, const std::string &mask); 67 virtual S32 deleteFilesInDir(const std::string &dirname, const std::string &mask);
68 68
69// pure virtual functions 69// pure virtual functions
70 virtual U32 countFilesInDir(const std::string &dirname, const std::string &mask) = 0; 70 virtual U32 countFilesInDir(const std::string &dirname, const std::string &mask) = 0;
71 virtual BOOL getNextFileInDir(const std::string &dirname, const std::string &mask, std::string &fname, BOOL wrap) = 0; 71 virtual BOOL getNextFileInDir(const std::string &dirname, const std::string &mask, std::string &fname, BOOL wrap) = 0;
72 virtual void getRandomFileInDir(const std::string &dirname, const std::string &mask, std::string &fname) = 0; 72 virtual void getRandomFileInDir(const std::string &dirname, const std::string &mask, std::string &fname) = 0;
73 virtual std::string getCurPath() = 0; 73 virtual std::string getCurPath() = 0;
74 virtual BOOL fileExists(const std::string &filename) const = 0; 74 virtual BOOL fileExists(const std::string &filename) const = 0;
75 75
@@ -104,7 +104,7 @@ class LLDir
104 std::string getBaseFileName(const std::string& filepath, bool strip_exten = false) const; 104 std::string getBaseFileName(const std::string& filepath, bool strip_exten = false) const;
105 std::string getDirName(const std::string& filepath) const; 105 std::string getDirName(const std::string& filepath) const;
106 std::string getExtension(const std::string& filepath) const; // Excludes '.', e.g getExtension("foo.wav") == "wav" 106 std::string getExtension(const std::string& filepath) const; // Excludes '.', e.g getExtension("foo.wav") == "wav"
107 107
108 // these methods search the various skin paths for the specified file in the following order: 108 // these methods search the various skin paths for the specified file in the following order:
109 // getUserSkinDir(), getSkinDir(), getDefaultSkinDir() 109 // getUserSkinDir(), getSkinDir(), getDefaultSkinDir()
110 std::string findSkinnedFilename(const std::string &filename) const; 110 std::string findSkinnedFilename(const std::string &filename) const;
@@ -114,6 +114,10 @@ class LLDir
114 // random filename in common temporary directory 114 // random filename in common temporary directory
115 std::string getTempFilename() const; 115 std::string getTempFilename() const;
116 116
117 // For producing safe download file names from potentially unsafe ones
118 static std::string getScrubbedFileName(const std::string uncleanFileName);
119 static std::string getForbiddenFileChars();
120
117 virtual void setChatLogsDir(const std::string &path); // Set the chat logs dir to this user's dir 121 virtual void setChatLogsDir(const std::string &path); // Set the chat logs dir to this user's dir
118 virtual void setPerAccountChatLogsDir(const std::string &first, const std::string &last); // Set the per user chat log directory. 122 virtual void setPerAccountChatLogsDir(const std::string &first, const std::string &last); // Set the per user chat log directory.
119 virtual void setLindenUserDir(const std::string &first, const std::string &last); // Set the linden user dir to this user's dir 123 virtual void setLindenUserDir(const std::string &first, const std::string &last); // Set the linden user dir to this user's dir
diff --git a/linden/indra/llvfs/llvfile.cpp b/linden/indra/llvfs/llvfile.cpp
index 61de885..fbdd738 100644
--- a/linden/indra/llvfs/llvfile.cpp
+++ b/linden/indra/llvfs/llvfile.cpp
@@ -35,6 +35,7 @@
35 35
36#include "llerror.h" 36#include "llerror.h"
37#include "llthread.h" 37#include "llthread.h"
38#include "llstat.h"
38#include "llvfs.h" 39#include "llvfs.h"
39 40
40const S32 LLVFile::READ = 0x00000001; 41const S32 LLVFile::READ = 0x00000001;
diff --git a/linden/indra/llvfs/llvfs.cpp b/linden/indra/llvfs/llvfs.cpp
index b3d02a5..82d2723 100644
--- a/linden/indra/llvfs/llvfs.cpp
+++ b/linden/indra/llvfs/llvfs.cpp
@@ -1266,7 +1266,7 @@ void LLVFS::eraseBlockLength(LLVFSBlock *block)
1266 } 1266 }
1267 if(!found_block) 1267 if(!found_block)
1268 { 1268 {
1269 llwarns << "eraseBlock could not find block" << llendl; 1269 llerrs << "eraseBlock could not find block" << llendl;
1270 } 1270 }
1271} 1271}
1272 1272
diff --git a/linden/indra/llwindow/llwindow.cpp b/linden/indra/llwindow/llwindow.cpp
index e8b0a1b..9ce227b 100644
--- a/linden/indra/llwindow/llwindow.cpp
+++ b/linden/indra/llwindow/llwindow.cpp
@@ -321,6 +321,12 @@ std::string LLWindow::getFontListSans()
321#endif 321#endif
322} 322}
323 323
324//virtual
325void LLWindow::processMiscNativeEvents()
326{
327 // do nothing unless subclassed
328}
329
324#define UTF16_IS_HIGH_SURROGATE(U) ((U16)((U) - 0xD800) < 0x0400) 330#define UTF16_IS_HIGH_SURROGATE(U) ((U16)((U) - 0xD800) < 0x0400)
325#define UTF16_IS_LOW_SURROGATE(U) ((U16)((U) - 0xDC00) < 0x0400) 331#define UTF16_IS_LOW_SURROGATE(U) ((U16)((U) - 0xDC00) < 0x0400)
326#define UTF16_SURROGATE_PAIR_TO_UTF32(H,L) (((H) << 10) + (L) - (0xD800 << 10) - 0xDC00 + 0x00010000) 332#define UTF16_SURROGATE_PAIR_TO_UTF32(H,L) (((H) << 10) + (L) - (0xD800 << 10) - 0xDC00 + 0x00010000)
diff --git a/linden/indra/llwindow/llwindow.h b/linden/indra/llwindow/llwindow.h
index 7e948b9..e2c28a2 100644
--- a/linden/indra/llwindow/llwindow.h
+++ b/linden/indra/llwindow/llwindow.h
@@ -194,6 +194,7 @@ public:
194 virtual U32 getFSAASamples() = 0; 194 virtual U32 getFSAASamples() = 0;
195 virtual BOOL restoreGamma() = 0; // Restore original gamma table (before updating gamma) 195 virtual BOOL restoreGamma() = 0; // Restore original gamma table (before updating gamma)
196 virtual ESwapMethod getSwapMethod() { return mSwapMethod; } 196 virtual ESwapMethod getSwapMethod() { return mSwapMethod; }
197 virtual void processMiscNativeEvents();
197 virtual void gatherInput() = 0; 198 virtual void gatherInput() = 0;
198 virtual void delayInputProcessing() = 0; 199 virtual void delayInputProcessing() = 0;
199 virtual void swapBuffers() = 0; 200 virtual void swapBuffers() = 0;
diff --git a/linden/indra/llwindow/llwindowsdl.cpp b/linden/indra/llwindow/llwindowsdl.cpp
index e5d15c4..361126d 100644
--- a/linden/indra/llwindow/llwindowsdl.cpp
+++ b/linden/indra/llwindow/llwindowsdl.cpp
@@ -104,7 +104,8 @@ void maybe_unlock_display(void)
104 104
105#if LL_GTK 105#if LL_GTK
106// Lazily initialize and check the runtime GTK version for goodness. 106// Lazily initialize and check the runtime GTK version for goodness.
107BOOL ll_try_gtk_init(void) 107// static
108bool LLWindowSDL::ll_try_gtk_init(void)
108{ 109{
109 static BOOL done_gtk_diag = FALSE; 110 static BOOL done_gtk_diag = FALSE;
110 static BOOL gtk_is_good = FALSE; 111 static BOOL gtk_is_good = FALSE;
@@ -166,7 +167,8 @@ BOOL ll_try_gtk_init(void)
166 167
167 168
168#if LL_X11 169#if LL_X11
169Window get_SDL_XWindowID(void) 170// static
171Window LLWindowSDL::get_SDL_XWindowID(void)
170{ 172{
171 if (gWindowImplementation) { 173 if (gWindowImplementation) {
172 return gWindowImplementation->mSDL_XWindowID; 174 return gWindowImplementation->mSDL_XWindowID;
@@ -174,7 +176,8 @@ Window get_SDL_XWindowID(void)
174 return None; 176 return None;
175} 177}
176 178
177Display* get_SDL_Display(void) 179//static
180Display* LLWindowSDL::get_SDL_Display(void)
178{ 181{
179 if (gWindowImplementation) { 182 if (gWindowImplementation) {
180 return gWindowImplementation->mSDL_Display; 183 return gWindowImplementation->mSDL_Display;
@@ -1235,7 +1238,7 @@ typedef Atom x11clipboard_type;
1235 */ 1238 */
1236static x11clipboard_type get_x11_readwrite_clipboard_type(void) 1239static x11clipboard_type get_x11_readwrite_clipboard_type(void)
1237{ 1240{
1238 return XInternAtom(get_SDL_Display(), "CLIPBOARD", False); 1241 return XInternAtom(LLWindowSDL::get_SDL_Display(), "CLIPBOARD", False);
1239} 1242}
1240 1243
1241static x11clipboard_type get_x11_write_clipboard_type(void) 1244static x11clipboard_type get_x11_write_clipboard_type(void)
@@ -1248,18 +1251,18 @@ static x11clipboard_type get_x11_write_clipboard_type(void)
1248 storage because their use isn't really defined for holding UTF8. */ 1251 storage because their use isn't really defined for holding UTF8. */
1249static x11clipboard_type get_x11_cutbuffer_clipboard_type(void) 1252static x11clipboard_type get_x11_cutbuffer_clipboard_type(void)
1250{ 1253{
1251 return XInternAtom(get_SDL_Display(), "SECONDLIFE_CUTBUFFER", False); 1254 return XInternAtom(LLWindowSDL::get_SDL_Display(), "SECONDLIFE_CUTBUFFER", False);
1252} 1255}
1253 1256
1254/* Some X11 atom-generators */ 1257/* Some X11 atom-generators */
1255static Atom get_x11_targets_atom(void) 1258static Atom get_x11_targets_atom(void)
1256{ 1259{
1257 return XInternAtom(get_SDL_Display(), "TARGETS", False); 1260 return XInternAtom(LLWindowSDL::get_SDL_Display(), "TARGETS", False);
1258} 1261}
1259 1262
1260static Atom get_x11_text_atom(void) 1263static Atom get_x11_text_atom(void)
1261{ 1264{
1262 return XInternAtom(get_SDL_Display(), "TEXT", False); 1265 return XInternAtom(LLWindowSDL::get_SDL_Display(), "TEXT", False);
1263} 1266}
1264 1267
1265/* These defines, and convert_data/convert_x11clipboard, 1268/* These defines, and convert_data/convert_x11clipboard,
@@ -1544,7 +1547,7 @@ int clipboard_filter_callback(const SDL_Event *event)
1544 sevent.xselection.property = None; 1547 sevent.xselection.property = None;
1545 sevent.xselection.requestor = req->requestor; 1548 sevent.xselection.requestor = req->requestor;
1546 sevent.xselection.time = req->time; 1549 sevent.xselection.time = req->time;
1547 if ( XGetWindowProperty(get_SDL_Display(), DefaultRootWindow(get_SDL_Display()), 1550 if ( XGetWindowProperty(LLWindowSDL::get_SDL_Display(), DefaultRootWindow(LLWindowSDL::get_SDL_Display()),
1548 get_x11_cutbuffer_clipboard_type(), 0, INT_MAX/4, False, req->target, 1551 get_x11_cutbuffer_clipboard_type(), 0, INT_MAX/4, False, req->target,
1549 &sevent.xselection.target, &seln_format, 1552 &sevent.xselection.target, &seln_format,
1550 &nbytes, &overflow, &seln_data) == Success ) 1553 &nbytes, &overflow, &seln_data) == Success )
@@ -1558,7 +1561,7 @@ int clipboard_filter_callback(const SDL_Event *event)
1558 if ( seln_data[nbytes-1] == '\0' ) 1561 if ( seln_data[nbytes-1] == '\0' )
1559 --nbytes; 1562 --nbytes;
1560 } 1563 }
1561 XChangeProperty(get_SDL_Display(), req->requestor, req->property, 1564 XChangeProperty(LLWindowSDL::get_SDL_Display(), req->requestor, req->property,
1562 req->target, seln_format, PropModeReplace, 1565 req->target, seln_format, PropModeReplace,
1563 seln_data, nbytes); 1566 seln_data, nbytes);
1564 sevent.xselection.property = req->property; 1567 sevent.xselection.property = req->property;
@@ -1571,7 +1574,7 @@ int clipboard_filter_callback(const SDL_Event *event)
1571 get_x11_targets_atom() 1574 get_x11_targets_atom()
1572 }; 1575 };
1573 supported[0] = sevent.xselection.target; 1576 supported[0] = sevent.xselection.target;
1574 XChangeProperty(get_SDL_Display(), req->requestor, 1577 XChangeProperty(LLWindowSDL::get_SDL_Display(), req->requestor,
1575 req->property, XA_ATOM, 32, PropModeReplace, 1578 req->property, XA_ATOM, 32, PropModeReplace,
1576 (unsigned char*)supported, 1579 (unsigned char*)supported,
1577 num_supported); 1580 num_supported);
@@ -1584,10 +1587,10 @@ int clipboard_filter_callback(const SDL_Event *event)
1584 XFree(seln_data); 1587 XFree(seln_data);
1585 } 1588 }
1586 int sendret = 1589 int sendret =
1587 XSendEvent(get_SDL_Display(),req->requestor,False,0,&sevent); 1590 XSendEvent(LLWindowSDL::get_SDL_Display(),req->requestor,False,0,&sevent);
1588 if ((sendret==BadValue) || (sendret==BadWindow)) 1591 if ((sendret==BadValue) || (sendret==BadWindow))
1589 llwarns << "Clipboard SendEvent failed" << llendl; 1592 llwarns << "Clipboard SendEvent failed" << llendl;
1590 XSync(get_SDL_Display(), False); 1593 XSync(LLWindowSDL::get_SDL_Display(), False);
1591 } 1594 }
1592 break; 1595 break;
1593 } 1596 }
@@ -1959,17 +1962,14 @@ U32 LLWindowSDL::SDLCheckGrabbyKeys(SDLKey keysym, BOOL gain)
1959 return mGrabbyKeyFlags; 1962 return mGrabbyKeyFlags;
1960} 1963}
1961 1964
1962void LLWindowSDL::gatherInput() 1965// virtual
1966void LLWindowSDL::processMiscNativeEvents()
1963{ 1967{
1964 const Uint32 CLICK_THRESHOLD = 300; // milliseconds 1968#if LL_GTK && (LL_LLMOZLIB_ENABLED || LL_DBUS_ENABLED)
1965 static int leftClick = 0; 1969 // Pump GTK events to avoid starvation for:
1966 static int rightClick = 0; 1970 // * Embedded Gecko
1967 static Uint32 lastLeftDown = 0; 1971 // * DBUS servicing
1968 static Uint32 lastRightDown = 0; 1972 // * Anything else which quietly hooks into the default glib/GTK loop
1969 SDL_Event event;
1970
1971#if LL_GTK && LL_LLMOZLIB_ENABLED
1972 // Pump GTK events so embedded Gecko doesn't starve.
1973 if (ll_try_gtk_init()) 1973 if (ll_try_gtk_init())
1974 { 1974 {
1975 // Yuck, Mozilla's GTK callbacks play with the locale - push/pop 1975 // Yuck, Mozilla's GTK callbacks play with the locale - push/pop
@@ -1992,7 +1992,17 @@ void LLWindowSDL::gatherInput()
1992 1992
1993 setlocale(LC_ALL, saved_locale.c_str() ); 1993 setlocale(LC_ALL, saved_locale.c_str() );
1994 } 1994 }
1995#endif // LL_GTK && LL_LLMOZLIB_ENABLED 1995#endif // LL_GTK && (LL_LLMOZLIB_ENABLED || LL_DBUS_ENABLED)
1996}
1997
1998void LLWindowSDL::gatherInput()
1999{
2000 const Uint32 CLICK_THRESHOLD = 300; // milliseconds
2001 static int leftClick = 0;
2002 static int rightClick = 0;
2003 static Uint32 lastLeftDown = 0;
2004 static Uint32 lastRightDown = 0;
2005 SDL_Event event;
1996 2006
1997 // Handle all outstanding SDL events 2007 // Handle all outstanding SDL events
1998 while (SDL_PollEvent(&event)) 2008 while (SDL_PollEvent(&event))
@@ -2497,12 +2507,10 @@ S32 OSMessageBoxSDL(const std::string& text, const std::string& caption, U32 typ
2497{ 2507{
2498 S32 rtn = OSBTN_CANCEL; 2508 S32 rtn = OSBTN_CANCEL;
2499 2509
2500 ll_try_gtk_init();
2501
2502 if(gWindowImplementation != NULL) 2510 if(gWindowImplementation != NULL)
2503 gWindowImplementation->beforeDialog(); 2511 gWindowImplementation->beforeDialog();
2504 2512
2505 if (ll_try_gtk_init() 2513 if (LLWindowSDL::ll_try_gtk_init()
2506 // We can NOT expect to combine GTK and SDL's aggressive fullscreen 2514 // We can NOT expect to combine GTK and SDL's aggressive fullscreen
2507 && ((NULL==gWindowImplementation) || (!was_fullscreen)) 2515 && ((NULL==gWindowImplementation) || (!was_fullscreen))
2508 ) 2516 )
@@ -2530,7 +2538,8 @@ S32 OSMessageBoxSDL(const std::string& text, const std::string& caption, U32 typ
2530 buttons = GTK_BUTTONS_YES_NO; 2538 buttons = GTK_BUTTONS_YES_NO;
2531 break; 2539 break;
2532 } 2540 }
2533 win = gtk_message_dialog_new(NULL,flags, messagetype, buttons, text.c_str()); 2541 win = gtk_message_dialog_new(NULL, flags, messagetype, buttons, "%s",
2542 text.c_str());
2534 2543
2535# if LL_X11 2544# if LL_X11
2536 // Make GTK tell the window manager to associate this 2545 // Make GTK tell the window manager to associate this
@@ -2754,7 +2763,7 @@ void LLWindowSDL::spawnWebBrowser(const std::string& escaped_url)
2754void *LLWindowSDL::getPlatformWindow() 2763void *LLWindowSDL::getPlatformWindow()
2755{ 2764{
2756#if LL_GTK && LL_LLMOZLIB_ENABLED 2765#if LL_GTK && LL_LLMOZLIB_ENABLED
2757 if (ll_try_gtk_init()) 2766 if (LLWindowSDL::ll_try_gtk_init())
2758 { 2767 {
2759 maybe_lock_display(); 2768 maybe_lock_display();
2760 2769
diff --git a/linden/indra/llwindow/llwindowsdl.h b/linden/indra/llwindow/llwindowsdl.h
index a395ccd..547fe12 100644
--- a/linden/indra/llwindow/llwindowsdl.h
+++ b/linden/indra/llwindow/llwindowsdl.h
@@ -89,6 +89,7 @@ public:
89 /*virtual*/ void setFSAASamples(const U32 samples); 89 /*virtual*/ void setFSAASamples(const U32 samples);
90 /*virtual*/ BOOL restoreGamma(); // Restore original gamma table (before updating gamma) 90 /*virtual*/ BOOL restoreGamma(); // Restore original gamma table (before updating gamma)
91 /*virtual*/ ESwapMethod getSwapMethod() { return mSwapMethod; } 91 /*virtual*/ ESwapMethod getSwapMethod() { return mSwapMethod; }
92 /*virtual*/ void processMiscNativeEvents();
92 /*virtual*/ void gatherInput(); 93 /*virtual*/ void gatherInput();
93 /*virtual*/ void swapBuffers(); 94 /*virtual*/ void swapBuffers();
94 95
@@ -129,6 +130,16 @@ public:
129 void (*Lock_Display)(void); 130 void (*Lock_Display)(void);
130 void (*Unlock_Display)(void); 131 void (*Unlock_Display)(void);
131 132
133#if LL_GTK
134 // Lazily initialize and check the runtime GTK version for goodness.
135 static bool ll_try_gtk_init(void);
136#endif // LL_GTK
137
138#if LL_X11
139 static Window get_SDL_XWindowID(void);
140 static Display* get_SDL_Display(void);
141#endif // LL_X11
142
132protected: 143protected:
133 LLWindowSDL( 144 LLWindowSDL(
134 const std::string& title, int x, int y, int width, int height, U32 flags, 145 const std::string& title, int x, int y, int width, int height, U32 flags,
@@ -205,8 +216,6 @@ private:
205 BOOL mFlashing; 216 BOOL mFlashing;
206 LLTimer mFlashTimer; 217 LLTimer mFlashTimer;
207#endif //LL_X11 218#endif //LL_X11
208
209
210}; 219};
211 220
212 221
@@ -223,16 +232,4 @@ public:
223 232
224S32 OSMessageBoxSDL(const std::string& text, const std::string& caption, U32 type); 233S32 OSMessageBoxSDL(const std::string& text, const std::string& caption, U32 type);
225 234
226void load_url_external(const char* url);
227
228#if LL_GTK
229// Lazily initialize and check the runtime GTK version for goodness.
230BOOL ll_try_gtk_init(void);
231#endif // LL_GTK
232
233#if LL_X11
234Window get_SDL_XWindowID(void);
235Display* get_SDL_Display(void);
236#endif // LL_X11
237
238#endif //LL_LLWINDOWSDL_H 235#endif //LL_LLWINDOWSDL_H
diff --git a/linden/indra/llxml/CMakeLists.txt b/linden/indra/llxml/CMakeLists.txt
index d86bc0d..9febd97 100644
--- a/linden/indra/llxml/CMakeLists.txt
+++ b/linden/indra/llxml/CMakeLists.txt
@@ -34,3 +34,8 @@ set_source_files_properties(${llxml_HEADER_FILES}
34list(APPEND llxml_SOURCE_FILES ${llxml_HEADER_FILES}) 34list(APPEND llxml_SOURCE_FILES ${llxml_HEADER_FILES})
35 35
36add_library (llxml ${llxml_SOURCE_FILES}) 36add_library (llxml ${llxml_SOURCE_FILES})
37target_link_libraries(
38 llxml
39 ${BOOST_SIGNALS_LIBRARY}
40 ${EXPAT_LIBRARIES}
41 )
diff --git a/linden/indra/llxml/llcontrol.cpp b/linden/indra/llxml/llcontrol.cpp
index 8fa58e8..e7bac77 100644
--- a/linden/indra/llxml/llcontrol.cpp
+++ b/linden/indra/llxml/llcontrol.cpp
@@ -50,9 +50,9 @@
50#include "llsdserialize.h" 50#include "llsdserialize.h"
51 51
52#if LL_RELEASE_WITH_DEBUG_INFO || LL_DEBUG 52#if LL_RELEASE_WITH_DEBUG_INFO || LL_DEBUG
53#define CONTROL_ERRS LL_WARNS("ControlErrors")
54#else
55#define CONTROL_ERRS LL_ERRS("ControlErrors") 53#define CONTROL_ERRS LL_ERRS("ControlErrors")
54#else
55#define CONTROL_ERRS LL_WARNS("ControlErrors")
56#endif 56#endif
57 57
58//this defines the current version of the settings file 58//this defines the current version of the settings file
diff --git a/linden/indra/lscript/lscript_byteconvert.h b/linden/indra/lscript/lscript_byteconvert.h
index 9530b63..664a25e 100644
--- a/linden/indra/lscript/lscript_byteconvert.h
+++ b/linden/indra/lscript/lscript_byteconvert.h
@@ -250,7 +250,7 @@ inline void bytestream2vector(LLVector3 &vector, const U8 *stream, S32 &offset)
250 } 250 }
251} 251}
252 252
253inline void vector2bytestream(U8 *stream, S32 &offset, LLVector3 &vector) 253inline void vector2bytestream(U8 *stream, S32 &offset, const LLVector3 &vector)
254{ 254{
255 S32 value = *(S32 *)&vector.mV[VZ]; 255 S32 value = *(S32 *)&vector.mV[VZ];
256 integer2bytestream(stream, offset, value); 256 integer2bytestream(stream, offset, value);
@@ -292,7 +292,7 @@ inline void bytestream2quaternion(LLQuaternion &quat, const U8 *stream, S32 &off
292 } 292 }
293} 293}
294 294
295inline void quaternion2bytestream(U8 *stream, S32 &offset, LLQuaternion &quat) 295inline void quaternion2bytestream(U8 *stream, S32 &offset, const LLQuaternion &quat)
296{ 296{
297 S32 value = *(S32 *)&quat.mQ[VS]; 297 S32 value = *(S32 *)&quat.mQ[VS];
298 integer2bytestream(stream, offset, value); 298 integer2bytestream(stream, offset, value);
@@ -528,7 +528,7 @@ inline void lscript_push(U8 *stream, F32 value)
528 } 528 }
529} 529}
530 530
531inline void lscript_push(U8 *stream, LLVector3 &value) 531inline void lscript_push(U8 *stream, const LLVector3 &value)
532{ 532{
533 S32 sp = get_register(stream, LREG_SP); 533 S32 sp = get_register(stream, LREG_SP);
534 sp -= LSCRIPTDataSize[LST_VECTOR]; 534 sp -= LSCRIPTDataSize[LST_VECTOR];
@@ -539,7 +539,7 @@ inline void lscript_push(U8 *stream, LLVector3 &value)
539 } 539 }
540} 540}
541 541
542inline void lscript_push(U8 *stream, LLQuaternion &value) 542inline void lscript_push(U8 *stream, const LLQuaternion &value)
543{ 543{
544 S32 sp = get_register(stream, LREG_SP); 544 S32 sp = get_register(stream, LREG_SP);
545 sp -= LSCRIPTDataSize[LST_QUATERNION]; 545 sp -= LSCRIPTDataSize[LST_QUATERNION];
@@ -679,13 +679,13 @@ inline void lscript_local_store(U8 *stream, S32 address, F32 value)
679 float2bytestream(stream, address, value); 679 float2bytestream(stream, address, value);
680} 680}
681 681
682inline void lscript_local_store(U8 *stream, S32 address, LLVector3 value) 682inline void lscript_local_store(U8 *stream, S32 address, const LLVector3 value)
683{ 683{
684 if (lscript_check_local(stream, address, LSCRIPTDataSize[LST_VECTOR])) 684 if (lscript_check_local(stream, address, LSCRIPTDataSize[LST_VECTOR]))
685 vector2bytestream(stream, address, value); 685 vector2bytestream(stream, address, value);
686} 686}
687 687
688inline void lscript_local_store(U8 *stream, S32 address, LLQuaternion value) 688inline void lscript_local_store(U8 *stream, S32 address, const LLQuaternion value)
689{ 689{
690 if (lscript_check_local(stream, address, LSCRIPTDataSize[LST_QUATERNION])) 690 if (lscript_check_local(stream, address, LSCRIPTDataSize[LST_QUATERNION]))
691 quaternion2bytestream(stream, address, value); 691 quaternion2bytestream(stream, address, value);
@@ -703,13 +703,13 @@ inline void lscript_global_store(U8 *stream, S32 address, F32 value)
703 float2bytestream(stream, address, value); 703 float2bytestream(stream, address, value);
704} 704}
705 705
706inline void lscript_global_store(U8 *stream, S32 address, LLVector3 value) 706inline void lscript_global_store(U8 *stream, S32 address, const LLVector3 value)
707{ 707{
708 if (lscript_check_global(stream, address, LSCRIPTDataSize[LST_VECTOR])) 708 if (lscript_check_global(stream, address, LSCRIPTDataSize[LST_VECTOR]))
709 vector2bytestream(stream, address, value); 709 vector2bytestream(stream, address, value);
710} 710}
711 711
712inline void lscript_global_store(U8 *stream, S32 address, LLQuaternion value) 712inline void lscript_global_store(U8 *stream, S32 address, const LLQuaternion value)
713{ 713{
714 if (lscript_check_global(stream, address, LSCRIPTDataSize[LST_QUATERNION])) 714 if (lscript_check_global(stream, address, LSCRIPTDataSize[LST_QUATERNION]))
715 quaternion2bytestream(stream, address, value); 715 quaternion2bytestream(stream, address, value);
@@ -1125,7 +1125,7 @@ inline void safe_instruction_bytestream2vector(LLVector3 &value, U8 *stream, S32
1125 } 1125 }
1126} 1126}
1127 1127
1128inline void safe_instruction_vector2bytestream(U8 *stream, S32 &offset, LLVector3 &value) 1128inline void safe_instruction_vector2bytestream(U8 *stream, S32 &offset, const LLVector3 &value)
1129{ 1129{
1130 if (safe_instruction_check_address(stream, offset, LSCRIPTDataSize[LST_VECTOR])) 1130 if (safe_instruction_check_address(stream, offset, LSCRIPTDataSize[LST_VECTOR]))
1131 { 1131 {
@@ -1141,7 +1141,7 @@ inline void safe_instruction_bytestream2quaternion(LLQuaternion &value, U8 *stre
1141 } 1141 }
1142} 1142}
1143 1143
1144inline void safe_instruction_quaternion2bytestream(U8 *stream, S32 &offset, LLQuaternion &value) 1144inline void safe_instruction_quaternion2bytestream(U8 *stream, S32 &offset, const LLQuaternion &value)
1145{ 1145{
1146 if (safe_instruction_check_address(stream, offset, LSCRIPTDataSize[LST_QUATERNION])) 1146 if (safe_instruction_check_address(stream, offset, LSCRIPTDataSize[LST_QUATERNION]))
1147 { 1147 {
diff --git a/linden/indra/lscript/lscript_byteformat.h b/linden/indra/lscript/lscript_byteformat.h
index 1f201d8..fa82e6b 100644
--- a/linden/indra/lscript/lscript_byteformat.h
+++ b/linden/indra/lscript/lscript_byteformat.h
@@ -470,6 +470,7 @@ const U8 LSCRIPTTypeHi4Bits[LST_EOF] =
470 LST_VECTOR << 4, 470 LST_VECTOR << 4,
471 LST_QUATERNION << 4, 471 LST_QUATERNION << 4,
472 LST_LIST << 4, 472 LST_LIST << 4,
473 LST_UNDEFINED << 4,
473}; 474};
474 475
475const char * const LSCRIPTTypeNames[LST_EOF] = /*Flawfinder: ignore*/ 476const char * const LSCRIPTTypeNames[LST_EOF] = /*Flawfinder: ignore*/
diff --git a/linden/indra/lscript/lscript_compile/lscript_tree.cpp b/linden/indra/lscript/lscript_compile/lscript_tree.cpp
index 71e7f19..f62b4e7 100644
--- a/linden/indra/lscript/lscript_compile/lscript_tree.cpp
+++ b/linden/indra/lscript/lscript_compile/lscript_tree.cpp
@@ -46,7 +46,8 @@
46 46
47static void print_cil_box(LLFILE* fp, LSCRIPTType type) 47static void print_cil_box(LLFILE* fp, LSCRIPTType type)
48{ 48{
49 switch(type) 49
50switch(type)
50 { 51 {
51 case LST_INTEGER: 52 case LST_INTEGER:
52 fprintf(fp, "box [mscorlib]System.Int32\n"); 53 fprintf(fp, "box [mscorlib]System.Int32\n");
@@ -1257,10 +1258,10 @@ static void print_cil_init_variable(LLFILE* fp, LSCRIPTType type)
1257 fprintf(fp, "call class [ScriptTypes]LindenLab.SecondLife.Vector class [LslUserScript]LindenLab.SecondLife.LslUserScript::'CreateVector'(float32, float32, float32)\n"); 1258 fprintf(fp, "call class [ScriptTypes]LindenLab.SecondLife.Vector class [LslUserScript]LindenLab.SecondLife.LslUserScript::'CreateVector'(float32, float32, float32)\n");
1258 break; 1259 break;
1259 case LST_QUATERNION: 1260 case LST_QUATERNION:
1260 fprintf(fp, "ldc.r8 1\n");
1261 fprintf(fp, "ldc.r8 0\n"); 1261 fprintf(fp, "ldc.r8 0\n");
1262 fprintf(fp, "ldc.r8 0\n"); 1262 fprintf(fp, "ldc.r8 0\n");
1263 fprintf(fp, "ldc.r8 0\n"); 1263 fprintf(fp, "ldc.r8 0\n");
1264 fprintf(fp, "ldc.r8 1\n");
1264 fprintf(fp, "call class [ScriptTypes]LindenLab.SecondLife.Quaternion class [LslUserScript]LindenLab.SecondLife.LslUserScript::'CreateQuaternion'(float32, float32, float32, float32)\n"); 1265 fprintf(fp, "call class [ScriptTypes]LindenLab.SecondLife.Quaternion class [LslUserScript]LindenLab.SecondLife.LslUserScript::'CreateQuaternion'(float32, float32, float32, float32)\n");
1265 break; 1266 break;
1266 case LST_LIST: 1267 case LST_LIST:
@@ -3517,7 +3518,7 @@ void LLScriptRezEvent::recurse(LLFILE *fp, S32 tabs, S32 tabsize, LSCRIPTCompile
3517 fprintf(fp, " )\n"); 3518 fprintf(fp, " )\n");
3518 break; 3519 break;
3519 case LSCP_SCOPE_PASS1: 3520 case LSCP_SCOPE_PASS1:
3520 checkForDuplicateHandler(fp, this, scope, "rez"); 3521 checkForDuplicateHandler(fp, this, scope, "on_rez");
3521 if (scope->checkEntry(mStartParam->mName)) 3522 if (scope->checkEntry(mStartParam->mName))
3522 { 3523 {
3523 gErrorToText.writeError(fp, this, LSERROR_DUPLICATE_NAME); 3524 gErrorToText.writeError(fp, this, LSERROR_DUPLICATE_NAME);
@@ -7885,10 +7886,10 @@ void LLScriptFunctionCall::recurse(LLFILE *fp, S32 tabs, S32 tabsize, LSCRIPTCom
7885 { 7886 {
7886 // Prefix function name with g to distinguish from 7887 // Prefix function name with g to distinguish from
7887 // event handlers. 7888 // event handlers.
7888 fprintf(fp, gScriptp->getClassName()); 7889 fprintf(fp, "%s", gScriptp->getClassName());
7889 fprintf(fp, "::'g"); 7890 fprintf(fp, "::'g");
7890 } 7891 }
7891 fprintf(fp, mIdentifier->mName); 7892 fprintf(fp, "%s", mIdentifier->mName);
7892 fprintf(fp, "'("); 7893 fprintf(fp, "'(");
7893 print_cil_arg_list(fp, mIdentifier->mScopeEntry->mFunctionArgs); 7894 print_cil_arg_list(fp, mIdentifier->mScopeEntry->mFunctionArgs);
7894 fprintf(fp, ")\n"); 7895 fprintf(fp, ")\n");
@@ -8689,8 +8690,12 @@ void LLScriptIf::recurse(LLFILE *fp, S32 tabs, S32 tabsize, LSCRIPTCompilePass p
8689 break; 8690 break;
8690 case LSCP_TYPE: 8691 case LSCP_TYPE:
8691 mExpression->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL); 8692 mExpression->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
8693 if (type == LST_NULL)
8694 {
8695 gErrorToText.writeError(fp, mExpression, LSERROR_TYPE_MISMATCH);
8696 }
8692 mType = type; 8697 mType = type;
8693 mStatement->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL); 8698 mStatement->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
8694 break; 8699 break;
8695 case LSCP_EMIT_BYTE_CODE: 8700 case LSCP_EMIT_BYTE_CODE:
8696 { 8701 {
@@ -8770,6 +8775,10 @@ void LLScriptIfElse::recurse(LLFILE *fp, S32 tabs, S32 tabsize, LSCRIPTCompilePa
8770 break; 8775 break;
8771 case LSCP_TYPE: 8776 case LSCP_TYPE:
8772 mExpression->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL); 8777 mExpression->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
8778 if (type == LST_NULL)
8779 {
8780 gErrorToText.writeError(fp, mExpression, LSERROR_TYPE_MISMATCH);
8781 }
8773 mType = type; 8782 mType = type;
8774 mStatement1->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL); 8783 mStatement1->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
8775 mStatement2->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL); 8784 mStatement2->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
@@ -8869,6 +8878,10 @@ void LLScriptFor::recurse(LLFILE *fp, S32 tabs, S32 tabsize, LSCRIPTCompilePass
8869 if(mSequence) 8878 if(mSequence)
8870 mSequence->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL); 8879 mSequence->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
8871 mExpression->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL); 8880 mExpression->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
8881 if (type == LST_NULL)
8882 {
8883 gErrorToText.writeError(fp, mExpression, LSERROR_TYPE_MISMATCH);
8884 }
8872 mType = type; 8885 mType = type;
8873 if(mExpressionList) 8886 if(mExpressionList)
8874 mExpressionList->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL); 8887 mExpressionList->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
@@ -8968,6 +8981,10 @@ void LLScriptDoWhile::recurse(LLFILE *fp, S32 tabs, S32 tabsize, LSCRIPTCompileP
8968 case LSCP_TYPE: 8981 case LSCP_TYPE:
8969 mStatement->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL); 8982 mStatement->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
8970 mExpression->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL); 8983 mExpression->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
8984 if (type == LST_NULL)
8985 {
8986 gErrorToText.writeError(fp, mExpression, LSERROR_TYPE_MISMATCH);
8987 }
8971 mType = type; 8988 mType = type;
8972 break; 8989 break;
8973 case LSCP_EMIT_BYTE_CODE: 8990 case LSCP_EMIT_BYTE_CODE:
@@ -9039,6 +9056,10 @@ void LLScriptWhile::recurse(LLFILE *fp, S32 tabs, S32 tabsize, LSCRIPTCompilePas
9039 break; 9056 break;
9040 case LSCP_TYPE: 9057 case LSCP_TYPE:
9041 mExpression->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL); 9058 mExpression->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
9059 if (type == LST_NULL)
9060 {
9061 gErrorToText.writeError(fp, mExpression, LSERROR_TYPE_MISMATCH);
9062 }
9042 mType = type; 9063 mType = type;
9043 mStatement->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL); 9064 mStatement->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
9044 break; 9065 break;
@@ -9720,7 +9741,7 @@ void LLScriptEventHandler::recurse(LLFILE *fp, S32 tabs, S32 tabsize, LSCRIPTCom
9720 // Allows state changing by finding handlers prefixed with new 9741 // Allows state changing by finding handlers prefixed with new
9721 // state name. Prefix disambiguates functions and event handlers. 9742 // state name. Prefix disambiguates functions and event handlers.
9722 fprintf(fp, "e"); 9743 fprintf(fp, "e");
9723 fprintf(fp, entry->mIdentifier); 9744 fprintf(fp, "%s", entry->mIdentifier);
9724 9745
9725 // Handler name and arguments. 9746 // Handler name and arguments.
9726 mEventp->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL); 9747 mEventp->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, chunk, heap, stacksize, entry, entrycount, NULL);
@@ -10152,7 +10173,7 @@ void LLScriptGlobalFunctions::recurse(LLFILE *fp, S32 tabs, S32 tabsize, LSCRIPT
10152 fprintf(fp, ".method public hidebysig instance default "); 10173 fprintf(fp, ".method public hidebysig instance default ");
10153 print_cil_type(fp, mType ? mType->mType : LST_NULL); 10174 print_cil_type(fp, mType ? mType->mType : LST_NULL);
10154 fprintf(fp, " 'g"); 10175 fprintf(fp, " 'g");
10155 fprintf(fp, mIdentifier->mName); 10176 fprintf(fp, "%s", mIdentifier->mName);
10156 fprintf(fp, "'"); 10177 fprintf(fp, "'");
10157 if (mParameters) 10178 if (mParameters)
10158 { 10179 {
diff --git a/linden/indra/lscript/lscript_execute.h b/linden/indra/lscript/lscript_execute.h
index ac23ff3..77e9c21 100644
--- a/linden/indra/lscript/lscript_execute.h
+++ b/linden/indra/lscript/lscript_execute.h
@@ -370,7 +370,7 @@ public:
370 LLScriptExecute(); 370 LLScriptExecute();
371 virtual ~LLScriptExecute() {;} 371 virtual ~LLScriptExecute() {;}
372 372
373 virtual S32 getVersion() = 0; 373 virtual S32 getVersion() const = 0;
374 virtual void deleteAllEvents() = 0; 374 virtual void deleteAllEvents() = 0;
375 virtual void addEvent(LLScriptDataCollection* event) = 0; 375 virtual void addEvent(LLScriptDataCollection* event) = 0;
376 virtual U32 getEventCount() = 0; 376 virtual U32 getEventCount() = 0;
@@ -384,12 +384,12 @@ public:
384 virtual void setSleep(F32 value) = 0; 384 virtual void setSleep(F32 value) = 0;
385 virtual F32 getEnergy() const = 0; 385 virtual F32 getEnergy() const = 0;
386 virtual void setEnergy(F32 value) = 0; 386 virtual void setEnergy(F32 value) = 0;
387 virtual U64 getCurrentEvents(S32 version) = 0; 387 virtual U64 getCurrentEvents() = 0;
388 virtual void setCurrentEvents(U64 value, S32 version) = 0; 388 virtual void setCurrentEvents(U64 value) = 0;
389 virtual U64 getEventHandlers(S32 version) = 0; 389 virtual U64 getEventHandlers() = 0;
390 virtual void setEventHandlers(U64 value, S32 version) = 0; 390 virtual void setEventHandlers(U64 value) = 0;
391 virtual U64 getCurrentHandler(S32 version) = 0; 391 virtual U64 getCurrentHandler() = 0;
392 virtual void setCurrentHandler(U64 value, S32 version) = 0; 392 virtual void setCurrentHandler(U64 value) = 0;
393 virtual BOOL isFinished() const = 0; 393 virtual BOOL isFinished() const = 0;
394 virtual BOOL isStateChangePending() const = 0; 394 virtual BOOL isStateChangePending() const = 0;
395 virtual S32 writeState(U8 **dest, U32 header_size, U32 footer_size) = 0; // Allocate memory for header, state and footer return size of state. 395 virtual S32 writeState(U8 **dest, U32 header_size, U32 footer_size) = 0; // Allocate memory for header, state and footer return size of state.
@@ -409,17 +409,17 @@ public:
409 409
410 // Run handler for event for a maximum of time_slice seconds. 410 // Run handler for event for a maximum of time_slice seconds.
411 // Updates current handler and current events registers. 411 // Updates current handler and current events registers.
412 virtual void callEventHandler(LSCRIPTStateEventType event, S32 major_version, const LLUUID &id, F32 time_slice) = 0;; 412 virtual void callEventHandler(LSCRIPTStateEventType event, const LLUUID &id, F32 time_slice) = 0;;
413 413
414 // Run handler for next queued event for maximum of time_slice seconds. 414 // Run handler for next queued event for maximum of time_slice seconds.
415 // Updates current handler and current events registers. 415 // Updates current handler and current events registers.
416 // Removes processed event from queue. 416 // Removes processed event from queue.
417 virtual void callNextQueuedEventHandler(U64 event_register, S32 major_version, const LLUUID &id, F32 time_slice) = 0; 417 virtual void callNextQueuedEventHandler(U64 event_register, const LLUUID &id, F32 time_slice) = 0;
418 418
419 // Run handler for event for a maximum of time_slice seconds. 419 // Run handler for event for a maximum of time_slice seconds.
420 // Updates current handler and current events registers. 420 // Updates current handler and current events registers.
421 // Removes processed event from queue. 421 // Removes processed event from queue.
422 virtual void callQueuedEventHandler(LSCRIPTStateEventType event, S32 major_version, const LLUUID &id, F32 time_slice) = 0; 422 virtual void callQueuedEventHandler(LSCRIPTStateEventType event, const LLUUID &id, F32 time_slice) = 0;
423 423
424 // Switch to next state. 424 // Switch to next state.
425 // Returns new set of handled events. 425 // Returns new set of handled events.
@@ -428,14 +428,14 @@ public:
428 // Returns time taken. 428 // Returns time taken.
429 virtual F32 runQuanta(BOOL b_print, const LLUUID &id, 429 virtual F32 runQuanta(BOOL b_print, const LLUUID &id,
430 const char **errorstr, 430 const char **errorstr,
431 BOOL &state_transition, F32 quanta, 431 F32 quanta,
432 U32& events_processed, LLTimer& timer); 432 U32& events_processed, LLTimer& timer);
433 433
434 // Run smallest possible amount of code: an instruction for LSL2, a segment 434 // Run smallest possible amount of code: an instruction for LSL2, a segment
435 // between save tests for Mono 435 // between save tests for Mono
436 void runInstructions(BOOL b_print, const LLUUID &id, 436 void runInstructions(BOOL b_print, const LLUUID &id,
437 const char **errorstr, 437 const char **errorstr,
438 BOOL &state_transition, U32& events_processed, 438 U32& events_processed,
439 F32 quanta); 439 F32 quanta);
440 440
441 bool isYieldDue() const; 441 bool isYieldDue() const;
@@ -443,6 +443,12 @@ public:
443 void setReset(BOOL b) {mReset = b;} 443 void setReset(BOOL b) {mReset = b;}
444 BOOL getReset() const { return mReset; } 444 BOOL getReset() const { return mReset; }
445 445
446 // Called when the script is scheduled to be run from newsim/LLScriptData
447 virtual void startRunning() = 0;
448
449 // Called when the script is scheduled to be stopped from newsim/LLScriptData
450 virtual void stopRunning() = 0;
451
446private: 452private:
447 453
448 BOOL mReset; 454 BOOL mReset;
@@ -455,7 +461,7 @@ public:
455 LLScriptExecuteLSL2(const U8* bytecode, U32 bytecode_size); 461 LLScriptExecuteLSL2(const U8* bytecode, U32 bytecode_size);
456 virtual ~LLScriptExecuteLSL2(); 462 virtual ~LLScriptExecuteLSL2();
457 463
458 virtual S32 getVersion() {return get_register(mBuffer, LREG_VN);} 464 virtual S32 getVersion() const {return get_register(mBuffer, LREG_VN);}
459 virtual void deleteAllEvents() {mEventData.mEventDataList.deleteAllData();} 465 virtual void deleteAllEvents() {mEventData.mEventDataList.deleteAllData();}
460 virtual void addEvent(LLScriptDataCollection* event); 466 virtual void addEvent(LLScriptDataCollection* event);
461 virtual U32 getEventCount() {return mEventData.mEventDataList.getLength();} 467 virtual U32 getEventCount() {return mEventData.mEventDataList.getLength();}
@@ -469,12 +475,12 @@ public:
469 virtual void setSleep(F32 value); 475 virtual void setSleep(F32 value);
470 virtual F32 getEnergy() const; 476 virtual F32 getEnergy() const;
471 virtual void setEnergy(F32 value); 477 virtual void setEnergy(F32 value);
472 virtual U64 getCurrentEvents(S32 version) {return get_event_register(mBuffer, LREG_CE, version);} 478 virtual U64 getCurrentEvents() {return get_event_register(mBuffer, LREG_CE, getMajorVersion());}
473 virtual void setCurrentEvents(U64 value, S32 version) {return set_event_register(mBuffer, LREG_CE, value, version);} 479 virtual void setCurrentEvents(U64 value) {return set_event_register(mBuffer, LREG_CE, value, getMajorVersion());}
474 virtual U64 getEventHandlers(S32 version) {return get_event_register(mBuffer, LREG_ER, version);} 480 virtual U64 getEventHandlers() {return get_event_register(mBuffer, LREG_ER, getMajorVersion());}
475 virtual void setEventHandlers(U64 value, S32 version) {set_event_register(mBuffer, LREG_ER, value, version);} 481 virtual void setEventHandlers(U64 value) {set_event_register(mBuffer, LREG_ER, value, getMajorVersion());}
476 virtual U64 getCurrentHandler(S32 version); 482 virtual U64 getCurrentHandler();
477 virtual void setCurrentHandler(U64 value, S32 version) {return set_event_register(mBuffer, LREG_IE, value, version);} 483 virtual void setCurrentHandler(U64 value) {return set_event_register(mBuffer, LREG_IE, value, getMajorVersion());}
478 virtual BOOL isFinished() const {return get_register(mBuffer, LREG_IP) == 0;} 484 virtual BOOL isFinished() const {return get_register(mBuffer, LREG_IP) == 0;}
479 virtual BOOL isStateChangePending() const {return get_register(mBuffer, LREG_CS) != get_register(mBuffer, LREG_NS);} 485 virtual BOOL isStateChangePending() const {return get_register(mBuffer, LREG_CS) != get_register(mBuffer, LREG_NS);}
480 virtual S32 writeState(U8 **dest, U32 header_size, U32 footer_size); // Not including Events. 486 virtual S32 writeState(U8 **dest, U32 header_size, U32 footer_size); // Not including Events.
@@ -494,17 +500,17 @@ public:
494 500
495 // Run handler for event for a maximum of time_slice seconds. 501 // Run handler for event for a maximum of time_slice seconds.
496 // Updates current handler and current events registers. 502 // Updates current handler and current events registers.
497 virtual void callEventHandler(LSCRIPTStateEventType event, S32 major_version, const LLUUID &id, F32 time_slice); 503 virtual void callEventHandler(LSCRIPTStateEventType event, const LLUUID &id, F32 time_slice);
498 504
499 // Run handler for next queued event for maximum of time_slice seconds. 505 // Run handler for next queued event for maximum of time_slice seconds.
500 // Updates current handler and current events registers. 506 // Updates current handler and current events registers.
501 // Removes processed event from queue. 507 // Removes processed event from queue.
502 virtual void callNextQueuedEventHandler(U64 event_register, S32 major_version, const LLUUID &id, F32 time_slice); 508 virtual void callNextQueuedEventHandler(U64 event_register, const LLUUID &id, F32 time_slice);
503 509
504 // Run handler for event for a maximum of time_slice seconds. 510 // Run handler for event for a maximum of time_slice seconds.
505 // Updates current handler and current events registers. 511 // Updates current handler and current events registers.
506 // Removes processed event from queue. 512 // Removes processed event from queue.
507 virtual void callQueuedEventHandler(LSCRIPTStateEventType event, S32 major_version, const LLUUID &id, F32 time_slice); 513 virtual void callQueuedEventHandler(LSCRIPTStateEventType event, const LLUUID &id, F32 time_slice);
508 514
509 // Switch to next state. 515 // Switch to next state.
510 // Returns new set of handled events. 516 // Returns new set of handled events.
@@ -521,8 +527,15 @@ public:
521 U32 mBytecodeSize; 527 U32 mBytecodeSize;
522 528
523private: 529private:
530 S32 getMajorVersion() const;
524 void recordBoundaryError( const LLUUID &id ); 531 void recordBoundaryError( const LLUUID &id );
525 void setStateEventOpcoodeStartSafely( S32 state, LSCRIPTStateEventType event, const LLUUID &id ); 532 void setStateEventOpcoodeStartSafely( S32 state, LSCRIPTStateEventType event, const LLUUID &id );
533
534 // Called when the script is scheduled to be run from newsim/LLScriptData
535 virtual void startRunning();
536
537 // Called when the script is scheduled to be stopped from newsim/LLScriptData
538 virtual void stopRunning();
526}; 539};
527 540
528#endif 541#endif
diff --git a/linden/indra/lscript/lscript_execute/lscript_execute.cpp b/linden/indra/lscript/lscript_execute/lscript_execute.cpp
index 3adfe32..2a6f7e3 100644
--- a/linden/indra/lscript/lscript_execute/lscript_execute.cpp
+++ b/linden/indra/lscript/lscript_execute/lscript_execute.cpp
@@ -60,6 +60,9 @@ const char* LSCRIPTRunTimeFaultStrings[LSRF_EOF] = /*Flawfinder: ignore*/
60 "CLI Exception" // LSRF_CLI 60 "CLI Exception" // LSRF_CLI
61}; 61};
62 62
63void LLScriptExecuteLSL2::startRunning() {}
64void LLScriptExecuteLSL2::stopRunning() {}
65
63LLScriptExecuteLSL2::LLScriptExecuteLSL2(LLFILE *fp) 66LLScriptExecuteLSL2::LLScriptExecuteLSL2(LLFILE *fp)
64{ 67{
65 U8 sizearray[4]; 68 U8 sizearray[4];
@@ -327,8 +330,9 @@ void LLScriptExecuteLSL2::resumeEventHandler(BOOL b_print, const LLUUID &id, F32
327 // NOTE: Babbage: all mExecuteFuncs return false. 330 // NOTE: Babbage: all mExecuteFuncs return false.
328} 331}
329 332
330void LLScriptExecuteLSL2::callEventHandler(LSCRIPTStateEventType event, S32 major_version, const LLUUID &id, F32 time_slice) 333void LLScriptExecuteLSL2::callEventHandler(LSCRIPTStateEventType event, const LLUUID &id, F32 time_slice)
331{ 334{
335 S32 major_version = getMajorVersion();
332 // push a zero to be popped 336 // push a zero to be popped
333 lscript_push(mBuffer, 0); 337 lscript_push(mBuffer, 0);
334 // push sp as current bp 338 // push sp as current bp
@@ -403,8 +407,9 @@ void LLScriptExecuteLSL2::callEventHandler(LSCRIPTStateEventType event, S32 majo
403// set_ip(mBuffer, opcode_start); 407// set_ip(mBuffer, opcode_start);
404//} 408//}
405 409
406void LLScriptExecuteLSL2::callQueuedEventHandler(LSCRIPTStateEventType event, S32 major_version, const LLUUID &id, F32 time_slice) 410void LLScriptExecuteLSL2::callQueuedEventHandler(LSCRIPTStateEventType event, const LLUUID &id, F32 time_slice)
407{ 411{
412 S32 major_version = getMajorVersion();
408 LLScriptDataCollection* eventdata; 413 LLScriptDataCollection* eventdata;
409 414
410 for (eventdata = mEventData.mEventDataList.getFirstData(); eventdata; eventdata = mEventData.mEventDataList.getNextData()) 415 for (eventdata = mEventData.mEventDataList.getFirstData(); eventdata; eventdata = mEventData.mEventDataList.getNextData())
@@ -452,8 +457,9 @@ void LLScriptExecuteLSL2::callQueuedEventHandler(LSCRIPTStateEventType event, S3
452 } 457 }
453} 458}
454 459
455void LLScriptExecuteLSL2::callNextQueuedEventHandler(U64 event_register, S32 major_version, const LLUUID &id, F32 time_slice) 460void LLScriptExecuteLSL2::callNextQueuedEventHandler(U64 event_register, const LLUUID &id, F32 time_slice)
456{ 461{
462 S32 major_version = getMajorVersion();
457 LLScriptDataCollection* eventdata = mEventData.getNextEvent(); 463 LLScriptDataCollection* eventdata = mEventData.getNextEvent();
458 if (eventdata) 464 if (eventdata)
459 { 465 {
@@ -541,9 +547,9 @@ void LLScriptExecuteLSL2::setSleep(F32 value)
541} 547}
542 548
543//virtual 549//virtual
544U64 LLScriptExecuteLSL2::getCurrentHandler(S32 version) 550U64 LLScriptExecuteLSL2::getCurrentHandler()
545{ 551{
546 return get_event_register(mBuffer, LREG_IE, version); 552 return get_event_register(mBuffer, LREG_IE, getMajorVersion());
547} 553}
548 554
549//virtual 555//virtual
@@ -724,6 +730,20 @@ void LLScriptExecuteLSL2::reset()
724 bytestream2bytestream(mBuffer, dest_offset, src, src_offset, size); 730 bytestream2bytestream(mBuffer, dest_offset, src, src_offset, size);
725} 731}
726 732
733S32 LLScriptExecuteLSL2::getMajorVersion() const
734{
735 S32 version = getVersion();
736 S32 major_version = 0;
737 if (version == LSL2_VERSION1_END_NUMBER){
738 major_version = 1;
739 }
740 else if (version == LSL2_VERSION_NUMBER)
741 {
742 major_version = 2;
743 }
744 return major_version;
745}
746
727LLScriptExecute::LLScriptExecute() : 747LLScriptExecute::LLScriptExecute() :
728 mReset(FALSE) 748 mReset(FALSE)
729{ 749{
@@ -751,6 +771,10 @@ bool LLScriptExecute::isYieldDue() const
751 return true; 771 return true;
752 } 772 }
753 773
774 // State changes can occur within a single time slice,
775 // but LLScriptData's clean up is required. Yield here
776 // to allow LLScriptData to perform cleanup and then call
777 // runQuanta again.
754 if(isStateChangePending()) 778 if(isStateChangePending())
755 { 779 {
756 return true; 780 return true;
@@ -763,7 +787,6 @@ bool LLScriptExecute::isYieldDue() const
763// a single instruction for LSL2, a segment between save tests for Mono 787// a single instruction for LSL2, a segment between save tests for Mono
764void LLScriptExecute::runInstructions(BOOL b_print, const LLUUID &id, 788void LLScriptExecute::runInstructions(BOOL b_print, const LLUUID &id,
765 const char **errorstr, 789 const char **errorstr,
766 BOOL &state_transition,
767 U32& events_processed, 790 U32& events_processed,
768 F32 quanta) 791 F32 quanta)
769{ 792{
@@ -806,17 +829,15 @@ void LLScriptExecute::runInstructions(BOOL b_print, const LLUUID &id,
806 else 829 else
807 { 830 {
808 // make sure that IE is zero 831 // make sure that IE is zero
809 setCurrentHandler(0, major_version); 832 setCurrentHandler(0);
810 833
811 // if no, we're in a state and waiting for an event 834 // if no, we're in a state and waiting for an event
812 U64 current_events = getCurrentEvents(major_version); 835 U64 current_events = getCurrentEvents();
813 U64 event_register = getEventHandlers(major_version); 836 U64 event_register = getEventHandlers();
814 837
815 // check NS to see if need to switch states (NS != CS) 838 // check NS to see if need to switch states (NS != CS)
816 if (isStateChangePending()) 839 if (isStateChangePending())
817 { 840 {
818 state_transition = TRUE;
819
820 // ok, blow away any pending events 841 // ok, blow away any pending events
821 deleteAllEvents(); 842 deleteAllEvents();
822 843
@@ -824,16 +845,16 @@ void LLScriptExecute::runInstructions(BOOL b_print, const LLUUID &id,
824 if (current_events & LSCRIPTStateBitField[LSTT_STATE_EXIT]) 845 if (current_events & LSCRIPTStateBitField[LSTT_STATE_EXIT])
825 { 846 {
826 // if yes, clear state exit flag 847 // if yes, clear state exit flag
827 setCurrentHandler(LSCRIPTStateBitField[LSTT_STATE_EXIT], major_version); 848 setCurrentHandler(LSCRIPTStateBitField[LSTT_STATE_EXIT]);
828 current_events &= ~LSCRIPTStateBitField[LSTT_STATE_EXIT]; 849 current_events &= ~LSCRIPTStateBitField[LSTT_STATE_EXIT];
829 setCurrentEvents(current_events, major_version); 850 setCurrentEvents(current_events);
830 851
831 // check state exit event handler 852 // check state exit event handler
832 // if there is a handler, call it 853 // if there is a handler, call it
833 if (event_register & LSCRIPTStateBitField[LSTT_STATE_EXIT]) 854 if (event_register & LSCRIPTStateBitField[LSTT_STATE_EXIT])
834 { 855 {
835 ++events_processed; 856 ++events_processed;
836 callEventHandler(LSTT_STATE_EXIT, major_version, id, quanta); 857 callEventHandler(LSTT_STATE_EXIT, id, quanta);
837 return; 858 return;
838 } 859 }
839 } 860 }
@@ -841,32 +862,32 @@ void LLScriptExecute::runInstructions(BOOL b_print, const LLUUID &id,
841 // if no handler or no state exit flag switch to new state 862 // if no handler or no state exit flag switch to new state
842 // set state entry flag and clear other CE flags 863 // set state entry flag and clear other CE flags
843 current_events = LSCRIPTStateBitField[LSTT_STATE_ENTRY]; 864 current_events = LSCRIPTStateBitField[LSTT_STATE_ENTRY];
844 setCurrentEvents(current_events, major_version); 865 setCurrentEvents(current_events);
845 866
846 U64 handled_events = nextState(); 867 U64 handled_events = nextState();
847 setEventHandlers(handled_events, major_version); 868 setEventHandlers(handled_events);
848 } 869 }
849 870
850 // try to get next event from stack 871 // try to get next event from stack
851 BOOL b_done = FALSE; 872 BOOL b_done = FALSE;
852 LSCRIPTStateEventType event = LSTT_NULL; 873 LSCRIPTStateEventType event = LSTT_NULL;
853 874
854 current_events = getCurrentEvents(major_version); 875 current_events = getCurrentEvents();
855 event_register = getEventHandlers(major_version); 876 event_register = getEventHandlers();
856 877
857 // first, check to see if state_entry or onrez are raised and handled 878 // first, check to see if state_entry or onrez are raised and handled
858 if ((current_events & LSCRIPTStateBitField[LSTT_STATE_ENTRY]) 879 if ((current_events & LSCRIPTStateBitField[LSTT_STATE_ENTRY])
859 &&(current_events & event_register)) 880 &&(current_events & event_register))
860 { 881 {
861 ++events_processed; 882 ++events_processed;
862 callEventHandler(LSTT_STATE_ENTRY, major_version, id, quanta); 883 callEventHandler(LSTT_STATE_ENTRY, id, quanta);
863 b_done = TRUE; 884 b_done = TRUE;
864 } 885 }
865 else if ((current_events & LSCRIPTStateBitField[LSTT_REZ]) 886 else if ((current_events & LSCRIPTStateBitField[LSTT_REZ])
866 &&(current_events & event_register)) 887 &&(current_events & event_register))
867 { 888 {
868 ++events_processed; 889 ++events_processed;
869 callQueuedEventHandler(LSTT_REZ, major_version, id, quanta); 890 callQueuedEventHandler(LSTT_REZ, id, quanta);
870 b_done = TRUE; 891 b_done = TRUE;
871 } 892 }
872 893
@@ -876,7 +897,7 @@ void LLScriptExecute::runInstructions(BOOL b_print, const LLUUID &id,
876 if(getEventCount() > 0) 897 if(getEventCount() > 0)
877 { 898 {
878 ++events_processed; 899 ++events_processed;
879 callNextQueuedEventHandler(event_register, major_version, id, quanta); 900 callNextQueuedEventHandler(event_register, id, quanta);
880 b_done = TRUE; 901 b_done = TRUE;
881 } 902 }
882 else 903 else
@@ -887,7 +908,7 @@ void LLScriptExecute::runInstructions(BOOL b_print, const LLUUID &id,
887 { 908 {
888 event = return_first_event((S32)handled_current); 909 event = return_first_event((S32)handled_current);
889 ++events_processed; 910 ++events_processed;
890 callEventHandler(event, major_version, id, quanta); 911 callEventHandler(event, id, quanta);
891 } 912 }
892 b_done = TRUE; 913 b_done = TRUE;
893 } 914 }
@@ -895,8 +916,8 @@ void LLScriptExecute::runInstructions(BOOL b_print, const LLUUID &id,
895 } 916 }
896} 917}
897 918
898// Run for a single timeslice, or until a yield is due 919// Run for a single timeslice, or until a yield or state transition is due
899F32 LLScriptExecute::runQuanta(BOOL b_print, const LLUUID &id, const char **errorstr, BOOL &state_transition, F32 quanta, U32& events_processed, LLTimer& timer) 920F32 LLScriptExecute::runQuanta(BOOL b_print, const LLUUID &id, const char **errorstr, F32 quanta, U32& events_processed, LLTimer& timer)
900{ 921{
901 U32 timer_checks = 0; 922 U32 timer_checks = 0;
902 F32 inloop = 0; 923 F32 inloop = 0;
@@ -907,7 +928,7 @@ F32 LLScriptExecute::runQuanta(BOOL b_print, const LLUUID &id, const char **erro
907 // on current execution speed. 928 // on current execution speed.
908 while(true) 929 while(true)
909 { 930 {
910 runInstructions(b_print, id, errorstr, state_transition, 931 runInstructions(b_print, id, errorstr,
911 events_processed, quanta); 932 events_processed, quanta);
912 933
913 static const S32 lsl_timer_check_skip = 4; 934 static const S32 lsl_timer_check_skip = 4;
@@ -3277,7 +3298,7 @@ BOOL run_state(U8 *buffer, S32 &offset, BOOL b_print, const LLUUID &id)
3277 { 3298 {
3278 major_version = 2; 3299 major_version = 2;
3279 } 3300 }
3280 3301
3281 S32 current_state = get_register(buffer, LREG_CS); 3302 S32 current_state = get_register(buffer, LREG_CS);
3282 if (state != current_state) 3303 if (state != current_state)
3283 { 3304 {
@@ -3985,7 +4006,6 @@ void lscript_run(const std::string& filename, BOOL b_debug)
3985 LLTimer timer; 4006 LLTimer timer;
3986 4007
3987 const char *error; 4008 const char *error;
3988 BOOL b_state;
3989 LLScriptExecuteLSL2 *execute = NULL; 4009 LLScriptExecuteLSL2 *execute = NULL;
3990 4010
3991 if (filename.empty()) 4011 if (filename.empty())
@@ -4009,7 +4029,7 @@ void lscript_run(const std::string& filename, BOOL b_debug)
4009 4029
4010 do { 4030 do {
4011 LLTimer timer2; 4031 LLTimer timer2;
4012 execute->runQuanta(b_debug, LLUUID::null, &error, b_state, 4032 execute->runQuanta(b_debug, LLUUID::null, &error,
4013 time_slice, events_processed, timer2); 4033 time_slice, events_processed, timer2);
4014 } while (!execute->isFinished()); 4034 } while (!execute->isFinished());
4015 4035
@@ -4044,7 +4064,8 @@ void lscript_pop_variable(LLScriptLibData *data, U8 *buffer, char type)
4044 break; 4064 break;
4045 case 'k': 4065 case 'k':
4046 data->mType = LST_KEY; 4066 data->mType = LST_KEY;
4047 4067 data->mKey = NULL;
4068
4048 base_address = lscript_pop_int(buffer); 4069 base_address = lscript_pop_int(buffer);
4049 // this bit of nastiness is to get around that code paths to local variables can result in lack of initialization 4070 // this bit of nastiness is to get around that code paths to local variables can result in lack of initialization
4050 // and function clean up of ref counts isn't based on scope (a mistake, I know) 4071 // and function clean up of ref counts isn't based on scope (a mistake, I know)
@@ -4063,7 +4084,7 @@ void lscript_pop_variable(LLScriptLibData *data, U8 *buffer, char type)
4063 } 4084 }
4064 lsa_decrease_ref_count(buffer, base_address); 4085 lsa_decrease_ref_count(buffer, base_address);
4065 } 4086 }
4066 else 4087 if (data->mKey == NULL)
4067 { 4088 {
4068 data->mKey = new char[1]; 4089 data->mKey = new char[1];
4069 data->mKey[0] = 0; 4090 data->mKey[0] = 0;
@@ -4071,6 +4092,7 @@ void lscript_pop_variable(LLScriptLibData *data, U8 *buffer, char type)
4071 break; 4092 break;
4072 case 's': 4093 case 's':
4073 data->mType = LST_STRING; 4094 data->mType = LST_STRING;
4095 data->mString = NULL;
4074 4096
4075 base_address = lscript_pop_int(buffer); 4097 base_address = lscript_pop_int(buffer);
4076 // this bit of nastiness is to get around that code paths to local variables can result in lack of initialization 4098 // this bit of nastiness is to get around that code paths to local variables can result in lack of initialization
@@ -4090,7 +4112,7 @@ void lscript_pop_variable(LLScriptLibData *data, U8 *buffer, char type)
4090 } 4112 }
4091 lsa_decrease_ref_count(buffer, base_address); 4113 lsa_decrease_ref_count(buffer, base_address);
4092 } 4114 }
4093 else 4115 if (data->mString == NULL)
4094 { 4116 {
4095 data->mString = new char[1]; 4117 data->mString = new char[1];
4096 data->mString[0] = 0; 4118 data->mString[0] = 0;
diff --git a/linden/indra/lscript/lscript_library/lscript_library.cpp b/linden/indra/lscript/lscript_library/lscript_library.cpp
index e7d8284..505b123 100644
--- a/linden/indra/lscript/lscript_library/lscript_library.cpp
+++ b/linden/indra/lscript/lscript_library/lscript_library.cpp
@@ -448,6 +448,7 @@ void LLScriptLibrary::init()
448 addFunction(new LLScriptLibraryFunction(10.f, 0.f, dummy_func, "llDetectedTouchBinormal", "v", "i", "vector llDetectedTouchBinormal(integer number)\nreturns the surface binormal for a triggered touch event")); 448 addFunction(new LLScriptLibraryFunction(10.f, 0.f, dummy_func, "llDetectedTouchBinormal", "v", "i", "vector llDetectedTouchBinormal(integer number)\nreturns the surface binormal for a triggered touch event"));
449 addFunction(new LLScriptLibraryFunction(10.f, 0.f, dummy_func, "llDetectedTouchST", "v", "i", "vector llDetectedTouchST(integer number)\nreturns the s and t coordinates in the first two components of a vector, for a triggered touch event")); 449 addFunction(new LLScriptLibraryFunction(10.f, 0.f, dummy_func, "llDetectedTouchST", "v", "i", "vector llDetectedTouchST(integer number)\nreturns the s and t coordinates in the first two components of a vector, for a triggered touch event"));
450 450
451 addFunction(new LLScriptLibraryFunction(10.f, 0.f, dummy_func, "llSHA1String", "s", "s", "string llSHA1String(string sr)\nPerforms a SHA1 security Hash. Returns a 40 character hex string."));
451 452
452 453
453 // energy, sleep, dummy_func, name, return type, parameters, help text, gods-only 454 // energy, sleep, dummy_func, name, return type, parameters, help text, gods-only
diff --git a/linden/indra/mac_crash_logger/CMakeLists.txt b/linden/indra/mac_crash_logger/CMakeLists.txt
index 9cddb56..daf3e10 100644
--- a/linden/indra/mac_crash_logger/CMakeLists.txt
+++ b/linden/indra/mac_crash_logger/CMakeLists.txt
@@ -3,7 +3,6 @@
3project(mac_crash_logger) 3project(mac_crash_logger)
4 4
5include(00-Common) 5include(00-Common)
6include(Boost)
7include(LLCommon) 6include(LLCommon)
8include(LLCrashLogger) 7include(LLCrashLogger)
9include(LLMath) 8include(LLMath)
@@ -36,7 +35,6 @@ set_source_files_properties(${mac_crash_logger_HEADER_FILES}
36list(APPEND mac_crash_logger_SOURCE_FILES ${mac_crash_logger_HEADER_FILES}) 35list(APPEND mac_crash_logger_SOURCE_FILES ${mac_crash_logger_HEADER_FILES})
37 36
38set(mac_crash_logger_RESOURCE_FILES 37set(mac_crash_logger_RESOURCE_FILES
39 Info.plist
40 CrashReporter.nib/ 38 CrashReporter.nib/
41 ) 39 )
42set_source_files_properties( 40set_source_files_properties(
@@ -44,11 +42,6 @@ set_source_files_properties(
44 PROPERTIES 42 PROPERTIES
45 HEADER_FILE_ONLY TRUE 43 HEADER_FILE_ONLY TRUE
46 ) 44 )
47set_source_files_properties(
48 Info.plist
49 PROPERTIES
50 MACOSX_PACKAGE_LOCATION . # will it blend? + poppy
51 )
52SOURCE_GROUP("Resources" FILES ${mac_crash_logger_RESOURCE_FILES}) 45SOURCE_GROUP("Resources" FILES ${mac_crash_logger_RESOURCE_FILES})
53list(APPEND mac_crash_logger_SOURCE_FILES ${mac_crash_logger_RESOURCE_FILES}) 46list(APPEND mac_crash_logger_SOURCE_FILES ${mac_crash_logger_RESOURCE_FILES})
54 47
@@ -56,6 +49,11 @@ add_executable(mac-crash-logger
56 MACOSX_BUNDLE 49 MACOSX_BUNDLE
57 ${mac_crash_logger_SOURCE_FILES}) 50 ${mac_crash_logger_SOURCE_FILES})
58 51
52set_target_properties(mac-crash-logger
53 PROPERTIES
54 MACOSX_BUNDLE_INFO_PLIST ${CMAKE_CURRENT_SOURCE_DIR}/Info.plist
55 )
56
59target_link_libraries(mac-crash-logger 57target_link_libraries(mac-crash-logger
60 ${LLCRASHLOGGER_LIBRARIES} 58 ${LLCRASHLOGGER_LIBRARIES}
61 ${LLVFS_LIBRARIES} 59 ${LLVFS_LIBRARIES}
@@ -64,7 +62,6 @@ target_link_libraries(mac-crash-logger
64 ${LLVFS_LIBRARIES} 62 ${LLVFS_LIBRARIES}
65 ${LLMATH_LIBRARIES} 63 ${LLMATH_LIBRARIES}
66 ${LLCOMMON_LIBRARIES} 64 ${LLCOMMON_LIBRARIES}
67 ${BOOST_SIGNALS_LIBRARY}
68 ) 65 )
69 66
70add_custom_command( 67add_custom_command(
diff --git a/linden/indra/mac_crash_logger/CrashReporter.nib/info.nib b/linden/indra/mac_crash_logger/CrashReporter.nib/info.nib
index b541744..06805c0 100644
--- a/linden/indra/mac_crash_logger/CrashReporter.nib/info.nib
+++ b/linden/indra/mac_crash_logger/CrashReporter.nib/info.nib
@@ -5,15 +5,13 @@
5 <key>IBFramework Version</key> 5 <key>IBFramework Version</key>
6 <string>629</string> 6 <string>629</string>
7 <key>IBLastKnownRelativeProjectPath</key> 7 <key>IBLastKnownRelativeProjectPath</key>
8 <string>../macview.xcodeproj</string> 8 <string>../../build-darwin-i386/SecondLife.xcodeproj</string>
9 <key>IBOldestOS</key> 9 <key>IBOldestOS</key>
10 <integer>5</integer> 10 <integer>5</integer>
11 <key>IBOpenObjects</key> 11 <key>IBOpenObjects</key>
12 <array> 12 <array/>
13 <integer>193</integer>
14 </array>
15 <key>IBSystem Version</key> 13 <key>IBSystem Version</key>
16 <string>9B18</string> 14 <string>9E17</string>
17 <key>targetFramework</key> 15 <key>targetFramework</key>
18 <string>IBCarbonFramework</string> 16 <string>IBCarbonFramework</string>
19</dict> 17</dict>
diff --git a/linden/indra/mac_updater/CMakeLists.txt b/linden/indra/mac_updater/CMakeLists.txt
index 3ac5aee..0eac76f 100644
--- a/linden/indra/mac_updater/CMakeLists.txt
+++ b/linden/indra/mac_updater/CMakeLists.txt
@@ -42,7 +42,6 @@ list(APPEND mac_updater_SOURCE_FILES ${mac_updater_HEADER_FILES})
42 42
43 43
44set(mac_updater_RESOURCE_FILES 44set(mac_updater_RESOURCE_FILES
45 Info.plist
46 AutoUpdater.nib/ 45 AutoUpdater.nib/
47 ) 46 )
48set_source_files_properties( 47set_source_files_properties(
@@ -50,19 +49,18 @@ set_source_files_properties(
50 PROPERTIES 49 PROPERTIES
51 HEADER_FILE_ONLY TRUE 50 HEADER_FILE_ONLY TRUE
52 ) 51 )
53set_source_files_properties(
54 Info.plist
55 PROPERTIES
56 MACOSX_PACKAGE_LOCATION . # will it blend? + poppy
57 )
58SOURCE_GROUP("Resources" FILES ${mac_updater_RESOURCE_FILES}) 52SOURCE_GROUP("Resources" FILES ${mac_updater_RESOURCE_FILES})
59list(APPEND mac_updater_SOURCE_FILES ${mac_updater_RESOURCE_FILES}) 53list(APPEND mac_updater_SOURCE_FILES ${mac_updater_RESOURCE_FILES})
60 54
61
62add_executable(mac-updater 55add_executable(mac-updater
63 MACOSX_BUNDLE 56 MACOSX_BUNDLE
64 ${mac_updater_SOURCE_FILES}) 57 ${mac_updater_SOURCE_FILES})
65 58
59set_target_properties(mac-updater
60 PROPERTIES
61 MACOSX_BUNDLE_INFO_PLIST ${CMAKE_CURRENT_SOURCE_DIR}/Info.plist
62 )
63
66target_link_libraries(mac-updater 64target_link_libraries(mac-updater
67 ${LLVFS_LIBRARIES} 65 ${LLVFS_LIBRARIES}
68 ${CURL_LIBRARIES} 66 ${CURL_LIBRARIES}
@@ -79,4 +77,3 @@ add_custom_command(
79 ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/mac-updater.app/Contents/Resources/AutoUpdater.nib 77 ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/mac-updater.app/Contents/Resources/AutoUpdater.nib
80 ) 78 )
81 79
82
diff --git a/linden/indra/newview/CMakeLists.txt b/linden/indra/newview/CMakeLists.txt
index e93ea57..4dd4c74 100644
--- a/linden/indra/newview/CMakeLists.txt
+++ b/linden/indra/newview/CMakeLists.txt
@@ -5,6 +5,7 @@ project(viewer)
5include(00-Common) 5include(00-Common)
6include(Boost) 6include(Boost)
7include(BuildVersion) 7include(BuildVersion)
8include(DBusGlib)
8include(DirectX) 9include(DirectX)
9include(ELFIO) 10include(ELFIO)
10include(FMOD) 11include(FMOD)
@@ -123,6 +124,7 @@ set(viewer_SOURCE_FILES
123 llfloateravatarinfo.cpp 124 llfloateravatarinfo.cpp
124 llfloateravatarpicker.cpp 125 llfloateravatarpicker.cpp
125 llfloateravatartextures.cpp 126 llfloateravatartextures.cpp
127 llfloaterbeacons.cpp
126 llfloaterbuildoptions.cpp 128 llfloaterbuildoptions.cpp
127 llfloaterbump.cpp 129 llfloaterbump.cpp
128 llfloaterbuycontents.cpp 130 llfloaterbuycontents.cpp
@@ -198,6 +200,7 @@ set(viewer_SOURCE_FILES
198 llglsandbox.cpp 200 llglsandbox.cpp
199 llgroupmgr.cpp 201 llgroupmgr.cpp
200 llgroupnotify.cpp 202 llgroupnotify.cpp
203 llhomelocationresponder.cpp
201 llhoverview.cpp 204 llhoverview.cpp
202 llhudeffectbeam.cpp 205 llhudeffectbeam.cpp
203 llhudeffect.cpp 206 llhudeffect.cpp
@@ -429,6 +432,9 @@ set(viewer_SOURCE_FILES
429 pipeline.cpp 432 pipeline.cpp
430 ) 433 )
431 434
435set(VIEWER_BINARY_NAME "secondlife-bin" CACHE STRING
436 "The name of the viewer executable to create.")
437
432if (LINUX) 438if (LINUX)
433 # We can't set these flags for Darwin, because they get passed to 439 # We can't set these flags for Darwin, because they get passed to
434 # the PPC compiler. Ugh. 440 # the PPC compiler. Ugh.
@@ -513,6 +519,7 @@ set(viewer_HEADER_FILES
513 llfloateravatarinfo.h 519 llfloateravatarinfo.h
514 llfloateravatarpicker.h 520 llfloateravatarpicker.h
515 llfloateravatartextures.h 521 llfloateravatartextures.h
522 llfloaterbeacons.h
516 llfloaterbuildoptions.h 523 llfloaterbuildoptions.h
517 llfloaterbump.h 524 llfloaterbump.h
518 llfloaterbuy.h 525 llfloaterbuy.h
@@ -587,6 +594,7 @@ set(viewer_HEADER_FILES
587 llgivemoney.h 594 llgivemoney.h
588 llgroupmgr.h 595 llgroupmgr.h
589 llgroupnotify.h 596 llgroupnotify.h
597 llhomelocationresponder.h
590 llhoverview.h 598 llhoverview.h
591 llhudeffect.h 599 llhudeffect.h
592 llhudeffectbeam.h 600 llhudeffectbeam.h
@@ -869,6 +877,7 @@ endif (DARWIN)
869 877
870if (LINUX) 878if (LINUX)
871 LIST(APPEND viewer_SOURCE_FILES llappviewerlinux.cpp) 879 LIST(APPEND viewer_SOURCE_FILES llappviewerlinux.cpp)
880 LIST(APPEND viewer_SOURCE_FILES llappviewerlinux_api_dbus.cpp)
872 LIST(APPEND CMAKE_EXE_LINKER_FLAGS -Wl,--as-needed) 881 LIST(APPEND CMAKE_EXE_LINKER_FLAGS -Wl,--as-needed)
873 882
874 set(viewer_LIBRARIES 883 set(viewer_LIBRARIES
@@ -1018,6 +1027,7 @@ set(viewer_XUI_FILES
1018 skins/default/xui/en-us/floater_audio_volume.xml 1027 skins/default/xui/en-us/floater_audio_volume.xml
1019 skins/default/xui/en-us/floater_avatar_picker.xml 1028 skins/default/xui/en-us/floater_avatar_picker.xml
1020 skins/default/xui/en-us/floater_avatar_textures.xml 1029 skins/default/xui/en-us/floater_avatar_textures.xml
1030 skins/default/xui/en-us/floater_beacons.xml
1021 skins/default/xui/en-us/floater_build_options.xml 1031 skins/default/xui/en-us/floater_build_options.xml
1022 skins/default/xui/en-us/floater_bumps.xml 1032 skins/default/xui/en-us/floater_bumps.xml
1023 skins/default/xui/en-us/floater_buy_contents.xml 1033 skins/default/xui/en-us/floater_buy_contents.xml
@@ -1236,6 +1246,17 @@ set_source_files_properties(${viewer_CHARACTER_FILES}
1236 1246
1237list(APPEND viewer_SOURCE_FILES ${viewer_CHARACTER_FILES}) 1247list(APPEND viewer_SOURCE_FILES ${viewer_CHARACTER_FILES})
1238 1248
1249if (WINDOWS)
1250 file(GLOB viewer_INSTALLER_FILES installers/windows/*.nsi)
1251
1252 source_group("Installer Files" FILES ${viewer_INSTALLER_FILES})
1253
1254 set_source_files_properties(${viewer_INSTALLER_FILES}
1255 PROPERTIES HEADER_FILE_ONLY TRUE)
1256
1257 list(APPEND viewer_SOURCE_FILES ${viewer_INSTALLER_FILES})
1258endif (WINDOWS)
1259
1239if (FMOD) 1260if (FMOD)
1240 set_source_files_properties(llstartup.cpp PROPERTIES COMPILE_FLAGS -DLL_FMOD) 1261 set_source_files_properties(llstartup.cpp PROPERTIES COMPILE_FLAGS -DLL_FMOD)
1241 1262
@@ -1262,15 +1283,15 @@ list(APPEND viewer_SOURCE_FILES ${viewer_HEADER_FILES})
1262set_source_files_properties(${viewer_HEADER_FILES} 1283set_source_files_properties(${viewer_HEADER_FILES}
1263 PROPERTIES HEADER_FILE_ONLY TRUE) 1284 PROPERTIES HEADER_FILE_ONLY TRUE)
1264 1285
1265add_executable(secondlife-bin 1286add_executable(${VIEWER_BINARY_NAME}
1266 WIN32 1287 WIN32
1267 MACOSX_BUNDLE 1288 MACOSX_BUNDLE
1268 ${viewer_SOURCE_FILES} 1289 ${viewer_SOURCE_FILES}
1269 ) 1290 )
1270check_message_template(secondlife-bin) 1291check_message_template(${VIEWER_BINARY_NAME})
1271 1292
1272if (LLKDU_LIBRARY) 1293if (LLKDU_LIBRARY)
1273 add_dependencies(secondlife-bin ${LLKDU_LIBRARY}) 1294 add_dependencies(${VIEWER_BINARY_NAME} ${LLKDU_LIBRARY})
1274endif (LLKDU_LIBRARY) 1295endif (LLKDU_LIBRARY)
1275 1296
1276set(PACKAGE OFF CACHE BOOL 1297set(PACKAGE OFF CACHE BOOL
@@ -1278,12 +1299,12 @@ set(PACKAGE OFF CACHE BOOL
1278 1299
1279if (WINDOWS) 1300if (WINDOWS)
1280 if(MSVC71) 1301 if(MSVC71)
1281 set(release_flags "/MAP:Release/secondlife-bin.map /MAPINFO:LINES") 1302 set(release_flags "/MAP:Release/${VIEWER_BINARY_NAME}.map /MAPINFO:LINES")
1282 else(MSVC71) 1303 else(MSVC71)
1283 set(release_flags "/MAP:Release/secondlife-bin.map") 1304 set(release_flags "/MAP:Release/${VIEWER_BINARY_NAME}.map")
1284 endif(MSVC71) 1305 endif(MSVC71)
1285 1306
1286 set_target_properties(secondlife-bin 1307 set_target_properties(${VIEWER_BINARY_NAME}
1287 PROPERTIES 1308 PROPERTIES
1288 LINK_FLAGS "/debug /NODEFAULTLIB:MSVCRT /SUBSYSTEM:WINDOWS" 1309 LINK_FLAGS "/debug /NODEFAULTLIB:MSVCRT /SUBSYSTEM:WINDOWS"
1289 LINK_FLAGS_DEBUG "/NODEFAULTLIB:LIBCMT /NODEFAULTLIB:MSVCRTD" 1310 LINK_FLAGS_DEBUG "/NODEFAULTLIB:LIBCMT /NODEFAULTLIB:MSVCRTD"
@@ -1293,20 +1314,20 @@ if (WINDOWS)
1293 # sets the 'working directory' for debugging from visual studio. 1314 # sets the 'working directory' for debugging from visual studio.
1294 if (NOT UNATTENDED) 1315 if (NOT UNATTENDED)
1295 add_custom_command( 1316 add_custom_command(
1296 TARGET secondlife-bin PRE_BUILD 1317 TARGET ${VIEWER_BINARY_NAME} PRE_BUILD
1297 COMMAND ${CMAKE_SOURCE_DIR}/tools/vstool/vstool.exe 1318 COMMAND ${CMAKE_SOURCE_DIR}/tools/vstool/vstool.exe
1298 ARGS 1319 ARGS
1299 --solution 1320 --solution
1300 ${CMAKE_BINARY_DIR}/${CMAKE_PROJECT_NAME}.sln 1321 ${CMAKE_BINARY_DIR}/${CMAKE_PROJECT_NAME}.sln
1301 --workingdir 1322 --workingdir
1302 secondlife-bin 1323 ${VIEWER_BINARY_NAME}
1303 ${CMAKE_CURRENT_SOURCE_DIR} 1324 ${CMAKE_CURRENT_SOURCE_DIR}
1304 COMMENT "Setting the secondlife-bin working directory for debugging." 1325 COMMENT "Setting the ${VIEWER_BINARY_NAME} working directory for debugging."
1305 ) 1326 )
1306 endif (NOT UNATTENDED) 1327 endif (NOT UNATTENDED)
1307 1328
1308 add_custom_command( 1329 add_custom_command(
1309 TARGET secondlife-bin PRE_BUILD 1330 TARGET ${VIEWER_BINARY_NAME} PRE_BUILD
1310 COMMAND ${CMAKE_COMMAND} 1331 COMMAND ${CMAKE_COMMAND}
1311 ARGS 1332 ARGS
1312 -E 1333 -E
@@ -1317,7 +1338,7 @@ if (WINDOWS)
1317 ) 1338 )
1318 1339
1319 add_custom_command( 1340 add_custom_command(
1320 TARGET secondlife-bin PRE_BUILD 1341 TARGET ${VIEWER_BINARY_NAME} PRE_BUILD
1321 COMMAND ${CMAKE_COMMAND} 1342 COMMAND ${CMAKE_COMMAND}
1322 ARGS 1343 ARGS
1323 -E 1344 -E
@@ -1327,10 +1348,10 @@ if (WINDOWS)
1327 COMMENT "Copying message.xml to the runtime folder." 1348 COMMENT "Copying message.xml to the runtime folder."
1328 ) 1349 )
1329 1350
1330 add_dependencies(secondlife-bin copy_win_libs) 1351 add_dependencies(${VIEWER_BINARY_NAME} copy_win_libs)
1331 1352
1332 if (EXISTS ${CMAKE_SOURCE_DIR}/copy_win_scripts) 1353 if (EXISTS ${CMAKE_SOURCE_DIR}/copy_win_scripts)
1333 add_dependencies(secondlife-bin copy_win_scripts) 1354 add_dependencies(${VIEWER_BINARY_NAME} copy_win_scripts)
1334 endif (EXISTS ${CMAKE_SOURCE_DIR}/copy_win_scripts) 1355 endif (EXISTS ${CMAKE_SOURCE_DIR}/copy_win_scripts)
1335 1356
1336 add_custom_command( 1357 add_custom_command(
@@ -1340,14 +1361,14 @@ if (WINDOWS)
1340 ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py 1361 ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py
1341 --configuration=${CMAKE_CFG_INTDIR} 1362 --configuration=${CMAKE_CFG_INTDIR}
1342 --channel=${VIEWER_CHANNEL} 1363 --channel=${VIEWER_CHANNEL}
1343 --login_channel=${VIEWER_CHANNEL} 1364 --login_channel=${VIEWER_LOGIN_CHANNEL}
1344 --grid=${GRID} 1365 --grid=${GRID}
1345 --source=${CMAKE_CURRENT_SOURCE_DIR} 1366 --source=${CMAKE_CURRENT_SOURCE_DIR}
1346 --artwork=${ARTWORK_DIR} 1367 --artwork=${ARTWORK_DIR}
1347 --build=${CMAKE_CURRENT_BINARY_DIR} 1368 --build=${CMAKE_CURRENT_BINARY_DIR}
1348 --dest=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR} 1369 --dest=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}
1349 --touch=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/touched.bat 1370 --touch=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/touched.bat
1350 DEPENDS secondlife-bin ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py 1371 DEPENDS ${VIEWER_BINARY_NAME} ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py
1351 ) 1372 )
1352 if (PACKAGE) 1373 if (PACKAGE)
1353 add_custom_target(package ALL DEPENDS ${CMAKE_CFG_INTDIR}/touched.bat) 1374 add_custom_target(package ALL DEPENDS ${CMAKE_CFG_INTDIR}/touched.bat)
@@ -1355,7 +1376,7 @@ if (WINDOWS)
1355 endif (PACKAGE) 1376 endif (PACKAGE)
1356endif (WINDOWS) 1377endif (WINDOWS)
1357 1378
1358target_link_libraries(secondlife-bin 1379target_link_libraries(${VIEWER_BINARY_NAME}
1359 ${LLAUDIO_LIBRARIES} 1380 ${LLAUDIO_LIBRARIES}
1360 ${LLCHARACTER_LIBRARIES} 1381 ${LLCHARACTER_LIBRARIES}
1361 ${LLIMAGE_LIBRARIES} 1382 ${LLIMAGE_LIBRARIES}
@@ -1376,7 +1397,7 @@ target_link_libraries(secondlife-bin
1376 ${viewer_LIBRARIES} 1397 ${viewer_LIBRARIES}
1377 ${BOOST_PROGRAM_OPTIONS_LIBRARY} 1398 ${BOOST_PROGRAM_OPTIONS_LIBRARY}
1378 ${BOOST_REGEX_LIBRARY} 1399 ${BOOST_REGEX_LIBRARY}
1379 ${BOOST_SIGNALS_LIBRARY} 1400 ${DBUSGLIB_LIBRARIES}
1380 ${OPENGL_LIBRARIES} 1401 ${OPENGL_LIBRARIES}
1381 ${FMODWRAPPER_LIBRARY} 1402 ${FMODWRAPPER_LIBRARY}
1382 ${OPENGL_LIBRARIES} 1403 ${OPENGL_LIBRARIES}
@@ -1388,7 +1409,6 @@ target_link_libraries(secondlife-bin
1388 ${QUICKTIME_LIBRARY} 1409 ${QUICKTIME_LIBRARY}
1389 ${WINDOWS_LIBRARIES} 1410 ${WINDOWS_LIBRARIES}
1390 ${XMLRPCEPI_LIBRARIES} 1411 ${XMLRPCEPI_LIBRARIES}
1391 ${ZLIB_LIBRARIES}
1392 ${ELFIO_LIBRARIES} 1412 ${ELFIO_LIBRARIES}
1393 ) 1413 )
1394 1414
@@ -1402,8 +1422,8 @@ if (LINUX)
1402 add_custom_command( 1422 add_custom_command(
1403 OUTPUT secondlife-stripped 1423 OUTPUT secondlife-stripped
1404 COMMAND strip 1424 COMMAND strip
1405 ARGS --strip-debug -o secondlife-stripped secondlife-bin 1425 ARGS --strip-debug -o secondlife-stripped ${VIEWER_BINARY_NAME}
1406 DEPENDS secondlife-bin 1426 DEPENDS ${VIEWER_BINARY_NAME}
1407 ) 1427 )
1408 1428
1409 set(product SecondLife-${ARCH}-${viewer_VERSION}) 1429 set(product SecondLife-${ARCH}-${viewer_VERSION})
@@ -1415,7 +1435,7 @@ if (LINUX)
1415 ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py 1435 ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py
1416 --grid=${GRID} 1436 --grid=${GRID}
1417 --channel=${VIEWER_CHANNEL} 1437 --channel=${VIEWER_CHANNEL}
1418 --login_channel=${VIEWER_CHANNEL} 1438 --login_channel=${VIEWER_LOGIN_CHANNEL}
1419 --installer_name=${product} 1439 --installer_name=${product}
1420 --arch=${ARCH} 1440 --arch=${ARCH}
1421 --source=${CMAKE_CURRENT_SOURCE_DIR} 1441 --source=${CMAKE_CURRENT_SOURCE_DIR}
@@ -1435,7 +1455,7 @@ endif (LINUX)
1435if (DARWIN) 1455if (DARWIN)
1436 set(product "Second Life") 1456 set(product "Second Life")
1437 set_target_properties( 1457 set_target_properties(
1438 secondlife-bin 1458 ${VIEWER_BINARY_NAME}
1439 PROPERTIES 1459 PROPERTIES
1440 OUTPUT_NAME "${product}" 1460 OUTPUT_NAME "${product}"
1441 MACOSX_BUNDLE_INFO_STRING "info string - localize me" 1461 MACOSX_BUNDLE_INFO_STRING "info string - localize me"
@@ -1449,7 +1469,7 @@ if (DARWIN)
1449 ) 1469 )
1450 1470
1451 add_custom_command( 1471 add_custom_command(
1452 TARGET secondlife-bin POST_BUILD 1472 TARGET ${VIEWER_BINARY_NAME} POST_BUILD
1453 COMMAND ${PYTHON_EXECUTABLE} 1473 COMMAND ${PYTHON_EXECUTABLE}
1454 ARGS 1474 ARGS
1455 ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py 1475 ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py
@@ -1460,28 +1480,31 @@ if (DARWIN)
1460 --artwork=${ARTWORK_DIR} 1480 --artwork=${ARTWORK_DIR}
1461 --build=${CMAKE_CURRENT_BINARY_DIR} 1481 --build=${CMAKE_CURRENT_BINARY_DIR}
1462 --dest=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/${product}.app 1482 --dest=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/${product}.app
1463 DEPENDS secondlife-bin ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py 1483 DEPENDS ${VIEWER_BINARY_NAME} ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py
1464 ) 1484 )
1465 1485
1466 if (PACKAGE) 1486 if (PACKAGE)
1467 add_custom_target(package 1487 add_custom_target(package ALL DEPENDS ${VIEWER_BINARY_NAME})
1468 COMMAND
1469 ${PYTHON_EXECUTABLE}
1470 ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py
1471 --grid=${GRID}
1472 --configuration=${CMAKE_CFG_INTDIR}
1473 --channel=${VIEWER_CHANNEL}
1474 --login_channel=${VIEWER_CHANNEL}
1475 --source=${CMAKE_CURRENT_SOURCE_DIR}
1476 --artwork=${ARTWORK_DIR}
1477 --build=${CMAKE_CURRENT_BINARY_DIR}
1478 --dest=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/${product}.app
1479 --touch=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/.${product}.touched
1480 DEPENDS
1481 secondlife-bin
1482 ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py
1483 )
1484 add_dependencies(package mac-updater mac-crash-logger) 1488 add_dependencies(package mac-updater mac-crash-logger)
1489
1490 add_custom_command(
1491 TARGET package POST_BUILD
1492 COMMAND ${PYTHON_EXECUTABLE}
1493 ARGS
1494 ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py
1495 --grid=${GRID}
1496 --configuration=${CMAKE_CFG_INTDIR}
1497 --channel=${VIEWER_CHANNEL}
1498 --login_channel=${VIEWER_LOGIN_CHANNEL}
1499 --source=${CMAKE_CURRENT_SOURCE_DIR}
1500 --artwork=${ARTWORK_DIR}
1501 --build=${CMAKE_CURRENT_BINARY_DIR}
1502 --dest=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/${product}.app
1503 --touch=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/.${product}.touched
1504 DEPENDS
1505 ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py
1506 )
1507
1485 endif (PACKAGE) 1508 endif (PACKAGE)
1486endif (DARWIN) 1509endif (DARWIN)
1487 1510
diff --git a/linden/indra/newview/English.lproj/InfoPlist.strings b/linden/indra/newview/English.lproj/InfoPlist.strings
index 881483e..90646be 100644
--- a/linden/indra/newview/English.lproj/InfoPlist.strings
+++ b/linden/indra/newview/English.lproj/InfoPlist.strings
@@ -1,6 +1,6 @@
1/* Localized versions of Info.plist keys */ 1/* Localized versions of Info.plist keys */
2 2
3CFBundleName = "Second Life"; 3CFBundleName = "Second Life";
4CFBundleShortVersionString = "Second Life version 1.20.9.87416"; 4CFBundleShortVersionString = "Second Life version 1.20.15.97417";
5CFBundleGetInfoString = "Second Life version 1.20.9.87416, Copyright 2004-2008 Linden Research, Inc."; 5CFBundleGetInfoString = "Second Life version 1.20.15.97417, Copyright 2004-2008 Linden Research, Inc.";
6 6
diff --git a/linden/indra/newview/Info-SecondLife.plist b/linden/indra/newview/Info-SecondLife.plist
index b889d45..3c55bad 100644
--- a/linden/indra/newview/Info-SecondLife.plist
+++ b/linden/indra/newview/Info-SecondLife.plist
@@ -32,7 +32,7 @@
32 </dict> 32 </dict>
33 </array> 33 </array>
34 <key>CFBundleVersion</key> 34 <key>CFBundleVersion</key>
35 <string>1.20.9.87416</string> 35 <string>1.20.15.97417</string>
36 <key>CSResourcesFileMapped</key> 36 <key>CSResourcesFileMapped</key>
37 <true/> 37 <true/>
38</dict> 38</dict>
diff --git a/linden/indra/newview/app_settings/keywords.ini b/linden/indra/newview/app_settings/keywords.ini
index 3679c38..0ab977d 100644
--- a/linden/indra/newview/app_settings/keywords.ini
+++ b/linden/indra/newview/app_settings/keywords.ini
@@ -332,11 +332,11 @@ REMOTE_DATA_REQUEST Value of event_type in remote_event if XML-RPC request is re
332REMOTE_DATA_REPLY Value of event_type in remote_event if XML-RPC reply is received 332REMOTE_DATA_REPLY Value of event_type in remote_event if XML-RPC reply is received
333 333
334 334
335PRIM_TYPE Followed by PRIM_TYPE_BOX, PRIM_TYPE_CYLINDER, PRIM_TYPE_PRISM, PRIM_TYPE_SPHERE,:PRIM_TYPE_TORUS, or PRIM_TYPE_TUBE and their arguments 335PRIM_TYPE Followed by PRIM_TYPE_BOX, PRIM_TYPE_CYLINDER, PRIM_TYPE_PRISM, PRIM_TYPE_SPHERE, PRIM_TYPE_TORUS, PRIM_TYPE_TUBE, or PRIM_TYPE_SCULPT and their arguments
336PRIM_MATERIAL Sets material to PRIM_MATERIAL_STONE, PRIM_MATERIAL_METAL, PRIM_MATERIAL_GLASS,:PRIM_MATERIAL_WOOD, PRIM_MATERIAL_FLESH, PRIM_MATERIAL_PLASTIC,:PRIM_MATERIAL_RUBBER, or PRIM_MATERIAL_LIGHT 336PRIM_MATERIAL Followed by PRIM_MATERIAL_STONE, PRIM_MATERIAL_METAL, PRIM_MATERIAL_GLASS, PRIM_MATERIAL_WOOD, PRIM_MATERIAL_FLESH, PRIM_MATERIAL_PLASTIC, or PRIM_MATERIAL_RUBBER
337PRIM_PHYSICS Sets physics to TRUE or FALSE 337PRIM_PHYSICS Sets physics to TRUE or FALSE
338PRIM_FLEXIBLE Sets primitive flexibility to TRUE or FALSE 338PRIM_FLEXIBLE Followed by TRUE or FALSE, integer softness, float gravity, float friction, float wind, float tension, and vector force
339PRIM_POINT_LIGHT Sets light emission to TRUE or FALSE 339PRIM_POINT_LIGHT Followed by TRUE or FALSE, vector color, float intensity, float radius, float falloff
340PRIM_TEMP_ON_REZ Sets temporay on rez to TRUE or FALSE 340PRIM_TEMP_ON_REZ Sets temporay on rez to TRUE or FALSE
341PRIM_PHANTOM Sets phantom to TRUE or FALSE 341PRIM_PHANTOM Sets phantom to TRUE or FALSE
342PRIM_CAST_SHADOWS DEPRECATED. Takes 1 parameter, an integer, but has no effect when set and always returns 0 if used in llGetPrimitiveParams. 342PRIM_CAST_SHADOWS DEPRECATED. Takes 1 parameter, an integer, but has no effect when set and always returns 0 if used in llGetPrimitiveParams.
@@ -357,7 +357,7 @@ PRIM_TYPE_SPHERE Followed by integer hole shape, vector cut, float hollow, vecto
357PRIM_TYPE_TORUS Followed by integer hole shape, vector cut, float hollow, vector twist,:vector hole size, vector top shear, vector advanced cut, vector taper,:float revolutions, float radius offset, and float skew 357PRIM_TYPE_TORUS Followed by integer hole shape, vector cut, float hollow, vector twist,:vector hole size, vector top shear, vector advanced cut, vector taper,:float revolutions, float radius offset, and float skew
358PRIM_TYPE_TUBE Followed by integer hole shape, vector cut, float hollow, vector twist,:vector hole size, vector top shear, vector advanced cut, vector taper,:float revolutions, float radius offset, and float skew 358PRIM_TYPE_TUBE Followed by integer hole shape, vector cut, float hollow, vector twist,:vector hole size, vector top shear, vector advanced cut, vector taper,:float revolutions, float radius offset, and float skew
359PRIM_TYPE_RING Followed by integer hole shape, vector cut, float hollow, vector twist,:vector hole size, vector top shear, vector advanced cut, vector taper,:float revolutions, float radius offset, and float skew 359PRIM_TYPE_RING Followed by integer hole shape, vector cut, float hollow, vector twist,:vector hole size, vector top shear, vector advanced cut, vector taper,:float revolutions, float radius offset, and float skew
360PRIM_TYPE_SCULPT Followed by a key or string texture uuid. 360PRIM_TYPE_SCULPT Followed by a key/string texture uuid, and one of PRIM_SCULPT_TYPE_SPHERE, PRIM_SCULPT_TYPE_TORUS, PRIM_SCULPT_TYPE_PLANE, or PRIM_SCULPT_TYPE_CYLINDER
361 361
362PRIM_HOLE_DEFAULT Sets hole type to match the prim type. 362PRIM_HOLE_DEFAULT Sets hole type to match the prim type.
363PRIM_HOLE_SQUARE Sets hole type to square. 363PRIM_HOLE_SQUARE Sets hole type to square.
diff --git a/linden/indra/newview/app_settings/settings.xml b/linden/indra/newview/app_settings/settings.xml
index 07fa71c..9dac926 100644
--- a/linden/indra/newview/app_settings/settings.xml
+++ b/linden/indra/newview/app_settings/settings.xml
@@ -1838,17 +1838,6 @@
1838 <integer>0</integer> 1838 <integer>0</integer>
1839 </array> 1839 </array>
1840 </map> 1840 </map>
1841 <key>CompressSnapshotsToDisk</key>
1842 <map>
1843 <key>Comment</key>
1844 <string>Compress snapshots saved to disk (Using JPEG 2000)</string>
1845 <key>Persist</key>
1846 <integer>1</integer>
1847 <key>Type</key>
1848 <string>Boolean</string>
1849 <key>Value</key>
1850 <integer>0</integer>
1851 </map>
1852 <key>ConnectAsGod</key> 1841 <key>ConnectAsGod</key>
1853 <map> 1842 <map>
1854 <key>Comment</key> 1843 <key>Comment</key>
@@ -2660,6 +2649,22 @@
2660 <integer>0</integer> 2649 <integer>0</integer>
2661 </array> 2650 </array>
2662 </map> 2651 </map>
2652 <key>FloaterBeaconsRect</key>
2653 <map>
2654 <key>Comment</key>
2655 <string>Rectangle for beacon and highlight controls</string>
2656 <key>Persist</key>
2657 <integer>1</integer>
2658 <key>Type</key>
2659 <string>Rect</string>
2660 <key>Value</key>
2661 <array>
2662 <integer>200</integer>
2663 <integer>250</integer>
2664 <integer>250</integer>
2665 <integer>200</integer>
2666 </array>
2667 </map>
2663 <key>FloaterBuildOptionsRect</key> 2668 <key>FloaterBuildOptionsRect</key>
2664 <map> 2669 <map>
2665 <key>Comment</key> 2670 <key>Comment</key>
@@ -3595,6 +3600,17 @@
3595 <key>Value</key> 3600 <key>Value</key>
3596 <integer>0</integer> 3601 <integer>0</integer>
3597 </map> 3602 </map>
3603 <key>ForceMandatoryUpdate</key>
3604 <map>
3605 <key>Comment</key>
3606 <string>For QA: On next startup, forces the auto-updater to run</string>
3607 <key>Persist</key>
3608 <integer>1</integer>
3609 <key>Type</key>
3610 <string>Boolean</string>
3611 <key>Value</key>
3612 <integer>0</integer>
3613 </map>
3598 <key>ForwardBtnRect</key> 3614 <key>ForwardBtnRect</key>
3599 <map> 3615 <map>
3600 <key>Comment</key> 3616 <key>Comment</key>
@@ -4178,7 +4194,7 @@
4178 <key>Type</key> 4194 <key>Type</key>
4179 <string>String</string> 4195 <string>String</string>
4180 <key>Value</key> 4196 <key>Value</key>
4181 <string>https://wiki.secondlife.com/wiki/[LSL_STRING]</string> 4197 <string>http://wiki.secondlife.com/wiki/[LSL_STRING]</string>
4182 </map> 4198 </map>
4183 <key>LagMeterShrunk</key> 4199 <key>LagMeterShrunk</key>
4184 <map> 4200 <map>
@@ -4268,10 +4284,11 @@
4268 <key>Value</key> 4284 <key>Value</key>
4269 <string>0.0.0</string> 4285 <string>0.0.0</string>
4270 </map> 4286 </map>
4271 <key>LastSnapshotHeight</key> 4287
4288 <key>LastSnapshotToEmailHeight</key>
4272 <map> 4289 <map>
4273 <key>Comment</key> 4290 <key>Comment</key>
4274 <string>The height of the last snapshot, in px</string> 4291 <string>The height of the last email snapshot, in px</string>
4275 <key>Persist</key> 4292 <key>Persist</key>
4276 <integer>1</integer> 4293 <integer>1</integer>
4277 <key>Type</key> 4294 <key>Type</key>
@@ -4279,21 +4296,32 @@
4279 <key>Value</key> 4296 <key>Value</key>
4280 <integer>768</integer> 4297 <integer>768</integer>
4281 </map> 4298 </map>
4282 <key>LastSnapshotType</key> 4299 <key>LastSnapshotToEmailWidth</key>
4283 <map> 4300 <map>
4284 <key>Comment</key> 4301 <key>Comment</key>
4285 <string>Select this as next type of snapshot to take (0 = postcard, 1 = texture, 2 = local image)</string> 4302 <string>The width of the last email snapshot, in px</string>
4286 <key>Persist</key> 4303 <key>Persist</key>
4287 <integer>1</integer> 4304 <integer>1</integer>
4288 <key>Type</key> 4305 <key>Type</key>
4289 <string>S32</string> 4306 <string>S32</string>
4290 <key>Value</key> 4307 <key>Value</key>
4291 <integer>0</integer> 4308 <integer>1024</integer>
4292 </map> 4309 </map>
4293 <key>LastSnapshotWidth</key> 4310 <key>LastSnapshotToDiskHeight</key>
4294 <map> 4311 <map>
4295 <key>Comment</key> 4312 <key>Comment</key>
4296 <string>The width of the last snapshot, in px</string> 4313 <string>The height of the last disk snapshot, in px</string>
4314 <key>Persist</key>
4315 <integer>1</integer>
4316 <key>Type</key>
4317 <string>S32</string>
4318 <key>Value</key>
4319 <integer>768</integer>
4320 </map>
4321 <key>LastSnapshotToDiskWidth</key>
4322 <map>
4323 <key>Comment</key>
4324 <string>The width of the last disk snapshot, in px</string>
4297 <key>Persist</key> 4325 <key>Persist</key>
4298 <integer>1</integer> 4326 <integer>1</integer>
4299 <key>Type</key> 4327 <key>Type</key>
@@ -4301,6 +4329,39 @@
4301 <key>Value</key> 4329 <key>Value</key>
4302 <integer>1024</integer> 4330 <integer>1024</integer>
4303 </map> 4331 </map>
4332 <key>LastSnapshotToInventoryHeight</key>
4333 <map>
4334 <key>Comment</key>
4335 <string>The height of the last texture snapshot, in px</string>
4336 <key>Persist</key>
4337 <integer>1</integer>
4338 <key>Type</key>
4339 <string>S32</string>
4340 <key>Value</key>
4341 <integer>512</integer>
4342 </map>
4343 <key>LastSnapshotToInventoryWidth</key>
4344 <map>
4345 <key>Comment</key>
4346 <string>The width of the last texture snapshot, in px</string>
4347 <key>Persist</key>
4348 <integer>1</integer>
4349 <key>Type</key>
4350 <string>S32</string>
4351 <key>Value</key>
4352 <integer>512</integer>
4353 </map>
4354 <key>LastSnapshotType</key>
4355 <map>
4356 <key>Comment</key>
4357 <string>Select this as next type of snapshot to take (0 = postcard, 1 = texture, 2 = local image)</string>
4358 <key>Persist</key>
4359 <integer>1</integer>
4360 <key>Type</key>
4361 <string>S32</string>
4362 <key>Value</key>
4363 <integer>0</integer>
4364 </map>
4304 <key>LeftClickShowMenu</key> 4365 <key>LeftClickShowMenu</key>
4305 <map> 4366 <map>
4306 <key>Comment</key> 4367 <key>Comment</key>
@@ -4477,17 +4538,6 @@
4477 <key>Value</key> 4538 <key>Value</key>
4478 <real>20.0</real> 4539 <real>20.0</real>
4479 </map> 4540 </map>
4480 <key>MainloopTimeoutDefault</key>
4481 <map>
4482 <key>Comment</key>
4483 <string>Timeout duration for mainloop lock detection, in seconds.</string>
4484 <key>Persist</key>
4485 <integer>1</integer>
4486 <key>Type</key>
4487 <string>F32</string>
4488 <key>Value</key>
4489 <real>10.0</real>
4490 </map>
4491 <key>MapOverlayIndex</key> 4541 <key>MapOverlayIndex</key>
4492 <map> 4542 <map>
4493 <key>Comment</key> 4543 <key>Comment</key>
@@ -6055,6 +6105,17 @@
6055 <key>Value</key> 6105 <key>Value</key>
6056 <real>1.3</real> 6106 <real>1.3</real>
6057 </map> 6107 </map>
6108 <key>RenderGround</key>
6109 <map>
6110 <key>Comment</key>
6111 <string>Determines whether we can render the ground pool or not</string>
6112 <key>Persist</key>
6113 <integer>1</integer>
6114 <key>Type</key>
6115 <string>Boolean</string>
6116 <key>Value</key>
6117 <integer>1</integer>
6118 </map>
6058 <key>RenderHUDInSnapshot</key> 6119 <key>RenderHUDInSnapshot</key>
6059 <map> 6120 <map>
6060 <key>Comment</key> 6121 <key>Comment</key>
@@ -10039,7 +10100,7 @@
10039 <key>Type</key> 10100 <key>Type</key>
10040 <string>Boolean</string> 10101 <string>Boolean</string>
10041 <key>Value</key> 10102 <key>Value</key>
10042 <integer>0</integer> 10103 <integer>1</integer>
10043 </map> 10104 </map>
10044 <key>WaterEditPresets</key> 10105 <key>WaterEditPresets</key>
10045 <map> 10106 <map>
diff --git a/linden/indra/newview/app_settings/shaders/class1/objects/simpleV.glsl b/linden/indra/newview/app_settings/shaders/class1/objects/simpleV.glsl
index 0df89c8..78b96b3 100644
--- a/linden/indra/newview/app_settings/shaders/class1/objects/simpleV.glsl
+++ b/linden/indra/newview/app_settings/shaders/class1/objects/simpleV.glsl
@@ -11,7 +11,7 @@ void calcAtmospherics(vec3 inPositionEye);
11void main() 11void main()
12{ 12{
13 //transform vertex 13 //transform vertex
14 gl_Position = ftransform(); //gl_ModelViewProjectionMatrix * gl_Vertex; 14 gl_Position = ftransform();
15 gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0; 15 gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
16 16
17 vec4 pos = (gl_ModelViewMatrix * gl_Vertex); 17 vec4 pos = (gl_ModelViewMatrix * gl_Vertex);
diff --git a/linden/indra/newview/featuretable.txt b/linden/indra/newview/featuretable.txt
index b227043..7af05a5 100644
--- a/linden/indra/newview/featuretable.txt
+++ b/linden/indra/newview/featuretable.txt
@@ -1,4 +1,4 @@
1version 17 1version 18
2 2
3// NOTE: This is mostly identical to featuretable_mac.txt with a few differences 3// NOTE: This is mostly identical to featuretable_mac.txt with a few differences
4// Should be combined into one table 4// Should be combined into one table
@@ -33,6 +33,7 @@ RenderFlexTimeFactor 1 1.0
33RenderFogRatio 1 4.0 33RenderFogRatio 1 4.0
34RenderGamma 1 0 34RenderGamma 1 0
35RenderGlowResolutionPow 1 9 35RenderGlowResolutionPow 1 9
36RenderGround 1 1
36RenderLightingDetail 1 1 37RenderLightingDetail 1 1
37RenderMaxPartCount 1 8192 38RenderMaxPartCount 1 8192
38RenderNightBrightness 1 1.0 39RenderNightBrightness 1 1.0
@@ -347,21 +348,7 @@ RenderVBOEnable 0 0
347list ATI_All-in-Wonder_7500 348list ATI_All-in-Wonder_7500
348RenderVBOEnable 0 0 349RenderVBOEnable 0 0
349 350
350
351list ATI_Mobility_Radeon_9800
352RenderAvatarCloth 0 0
353VertexShaderEnable 0 0
354WindLightUseAtmosShaders 0 0
355
356list ATI_Mobility_Radeon_9700
357RenderAvatarCloth 0 0
358VertexShaderEnable 0 0
359WindLightUseAtmosShaders 0 0
360
361list ATI_Mobility_Radeon_9600 351list ATI_Mobility_Radeon_9600
362RenderAvatarCloth 0 0
363VertexShaderEnable 0 0
364WindLightUseAtmosShaders 0 0
365Disregard96DefaultDrawDistance 1 0 352Disregard96DefaultDrawDistance 1 0
366 353
367 354
diff --git a/linden/indra/newview/featuretable_linux.txt b/linden/indra/newview/featuretable_linux.txt
index 3eaa781..0036f11 100644
--- a/linden/indra/newview/featuretable_linux.txt
+++ b/linden/indra/newview/featuretable_linux.txt
@@ -1,4 +1,4 @@
1version 17 1version 18
2 2
3// NOTE: This is mostly identical to featuretable_mac.txt with a few differences 3// NOTE: This is mostly identical to featuretable_mac.txt with a few differences
4// Should be combined into one table 4// Should be combined into one table
@@ -33,6 +33,7 @@ RenderFlexTimeFactor 1 1.0
33RenderFogRatio 1 4.0 33RenderFogRatio 1 4.0
34RenderGamma 1 0 34RenderGamma 1 0
35RenderGlowResolutionPow 1 9 35RenderGlowResolutionPow 1 9
36RenderGround 1 1
36RenderLightingDetail 1 1 37RenderLightingDetail 1 1
37RenderMaxPartCount 1 8192 38RenderMaxPartCount 1 8192
38RenderNightBrightness 1 1.0 39RenderNightBrightness 1 1.0
@@ -343,21 +344,7 @@ RenderVBOEnable 0 0
343list ATI_All-in-Wonder_7500 344list ATI_All-in-Wonder_7500
344RenderVBOEnable 0 0 345RenderVBOEnable 0 0
345 346
346
347list ATI_Mobility_Radeon_9800
348RenderAvatarCloth 0 0
349VertexShaderEnable 0 0
350WindLightUseAtmosShaders 0 0
351
352list ATI_Mobility_Radeon_9700
353RenderAvatarCloth 0 0
354VertexShaderEnable 0 0
355WindLightUseAtmosShaders 0 0
356
357list ATI_Mobility_Radeon_9600 347list ATI_Mobility_Radeon_9600
358RenderAvatarCloth 0 0
359VertexShaderEnable 0 0
360WindLightUseAtmosShaders 0 0
361Disregard96DefaultDrawDistance 1 0 348Disregard96DefaultDrawDistance 1 0
362 349
363 350
diff --git a/linden/indra/newview/featuretable_mac.txt b/linden/indra/newview/featuretable_mac.txt
index fab8ea9..54a7c11 100644
--- a/linden/indra/newview/featuretable_mac.txt
+++ b/linden/indra/newview/featuretable_mac.txt
@@ -1,4 +1,4 @@
1version 16 1version 18
2 2
3// NOTE: This is mostly identical to featuretable_mac.txt with a few differences 3// NOTE: This is mostly identical to featuretable_mac.txt with a few differences
4// Should be combined into one table 4// Should be combined into one table
@@ -33,6 +33,7 @@ RenderFlexTimeFactor 1 1.0
33RenderFogRatio 1 4.0 33RenderFogRatio 1 4.0
34RenderGamma 1 0 34RenderGamma 1 0
35RenderGlowResolutionPow 1 9 35RenderGlowResolutionPow 1 9
36RenderGround 1 1
36RenderLightingDetail 1 1 37RenderLightingDetail 1 1
37RenderMaxPartCount 1 8192 38RenderMaxPartCount 1 8192
38RenderNightBrightness 1 1.0 39RenderNightBrightness 1 1.0
@@ -291,6 +292,7 @@ RenderVBOEnable 1 0
291list Intel_950 292list Intel_950
292RenderTerrainDetail 1 0 293RenderTerrainDetail 1 0
293RenderVBOEnable 1 0 294RenderVBOEnable 1 0
295RenderGround 1 0
294 296
295list Intel_965 297list Intel_965
296RenderTerrainDetail 1 0 298RenderTerrainDetail 1 0
@@ -324,20 +326,7 @@ list Intel_Springdale
324RenderTerrainDetail 1 0 326RenderTerrainDetail 1 0
325RenderVBOEnable 1 0 327RenderVBOEnable 1 0
326 328
327list ATI_Mobility_Radeon_9800
328RenderAvatarCloth 0 0
329VertexShaderEnable 0 0
330WindLightUseAtmosShaders 0 0
331
332list ATI_Mobility_Radeon_9700
333RenderAvatarCloth 0 0
334VertexShaderEnable 0 0
335WindLightUseAtmosShaders 0 0
336
337list ATI_Mobility_Radeon_9600 329list ATI_Mobility_Radeon_9600
338RenderAvatarCloth 0 0
339VertexShaderEnable 0 0
340WindLightUseAtmosShaders 0 0
341Disregard96DefaultDrawDistance 1 0 330Disregard96DefaultDrawDistance 1 0
342 331
343list NVIDIA_GeForce_8600 332list NVIDIA_GeForce_8600
diff --git a/linden/indra/newview/gpu_table.txt b/linden/indra/newview/gpu_table.txt
index 48af543..eee1831 100644
--- a/linden/indra/newview/gpu_table.txt
+++ b/linden/indra/newview/gpu_table.txt
@@ -26,6 +26,7 @@ ATI All-in-Wonder 7500 .*ATI.*All-in-Wonder 75.* 0 1
26ATI All-in-Wonder 8500 .*ATI.*All-in-Wonder 85.* 0 1 26ATI All-in-Wonder 8500 .*ATI.*All-in-Wonder 85.* 0 1
27ATI All-in-Wonder 9200 .*ATI.*All-in-Wonder 92.* 0 1 27ATI All-in-Wonder 9200 .*ATI.*All-in-Wonder 92.* 0 1
28ATI All-in-Wonder 9xxx .*ATI.*All-in-Wonder 9.* 1 1 28ATI All-in-Wonder 9xxx .*ATI.*All-in-Wonder 9.* 1 1
29ATI All-in-Wonder HD .*ATI.*All-in-Wonder HD.* 1 1
29ATI All-in-Wonder X600 .*ATI.*All-in-Wonder X6.* 1 1 30ATI All-in-Wonder X600 .*ATI.*All-in-Wonder X6.* 1 1
30ATI All-in-Wonder X800 .*ATI.*All-in-Wonder X8.* 2 1 31ATI All-in-Wonder X800 .*ATI.*All-in-Wonder X8.* 2 1
31ATI All-in-Wonder X1800 .*ATI.*All-in-Wonder X18.* 3 1 32ATI All-in-Wonder X1800 .*ATI.*All-in-Wonder X18.* 3 1
@@ -35,7 +36,9 @@ ATI All-in-Wonder Radeon .*ATI.*All-in-Wonder Radeon.* 0 1
35ATI ASUS A9xxx .*ATI.*ASUS.*A9.* 1 1 36ATI ASUS A9xxx .*ATI.*ASUS.*A9.* 1 1
36ATI ASUS AH24xx .*ATI.*ASUS.*AH24.* 1 1 37ATI ASUS AH24xx .*ATI.*ASUS.*AH24.* 1 1
37ATI ASUS AH26xx .*ATI.*ASUS.*AH26.* 3 1 38ATI ASUS AH26xx .*ATI.*ASUS.*AH26.* 3 1
39ATI ASUS AH34xx .*ATI.*ASUS.*AH34.* 1 1
38ATI ASUS AH36xx .*ATI.*ASUS.*AH36.* 3 1 40ATI ASUS AH36xx .*ATI.*ASUS.*AH36.* 3 1
41ATI ASUS AH46xx .*ATI.*ASUS.*AH46.* 3 1
39ATI ASUS AX3xx .*ATI.*ASUS.*AX3.* 1 1 42ATI ASUS AX3xx .*ATI.*ASUS.*AX3.* 1 1
40ATI ASUS AX5xx .*ATI.*ASUS.*AX5.* 1 1 43ATI ASUS AX5xx .*ATI.*ASUS.*AX5.* 1 1
41ATI ASUS AX8xx .*ATI.*ASUS.*AX8.* 2 1 44ATI ASUS AX8xx .*ATI.*ASUS.*AX8.* 2 1
@@ -51,6 +54,7 @@ ATI Diamond X550 .*ATI.*Diamond X550.* 1 1
51ATI Diamond X13xx .*ATI.*Diamond X13.* 1 1 54ATI Diamond X13xx .*ATI.*Diamond X13.* 1 1
52ATI Diamond X16xx .*ATI.*Diamond X16.* 1 1 55ATI Diamond X16xx .*ATI.*Diamond X16.* 1 1
53ATI Diamond X19xx .*ATI.*Diamond X19.* 1 1 56ATI Diamond X19xx .*ATI.*Diamond X19.* 1 1
57ATI Display Adapter .*ATI.*display adapter.* 0 1
54ATI FireGL 5200 .*ATI.*FireGL V52.* 0 1 58ATI FireGL 5200 .*ATI.*FireGL V52.* 0 1
55ATI FireGL 5xxx .*ATI.*FireGL V5.* 1 1 59ATI FireGL 5xxx .*ATI.*FireGL V5.* 1 1
56ATI FireGL .*ATI.*Fire.*GL.* 0 1 60ATI FireGL .*ATI.*Fire.*GL.* 0 1
@@ -61,6 +65,8 @@ ATI IGP 340M .*ATI.*IGP.*340M.* 0 0
61ATI M52 .*ATI.*M52.* 1 1 65ATI M52 .*ATI.*M52.* 1 1
62ATI M54 .*ATI.*M54.* 1 1 66ATI M54 .*ATI.*M54.* 1 1
63ATI M56 .*ATI.*M56.* 1 1 67ATI M56 .*ATI.*M56.* 1 1
68ATI M71 .*ATI.*M71.* 1 1
69ATI M72 .*ATI.*M72.* 1 1
64ATI M76 .*ATI.*M76.* 3 1 70ATI M76 .*ATI.*M76.* 3 1
65ATI Mobility Radeon 7xxx .*ATI.*Mobility.*Radeon 7.* 0 1 71ATI Mobility Radeon 7xxx .*ATI.*Mobility.*Radeon 7.* 0 1
66ATI Mobility Radeon 8xxx .*ATI.*Mobility.*Radeon 8.* 0 1 72ATI Mobility Radeon 8xxx .*ATI.*Mobility.*Radeon 8.* 0 1
@@ -84,9 +90,13 @@ ATI Radeon HD 2300 .*ATI.*Radeon HD 23.* 0 1
84ATI Radeon HD 2400 .*ATI.*Radeon HD.*24.* 1 1 90ATI Radeon HD 2400 .*ATI.*Radeon HD.*24.* 1 1
85ATI Radeon HD 2600 .*ATI.*Radeon HD 26.* 2 1 91ATI Radeon HD 2600 .*ATI.*Radeon HD 26.* 2 1
86ATI Radeon HD 2900 .*ATI.*Radeon HD 29.* 3 1 92ATI Radeon HD 2900 .*ATI.*Radeon HD 29.* 3 1
93ATI Radeon HD 3200 .*ATI.*Radeon HD.*32.* 1 1
94ATI Radeon HD 3300 .*ATI.*Radeon HD.*33.* 1 1
87ATI Radeon HD 3400 .*ATI.*Radeon HD.*34.* 1 1 95ATI Radeon HD 3400 .*ATI.*Radeon HD.*34.* 1 1
88ATI Radeon HD 3600 .*ATI.*Radeon HD.*36.* 3 1 96ATI Radeon HD 3600 .*ATI.*Radeon HD.*36.* 3 1
89ATI Radeon HD 3800 .*ATI.*Radeon HD.*38.* 3 1 97ATI Radeon HD 3800 .*ATI.*Radeon HD.*38.* 3 1
98ATI Radeon HD 4300 .*ATI.*Radeon HD 43.* 1 1
99ATI Radeon HD 4600 .*ATI.*Radeon HD 46.* 3 1
90ATI Radeon HD 4800 .*ATI.*Radeon HD.*48.* 3 1 100ATI Radeon HD 4800 .*ATI.*Radeon HD.*48.* 3 1
91ATI Radeon OpenGL .*ATI.*Radeon OpenGL.* 0 0 101ATI Radeon OpenGL .*ATI.*Radeon OpenGL.* 0 0
92ATI Radeon 2100 .*ATI.*Radeon 21.* 0 1 102ATI Radeon 2100 .*ATI.*Radeon 21.* 0 1
@@ -104,13 +114,14 @@ ATI Radeon RV250 .*ATI.*RV250.* 0 1
104ATI Radeon RV600 .*ATI.*RV6.* 1 1 114ATI Radeon RV600 .*ATI.*RV6.* 1 1
105ATI Radeon RX700 .*ATI.*RX70.* 1 1 115ATI Radeon RX700 .*ATI.*RX70.* 1 1
106ATI Radeon RX800 .*ATI.*Radeon *RX80.* 2 1 116ATI Radeon RX800 .*ATI.*Radeon *RX80.* 2 1
117ATI Radeon RX9550 .*ATI.*RX9550.* 1 1
107ATI Radeon VE .*ATI.*Radeon.*VE.* 0 0 118ATI Radeon VE .*ATI.*Radeon.*VE.* 0 0
108ATI Radeon X1000 .*ATI.*Radeon *X10.* 0 1 119ATI Radeon X1000 .*ATI.*Radeon *X10.* 0 1
109ATI Radeon X1200 .*ATI.*Radeon *X12.* 0 1 120ATI Radeon X1200 .*ATI.*Radeon *X12.* 0 1
110ATI Radeon X1300 .*ATI.*Radeon *X13.* 1 1 121ATI Radeon X1300 .*ATI.*Radeon *X13.* 1 1
111ATI Radeon X1400 .*ATI.*Radeon X14.* 1 1 122ATI Radeon X1400 .*ATI.*Radeon X14.* 1 1
112ATI Radeon X1500 .*ATI.*Radeon X15.* 1 1 123ATI Radeon X1500 .*ATI.*Radeon X15.* 1 1
113ATI Radeon X1600 .*ATI.*Radeon X16.* 1 1 124ATI Radeon X1600 .*ATI.*Radeon *X16.* 1 1
114ATI Radeon X1700 .*ATI.*Radeon X17.* 1 1 125ATI Radeon X1700 .*ATI.*Radeon X17.* 1 1
115ATI Radeon X1800 .*ATI.*Radeon X18.* 3 1 126ATI Radeon X1800 .*ATI.*Radeon X18.* 3 1
116ATI Radeon X1900 .*ATI.*Radeon X19.* 3 1 127ATI Radeon X1900 .*ATI.*Radeon X19.* 3 1
@@ -134,8 +145,8 @@ Intel 865G .*Intel.*865G 0 0
134Intel 900 .*Intel.*900.*900 0 0 145Intel 900 .*Intel.*900.*900 0 0
135Intel 915GM .*Intel.*915GM 0 0 146Intel 915GM .*Intel.*915GM 0 0
136Intel 915G .*Intel.*915G 0 0 147Intel 915G .*Intel.*915G 0 0
137Intel 945GM .*Intel.*945GM 0 1 148Intel 945GM .*Intel.*945GM.* 0 1
138Intel 945G .*Intel.*945G 0 1 149Intel 945G .*Intel.*945G.* 0 1
139Intel 950 .*Intel.*950.* 0 1 150Intel 950 .*Intel.*950.* 0 1
140Intel 965 .*Intel.*965.* 0 1 151Intel 965 .*Intel.*965.* 0 1
141Intel G33 .*Intel.*G33.* 0 0 152Intel G33 .*Intel.*G33.* 0 0
@@ -143,15 +154,20 @@ Intel G45 .*Intel.*G45.* 0 1
143Intel Bear Lake .*Intel.*Bear Lake.* 0 0 154Intel Bear Lake .*Intel.*Bear Lake.* 0 0
144Intel Broadwater .*Intel.*Broadwater.* 0 0 155Intel Broadwater .*Intel.*Broadwater.* 0 0
145Intel Brookdale .*Intel.*Brookdale.* 0 0 156Intel Brookdale .*Intel.*Brookdale.* 0 0
146Intel Eaglelake .*Intel.*Eaglelake.* 0 1 157Intel Cantiga .*Intel.*Cantiga.* 0 0
158Intel Eaglelake .*Intel.*Eaglelake.* 0 0
147Intel Montara .*Intel.*Montara.* 0 0 159Intel Montara .*Intel.*Montara.* 0 0
148Intel Springdale .*Intel.*Springdale.* 0 0 160Intel Springdale .*Intel.*Springdale.* 0 0
149Matrox .*Matrox.* 0 0 161Matrox .*Matrox.* 0 0
150Mesa .*Mesa.* 0 0 162Mesa .*Mesa.* 0 0
151NVIDIA GTX 260 .*NVIDIA.*GeForce.*GTX.*260.* 3 1 163NVIDIA GTX 260 .*NVIDIA.*GeForce.*GTX.*260.* 3 1
152NVIDIA GTX 280 .*NVIDIA.*GeForce.*GTX.*280.* 3 1 164NVIDIA GTX 280 .*NVIDIA.*GeForce.*GTX.*280.* 3 1
165NVIDIA C51 .*NVIDIA.*C51.* 0 1
153NVIDIA G72 .*NVIDIA.*G72.* 1 1 166NVIDIA G72 .*NVIDIA.*G72.* 1 1
154NVIDIA G73 .*NVIDIA.*G73.* 1 1 167NVIDIA G73 .*NVIDIA.*G73.* 1 1
168NVIDIA G84 .*NVIDIA.*G84.* 3 1
169NVIDIA G86 .*NVIDIA.*G86.* 3 1
170NVIDIA G92 .*NVIDIA.*G92.* 3 1
155NVIDIA GeForce .*GeForce 256.* 0 0 171NVIDIA GeForce .*GeForce 256.* 0 0
156NVIDIA GeForce 2 .*GeForce2.* 0 1 172NVIDIA GeForce 2 .*GeForce2.* 0 1
157NVIDIA GeForce 3 .*GeForce3.* 0 1 173NVIDIA GeForce 3 .*GeForce3.* 0 1
@@ -170,17 +186,24 @@ NVIDIA GeForce 7200 .*NVIDIA.*GeForce 72.* 1 1
170NVIDIA GeForce 7300 .*NVIDIA.*GeForce 73.* 1 1 186NVIDIA GeForce 7300 .*NVIDIA.*GeForce 73.* 1 1
171NVIDIA GeForce 7500 .*NVIDIA.*GeForce 75.* 1 1 187NVIDIA GeForce 7500 .*NVIDIA.*GeForce 75.* 1 1
172NVIDIA GeForce 7600 .*NVIDIA.*GeForce 76.* 2 1 188NVIDIA GeForce 7600 .*NVIDIA.*GeForce 76.* 2 1
173NVIDIA GeForce 7800 .*NVIDIA.*GeForce 78.* 2 1 189NVIDIA GeForce 7800 .*NVIDIA.*GeForce.*78.* 2 1
174NVIDIA GeForce 7900 .*NVIDIA.*GeForce 79.* 2 1 190NVIDIA GeForce 7900 .*NVIDIA.*GeForce 79.* 2 1
191NVIDIA GeForce 8100 .*NVIDIA.*GeForce 81.* 1 1
175NVIDIA GeForce 8200 .*NVIDIA.*GeForce 82.* 1 1 192NVIDIA GeForce 8200 .*NVIDIA.*GeForce 82.* 1 1
176NVIDIA GeForce 8300 .*NVIDIA.*GeForce 83.* 1 1 193NVIDIA GeForce 8300 .*NVIDIA.*GeForce 83.* 1 1
177NVIDIA GeForce 8400 .*NVIDIA.*GeForce 84.* 1 1 194NVIDIA GeForce 8400 .*NVIDIA.*GeForce 84.* 1 1
178NVIDIA GeForce 8500 .*NVIDIA.*GeForce 85.* 3 1 195NVIDIA GeForce 8500 .*GeForce 85.* 3 1
179NVIDIA GeForce 8600 .*NVIDIA.*GeForce 86.* 3 1 196NVIDIA GeForce 8600 .*NVIDIA.*GeForce 86.* 3 1
180NVIDIA GeForce 8700 .*NVIDIA.*GeForce 87.* 3 1 197NVIDIA GeForce 8700 .*NVIDIA.*GeForce 87.* 3 1
181NVIDIA GeForce 8800 .*NVIDIA.*GeForce 88.* 3 1 198NVIDIA GeForce 8800 .*NVIDIA.*GeForce 88.* 3 1
182NVIDIA GeForce 9300M .*NVIDIA.*GeForce 9300M.* 1 1 199NVIDIA GeForce 9300M .*NVIDIA.*GeForce 9300M.* 1 1
200NVIDIA GeForce 9400M .*NVIDIA.*GeForce 9400M.* 1 1
183NVIDIA GeForce 9500M .*NVIDIA.*GeForce 9500M.* 2 1 201NVIDIA GeForce 9500M .*NVIDIA.*GeForce 9500M.* 2 1
202NVIDIA GeForce 9600M .*NVIDIA.*GeForce 9600M.* 2 1
203NVIDIA GeForce 9700M .*NVIDIA.*GeForce 9700M.* 2 1
204NVIDIA GeForce 9300 .*NVIDIA.*GeForce 93.* 1 1
205NVIDIA GeForce 9400 .*GeForce 94.* 1 1
206NVIDIA GeForce 9500 .*NVIDIA.*GeForce 95.* 2 1
184NVIDIA GeForce 9600 .*NVIDIA.*GeForce 96.* 3 1 207NVIDIA GeForce 9600 .*NVIDIA.*GeForce 96.* 3 1
185NVIDIA GeForce 9800 .*NVIDIA.*GeForce 98.* 3 1 208NVIDIA GeForce 9800 .*NVIDIA.*GeForce 98.* 3 1
186NVIDIA GeForce FX 5100 .*NVIDIA.*GeForce FX 51.* 0 1 209NVIDIA GeForce FX 5100 .*NVIDIA.*GeForce FX 51.* 0 1
@@ -212,11 +235,23 @@ NVIDIA GeForce Go 7600 .*NVIDIA.*GeForce Go 76.* 2 1
212NVIDIA GeForce Go 7700 .*NVIDIA.*GeForce Go 77.* 2 1 235NVIDIA GeForce Go 7700 .*NVIDIA.*GeForce Go 77.* 2 1
213NVIDIA GeForce Go 7800 .*NVIDIA.*GeForce Go 78.* 2 1 236NVIDIA GeForce Go 7800 .*NVIDIA.*GeForce Go 78.* 2 1
214NVIDIA GeForce Go 7900 .*NVIDIA.*GeForce Go 79.* 2 1 237NVIDIA GeForce Go 7900 .*NVIDIA.*GeForce Go 79.* 2 1
238NVIDIA GeForce GTX 260 .*NVIDIA.*GeForce GTX 26.* 3 1
239NVIDIA GeForce GTX 280 .*NVIDIA.*GeForce GTX 28.* 3 1
240NVIDIA D9M .*D9M.* 1 1
241NVIDIA G84 .*G84.* 1 1
242NVIDIA G92 .*G92.* 3 1
243NVIDIA G94 .*G94.* 3 1
215NVIDIA GeForce Go 6 .*GeForce Go 6.* 1 1 244NVIDIA GeForce Go 6 .*GeForce Go 6.* 1 1
245NVIDIA NB9M .*GeForce NB9M.* 1 1
246NVIDIA NB9P .*GeForce NB9P.* 1 1
216NVIDIA GeForce PCX .*GeForce PCX.* 0 1 247NVIDIA GeForce PCX .*GeForce PCX.* 0 1
217NVIDIA Generic .*NVIDIA.*Unknown.* 0 0 248NVIDIA Generic .*NVIDIA.*Unknown.* 0 0
249NVIDIA NV17 .*GeForce NV17.* 0 1
218NVIDIA NV34 .*NVIDIA.*NV34.* 0 1 250NVIDIA NV34 .*NVIDIA.*NV34.* 0 1
251NVIDIA NV36 .*GeForce NV36.* 1 1
219NVIDIA NV43 .*NVIDIA.*NV43.* 1 1 252NVIDIA NV43 .*NVIDIA.*NV43.* 1 1
253NVIDIA NV44 .*NVIDIA.*NV44.* 1 1
254NVIDIA nForce .*NVIDIA.*nForce.* 0 0
220NVIDIA MCP78 .*NVIDIA.*MCP78.* 1 1 255NVIDIA MCP78 .*NVIDIA.*MCP78.* 1 1
221NVIDIA Quadro2 .*Quadro2.* 0 1 256NVIDIA Quadro2 .*Quadro2.* 0 1
222NVIDIA Quadro4 .*Quadro4.* 0 1 257NVIDIA Quadro4 .*Quadro4.* 0 1
@@ -225,10 +260,12 @@ NVIDIA Quadro FX 4500 .*Quadro.*FX.*4500.* 3 1
225NVIDIA Quadro FX .*Quadro FX.* 1 1 260NVIDIA Quadro FX .*Quadro FX.* 1 1
226NVIDIA Quadro NVS .*Quadro NVS.* 0 1 261NVIDIA Quadro NVS .*Quadro NVS.* 0 1
227NVIDIA RIVA TNT .*RIVA TNT.* 0 0 262NVIDIA RIVA TNT .*RIVA TNT.* 0 0
263NVIDIA PCI .*NVIDIA.*/PCI/SSE2 0 0
228S3 .*S3 Graphics.* 0 0 264S3 .*S3 Graphics.* 0 0
229SiS SiS.* 0 0 265SiS SiS.* 0 0
230Trident Trident.* 0 0 266Trident Trident.* 0 0
231Tungsten Graphics Tungsten.* 0 0 267Tungsten Graphics Tungsten.* 0 0
232XGI XGI.* 0 0 268XGI XGI.* 0 0
233VIA VIA.* 0 0 269VIA VIA.* 0 0
234 270Apple Generic Apple.*Generic.* 0 0
271Apple Software Renderer Apple.*Software Renderer.* 0 0
diff --git a/linden/indra/newview/installers/darwin/releasecandidate-dmg/_DS_Store b/linden/indra/newview/installers/darwin/releasecandidate-dmg/_DS_Store
index c73ba24..a8b7573 100644
--- a/linden/indra/newview/installers/darwin/releasecandidate-dmg/_DS_Store
+++ b/linden/indra/newview/installers/darwin/releasecandidate-dmg/_DS_Store
Binary files differ
diff --git a/linden/indra/newview/installers/windows/FILES_ARE_UNICODE_UTF-16LE.txt b/linden/indra/newview/installers/windows/FILES_ARE_UNICODE_UTF-16LE.txt
new file mode 100644
index 0000000..185c018
--- /dev/null
+++ b/linden/indra/newview/installers/windows/FILES_ARE_UNICODE_UTF-16LE.txt
@@ -0,0 +1,6 @@
1The language files in this directory are Unicode (Little-Endian) format, also known as UTF-16 LE.
2
3This is the format required for NSIS Unicode. See http://www.scratchpaper.com/ for details.
4
5James Cook
6September 2008
diff --git a/linden/indra/newview/installers/windows/installer_template.nsi b/linden/indra/newview/installers/windows/installer_template.nsi
index c795507..01bd98f 100644
--- a/linden/indra/newview/installers/windows/installer_template.nsi
+++ b/linden/indra/newview/installers/windows/installer_template.nsi
@@ -1,30 +1,22 @@
1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2;; secondlife setup.nsi 2;; secondlife setup.nsi
3;; Copyright 2004-2007, Linden Research, Inc. 3;; Copyright 2004-2008, Linden Research, Inc.
4;; For info, see http://www.nullsoft.com/free/nsis/ 4;;
5;; NSIS Unicode 2.38.1 or higher required
6;; http://www.scratchpaper.com/
5;; 7;;
6;; NSIS 2.22 or higher required
7;; Author: James Cook, Don Kjer, Callum Prentice 8;; Author: James Cook, Don Kjer, Callum Prentice
8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
9 10
10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
11;;; Detect NSIS compiler version
12!define "NSIS${NSIS_VERSION}"
13!ifdef "NSISv2.02" | "NSISv2.03" | "NSISv2.04" | "NSISv2.05" | "NSISv2.06"
14 ;; before 2.07 defaulted lzma to solid (whole file)
15 SetCompressor lzma
16!else
17 ;; after 2.07 required /solid for whole file compression
18 SetCompressor /solid lzma
19!endif
20
21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
22;; Compiler flags 12;; Compiler flags
23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
24SetOverwrite on ; overwrite files 14SetOverwrite on ; overwrite files
25SetCompress auto ; compress iff saves space 15SetCompress auto ; compress iff saves space
16SetCompressor /solid lzma ; compress whole installer as one block
26SetDatablockOptimize off ; only saves us 0.1%, not worth it 17SetDatablockOptimize off ; only saves us 0.1%, not worth it
27XPStyle on ; add an XP manifest to the installer 18XPStyle on ; add an XP manifest to the installer
19RequestExecutionLevel admin ; on Vista we must be admin because we write to Program Files
28 20
29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
30;;; Project flags 22;;; Project flags
@@ -41,9 +33,22 @@ XPStyle on ; add an XP manifest to the installer
41!include "%%SOURCE%%\installers\windows\lang_en-us.nsi" 33!include "%%SOURCE%%\installers\windows\lang_en-us.nsi"
42!include "%%SOURCE%%\installers\windows\lang_ja.nsi" 34!include "%%SOURCE%%\installers\windows\lang_ja.nsi"
43!include "%%SOURCE%%\installers\windows\lang_ko.nsi" 35!include "%%SOURCE%%\installers\windows\lang_ko.nsi"
36!include "%%SOURCE%%\installers\windows\lang_pt-br.nsi"
37!include "%%SOURCE%%\installers\windows\lang_fr.nsi"
38!include "%%SOURCE%%\installers\windows\lang_es.nsi"
39!include "%%SOURCE%%\installers\windows\lang_it.nsi"
40!include "%%SOURCE%%\installers\windows\lang_nl.nsi"
41!include "%%SOURCE%%\installers\windows\lang_zh.nsi"
44 42
45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
46;; Tweak for different servers/builds (this placeholder is replaced by viewer_manifest.py) 44;; Tweak for different servers/builds (this placeholder is replaced by viewer_manifest.py)
45;; For example:
46;; !define INSTFLAGS "%(flags)s"
47;; !define INSTNAME "SecondLife%(grid_caps)s"
48;; !define SHORTCUT "Second Life (%(grid_caps)s)"
49;; !define URLNAME "secondlife%(grid)s"
50;; !define UNINSTALL_SETTINGS 1
51
47%%GRID_VARS%% 52%%GRID_VARS%%
48 53
49Name ${INSTNAME} 54Name ${INSTNAME}
@@ -63,11 +68,7 @@ AutoCloseWindow true ; after all files install, close window
63 68
64InstallDir "$PROGRAMFILES\${INSTNAME}" 69InstallDir "$PROGRAMFILES\${INSTNAME}"
65InstallDirRegKey HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\${INSTNAME}" "" 70InstallDirRegKey HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\${INSTNAME}" ""
66!ifdef UPDATE
67DirText $(DirectoryChooseTitle) $(DirectoryChooseUpdate)
68!else
69DirText $(DirectoryChooseTitle) $(DirectoryChooseSetup) 71DirText $(DirectoryChooseTitle) $(DirectoryChooseSetup)
70!endif
71 72
72 73
73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -76,145 +77,41 @@ DirText $(DirectoryChooseTitle) $(DirectoryChooseSetup)
76Var INSTPROG 77Var INSTPROG
77Var INSTEXE 78Var INSTEXE
78Var INSTFLAGS 79Var INSTFLAGS
79Var LANGFLAGS
80Var INSTSHORTCUT 80Var INSTSHORTCUT
81Var COMMANDLINE ; command line passed to this installer, set in .onInit
81 82
82;;; Function definitions should go before file includes, because the NSIS package 83;;; Function definitions should go before file includes, because calls to
83;;; is a single stream of bytecodes + file data. So if your function definitions are at 84;;; DLLs like LangDLL trigger an implicit file include, so if that call is at
84;;; the end of the file it has to decompress the whole thing before it can call a function. JC 85;;; the end of this script NSIS has to decompress the whole installer before
85 86;;; it can call the DLL function. JC
86;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
87; PostInstallExe
88; This just runs any post installation scripts.
89;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
90Function PostInstallExe
91push $0
92 ReadRegStr $0 HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\$INSTPROG" "PostInstallExe"
93 ;MessageBox MB_OK '$0'
94 ExecWait '$0'
95pop $0
96FunctionEnd
97 87
98;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 88!include "FileFunc.nsh" ; For GetParameters, GetOptions
99; CheckStartupParameters 89!insertmacro GetParameters
100; Sets INSTFLAGS, INSTPROG, and INSTEXE. 90!insertmacro GetOptions
101;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
102Function CheckStartupParams
103push $0
104push $R0
105
106 ; Look for a registry entry with info about where to update.
107 Call GetProgramName
108 pop $R0
109 StrCpy $INSTPROG "$R0"
110 StrCpy $INSTEXE "$R0.exe"
111
112 ReadRegStr $0 HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\$INSTPROG" ""
113 ; If key doesn't exist, skip install
114 IfErrors ABORT
115 StrCpy $INSTDIR "$0"
116
117 ; We now have a directory to install to. Get the startup parameters and shortcut as well.
118 ReadRegStr $0 HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\$INSTPROG" "Flags"
119 IfErrors +2
120 StrCpy $INSTFLAGS "$0"
121 ReadRegStr $0 HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\$INSTPROG" "Shortcut"
122 IfErrors +2
123 StrCpy $INSTSHORTCUT "$0"
124 ReadRegStr $0 HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\$INSTPROG" "Exe"
125 IfErrors +2
126 StrCpy $INSTEXE "$0"
127 Goto FINISHED
128
129ABORT:
130 MessageBox MB_OK $(CheckStartupParamsMB)
131 Quit
132
133FINISHED:
134 ;MessageBox MB_OK "INSTPROG: $INSTPROG, INSTEXE: $INSTEXE, INSTFLAGS: $INSTFLAGS"
135pop $R0
136pop $0
137FunctionEnd
138
139;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
140;;
141;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
142Function un.CheckStartupParams
143push $0
144push $R0
145
146 ; Look for a registry entry with info about where to update.
147 Call un.GetProgramName
148 pop $R0
149 StrCpy $INSTPROG "$R0"
150 StrCpy $INSTEXE "$R0.exe"
151
152 ReadRegStr $0 HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\$INSTPROG" ""
153 ; If key doesn't exist, skip install
154 IfErrors ABORT
155 StrCpy $INSTDIR "$0"
156
157 ; We now have a directory to install to. Get the startup parameters and shortcut as well.
158 ReadRegStr $0 HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\$INSTPROG" "Flags"
159 IfErrors +2
160 StrCpy $INSTFLAGS "$0"
161 ReadRegStr $0 HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\$INSTPROG" "Shortcut"
162 IfErrors +2
163 StrCpy $INSTSHORTCUT "$0"
164 ReadRegStr $0 HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\$INSTPROG" "Exe"
165 IfErrors +2
166 StrCpy $INSTEXE "$0"
167 Goto FINISHED
168
169ABORT:
170 MessageBox MB_OK $(CheckStartupParamsMB)
171 Quit
172
173FINISHED:
174 ;MessageBox MB_OK "INSTPROG: $INSTPROG, INSTEXE: $INSTEXE, INSTFLAGS: $INSTFLAGS"
175pop $R0
176pop $0
177FunctionEnd
178 91
179;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 92;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
180;;; After install completes, offer readme file 93;;; After install completes, launch app
181;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 94;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
182Function .onInstSuccess 95Function .onInstSuccess
183 MessageBox MB_YESNO \ 96 Push $R0 # Option value, unused
184 $(InstSuccesssQuestion) /SD IDYES IDNO NoReadme 97 ${GetOptions} $COMMANDLINE "/AUTOSTART" $R0
185 ; Assumes SetOutPath $INSTDIR 98 # If parameter was there (no error) just launch
186 Exec '"$INSTDIR\$INSTEXE" $INSTFLAGS' 99 # Otherwise ask
187 NoReadme: 100 IfErrors label_ask_launch label_launch
101
102label_ask_launch:
103 # Don't launch by default when silent
104 IfSilent label_no_launch
105 MessageBox MB_YESNO $(InstSuccesssQuestion) \
106 IDYES label_launch IDNO label_no_launch
107
108label_launch:
109 # Assumes SetOutPath $INSTDIR
110 Exec '"$INSTDIR\$INSTEXE" $INSTFLAGS'
111label_no_launch:
112 Pop $R0
188FunctionEnd 113FunctionEnd
189 114
190;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
191; Remove old NSIS version. Modifies no variables.
192; Does NOT delete the LindenWorld directory, or any
193; user files in that directory.
194;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
195Function RemoveNSIS
196 Push $0
197 ; Grab the installation directory of the old version
198 DetailPrint $(RemoveOldNSISVersion)
199 ReadRegStr $0 HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\$INSTPROG" ""
200
201 ; If key doesn't exist, skip uninstall
202 IfErrors NO_NSIS
203
204 ; Clean up legacy beta shortcuts
205 Delete "$SMPROGRAMS\Second Life Beta.lnk"
206 Delete "$DESKTOP\Second Life Beta.lnk"
207 Delete "$SMPROGRAMS\Second Life.lnk"
208
209 ; Clean up old newview.exe file
210 Delete "$INSTDIR\newview.exe"
211
212 ; Intentionally don't delete the stuff in
213 ; Documents and Settings, so we keep the user's settings
214
215 NO_NSIS:
216 Pop $0
217FunctionEnd
218 115
219;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 116;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
220; Make sure we're not on Windows 98 / ME 117; Make sure we're not on Windows 98 / ME
@@ -242,28 +139,28 @@ FunctionEnd
242; Make sure the user can install/uninstall 139; Make sure the user can install/uninstall
243;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 140;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
244Function CheckIfAdministrator 141Function CheckIfAdministrator
245 DetailPrint $(CheckAdministratorInstDP) 142 DetailPrint $(CheckAdministratorInstDP)
246 UserInfo::GetAccountType 143 UserInfo::GetAccountType
247 Pop $R0 144 Pop $R0
248 StrCmp $R0 "Admin" is_admin 145 StrCmp $R0 "Admin" lbl_is_admin
249 MessageBox MB_OK $(CheckAdministratorInstMB) 146 MessageBox MB_OK $(CheckAdministratorInstMB)
250 Quit 147 Quit
251is_admin: 148lbl_is_admin:
252 Return 149 Return
253FunctionEnd 150FunctionEnd
254 151
255;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 152;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
256;; 153;;
257;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 154;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
258Function un.CheckIfAdministrator 155Function un.CheckIfAdministrator
259 DetailPrint $(CheckAdministratorUnInstDP) 156 DetailPrint $(CheckAdministratorUnInstDP)
260 UserInfo::GetAccountType 157 UserInfo::GetAccountType
261 Pop $R0 158 Pop $R0
262 StrCmp $R0 "Admin" is_admin 159 StrCmp $R0 "Admin" lbl_is_admin
263 MessageBox MB_OK $(CheckAdministratorUnInstMB) 160 MessageBox MB_OK $(CheckAdministratorUnInstMB)
264 Quit 161 Quit
265is_admin: 162lbl_is_admin:
266 Return 163 Return
267FunctionEnd 164FunctionEnd
268 165
269;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 166;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -310,6 +207,33 @@ Function CloseSecondLife
310 Return 207 Return
311FunctionEnd 208FunctionEnd
312 209
210;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
211; Test our connection to secondlife.com
212; Also allows us to count attempted installs by examining web logs.
213; *TODO: Return current SL version info and have installer check
214; if it is up to date.
215;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
216Function CheckNetworkConnection
217 Push $0
218 Push $1
219 DetailPrint $(CheckNetworkConnectionDP)
220 GetTempFileName $0
221 !define HTTP_TIMEOUT 5000 ; milliseconds
222 ; Don't show secondary progress bar, this will be quick.
223 NSISdl::download_quiet \
224 /TIMEOUT=${HTTP_TIMEOUT} \
225 "http://join.secondlife.com/installer-check/?v=${VERSION_LONG}" \
226 $0
227 Pop $1 ; Return value, either "success", "cancel" or an error message
228 ; MessageBox MB_OK "Download result: $1"
229 ; Result ignored for now
230 ; StrCmp $1 "success" +2
231 ; DetailPrint "Connection failed: $1"
232 Delete $0 ; temporary file
233 Pop $1
234 Pop $0
235 Return
236FunctionEnd
313 237
314;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 238;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
315; Delete files in Documents and Settings\<user>\SecondLife\cache 239; Delete files in Documents and Settings\<user>\SecondLife\cache
@@ -577,7 +501,6 @@ StrCpy $INSTFLAGS ""
577StrCpy $INSTPROG "${INSTNAME}" 501StrCpy $INSTPROG "${INSTNAME}"
578StrCpy $INSTEXE "${INSTEXE}" 502StrCpy $INSTEXE "${INSTEXE}"
579StrCpy $INSTSHORTCUT "${SHORTCUT}" 503StrCpy $INSTSHORTCUT "${SHORTCUT}"
580Call un.CheckStartupParams ; Figure out where, what and how to uninstall.
581Call un.CheckIfAdministrator ; Make sure the user can install/uninstall 504Call un.CheckIfAdministrator ; Make sure the user can install/uninstall
582 505
583; uninstall for all users (if you change this, change it in the install as well) 506; uninstall for all users (if you change this, change it in the install as well)
@@ -586,10 +509,9 @@ SetShellVarContext all
586; Make sure we're not running 509; Make sure we're not running
587Call un.CloseSecondLife 510Call un.CloseSecondLife
588 511
589; Clean up registry keys (these should all be !defines somewhere) 512; Clean up registry keys and subkeys (these should all be !defines somewhere)
590DeleteRegKey HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\$INSTPROG" 513DeleteRegKey HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\$INSTPROG"
591DeleteRegKey HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$INSTPROG" 514DeleteRegKey HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$INSTPROG"
592DeleteRegKey HKEY_LOCAL_MACHINE "Software\Linden Research, Inc.\Installer Language"
593 515
594; Clean up shortcuts 516; Clean up shortcuts
595Delete "$SMPROGRAMS\$INSTSHORTCUT\*.*" 517Delete "$SMPROGRAMS\$INSTSHORTCUT\*.*"
@@ -613,123 +535,6 @@ Call un.ProgramFiles
613 535
614SectionEnd ; end of uninstall section 536SectionEnd ; end of uninstall section
615 537
616;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
617; (From the NSIS wiki, DK)
618; GetParameterValue
619;
620; Usage:
621; !insertmacro GetParameterValue "/L=" "1033"
622; pop $R0
623;
624; Returns on top of stack
625;
626; Example command lines:
627; foo.exe /S /L=1033 /D=C:\Program Files\Foo
628; or:
629; foo.exe /S "/L=1033" /D="C:\Program Files\Foo"
630; gpv "/L=" "1033"
631;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
632
633 !macro GetParameterValue SWITCH DEFAULT
634 Push $0
635 Push $1
636 Push $2
637 Push $3
638 Push $4
639
640 ;$CMDLINE='"My Setup\Setup.exe" /L=1033 /S'
641 Push "$CMDLINE"
642 Push '${SWITCH}"'
643 !insertmacro StrStr
644 Pop $0
645 StrCmp "$0" "" gpv_notquoted
646 ;$0='/L="1033" /S'
647 StrLen $2 "$0"
648 Strlen $1 "${SWITCH}"
649 IntOp $1 $1 + 1
650 StrCpy $0 "$0" $2 $1
651 ;$0='1033" /S'
652 Push "$0"
653 Push '"'
654 !insertmacro StrStr
655 Pop $1
656 StrLen $2 "$0"
657 StrLen $3 "$1"
658 IntOp $4 $2 - $3
659 StrCpy $0 $0 $4 0
660 Goto gpv_done
661
662 gpv_notquoted:
663 Push "$CMDLINE"
664 Push "${SWITCH}"
665 !insertmacro StrStr
666 Pop $0
667 StrCmp "$0" "" gpv_done
668 ;$0='/L="1033" /S'
669 StrLen $2 "$0"
670 Strlen $1 "${SWITCH}"
671 StrCpy $0 "$0" $2 $1
672 ;$0=1033 /S'
673 Push "$0"
674 Push ' '
675 !insertmacro StrStr
676 Pop $1
677 StrLen $2 "$0"
678 StrLen $3 "$1"
679 IntOp $4 $2 - $3
680 StrCpy $0 $0 $4 0
681 Goto gpv_done
682
683 gpv_done:
684 StrCmp "$0" "" 0 +2
685 StrCpy $0 "${DEFAULT}"
686
687 Pop $4
688 Pop $3
689 Pop $2
690 Pop $1
691 Exch $0
692 !macroend
693
694; And I had to modify StrStr a tiny bit.
695; Possible upgrade switch the goto's to use ${__LINE__}
696
697!macro STRSTR
698 Exch $R1 ; st=haystack,old$R1, $R1=needle
699 Exch ; st=old$R1,haystack
700 Exch $R2 ; st=old$R1,old$R2, $R2=haystack
701 Push $R3
702 Push $R4
703 Push $R5
704 StrLen $R3 $R1
705 StrCpy $R4 0
706 ; $R1=needle
707 ; $R2=haystack
708 ; $R3=len(needle)
709 ; $R4=cnt
710 ; $R5=tmp
711 ; loop;
712 StrCpy $R5 $R2 $R3 $R4
713 StrCmp $R5 $R1 +4
714 StrCmp $R5 "" +3
715 IntOp $R4 $R4 + 1
716 Goto -4
717 ; done;
718 StrCpy $R1 $R2 "" $R4
719 Pop $R5
720 Pop $R4
721 Pop $R3
722 Pop $R2
723 Exch $R1
724!macroend
725
726Function GetProgramName
727 !insertmacro GetParameterValue "/P=" "SecondLife"
728FunctionEnd
729
730Function un.GetProgramName
731 !insertmacro GetParameterValue "/P=" "SecondLife"
732FunctionEnd
733 538
734;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 539;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
735; (From the NSIS documentation, JC) 540; (From the NSIS documentation, JC)
@@ -827,42 +632,59 @@ FunctionEnd
827;; entry to the language ID selector below 632;; entry to the language ID selector below
828;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 633;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
829Function .onInit 634Function .onInit
830 635 Push $0
831 ; read the language from registry (ok if not there) and set langauge menu 636 ${GetParameters} $COMMANDLINE ; get our command line
637 ${GetOptions} $COMMANDLINE "/LANGID=" $0 ; /LANGID=1033 implies US English
638 ; If no language (error), then proceed
639 IfErrors lbl_check_silent
640 ; No error means we got a language, so use it
641 StrCpy $LANGUAGE $0
642 Goto lbl_return
643
644lbl_check_silent:
645 ; For silent installs, no language prompt, use default
646 IfSilent lbl_return
647
648 ; If we currently have a version of SL installed, default to the language of that install
649 ; Otherwise don't change $LANGUAGE and it will default to the OS UI language.
832 ReadRegStr $0 HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\${INSTNAME}" "InstallerLanguage" 650 ReadRegStr $0 HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\${INSTNAME}" "InstallerLanguage"
651 IfErrors lbl_build_menu
833 StrCpy $LANGUAGE $0 652 StrCpy $LANGUAGE $0
834 653
654lbl_build_menu:
835 Push "" 655 Push ""
836 Push ${LANG_ENGLISH} 656 # Use separate file so labels can be UTF-16 but we can still merge changes
837 Push English 657 # into this ASCII file. JC
838 Push ${LANG_GERMAN} 658 !include "%%SOURCE%%\installers\windows\language_menu.nsi"
839 Push German 659
840 Push ${LANG_JAPANESE}
841 Push Japanese
842 Push ${LANG_KOREAN}
843 Push Korean
844 Push A ; A means auto count languages for the auto count to work the first empty push (Push "") must remain 660 Push A ; A means auto count languages for the auto count to work the first empty push (Push "") must remain
845 LangDLL::LangDialog "Installer Language" "Please select the language of the installer" 661 LangDLL::LangDialog $(InstallerLanguageTitle) $(SelectInstallerLanguage)
846 Pop $LANGUAGE 662 Pop $0
847 StrCmp $LANGUAGE "cancel" 0 +2 663 StrCmp $0 "cancel" 0 +2
848 Abort 664 Abort
665 StrCpy $LANGUAGE $0
849 666
850 ; save language in registry 667 ; save language in registry
851 WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\${INSTNAME}" "InstallerLanguage" $LANGUAGE 668 WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\${INSTNAME}" "InstallerLanguage" $LANGUAGE
669lbl_return:
670 Pop $0
671 Return
852FunctionEnd 672FunctionEnd
853 673
854;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 674;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
855Function un.onInit 675Function un.onInit
856 676 ; read language from registry and set for uninstaller
857 ; read language from registry and set for ininstaller 677 ; Key will be removed on successful uninstall
858 ReadRegStr $0 HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\${INSTNAME}" "InstallerLanguage" 678 ReadRegStr $0 HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\${INSTNAME}" "InstallerLanguage"
679 IfErrors lbl_end
859 StrCpy $LANGUAGE $0 680 StrCpy $LANGUAGE $0
860 681lbl_end:
682 Return
861FunctionEnd 683FunctionEnd
862 684
863 685
864;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 686;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
865;;; Sections 687;;; MAIN SECTION
866;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 688;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
867Section "" ; (default section) 689Section "" ; (default section)
868 690
@@ -874,15 +696,11 @@ StrCpy $INSTPROG "${INSTNAME}"
874StrCpy $INSTEXE "${INSTEXE}" 696StrCpy $INSTEXE "${INSTEXE}"
875StrCpy $INSTSHORTCUT "${SHORTCUT}" 697StrCpy $INSTSHORTCUT "${SHORTCUT}"
876 698
877IfSilent +2
878Goto NOT_SILENT
879 Call CheckStartupParams ; Figure out where, what and how to install.
880NOT_SILENT:
881Call CheckWindowsVersion ; warn if on Windows 98/ME 699Call CheckWindowsVersion ; warn if on Windows 98/ME
882Call CheckIfAdministrator ; Make sure the user can install/uninstall 700Call CheckIfAdministrator ; Make sure the user can install/uninstall
883Call CheckIfAlreadyCurrent ; Make sure that we haven't already installed this version 701Call CheckIfAlreadyCurrent ; Make sure that we haven't already installed this version
884Call CloseSecondLife ; Make sure we're not running 702Call CloseSecondLife ; Make sure we're not running
885Call RemoveNSIS ; Check for old NSIS install to remove 703Call CheckNetworkConnection ; ping secondlife.com
886 704
887;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 705;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
888;;; Don't remove cache files during a regular install, removing the inventory cache on upgrades results in lots of damage to the servers. 706;;; Don't remove cache files during a regular install, removing the inventory cache on upgrades results in lots of damage to the servers.
@@ -907,9 +725,6 @@ Call RemoveOldReleaseNotes
907;; This placeholder is replaced by the complete list of all the files in the installer, by viewer_manifest.py 725;; This placeholder is replaced by the complete list of all the files in the installer, by viewer_manifest.py
908%%INSTALL_FILES%% 726%%INSTALL_FILES%%
909 727
910;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
911; If this is a silent update, we don't need to re-create these shortcuts or registry entries.
912IfSilent POST_INSTALL
913 728
914;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 729;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
915; Shortcuts in start menu 730; Shortcuts in start menu
@@ -918,25 +733,18 @@ SetOutPath "$INSTDIR"
918CreateShortCut "$SMPROGRAMS\$INSTSHORTCUT\$INSTSHORTCUT.lnk" \ 733CreateShortCut "$SMPROGRAMS\$INSTSHORTCUT\$INSTSHORTCUT.lnk" \
919 "$INSTDIR\$INSTEXE" "$INSTFLAGS" 734 "$INSTDIR\$INSTEXE" "$INSTFLAGS"
920 735
921!ifdef MUSEUM
922CreateShortCut "$SMPROGRAMS\$INSTSHORTCUT\$INSTSHORTCUT Museum.lnk" \
923 736
924 "$INSTDIR\$INSTEXE" "$INSTFLAGS -simple" 737WriteINIStr "$SMPROGRAMS\$INSTSHORTCUT\SL Create Account.url" \
925CreateShortCut "$SMPROGRAMS\$INSTSHORTCUT\$INSTSHORTCUT Museum Spanish.lnk" \
926
927 "$INSTDIR\$INSTEXE" "$INSTFLAGS -simple -spanish"
928!endif
929
930WriteINIStr "$SMPROGRAMS\$INSTSHORTCUT\SL Create Trial Account.url" \
931 "InternetShortcut" "URL" \ 738 "InternetShortcut" "URL" \
932 "http://www.secondlife.com/registration/" 739 "http://www.secondlife.com/registration/"
933WriteINIStr "$SMPROGRAMS\$INSTSHORTCUT\SL Your Account.url" \ 740WriteINIStr "$SMPROGRAMS\$INSTSHORTCUT\SL Your Account.url" \
934 "InternetShortcut" "URL" \ 741 "InternetShortcut" "URL" \
935 "http://www.secondlife.com/account/" 742 "http://www.secondlife.com/account/"
936CreateShortCut "$SMPROGRAMS\$INSTSHORTCUT\SL Scripting Language Help.lnk" \ 743WriteINIStr "$SMPROGRAMS\$INSTSHORTCUT\SL Scripting Language Help.url" \
937 "$INSTDIR\lsl_guide.html" 744 "InternetShortcut" "URL" \
745 "http://wiki.secondlife.com/wiki/LSL_Portal"
938CreateShortCut "$SMPROGRAMS\$INSTSHORTCUT\Uninstall $INSTSHORTCUT.lnk" \ 746CreateShortCut "$SMPROGRAMS\$INSTSHORTCUT\Uninstall $INSTSHORTCUT.lnk" \
939 '"$INSTDIR\uninst.exe"' '/P="$INSTPROG"' 747 '"$INSTDIR\uninst.exe"' ''
940 748
941;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 749;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
942; Other shortcuts 750; Other shortcuts
@@ -944,18 +752,8 @@ SetOutPath "$INSTDIR"
944CreateShortCut "$DESKTOP\$INSTSHORTCUT.lnk" "$INSTDIR\$INSTEXE" "$INSTFLAGS" 752CreateShortCut "$DESKTOP\$INSTSHORTCUT.lnk" "$INSTDIR\$INSTEXE" "$INSTFLAGS"
945CreateShortCut "$INSTDIR\$INSTSHORTCUT.lnk" "$INSTDIR\$INSTEXE" "$INSTFLAGS" 753CreateShortCut "$INSTDIR\$INSTSHORTCUT.lnk" "$INSTDIR\$INSTEXE" "$INSTFLAGS"
946CreateShortCut "$INSTDIR\Uninstall $INSTSHORTCUT.lnk" \ 754CreateShortCut "$INSTDIR\Uninstall $INSTSHORTCUT.lnk" \
947 '"$INSTDIR\uninst.exe"' '/P="$INSTPROG"' 755 '"$INSTDIR\uninst.exe"' ''
948
949!ifdef MUSEUM
950CreateShortCut "$DESKTOP\$INSTSHORTCUT Museum.lnk" "$INSTDIR\$INSTEXE" "$INSTFLAGS -simple"
951 756
952CreateShortCut "$DESKTOP\$INSTSHORTCUT Museum Spanish.lnk" "$INSTDIR\$INSTEXE" "$INSTFLAGS -simple -spanish"
953
954CreateShortCut "$INSTDIR\$INSTSHORTCUT Museum.lnk" "$INSTDIR\$INSTEXE" "$INSTFLAGS -simple"
955
956CreateShortCut "$INSTDIR\$INSTSHORTCUT Museum Spanish.lnk" "$INSTDIR\$INSTEXE" "$INSTFLAGS -simple -spanish"
957
958!endif
959 757
960;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 758;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
961; Write registry 759; Write registry
@@ -965,22 +763,17 @@ WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\$INSTPROG" "Flags
965WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\$INSTPROG" "Shortcut" "$INSTSHORTCUT" 763WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\$INSTPROG" "Shortcut" "$INSTSHORTCUT"
966WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\$INSTPROG" "Exe" "$INSTEXE" 764WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\$INSTPROG" "Exe" "$INSTEXE"
967WriteRegStr HKEY_LOCAL_MACHINE "Software\Microsoft\Windows\CurrentVersion\Uninstall\$INSTPROG" "DisplayName" "$INSTPROG (remove only)" 765WriteRegStr HKEY_LOCAL_MACHINE "Software\Microsoft\Windows\CurrentVersion\Uninstall\$INSTPROG" "DisplayName" "$INSTPROG (remove only)"
968WriteRegStr HKEY_LOCAL_MACHINE "Software\Microsoft\Windows\CurrentVersion\Uninstall\$INSTPROG" "UninstallString" '"$INSTDIR\uninst.exe" /P="$INSTPROG"' 766WriteRegStr HKEY_LOCAL_MACHINE "Software\Microsoft\Windows\CurrentVersion\Uninstall\$INSTPROG" "UninstallString" '"$INSTDIR\uninst.exe"'
969 767
970;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 768;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
971; Write URL registry info 769; Write URL registry info
972WriteRegStr HKEY_CLASSES_ROOT "${URLNAME}" "(default)" "URL:Second Life" 770WriteRegStr HKEY_CLASSES_ROOT "${URLNAME}" "(default)" "URL:Second Life"
973WriteRegStr HKEY_CLASSES_ROOT "${URLNAME}" "URL Protocol" "" 771WriteRegStr HKEY_CLASSES_ROOT "${URLNAME}" "URL Protocol" ""
974WriteRegStr HKEY_CLASSES_ROOT "${URLNAME}\DefaultIcon" "" '"$INSTDIR\$INSTEXE"' 772WriteRegStr HKEY_CLASSES_ROOT "${URLNAME}\DefaultIcon" "" '"$INSTDIR\$INSTEXE"'
773;; URL param must be last item passed to viewer, it ignores subsequent params
774;; to avoid parameter injection attacks.
975WriteRegExpandStr HKEY_CLASSES_ROOT "${URLNAME}\shell\open\command" "" '"$INSTDIR\$INSTEXE" $INSTFLAGS -url "%1"' 775WriteRegExpandStr HKEY_CLASSES_ROOT "${URLNAME}\shell\open\command" "" '"$INSTDIR\$INSTEXE" $INSTFLAGS -url "%1"'
976 776
977Goto WRITE_UNINST
978
979POST_INSTALL:
980; Run a post-executable script if necessary.
981Call PostInstallExe
982
983WRITE_UNINST:
984; write out uninstaller 777; write out uninstaller
985WriteUninstaller "$INSTDIR\uninst.exe" 778WriteUninstaller "$INSTDIR\uninst.exe"
986 779
diff --git a/linden/indra/newview/installers/windows/lang_de.nsi b/linden/indra/newview/installers/windows/lang_de.nsi
index c410128..911ed74 100644
--- a/linden/indra/newview/installers/windows/lang_de.nsi
+++ b/linden/indra/newview/installers/windows/lang_de.nsi
Binary files differ
diff --git a/linden/indra/newview/installers/windows/lang_en-us.nsi b/linden/indra/newview/installers/windows/lang_en-us.nsi
index 218f1c6..a015413 100644
--- a/linden/indra/newview/installers/windows/lang_en-us.nsi
+++ b/linden/indra/newview/installers/windows/lang_en-us.nsi
Binary files differ
diff --git a/linden/indra/newview/installers/windows/lang_es.nsi b/linden/indra/newview/installers/windows/lang_es.nsi
new file mode 100644
index 0000000..3340a12
--- /dev/null
+++ b/linden/indra/newview/installers/windows/lang_es.nsi
Binary files differ
diff --git a/linden/indra/newview/installers/windows/lang_fr.nsi b/linden/indra/newview/installers/windows/lang_fr.nsi
new file mode 100644
index 0000000..5c17ad0
--- /dev/null
+++ b/linden/indra/newview/installers/windows/lang_fr.nsi
Binary files differ
diff --git a/linden/indra/newview/installers/windows/lang_it.nsi b/linden/indra/newview/installers/windows/lang_it.nsi
new file mode 100644
index 0000000..9f18013
--- /dev/null
+++ b/linden/indra/newview/installers/windows/lang_it.nsi
Binary files differ
diff --git a/linden/indra/newview/installers/windows/lang_ja.nsi b/linden/indra/newview/installers/windows/lang_ja.nsi
index 5e0496e..f564291 100644
--- a/linden/indra/newview/installers/windows/lang_ja.nsi
+++ b/linden/indra/newview/installers/windows/lang_ja.nsi
Binary files differ
diff --git a/linden/indra/newview/installers/windows/lang_ko.nsi b/linden/indra/newview/installers/windows/lang_ko.nsi
index b570315..5162b7d 100644
--- a/linden/indra/newview/installers/windows/lang_ko.nsi
+++ b/linden/indra/newview/installers/windows/lang_ko.nsi
Binary files differ
diff --git a/linden/indra/newview/installers/windows/lang_nl.nsi b/linden/indra/newview/installers/windows/lang_nl.nsi
new file mode 100644
index 0000000..42453ba
--- /dev/null
+++ b/linden/indra/newview/installers/windows/lang_nl.nsi
Binary files differ
diff --git a/linden/indra/newview/installers/windows/lang_pt-br.nsi b/linden/indra/newview/installers/windows/lang_pt-br.nsi
new file mode 100644
index 0000000..6524cc7
--- /dev/null
+++ b/linden/indra/newview/installers/windows/lang_pt-br.nsi
Binary files differ
diff --git a/linden/indra/newview/installers/windows/lang_zh.nsi b/linden/indra/newview/installers/windows/lang_zh.nsi
new file mode 100644
index 0000000..e644e63
--- /dev/null
+++ b/linden/indra/newview/installers/windows/lang_zh.nsi
Binary files differ
diff --git a/linden/indra/newview/installers/windows/language_menu.nsi b/linden/indra/newview/installers/windows/language_menu.nsi
new file mode 100644
index 0000000..473f9e0
--- /dev/null
+++ b/linden/indra/newview/installers/windows/language_menu.nsi
Binary files differ
diff --git a/linden/indra/newview/llagent.cpp b/linden/indra/newview/llagent.cpp
index d268397..2237d67 100644
--- a/linden/indra/newview/llagent.cpp
+++ b/linden/indra/newview/llagent.cpp
@@ -80,6 +80,7 @@
80#include "llfloatertools.h" 80#include "llfloatertools.h"
81#include "llfloaterworldmap.h" 81#include "llfloaterworldmap.h"
82#include "llgroupmgr.h" 82#include "llgroupmgr.h"
83#include "llhomelocationresponder.h"
83#include "llhudeffectlookat.h" 84#include "llhudeffectlookat.h"
84#include "llhudmanager.h" 85#include "llhudmanager.h"
85#include "llinventorymodel.h" 86#include "llinventorymodel.h"
@@ -90,6 +91,7 @@
90#include "llmoveview.h" 91#include "llmoveview.h"
91#include "llnotify.h" 92#include "llnotify.h"
92#include "llquantize.h" 93#include "llquantize.h"
94#include "llsdutil.h"
93#include "llselectmgr.h" 95#include "llselectmgr.h"
94#include "llsky.h" 96#include "llsky.h"
95#include "llrendersphere.h" 97#include "llrendersphere.h"
@@ -445,7 +447,7 @@ void LLAgent::init()
445 mCameraFocusOffsetTarget = LLVector4(gSavedSettings.getVector3("CameraOffsetBuild")); 447 mCameraFocusOffsetTarget = LLVector4(gSavedSettings.getVector3("CameraOffsetBuild"));
446 mCameraOffsetDefault = gSavedSettings.getVector3("CameraOffsetDefault"); 448 mCameraOffsetDefault = gSavedSettings.getVector3("CameraOffsetDefault");
447// mCameraOffsetNorm = mCameraOffsetDefault; 449// mCameraOffsetNorm = mCameraOffsetDefault;
448// mCameraOffsetNorm.normVec(); 450// mCameraOffsetNorm.normalize();
449 mCameraCollidePlane.clearVec(); 451 mCameraCollidePlane.clearVec();
450 mCurrentCameraDistance = mCameraOffsetDefault.magVec(); 452 mCurrentCameraDistance = mCameraOffsetDefault.magVec();
451 mTargetCameraDistance = mCurrentCameraDistance; 453 mTargetCameraDistance = mCurrentCameraDistance;
@@ -490,7 +492,7 @@ LLAgent::~LLAgent()
490//----------------------------------------------------------------------------- 492//-----------------------------------------------------------------------------
491// resetView() 493// resetView()
492//----------------------------------------------------------------------------- 494//-----------------------------------------------------------------------------
493void LLAgent::resetView(BOOL reset_camera) 495void LLAgent::resetView(BOOL reset_camera, BOOL change_camera)
494{ 496{
495 if (mAutoPilot) 497 if (mAutoPilot)
496 { 498 {
@@ -515,6 +517,30 @@ void LLAgent::resetView(BOOL reset_camera)
515 gMenuHolder->hideMenus(); 517 gMenuHolder->hideMenus();
516 } 518 }
517 519
520 if (change_camera && !gSavedSettings.getBOOL("FreezeTime"))
521 {
522 changeCameraToDefault();
523
524 if (LLViewerJoystick::getInstance()->getOverrideCamera())
525 {
526 handle_toggle_flycam();
527 }
528
529 // reset avatar mode from eventual residual motion
530 if (LLToolMgr::getInstance()->inBuildMode())
531 {
532 LLViewerJoystick::getInstance()->moveAvatar(true);
533 }
534
535 gFloaterTools->close();
536
537 gViewerWindow->showCursor();
538
539 // Switch back to basic toolset
540 LLToolMgr::getInstance()->setCurrentToolset(gBasicToolset);
541 }
542
543
518 if (reset_camera && !gSavedSettings.getBOOL("FreezeTime")) 544 if (reset_camera && !gSavedSettings.getBOOL("FreezeTime"))
519 { 545 {
520 if (!gViewerWindow->getLeftMouseDown() && cameraThirdPerson()) 546 if (!gViewerWindow->getLeftMouseDown() && cameraThirdPerson())
@@ -522,7 +548,7 @@ void LLAgent::resetView(BOOL reset_camera)
522 // leaving mouse-steer mode 548 // leaving mouse-steer mode
523 LLVector3 agent_at_axis = getAtAxis(); 549 LLVector3 agent_at_axis = getAtAxis();
524 agent_at_axis -= projected_vec(agent_at_axis, getReferenceUpVector()); 550 agent_at_axis -= projected_vec(agent_at_axis, getReferenceUpVector());
525 agent_at_axis.normVec(); 551 agent_at_axis.normalize();
526 gAgent.resetAxes(lerp(getAtAxis(), agent_at_axis, LLCriticalDamp::getInterpolant(0.3f))); 552 gAgent.resetAxes(lerp(getAtAxis(), agent_at_axis, LLCriticalDamp::getInterpolant(0.3f)));
527 } 553 }
528 554
@@ -1033,7 +1059,7 @@ void LLAgent::slamLookAt(const LLVector3 &look_at)
1033{ 1059{
1034 LLVector3 look_at_norm = look_at; 1060 LLVector3 look_at_norm = look_at;
1035 look_at_norm.mV[VZ] = 0.f; 1061 look_at_norm.mV[VZ] = 0.f;
1036 look_at_norm.normVec(); 1062 look_at_norm.normalize();
1037 resetAxes(look_at_norm); 1063 resetAxes(look_at_norm);
1038} 1064}
1039 1065
@@ -1294,7 +1320,7 @@ LLQuaternion LLAgent::getQuat() const
1294//----------------------------------------------------------------------------- 1320//-----------------------------------------------------------------------------
1295// calcFocusOffset() 1321// calcFocusOffset()
1296//----------------------------------------------------------------------------- 1322//-----------------------------------------------------------------------------
1297LLVector3 LLAgent::calcFocusOffset(LLViewerObject *object, S32 x, S32 y) 1323LLVector3 LLAgent::calcFocusOffset(LLViewerObject *object, LLVector3 pos_agent, S32 x, S32 y)
1298{ 1324{
1299 // calculate offset based on view direction 1325 // calculate offset based on view direction
1300 BOOL is_avatar = object->isAvatar(); 1326 BOOL is_avatar = object->isAvatar();
@@ -1305,7 +1331,7 @@ LLVector3 LLAgent::calcFocusOffset(LLViewerObject *object, S32 x, S32 y)
1305 1331
1306 LLVector3 obj_dir_abs = obj_pos - LLViewerCamera::getInstance()->getOrigin(); 1332 LLVector3 obj_dir_abs = obj_pos - LLViewerCamera::getInstance()->getOrigin();
1307 obj_dir_abs.rotVec(inv_obj_rot); 1333 obj_dir_abs.rotVec(inv_obj_rot);
1308 obj_dir_abs.normVec(); 1334 obj_dir_abs.normalize();
1309 obj_dir_abs.abs(); 1335 obj_dir_abs.abs();
1310 1336
1311 LLVector3 object_extents = object->getScale(); 1337 LLVector3 object_extents = object->getScale();
@@ -1330,7 +1356,7 @@ LLVector3 LLAgent::calcFocusOffset(LLViewerObject *object, S32 x, S32 y)
1330 { 1356 {
1331 normal.setVec(obj_matrix.getUpRow4()); 1357 normal.setVec(obj_matrix.getUpRow4());
1332 } 1358 }
1333 normal.normVec(); 1359 normal.normalize();
1334 1360
1335 LLVector3d focus_pt_global; 1361 LLVector3d focus_pt_global;
1336 // RN: should we check return value for valid pick? 1362 // RN: should we check return value for valid pick?
@@ -1397,7 +1423,7 @@ LLVector3 LLAgent::calcFocusOffset(LLViewerObject *object, S32 x, S32 y)
1397 if (!is_avatar) 1423 if (!is_avatar)
1398 { 1424 {
1399 //unproject relative clicked coordinate from window coordinate using GL 1425 //unproject relative clicked coordinate from window coordinate using GL
1400 GLint viewport[4]; 1426 /*GLint viewport[4];
1401 GLdouble modelview[16]; 1427 GLdouble modelview[16];
1402 GLdouble projection[16]; 1428 GLdouble projection[16];
1403 GLfloat winX, winY, winZ; 1429 GLfloat winX, winY, winZ;
@@ -1419,11 +1445,9 @@ LLVector3 LLAgent::calcFocusOffset(LLViewerObject *object, S32 x, S32 y)
1419 winY = ((F32)y) * gViewerWindow->getDisplayScale().mV[VY]; 1445 winY = ((F32)y) * gViewerWindow->getDisplayScale().mV[VY];
1420 glReadPixels( llfloor(winX), llfloor(winY), 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &winZ ); 1446 glReadPixels( llfloor(winX), llfloor(winY), 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &winZ );
1421 1447
1422 gluUnProject( winX, winY, winZ, modelview, projection, viewport, &posX, &posY, &posZ); 1448 gluUnProject( winX, winY, winZ, modelview, projection, viewport, &posX, &posY, &posZ);*/
1423 1449
1424 LLVector3 obj_rel((F32)posX, (F32)posY, (F32)posZ); 1450 LLVector3 obj_rel = pos_agent - object->getRenderPosition();
1425 obj_rel = obj_rel * object->getRenderMatrix();
1426 obj_rel -= object->getRenderPosition();
1427 1451
1428 LLVector3 obj_center = LLVector3(0, 0, 0) * object->getRenderMatrix(); 1452 LLVector3 obj_center = LLVector3(0, 0, 0) * object->getRenderMatrix();
1429 1453
@@ -1534,7 +1558,7 @@ BOOL LLAgent::calcCameraMinDistance(F32 &obj_min_distance)
1534 camera_offset_target_abs_norm.abs(); 1558 camera_offset_target_abs_norm.abs();
1535 // make sure offset is non-zero 1559 // make sure offset is non-zero
1536 camera_offset_target_abs_norm.clamp(0.001f, F32_MAX); 1560 camera_offset_target_abs_norm.clamp(0.001f, F32_MAX);
1537 camera_offset_target_abs_norm.normVec(); 1561 camera_offset_target_abs_norm.normalize();
1538 1562
1539 // find camera position relative to normalized object extents 1563 // find camera position relative to normalized object extents
1540 LLVector3 camera_offset_target_scaled = camera_offset_target_abs_norm; 1564 LLVector3 camera_offset_target_scaled = camera_offset_target_abs_norm;
@@ -1580,7 +1604,7 @@ BOOL LLAgent::calcCameraMinDistance(F32 &obj_min_distance)
1580 LLVector3 object_split_axis; 1604 LLVector3 object_split_axis;
1581 LLVector3 target_offset_scaled = target_offset_origin; 1605 LLVector3 target_offset_scaled = target_offset_origin;
1582 target_offset_scaled.abs(); 1606 target_offset_scaled.abs();
1583 target_offset_scaled.normVec(); 1607 target_offset_scaled.normalize();
1584 target_offset_scaled.mV[VX] /= object_extents.mV[VX]; 1608 target_offset_scaled.mV[VX] /= object_extents.mV[VX];
1585 target_offset_scaled.mV[VY] /= object_extents.mV[VY]; 1609 target_offset_scaled.mV[VY] /= object_extents.mV[VY];
1586 target_offset_scaled.mV[VZ] /= object_extents.mV[VZ]; 1610 target_offset_scaled.mV[VZ] /= object_extents.mV[VZ];
@@ -1703,7 +1727,7 @@ void LLAgent::setCameraZoomFraction(F32 fraction)
1703 else if (cameraCustomizeAvatar()) 1727 else if (cameraCustomizeAvatar())
1704 { 1728 {
1705 LLVector3d camera_offset_dir = mCameraFocusOffsetTarget; 1729 LLVector3d camera_offset_dir = mCameraFocusOffsetTarget;
1706 camera_offset_dir.normVec(); 1730 camera_offset_dir.normalize();
1707 mCameraFocusOffsetTarget = camera_offset_dir * rescale(fraction, 0.f, 1.f, APPEARANCE_MAX_ZOOM, APPEARANCE_MIN_ZOOM); 1731 mCameraFocusOffsetTarget = camera_offset_dir * rescale(fraction, 0.f, 1.f, APPEARANCE_MAX_ZOOM, APPEARANCE_MIN_ZOOM);
1708 } 1732 }
1709 else 1733 else
@@ -1730,7 +1754,7 @@ void LLAgent::setCameraZoomFraction(F32 fraction)
1730 } 1754 }
1731 1755
1732 LLVector3d camera_offset_dir = mCameraFocusOffsetTarget; 1756 LLVector3d camera_offset_dir = mCameraFocusOffsetTarget;
1733 camera_offset_dir.normVec(); 1757 camera_offset_dir.normalize();
1734 mCameraFocusOffsetTarget = camera_offset_dir * rescale(fraction, 0.f, 1.f, max_zoom, min_zoom); 1758 mCameraFocusOffsetTarget = camera_offset_dir * rescale(fraction, 0.f, 1.f, max_zoom, min_zoom);
1735 } 1759 }
1736 startCameraAnimation(); 1760 startCameraAnimation();
@@ -1777,7 +1801,7 @@ void LLAgent::cameraOrbitOver(const F32 angle)
1777 else 1801 else
1778 { 1802 {
1779 LLVector3 camera_offset_unit(mCameraFocusOffsetTarget); 1803 LLVector3 camera_offset_unit(mCameraFocusOffsetTarget);
1780 camera_offset_unit.normVec(); 1804 camera_offset_unit.normalize();
1781 1805
1782 F32 angle_from_up = acos( camera_offset_unit * getReferenceUpVector() ); 1806 F32 angle_from_up = acos( camera_offset_unit * getReferenceUpVector() );
1783 1807
@@ -1812,7 +1836,7 @@ void LLAgent::cameraZoomIn(const F32 fraction)
1812 LLVector3d camera_offset(mCameraFocusOffsetTarget); 1836 LLVector3d camera_offset(mCameraFocusOffsetTarget);
1813 LLVector3d camera_offset_unit(mCameraFocusOffsetTarget); 1837 LLVector3d camera_offset_unit(mCameraFocusOffsetTarget);
1814 F32 min_zoom = LAND_MIN_ZOOM; 1838 F32 min_zoom = LAND_MIN_ZOOM;
1815 F32 current_distance = (F32)camera_offset_unit.normVec(); 1839 F32 current_distance = (F32)camera_offset_unit.normalize();
1816 F32 new_distance = current_distance * fraction; 1840 F32 new_distance = current_distance * fraction;
1817 1841
1818 // Don't move through focus point 1842 // Don't move through focus point
@@ -1881,7 +1905,7 @@ void LLAgent::cameraOrbitIn(const F32 meters)
1881 { 1905 {
1882 LLVector3d camera_offset(mCameraFocusOffsetTarget); 1906 LLVector3d camera_offset(mCameraFocusOffsetTarget);
1883 LLVector3d camera_offset_unit(mCameraFocusOffsetTarget); 1907 LLVector3d camera_offset_unit(mCameraFocusOffsetTarget);
1884 F32 current_distance = (F32)camera_offset_unit.normVec(); 1908 F32 current_distance = (F32)camera_offset_unit.normalize();
1885 F32 new_distance = current_distance - meters; 1909 F32 new_distance = current_distance - meters;
1886 F32 min_zoom = LAND_MIN_ZOOM; 1910 F32 min_zoom = LAND_MIN_ZOOM;
1887 1911
@@ -1938,6 +1962,8 @@ void LLAgent::cameraPanIn(F32 meters)
1938 mFocusGlobal = mFocusTargetGlobal; 1962 mFocusGlobal = mFocusTargetGlobal;
1939 // don't enforce zoom constraints as this is the only way for users to get past them easily 1963 // don't enforce zoom constraints as this is the only way for users to get past them easily
1940 updateFocusOffset(); 1964 updateFocusOffset();
1965 // NOTE: panning movements expect the camera to move exactly with the focus target, not animated behind -Nyx
1966 mCameraSmoothingLastPositionGlobal = calcCameraPositionTargetGlobal();
1941} 1967}
1942 1968
1943//----------------------------------------------------------------------------- 1969//-----------------------------------------------------------------------------
@@ -1956,6 +1982,8 @@ void LLAgent::cameraPanLeft(F32 meters)
1956 1982
1957 cameraZoomIn(1.f); 1983 cameraZoomIn(1.f);
1958 updateFocusOffset(); 1984 updateFocusOffset();
1985 // NOTE: panning movements expect the camera to move exactly with the focus target, not animated behind - Nyx
1986 mCameraSmoothingLastPositionGlobal = calcCameraPositionTargetGlobal();
1959} 1987}
1960 1988
1961//----------------------------------------------------------------------------- 1989//-----------------------------------------------------------------------------
@@ -1974,6 +2002,8 @@ void LLAgent::cameraPanUp(F32 meters)
1974 2002
1975 cameraZoomIn(1.f); 2003 cameraZoomIn(1.f);
1976 updateFocusOffset(); 2004 updateFocusOffset();
2005 // NOTE: panning movements expect the camera to move exactly with the focus target, not animated behind -Nyx
2006 mCameraSmoothingLastPositionGlobal = calcCameraPositionTargetGlobal();
1977} 2007}
1978 2008
1979//----------------------------------------------------------------------------- 2009//-----------------------------------------------------------------------------
@@ -2246,7 +2276,7 @@ void LLAgent::startAutoPilotGlobal(const LLVector3d &target_global, const std::s
2246 mAutoPilotUseRotation = TRUE; 2276 mAutoPilotUseRotation = TRUE;
2247 mAutoPilotTargetFacing = LLVector3::x_axis * *target_rotation; 2277 mAutoPilotTargetFacing = LLVector3::x_axis * *target_rotation;
2248 mAutoPilotTargetFacing.mV[VZ] = 0.f; 2278 mAutoPilotTargetFacing.mV[VZ] = 0.f;
2249 mAutoPilotTargetFacing.normVec(); 2279 mAutoPilotTargetFacing.normalize();
2250 } 2280 }
2251 else 2281 else
2252 { 2282 {
@@ -2369,8 +2399,8 @@ void LLAgent::autoPilot(F32 *delta_yaw)
2369 at.mV[VZ] = 0.f; 2399 at.mV[VZ] = 0.f;
2370 direction.mV[VZ] = 0.f; 2400 direction.mV[VZ] = 0.f;
2371 2401
2372 at.normVec(); 2402 at.normalize();
2373 F32 xy_distance = direction.normVec(); 2403 F32 xy_distance = direction.normalize();
2374 2404
2375 F32 yaw = 0.f; 2405 F32 yaw = 0.f;
2376 if (mAutoPilotTargetDist > mAutoPilotStopDistance) 2406 if (mAutoPilotTargetDist > mAutoPilotStopDistance)
@@ -3529,7 +3559,7 @@ void LLAgent::setupSitCamera()
3529 // slam agent coordinate frame to proper parent local version 3559 // slam agent coordinate frame to proper parent local version
3530 LLVector3 at_axis = mFrameAgent.getAtAxis(); 3560 LLVector3 at_axis = mFrameAgent.getAtAxis();
3531 at_axis.mV[VZ] = 0.f; 3561 at_axis.mV[VZ] = 0.f;
3532 at_axis.normVec(); 3562 at_axis.normalize();
3533 resetAxes(at_axis * ~parent_rot); 3563 resetAxes(at_axis * ~parent_rot);
3534 } 3564 }
3535} 3565}
@@ -3665,7 +3695,7 @@ LLVector3d LLAgent::calcCameraPositionTargetGlobal(BOOL *hit_limit)
3665 // slam agent coordinate frame to proper parent local version 3695 // slam agent coordinate frame to proper parent local version
3666 LLVector3 at_axis = mFrameAgent.getAtAxis() * parent_rot; 3696 LLVector3 at_axis = mFrameAgent.getAtAxis() * parent_rot;
3667 at_axis.mV[VZ] = 0.f; 3697 at_axis.mV[VZ] = 0.f;
3668 at_axis.normVec(); 3698 at_axis.normalize();
3669 resetAxes(at_axis * ~parent_rot); 3699 resetAxes(at_axis * ~parent_rot);
3670 3700
3671 local_camera_offset = local_camera_offset * mFrameAgent.getQuaternion() * parent_rot; 3701 local_camera_offset = local_camera_offset * mFrameAgent.getQuaternion() * parent_rot;
@@ -3686,7 +3716,7 @@ LLVector3d LLAgent::calcCameraPositionTargetGlobal(BOOL *hit_limit)
3686 offset_dot_norm = 0.001f; 3716 offset_dot_norm = 0.001f;
3687 } 3717 }
3688 3718
3689 camera_distance = local_camera_offset.normVec(); 3719 camera_distance = local_camera_offset.normalize();
3690 3720
3691 F32 pos_dot_norm = getPosAgentFromGlobal(frame_center_global + head_offset) * plane_normal; 3721 F32 pos_dot_norm = getPosAgentFromGlobal(frame_center_global + head_offset) * plane_normal;
3692 3722
@@ -3710,7 +3740,7 @@ LLVector3d LLAgent::calcCameraPositionTargetGlobal(BOOL *hit_limit)
3710 } 3740 }
3711 else 3741 else
3712 { 3742 {
3713 camera_distance = local_camera_offset.normVec(); 3743 camera_distance = local_camera_offset.normalize();
3714 } 3744 }
3715 3745
3716 mTargetCameraDistance = llmax(camera_distance, MIN_CAMERA_DISTANCE); 3746 mTargetCameraDistance = llmax(camera_distance, MIN_CAMERA_DISTANCE);
@@ -3745,7 +3775,7 @@ LLVector3d LLAgent::calcCameraPositionTargetGlobal(BOOL *hit_limit)
3745 { 3775 {
3746 LLVector3 frame_at_axis = mFrameAgent.getAtAxis(); 3776 LLVector3 frame_at_axis = mFrameAgent.getAtAxis();
3747 frame_at_axis -= projected_vec(frame_at_axis, getReferenceUpVector()); 3777 frame_at_axis -= projected_vec(frame_at_axis, getReferenceUpVector());
3748 frame_at_axis.normVec(); 3778 frame_at_axis.normalize();
3749 3779
3750 //transition smoothly in air mode, to avoid camera pop 3780 //transition smoothly in air mode, to avoid camera pop
3751 F32 u = (time_in_air - GROUND_TO_AIR_CAMERA_TRANSITION_START_TIME) / GROUND_TO_AIR_CAMERA_TRANSITION_TIME; 3781 F32 u = (time_in_air - GROUND_TO_AIR_CAMERA_TRANSITION_START_TIME) / GROUND_TO_AIR_CAMERA_TRANSITION_TIME;
@@ -3932,7 +3962,7 @@ void LLAgent::resetCamera()
3932 // Remove any pitch from the avatar 3962 // Remove any pitch from the avatar
3933 LLVector3 at = mFrameAgent.getAtAxis(); 3963 LLVector3 at = mFrameAgent.getAtAxis();
3934 at.mV[VZ] = 0.f; 3964 at.mV[VZ] = 0.f;
3935 at.normVec(); 3965 at.normalize();
3936 gAgent.resetAxes(at); 3966 gAgent.resetAxes(at);
3937 // have to explicitly clear field of view zoom now 3967 // have to explicitly clear field of view zoom now
3938 mCameraFOVZoomFactor = 0.f; 3968 mCameraFOVZoomFactor = 0.f;
@@ -4101,7 +4131,10 @@ void LLAgent::changeCameraToThirdPerson(BOOL animate)
4101 4131
4102 if (mAvatarObject) 4132 if (mAvatarObject)
4103 { 4133 {
4104 mAvatarObject->mPelvisp->setPosition(LLVector3::zero); 4134 if (!mAvatarObject->mIsSitting)
4135 {
4136 mAvatarObject->mPelvisp->setPosition(LLVector3::zero);
4137 }
4105 mAvatarObject->startMotion( ANIM_AGENT_BODY_NOISE ); 4138 mAvatarObject->startMotion( ANIM_AGENT_BODY_NOISE );
4106 mAvatarObject->startMotion( ANIM_AGENT_BREATHE_ROT ); 4139 mAvatarObject->startMotion( ANIM_AGENT_BREATHE_ROT );
4107 } 4140 }
@@ -4147,14 +4180,14 @@ void LLAgent::changeCameraToThirdPerson(BOOL animate)
4147 LLQuaternion obj_rot = ((LLViewerObject*)mAvatarObject->getParent())->getRenderRotation(); 4180 LLQuaternion obj_rot = ((LLViewerObject*)mAvatarObject->getParent())->getRenderRotation();
4148 at_axis = LLViewerCamera::getInstance()->getAtAxis(); 4181 at_axis = LLViewerCamera::getInstance()->getAtAxis();
4149 at_axis.mV[VZ] = 0.f; 4182 at_axis.mV[VZ] = 0.f;
4150 at_axis.normVec(); 4183 at_axis.normalize();
4151 resetAxes(at_axis * ~obj_rot); 4184 resetAxes(at_axis * ~obj_rot);
4152 } 4185 }
4153 else 4186 else
4154 { 4187 {
4155 at_axis = mFrameAgent.getAtAxis(); 4188 at_axis = mFrameAgent.getAtAxis();
4156 at_axis.mV[VZ] = 0.f; 4189 at_axis.mV[VZ] = 0.f;
4157 at_axis.normVec(); 4190 at_axis.normalize();
4158 resetAxes(at_axis); 4191 resetAxes(at_axis);
4159 } 4192 }
4160 4193
@@ -4201,7 +4234,7 @@ void LLAgent::changeCameraToCustomizeAvatar(BOOL avatar_animate, BOOL camera_ani
4201 // Remove any pitch from the avatar 4234 // Remove any pitch from the avatar
4202 //LLVector3 at = mFrameAgent.getAtAxis(); 4235 //LLVector3 at = mFrameAgent.getAtAxis();
4203 //at.mV[VZ] = 0.f; 4236 //at.mV[VZ] = 0.f;
4204 //at.normVec(); 4237 //at.normalize();
4205 //gAgent.resetAxes(at); 4238 //gAgent.resetAxes(at);
4206 4239
4207 if( mCameraMode != CAMERA_MODE_CUSTOMIZE_AVATAR ) 4240 if( mCameraMode != CAMERA_MODE_CUSTOMIZE_AVATAR )
@@ -4228,7 +4261,7 @@ void LLAgent::changeCameraToCustomizeAvatar(BOOL avatar_animate, BOOL camera_ani
4228 // Remove any pitch from the avatar 4261 // Remove any pitch from the avatar
4229 LLVector3 at = mFrameAgent.getAtAxis(); 4262 LLVector3 at = mFrameAgent.getAtAxis();
4230 at.mV[VZ] = 0.f; 4263 at.mV[VZ] = 0.f;
4231 at.normVec(); 4264 at.normalize();
4232 gAgent.resetAxes(at); 4265 gAgent.resetAxes(at);
4233 4266
4234 sendAnimationRequest(ANIM_AGENT_CUSTOMIZE, ANIM_REQUEST_START); 4267 sendAnimationRequest(ANIM_AGENT_CUSTOMIZE, ANIM_REQUEST_START);
@@ -4508,14 +4541,14 @@ void LLAgent::setFocusOnAvatar(BOOL focus_on_avatar, BOOL animate)
4508 LLQuaternion obj_rot = ((LLViewerObject*)mAvatarObject->getParent())->getRenderRotation(); 4541 LLQuaternion obj_rot = ((LLViewerObject*)mAvatarObject->getParent())->getRenderRotation();
4509 at_axis = LLViewerCamera::getInstance()->getAtAxis(); 4542 at_axis = LLViewerCamera::getInstance()->getAtAxis();
4510 at_axis.mV[VZ] = 0.f; 4543 at_axis.mV[VZ] = 0.f;
4511 at_axis.normVec(); 4544 at_axis.normalize();
4512 resetAxes(at_axis * ~obj_rot); 4545 resetAxes(at_axis * ~obj_rot);
4513 } 4546 }
4514 else 4547 else
4515 { 4548 {
4516 at_axis = LLViewerCamera::getInstance()->getAtAxis(); 4549 at_axis = LLViewerCamera::getInstance()->getAtAxis();
4517 at_axis.mV[VZ] = 0.f; 4550 at_axis.mV[VZ] = 0.f;
4518 at_axis.normVec(); 4551 at_axis.normalize();
4519 resetAxes(at_axis); 4552 resetAxes(at_axis);
4520 } 4553 }
4521 } 4554 }
@@ -4578,7 +4611,7 @@ void LLAgent::lookAtLastChat()
4578 { 4611 {
4579 delta_pos = chatter->getPositionAgent() - getPositionAgent(); 4612 delta_pos = chatter->getPositionAgent() - getPositionAgent();
4580 } 4613 }
4581 delta_pos.normVec(); 4614 delta_pos.normalize();
4582 4615
4583 setControlFlags(AGENT_CONTROL_STOP); 4616 setControlFlags(AGENT_CONTROL_STOP);
4584 4617
@@ -4586,9 +4619,9 @@ void LLAgent::lookAtLastChat()
4586 4619
4587 LLVector3 new_camera_pos = mAvatarObject->mHeadp->getWorldPosition(); 4620 LLVector3 new_camera_pos = mAvatarObject->mHeadp->getWorldPosition();
4588 LLVector3 left = delta_pos % LLVector3::z_axis; 4621 LLVector3 left = delta_pos % LLVector3::z_axis;
4589 left.normVec(); 4622 left.normalize();
4590 LLVector3 up = left % delta_pos; 4623 LLVector3 up = left % delta_pos;
4591 up.normVec(); 4624 up.normalize();
4592 new_camera_pos -= delta_pos * 0.4f; 4625 new_camera_pos -= delta_pos * 0.4f;
4593 new_camera_pos += left * 0.3f; 4626 new_camera_pos += left * 0.3f;
4594 new_camera_pos += up * 0.2f; 4627 new_camera_pos += up * 0.2f;
@@ -4607,7 +4640,7 @@ void LLAgent::lookAtLastChat()
4607 else 4640 else
4608 { 4641 {
4609 delta_pos = chatter->getRenderPosition() - getPositionAgent(); 4642 delta_pos = chatter->getRenderPosition() - getPositionAgent();
4610 delta_pos.normVec(); 4643 delta_pos.normalize();
4611 4644
4612 setControlFlags(AGENT_CONTROL_STOP); 4645 setControlFlags(AGENT_CONTROL_STOP);
4613 4646
@@ -4615,9 +4648,9 @@ void LLAgent::lookAtLastChat()
4615 4648
4616 LLVector3 new_camera_pos = mAvatarObject->mHeadp->getWorldPosition(); 4649 LLVector3 new_camera_pos = mAvatarObject->mHeadp->getWorldPosition();
4617 LLVector3 left = delta_pos % LLVector3::z_axis; 4650 LLVector3 left = delta_pos % LLVector3::z_axis;
4618 left.normVec(); 4651 left.normalize();
4619 LLVector3 up = left % delta_pos; 4652 LLVector3 up = left % delta_pos;
4620 up.normVec(); 4653 up.normalize();
4621 new_camera_pos -= delta_pos * 0.4f; 4654 new_camera_pos -= delta_pos * 0.4f;
4622 new_camera_pos += left * 0.3f; 4655 new_camera_pos += left * 0.3f;
4623 new_camera_pos += up * 0.2f; 4656 new_camera_pos += up * 0.2f;
@@ -4631,68 +4664,107 @@ void LLAgent::lookAtLastChat()
4631 4664
4632const F32 SIT_POINT_EXTENTS = 0.2f; 4665const F32 SIT_POINT_EXTENTS = 0.2f;
4633 4666
4634// Grabs current position 4667void LLAgent::setStartPosition( U32 location_id )
4635void LLAgent::setStartPosition(U32 location_id) 4668{
4636{ 4669 LLViewerObject *object;
4637 LLViewerObject *object; 4670
4638 4671 if ( !(gAgentID == LLUUID::null) )
4639 if ( !(gAgentID == LLUUID::null) ) 4672 {
4640 { 4673 // we've got an ID for an agent viewerobject
4641 // we've got an ID for an agent viewerobject 4674 object = gObjectList.findObject(gAgentID);
4642 object = gObjectList.findObject(gAgentID); 4675 if (object)
4643 if (object) 4676 {
4644 { 4677 // we've got the viewer object
4645 // we've got the viewer object 4678 // Sometimes the agent can be velocity interpolated off of
4646 // Sometimes the agent can be velocity interpolated off of 4679 // this simulator. Clamp it to the region the agent is
4647 // this simulator. Clamp it to the region the agent is 4680 // in, a little bit in on each side.
4648 // in, a little bit in on each side. 4681 const F32 INSET = 0.5f; //meters
4649 const F32 INSET = 0.5f; //meters 4682 const F32 REGION_WIDTH = LLWorld::getInstance()->getRegionWidthInMeters();
4650 const F32 REGION_WIDTH = LLWorld::getInstance()->getRegionWidthInMeters(); 4683
4651 4684 LLVector3 agent_pos = getPositionAgent();
4652 LLVector3 agent_pos = getPositionAgent(); 4685 LLVector3 agent_look_at = mFrameAgent.getAtAxis();
4653 4686
4654 if (mAvatarObject) 4687 if (mAvatarObject)
4655 { 4688 {
4656 // the z height is at the agent's feet 4689 // the z height is at the agent's feet
4657 agent_pos.mV[VZ] -= 0.5f * mAvatarObject->mBodySize.mV[VZ]; 4690 agent_pos.mV[VZ] -= 0.5f * mAvatarObject->mBodySize.mV[VZ];
4658 } 4691 }
4659 4692
4660 agent_pos.mV[VX] = llclamp( agent_pos.mV[VX], INSET, REGION_WIDTH - INSET ); 4693 agent_pos.mV[VX] = llclamp( agent_pos.mV[VX], INSET, REGION_WIDTH - INSET );
4661 agent_pos.mV[VY] = llclamp( agent_pos.mV[VY], INSET, REGION_WIDTH - INSET ); 4694 agent_pos.mV[VY] = llclamp( agent_pos.mV[VY], INSET, REGION_WIDTH - INSET );
4662 4695
4663 // Don't let them go below ground, or too high. 4696 // Don't let them go below ground, or too high.
4664 agent_pos.mV[VZ] = llclamp( agent_pos.mV[VZ], 4697 agent_pos.mV[VZ] = llclamp( agent_pos.mV[VZ],
4665 mRegionp->getLandHeightRegion( agent_pos ), 4698 mRegionp->getLandHeightRegion( agent_pos ),
4666 LLWorld::getInstance()->getRegionMaxHeight() ); 4699 LLWorld::getInstance()->getRegionMaxHeight() );
4667 4700 // Send the CapReq
4668 LLMessageSystem* msg = gMessageSystem; 4701
4669 msg->newMessageFast(_PREHASH_SetStartLocationRequest); 4702 LLSD body;
4670 msg->nextBlockFast( _PREHASH_AgentData); 4703
4671 msg->addUUIDFast(_PREHASH_AgentID, getID()); 4704 std::string url = gAgent.getRegion()->getCapability("HomeLocation");
4672 msg->addUUIDFast(_PREHASH_SessionID, getSessionID()); 4705 std::ostringstream strBuffer;
4673 msg->nextBlockFast( _PREHASH_StartLocationData); 4706 if( url.empty() )
4674 // corrected by sim 4707 {
4675 msg->addStringFast(_PREHASH_SimName, ""); 4708 LLMessageSystem* msg = gMessageSystem;
4676 msg->addU32Fast(_PREHASH_LocationID, location_id); 4709 msg->newMessageFast(_PREHASH_SetStartLocationRequest);
4677 msg->addVector3Fast(_PREHASH_LocationPos, agent_pos); 4710 msg->nextBlockFast( _PREHASH_AgentData);
4678 msg->addVector3Fast(_PREHASH_LocationLookAt,mFrameAgent.getAtAxis()); 4711 msg->addUUIDFast(_PREHASH_AgentID, getID());
4679 4712 msg->addUUIDFast(_PREHASH_SessionID, getSessionID());
4680 // Reliable only helps when setting home location. Last 4713 msg->nextBlockFast( _PREHASH_StartLocationData);
4681 // location is sent on quit, and we don't have time to ack 4714 // corrected by sim
4682 // the packets. 4715 msg->addStringFast(_PREHASH_SimName, "");
4683 msg->sendReliable(mRegionp->getHost()); 4716 msg->addU32Fast(_PREHASH_LocationID, location_id);
4684 4717 msg->addVector3Fast(_PREHASH_LocationPos, agent_pos);
4685 const U32 HOME_INDEX = 1; 4718 msg->addVector3Fast(_PREHASH_LocationLookAt,mFrameAgent.getAtAxis());
4686 if( HOME_INDEX == location_id ) 4719
4687 { 4720 // Reliable only helps when setting home location. Last
4688 setHomePosRegion( mRegionp->getHandle(), getPositionAgent() ); 4721 // location is sent on quit, and we don't have time to ack
4689 } 4722 // the packets.
4690 } 4723 msg->sendReliable(mRegionp->getHost());
4691 else 4724
4692 { 4725 const U32 HOME_INDEX = 1;
4693 llinfos << "setStartPosition - Can't find agent viewerobject id " << gAgentID << llendl; 4726 if( HOME_INDEX == location_id )
4694 } 4727 {
4695 } 4728 setHomePosRegion( mRegionp->getHandle(), getPositionAgent() );
4729 }
4730 }
4731 else
4732 {
4733 strBuffer << location_id;
4734 body["HomeLocation"]["LocationId"] = strBuffer.str();
4735
4736 strBuffer.str("");
4737 strBuffer << agent_pos.mV[VX];
4738 body["HomeLocation"]["LocationPos"]["X"] = strBuffer.str();
4739
4740 strBuffer.str("");
4741 strBuffer << agent_pos.mV[VY];
4742 body["HomeLocation"]["LocationPos"]["Y"] = strBuffer.str();
4743
4744 strBuffer.str("");
4745 strBuffer << agent_pos.mV[VZ];
4746 body["HomeLocation"]["LocationPos"]["Z"] = strBuffer.str();
4747
4748 strBuffer.str("");
4749 strBuffer << agent_look_at.mV[VX];
4750 body["HomeLocation"]["LocationLookAt"]["X"] = strBuffer.str();
4751
4752 strBuffer.str("");
4753 strBuffer << agent_look_at.mV[VY];
4754 body["HomeLocation"]["LocationLookAt"]["Y"] = strBuffer.str();
4755
4756 strBuffer.str("");
4757 strBuffer << agent_look_at.mV[VZ];
4758 body["HomeLocation"]["LocationLookAt"]["Z"] = strBuffer.str();
4759
4760 LLHTTPClient::post( url, body, new LLHomeLocationResponder() );
4761 }
4762 }
4763 else
4764 {
4765 llinfos << "setStartPosition - Can't find agent viewerobject id " << gAgentID << llendl;
4766 }
4767 }
4696} 4768}
4697 4769
4698void LLAgent::requestStopMotion( LLMotion* motion ) 4770void LLAgent::requestStopMotion( LLMotion* motion )
diff --git a/linden/indra/newview/llagent.h b/linden/indra/newview/llagent.h
index 97f9aed..2befeb0 100644
--- a/linden/indra/newview/llagent.h
+++ b/linden/indra/newview/llagent.h
@@ -139,7 +139,7 @@ public:
139 139
140 // Called whenever the agent moves. Puts camera back in default position, 140 // Called whenever the agent moves. Puts camera back in default position,
141 // deselects items, etc. 141 // deselects items, etc.
142 void resetView(BOOL reset_camera = TRUE); 142 void resetView(BOOL reset_camera = TRUE, BOOL change_camera = FALSE);
143 143
144 // Called on camera movement, to allow the camera to be unlocked from the 144 // Called on camera movement, to allow the camera to be unlocked from the
145 // default position behind the avatar. 145 // default position behind the avatar.
@@ -378,7 +378,7 @@ public:
378 void sendAnimationRequests(LLDynamicArray<LLUUID> &anim_ids, EAnimRequest request); 378 void sendAnimationRequests(LLDynamicArray<LLUUID> &anim_ids, EAnimRequest request);
379 void sendAnimationRequest(const LLUUID &anim_id, EAnimRequest request); 379 void sendAnimationRequest(const LLUUID &anim_id, EAnimRequest request);
380 380
381 LLVector3 calcFocusOffset(LLViewerObject *object, S32 x, S32 y); 381 LLVector3 calcFocusOffset(LLViewerObject *object, LLVector3 pos_agent, S32 x, S32 y);
382 BOOL calcCameraMinDistance(F32 &obj_min_distance); 382 BOOL calcCameraMinDistance(F32 &obj_min_distance);
383 383
384 void startCameraAnimation(); 384 void startCameraAnimation();
diff --git a/linden/indra/newview/llappviewer.cpp b/linden/indra/newview/llappviewer.cpp
index f1b2e32..49991b4 100644
--- a/linden/indra/newview/llappviewer.cpp
+++ b/linden/indra/newview/llappviewer.cpp
@@ -191,18 +191,11 @@
191 191
192//---------------------------------------------------------------------------- 192//----------------------------------------------------------------------------
193// viewer.cpp - these are only used in viewer, should be easily moved. 193// viewer.cpp - these are only used in viewer, should be easily moved.
194extern void disable_win_error_reporting();
195 194
196#if LL_DARWIN 195#if LL_DARWIN
197#include <Carbon/Carbon.h>
198extern void init_apple_menu(const char* product); 196extern void init_apple_menu(const char* product);
199extern OSErr AEGURLHandler(const AppleEvent *messagein, AppleEvent *reply, long refIn);
200extern OSErr AEQuitHandler(const AppleEvent *messagein, AppleEvent *reply, long refIn);
201extern OSStatus simpleDialogHandler(EventHandlerCallRef handler, EventRef event, void *userdata);
202#include <boost/tokenizer.hpp>
203#endif // LL_DARWIN 197#endif // LL_DARWIN
204 198
205
206extern BOOL gRandomizeFramerate; 199extern BOOL gRandomizeFramerate;
207extern BOOL gPeriodicSlowFrame; 200extern BOOL gPeriodicSlowFrame;
208extern BOOL gDebugGL; 201extern BOOL gDebugGL;
@@ -216,10 +209,6 @@ const F32 DEFAULT_AFK_TIMEOUT = 5.f * 60.f; // time with no input before user fl
216F32 gSimLastTime; // Used in LLAppViewer::init and send_stats() 209F32 gSimLastTime; // Used in LLAppViewer::init and send_stats()
217F32 gSimFrames; 210F32 gSimFrames;
218 211
219std::string gDisabledMessage; // Set in LLAppViewer::initConfiguration used in idle_startup
220
221BOOL gHideLinks = FALSE; // Set in LLAppViewer::initConfiguration, used externally
222
223BOOL gAllowIdleAFK = TRUE; 212BOOL gAllowIdleAFK = TRUE;
224BOOL gAllowTapTapHoldRun = TRUE; 213BOOL gAllowTapTapHoldRun = TRUE;
225BOOL gShowObjectUpdates = FALSE; 214BOOL gShowObjectUpdates = FALSE;
@@ -307,14 +296,13 @@ const char *VFS_INDEX_FILE_BASE = "index.db2.x.";
307 296
308static std::string gSecondLife; 297static std::string gSecondLife;
309static std::string gWindowTitle; 298static std::string gWindowTitle;
310#ifdef LL_WINDOWS
311 static char sWindowClass[] = "Second Life";
312#endif
313 299
314std::string gLoginPage; 300std::string gLoginPage;
315std::vector<std::string> gLoginURIs; 301std::vector<std::string> gLoginURIs;
316static std::string gHelperURI; 302static std::string gHelperURI;
317 303
304LLAppViewer::LLUpdaterInfo *LLAppViewer::sUpdaterInfo = NULL ;
305
318void idle_afk_check() 306void idle_afk_check()
319{ 307{
320 // check idle timers 308 // check idle timers
@@ -329,8 +317,7 @@ static void ui_audio_callback(const LLUUID& uuid)
329{ 317{
330 if (gAudiop) 318 if (gAudiop)
331 { 319 {
332 F32 volume = gSavedSettings.getBOOL("MuteUI") ? 0.f : gSavedSettings.getF32("AudioLevelUI"); 320 gAudiop->triggerSound(uuid, gAgent.getID(), 1.0f, LLAudioEngine::AUDIO_TYPE_UI);
333 gAudiop->triggerSound(uuid, gAgent.getID(), volume);
334 } 321 }
335} 322}
336 323
@@ -496,30 +483,17 @@ void LLAppViewer::initGridChoice()
496 } 483 }
497} 484}
498 485
499bool send_url_to_other_instance(const std::string& url) 486//virtual
487bool LLAppViewer::initSLURLHandler()
500{ 488{
501#if LL_WINDOWS 489 // does nothing unless subclassed
502 wchar_t window_class[256]; /* Flawfinder: ignore */ // Assume max length < 255 chars. 490 return false;
503 mbstowcs(window_class, sWindowClass, 255); 491}
504 window_class[255] = 0; 492
505 // Use the class instead of the window name. 493//virtual
506 HWND other_window = FindWindow(window_class, NULL); 494bool LLAppViewer::sendURLToOtherInstance(const std::string& url)
507 495{
508 if (other_window != NULL) 496 // does nothing unless subclassed
509 {
510 lldebugs << "Found other window with the name '" << gWindowTitle << "'" << llendl;
511 COPYDATASTRUCT cds;
512 const S32 SLURL_MESSAGE_TYPE = 0;
513 cds.dwData = SLURL_MESSAGE_TYPE;
514 cds.cbData = url.length() + 1;
515 cds.lpData = (void*)url.c_str();
516
517 LRESULT msg_result = SendMessage(other_window, WM_COPYDATA, NULL, (LPARAM)&cds);
518 lldebugs << "SendMessage(WM_COPYDATA) to other window '"
519 << gWindowTitle << "' returned " << msg_result << llendl;
520 return true;
521 }
522#endif
523 return false; 497 return false;
524} 498}
525 499
@@ -683,6 +657,7 @@ bool LLAppViewer::init()
683 ui_audio_callback, 657 ui_audio_callback,
684 &LLUI::sGLScaleFactor); 658 &LLUI::sGLScaleFactor);
685 LLWeb::initClass(); // do this after LLUI 659 LLWeb::initClass(); // do this after LLUI
660
686 LLTextEditor::setURLCallbacks(&LLWeb::loadURL, 661 LLTextEditor::setURLCallbacks(&LLWeb::loadURL,
687 &LLURLDispatcher::dispatchFromTextEditor, 662 &LLURLDispatcher::dispatchFromTextEditor,
688 &LLURLDispatcher::dispatchFromTextEditor); 663 &LLURLDispatcher::dispatchFromTextEditor);
@@ -703,7 +678,6 @@ bool LLAppViewer::init()
703 // load MIME type -> media impl mappings 678 // load MIME type -> media impl mappings
704 LLMIMETypes::parseMIMETypes( std::string("mime_types.xml") ); 679 LLMIMETypes::parseMIMETypes( std::string("mime_types.xml") );
705 680
706
707 // Copy settings to globals. *TODO: Remove or move to appropriage class initializers 681 // Copy settings to globals. *TODO: Remove or move to appropriage class initializers
708 settings_to_globals(); 682 settings_to_globals();
709 // Setup settings listeners 683 // Setup settings listeners
@@ -714,6 +688,9 @@ bool LLAppViewer::init()
714 // Find partition serial number (Windows) or hardware serial (Mac) 688 // Find partition serial number (Windows) or hardware serial (Mac)
715 mSerialNumber = generateSerialNumber(); 689 mSerialNumber = generateSerialNumber();
716 690
691 // do any necessary set-up for accepting incoming SLURLs from apps
692 initSLURLHandler();
693
717 if(false == initHardwareTest()) 694 if(false == initHardwareTest())
718 { 695 {
719 // Early out from user choice. 696 // Early out from user choice.
@@ -844,7 +821,10 @@ bool LLAppViewer::init()
844 } 821 }
845 822
846 } 823 }
847 824
825 // save the graphics card
826 gDebugInfo["GraphicsCard"] = LLFeatureManager::getInstance()->getGPUString();
827
848 // Save the current version to the prefs file 828 // Save the current version to the prefs file
849 gSavedSettings.setString("LastRunVersion", gCurrentVersion); 829 gSavedSettings.setString("LastRunVersion", gCurrentVersion);
850 830
@@ -889,16 +869,21 @@ bool LLAppViewer::mainLoop()
889 { 869 {
890 LLFastTimer t(LLFastTimer::FTM_FRAME); 870 LLFastTimer t(LLFastTimer::FTM_FRAME);
891 871
872 pingMainloopTimeout("Main:MiscNativeWindowEvents");
873
874 {
875 LLFastTimer t2(LLFastTimer::FTM_MESSAGES);
876 gViewerWindow->mWindow->processMiscNativeEvents();
877 }
878
892 pingMainloopTimeout("Main:GatherInput"); 879 pingMainloopTimeout("Main:GatherInput");
893 880
894 { 881 {
895 LLFastTimer t2(LLFastTimer::FTM_MESSAGES); 882 LLFastTimer t2(LLFastTimer::FTM_MESSAGES);
896 #if LL_WINDOWS 883 if (!restoreErrorTrap())
897 if (!LLWinDebug::checkExceptionHandler())
898 { 884 {
899 llwarns << " Someone took over my exception handler (post messagehandling)!" << llendl; 885 llwarns << " Someone took over my signal/exception handler (post messagehandling)!" << llendl;
900 } 886 }
901 #endif
902 887
903 gViewerWindow->mWindow->gatherInput(); 888 gViewerWindow->mWindow->gatherInput();
904 } 889 }
@@ -954,7 +939,7 @@ bool LLAppViewer::mainLoop()
954 939
955 resumeMainloopTimeout(); 940 resumeMainloopTimeout();
956 } 941 }
957 942
958 if (gDoDisconnect && (LLStartUp::getStartupState() == STATE_STARTED)) 943 if (gDoDisconnect && (LLStartUp::getStartupState() == STATE_STARTED))
959 { 944 {
960 pauseMainloopTimeout(); 945 pauseMainloopTimeout();
@@ -1365,12 +1350,15 @@ bool LLAppViewer::cleanup()
1365 delete sImageDecodeThread; 1350 delete sImageDecodeThread;
1366 sImageDecodeThread = NULL; 1351 sImageDecodeThread = NULL;
1367 1352
1353 //Note:
1354 //LLViewerMedia::cleanupClass() has to be put before gImageList.shutdown()
1355 //because some new image might be generated during cleaning up media. --bao
1356 LLViewerMedia::cleanupClass();
1368 gImageList.shutdown(); // shutdown again in case a callback added something 1357 gImageList.shutdown(); // shutdown again in case a callback added something
1369 LLUIImageList::getInstance()->cleanUp(); 1358 LLUIImageList::getInstance()->cleanUp();
1370 1359
1371 // This should eventually be done in LLAppViewer 1360 // This should eventually be done in LLAppViewer
1372 LLImageJ2C::closeDSO(); 1361 LLImage::cleanupClass();
1373 LLImageFormatted::cleanupClass();
1374 LLVFSThread::cleanupClass(); 1362 LLVFSThread::cleanupClass();
1375 LLLFSThread::cleanupClass(); 1363 LLLFSThread::cleanupClass();
1376 1364
@@ -1409,8 +1397,6 @@ bool LLAppViewer::cleanup()
1409 1397
1410 LLWeb::loadURLExternal( gLaunchFileOnQuit ); 1398 LLWeb::loadURLExternal( gLaunchFileOnQuit );
1411 } 1399 }
1412
1413 LLViewerMedia::cleanupClass();
1414 1400
1415 llinfos << "Goodbye" << llendflush; 1401 llinfos << "Goodbye" << llendflush;
1416 1402
@@ -1440,8 +1426,7 @@ bool LLAppViewer::initThreads()
1440 LLAppViewer::sImageDecodeThread = new LLWorkerThread("ImageDecode", enable_threads && true); 1426 LLAppViewer::sImageDecodeThread = new LLWorkerThread("ImageDecode", enable_threads && true);
1441 LLAppViewer::sTextureCache = new LLTextureCache(enable_threads && true); 1427 LLAppViewer::sTextureCache = new LLTextureCache(enable_threads && true);
1442 LLAppViewer::sTextureFetch = new LLTextureFetch(LLAppViewer::getTextureCache(), enable_threads && false); 1428 LLAppViewer::sTextureFetch = new LLTextureFetch(LLAppViewer::getTextureCache(), enable_threads && false);
1443 LLImageWorker::initClass(LLAppViewer::getImageDecodeThread()); 1429 LLImage::initClass(LLAppViewer::getImageDecodeThread());
1444 LLImageJ2C::openDSO();
1445 1430
1446 // *FIX: no error handling here! 1431 // *FIX: no error handling here!
1447 return true; 1432 return true;
@@ -1878,22 +1863,6 @@ bool LLAppViewer::initConfiguration()
1878 // llerrs << "Failed to parse skin definition." << llendl; 1863 // llerrs << "Failed to parse skin definition." << llendl;
1879 // } 1864 // }
1880 1865
1881 // LLXmlTreeNode* rootp = skin_def_tree.getRoot();
1882 // LLXmlTreeNode* disabled_message_node = rootp->getChildByName("disabled_message");
1883 // if (disabled_message_node)
1884 // {
1885 // gDisabledMessage = disabled_message_node->getContents();
1886 // }
1887
1888 // static LLStdStringHandle hide_links_string = LLXmlTree::addAttributeString("hide_links");
1889 // rootp->getFastAttributeBOOL(hide_links_string, gHideLinks);
1890
1891 // // Legacy string. This flag really meant we didn't want to expose references to "Second Life".
1892 // // Just set gHideLinks instead.
1893 // static LLStdStringHandle silent_string = LLXmlTree::addAttributeString("silent_update");
1894 // BOOL silent_update;
1895 // rootp->getFastAttributeBOOL(silent_string, silent_update);
1896 // gHideLinks = (gHideLinks || silent_update);
1897 //} 1866 //}
1898 1867
1899#if LL_DARWIN 1868#if LL_DARWIN
@@ -1946,7 +1915,7 @@ bool LLAppViewer::initConfiguration()
1946#endif 1915#endif
1947 LLStringUtil::truncate(gWindowTitle, 255); 1916 LLStringUtil::truncate(gWindowTitle, 255);
1948 1917
1949 //RN: if we received a URL, hand it off to the existing instance 1918 //RN: if we received a URL, hand it off to the existing instance.
1950 // don't call anotherInstanceRunning() when doing URL handoff, as 1919 // don't call anotherInstanceRunning() when doing URL handoff, as
1951 // it relies on checking a marker file which will not work when running 1920 // it relies on checking a marker file which will not work when running
1952 // out of different directories 1921 // out of different directories
@@ -1961,7 +1930,7 @@ bool LLAppViewer::initConfiguration()
1961 } 1930 }
1962 if (!slurl.empty()) 1931 if (!slurl.empty())
1963 { 1932 {
1964 if (send_url_to_other_instance(slurl)) 1933 if (sendURLToOtherInstance(slurl))
1965 { 1934 {
1966 // successfully handed off URL to existing instance, exit 1935 // successfully handed off URL to existing instance, exit
1967 return false; 1936 return false;
@@ -1992,7 +1961,7 @@ bool LLAppViewer::initConfiguration()
1992 } 1961 }
1993 1962
1994 initMarkerFile(); 1963 initMarkerFile();
1995 1964
1996#if LL_SEND_CRASH_REPORTS 1965#if LL_SEND_CRASH_REPORTS
1997 if (gLastExecEvent == LAST_EXEC_FROZE) 1966 if (gLastExecEvent == LAST_EXEC_FROZE)
1998 { 1967 {
@@ -2014,52 +1983,8 @@ bool LLAppViewer::initConfiguration()
2014 { 1983 {
2015 llinfos << "Sending crash report." << llendl; 1984 llinfos << "Sending crash report." << llendl;
2016 1985
2017#if LL_WINDOWS 1986 bool report_freeze = true;
2018 std::string exe_path = gDirUtilp->getAppRODataDir(); 1987 handleCrashReporting(report_freeze);
2019 exe_path += gDirUtilp->getDirDelimiter();
2020 exe_path += "win_crash_logger.exe";
2021
2022 std::string arg_string = "-previous ";
2023 // Spawn crash logger.
2024 // NEEDS to wait until completion, otherwise log files will get smashed.
2025 _spawnl(_P_WAIT, exe_path.c_str(), exe_path.c_str(), arg_string.c_str(), NULL);
2026#elif LL_DARWIN
2027 std::string command_str;
2028 command_str = "mac-crash-logger.app/Contents/MacOS/mac-crash-logger ";
2029 command_str += "-previous";
2030 // XXX -- We need to exit fullscreen mode for this to work.
2031 // XXX -- system() also doesn't wait for completion. Hmm...
2032 system(command_str.c_str()); /* Flawfinder: Ignore */
2033#elif LL_LINUX || LL_SOLARIS
2034 std::string cmd =gDirUtilp->getAppRODataDir();
2035 cmd += gDirUtilp->getDirDelimiter();
2036#if LL_LINUX
2037 cmd += "linux-crash-logger.bin";
2038#else // LL_SOLARIS
2039 cmd += "bin/solaris-crash-logger";
2040#endif // LL_LINUX
2041 char* const cmdargv[] =
2042 {(char*)cmd.c_str(),
2043 (char*)"-previous",
2044 NULL};
2045 fflush(NULL); // flush all buffers before the child inherits them
2046 pid_t pid = fork();
2047 if (pid == 0)
2048 { // child
2049 execv(cmd.c_str(), cmdargv); /* Flawfinder: Ignore */
2050 llwarns << "execv failure when trying to start " << cmd << llendl;
2051 _exit(1); // avoid atexit()
2052 } else {
2053 if (pid > 0)
2054 {
2055 // wait for child proc to die
2056 int childExitStatus;
2057 waitpid(pid, &childExitStatus, 0);
2058 } else {
2059 llwarns << "fork failure." << llendl;
2060 }
2061 }
2062#endif
2063 } 1988 }
2064 else 1989 else
2065 { 1990 {
@@ -2262,7 +2187,7 @@ void LLAppViewer::writeSystemInfo()
2262 gDebugInfo["RAMInfo"]["Physical"] = (LLSD::Integer)(gSysMemory.getPhysicalMemoryKB()); 2187 gDebugInfo["RAMInfo"]["Physical"] = (LLSD::Integer)(gSysMemory.getPhysicalMemoryKB());
2263 gDebugInfo["RAMInfo"]["Allocated"] = (LLSD::Integer)(gMemoryAllocated>>10); // MB -> KB 2188 gDebugInfo["RAMInfo"]["Allocated"] = (LLSD::Integer)(gMemoryAllocated>>10); // MB -> KB
2264 gDebugInfo["OSInfo"] = getOSInfo().getOSStringSimple(); 2189 gDebugInfo["OSInfo"] = getOSInfo().getOSStringSimple();
2265 2190
2266 // The user is not logged on yet, but record the current grid choice login url 2191 // The user is not logged on yet, but record the current grid choice login url
2267 // which may have been the intended grid. This can b 2192 // which may have been the intended grid. This can b
2268 gDebugInfo["GridName"] = LLViewerLogin::getInstance()->getGridLabel(); 2193 gDebugInfo["GridName"] = LLViewerLogin::getInstance()->getGridLabel();
@@ -2273,6 +2198,13 @@ void LLAppViewer::writeSystemInfo()
2273 gDebugInfo["MainloopThreadID"] = (S32)thread_id; 2198 gDebugInfo["MainloopThreadID"] = (S32)thread_id;
2274#endif 2199#endif
2275 2200
2201 // "CrashNotHandled" is set here, while things are running well,
2202 // in case of a freeze. If there is a freeze, the crash logger will be launched
2203 // and can read this value from the debug_info.log.
2204 // If the crash is handled by LLAppViewer::handleViewerCrash, ie not a freeze,
2205 // then the value of "CrashNotHandled" will be set to true.
2206 gDebugInfo["CrashNotHandled"] = (LLSD::Boolean)true;
2207
2276 // Dump some debugging info 2208 // Dump some debugging info
2277 LL_INFOS("SystemInfo") << gSecondLife 2209 LL_INFOS("SystemInfo") << gSecondLife
2278 << " version " << LL_VERSION_MAJOR << "." << LL_VERSION_MINOR << "." << LL_VERSION_PATCH 2210 << " version " << LL_VERSION_MAJOR << "." << LL_VERSION_MINOR << "." << LL_VERSION_PATCH
@@ -2347,6 +2279,8 @@ void LLAppViewer::handleViewerCrash()
2347 gDebugInfo["CAFilename"] = gDirUtilp->getCAFile(); 2279 gDebugInfo["CAFilename"] = gDirUtilp->getCAFile();
2348 gDebugInfo["ViewerExePath"] = gDirUtilp->getExecutablePathAndName(); 2280 gDebugInfo["ViewerExePath"] = gDirUtilp->getExecutablePathAndName();
2349 gDebugInfo["CurrentPath"] = gDirUtilp->getCurPath(); 2281 gDebugInfo["CurrentPath"] = gDirUtilp->getCurPath();
2282 gDebugInfo["SessionLength"] = F32(LLFrameTimer::getElapsedSeconds());
2283
2350 if(gLogoutInProgress) 2284 if(gLogoutInProgress)
2351 { 2285 {
2352 gDebugInfo["LastExecEvent"] = LAST_EXEC_LOGOUT_CRASH; 2286 gDebugInfo["LastExecEvent"] = LAST_EXEC_LOGOUT_CRASH;
@@ -2372,6 +2306,9 @@ void LLAppViewer::handleViewerCrash()
2372 gDebugInfo["MainloopTimeoutState"] = LLAppViewer::instance()->mMainloopTimeout->getState(); 2306 gDebugInfo["MainloopTimeoutState"] = LLAppViewer::instance()->mMainloopTimeout->getState();
2373 } 2307 }
2374 2308
2309 // The crash is being handled here so set this value to false.
2310 // Otherwise the crash logger will think this crash was a freeze.
2311 gDebugInfo["CrashNotHandled"] = (LLSD::Boolean)false;
2375 2312
2376 //Write out the crash status file 2313 //Write out the crash status file
2377 //Use marker file style setup, as that's the simplest, especially since 2314 //Use marker file style setup, as that's the simplest, especially since
@@ -2455,24 +2392,23 @@ bool LLAppViewer::anotherInstanceRunning()
2455 { 2392 {
2456 // Another instance is running. Skip the rest of these operations. 2393 // Another instance is running. Skip the rest of these operations.
2457 LL_INFOS("MarkerFile") << "Marker file is locked." << LL_ENDL; 2394 LL_INFOS("MarkerFile") << "Marker file is locked." << LL_ENDL;
2458 return TRUE; 2395 return true;
2459 } 2396 }
2460 if (apr_file_lock(fMarker, APR_FLOCK_NONBLOCK | APR_FLOCK_EXCLUSIVE) != APR_SUCCESS) //flock(fileno(fMarker), LOCK_EX | LOCK_NB) == -1) 2397 if (apr_file_lock(fMarker, APR_FLOCK_NONBLOCK | APR_FLOCK_EXCLUSIVE) != APR_SUCCESS) //flock(fileno(fMarker), LOCK_EX | LOCK_NB) == -1)
2461 { 2398 {
2462 apr_file_close(fMarker); 2399 apr_file_close(fMarker);
2463 LL_INFOS("MarkerFile") << "Marker file is locked." << LL_ENDL; 2400 LL_INFOS("MarkerFile") << "Marker file is locked." << LL_ENDL;
2464 return TRUE; 2401 return true;
2465 } 2402 }
2466 // No other instances; we'll lock this file now & delete on quit. 2403 // No other instances; we'll lock this file now & delete on quit.
2467 apr_file_close(fMarker); 2404 apr_file_close(fMarker);
2468 } 2405 }
2469 LL_DEBUGS("MarkerFile") << "Marker file isn't locked." << LL_ENDL; 2406 LL_DEBUGS("MarkerFile") << "Marker file isn't locked." << LL_ENDL;
2470 return FALSE; 2407 return false;
2471} 2408}
2472 2409
2473void LLAppViewer::initMarkerFile() 2410void LLAppViewer::initMarkerFile()
2474{ 2411{
2475
2476 //First, check for the existence of other files. 2412 //First, check for the existence of other files.
2477 //There are marker files for two different types of crashes 2413 //There are marker files for two different types of crashes
2478 2414
@@ -2727,7 +2663,7 @@ bool LLAppViewer::initCache()
2727 2663
2728 // Init the texture cache 2664 // Init the texture cache
2729 // Allocate 80% of the cache size for textures 2665 // Allocate 80% of the cache size for textures
2730 BOOL read_only = mSecondInstance ? true : false; 2666 BOOL read_only = mSecondInstance ? TRUE : FALSE;
2731 const S32 MB = 1024*1024; 2667 const S32 MB = 1024*1024;
2732 S64 cache_size = (S64)(gSavedSettings.getU32("CacheSize")) * MB; 2668 S64 cache_size = (S64)(gSavedSettings.getU32("CacheSize")) * MB;
2733 const S64 MAX_CACHE_SIZE = 1024*MB; 2669 const S64 MAX_CACHE_SIZE = 1024*MB;
@@ -3796,6 +3732,11 @@ void LLAppViewer::pauseMainloopTimeout()
3796 3732
3797void LLAppViewer::pingMainloopTimeout(const std::string& state, F32 secs) 3733void LLAppViewer::pingMainloopTimeout(const std::string& state, F32 secs)
3798{ 3734{
3735// if(!restoreErrorTrap())
3736// {
3737// llwarns << "!!!!!!!!!!!!! Its an error trap!!!!" << state << llendl;
3738// }
3739
3799 if(mMainloopTimeout) 3740 if(mMainloopTimeout)
3800 { 3741 {
3801 if(secs < 0.0f) 3742 if(secs < 0.0f)
@@ -3808,3 +3749,42 @@ void LLAppViewer::pingMainloopTimeout(const std::string& state, F32 secs)
3808 } 3749 }
3809} 3750}
3810 3751
3752void LLAppViewer::handleLoginComplete()
3753{
3754 initMainloopTimeout("Mainloop Init");
3755
3756 // Store some data to DebugInfo in case of a freeze.
3757 gDebugInfo["ClientInfo"]["Name"] = gSavedSettings.getString("VersionChannelName");
3758
3759 gDebugInfo["ClientInfo"]["MajorVersion"] = LL_VERSION_MAJOR;
3760 gDebugInfo["ClientInfo"]["MinorVersion"] = LL_VERSION_MINOR;
3761 gDebugInfo["ClientInfo"]["PatchVersion"] = LL_VERSION_PATCH;
3762 gDebugInfo["ClientInfo"]["BuildVersion"] = LL_VERSION_BUILD;
3763
3764 LLParcel* parcel = LLViewerParcelMgr::getInstance()->getAgentParcel();
3765 if ( parcel && parcel->getMusicURL()[0])
3766 {
3767 gDebugInfo["ParcelMusicURL"] = parcel->getMusicURL();
3768 }
3769 if ( parcel && parcel->getMediaURL()[0])
3770 {
3771 gDebugInfo["ParcelMediaURL"] = parcel->getMediaURL();
3772 }
3773
3774 gDebugInfo["SettingsFilename"] = gSavedSettings.getString("ClientSettingsFile");
3775 gDebugInfo["CAFilename"] = gDirUtilp->getCAFile();
3776 gDebugInfo["ViewerExePath"] = gDirUtilp->getExecutablePathAndName();
3777 gDebugInfo["CurrentPath"] = gDirUtilp->getCurPath();
3778
3779 if(gAgent.getRegion())
3780 {
3781 gDebugInfo["CurrentSimHost"] = gAgent.getRegionHost().getHostName();
3782 gDebugInfo["CurrentRegion"] = gAgent.getRegion()->getName();
3783 }
3784
3785 if(LLAppViewer::instance()->mMainloopTimeout)
3786 {
3787 gDebugInfo["MainloopTimeoutState"] = LLAppViewer::instance()->mMainloopTimeout->getState();
3788 }
3789 writeDebugInfo();
3790}
diff --git a/linden/indra/newview/llappviewer.h b/linden/indra/newview/llappviewer.h
index 801deb1..6545a61 100644
--- a/linden/indra/newview/llappviewer.h
+++ b/linden/indra/newview/llappviewer.h
@@ -77,7 +77,9 @@ public:
77 // Report true if under the control of a debugger. A null-op default. 77 // Report true if under the control of a debugger. A null-op default.
78 virtual bool beingDebugged() { return false; } 78 virtual bool beingDebugged() { return false; }
79 79
80 virtual void handleCrashReporting() = 0; // What to do with crash report? 80 virtual bool restoreErrorTrap() = 0; // Require platform specific override to reset error handling mechanism.
81 // return false if the error trap needed restoration.
82 virtual void handleCrashReporting(bool reportFreeze = false) = 0; // What to do with crash report?
81 virtual void handleSyncCrashTrace() = 0; // any low-level crash-prep that has to happen in the context of the crashing thread before the crash report is delivered. 83 virtual void handleSyncCrashTrace() = 0; // any low-level crash-prep that has to happen in the context of the crashing thread before the crash report is delivered.
82 static void handleViewerCrash(); // Hey! The viewer crashed. Do this, soon. 84 static void handleViewerCrash(); // Hey! The viewer crashed. Do this, soon.
83 static void handleSyncViewerCrash(); // Hey! The viewer crashed. Do this right NOW in the context of the crashing thread. 85 static void handleSyncViewerCrash(); // Hey! The viewer crashed. Do this right NOW in the context of the crashing thread.
@@ -136,15 +138,21 @@ public:
136 void resumeMainloopTimeout(const std::string& state = "", F32 secs = -1.0f); 138 void resumeMainloopTimeout(const std::string& state = "", F32 secs = -1.0f);
137 void pingMainloopTimeout(const std::string& state, F32 secs = -1.0f); 139 void pingMainloopTimeout(const std::string& state, F32 secs = -1.0f);
138 140
141 // Handle the 'login completed' event.
142 // *NOTE:Mani Fix this for login abstraction!!
143 void handleLoginComplete();
144
139protected: 145protected:
140 virtual bool initWindow(); // Initialize the viewer's window. 146 virtual bool initWindow(); // Initialize the viewer's window.
141 virtual bool initLogging(); // Initialize log files, logging system, return false on failure. 147 virtual bool initLogging(); // Initialize log files, logging system, return false on failure.
142 virtual void initConsole() {}; // Initialize OS level debugging console. 148 virtual void initConsole() {}; // Initialize OS level debugging console.
143 virtual bool initHardwareTest() { return true; } // A false result indicates the app should quit. 149 virtual bool initHardwareTest() { return true; } // A false result indicates the app should quit.
150 virtual bool initSLURLHandler();
151 virtual bool sendURLToOtherInstance(const std::string& url);
144 152
145 virtual bool initParseCommandLine(LLCommandLineParser& clp) 153 virtual bool initParseCommandLine(LLCommandLineParser& clp)
146 { return true; } // Allow platforms to specify the command line args. 154 { return true; } // Allow platforms to specify the command line args.
147 155
148 virtual std::string generateSerialNumber() = 0; // Platforms specific classes generate this. 156 virtual std::string generateSerialNumber() = 0; // Platforms specific classes generate this.
149 157
150 158
@@ -211,6 +219,15 @@ private:
211 // for tracking viewer<->region circuit death 219 // for tracking viewer<->region circuit death
212 bool mAgentRegionLastAlive; 220 bool mAgentRegionLastAlive;
213 LLUUID mAgentRegionLastID; 221 LLUUID mAgentRegionLastID;
222
223public:
224 //some information for updater
225 typedef struct
226 {
227 std::string mUpdateExePath;
228 std::ostringstream mParams;
229 }LLUpdaterInfo ;
230 static LLUpdaterInfo *sUpdaterInfo ;
214}; 231};
215 232
216// consts from viewer.h 233// consts from viewer.h
@@ -222,8 +239,6 @@ const S32 AGENT_UPDATES_PER_SECOND = 10;
222// "// llstartup" indicates that llstartup is the only client for this global. 239// "// llstartup" indicates that llstartup is the only client for this global.
223 240
224extern BOOL gHandleKeysAsync; // gSavedSettings used by llviewerdisplay.cpp & llviewermenu.cpp 241extern BOOL gHandleKeysAsync; // gSavedSettings used by llviewerdisplay.cpp & llviewermenu.cpp
225extern std::string gDisabledMessage; // llstartup
226extern BOOL gHideLinks; // used by llpanellogin, lllfloaterbuycurrency, llstartup
227extern LLSD gDebugInfo; 242extern LLSD gDebugInfo;
228 243
229extern BOOL gAllowIdleAFK; 244extern BOOL gAllowIdleAFK;
diff --git a/linden/indra/newview/llappviewerlinux.cpp b/linden/indra/newview/llappviewerlinux.cpp
index 0a4a9cf..643013b 100644
--- a/linden/indra/newview/llappviewerlinux.cpp
+++ b/linden/indra/newview/llappviewerlinux.cpp
@@ -1,6 +1,6 @@
1/** 1/**
2 * @file llappviewerlinux.cpp 2 * @file llappviewerlinux.cpp
3 * @brief The LLAppViewerWin32 class definitions 3 * @brief The LLAppViewerLinux class definitions
4 * 4 *
5 * $LicenseInfo:firstyear=2007&license=viewergpl$ 5 * $LicenseInfo:firstyear=2007&license=viewergpl$
6 * 6 *
@@ -36,8 +36,10 @@
36#include "llcommandlineparser.h" 36#include "llcommandlineparser.h"
37 37
38#include "llmemtype.h" 38#include "llmemtype.h"
39#include "llurldispatcher.h" // SLURL from other app instance
39#include "llviewernetwork.h" 40#include "llviewernetwork.h"
40#include "llviewercontrol.h" 41#include "llviewercontrol.h"
42#include "llwindowsdl.h"
41#include "llmd5.h" 43#include "llmd5.h"
42#include "llfindlocale.h" 44#include "llfindlocale.h"
43 45
@@ -60,6 +62,17 @@
60# include "ELFIO/ELFIO.h" // for better backtraces 62# include "ELFIO/ELFIO.h" // for better backtraces
61#endif 63#endif
62 64
65#if LL_DBUS_ENABLED
66# include "llappviewerlinux_api_dbus.h"
67
68// regrettable hacks to give us better runtime compatibility with older systems inside llappviewerlinux_api.h:
69#define llg_return_if_fail(COND) do{if (!(COND)) return;}while(0)
70#undef g_return_if_fail
71#define g_return_if_fail(COND) llg_return_if_fail(COND)
72// The generated API
73# include "llappviewerlinux_api.h"
74#endif
75
63namespace 76namespace
64{ 77{
65 int gArgC = 0; 78 int gArgC = 0;
@@ -321,6 +334,193 @@ bool LLAppViewerLinux::init()
321 return LLAppViewer::init(); 334 return LLAppViewer::init();
322} 335}
323 336
337bool LLAppViewerLinux::restoreErrorTrap()
338{
339 // *NOTE:Mani there is a case for implementing this or the mac.
340 // Linux doesn't need it to my knowledge.
341 return true;
342}
343
344/////////////////////////////////////////
345#if LL_DBUS_ENABLED
346
347typedef struct
348{
349 GObjectClass parent_class;
350} ViewerAppAPIClass;
351
352static void viewerappapi_init(ViewerAppAPI *server);
353static void viewerappapi_class_init(ViewerAppAPIClass *klass);
354
355///
356
357// regrettable hacks to give us better runtime compatibility with older systems in general
358static GType llg_type_register_static_simple_ONCE(GType parent_type,
359 const gchar *type_name,
360 guint class_size,
361 GClassInitFunc class_init,
362 guint instance_size,
363 GInstanceInitFunc instance_init,
364 GTypeFlags flags)
365{
366 static GTypeInfo type_info;
367 memset(&type_info, 0, sizeof(type_info));
368
369 type_info.class_size = class_size;
370 type_info.class_init = class_init;
371 type_info.instance_size = instance_size;
372 type_info.instance_init = instance_init;
373
374 return g_type_register_static(parent_type, type_name, &type_info, flags);
375}
376#define llg_intern_static_string(S) (S)
377#define g_intern_static_string(S) llg_intern_static_string(S)
378#define g_type_register_static_simple(parent_type, type_name, class_size, class_init, instance_size, instance_init, flags) llg_type_register_static_simple_ONCE(parent_type, type_name, class_size, class_init, instance_size, instance_init, flags)
379
380G_DEFINE_TYPE(ViewerAppAPI, viewerappapi, G_TYPE_OBJECT);
381
382void viewerappapi_class_init(ViewerAppAPIClass *klass)
383{
384}
385
386static bool dbus_server_init = false;
387
388void viewerappapi_init(ViewerAppAPI *server)
389{
390 // Connect to the default DBUS, register our service/API.
391
392 if (!dbus_server_init)
393 {
394 GError *error = NULL;
395
396 server->connection = lldbus_g_bus_get(DBUS_BUS_SESSION, &error);
397 if (server->connection)
398 {
399 lldbus_g_object_type_install_info(viewerappapi_get_type(), &dbus_glib_viewerapp_object_info);
400
401 lldbus_g_connection_register_g_object(server->connection, VIEWERAPI_PATH, G_OBJECT(server));
402
403 DBusGProxy *serverproxy = lldbus_g_proxy_new_for_name(server->connection, DBUS_SERVICE_DBUS, DBUS_PATH_DBUS, DBUS_INTERFACE_DBUS);
404
405 guint request_name_ret_unused;
406 // akin to org_freedesktop_DBus_request_name
407 if (lldbus_g_proxy_call(serverproxy, "RequestName", &error, G_TYPE_STRING, VIEWERAPI_SERVICE, G_TYPE_UINT, 0, G_TYPE_INVALID, G_TYPE_UINT, &request_name_ret_unused, G_TYPE_INVALID))
408 {
409 // total success.
410 dbus_server_init = true;
411 }
412 else
413 {
414 llwarns << "Unable to register service name: " << error->message << llendl;
415 }
416
417 g_object_unref(serverproxy);
418 }
419 else
420 {
421 g_warning("Unable to connect to dbus: %s", error->message);
422 }
423
424 if (error)
425 g_error_free(error);
426 }
427}
428
429gboolean viewer_app_api_GoSLURL(ViewerAppAPI *obj, gchar *slurl, gboolean **success_rtn, GError **error)
430{
431 bool success = false;
432
433 llinfos << "Was asked to go to slurl: " << slurl << llendl;
434
435 const bool from_external_browser = true;
436 if (LLURLDispatcher::dispatch(slurl, from_external_browser))
437 {
438 // bring window to foreground, as it has just been "launched" from a URL
439 // todo: hmm, how to get there from here?
440 //xxx->mWindow->bringToFront();
441 success = true;
442 }
443
444 *success_rtn = g_new (gboolean, 1);
445 (*success_rtn)[0] = (gboolean)success;
446
447 return TRUE; // the invokation succeeded, even if the actual dispatch didn't.
448}
449
450///
451
452//virtual
453bool LLAppViewerLinux::initSLURLHandler()
454{
455 if (!grab_dbus_syms(DBUSGLIB_DYLIB_DEFAULT_NAME))
456 {
457 return false; // failed
458 }
459
460 g_type_init();
461
462 //ViewerAppAPI *api_server = (ViewerAppAPI*)
463 g_object_new(viewerappapi_get_type(), NULL);
464
465 return true;
466}
467
468//virtual
469bool LLAppViewerLinux::sendURLToOtherInstance(const std::string& url)
470{
471 if (!grab_dbus_syms(DBUSGLIB_DYLIB_DEFAULT_NAME))
472 {
473 return false; // failed
474 }
475
476 bool success = false;
477 DBusGConnection *bus;
478 GError *error = NULL;
479
480 g_type_init();
481
482 bus = lldbus_g_bus_get (DBUS_BUS_SESSION, &error);
483 if (bus)
484 {
485 gboolean rtn = FALSE;
486 DBusGProxy *remote_object =
487 lldbus_g_proxy_new_for_name(bus, VIEWERAPI_SERVICE, VIEWERAPI_PATH, VIEWERAPI_INTERFACE);
488
489 if (lldbus_g_proxy_call(remote_object, "GoSLURL", &error,
490 G_TYPE_STRING, url.c_str(), G_TYPE_INVALID,
491 G_TYPE_BOOLEAN, &rtn, G_TYPE_INVALID))
492 {
493 success = rtn;
494 }
495 else
496 {
497 llinfos << "Call-out to other instance failed (perhaps not running): " << error->message << llendl;
498 }
499
500 g_object_unref(G_OBJECT(remote_object));
501 }
502 else
503 {
504 llwarns << "Couldn't connect to session bus: " << error->message << llendl;
505 }
506
507 if (error)
508 g_error_free(error);
509
510 return success;
511}
512
513#else // LL_DBUS_ENABLED
514bool LLAppViewerLinux::initSLURLHandler()
515{
516 return false; // not implemented without dbus
517}
518bool LLAppViewerLinux::sendURLToOtherInstance(const std::string& url)
519{
520 return false; // not implemented without dbus
521}
522#endif // LL_DBUS_ENABLED
523
324void LLAppViewerLinux::handleSyncCrashTrace() 524void LLAppViewerLinux::handleSyncCrashTrace()
325{ 525{
326 // This backtrace writes into stack_trace.log 526 // This backtrace writes into stack_trace.log
@@ -331,57 +531,90 @@ void LLAppViewerLinux::handleSyncCrashTrace()
331# endif // LL_ELFBIN 531# endif // LL_ELFBIN
332} 532}
333 533
334void LLAppViewerLinux::handleCrashReporting() 534void LLAppViewerLinux::handleCrashReporting(bool reportFreeze)
335{ 535{
336 const S32 cb = gCrashSettings.getS32(CRASH_BEHAVIOR_SETTING); 536 std::string cmd =gDirUtilp->getAppRODataDir();
337 537 cmd += gDirUtilp->getDirDelimiter();
338 // Always generate the report, have the logger do the asking, and 538#if LL_LINUX
339 // don't wait for the logger before exiting (-> total cleanup). 539 cmd += "linux-crash-logger.bin";
340 if (CRASH_BEHAVIOR_NEVER_SEND != cb) 540#else // LL_SOLARIS
341 { 541 cmd += "bin/solaris-crash-logger";
342 // launch the actual crash logger 542#endif // LL_LINUX
343 const char* ask_dialog = "-dialog"; 543
344 if (CRASH_BEHAVIOR_ASK != cb) 544 if(reportFreeze)
345 ask_dialog = ""; // omit '-dialog' option 545 {
346 std::string cmd =gDirUtilp->getAppRODataDir(); 546 char* const cmdargv[] =
347 cmd += gDirUtilp->getDirDelimiter(); 547 {(char*)cmd.c_str(),
348 cmd += "linux-crash-logger.bin"; 548 (char*)"-previous",
349 const char * cmdargv[] =
350 {cmd.c_str(),
351 ask_dialog,
352 "-user",
353 (char*)LLViewerLogin::getInstance()->getGridLabel().c_str(),
354 "-name",
355 LLAppViewer::instance()->getSecondLifeTitle().c_str(),
356 NULL}; 549 NULL};
357 fflush(NULL); 550
551 fflush(NULL); // flush all buffers before the child inherits them
358 pid_t pid = fork(); 552 pid_t pid = fork();
359 if (pid == 0) 553 if (pid == 0)
360 { // child 554 { // child
361 execv(cmd.c_str(), (char* const*) cmdargv); /* Flawfinder: ignore */ 555 execv(cmd.c_str(), cmdargv); /* Flawfinder: Ignore */
362 llwarns << "execv failure when trying to start " << cmd << llendl; 556 llwarns << "execv failure when trying to start " << cmd << llendl;
363 _exit(1); // avoid atexit() 557 _exit(1); // avoid atexit()
364 } 558 } else {
365 else
366 {
367 if (pid > 0) 559 if (pid > 0)
368 { 560 {
369 // DO NOT wait for child proc to die; we want 561 // wait for child proc to die
370 // the logger to outlive us while we quit to 562 int childExitStatus;
371 // free up the screen/keyboard/etc. 563 waitpid(pid, &childExitStatus, 0);
372 ////int childExitStatus; 564 } else {
373 ////waitpid(pid, &childExitStatus, 0); 565 llwarns << "fork failure." << llendl;
566 }
567 }
568 }
569 else
570 {
571 const S32 cb = gCrashSettings.getS32(CRASH_BEHAVIOR_SETTING);
572
573 // Always generate the report, have the logger do the asking, and
574 // don't wait for the logger before exiting (-> total cleanup).
575 if (CRASH_BEHAVIOR_NEVER_SEND != cb)
576 {
577 // launch the actual crash logger
578 const char* ask_dialog = "-dialog";
579 if (CRASH_BEHAVIOR_ASK != cb)
580 ask_dialog = ""; // omit '-dialog' option
581 const char * cmdargv[] =
582 {cmd.c_str(),
583 ask_dialog,
584 "-user",
585 (char*)LLViewerLogin::getInstance()->getGridLabel().c_str(),
586 "-name",
587 LLAppViewer::instance()->getSecondLifeTitle().c_str(),
588 NULL};
589 fflush(NULL);
590 pid_t pid = fork();
591 if (pid == 0)
592 { // child
593 execv(cmd.c_str(), (char* const*) cmdargv); /* Flawfinder: ignore */
594 llwarns << "execv failure when trying to start " << cmd << llendl;
595 _exit(1); // avoid atexit()
374 } 596 }
375 else 597 else
376 { 598 {
377 llwarns << "fork failure." << llendl; 599 if (pid > 0)
600 {
601 // DO NOT wait for child proc to die; we want
602 // the logger to outlive us while we quit to
603 // free up the screen/keyboard/etc.
604 ////int childExitStatus;
605 ////waitpid(pid, &childExitStatus, 0);
606 }
607 else
608 {
609 llwarns << "fork failure." << llendl;
610 }
378 } 611 }
379 } 612 }
613 // Sometimes signals don't seem to quit the viewer. Also, we may
614 // have been called explicitly instead of from a signal handler.
615 // Make sure we exit so as to not totally confuse the user.
616 _exit(1); // avoid atexit(), else we may re-crash in dtors.
380 } 617 }
381 // Sometimes signals don't seem to quit the viewer. Also, we may
382 // have been called explicitly instead of from a signal handler.
383 // Make sure we exit so as to not totally confuse the user.
384 _exit(1); // avoid atexit(), else we may re-crash in dtors.
385} 618}
386 619
387bool LLAppViewerLinux::beingDebugged() 620bool LLAppViewerLinux::beingDebugged()
diff --git a/linden/indra/newview/llappviewerlinux.h b/linden/indra/newview/llappviewerlinux.h
index a180b4d..7b6d75c 100644
--- a/linden/indra/newview/llappviewerlinux.h
+++ b/linden/indra/newview/llappviewerlinux.h
@@ -32,6 +32,14 @@
32#ifndef LL_LLAPPVIEWERLINUX_H 32#ifndef LL_LLAPPVIEWERLINUX_H
33#define LL_LLAPPVIEWERLINUX_H 33#define LL_LLAPPVIEWERLINUX_H
34 34
35#if LL_DBUS_ENABLED
36extern "C" {
37# include <glib.h>
38# include <glib-object.h>
39# include <dbus/dbus-glib.h>
40}
41#endif
42
35#ifndef LL_LLAPPVIEWER_H 43#ifndef LL_LLAPPVIEWER_H
36#include "llappviewer.h" 44#include "llappviewer.h"
37#endif 45#endif
@@ -49,15 +57,37 @@ public:
49 // 57 //
50 virtual bool init(); // Override to do application initialization 58 virtual bool init(); // Override to do application initialization
51 std::string generateSerialNumber(); 59 std::string generateSerialNumber();
60 bool setupSLURLHandler();
52 61
53protected: 62protected:
54 virtual bool beingDebugged(); 63 virtual bool beingDebugged();
55 64
56 virtual void handleCrashReporting(); 65 virtual bool restoreErrorTrap();
66 virtual void handleCrashReporting(bool reportFreeze);
57 virtual void handleSyncCrashTrace(); 67 virtual void handleSyncCrashTrace();
58 68
59 virtual bool initLogging(); 69 virtual bool initLogging();
60 virtual bool initParseCommandLine(LLCommandLineParser& clp); 70 virtual bool initParseCommandLine(LLCommandLineParser& clp);
71
72 virtual bool initSLURLHandler();
73 virtual bool sendURLToOtherInstance(const std::string& url);
61}; 74};
62 75
76#if LL_DBUS_ENABLED
77typedef struct
78{
79 GObject parent;
80 DBusGConnection *connection;
81} ViewerAppAPI;
82
83extern "C" {
84 gboolean viewer_app_api_GoSLURL(ViewerAppAPI *obj, gchar *slurl, gboolean **success_rtn, GError **error);
85}
86
87#define VIEWERAPI_SERVICE "com.secondlife.ViewerAppAPIService"
88#define VIEWERAPI_PATH "/com/secondlife/ViewerAppAPI"
89#define VIEWERAPI_INTERFACE "com.secondlife.ViewerAppAPI"
90
91#endif // LL_DBUS_ENABLED
92
63#endif // LL_LLAPPVIEWERLINUX_H 93#endif // LL_LLAPPVIEWERLINUX_H
diff --git a/linden/indra/newview/llappviewerlinux_api.h b/linden/indra/newview/llappviewerlinux_api.h
new file mode 100644
index 0000000..bd17599
--- /dev/null
+++ b/linden/indra/newview/llappviewerlinux_api.h
@@ -0,0 +1,148 @@
1/* Generated by dbus-binding-tool; do not edit! */
2/**
3 * $LicenseInfo:firstyear=2008&license=viewergpl$
4 *
5 * Copyright (c) 2008, Linden Research, Inc.
6 *
7 * Second Life Viewer Source Code
8 * The source code in this file ("Source Code") is provided by Linden Lab
9 * to you under the terms of the GNU General Public License, version 2.0
10 * ("GPL"), unless you have obtained a separate licensing agreement
11 * ("Other License"), formally executed by you and Linden Lab. Terms of
12 * the GPL can be found in doc/GPL-license.txt in this distribution, or
13 * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
14 *
15 * There are special exceptions to the terms and conditions of the GPL as
16 * it is applied to this Source Code. View the full text of the exception
17 * in the file doc/FLOSS-exception.txt in this software distribution, or
18 * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception
19 *
20 * By copying, modifying or distributing this software, you acknowledge
21 * that you have read and understood your obligations described above,
22 * and agree to abide by those obligations.
23 *
24 * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
25 * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
26 * COMPLETENESS OR PERFORMANCE.
27 * $/LicenseInfo$
28 */
29
30#ifndef __dbus_glib_marshal_viewerapp_MARSHAL_H__
31#define __dbus_glib_marshal_viewerapp_MARSHAL_H__
32
33#include <glib-object.h>
34
35G_BEGIN_DECLS
36
37#ifdef G_ENABLE_DEBUG
38#define g_marshal_value_peek_boolean(v) g_value_get_boolean (v)
39#define g_marshal_value_peek_char(v) g_value_get_char (v)
40#define g_marshal_value_peek_uchar(v) g_value_get_uchar (v)
41#define g_marshal_value_peek_int(v) g_value_get_int (v)
42#define g_marshal_value_peek_uint(v) g_value_get_uint (v)
43#define g_marshal_value_peek_long(v) g_value_get_long (v)
44#define g_marshal_value_peek_ulong(v) g_value_get_ulong (v)
45#define g_marshal_value_peek_int64(v) g_value_get_int64 (v)
46#define g_marshal_value_peek_uint64(v) g_value_get_uint64 (v)
47#define g_marshal_value_peek_enum(v) g_value_get_enum (v)
48#define g_marshal_value_peek_flags(v) g_value_get_flags (v)
49#define g_marshal_value_peek_float(v) g_value_get_float (v)
50#define g_marshal_value_peek_double(v) g_value_get_double (v)
51#define g_marshal_value_peek_string(v) (char*) g_value_get_string (v)
52#define g_marshal_value_peek_param(v) g_value_get_param (v)
53#define g_marshal_value_peek_boxed(v) g_value_get_boxed (v)
54#define g_marshal_value_peek_pointer(v) g_value_get_pointer (v)
55#define g_marshal_value_peek_object(v) g_value_get_object (v)
56#else /* !G_ENABLE_DEBUG */
57/* WARNING: This code accesses GValues directly, which is UNSUPPORTED API.
58 * Do not access GValues directly in your code. Instead, use the
59 * g_value_get_*() functions
60 */
61#define g_marshal_value_peek_boolean(v) (v)->data[0].v_int
62#define g_marshal_value_peek_char(v) (v)->data[0].v_int
63#define g_marshal_value_peek_uchar(v) (v)->data[0].v_uint
64#define g_marshal_value_peek_int(v) (v)->data[0].v_int
65#define g_marshal_value_peek_uint(v) (v)->data[0].v_uint
66#define g_marshal_value_peek_long(v) (v)->data[0].v_long
67#define g_marshal_value_peek_ulong(v) (v)->data[0].v_ulong
68#define g_marshal_value_peek_int64(v) (v)->data[0].v_int64
69#define g_marshal_value_peek_uint64(v) (v)->data[0].v_uint64
70#define g_marshal_value_peek_enum(v) (v)->data[0].v_long
71#define g_marshal_value_peek_flags(v) (v)->data[0].v_ulong
72#define g_marshal_value_peek_float(v) (v)->data[0].v_float
73#define g_marshal_value_peek_double(v) (v)->data[0].v_double
74#define g_marshal_value_peek_string(v) (v)->data[0].v_pointer
75#define g_marshal_value_peek_param(v) (v)->data[0].v_pointer
76#define g_marshal_value_peek_boxed(v) (v)->data[0].v_pointer
77#define g_marshal_value_peek_pointer(v) (v)->data[0].v_pointer
78#define g_marshal_value_peek_object(v) (v)->data[0].v_pointer
79#endif /* !G_ENABLE_DEBUG */
80
81
82/* BOOLEAN:STRING,POINTER,POINTER (/tmp/dbus-binding-tool-c-marshallers.5XXD8T:1) */
83extern void dbus_glib_marshal_viewerapp_BOOLEAN__STRING_POINTER_POINTER (GClosure *closure,
84 GValue *return_value,
85 guint n_param_values,
86 const GValue *param_values,
87 gpointer invocation_hint,
88 gpointer marshal_data);
89void
90dbus_glib_marshal_viewerapp_BOOLEAN__STRING_POINTER_POINTER (GClosure *closure,
91 GValue *return_value,
92 guint n_param_values,
93 const GValue *param_values,
94 gpointer invocation_hint,
95 gpointer marshal_data)
96{
97 typedef gboolean (*GMarshalFunc_BOOLEAN__STRING_POINTER_POINTER) (gpointer data1,
98 gpointer arg_1,
99 gpointer arg_2,
100 gpointer arg_3,
101 gpointer data2);
102 register GMarshalFunc_BOOLEAN__STRING_POINTER_POINTER callback;
103 register GCClosure *cc = (GCClosure*) closure;
104 register gpointer data1, data2;
105 gboolean v_return;
106
107 g_return_if_fail (return_value != NULL);
108 g_return_if_fail (n_param_values == 4);
109
110 if (G_CCLOSURE_SWAP_DATA (closure))
111 {
112 data1 = closure->data;
113 data2 = g_value_peek_pointer (param_values + 0);
114 }
115 else
116 {
117 data1 = g_value_peek_pointer (param_values + 0);
118 data2 = closure->data;
119 }
120 callback = (GMarshalFunc_BOOLEAN__STRING_POINTER_POINTER) (marshal_data ? marshal_data : cc->callback);
121
122 v_return = callback (data1,
123 g_marshal_value_peek_string (param_values + 1),
124 g_marshal_value_peek_pointer (param_values + 2),
125 g_marshal_value_peek_pointer (param_values + 3),
126 data2);
127
128 g_value_set_boolean (return_value, v_return);
129}
130
131G_END_DECLS
132
133#endif /* __dbus_glib_marshal_viewerapp_MARSHAL_H__ */
134
135#include <dbus/dbus-glib.h>
136static const DBusGMethodInfo dbus_glib_viewerapp_methods[] = {
137 { (GCallback) viewer_app_api_GoSLURL, dbus_glib_marshal_viewerapp_BOOLEAN__STRING_POINTER_POINTER, 0 },
138};
139
140const DBusGObjectInfo dbus_glib_viewerapp_object_info = {
141 0,
142 dbus_glib_viewerapp_methods,
143 1,
144"com.secondlife.ViewerAppAPI\0GoSLURL\0S\0slurl\0I\0s\0success_ret\0O\0F\0N\0b\0\0\0",
145"\0",
146"\0"
147};
148
diff --git a/linden/indra/newview/llappviewerlinux_api.xml b/linden/indra/newview/llappviewerlinux_api.xml
new file mode 100644
index 0000000..fac35b7
--- /dev/null
+++ b/linden/indra/newview/llappviewerlinux_api.xml
@@ -0,0 +1,14 @@
1<?xml version="1.0" encoding="UTF-8" ?>
2
3<!-- dbus-binding-tool -mode=glib-server llappviewerlinux_api.xml -prefix=viewerapp -output=llappviewerlinux_api.h -->
4
5<node name="/com/secondlife/ViewerAppAPI">
6 <interface name="com.secondlife.ViewerAppAPI">
7 <annotation name="org.freedesktop.DBus.GLib.CSymbol" value="viewer_app_api"/>
8 <method name="GoSLURL">
9 <annotation name="org.freedesktop.DBus.GLib.CSymbol" value="viewer_app_api_GoSLURL"/>
10 <arg type="s" name="slurl" direction="in" />
11 <arg type="b" name="success_ret" direction="out" />
12 </method>
13 </interface>
14</node>
diff --git a/linden/indra/newview/llappviewerlinux_api_dbus.cpp b/linden/indra/newview/llappviewerlinux_api_dbus.cpp
new file mode 100644
index 0000000..806714f
--- /dev/null
+++ b/linden/indra/newview/llappviewerlinux_api_dbus.cpp
@@ -0,0 +1,131 @@
1/**
2 * @file llappviewerlinux_api_dbus.cpp
3 * @brief dynamic DBus symbol-grabbing code
4 *
5 * $LicenseInfo:firstyear=2008&license=viewergpl$
6 *
7 * Copyright (c) 2008, Linden Research, Inc.
8 *
9 * Second Life Viewer Source Code
10 * The source code in this file ("Source Code") is provided by Linden Lab
11 * to you under the terms of the GNU General Public License, version 2.0
12 * ("GPL"), unless you have obtained a separate licensing agreement
13 * ("Other License"), formally executed by you and Linden Lab. Terms of
14 * the GPL can be found in doc/GPL-license.txt in this distribution, or
15 * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
16 *
17 * There are special exceptions to the terms and conditions of the GPL as
18 * it is applied to this Source Code. View the full text of the exception
19 * in the file doc/FLOSS-exception.txt in this software distribution, or
20 * online at 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 * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
27 * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
28 * COMPLETENESS OR PERFORMANCE.
29 * $/LicenseInfo$
30 */
31
32#if LL_DBUS_ENABLED
33
34#include "linden_common.h"
35
36extern "C" {
37#include <dbus/dbus-glib.h>
38
39#include "apr_pools.h"
40#include "apr_dso.h"
41}
42
43#define DEBUGMSG(...) lldebugs << llformat(__VA_ARGS__) << llendl
44#define INFOMSG(...) llinfos << llformat(__VA_ARGS__) << llendl
45#define WARNMSG(...) llwarns << llformat(__VA_ARGS__) << llendl
46
47#define LL_DBUS_SYM(REQUIRED, DBUSSYM, RTN, ...) RTN (*ll##DBUSSYM)(__VA_ARGS__) = NULL
48#include "llappviewerlinux_api_dbus_syms_raw.inc"
49#undef LL_DBUS_SYM
50
51static bool sSymsGrabbed = false;
52static apr_pool_t *sSymDBUSDSOMemoryPool = NULL;
53static apr_dso_handle_t *sSymDBUSDSOHandleG = NULL;
54
55bool grab_dbus_syms(std::string dbus_dso_name)
56{
57 if (sSymsGrabbed)
58 {
59 // already have grabbed good syms
60 return TRUE;
61 }
62
63 bool sym_error = false;
64 bool rtn = false;
65 apr_status_t rv;
66 apr_dso_handle_t *sSymDBUSDSOHandle = NULL;
67
68#define LL_DBUS_SYM(REQUIRED, DBUSSYM, RTN, ...) do{rv = apr_dso_sym((apr_dso_handle_sym_t*)&ll##DBUSSYM, sSymDBUSDSOHandle, #DBUSSYM); if (rv != APR_SUCCESS) {INFOMSG("Failed to grab symbol: %s", #DBUSSYM); if (REQUIRED) sym_error = true;} else DEBUGMSG("grabbed symbol: %s from %p", #DBUSSYM, (void*)ll##DBUSSYM);}while(0)
69
70 //attempt to load the shared library
71 apr_pool_create(&sSymDBUSDSOMemoryPool, NULL);
72
73 if ( APR_SUCCESS == (rv = apr_dso_load(&sSymDBUSDSOHandle,
74 dbus_dso_name.c_str(),
75 sSymDBUSDSOMemoryPool) ))
76 {
77 INFOMSG("Found DSO: %s", dbus_dso_name.c_str());
78
79#include "llappviewerlinux_api_dbus_syms_raw.inc"
80
81 if ( sSymDBUSDSOHandle )
82 {
83 sSymDBUSDSOHandleG = sSymDBUSDSOHandle;
84 sSymDBUSDSOHandle = NULL;
85 }
86
87 rtn = !sym_error;
88 }
89 else
90 {
91 INFOMSG("Couldn't load DSO: %s", dbus_dso_name.c_str());
92 rtn = false; // failure
93 }
94
95 if (sym_error)
96 {
97 WARNMSG("Failed to find necessary symbols in DBUS-GLIB libraries.");
98 }
99#undef LL_DBUS_SYM
100
101 sSymsGrabbed = rtn;
102 return rtn;
103}
104
105
106void ungrab_dbus_syms()
107{
108 // should be safe to call regardless of whether we've
109 // actually grabbed syms.
110
111 if ( sSymDBUSDSOHandleG )
112 {
113 apr_dso_unload(sSymDBUSDSOHandleG);
114 sSymDBUSDSOHandleG = NULL;
115 }
116
117 if ( sSymDBUSDSOMemoryPool )
118 {
119 apr_pool_destroy(sSymDBUSDSOMemoryPool);
120 sSymDBUSDSOMemoryPool = NULL;
121 }
122
123 // NULL-out all of the symbols we'd grabbed
124#define LL_DBUS_SYM(REQUIRED, DBUSSYM, RTN, ...) do{ll##DBUSSYM = NULL;}while(0)
125#include "llappviewerlinux_api_dbus_syms_raw.inc"
126#undef LL_DBUS_SYM
127
128 sSymsGrabbed = false;
129}
130
131#endif // LL_DBUS_ENABLED
diff --git a/linden/indra/newview/llappviewerlinux_api_dbus.h b/linden/indra/newview/llappviewerlinux_api_dbus.h
new file mode 100644
index 0000000..6d6c1b0
--- /dev/null
+++ b/linden/indra/newview/llappviewerlinux_api_dbus.h
@@ -0,0 +1,49 @@
1/**
2 * @file llappviewerlinux_api_dbus.h
3 * @brief DBus-glib symbol handling
4 *
5 * $LicenseInfo:firstyear=2008&license=viewergpl$
6 *
7 * Copyright (c) 2008, Linden Research, Inc.
8 *
9 * Second Life Viewer Source Code
10 * The source code in this file ("Source Code") is provided by Linden Lab
11 * to you under the terms of the GNU General Public License, version 2.0
12 * ("GPL"), unless you have obtained a separate licensing agreement
13 * ("Other License"), formally executed by you and Linden Lab. Terms of
14 * the GPL can be found in doc/GPL-license.txt in this distribution, or
15 * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
16 *
17 * There are special exceptions to the terms and conditions of the GPL as
18 * it is applied to this Source Code. View the full text of the exception
19 * in the file doc/FLOSS-exception.txt in this software distribution, or
20 * online at 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 * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
27 * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
28 * COMPLETENESS OR PERFORMANCE.
29 * $/LicenseInfo$
30 */
31
32#include "linden_common.h"
33
34#if LL_DBUS_ENABLED
35
36extern "C" {
37#include <dbus/dbus-glib.h>
38}
39
40#define DBUSGLIB_DYLIB_DEFAULT_NAME "libdbus-glib-1.so.2"
41
42bool grab_dbus_syms(std::string dbus_dso_name);
43void ungrab_dbus_syms();
44
45#define LL_DBUS_SYM(REQUIRED, DBUSSYM, RTN, ...) extern RTN (*ll##DBUSSYM)(__VA_ARGS__)
46#include "llappviewerlinux_api_dbus_syms_raw.inc"
47#undef LL_DBUS_SYM
48
49#endif // LL_DBUS_ENABLED
diff --git a/linden/indra/newview/llappviewerlinux_api_dbus_syms_raw.inc b/linden/indra/newview/llappviewerlinux_api_dbus_syms_raw.inc
new file mode 100644
index 0000000..c0548e2
--- /dev/null
+++ b/linden/indra/newview/llappviewerlinux_api_dbus_syms_raw.inc
@@ -0,0 +1,9 @@
1
2// required symbols to grab
3LL_DBUS_SYM(true, dbus_g_bus_get, DBusGConnection*, DBusBusType, GError**);
4LL_DBUS_SYM(true, dbus_g_proxy_new_for_name, DBusGProxy*, DBusGConnection*, const char *, const char*, const char*);
5LL_DBUS_SYM(true, dbus_g_proxy_call, gboolean, DBusGProxy*, const char*, GError**, GType, ...);
6LL_DBUS_SYM(true, dbus_g_object_type_install_info, void, GType, const DBusGObjectInfo*);
7LL_DBUS_SYM(true, dbus_g_connection_register_g_object, void, DBusGConnection*, const char*, GObject*);
8
9// optional symbols to grab
diff --git a/linden/indra/newview/llappviewermacosx.cpp b/linden/indra/newview/llappviewermacosx.cpp
index 68c3a16..e3fd425 100644
--- a/linden/indra/newview/llappviewermacosx.cpp
+++ b/linden/indra/newview/llappviewermacosx.cpp
@@ -48,6 +48,7 @@
48#include "llurldispatcher.h" 48#include "llurldispatcher.h"
49#include <Carbon/Carbon.h> 49#include <Carbon/Carbon.h>
50#include "lldir.h" 50#include "lldir.h"
51#include <signal.h>
51namespace 52namespace
52{ 53{
53 // The command line args stored. 54 // The command line args stored.
@@ -193,22 +194,106 @@ bool LLAppViewerMacOSX::initParseCommandLine(LLCommandLineParser& clp)
193 return true; 194 return true;
194} 195}
195 196
197// *FIX:Mani It would be nice to provide a clean interface to get the
198// default_unix_signal_handler for the LLApp class.
199extern void default_unix_signal_handler(int, siginfo_t *, void *);
200bool LLAppViewerMacOSX::restoreErrorTrap()
201{
202 // This method intends to reinstate signal handlers.
203 // *NOTE:Mani It was found that the first execution of a shader was overriding
204 // our initial signal handlers somehow.
205 // This method will be called (at least) once per mainloop execution.
206 // *NOTE:Mani The signals used below are copied over from the
207 // setup_signals() func in LLApp.cpp
208 // LLApp could use some way of overriding that func, but for this viewer
209 // fix I opt to avoid affecting the server code.
210
211 // Set up signal handlers that may result in program termination
212 //
213 struct sigaction act;
214 struct sigaction old_act;
215 act.sa_sigaction = default_unix_signal_handler;
216 sigemptyset( &act.sa_mask );
217 act.sa_flags = SA_SIGINFO;
218
219 unsigned int reset_count = 0;
220
221#define SET_SIG(S) sigaction(SIGABRT, &act, &old_act); \
222 if((unsigned int)act.sa_sigaction != (unsigned int) old_act.sa_sigaction) \
223 ++reset_count;
224 // Synchronous signals
225 SET_SIG(SIGABRT)
226 SET_SIG(SIGALRM)
227 SET_SIG(SIGBUS)
228 SET_SIG(SIGFPE)
229 SET_SIG(SIGHUP)
230 SET_SIG(SIGILL)
231 SET_SIG(SIGPIPE)
232 SET_SIG(SIGSEGV)
233 SET_SIG(SIGSYS)
234
235 SET_SIG(LL_HEARTBEAT_SIGNAL)
236 SET_SIG(LL_SMACKDOWN_SIGNAL)
237
238 // Asynchronous signals that are normally ignored
239 SET_SIG(SIGCHLD)
240 SET_SIG(SIGUSR2)
241
242 // Asynchronous signals that result in attempted graceful exit
243 SET_SIG(SIGHUP)
244 SET_SIG(SIGTERM)
245 SET_SIG(SIGINT)
246
247 // Asynchronous signals that result in core
248 SET_SIG(SIGQUIT)
249#undef SET_SIG
250
251 return reset_count == 0;
252}
253
196void LLAppViewerMacOSX::handleSyncCrashTrace() 254void LLAppViewerMacOSX::handleSyncCrashTrace()
197{ 255{
198 // do nothing 256 // do nothing
199} 257}
200 258
201void LLAppViewerMacOSX::handleCrashReporting() 259void LLAppViewerMacOSX::handleCrashReporting(bool reportFreeze)
202{ 260{
203 // Macintosh
204 std::string command_str; 261 std::string command_str;
205 command_str += "open mac-crash-logger.app"; 262 //command_str = "open Second Life.app/Contents/Resources/mac-crash-logger.app";
263 command_str = "mac-crash-logger.app/Contents/MacOS/mac-crash-logger";
206 264
207 clear_signals(); 265 FSRef appRef;
208 llinfos << "Launching crash reporter using: '" << command_str << "'" << llendl; 266 Boolean isDir = 0;
209 system(command_str.c_str()); /* Flawfinder: ignore */ 267 OSStatus os_result = FSPathMakeRef((UInt8*)command_str.c_str(),
210 llinfos << "returned from crash reporter... dying" << llendl; 268 &appRef,
211 _exit(1); 269 &isDir);
270 if(os_result >= 0)
271 {
272 LSApplicationParameters appParams;
273 memset(&appParams, 0, sizeof(appParams));
274 appParams.version = 0;
275 appParams.flags = kLSLaunchNoParams | kLSLaunchStartClassic;
276 appParams.application = &appRef;
277
278 if(reportFreeze)
279 {
280 // Make sure freeze reporting launches the crash logger synchronously, lest
281 // Log files get changed by SL while the logger is running.
282 }
283 else
284 {
285 appParams.flags |= kLSLaunchAsync;
286 clear_signals();
287 }
288
289 ProcessSerialNumber o_psn;
290 os_result = LSOpenApplication(&appParams, &o_psn);
291 }
292
293 if(!reportFreeze)
294 {
295 _exit(1);
296 }
212} 297}
213 298
214std::string LLAppViewerMacOSX::generateSerialNumber() 299std::string LLAppViewerMacOSX::generateSerialNumber()
diff --git a/linden/indra/newview/llappviewermacosx.h b/linden/indra/newview/llappviewermacosx.h
index 0d8c460..85193a8 100644
--- a/linden/indra/newview/llappviewermacosx.h
+++ b/linden/indra/newview/llappviewermacosx.h
@@ -49,7 +49,8 @@ public:
49 49
50 50
51protected: 51protected:
52 virtual void handleCrashReporting(); 52 virtual bool restoreErrorTrap();
53 virtual void handleCrashReporting(bool reportFreeze);
53 virtual void handleSyncCrashTrace(); 54 virtual void handleSyncCrashTrace();
54 55
55 std::string generateSerialNumber(); 56 std::string generateSerialNumber();
diff --git a/linden/indra/newview/llappviewerwin32.cpp b/linden/indra/newview/llappviewerwin32.cpp
index 9f37534..bf02087 100644
--- a/linden/indra/newview/llappviewerwin32.cpp
+++ b/linden/indra/newview/llappviewerwin32.cpp
@@ -64,7 +64,7 @@
64 64
65#include "llcommandlineparser.h" 65#include "llcommandlineparser.h"
66 66
67//*FIX:Mani - This hack is to fix a linker issue with libndofdev.lib 67// *FIX:Mani - This hack is to fix a linker issue with libndofdev.lib
68// The lib was compiled under VS2005 - in VS2003 we need to remap assert 68// The lib was compiled under VS2005 - in VS2003 we need to remap assert
69#ifdef LL_DEBUG 69#ifdef LL_DEBUG
70#ifdef LL_MSVC7 70#ifdef LL_MSVC7
@@ -77,6 +77,8 @@ extern "C" {
77#endif 77#endif
78#endif 78#endif
79 79
80const std::string LLAppViewerWin32::sWindowClass = "Second Life";
81
80LONG WINAPI viewer_windows_exception_handler(struct _EXCEPTION_POINTERS *exception_infop) 82LONG WINAPI viewer_windows_exception_handler(struct _EXCEPTION_POINTERS *exception_infop)
81{ 83{
82 // *NOTE:Mani - this code is stolen from LLApp, where its never actually used. 84 // *NOTE:Mani - this code is stolen from LLApp, where its never actually used.
@@ -91,6 +93,7 @@ LONG WINAPI viewer_windows_exception_handler(struct _EXCEPTION_POINTERS *excepti
91 if (LLApp::isError()) 93 if (LLApp::isError())
92 { 94 {
93 llwarns << "Got another fatal signal while in the error handler, die now!" << llendl; 95 llwarns << "Got another fatal signal while in the error handler, die now!" << llendl;
96
94 retval = EXCEPTION_EXECUTE_HANDLER; 97 retval = EXCEPTION_EXECUTE_HANDLER;
95 return retval; 98 return retval;
96 } 99 }
@@ -119,7 +122,6 @@ LONG WINAPI viewer_windows_exception_handler(struct _EXCEPTION_POINTERS *excepti
119 return retval; 122 return retval;
120} 123}
121 124
122
123#if DEBUGGING_SEH_FILTER 125#if DEBUGGING_SEH_FILTER
124# define WINMAIN DebuggingWinMain 126# define WINMAIN DebuggingWinMain
125#else 127#else
@@ -195,6 +197,19 @@ int APIENTRY WINMAIN(HINSTANCE hInstance,
195 } 197 }
196 delete viewer_app_ptr; 198 delete viewer_app_ptr;
197 viewer_app_ptr = NULL; 199 viewer_app_ptr = NULL;
200
201 //start updater
202 if(LLAppViewer::sUpdaterInfo)
203 {
204#if LL_WINDOWS
205 _spawnl(_P_NOWAIT, LLAppViewer::sUpdaterInfo->mUpdateExePath.c_str(), LLAppViewer::sUpdaterInfo->mUpdateExePath.c_str(), LLAppViewer::sUpdaterInfo->mParams.str().c_str(), NULL);
206#elif LL_DARWIN
207 system(LLAppViewer::sUpdaterInfo->mUpdateExePath.c_str()); /* Flawfinder: ignore */
208#endif
209 delete LLAppViewer::sUpdaterInfo ;
210 LLAppViewer::sUpdaterInfo = NULL ;
211 }
212
198 return 0; 213 return 0;
199} 214}
200 215
@@ -324,6 +339,17 @@ bool LLAppViewerWin32::cleanup()
324 return result; 339 return result;
325} 340}
326 341
342bool LLAppViewerWin32::initLogging()
343{
344 // Remove the crash stack log from previous executions.
345 // Since we've started logging a new instance of the app, we can assume
346 // *NOTE: This should happen before the we send a 'previous instance froze'
347 // crash report, but it must happen after we initialize the DirUtil.
348 LLWinDebug::clearCrashStacks();
349
350 return LLAppViewer::initLogging();
351}
352
327void LLAppViewerWin32::initConsole() 353void LLAppViewerWin32::initConsole()
328{ 354{
329 // pop up debug console 355 // pop up debug console
@@ -405,7 +431,7 @@ bool LLAppViewerWin32::initHardwareTest()
405 LLSplashScreen::update(splash_msg.str()); 431 LLSplashScreen::update(splash_msg.str());
406 } 432 }
407 433
408 if (!LLWinDebug::checkExceptionHandler()) 434 if (!restoreErrorTrap())
409 { 435 {
410 LL_WARNS("AppInit") << " Someone took over my exception handler (post hardware probe)!" << LL_ENDL; 436 LL_WARNS("AppInit") << " Someone took over my exception handler (post hardware probe)!" << LL_ENDL;
411 } 437 }
@@ -445,39 +471,69 @@ bool LLAppViewerWin32::initParseCommandLine(LLCommandLineParser& clp)
445 return true; 471 return true;
446} 472}
447 473
474bool LLAppViewerWin32::restoreErrorTrap()
475{
476 return LLWinDebug::checkExceptionHandler();
477}
478
448void LLAppViewerWin32::handleSyncCrashTrace() 479void LLAppViewerWin32::handleSyncCrashTrace()
449{ 480{
450 // do nothing 481 // do nothing
451} 482}
452 483
453void LLAppViewerWin32::handleCrashReporting() 484void LLAppViewerWin32::handleCrashReporting(bool reportFreeze)
454{ 485{
455 // Windows only behaivor. Spawn win crash reporter. 486 const char* logger_name = "win_crash_logger.exe";
456 std::string exe_path = gDirUtilp->getAppRODataDir(); 487 std::string exe_path = gDirUtilp->getExecutableDir();
457 exe_path += gDirUtilp->getDirDelimiter(); 488 exe_path += gDirUtilp->getDirDelimiter();
458 exe_path += "win_crash_logger.exe"; 489 exe_path += logger_name;
459 490
460 std::string arg_string = "-user "; 491 const char* arg_str = logger_name;
461 arg_string += LLViewerLogin::getInstance()->getGridLabel(); 492
462 493 // *NOTE:Mani - win_crash_logger.exe no longer parses command line options.
463 S32 cb = gCrashSettings.getS32(CRASH_BEHAVIOR_SETTING); 494 if(reportFreeze)
464 switch(cb) 495 {
496 // Spawn crash logger.
497 // NEEDS to wait until completion, otherwise log files will get smashed.
498 _spawnl(_P_WAIT, exe_path.c_str(), arg_str, NULL);
499 }
500 else
501 {
502 S32 cb = gCrashSettings.getS32(CRASH_BEHAVIOR_SETTING);
503 if(cb != CRASH_BEHAVIOR_NEVER_SEND)
504 {
505 _spawnl(_P_NOWAIT, exe_path.c_str(), arg_str, NULL);
506 }
507 }
508}
509
510//virtual
511bool LLAppViewerWin32::sendURLToOtherInstance(const std::string& url)
512{
513 wchar_t window_class[256]; /* Flawfinder: ignore */ // Assume max length < 255 chars.
514 mbstowcs(window_class, sWindowClass.c_str(), 255);
515 window_class[255] = 0;
516 // Use the class instead of the window name.
517 HWND other_window = FindWindow(window_class, NULL);
518
519 if (other_window != NULL)
465 { 520 {
466 case CRASH_BEHAVIOR_ASK: 521 lldebugs << "Found other window with the name '" << getWindowTitle() << "'" << llendl;
467 default: 522 COPYDATASTRUCT cds;
468 arg_string += " -dialog "; 523 const S32 SLURL_MESSAGE_TYPE = 0;
469 _spawnl(_P_NOWAIT, exe_path.c_str(), exe_path.c_str(), arg_string.c_str(), NULL); 524 cds.dwData = SLURL_MESSAGE_TYPE;
470 break; 525 cds.cbData = url.length() + 1;
471 526 cds.lpData = (void*)url.c_str();
472 case CRASH_BEHAVIOR_ALWAYS_SEND: 527
473 _spawnl(_P_NOWAIT, exe_path.c_str(), exe_path.c_str(), arg_string.c_str(), NULL); 528 LRESULT msg_result = SendMessage(other_window, WM_COPYDATA, NULL, (LPARAM)&cds);
474 break; 529 lldebugs << "SendMessage(WM_COPYDATA) to other window '"
475 530 << getWindowTitle() << "' returned " << msg_result << llendl;
476 case CRASH_BEHAVIOR_NEVER_SEND: 531 return true;
477 break;
478 } 532 }
533 return false;
479} 534}
480 535
536
481std::string LLAppViewerWin32::generateSerialNumber() 537std::string LLAppViewerWin32::generateSerialNumber()
482{ 538{
483 char serial_md5[MD5HEX_STR_SIZE]; // Flawfinder: ignore 539 char serial_md5[MD5HEX_STR_SIZE]; // Flawfinder: ignore
diff --git a/linden/indra/newview/llappviewerwin32.h b/linden/indra/newview/llappviewerwin32.h
index fe16ec4..6a5b0b1 100644
--- a/linden/indra/newview/llappviewerwin32.h
+++ b/linden/indra/newview/llappviewerwin32.h
@@ -49,15 +49,21 @@ public:
49 virtual bool cleanup(); 49 virtual bool cleanup();
50 50
51protected: 51protected:
52 virtual bool initLogging(); // Override to clean stack_trace info.
52 virtual void initConsole(); // Initialize OS level debugging console. 53 virtual void initConsole(); // Initialize OS level debugging console.
53 virtual bool initHardwareTest(); // Win32 uses DX9 to test hardware. 54 virtual bool initHardwareTest(); // Win32 uses DX9 to test hardware.
54 virtual bool initParseCommandLine(LLCommandLineParser& clp); 55 virtual bool initParseCommandLine(LLCommandLineParser& clp);
55 56
56 virtual void handleCrashReporting(); 57 virtual bool restoreErrorTrap();
58 virtual void handleCrashReporting(bool reportFreeze);
57 virtual void handleSyncCrashTrace(); 59 virtual void handleSyncCrashTrace();
58 60
61 virtual bool sendURLToOtherInstance(const std::string& url);
62
59 std::string generateSerialNumber(); 63 std::string generateSerialNumber();
60 64
65 static const std::string sWindowClass;
66
61private: 67private:
62 void disableWinErrorReporting(); 68 void disableWinErrorReporting();
63 69
diff --git a/linden/indra/newview/llaudiosourcevo.cpp b/linden/indra/newview/llaudiosourcevo.cpp
index e668078..50cd8cd 100644
--- a/linden/indra/newview/llaudiosourcevo.cpp
+++ b/linden/indra/newview/llaudiosourcevo.cpp
@@ -39,7 +39,7 @@
39#include "llviewerparcelmgr.h" 39#include "llviewerparcelmgr.h"
40 40
41LLAudioSourceVO::LLAudioSourceVO(const LLUUID &sound_id, const LLUUID& owner_id, const F32 gain, LLViewerObject *objectp) 41LLAudioSourceVO::LLAudioSourceVO(const LLUUID &sound_id, const LLUUID& owner_id, const F32 gain, LLViewerObject *objectp)
42: LLAudioSource(sound_id, owner_id, gain), 42 : LLAudioSource(sound_id, owner_id, gain, LLAudioEngine::AUDIO_TYPE_SFX),
43 mObjectp(objectp), 43 mObjectp(objectp),
44 mActualGain(gain) 44 mActualGain(gain)
45{ 45{
diff --git a/linden/indra/newview/llbox.cpp b/linden/indra/newview/llbox.cpp
index 1e6d282..1bcec7a 100644
--- a/linden/indra/newview/llbox.cpp
+++ b/linden/indra/newview/llbox.cpp
@@ -81,7 +81,7 @@ void LLBox::renderface(S32 which_face)
81 {7, 4, 0, 3} 81 {7, 4, 0, 3}
82 }; 82 };
83 83
84 gGL.begin(LLVertexBuffer::QUADS); 84 gGL.begin(LLRender::QUADS);
85 //gGL.normal3fv(&normals[which_face][0]); 85 //gGL.normal3fv(&normals[which_face][0]);
86 gGL.texCoord2f(1,0); 86 gGL.texCoord2f(1,0);
87 gGL.vertex3fv(&mVertex[ faces[which_face][0] ][0]); 87 gGL.vertex3fv(&mVertex[ faces[which_face][0] ][0]);
diff --git a/linden/indra/newview/llchatbar.cpp b/linden/indra/newview/llchatbar.cpp
index 31fa653..2d9d356 100644
--- a/linden/indra/newview/llchatbar.cpp
+++ b/linden/indra/newview/llchatbar.cpp
@@ -553,15 +553,17 @@ void LLChatBar::onInputEditorGainFocus( LLFocusableElement* caller, void* userda
553// static 553// static
554void LLChatBar::onClickSay( LLUICtrl* ctrl, void* userdata ) 554void LLChatBar::onClickSay( LLUICtrl* ctrl, void* userdata )
555{ 555{
556 LLChatBar* self = (LLChatBar*) userdata; 556 e_chat_type chat_type = CHAT_TYPE_NORMAL;
557 if (ctrl->getValue().asString() == "shout") 557 if (ctrl->getValue().asString() == "shout")
558 { 558 {
559 self->sendChat( CHAT_TYPE_SHOUT ); 559 chat_type = CHAT_TYPE_SHOUT;
560 } 560 }
561 else 561 else if (ctrl->getValue().asString() == "whisper")
562 { 562 {
563 self->sendChat( CHAT_TYPE_NORMAL ); 563 chat_type = CHAT_TYPE_WHISPER;
564 } 564 }
565 LLChatBar* self = (LLChatBar*) userdata;
566 self->sendChat(chat_type);
565} 567}
566 568
567void LLChatBar::sendChatFromViewer(const std::string &utf8text, EChatType type, BOOL animate) 569void LLChatBar::sendChatFromViewer(const std::string &utf8text, EChatType type, BOOL animate)
diff --git a/linden/indra/newview/llcommandlineparser.cpp b/linden/indra/newview/llcommandlineparser.cpp
index dc6a1e2..5dafe78 100644
--- a/linden/indra/newview/llcommandlineparser.cpp
+++ b/linden/indra/newview/llcommandlineparser.cpp
@@ -416,11 +416,6 @@ void setControlValueCB(const LLCommandLineParser::token_vector_t& value,
416 const std::string& opt_name, 416 const std::string& opt_name,
417 LLControlGroup* ctrlGroup) 417 LLControlGroup* ctrlGroup)
418{ 418{
419 if(value.size() > 1)
420 {
421 llwarns << "Ignoring extra tokens mapped to the setting: " << opt_name << "." << llendl;
422 }
423
424 // *FIX: Do sematic conversion here. 419 // *FIX: Do sematic conversion here.
425 // LLSD (ImplString) Is no good for doing string to type conversion for... 420 // LLSD (ImplString) Is no good for doing string to type conversion for...
426 // booleans 421 // booleans
@@ -457,7 +452,7 @@ void setControlValueCB(const LLCommandLineParser::token_vector_t& value,
457 default: 452 default:
458 { 453 {
459 // For the default types, let llsd do the conversion. 454 // For the default types, let llsd do the conversion.
460 if(value.size() > 1) 455 if(value.size() > 1 && ctrl->isType(TYPE_LLSD))
461 { 456 {
462 // Assume its an array... 457 // Assume its an array...
463 LLSD llsdArray; 458 LLSD llsdArray;
@@ -472,6 +467,11 @@ void setControlValueCB(const LLCommandLineParser::token_vector_t& value,
472 } 467 }
473 else if(value.size() > 0) 468 else if(value.size() > 0)
474 { 469 {
470 if(value.size() > 1)
471 {
472 llwarns << "Ignoring extra tokens mapped to the setting: " << opt_name << "." << llendl;
473 }
474
475 LLSD llsdValue; 475 LLSD llsdValue;
476 llsdValue.assign(LLSD::String(value[0])); 476 llsdValue.assign(LLSD::String(value[0]));
477 ctrl->setValue(llsdValue, false); 477 ctrl->setValue(llsdValue, false);
diff --git a/linden/indra/newview/llcompilequeue.cpp b/linden/indra/newview/llcompilequeue.cpp
index fc2742f..00ca833 100644
--- a/linden/indra/newview/llcompilequeue.cpp
+++ b/linden/indra/newview/llcompilequeue.cpp
@@ -60,6 +60,8 @@
60#include "llviewerstats.h" 60#include "llviewerstats.h"
61#include "lluictrlfactory.h" 61#include "lluictrlfactory.h"
62 62
63#include "llselectmgr.h"
64
63///---------------------------------------------------------------------------- 65///----------------------------------------------------------------------------
64/// Local function declarations, constants, enums, and typedefs 66/// Local function declarations, constants, enums, and typedefs
65///---------------------------------------------------------------------------- 67///----------------------------------------------------------------------------
@@ -194,7 +196,20 @@ BOOL LLFloaterScriptQueue::start()
194{ 196{
195 //llinfos << "LLFloaterCompileQueue::start()" << llendl; 197 //llinfos << "LLFloaterCompileQueue::start()" << llendl;
196 std::string buffer; 198 std::string buffer;
197 buffer = llformat("Starting %s of %d items.", mStartString.c_str(), mObjectIDs.count()); // *TODO: Translate 199
200 LLSelectMgr *mgr = LLSelectMgr::getInstance();
201 LLObjectSelectionHandle selectHandle = mgr->getSelection();
202 U32 n_objects = 0;
203 if (gSavedSettings.getBOOL("EditLinkedParts"))
204 {
205 n_objects = selectHandle->getObjectCount();
206 }
207 else
208 {
209 n_objects = selectHandle->getRootObjectCount();
210 }
211
212 buffer = llformat("Starting %s of %d items.", mStartString.c_str(), n_objects); // *TODO: Translate
198 213
199 LLScrollListCtrl* list = getChild<LLScrollListCtrl>("queue output"); 214 LLScrollListCtrl* list = getChild<LLScrollListCtrl>("queue output");
200 list->addCommentText(buffer); 215 list->addCommentText(buffer);
diff --git a/linden/indra/newview/llcontainerview.cpp b/linden/indra/newview/llcontainerview.cpp
index dbec409..4a09265 100644
--- a/linden/indra/newview/llcontainerview.cpp
+++ b/linden/indra/newview/llcontainerview.cpp
@@ -88,7 +88,7 @@ BOOL LLContainerView::handleMouseUp(S32 x, S32 y, MASK mask)
88void LLContainerView::draw() 88void LLContainerView::draw()
89{ 89{
90 { 90 {
91 LLGLSNoTexture gls_no_texture; 91 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
92 92
93 gl_rect_2d(0, getRect().getHeight(), getRect().getWidth(), 0, LLColor4(0.f, 0.f, 0.f, 0.25f)); 93 gl_rect_2d(0, getRect().getHeight(), getRect().getWidth(), 0, LLColor4(0.f, 0.f, 0.f, 0.25f));
94 } 94 }
diff --git a/linden/indra/newview/lldrawable.cpp b/linden/indra/newview/lldrawable.cpp
index 0f89585..ac90fdf 100644
--- a/linden/indra/newview/lldrawable.cpp
+++ b/linden/indra/newview/lldrawable.cpp
@@ -362,6 +362,7 @@ void LLDrawable::makeActive()
362 if (pcode == LLViewerObject::LL_VO_WATER || 362 if (pcode == LLViewerObject::LL_VO_WATER ||
363 pcode == LLViewerObject::LL_VO_SURFACE_PATCH || 363 pcode == LLViewerObject::LL_VO_SURFACE_PATCH ||
364 pcode == LLViewerObject::LL_VO_PART_GROUP || 364 pcode == LLViewerObject::LL_VO_PART_GROUP ||
365 pcode == LLViewerObject::LL_VO_HUD_PART_GROUP ||
365 pcode == LLViewerObject::LL_VO_CLOUDS || 366 pcode == LLViewerObject::LL_VO_CLOUDS ||
366 pcode == LLViewerObject::LL_VO_GROUND || 367 pcode == LLViewerObject::LL_VO_GROUND ||
367 pcode == LLViewerObject::LL_VO_SKY) 368 pcode == LLViewerObject::LL_VO_SKY)
@@ -951,6 +952,9 @@ BOOL LLDrawable::isVisible() const
951 return TRUE; 952 return TRUE;
952 } 953 }
953 954
955#if 0
956 //disabling this code fixes DEV-20105. Leaving in place in case some other bug pops up as a a result.
957 //should be safe to just always ask the spatial group for visibility.
954 if (isActive()) 958 if (isActive())
955 { 959 {
956 if (isRoot()) 960 if (isRoot())
@@ -973,6 +977,7 @@ BOOL LLDrawable::isVisible() const
973 } 977 }
974 } 978 }
975 else 979 else
980#endif
976 { 981 {
977 LLSpatialGroup* group = getSpatialGroup(); 982 LLSpatialGroup* group = getSpatialGroup();
978 if (group && group->isVisible()) 983 if (group && group->isVisible())
@@ -1380,7 +1385,10 @@ BOOL LLDrawable::isAnimating() const
1380 { 1385 {
1381 return TRUE; 1386 return TRUE;
1382 } 1387 }
1383 1388 if (mVObjp->getPCode() == LLViewerObject::LL_VO_HUD_PART_GROUP)
1389 {
1390 return TRUE;
1391 }
1384 if (mVObjp->getPCode() == LLViewerObject::LL_VO_CLOUDS) 1392 if (mVObjp->getPCode() == LLViewerObject::LL_VO_CLOUDS)
1385 { 1393 {
1386 return TRUE; 1394 return TRUE;
diff --git a/linden/indra/newview/lldrawpool.cpp b/linden/indra/newview/lldrawpool.cpp
index 9d8bd0a..196f8c1 100644
--- a/linden/indra/newview/lldrawpool.cpp
+++ b/linden/indra/newview/lldrawpool.cpp
@@ -194,7 +194,8 @@ S32 LLFacePool::drawLoopSetTex(face_array_t& face_list, S32 stage)
194 iter != face_list.end(); iter++) 194 iter != face_list.end(); iter++)
195 { 195 {
196 LLFace *facep = *iter; 196 LLFace *facep = *iter;
197 facep->bindTexture(stage); 197 gGL.getTexUnit(stage)->bind(facep->getTexture());
198 gGL.getTexUnit(0)->activate();
198 res += facep->renderIndexed(); 199 res += facep->renderIndexed();
199 } 200 }
200 } 201 }
@@ -395,7 +396,7 @@ void LLRenderPass::pushBatch(LLDrawInfo& params, U32 mask, BOOL texture)
395 { 396 {
396 if (params.mTexture.notNull()) 397 if (params.mTexture.notNull())
397 { 398 {
398 params.mTexture->bind(); 399 gGL.getTexUnit(0)->bind(params.mTexture.get());
399 if (params.mTextureMatrix) 400 if (params.mTextureMatrix)
400 { 401 {
401 glMatrixMode(GL_TEXTURE); 402 glMatrixMode(GL_TEXTURE);
@@ -406,14 +407,14 @@ void LLRenderPass::pushBatch(LLDrawInfo& params, U32 mask, BOOL texture)
406 } 407 }
407 else 408 else
408 { 409 {
409 LLImageGL::unbindTexture(0); 410 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
410 } 411 }
411 } 412 }
412 413
413 if (params.mVertexBuffer.notNull()) 414 if (params.mVertexBuffer.notNull())
414 { 415 {
415 params.mVertexBuffer->setBuffer(mask); 416 params.mVertexBuffer->setBuffer(mask);
416 params.mVertexBuffer->drawRange(LLVertexBuffer::TRIANGLES, params.mStart, params.mEnd, params.mCount, params.mOffset); 417 params.mVertexBuffer->drawRange(LLRender::TRIANGLES, params.mStart, params.mEnd, params.mCount, params.mOffset);
417 gPipeline.addTrianglesDrawn(params.mCount/3); 418 gPipeline.addTrianglesDrawn(params.mCount/3);
418 } 419 }
419 420
diff --git a/linden/indra/newview/lldrawpoolalpha.cpp b/linden/indra/newview/lldrawpoolalpha.cpp
index 28263b2..d997c30 100644
--- a/linden/indra/newview/lldrawpoolalpha.cpp
+++ b/linden/indra/newview/lldrawpoolalpha.cpp
@@ -129,7 +129,7 @@ void LLDrawPoolAlpha::render(S32 pass)
129 gPipeline.enableLightsFullbright(LLColor4(1,1,1,1)); 129 gPipeline.enableLightsFullbright(LLColor4(1,1,1,1));
130 glColor4f(1,0,0,1); 130 glColor4f(1,0,0,1);
131 LLViewerImage::sSmokeImagep->addTextureStats(1024.f*1024.f); 131 LLViewerImage::sSmokeImagep->addTextureStats(1024.f*1024.f);
132 LLViewerImage::sSmokeImagep->bind(); 132 gGL.getTexUnit(0)->bind(LLViewerImage::sSmokeImagep.get());
133 renderAlphaHighlight(LLVertexBuffer::MAP_VERTEX | 133 renderAlphaHighlight(LLVertexBuffer::MAP_VERTEX |
134 LLVertexBuffer::MAP_TEXCOORD); 134 LLVertexBuffer::MAP_TEXCOORD);
135 } 135 }
@@ -170,7 +170,7 @@ void LLDrawPoolAlpha::renderAlphaHighlight(U32 mask)
170 LLRenderPass::applyModelMatrix(params); 170 LLRenderPass::applyModelMatrix(params);
171 171
172 params.mVertexBuffer->setBuffer(mask); 172 params.mVertexBuffer->setBuffer(mask);
173 params.mVertexBuffer->drawRange(LLVertexBuffer::TRIANGLES, params.mStart, params.mEnd, params.mCount, params.mOffset); 173 params.mVertexBuffer->drawRange(LLRender::TRIANGLES, params.mStart, params.mEnd, params.mCount, params.mOffset);
174 gPipeline.addTrianglesDrawn(params.mCount/3); 174 gPipeline.addTrianglesDrawn(params.mCount/3);
175 } 175 }
176 } 176 }
@@ -231,7 +231,7 @@ void LLDrawPoolAlpha::renderGroupAlpha(LLSpatialGroup* group, U32 type, U32 mask
231 if (texture && params.mTexture.notNull()) 231 if (texture && params.mTexture.notNull())
232 { 232 {
233 gGL.getTexUnit(0)->activate(); 233 gGL.getTexUnit(0)->activate();
234 params.mTexture->bind(); 234 gGL.getTexUnit(0)->bind(params.mTexture.get());
235 params.mTexture->addTextureStats(params.mVSize); 235 params.mTexture->addTextureStats(params.mVSize);
236 if (params.mTextureMatrix) 236 if (params.mTextureMatrix)
237 { 237 {
@@ -288,7 +288,7 @@ void LLDrawPoolAlpha::renderGroupAlpha(LLSpatialGroup* group, U32 type, U32 mask
288 } 288 }
289 289
290 params.mVertexBuffer->setBuffer(mask); 290 params.mVertexBuffer->setBuffer(mask);
291 params.mVertexBuffer->drawRange(LLVertexBuffer::TRIANGLES, params.mStart, params.mEnd, params.mCount, params.mOffset); 291 params.mVertexBuffer->drawRange(LLRender::TRIANGLES, params.mStart, params.mEnd, params.mCount, params.mOffset);
292 gPipeline.addTrianglesDrawn(params.mCount/3); 292 gPipeline.addTrianglesDrawn(params.mCount/3);
293 293
294 if (params.mTextureMatrix && texture && params.mTexture.notNull()) 294 if (params.mTextureMatrix && texture && params.mTexture.notNull())
diff --git a/linden/indra/newview/lldrawpoolavatar.cpp b/linden/indra/newview/lldrawpoolavatar.cpp
index 97ff072..a5231dd 100644
--- a/linden/indra/newview/lldrawpoolavatar.cpp
+++ b/linden/indra/newview/lldrawpoolavatar.cpp
@@ -396,7 +396,7 @@ void LLDrawPoolAvatar::renderAvatars(LLVOAvatar* single_avatar, S32 pass)
396 { 396 {
397 397
398 /* // debug code to draw a cube in place of avatar 398 /* // debug code to draw a cube in place of avatar
399 LLGLSNoTexture gls_no_texture; 399 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
400 LLVector3 pos = avatarp->getPositionAgent(); 400 LLVector3 pos = avatarp->getPositionAgent();
401 401
402 gGL.color4f(1.0f, 0.0f, 0.0f, 0.8f); 402 gGL.color4f(1.0f, 0.0f, 0.0f, 0.8f);
@@ -495,17 +495,17 @@ void LLDrawPoolAvatar::renderAvatars(LLVOAvatar* single_avatar, S32 pass)
495 { 495 {
496 if (LLVOAvatar::sShowCollisionVolumes) 496 if (LLVOAvatar::sShowCollisionVolumes)
497 { 497 {
498 LLGLSNoTexture no_texture; 498 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
499 avatarp->renderCollisionVolumes(); 499 avatarp->renderCollisionVolumes();
500 } 500 }
501 501
502 if (avatarp->mIsSelf && LLAgent::sDebugDisplayTarget) 502 if (avatarp->mIsSelf && LLAgent::sDebugDisplayTarget)
503 { 503 {
504 LLGLSNoTexture gls_no_texture; 504 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
505 LLVector3 pos = avatarp->getPositionAgent(); 505 LLVector3 pos = avatarp->getPositionAgent();
506 506
507 gGL.color4f(1.0f, 0.0f, 0.0f, 0.8f); 507 gGL.color4f(1.0f, 0.0f, 0.0f, 0.8f);
508 gGL.begin(LLVertexBuffer::LINES); 508 gGL.begin(LLRender::LINES);
509 { 509 {
510 gGL.vertex3fv((pos - LLVector3(0.2f, 0.f, 0.f)).mV); 510 gGL.vertex3fv((pos - LLVector3(0.2f, 0.f, 0.f)).mV);
511 gGL.vertex3fv((pos + LLVector3(0.2f, 0.f, 0.f)).mV); 511 gGL.vertex3fv((pos + LLVector3(0.2f, 0.f, 0.f)).mV);
@@ -517,7 +517,7 @@ void LLDrawPoolAvatar::renderAvatars(LLVOAvatar* single_avatar, S32 pass)
517 517
518 pos = avatarp->mDrawable->getPositionAgent(); 518 pos = avatarp->mDrawable->getPositionAgent();
519 gGL.color4f(1.0f, 0.0f, 0.0f, 0.8f); 519 gGL.color4f(1.0f, 0.0f, 0.0f, 0.8f);
520 gGL.begin(LLVertexBuffer::LINES); 520 gGL.begin(LLRender::LINES);
521 { 521 {
522 gGL.vertex3fv((pos - LLVector3(0.2f, 0.f, 0.f)).mV); 522 gGL.vertex3fv((pos - LLVector3(0.2f, 0.f, 0.f)).mV);
523 gGL.vertex3fv((pos + LLVector3(0.2f, 0.f, 0.f)).mV); 523 gGL.vertex3fv((pos + LLVector3(0.2f, 0.f, 0.f)).mV);
@@ -529,7 +529,7 @@ void LLDrawPoolAvatar::renderAvatars(LLVOAvatar* single_avatar, S32 pass)
529 529
530 pos = avatarp->mRoot.getWorldPosition(); 530 pos = avatarp->mRoot.getWorldPosition();
531 gGL.color4f(1.0f, 1.0f, 1.0f, 0.8f); 531 gGL.color4f(1.0f, 1.0f, 1.0f, 0.8f);
532 gGL.begin(LLVertexBuffer::LINES); 532 gGL.begin(LLRender::LINES);
533 { 533 {
534 gGL.vertex3fv((pos - LLVector3(0.2f, 0.f, 0.f)).mV); 534 gGL.vertex3fv((pos - LLVector3(0.2f, 0.f, 0.f)).mV);
535 gGL.vertex3fv((pos + LLVector3(0.2f, 0.f, 0.f)).mV); 535 gGL.vertex3fv((pos + LLVector3(0.2f, 0.f, 0.f)).mV);
@@ -541,7 +541,7 @@ void LLDrawPoolAvatar::renderAvatars(LLVOAvatar* single_avatar, S32 pass)
541 541
542 pos = avatarp->mPelvisp->getWorldPosition(); 542 pos = avatarp->mPelvisp->getWorldPosition();
543 gGL.color4f(0.0f, 0.0f, 1.0f, 0.8f); 543 gGL.color4f(0.0f, 0.0f, 1.0f, 0.8f);
544 gGL.begin(LLVertexBuffer::LINES); 544 gGL.begin(LLRender::LINES);
545 { 545 {
546 gGL.vertex3fv((pos - LLVector3(0.2f, 0.f, 0.f)).mV); 546 gGL.vertex3fv((pos - LLVector3(0.2f, 0.f, 0.f)).mV);
547 gGL.vertex3fv((pos + LLVector3(0.2f, 0.f, 0.f)).mV); 547 gGL.vertex3fv((pos + LLVector3(0.2f, 0.f, 0.f)).mV);
diff --git a/linden/indra/newview/lldrawpoolbump.cpp b/linden/indra/newview/lldrawpoolbump.cpp
index 0dd11d6..6593547 100644
--- a/linden/indra/newview/lldrawpoolbump.cpp
+++ b/linden/indra/newview/lldrawpoolbump.cpp
@@ -349,27 +349,29 @@ void LLDrawPoolBump::beginShiny(bool invisible)
349 cube_map->setMatrix(1); 349 cube_map->setMatrix(1);
350 // Make sure that texture coord generation happens for tex unit 1, as that's the one we use for 350 // Make sure that texture coord generation happens for tex unit 1, as that's the one we use for
351 // the cube map in the one pass shiny shaders 351 // the cube map in the one pass shiny shaders
352 cube_channel = shader->enableTexture(LLViewerShaderMgr::ENVIRONMENT_MAP, GL_TEXTURE_CUBE_MAP_ARB); 352 cube_channel = shader->enableTexture(LLViewerShaderMgr::ENVIRONMENT_MAP, LLTexUnit::TT_CUBE_MAP);
353 cube_map->enableTexture(cube_channel); 353 cube_map->enableTexture(cube_channel);
354 cube_map->enableTextureCoords(1); 354 cube_map->enableTextureCoords(1);
355 diffuse_channel = shader->enableTexture(LLViewerShaderMgr::DIFFUSE_MAP); 355 diffuse_channel = shader->enableTexture(LLViewerShaderMgr::DIFFUSE_MAP);
356 } 356 }
357 else 357 else
358 { 358 {
359 cube_channel = 0; 359 cube_channel = shader->enableTexture(LLViewerShaderMgr::ENVIRONMENT_MAP, LLTexUnit::TT_CUBE_MAP);
360 diffuse_channel = -1; 360 diffuse_channel = -1;
361 cube_map->setMatrix(0); 361 cube_map->setMatrix(0);
362 cube_map->enable(shader->enableTexture(LLViewerShaderMgr::ENVIRONMENT_MAP, GL_TEXTURE_CUBE_MAP_ARB)); 362 cube_map->enable(cube_channel);
363 } 363 }
364 cube_map->bind(); 364 gGL.getTexUnit(cube_channel)->bind(cube_map);
365 gGL.getTexUnit(0)->activate();
365 } 366 }
366 else 367 else
367 { 368 {
368 cube_channel = 0; 369 cube_channel = 0;
369 diffuse_channel = -1; 370 diffuse_channel = -1;
371 gGL.getTexUnit(0)->disable();
370 cube_map->enable(0); 372 cube_map->enable(0);
371 cube_map->setMatrix(0); 373 cube_map->setMatrix(0);
372 cube_map->bind(); 374 gGL.getTexUnit(0)->bind(cube_map);
373 375
374 gGL.getTexUnit(0)->setTextureColorBlend(LLTexUnit::TBO_REPLACE, LLTexUnit::TBS_TEX_COLOR); 376 gGL.getTexUnit(0)->setTextureColorBlend(LLTexUnit::TBO_REPLACE, LLTexUnit::TBS_TEX_COLOR);
375 gGL.getTexUnit(0)->setTextureAlphaBlend(LLTexUnit::TBO_REPLACE, LLTexUnit::TBS_VERT_ALPHA); 377 gGL.getTexUnit(0)->setTextureAlphaBlend(LLTexUnit::TBO_REPLACE, LLTexUnit::TBS_VERT_ALPHA);
@@ -423,7 +425,7 @@ void LLDrawPoolBump::endShiny(bool invisible)
423 425
424 if (!invisible && mVertexShaderLevel > 1) 426 if (!invisible && mVertexShaderLevel > 1)
425 { 427 {
426 shader->disableTexture(LLViewerShaderMgr::ENVIRONMENT_MAP, GL_TEXTURE_CUBE_MAP_ARB); 428 shader->disableTexture(LLViewerShaderMgr::ENVIRONMENT_MAP, LLTexUnit::TT_CUBE_MAP);
427 429
428 if (LLViewerShaderMgr::instance()->getVertexShaderLevel(LLViewerShaderMgr::SHADER_OBJECT) > 0) 430 if (LLViewerShaderMgr::instance()->getVertexShaderLevel(LLViewerShaderMgr::SHADER_OBJECT) > 0)
429 { 431 {
@@ -435,18 +437,20 @@ void LLDrawPoolBump::endShiny(bool invisible)
435 437
436 shader->unbind(); 438 shader->unbind();
437 gGL.getTexUnit(0)->activate(); 439 gGL.getTexUnit(0)->activate();
438 glEnable(GL_TEXTURE_2D); 440 gGL.getTexUnit(0)->enable(LLTexUnit::TT_TEXTURE);
439 } 441 }
440 if (cube_channel >= 0) 442 if (cube_channel >= 0)
441 { 443 {
444 gGL.getTexUnit(cube_channel)->enable(LLTexUnit::TT_TEXTURE);
442 gGL.getTexUnit(cube_channel)->setTextureBlendType(LLTexUnit::TB_MULT); 445 gGL.getTexUnit(cube_channel)->setTextureBlendType(LLTexUnit::TB_MULT);
443 } 446 }
444 } 447 }
445 448 gGL.getTexUnit(diffuse_channel)->disable();
446 gGL.getTexUnit(0)->activate(); 449 gGL.getTexUnit(cube_channel)->disable();
447 LLImageGL::unbindTexture(0, GL_TEXTURE_2D); 450
451 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
448 gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT); 452 gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT);
449 453
450 diffuse_channel = -1; 454 diffuse_channel = -1;
451 cube_channel = 0; 455 cube_channel = 0;
452 mShiny = FALSE; 456 mShiny = FALSE;
@@ -489,12 +493,14 @@ void LLDrawPoolBump::beginFullbrightShiny()
489 cube_map->setMatrix(1); 493 cube_map->setMatrix(1);
490 // Make sure that texture coord generation happens for tex unit 1, as that's the one we use for 494 // Make sure that texture coord generation happens for tex unit 1, as that's the one we use for
491 // the cube map in the one pass shiny shaders 495 // the cube map in the one pass shiny shaders
492 cube_channel = shader->enableTexture(LLViewerShaderMgr::ENVIRONMENT_MAP, GL_TEXTURE_CUBE_MAP_ARB); 496 gGL.getTexUnit(1)->disable();
497 cube_channel = shader->enableTexture(LLViewerShaderMgr::ENVIRONMENT_MAP, LLTexUnit::TT_CUBE_MAP);
493 cube_map->enableTexture(cube_channel); 498 cube_map->enableTexture(cube_channel);
494 cube_map->enableTextureCoords(1); 499 cube_map->enableTextureCoords(1);
495 diffuse_channel = shader->enableTexture(LLViewerShaderMgr::DIFFUSE_MAP); 500 diffuse_channel = shader->enableTexture(LLViewerShaderMgr::DIFFUSE_MAP);
496 501
497 cube_map->bind(); 502 gGL.getTexUnit(cube_channel)->bind(cube_map);
503 gGL.getTexUnit(0)->activate();
498 } 504 }
499 mShiny = TRUE; 505 mShiny = TRUE;
500} 506}
@@ -535,14 +541,13 @@ void LLDrawPoolBump::endFullbrightShiny()
535 shader->disableTexture(LLViewerShaderMgr::DIFFUSE_MAP); 541 shader->disableTexture(LLViewerShaderMgr::DIFFUSE_MAP);
536 } 542 }
537 gGL.getTexUnit(0)->activate(); 543 gGL.getTexUnit(0)->activate();
538 glEnable(GL_TEXTURE_2D); 544 gGL.getTexUnit(0)->enable(LLTexUnit::TT_TEXTURE);
539 545
540 shader->unbind(); 546 shader->unbind();
541
542 gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT); 547 gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT);
543 } 548 }
544 549
545 LLImageGL::unbindTexture(0, GL_TEXTURE_2D); 550 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
546 gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT); 551 gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT);
547 552
548 diffuse_channel = -1; 553 diffuse_channel = -1;
@@ -561,7 +566,7 @@ void LLDrawPoolBump::renderGroup(LLSpatialGroup* group, U32 type, U32 mask, BOOL
561 applyModelMatrix(params); 566 applyModelMatrix(params);
562 567
563 params.mVertexBuffer->setBuffer(mask); 568 params.mVertexBuffer->setBuffer(mask);
564 params.mVertexBuffer->drawRange(LLVertexBuffer::TRIANGLES, params.mStart, params.mEnd, params.mCount, params.mOffset); 569 params.mVertexBuffer->drawRange(LLRender::TRIANGLES, params.mStart, params.mEnd, params.mCount, params.mOffset);
565 gPipeline.addTrianglesDrawn(params.mCount/3); 570 gPipeline.addTrianglesDrawn(params.mCount/3);
566 } 571 }
567} 572}
@@ -599,8 +604,8 @@ BOOL LLDrawPoolBump::bindBumpMap(LLDrawInfo& params)
599 604
600 if (bump) 605 if (bump)
601 { 606 {
602 bump->bind(1); 607 gGL.getTexUnit(1)->bind(bump);
603 bump->bind(0); 608 gGL.getTexUnit(0)->bind(bump);
604 return TRUE; 609 return TRUE;
605 } 610 }
606 return FALSE; 611 return FALSE;
@@ -629,7 +634,7 @@ void LLDrawPoolBump::beginBump()
629 // TEXTURE UNIT 1 634 // TEXTURE UNIT 1
630 gGL.getTexUnit(1)->activate(); 635 gGL.getTexUnit(1)->activate();
631 636
632 glEnable(GL_TEXTURE_2D); // Texture unit 1 637 gGL.getTexUnit(1)->enable(LLTexUnit::TT_TEXTURE);
633 638
634 gGL.getTexUnit(1)->setTextureColorBlend(LLTexUnit::TBO_ADD_SIGNED, LLTexUnit::TBS_PREV_COLOR, LLTexUnit::TBS_ONE_MINUS_TEX_ALPHA); 639 gGL.getTexUnit(1)->setTextureColorBlend(LLTexUnit::TBO_ADD_SIGNED, LLTexUnit::TBS_PREV_COLOR, LLTexUnit::TBS_ONE_MINUS_TEX_ALPHA);
635 gGL.getTexUnit(1)->setTextureAlphaBlend(LLTexUnit::TBO_REPLACE, LLTexUnit::TBS_TEX_ALPHA); 640 gGL.getTexUnit(1)->setTextureAlphaBlend(LLTexUnit::TBO_REPLACE, LLTexUnit::TBS_TEX_ALPHA);
@@ -648,7 +653,7 @@ void LLDrawPoolBump::beginBump()
648 gGL.getTexUnit(0)->activate(); 653 gGL.getTexUnit(0)->activate();
649 stop_glerror(); 654 stop_glerror();
650 655
651 LLViewerImage::unbindTexture(1, GL_TEXTURE_2D); 656 gGL.getTexUnit(1)->unbind(LLTexUnit::TT_TEXTURE);
652} 657}
653 658
654//static 659//static
@@ -680,7 +685,7 @@ void LLDrawPoolBump::endBump()
680 685
681 // Disable texture unit 1 686 // Disable texture unit 1
682 gGL.getTexUnit(1)->activate(); 687 gGL.getTexUnit(1)->activate();
683 glDisable(GL_TEXTURE_2D); // Texture unit 1 688 gGL.getTexUnit(1)->disable();
684 gGL.getTexUnit(1)->setTextureBlendType(LLTexUnit::TB_MULT); 689 gGL.getTexUnit(1)->setTextureBlendType(LLTexUnit::TB_MULT);
685 690
686 // Disable texture unit 0 691 // Disable texture unit 0
@@ -1083,17 +1088,17 @@ void LLDrawPoolBump::pushBatch(LLDrawInfo& params, U32 mask, BOOL texture)
1083 { 1088 {
1084 if (params.mTexture.notNull()) 1089 if (params.mTexture.notNull())
1085 { 1090 {
1086 params.mTexture->bind(diffuse_channel); 1091 gGL.getTexUnit(diffuse_channel)->bind(params.mTexture.get());
1087 params.mTexture->addTextureStats(params.mVSize); 1092 params.mTexture->addTextureStats(params.mVSize);
1088 } 1093 }
1089 else 1094 else
1090 { 1095 {
1091 LLImageGL::unbindTexture(0); 1096 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
1092 } 1097 }
1093 } 1098 }
1094 1099
1095 params.mVertexBuffer->setBuffer(mask); 1100 params.mVertexBuffer->setBuffer(mask);
1096 params.mVertexBuffer->drawRange(LLVertexBuffer::TRIANGLES, params.mStart, params.mEnd, params.mCount, params.mOffset); 1101 params.mVertexBuffer->drawRange(LLRender::TRIANGLES, params.mStart, params.mEnd, params.mCount, params.mOffset);
1097 gPipeline.addTrianglesDrawn(params.mCount/3); 1102 gPipeline.addTrianglesDrawn(params.mCount/3);
1098 if (params.mTextureMatrix) 1103 if (params.mTextureMatrix)
1099 { 1104 {
diff --git a/linden/indra/newview/lldrawpoolground.cpp b/linden/indra/newview/lldrawpoolground.cpp
index 5698027..c8d110b 100644
--- a/linden/indra/newview/lldrawpoolground.cpp
+++ b/linden/indra/newview/lldrawpoolground.cpp
@@ -63,13 +63,14 @@ void LLDrawPoolGround::prerender()
63 63
64void LLDrawPoolGround::render(S32 pass) 64void LLDrawPoolGround::render(S32 pass)
65{ 65{
66 if (mDrawFace.empty()) 66 if (mDrawFace.empty() || !gSavedSettings.getBOOL("RenderGround"))
67 { 67 {
68 return; 68 return;
69 } 69 }
70 70
71 LLGLSPipelineSkyBox gls_skybox; 71 LLGLSPipelineSkyBox gls_skybox;
72 LLImageGL::unbindTexture(0, GL_TEXTURE_2D); 72 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
73
73 LLGLDepthTest gls_depth(GL_TRUE, GL_FALSE); 74 LLGLDepthTest gls_depth(GL_TRUE, GL_FALSE);
74 75
75 LLGLClampToFarClip far_clip(glh_get_current_projection()); 76 LLGLClampToFarClip far_clip(glh_get_current_projection());
diff --git a/linden/indra/newview/lldrawpoolsky.cpp b/linden/indra/newview/lldrawpoolsky.cpp
index e1dbf95..573061d 100644
--- a/linden/indra/newview/lldrawpoolsky.cpp
+++ b/linden/indra/newview/lldrawpoolsky.cpp
@@ -186,7 +186,7 @@ void LLDrawPoolSky::renderHeavenlyBody(U8 hb, LLFace* face)
186 if (! face->getGeomCount()) return; 186 if (! face->getGeomCount()) return;
187 187
188 LLImageGL* tex = face->getTexture(); 188 LLImageGL* tex = face->getTexture();
189 tex->bind(); 189 gGL.getTexUnit(0)->bind(tex);
190 LLColor4 color(mHB[hb]->getInterpColor()); 190 LLColor4 color(mHB[hb]->getInterpColor());
191 LLOverrideFaceColor override(this, color); 191 LLOverrideFaceColor override(this, color);
192 face->renderIndexed(); 192 face->renderIndexed();
@@ -200,7 +200,7 @@ void LLDrawPoolSky::renderSunHalo(LLFace* face)
200 if (! face->getGeomCount()) return; 200 if (! face->getGeomCount()) return;
201 201
202 LLImageGL* tex = face->getTexture(); 202 LLImageGL* tex = face->getTexture();
203 tex->bind(); 203 gGL.getTexUnit(0)->bind(tex);
204 LLColor4 color(mHB[0]->getInterpColor()); 204 LLColor4 color(mHB[0]->getInterpColor());
205 color.mV[3] = llclamp(mHB[0]->getHaloBrighness(), 0.f, 1.f); 205 color.mV[3] = llclamp(mHB[0]->getHaloBrighness(), 0.f, 1.f);
206 206
diff --git a/linden/indra/newview/lldrawpoolterrain.cpp b/linden/indra/newview/lldrawpoolterrain.cpp
index ccfbd2d..e99fc91 100644
--- a/linden/indra/newview/lldrawpoolterrain.cpp
+++ b/linden/indra/newview/lldrawpoolterrain.cpp
@@ -72,19 +72,19 @@ LLDrawPoolTerrain::LLDrawPoolTerrain(LLViewerImage *texturep) :
72 TRUE, TRUE, GL_ALPHA8, GL_ALPHA, 72 TRUE, TRUE, GL_ALPHA8, GL_ALPHA,
73 LLUUID("e97cf410-8e61-7005-ec06-629eba4cd1fb")); 73 LLUUID("e97cf410-8e61-7005-ec06-629eba4cd1fb"));
74 74
75 mAlphaRampImagep->bind(0); 75 gGL.getTexUnit(0)->bind(mAlphaRampImagep.get());
76 mAlphaRampImagep->setClamp(TRUE, TRUE); 76 mAlphaRampImagep->setClamp(TRUE, TRUE);
77 77
78 m2DAlphaRampImagep = gImageList.getImageFromFile("alpha_gradient_2d.j2c", 78 m2DAlphaRampImagep = gImageList.getImageFromFile("alpha_gradient_2d.j2c",
79 TRUE, TRUE, GL_ALPHA8, GL_ALPHA, 79 TRUE, TRUE, GL_ALPHA8, GL_ALPHA,
80 LLUUID("38b86f85-2575-52a9-a531-23108d8da837")); 80 LLUUID("38b86f85-2575-52a9-a531-23108d8da837"));
81 81
82 m2DAlphaRampImagep->bind(0); 82 gGL.getTexUnit(0)->bind(m2DAlphaRampImagep.get());
83 m2DAlphaRampImagep->setClamp(TRUE, TRUE); 83 m2DAlphaRampImagep->setClamp(TRUE, TRUE);
84 84
85 mTexturep->setBoostLevel(LLViewerImage::BOOST_TERRAIN); 85 mTexturep->setBoostLevel(LLViewerImage::BOOST_TERRAIN);
86 86
87 LLImageGL::unbindTexture(0, GL_TEXTURE_2D); 87 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
88} 88}
89 89
90LLDrawPoolTerrain::~LLDrawPoolTerrain() 90LLDrawPoolTerrain::~LLDrawPoolTerrain()
@@ -240,7 +240,7 @@ void LLDrawPoolTerrain::renderFullShader()
240 // detail texture 0 240 // detail texture 0
241 // 241 //
242 S32 detail0 = sShader->enableTexture(LLViewerShaderMgr::TERRAIN_DETAIL0); 242 S32 detail0 = sShader->enableTexture(LLViewerShaderMgr::TERRAIN_DETAIL0);
243 LLViewerImage::bindTexture(detail_texture0p,detail0); 243 gGL.getTexUnit(detail0)->bind(detail_texture0p);
244 gGL.getTexUnit(0)->activate(); 244 gGL.getTexUnit(0)->activate();
245 245
246 glEnable(GL_TEXTURE_GEN_S); 246 glEnable(GL_TEXTURE_GEN_S);
@@ -258,7 +258,7 @@ void LLDrawPoolTerrain::renderFullShader()
258 // detail texture 1 258 // detail texture 1
259 // 259 //
260 S32 detail1 = sShader->enableTexture(LLViewerShaderMgr::TERRAIN_DETAIL1); 260 S32 detail1 = sShader->enableTexture(LLViewerShaderMgr::TERRAIN_DETAIL1);
261 LLViewerImage::bindTexture(detail_texture1p,detail1); 261 gGL.getTexUnit(detail1)->bind(detail_texture1p);
262 262
263 /// ALPHA TEXTURE COORDS 0: 263 /// ALPHA TEXTURE COORDS 0:
264 gGL.getTexUnit(1)->activate(); 264 gGL.getTexUnit(1)->activate();
@@ -269,11 +269,11 @@ void LLDrawPoolTerrain::renderFullShader()
269 // detail texture 2 269 // detail texture 2
270 // 270 //
271 S32 detail2 = sShader->enableTexture(LLViewerShaderMgr::TERRAIN_DETAIL2); 271 S32 detail2 = sShader->enableTexture(LLViewerShaderMgr::TERRAIN_DETAIL2);
272 LLViewerImage::bindTexture(detail_texture2p,detail2); 272 gGL.getTexUnit(detail2)->bind(detail_texture2p);
273 glEnable(GL_TEXTURE_2D); 273
274 gGL.getTexUnit(2)->activate();
274 275
275 /// ALPHA TEXTURE COORDS 1: 276 /// ALPHA TEXTURE COORDS 1:
276 gGL.getTexUnit(2)->activate();
277 glMatrixMode(GL_TEXTURE); 277 glMatrixMode(GL_TEXTURE);
278 glLoadIdentity(); 278 glLoadIdentity();
279 glTranslatef(-2.f, 0.f, 0.f); 279 glTranslatef(-2.f, 0.f, 0.f);
@@ -283,7 +283,7 @@ void LLDrawPoolTerrain::renderFullShader()
283 // detail texture 3 283 // detail texture 3
284 // 284 //
285 S32 detail3 = sShader->enableTexture(LLViewerShaderMgr::TERRAIN_DETAIL3); 285 S32 detail3 = sShader->enableTexture(LLViewerShaderMgr::TERRAIN_DETAIL3);
286 LLViewerImage::bindTexture(detail_texture3p,detail3); 286 gGL.getTexUnit(detail3)->bind(detail_texture3p);
287 287
288 /// ALPHA TEXTURE COORDS 2: 288 /// ALPHA TEXTURE COORDS 2:
289 gGL.getTexUnit(3)->activate(); 289 gGL.getTexUnit(3)->activate();
@@ -296,7 +296,7 @@ void LLDrawPoolTerrain::renderFullShader()
296 // Alpha Ramp 296 // Alpha Ramp
297 // 297 //
298 S32 alpha_ramp = sShader->enableTexture(LLViewerShaderMgr::TERRAIN_ALPHARAMP); 298 S32 alpha_ramp = sShader->enableTexture(LLViewerShaderMgr::TERRAIN_ALPHARAMP);
299 LLViewerImage::bindTexture(m2DAlphaRampImagep,alpha_ramp); 299 gGL.getTexUnit(alpha_ramp)->bind(m2DAlphaRampImagep.get());
300 300
301 // GL_BLEND disabled by default 301 // GL_BLEND disabled by default
302 drawLoop(); 302 drawLoop();
@@ -308,36 +308,36 @@ void LLDrawPoolTerrain::renderFullShader()
308 sShader->disableTexture(LLViewerShaderMgr::TERRAIN_DETAIL2); 308 sShader->disableTexture(LLViewerShaderMgr::TERRAIN_DETAIL2);
309 sShader->disableTexture(LLViewerShaderMgr::TERRAIN_DETAIL3); 309 sShader->disableTexture(LLViewerShaderMgr::TERRAIN_DETAIL3);
310 310
311 LLImageGL::unbindTexture(alpha_ramp, GL_TEXTURE_2D); 311 gGL.getTexUnit(alpha_ramp)->unbind(LLTexUnit::TT_TEXTURE);
312 gGL.getTexUnit(4)->disable();
312 gGL.getTexUnit(4)->activate(); 313 gGL.getTexUnit(4)->activate();
313 glDisable(GL_TEXTURE_2D); // Texture unit 4
314 glDisable(GL_TEXTURE_GEN_S); 314 glDisable(GL_TEXTURE_GEN_S);
315 glDisable(GL_TEXTURE_GEN_T); 315 glDisable(GL_TEXTURE_GEN_T);
316 glMatrixMode(GL_TEXTURE); 316 glMatrixMode(GL_TEXTURE);
317 glLoadIdentity(); 317 glLoadIdentity();
318 glMatrixMode(GL_MODELVIEW); 318 glMatrixMode(GL_MODELVIEW);
319 319
320 LLImageGL::unbindTexture(detail3, GL_TEXTURE_2D); 320 gGL.getTexUnit(detail3)->unbind(LLTexUnit::TT_TEXTURE);
321 gGL.getTexUnit(3)->disable();
321 gGL.getTexUnit(3)->activate(); 322 gGL.getTexUnit(3)->activate();
322 glDisable(GL_TEXTURE_2D);
323 glDisable(GL_TEXTURE_GEN_S); 323 glDisable(GL_TEXTURE_GEN_S);
324 glDisable(GL_TEXTURE_GEN_T); 324 glDisable(GL_TEXTURE_GEN_T);
325 glMatrixMode(GL_TEXTURE); 325 glMatrixMode(GL_TEXTURE);
326 glLoadIdentity(); 326 glLoadIdentity();
327 glMatrixMode(GL_MODELVIEW); 327 glMatrixMode(GL_MODELVIEW);
328 328
329 LLImageGL::unbindTexture(detail2, GL_TEXTURE_2D); 329 gGL.getTexUnit(detail2)->unbind(LLTexUnit::TT_TEXTURE);
330 gGL.getTexUnit(2)->disable();
330 gGL.getTexUnit(2)->activate(); 331 gGL.getTexUnit(2)->activate();
331 glDisable(GL_TEXTURE_2D);
332 glDisable(GL_TEXTURE_GEN_S); 332 glDisable(GL_TEXTURE_GEN_S);
333 glDisable(GL_TEXTURE_GEN_T); 333 glDisable(GL_TEXTURE_GEN_T);
334 glMatrixMode(GL_TEXTURE); 334 glMatrixMode(GL_TEXTURE);
335 glLoadIdentity(); 335 glLoadIdentity();
336 glMatrixMode(GL_MODELVIEW); 336 glMatrixMode(GL_MODELVIEW);
337 337
338 LLImageGL::unbindTexture(detail1, GL_TEXTURE_2D); 338 gGL.getTexUnit(detail1)->unbind(LLTexUnit::TT_TEXTURE);
339 gGL.getTexUnit(1)->disable();
339 gGL.getTexUnit(1)->activate(); 340 gGL.getTexUnit(1)->activate();
340 glDisable(GL_TEXTURE_2D);
341 glDisable(GL_TEXTURE_GEN_S); 341 glDisable(GL_TEXTURE_GEN_S);
342 glDisable(GL_TEXTURE_GEN_T); 342 glDisable(GL_TEXTURE_GEN_T);
343 glMatrixMode(GL_TEXTURE); 343 glMatrixMode(GL_TEXTURE);
@@ -347,9 +347,9 @@ void LLDrawPoolTerrain::renderFullShader()
347 //---------------------------------------------------------------------------- 347 //----------------------------------------------------------------------------
348 // Restore Texture Unit 0 defaults 348 // Restore Texture Unit 0 defaults
349 349
350 LLImageGL::unbindTexture(detail0, GL_TEXTURE_2D); 350 gGL.getTexUnit(detail0)->unbind(LLTexUnit::TT_TEXTURE);
351 gGL.getTexUnit(0)->enable(LLTexUnit::TT_TEXTURE);
351 gGL.getTexUnit(0)->activate(); 352 gGL.getTexUnit(0)->activate();
352 glEnable(GL_TEXTURE_2D);
353 glDisable(GL_TEXTURE_GEN_S); 353 glDisable(GL_TEXTURE_GEN_S);
354 glDisable(GL_TEXTURE_GEN_T); 354 glDisable(GL_TEXTURE_GEN_T);
355 glMatrixMode(GL_TEXTURE); 355 glMatrixMode(GL_TEXTURE);
@@ -388,7 +388,7 @@ void LLDrawPoolTerrain::renderFull4TU()
388 // Stage 0: detail texture 0 388 // Stage 0: detail texture 0
389 // 389 //
390 gGL.getTexUnit(0)->activate(); 390 gGL.getTexUnit(0)->activate();
391 LLViewerImage::bindTexture(detail_texture0p,0); 391 gGL.getTexUnit(0)->bind(detail_texture0p);
392 glClientActiveTextureARB(GL_TEXTURE0_ARB); 392 glClientActiveTextureARB(GL_TEXTURE0_ARB);
393 393
394 glEnable(GL_TEXTURE_GEN_S); 394 glEnable(GL_TEXTURE_GEN_S);
@@ -405,9 +405,9 @@ void LLDrawPoolTerrain::renderFull4TU()
405 // Stage 1: Generate alpha ramp for detail0/detail1 transition 405 // Stage 1: Generate alpha ramp for detail0/detail1 transition
406 // 406 //
407 407
408 LLViewerImage::bindTexture(m2DAlphaRampImagep,1); 408 gGL.getTexUnit(1)->bind(m2DAlphaRampImagep.get());
409 gGL.getTexUnit(1)->enable(LLTexUnit::TT_TEXTURE);
409 gGL.getTexUnit(1)->activate(); 410 gGL.getTexUnit(1)->activate();
410 glEnable(GL_TEXTURE_2D); // Texture unit 1
411 glClientActiveTextureARB(GL_TEXTURE1_ARB); 411 glClientActiveTextureARB(GL_TEXTURE1_ARB);
412 glEnableClientState(GL_TEXTURE_COORD_ARRAY); 412 glEnableClientState(GL_TEXTURE_COORD_ARRAY);
413 413
@@ -418,12 +418,13 @@ void LLDrawPoolTerrain::renderFull4TU()
418 // 418 //
419 // Stage 2: Interpolate detail1 with existing based on ramp 419 // Stage 2: Interpolate detail1 with existing based on ramp
420 // 420 //
421 LLViewerImage::bindTexture(detail_texture1p,2); 421 gGL.getTexUnit(2)->bind(detail_texture1p);
422 gGL.getTexUnit(2)->enable(LLTexUnit::TT_TEXTURE);
422 gGL.getTexUnit(2)->activate(); 423 gGL.getTexUnit(2)->activate();
423 glEnable(GL_TEXTURE_2D); // Texture unit 2
424 glClientActiveTextureARB(GL_TEXTURE2_ARB);
425 424
425 glClientActiveTextureARB(GL_TEXTURE2_ARB);
426 glDisableClientState(GL_TEXTURE_COORD_ARRAY); 426 glDisableClientState(GL_TEXTURE_COORD_ARRAY);
427
427 glEnable(GL_TEXTURE_GEN_S); 428 glEnable(GL_TEXTURE_GEN_S);
428 glEnable(GL_TEXTURE_GEN_T); 429 glEnable(GL_TEXTURE_GEN_T);
429 glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR); 430 glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
@@ -436,9 +437,9 @@ void LLDrawPoolTerrain::renderFull4TU()
436 // 437 //
437 // Stage 3: Modulate with primary (vertex) color for lighting 438 // Stage 3: Modulate with primary (vertex) color for lighting
438 // 439 //
439 LLViewerImage::bindTexture(detail_texture1p,3); // bind any texture 440 gGL.getTexUnit(3)->bind(detail_texture1p);
441 gGL.getTexUnit(3)->enable(LLTexUnit::TT_TEXTURE);
440 gGL.getTexUnit(3)->activate(); 442 gGL.getTexUnit(3)->activate();
441 glEnable(GL_TEXTURE_2D); // Texture unit 3
442 glClientActiveTextureARB(GL_TEXTURE3_ARB); 443 glClientActiveTextureARB(GL_TEXTURE3_ARB);
443 444
444 // Set alpha texture and do lighting modulation 445 // Set alpha texture and do lighting modulation
@@ -456,7 +457,7 @@ void LLDrawPoolTerrain::renderFull4TU()
456 // Stage 0: Write detail3 into base 457 // Stage 0: Write detail3 into base
457 // 458 //
458 gGL.getTexUnit(0)->activate(); 459 gGL.getTexUnit(0)->activate();
459 LLViewerImage::bindTexture(detail_texture3p,0); 460 gGL.getTexUnit(0)->bind(detail_texture3p);
460 glClientActiveTextureARB(GL_TEXTURE0_ARB); 461 glClientActiveTextureARB(GL_TEXTURE0_ARB);
461 462
462 glDisableClientState(GL_TEXTURE_COORD_ARRAY); 463 glDisableClientState(GL_TEXTURE_COORD_ARRAY);
@@ -472,9 +473,9 @@ void LLDrawPoolTerrain::renderFull4TU()
472 // 473 //
473 // Stage 1: Generate alpha ramp for detail2/detail3 transition 474 // Stage 1: Generate alpha ramp for detail2/detail3 transition
474 // 475 //
475 LLViewerImage::bindTexture(m2DAlphaRampImagep,1); 476 gGL.getTexUnit(1)->bind(m2DAlphaRampImagep.get());
477 gGL.getTexUnit(1)->enable(LLTexUnit::TT_TEXTURE);
476 gGL.getTexUnit(1)->activate(); 478 gGL.getTexUnit(1)->activate();
477 glEnable(GL_TEXTURE_2D); // Texture unit 1
478 glClientActiveTextureARB(GL_TEXTURE1_ARB); 479 glClientActiveTextureARB(GL_TEXTURE1_ARB);
479 480
480 glEnableClientState(GL_TEXTURE_COORD_ARRAY); 481 glEnableClientState(GL_TEXTURE_COORD_ARRAY);
@@ -492,9 +493,9 @@ void LLDrawPoolTerrain::renderFull4TU()
492 // 493 //
493 // Stage 2: Interpolate detail2 with existing based on ramp 494 // Stage 2: Interpolate detail2 with existing based on ramp
494 // 495 //
495 LLViewerImage::bindTexture(detail_texture2p,2); 496 gGL.getTexUnit(2)->bind(detail_texture2p);
497 gGL.getTexUnit(2)->enable(LLTexUnit::TT_TEXTURE);
496 gGL.getTexUnit(2)->activate(); 498 gGL.getTexUnit(2)->activate();
497 glEnable(GL_TEXTURE_2D); // Texture unit 2
498 499
499 glClientActiveTextureARB(GL_TEXTURE2_ARB); 500 glClientActiveTextureARB(GL_TEXTURE2_ARB);
500 glDisableClientState(GL_TEXTURE_COORD_ARRAY); 501 glDisableClientState(GL_TEXTURE_COORD_ARRAY);
@@ -511,9 +512,9 @@ void LLDrawPoolTerrain::renderFull4TU()
511 // 512 //
512 // Stage 3: Generate alpha ramp for detail1/detail2 transition 513 // Stage 3: Generate alpha ramp for detail1/detail2 transition
513 // 514 //
514 LLViewerImage::bindTexture(m2DAlphaRampImagep,3); 515 gGL.getTexUnit(3)->bind(m2DAlphaRampImagep.get());
516 gGL.getTexUnit(3)->enable(LLTexUnit::TT_TEXTURE);
515 gGL.getTexUnit(3)->activate(); 517 gGL.getTexUnit(3)->activate();
516 glEnable(GL_TEXTURE_2D); // Texture unit 3
517 518
518 glClientActiveTextureARB(GL_TEXTURE3_ARB); 519 glClientActiveTextureARB(GL_TEXTURE3_ARB);
519 glEnableClientState(GL_TEXTURE_COORD_ARRAY); 520 glEnableClientState(GL_TEXTURE_COORD_ARRAY);
@@ -536,21 +537,21 @@ void LLDrawPoolTerrain::renderFull4TU()
536 537
537 LLVertexBuffer::unbind(); 538 LLVertexBuffer::unbind();
538 // Disable multitexture 539 // Disable multitexture
539 LLImageGL::unbindTexture(3, GL_TEXTURE_2D); 540 gGL.getTexUnit(3)->unbind(LLTexUnit::TT_TEXTURE);
541 gGL.getTexUnit(3)->disable();
540 gGL.getTexUnit(3)->activate(); 542 gGL.getTexUnit(3)->activate();
541 glClientActiveTextureARB(GL_TEXTURE3_ARB); 543 glClientActiveTextureARB(GL_TEXTURE3_ARB);
542 glDisableClientState(GL_TEXTURE_COORD_ARRAY); 544 glDisableClientState(GL_TEXTURE_COORD_ARRAY);
543 glDisable(GL_TEXTURE_2D); // Texture unit 3
544 545
545 glMatrixMode(GL_TEXTURE); 546 glMatrixMode(GL_TEXTURE);
546 glLoadIdentity(); 547 glLoadIdentity();
547 glMatrixMode(GL_MODELVIEW); 548 glMatrixMode(GL_MODELVIEW);
548 549
549 LLImageGL::unbindTexture(2, GL_TEXTURE_2D); 550 gGL.getTexUnit(2)->unbind(LLTexUnit::TT_TEXTURE);
551 gGL.getTexUnit(2)->disable();
550 gGL.getTexUnit(2)->activate(); 552 gGL.getTexUnit(2)->activate();
551 glClientActiveTextureARB(GL_TEXTURE2_ARB); 553 glClientActiveTextureARB(GL_TEXTURE2_ARB);
552 glDisableClientState(GL_TEXTURE_COORD_ARRAY); 554 glDisableClientState(GL_TEXTURE_COORD_ARRAY);
553 glDisable(GL_TEXTURE_2D); // Texture unit 2
554 555
555 glDisable(GL_TEXTURE_GEN_S); 556 glDisable(GL_TEXTURE_GEN_S);
556 glDisable(GL_TEXTURE_GEN_T); 557 glDisable(GL_TEXTURE_GEN_T);
@@ -558,11 +559,11 @@ void LLDrawPoolTerrain::renderFull4TU()
558 glLoadIdentity(); 559 glLoadIdentity();
559 glMatrixMode(GL_MODELVIEW); 560 glMatrixMode(GL_MODELVIEW);
560 561
561 LLImageGL::unbindTexture(1, GL_TEXTURE_2D); 562 gGL.getTexUnit(1)->unbind(LLTexUnit::TT_TEXTURE);
563 gGL.getTexUnit(1)->disable();
562 gGL.getTexUnit(1)->activate(); 564 gGL.getTexUnit(1)->activate();
563 glClientActiveTextureARB(GL_TEXTURE1_ARB); 565 glClientActiveTextureARB(GL_TEXTURE1_ARB);
564 glDisableClientState(GL_TEXTURE_COORD_ARRAY); 566 glDisableClientState(GL_TEXTURE_COORD_ARRAY);
565 glDisable(GL_TEXTURE_2D); // Texture unit 1
566 567
567 glMatrixMode(GL_TEXTURE); 568 glMatrixMode(GL_TEXTURE);
568 glLoadIdentity(); 569 glLoadIdentity();
@@ -575,9 +576,9 @@ void LLDrawPoolTerrain::renderFull4TU()
575 // Restore Texture Unit 0 defaults 576 // Restore Texture Unit 0 defaults
576 577
577 gGL.getTexUnit(0)->activate(); 578 gGL.getTexUnit(0)->activate();
578 LLImageGL::unbindTexture(0, GL_TEXTURE_2D); 579 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
580
579 glClientActiveTextureARB(GL_TEXTURE0_ARB); 581 glClientActiveTextureARB(GL_TEXTURE0_ARB);
580 gGL.getTexUnit(0)->activate();
581 glDisableClientState(GL_NORMAL_ARRAY); 582 glDisableClientState(GL_NORMAL_ARRAY);
582 583
583 glDisable(GL_TEXTURE_GEN_S); 584 glDisable(GL_TEXTURE_GEN_S);
@@ -616,7 +617,7 @@ void LLDrawPoolTerrain::renderFull2TU()
616 // 617 //
617 // Stage 0: Render detail 0 into base 618 // Stage 0: Render detail 0 into base
618 // 619 //
619 LLViewerImage::bindTexture(detail_texture0p,0); 620 gGL.getTexUnit(0)->bind(detail_texture0p);
620 glEnable(GL_TEXTURE_GEN_S); 621 glEnable(GL_TEXTURE_GEN_S);
621 glEnable(GL_TEXTURE_GEN_T); 622 glEnable(GL_TEXTURE_GEN_T);
622 glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR); 623 glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
@@ -635,7 +636,7 @@ void LLDrawPoolTerrain::renderFull2TU()
635 // 636 //
636 // Stage 0: Generate alpha ramp for detail0/detail1 transition 637 // Stage 0: Generate alpha ramp for detail0/detail1 transition
637 // 638 //
638 LLViewerImage::bindTexture(m2DAlphaRampImagep,0); 639 gGL.getTexUnit(0)->bind(m2DAlphaRampImagep.get());
639 640
640 glDisable(GL_TEXTURE_GEN_S); 641 glDisable(GL_TEXTURE_GEN_S);
641 glDisable(GL_TEXTURE_GEN_T); 642 glDisable(GL_TEXTURE_GEN_T);
@@ -648,9 +649,9 @@ void LLDrawPoolTerrain::renderFull2TU()
648 // 649 //
649 // Stage 1: Write detail1 650 // Stage 1: Write detail1
650 // 651 //
651 LLViewerImage::bindTexture(detail_texture1p,1); // Texture unit 1 652 gGL.getTexUnit(1)->bind(detail_texture1p);
653 gGL.getTexUnit(1)->enable(LLTexUnit::TT_TEXTURE);
652 gGL.getTexUnit(1)->activate(); 654 gGL.getTexUnit(1)->activate();
653 glEnable(GL_TEXTURE_2D); // Texture unit 1
654 655
655 glEnable(GL_TEXTURE_GEN_S); 656 glEnable(GL_TEXTURE_GEN_S);
656 glEnable(GL_TEXTURE_GEN_T); 657 glEnable(GL_TEXTURE_GEN_T);
@@ -673,7 +674,7 @@ void LLDrawPoolTerrain::renderFull2TU()
673 // 674 //
674 // Stage 0: Generate alpha ramp for detail1/detail2 transition 675 // Stage 0: Generate alpha ramp for detail1/detail2 transition
675 // 676 //
676 LLViewerImage::bindTexture(m2DAlphaRampImagep,0); 677 gGL.getTexUnit(0)->bind(m2DAlphaRampImagep.get());
677 678
678 // Set the texture matrix 679 // Set the texture matrix
679 glMatrixMode(GL_TEXTURE); 680 glMatrixMode(GL_TEXTURE);
@@ -687,9 +688,9 @@ void LLDrawPoolTerrain::renderFull2TU()
687 // 688 //
688 // Stage 1: Write detail2 689 // Stage 1: Write detail2
689 // 690 //
690 LLViewerImage::bindTexture(detail_texture2p,1); 691 gGL.getTexUnit(1)->bind(detail_texture2p);
692 gGL.getTexUnit(1)->enable(LLTexUnit::TT_TEXTURE);
691 gGL.getTexUnit(1)->activate(); 693 gGL.getTexUnit(1)->activate();
692 glEnable(GL_TEXTURE_2D); // Texture unit 1
693 694
694 glEnable(GL_TEXTURE_GEN_S); 695 glEnable(GL_TEXTURE_GEN_S);
695 glEnable(GL_TEXTURE_GEN_T); 696 glEnable(GL_TEXTURE_GEN_T);
@@ -713,7 +714,7 @@ void LLDrawPoolTerrain::renderFull2TU()
713 // Stage 0: Generate alpha ramp for detail2/detail3 transition 714 // Stage 0: Generate alpha ramp for detail2/detail3 transition
714 // 715 //
715 gGL.getTexUnit(0)->activate(); 716 gGL.getTexUnit(0)->activate();
716 LLViewerImage::bindTexture(m2DAlphaRampImagep,0); 717 gGL.getTexUnit(0)->bind(m2DAlphaRampImagep.get());
717 // Set the texture matrix 718 // Set the texture matrix
718 glMatrixMode(GL_TEXTURE); 719 glMatrixMode(GL_TEXTURE);
719 glLoadIdentity(); 720 glLoadIdentity();
@@ -724,9 +725,9 @@ void LLDrawPoolTerrain::renderFull2TU()
724 gGL.getTexUnit(0)->setTextureAlphaBlend(LLTexUnit::TBO_REPLACE, LLTexUnit::TBS_TEX_ALPHA); 725 gGL.getTexUnit(0)->setTextureAlphaBlend(LLTexUnit::TBO_REPLACE, LLTexUnit::TBS_TEX_ALPHA);
725 726
726 // Stage 1: Write detail3 727 // Stage 1: Write detail3
727 LLViewerImage::bindTexture(detail_texture3p,1); 728 gGL.getTexUnit(1)->bind(detail_texture3p);
729 gGL.getTexUnit(1)->enable(LLTexUnit::TT_TEXTURE);
728 gGL.getTexUnit(1)->activate(); 730 gGL.getTexUnit(1)->activate();
729 glEnable(GL_TEXTURE_2D); // Texture unit 1
730 731
731 glEnable(GL_TEXTURE_GEN_S); 732 glEnable(GL_TEXTURE_GEN_S);
732 glEnable(GL_TEXTURE_GEN_T); 733 glEnable(GL_TEXTURE_GEN_T);
@@ -749,9 +750,9 @@ void LLDrawPoolTerrain::renderFull2TU()
749 750
750 // Disable multitexture 751 // Disable multitexture
751 752
752 LLImageGL::unbindTexture(1, GL_TEXTURE_2D); 753 gGL.getTexUnit(1)->unbind(LLTexUnit::TT_TEXTURE);
754 gGL.getTexUnit(1)->disable();
753 gGL.getTexUnit(1)->activate(); 755 gGL.getTexUnit(1)->activate();
754 glDisable(GL_TEXTURE_2D); // Texture unit 1
755 756
756 glDisable(GL_TEXTURE_GEN_S); 757 glDisable(GL_TEXTURE_GEN_S);
757 glDisable(GL_TEXTURE_GEN_T); 758 glDisable(GL_TEXTURE_GEN_T);
@@ -763,9 +764,8 @@ void LLDrawPoolTerrain::renderFull2TU()
763 // Restore Texture Unit 0 defaults 764 // Restore Texture Unit 0 defaults
764 765
765 gGL.getTexUnit(0)->activate(); 766 gGL.getTexUnit(0)->activate();
766 LLImageGL::unbindTexture(0, GL_TEXTURE_2D); 767 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
767 768
768 gGL.getTexUnit(0)->activate();
769 glDisable(GL_TEXTURE_GEN_S); 769 glDisable(GL_TEXTURE_GEN_S);
770 glDisable(GL_TEXTURE_GEN_T); 770 glDisable(GL_TEXTURE_GEN_T);
771 glMatrixMode(GL_TEXTURE); 771 glMatrixMode(GL_TEXTURE);
@@ -784,10 +784,10 @@ void LLDrawPoolTerrain::renderSimple()
784 784
785 // Stage 0: Base terrain texture pass 785 // Stage 0: Base terrain texture pass
786 mTexturep->addTextureStats(1024.f*1024.f); 786 mTexturep->addTextureStats(1024.f*1024.f);
787 mTexturep->bind(0);
788 787
789 gGL.getTexUnit(0)->activate(); 788 gGL.getTexUnit(0)->activate();
790 glEnable(GL_TEXTURE_2D); // Texture unit 2 789 gGL.getTexUnit(0)->enable(LLTexUnit::TT_TEXTURE);
790 gGL.getTexUnit(0)->bind(mTexturep.get());
791 791
792 LLVector3 origin_agent = mDrawFace[0]->getDrawable()->getVObj()->getRegion()->getOriginAgent(); 792 LLVector3 origin_agent = mDrawFace[0]->getDrawable()->getVObj()->getRegion()->getOriginAgent();
793 F32 tscale = 1.f/256.f; 793 F32 tscale = 1.f/256.f;
@@ -808,8 +808,8 @@ void LLDrawPoolTerrain::renderSimple()
808 //---------------------------------------------------------------------------- 808 //----------------------------------------------------------------------------
809 // Restore Texture Unit 0 defaults 809 // Restore Texture Unit 0 defaults
810 810
811 LLImageGL::unbindTexture(0, GL_TEXTURE_2D);
812 gGL.getTexUnit(0)->activate(); 811 gGL.getTexUnit(0)->activate();
812 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
813 glDisable(GL_TEXTURE_GEN_S); 813 glDisable(GL_TEXTURE_GEN_S);
814 glDisable(GL_TEXTURE_GEN_T); 814 glDisable(GL_TEXTURE_GEN_T);
815 glMatrixMode(GL_TEXTURE); 815 glMatrixMode(GL_TEXTURE);
@@ -839,7 +839,7 @@ void LLDrawPoolTerrain::renderOwnership()
839 LLViewerParcelOverlay *overlayp = regionp->getParcelOverlay(); 839 LLViewerParcelOverlay *overlayp = regionp->getParcelOverlay();
840 LLImageGL *texturep = overlayp->getTexture(); 840 LLImageGL *texturep = overlayp->getTexture();
841 841
842 LLViewerImage::bindTexture(texturep); 842 gGL.getTexUnit(0)->bind(texturep);
843 843
844 // *NOTE: Because the region is 256 meters wide, but has 257 pixels, the 844 // *NOTE: Because the region is 256 meters wide, but has 257 pixels, the
845 // texture coordinates for pixel 256x256 is not 1,1. This makes the 845 // texture coordinates for pixel 256x256 is not 1,1. This makes the
@@ -872,7 +872,7 @@ void LLDrawPoolTerrain::renderForSelect()
872 } 872 }
873 873
874 874
875 LLImageGL::unbindTexture(0); 875 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
876 876
877 for (std::vector<LLFace*>::iterator iter = mDrawFace.begin(); 877 for (std::vector<LLFace*>::iterator iter = mDrawFace.begin();
878 iter != mDrawFace.end(); iter++) 878 iter != mDrawFace.end(); iter++)
diff --git a/linden/indra/newview/lldrawpooltree.cpp b/linden/indra/newview/lldrawpooltree.cpp
index fd178dc..40ba54a 100644
--- a/linden/indra/newview/lldrawpooltree.cpp
+++ b/linden/indra/newview/lldrawpooltree.cpp
@@ -50,7 +50,7 @@ LLDrawPoolTree::LLDrawPoolTree(LLViewerImage *texturep) :
50 LLFacePool(POOL_TREE), 50 LLFacePool(POOL_TREE),
51 mTexturep(texturep) 51 mTexturep(texturep)
52{ 52{
53 mTexturep->bind(0); 53 gGL.getTexUnit(0)->bind(mTexturep.get());
54 mTexturep->setClamp(FALSE, FALSE); 54 mTexturep->setClamp(FALSE, FALSE);
55} 55}
56 56
@@ -124,6 +124,7 @@ void LLDrawPoolTree::renderForSelect()
124 LLOverrideFaceColor color(this, 1.f, 1.f, 1.f, 1.f); 124 LLOverrideFaceColor color(this, 1.f, 1.f, 1.f, 1.f);
125 125
126 LLGLSObjectSelectAlpha gls_alpha; 126 LLGLSObjectSelectAlpha gls_alpha;
127 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
127 128
128 gGL.setSceneBlendType(LLRender::BT_REPLACE); 129 gGL.setSceneBlendType(LLRender::BT_REPLACE);
129 gGL.setAlphaRejectSettings(LLRender::CF_GREATER, 0.5f); 130 gGL.setAlphaRejectSettings(LLRender::CF_GREATER, 0.5f);
@@ -144,7 +145,7 @@ void LLDrawPoolTree::renderTree(BOOL selecting)
144 LLGLState normalize(GL_NORMALIZE, TRUE); 145 LLGLState normalize(GL_NORMALIZE, TRUE);
145 146
146 // Bind the texture for this tree. 147 // Bind the texture for this tree.
147 LLViewerImage::bindTexture(mTexturep,sDiffTex); 148 gGL.getTexUnit(sDiffTex)->bind(mTexturep.get());
148 149
149 U32 indices_drawn = 0; 150 U32 indices_drawn = 0;
150 151
diff --git a/linden/indra/newview/lldrawpoolwater.cpp b/linden/indra/newview/lldrawpoolwater.cpp
index d8303bd..6e2c42a 100644
--- a/linden/indra/newview/lldrawpoolwater.cpp
+++ b/linden/indra/newview/lldrawpoolwater.cpp
@@ -68,11 +68,11 @@ LLDrawPoolWater::LLDrawPoolWater() :
68 LLFacePool(POOL_WATER) 68 LLFacePool(POOL_WATER)
69{ 69{
70 mHBTex[0] = gImageList.getImage(gSunTextureID, TRUE, TRUE); 70 mHBTex[0] = gImageList.getImage(gSunTextureID, TRUE, TRUE);
71 mHBTex[0]->bind(); 71 gGL.getTexUnit(0)->bind(mHBTex[0].get());
72 mHBTex[0]->setClamp(TRUE, TRUE); 72 mHBTex[0]->setClamp(TRUE, TRUE);
73 73
74 mHBTex[1] = gImageList.getImage(gMoonTextureID, TRUE, TRUE); 74 mHBTex[1] = gImageList.getImage(gMoonTextureID, TRUE, TRUE);
75 mHBTex[1]->bind(); 75 gGL.getTexUnit(0)->bind(mHBTex[1].get());
76 mHBTex[1]->setClamp(TRUE, TRUE); 76 mHBTex[1]->setClamp(TRUE, TRUE);
77 77
78 mWaterImagep = gImageList.getImage(WATER_TEST); 78 mWaterImagep = gImageList.getImage(WATER_TEST);
@@ -166,10 +166,9 @@ void LLDrawPoolWater::render(S32 pass)
166 166
167 // Set up second pass first 167 // Set up second pass first
168 mWaterImagep->addTextureStats(1024.f*1024.f); 168 mWaterImagep->addTextureStats(1024.f*1024.f);
169 mWaterImagep->bind(1);
170 gGL.getTexUnit(1)->activate(); 169 gGL.getTexUnit(1)->activate();
171 170 gGL.getTexUnit(1)->enable(LLTexUnit::TT_TEXTURE);
172 glEnable(GL_TEXTURE_2D); // Texture unit 1 171 gGL.getTexUnit(1)->bind(mWaterImagep.get());
173 172
174 LLVector3 camera_up = LLViewerCamera::getInstance()->getUpAxis(); 173 LLVector3 camera_up = LLViewerCamera::getInstance()->getUpAxis();
175 F32 up_dot = camera_up * LLVector3::z_axis; 174 F32 up_dot = camera_up * LLVector3::z_axis;
@@ -218,20 +217,20 @@ void LLDrawPoolWater::render(S32 pass)
218 { 217 {
219 continue; 218 continue;
220 } 219 }
221 face->bindTexture(); 220 gGL.getTexUnit(0)->bind(face->getTexture());
222 face->renderIndexed(); 221 face->renderIndexed();
223 } 222 }
224 223
225 // Now, disable texture coord generation on texture state 1 224 // Now, disable texture coord generation on texture state 1
226 gGL.getTexUnit(1)->activate(); 225 gGL.getTexUnit(1)->activate();
227 glDisable(GL_TEXTURE_2D); // Texture unit 1 226 gGL.getTexUnit(1)->unbind(LLTexUnit::TT_TEXTURE);
227 gGL.getTexUnit(1)->disable();
228 glDisable(GL_TEXTURE_GEN_S); //texture unit 1 228 glDisable(GL_TEXTURE_GEN_S); //texture unit 1
229 glDisable(GL_TEXTURE_GEN_T); //texture unit 1 229 glDisable(GL_TEXTURE_GEN_T); //texture unit 1
230 LLImageGL::unbindTexture(1, GL_TEXTURE_2D);
231 230
232 // Disable texture coordinate and color arrays 231 // Disable texture coordinate and color arrays
233 gGL.getTexUnit(0)->activate(); 232 gGL.getTexUnit(0)->activate();
234 LLImageGL::unbindTexture(0, GL_TEXTURE_2D); 233 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
235 234
236 stop_glerror(); 235 stop_glerror();
237 236
@@ -275,8 +274,9 @@ void LLDrawPoolWater::render(S32 pass)
275 { 274 {
276 gSky.mVOSkyp->getCubeMap()->disable(); 275 gSky.mVOSkyp->getCubeMap()->disable();
277 } 276 }
278 LLImageGL::unbindTexture(0, GL_TEXTURE_2D); 277
279 glEnable(GL_TEXTURE_2D); 278 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
279 gGL.getTexUnit(0)->enable(LLTexUnit::TT_TEXTURE);
280 glMatrixMode(GL_TEXTURE); 280 glMatrixMode(GL_TEXTURE);
281 glLoadIdentity(); 281 glLoadIdentity();
282 glMatrixMode(GL_MODELVIEW); 282 glMatrixMode(GL_MODELVIEW);
@@ -316,7 +316,7 @@ void LLDrawPoolWater::renderReflection(LLFace* face)
316 316
317 LLGLSNoFog noFog; 317 LLGLSNoFog noFog;
318 318
319 LLViewerImage::bindTexture(mHBTex[dr]); 319 gGL.getTexUnit(0)->bind(mHBTex[dr].get());
320 320
321 LLOverrideFaceColor override(this, face->getFaceColor().mV); 321 LLOverrideFaceColor override(this, face->getFaceColor().mV);
322 face->renderIndexed(); 322 face->renderIndexed();
@@ -390,7 +390,7 @@ void LLDrawPoolWater::shade()
390 if (reftex > -1) 390 if (reftex > -1)
391 { 391 {
392 gGL.getTexUnit(reftex)->activate(); 392 gGL.getTexUnit(reftex)->activate();
393 gPipeline.mWaterRef.bindTexture(); 393 gGL.getTexUnit(reftex)->bind(&gPipeline.mWaterRef);
394 gGL.getTexUnit(0)->activate(); 394 gGL.getTexUnit(0)->activate();
395 } 395 }
396 396
@@ -406,7 +406,7 @@ void LLDrawPoolWater::shade()
406 } 406 }
407 407
408 mWaterNormp->addTextureStats(1024.f*1024.f); 408 mWaterNormp->addTextureStats(1024.f*1024.f);
409 mWaterNormp->bind(bumpTex); 409 gGL.getTexUnit(bumpTex)->bind(mWaterNormp.get());
410 mWaterNormp->setMipFilterNearest (mWaterNormp->getMipFilterNearest(), 410 mWaterNormp->setMipFilterNearest (mWaterNormp->getMipFilterNearest(),
411 !gSavedSettings.getBOOL("RenderWaterMipNormal")); 411 !gSavedSettings.getBOOL("RenderWaterMipNormal"));
412 412
@@ -421,8 +421,8 @@ void LLDrawPoolWater::shade()
421 shader->uniform1f(LLViewerShaderMgr::WATER_FOGDENSITY, 421 shader->uniform1f(LLViewerShaderMgr::WATER_FOGDENSITY,
422 param_mgr->getFogDensity()); 422 param_mgr->getFogDensity());
423 } 423 }
424 424
425 gPipeline.mWaterDis.bindTexture(); 425 gGL.getTexUnit(screentex)->bind(&gPipeline.mWaterDis);
426 426
427 if (mVertexShaderLevel == 1) 427 if (mVertexShaderLevel == 1)
428 { 428 {
@@ -502,7 +502,7 @@ void LLDrawPoolWater::shade()
502 } 502 }
503 503
504 LLVOWater* water = (LLVOWater*) face->getViewerObject(); 504 LLVOWater* water = (LLVOWater*) face->getViewerObject();
505 face->bindTexture(diffTex); 505 gGL.getTexUnit(diffTex)->bind(face->getTexture());
506 506
507 sNeedsReflectionUpdate = TRUE; 507 sNeedsReflectionUpdate = TRUE;
508 508
@@ -527,7 +527,7 @@ void LLDrawPoolWater::shade()
527 } 527 }
528 } 528 }
529 529
530 shader->disableTexture(LLViewerShaderMgr::ENVIRONMENT_MAP, GL_TEXTURE_CUBE_MAP_ARB); 530 shader->disableTexture(LLViewerShaderMgr::ENVIRONMENT_MAP, LLTexUnit::TT_CUBE_MAP);
531 shader->disableTexture(LLViewerShaderMgr::WATER_SCREENTEX); 531 shader->disableTexture(LLViewerShaderMgr::WATER_SCREENTEX);
532 shader->disableTexture(LLViewerShaderMgr::BUMP_MAP); 532 shader->disableTexture(LLViewerShaderMgr::BUMP_MAP);
533 shader->disableTexture(LLViewerShaderMgr::DIFFUSE_MAP); 533 shader->disableTexture(LLViewerShaderMgr::DIFFUSE_MAP);
@@ -536,7 +536,7 @@ void LLDrawPoolWater::shade()
536 shader->unbind(); 536 shader->unbind();
537 537
538 gGL.getTexUnit(0)->activate(); 538 gGL.getTexUnit(0)->activate();
539 glEnable(GL_TEXTURE_2D); 539 gGL.getTexUnit(0)->enable(LLTexUnit::TT_TEXTURE);
540 gGL.setColorMask(true, false); 540 gGL.setColorMask(true, false);
541 541
542} 542}
diff --git a/linden/indra/newview/lldrawpoolwlsky.cpp b/linden/indra/newview/lldrawpoolwlsky.cpp
index 8802c1f..a8495d5 100644
--- a/linden/indra/newview/lldrawpoolwlsky.cpp
+++ b/linden/indra/newview/lldrawpoolwlsky.cpp
@@ -159,7 +159,7 @@ void LLDrawPoolWLSky::renderStars(void) const
159 // *NOTE: have to have bound the cloud noise texture already since register 159 // *NOTE: have to have bound the cloud noise texture already since register
160 // combiners blending below requires something to be bound 160 // combiners blending below requires something to be bound
161 // and we might as well only bind once. 161 // and we might as well only bind once.
162 //LLGLEnable gl_texture_2d(GL_TEXTURE_2D); 162 //gGL.getTexUnit(0)->enable(LLTexUnit::TT_TEXTURE);
163 163
164 gPipeline.disableLights(); 164 gPipeline.disableLights();
165 165
@@ -202,7 +202,8 @@ void LLDrawPoolWLSky::renderSkyClouds(F32 camHeightLocal) const
202 LLGLSBlendFunc blendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 202 LLGLSBlendFunc blendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
203 gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT); 203 gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT);
204 204
205 sCloudNoiseTexture->bind(); 205 gGL.getTexUnit(0)->bind(sCloudNoiseTexture);
206
206 shader->bind(); 207 shader->bind();
207 208
208 /// Render the skydome 209 /// Render the skydome
@@ -223,7 +224,7 @@ void LLDrawPoolWLSky::renderHeavenlyBodies()
223 if (gSky.mVOSkyp->getSun().getDraw() && face->getGeomCount()) 224 if (gSky.mVOSkyp->getSun().getDraw() && face->getGeomCount())
224 { 225 {
225 LLImageGL * tex = face->getTexture(); 226 LLImageGL * tex = face->getTexture();
226 tex->bind(); 227 gGL.getTexUnit(0)->bind(tex);
227 LLColor4 color(gSky.mVOSkyp->getSun().getInterpColor()); 228 LLColor4 color(gSky.mVOSkyp->getSun().getInterpColor());
228 LLFacePool::LLOverrideFaceColor color_override(this, color); 229 LLFacePool::LLOverrideFaceColor color_override(this, color);
229 face->renderIndexed(); 230 face->renderIndexed();
@@ -238,7 +239,7 @@ void LLDrawPoolWLSky::renderHeavenlyBodies()
238 // stars register combiners, we bind again here for defensive reasons, 239 // stars register combiners, we bind again here for defensive reasons,
239 // since LLImageGL::bind detects that it's a noop, and optimizes it out. 240 // since LLImageGL::bind detects that it's a noop, and optimizes it out.
240 LLImageGL * tex = face->getTexture(); 241 LLImageGL * tex = face->getTexture();
241 tex->bind(); 242 gGL.getTexUnit(0)->bind(tex);
242 LLColor4 color(gSky.mVOSkyp->getMoon().getInterpColor()); 243 LLColor4 color(gSky.mVOSkyp->getMoon().getInterpColor());
243 F32 a = gSky.mVOSkyp->getMoon().getDirection().mV[2]; 244 F32 a = gSky.mVOSkyp->getMoon().getDirection().mV[2];
244 if (a > 0.f) 245 if (a > 0.f)
@@ -280,7 +281,7 @@ void LLDrawPoolWLSky::render(S32 pass)
280 // renderStars() requires something to be bound and we might as well only 281 // renderStars() requires something to be bound and we might as well only
281 // bind the moon's texture once. 282 // bind the moon's texture once.
282 LLImageGL * tex = gSky.mVOSkyp->mFace[LLVOSky::FACE_MOON]->getTexture(); 283 LLImageGL * tex = gSky.mVOSkyp->mFace[LLVOSky::FACE_MOON]->getTexture();
283 tex->bind(); 284 gGL.getTexUnit(0)->bind(tex);
284 285
285 renderHeavenlyBodies(); 286 renderHeavenlyBodies();
286 287
@@ -291,7 +292,7 @@ void LLDrawPoolWLSky::render(S32 pass)
291 292
292 renderSkyClouds(camHeightLocal); 293 renderSkyClouds(camHeightLocal);
293 294
294 LLImageGL::unbindTexture(0); 295 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
295} 296}
296 297
297void LLDrawPoolWLSky::prerender() 298void LLDrawPoolWLSky::prerender()
diff --git a/linden/indra/newview/lldynamictexture.cpp b/linden/indra/newview/lldynamictexture.cpp
index ad0cdec..9ce4515 100644
--- a/linden/indra/newview/lldynamictexture.cpp
+++ b/linden/indra/newview/lldynamictexture.cpp
@@ -32,7 +32,6 @@
32#include "llviewerprecompiledheaders.h" 32#include "llviewerprecompiledheaders.h"
33 33
34#include "lldynamictexture.h" 34#include "lldynamictexture.h"
35#include "llimagegl.h"
36#include "llglheaders.h" 35#include "llglheaders.h"
37#include "llviewerwindow.h" 36#include "llviewerwindow.h"
38#include "llviewercamera.h" 37#include "llviewercamera.h"
@@ -105,7 +104,7 @@ void LLDynamicTexture::generateGLTexture(LLGLint internal_format, LLGLenum prima
105 } 104 }
106 releaseGLTexture(); 105 releaseGLTexture();
107 LLPointer<LLImageRaw> raw_image = new LLImageRaw(mWidth, mHeight, mComponents); 106 LLPointer<LLImageRaw> raw_image = new LLImageRaw(mWidth, mHeight, mComponents);
108 mTexture = new LLImageGL(mWidth, mHeight, mComponents, FALSE); 107 mTexture = new LLViewerImage(mWidth, mHeight, mComponents, FALSE);
109 if (internal_format >= 0) 108 if (internal_format >= 0)
110 { 109 {
111 mTexture->setExplicitFormat(internal_format, primary_format, type_format, swap_bytes); 110 mTexture->setExplicitFormat(internal_format, primary_format, type_format, swap_bytes);
@@ -113,6 +112,7 @@ void LLDynamicTexture::generateGLTexture(LLGLint internal_format, LLGLenum prima
113// llinfos << "ALLOCATING " << (mWidth*mHeight*mComponents)/1024 << "K" << llendl; 112// llinfos << "ALLOCATING " << (mWidth*mHeight*mComponents)/1024 << "K" << llendl;
114 mTexture->createGLTexture(0, raw_image); 113 mTexture->createGLTexture(0, raw_image);
115 mTexture->setClamp(mClamp, mClamp); 114 mTexture->setClamp(mClamp, mClamp);
115 mTexture->setInitialized(false);
116} 116}
117 117
118//----------------------------------------------------------------------------- 118//-----------------------------------------------------------------------------
@@ -144,7 +144,7 @@ void LLDynamicTexture::preRender(BOOL clear_depth)
144 mOrigin.mY = llmax(mOrigin.mY, 0) ; 144 mOrigin.mY = llmax(mOrigin.mY, 0) ;
145 } 145 }
146 146
147 LLImageGL::unbindTexture(0, GL_TEXTURE_2D); 147 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
148 } 148 }
149 // Set up camera 149 // Set up camera
150 mCamera.setOrigin(*LLViewerCamera::getInstance()); 150 mCamera.setOrigin(*LLViewerCamera::getInstance());
@@ -184,19 +184,6 @@ void LLDynamicTexture::postRender(BOOL success)
184} 184}
185 185
186//----------------------------------------------------------------------------- 186//-----------------------------------------------------------------------------
187// bindTexture()
188//-----------------------------------------------------------------------------
189void LLDynamicTexture::bindTexture()
190{
191 LLViewerImage::bindTexture(mTexture,0);
192}
193
194void LLDynamicTexture::unbindTexture()
195{
196 LLImageGL::unbindTexture(0, GL_TEXTURE_2D);
197}
198
199//-----------------------------------------------------------------------------
200// static 187// static
201// updateDynamicTextures() 188// updateDynamicTextures()
202// Calls update on each dynamic texture. Calls each group in order: "first," then "middle," then "last." 189// Calls update on each dynamic texture. Calls each group in order: "first," then "middle," then "last."
diff --git a/linden/indra/newview/lldynamictexture.h b/linden/indra/newview/lldynamictexture.h
index 6069940..ff3e5c1 100644
--- a/linden/indra/newview/lldynamictexture.h
+++ b/linden/indra/newview/lldynamictexture.h
@@ -60,8 +60,8 @@ public:
60 virtual void preRender(BOOL clear_depth = TRUE); 60 virtual void preRender(BOOL clear_depth = TRUE);
61 virtual BOOL render(); 61 virtual BOOL render();
62 virtual void postRender(BOOL success); 62 virtual void postRender(BOOL success);
63 virtual void bindTexture(); 63
64 virtual void unbindTexture(); 64 LLImageGL* getTexture(void) const { return mTexture; }
65 65
66 static BOOL updateAllInstances(); 66 static BOOL updateAllInstances();
67 67
diff --git a/linden/indra/newview/llface.cpp b/linden/indra/newview/llface.cpp
index 5b43fcd..3b5f8ab 100644
--- a/linden/indra/newview/llface.cpp
+++ b/linden/indra/newview/llface.cpp
@@ -362,10 +362,10 @@ void LLFace::renderForSelect(U32 data_mask)
362 switch (getPoolType()) 362 switch (getPoolType())
363 { 363 {
364 case LLDrawPool::POOL_ALPHA: 364 case LLDrawPool::POOL_ALPHA:
365 getTexture()->bind(); 365 gGL.getTexUnit(0)->bind(getTexture());
366 break; 366 break;
367 default: 367 default:
368 LLImageGL::unbindTexture(0); 368 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
369 break; 369 break;
370 } 370 }
371 } 371 }
@@ -390,19 +390,19 @@ void LLFace::renderForSelect(U32 data_mask)
390 { 390 {
391 glPushMatrix(); 391 glPushMatrix();
392 glMultMatrixf((float*) mDrawablep->getRegion()->mRenderMatrix.mMatrix); 392 glMultMatrixf((float*) mDrawablep->getRegion()->mRenderMatrix.mMatrix);
393 mVertexBuffer->draw(LLVertexBuffer::TRIANGLES, mIndicesCount, mIndicesIndex); 393 mVertexBuffer->draw(LLRender::TRIANGLES, mIndicesCount, mIndicesIndex);
394 glPopMatrix(); 394 glPopMatrix();
395 } 395 }
396 else 396 else
397 { 397 {
398 mVertexBuffer->draw(LLVertexBuffer::TRIANGLES, mIndicesCount, mIndicesIndex); 398 mVertexBuffer->draw(LLRender::TRIANGLES, mIndicesCount, mIndicesIndex);
399 } 399 }
400 } 400 }
401 else 401 else
402 { 402 {
403 glPushMatrix(); 403 glPushMatrix();
404 glMultMatrixf((float*)getRenderMatrix().mMatrix); 404 glMultMatrixf((float*)getRenderMatrix().mMatrix);
405 mVertexBuffer->draw(LLVertexBuffer::TRIANGLES, mIndicesCount, mIndicesIndex); 405 mVertexBuffer->draw(LLRender::TRIANGLES, mIndicesCount, mIndicesIndex);
406 glPopMatrix(); 406 glPopMatrix();
407 } 407 }
408 } 408 }
@@ -419,7 +419,7 @@ void LLFace::renderSelected(LLImageGL *imagep, const LLColor4& color)
419 419
420 if (mGeomCount > 0 && mIndicesCount > 0) 420 if (mGeomCount > 0 && mIndicesCount > 0)
421 { 421 {
422 LLViewerImage::bindTexture(imagep); 422 gGL.getTexUnit(0)->bind(imagep);
423 423
424 gGL.pushMatrix(); 424 gGL.pushMatrix();
425 if (mDrawablep->isActive()) 425 if (mDrawablep->isActive())
@@ -438,7 +438,7 @@ void LLFace::renderSelected(LLImageGL *imagep, const LLColor4& color)
438#if !LL_RELEASE_FOR_DOWNLOAD 438#if !LL_RELEASE_FOR_DOWNLOAD
439 LLGLState::checkClientArrays("", LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD); 439 LLGLState::checkClientArrays("", LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD);
440#endif 440#endif
441 mVertexBuffer->draw(LLVertexBuffer::TRIANGLES, mIndicesCount, mIndicesIndex); 441 mVertexBuffer->draw(LLRender::TRIANGLES, mIndicesCount, mIndicesIndex);
442 442
443 unsetFaceColor(); 443 unsetFaceColor();
444 gGL.popMatrix(); 444 gGL.popMatrix();
@@ -1203,7 +1203,7 @@ S32 LLFace::pushVertices(const U16* index_array) const
1203{ 1203{
1204 if (mIndicesCount) 1204 if (mIndicesCount)
1205 { 1205 {
1206 mVertexBuffer->drawRange(LLVertexBuffer::TRIANGLES, mGeomIndex, mGeomIndex+mGeomCount-1, mIndicesCount, mIndicesIndex); 1206 mVertexBuffer->drawRange(LLRender::TRIANGLES, mGeomIndex, mGeomIndex+mGeomCount-1, mIndicesCount, mIndicesIndex);
1207 gPipeline.addTrianglesDrawn(mIndicesCount/3); 1207 gPipeline.addTrianglesDrawn(mIndicesCount/3);
1208 } 1208 }
1209 1209
diff --git a/linden/indra/newview/llface.h b/linden/indra/newview/llface.h
index 0501dcc..497b93c 100644
--- a/linden/indra/newview/llface.h
+++ b/linden/indra/newview/llface.h
@@ -101,7 +101,6 @@ public:
101 void setPixelArea(F32 area) { mPixelArea = area; } 101 void setPixelArea(F32 area) { mPixelArea = area; }
102 F32 getVirtualSize() const { return mVSize; } 102 F32 getVirtualSize() const { return mVSize; }
103 F32 getPixelArea() const { return mPixelArea; } 103 F32 getPixelArea() const { return mPixelArea; }
104 void bindTexture(S32 stage = 0) const { LLViewerImage::bindTexture(mTexture, stage); }
105 104
106 void renderSetColor() const; 105 void renderSetColor() const;
107 S32 renderElements(const U16 *index_array) const; 106 S32 renderElements(const U16 *index_array) const;
@@ -120,6 +119,7 @@ public:
120 LLVertexBuffer* getVertexBuffer() const { return mVertexBuffer; } 119 LLVertexBuffer* getVertexBuffer() const { return mVertexBuffer; }
121 void setPoolType(U32 type) { mPoolType = type; } 120 void setPoolType(U32 type) { mPoolType = type; }
122 S32 getTEOffset() { return mTEOffset; } 121 S32 getTEOffset() { return mTEOffset; }
122 LLViewerImage* getTexture() { return mTexture; }
123 123
124 void setViewerObject(LLViewerObject* object); 124 void setViewerObject(LLViewerObject* object);
125 void setPool(LLFacePool *pool, LLViewerImage *texturep); 125 void setPool(LLFacePool *pool, LLViewerImage *texturep);
diff --git a/linden/indra/newview/llface.inl b/linden/indra/newview/llface.inl
index 8f8cfaf..7e9c9c1 100644
--- a/linden/indra/newview/llface.inl
+++ b/linden/indra/newview/llface.inl
@@ -33,6 +33,7 @@
33#define LL_LLFACE_INL 33#define LL_LLFACE_INL
34 34
35#include "llglheaders.h" 35#include "llglheaders.h"
36#include "llrender.h"
36 37
37inline BOOL LLFace::getDirty() const 38inline BOOL LLFace::getDirty() const
38{ 39{
diff --git a/linden/indra/newview/llfasttimerview.cpp b/linden/indra/newview/llfasttimerview.cpp
index f1ca99f..4449adf 100644
--- a/linden/indra/newview/llfasttimerview.cpp
+++ b/linden/indra/newview/llfasttimerview.cpp
@@ -116,6 +116,7 @@ static struct ft_display_info ft_display_table[] =
116 { LLFastTimer::FTM_VFILE_WAIT, " VFile Wait", &LLColor4::cyan6, 0 }, 116 { LLFastTimer::FTM_VFILE_WAIT, " VFile Wait", &LLColor4::cyan6, 0 },
117// { LLFastTimer::FTM_IDLE_CB, " Callbacks", &LLColor4::pink1, 0 }, 117// { LLFastTimer::FTM_IDLE_CB, " Callbacks", &LLColor4::pink1, 0 },
118 { LLFastTimer::FTM_RENDER, " Render", &green0, 1 }, 118 { LLFastTimer::FTM_RENDER, " Render", &green0, 1 },
119 { LLFastTimer::FTM_PICK, " Pick", &LLColor4::purple, 1 },
119 { LLFastTimer::FTM_HUD_EFFECTS, " HUD Effects", &LLColor4::orange1, 0 }, 120 { LLFastTimer::FTM_HUD_EFFECTS, " HUD Effects", &LLColor4::orange1, 0 },
120 { LLFastTimer::FTM_HUD_UPDATE, " HUD Update", &LLColor4::orange2, 0 }, 121 { LLFastTimer::FTM_HUD_UPDATE, " HUD Update", &LLColor4::orange2, 0 },
121 { LLFastTimer::FTM_UPDATE_SKY, " Sky Update", &LLColor4::cyan1, 0 }, 122 { LLFastTimer::FTM_UPDATE_SKY, " Sky Update", &LLColor4::cyan1, 0 },
@@ -463,7 +464,7 @@ void LLFastTimerView::draw()
463 464
464 // Draw the window background 465 // Draw the window background
465 { 466 {
466 LLGLSNoTexture gls_ui_no_texture; 467 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
467 gl_rect_2d(0, getRect().getHeight(), getRect().getWidth(), 0, LLColor4(0.f, 0.f, 0.f, 0.25f)); 468 gl_rect_2d(0, getRect().getHeight(), getRect().getWidth(), 0, LLColor4(0.f, 0.f, 0.f, 0.25f));
468 } 469 }
469 470
@@ -755,7 +756,7 @@ void LLFastTimerView::draw()
755 LLRect graph_rect; 756 LLRect graph_rect;
756 // Draw borders 757 // Draw borders
757 { 758 {
758 LLGLSNoTexture gls_ui_no_texture; 759 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
759 gGL.color4f(0.5f,0.5f,0.5f,0.5f); 760 gGL.color4f(0.5f,0.5f,0.5f,0.5f);
760 761
761 S32 by = y + 2; 762 S32 by = y + 2;
@@ -792,7 +793,7 @@ void LLFastTimerView::draw()
792 793
793 // Draw bars for each history entry 794 // Draw bars for each history entry
794 // Special: -1 = show running average 795 // Special: -1 = show running average
795 LLViewerImage::bindTexture(box_imagep->getImage()); 796 gGL.getTexUnit(0)->bind(box_imagep->getImage());
796 for (S32 j=-1; j<histmax && y > LINE_GRAPH_HEIGHT; j++) 797 for (S32 j=-1; j<histmax && y > LINE_GRAPH_HEIGHT; j++)
797 { 798 {
798 int sublevel_dx[FTV_DISPLAY_NUM+1]; 799 int sublevel_dx[FTV_DISPLAY_NUM+1];
@@ -936,7 +937,7 @@ void LLFastTimerView::draw()
936 937
937 //draw line graph history 938 //draw line graph history
938 { 939 {
939 LLGLSNoTexture no_texture; 940 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
940 LLLocalClipRect clip(graph_rect); 941 LLLocalClipRect clip(graph_rect);
941 942
942 //normalize based on last frame's maximum 943 //normalize based on last frame's maximum
@@ -980,7 +981,7 @@ void LLFastTimerView::draw()
980 981
981 gGL.color4f(0.5f,0.5f,0.5f,1); 982 gGL.color4f(0.5f,0.5f,0.5f,1);
982 983
983 gGL.begin(LLVertexBuffer::LINES); 984 gGL.begin(LLRender::LINES);
984 gGL.vertex2i((S32)bar, graph_rect.mBottom); 985 gGL.vertex2i((S32)bar, graph_rect.mBottom);
985 gGL.vertex2i((S32)bar, graph_rect.mTop); 986 gGL.vertex2i((S32)bar, graph_rect.mTop);
986 gGL.end(); 987 gGL.end();
@@ -1016,7 +1017,7 @@ void LLFastTimerView::draw()
1016 } 1017 }
1017 1018
1018 gGL.color4f(col[0], col[1], col[2], alpha); 1019 gGL.color4f(col[0], col[1], col[2], alpha);
1019 gGL.begin(LLVertexBuffer::LINE_STRIP); 1020 gGL.begin(LLRender::LINE_STRIP);
1020 for (U32 j = 0; j < LLFastTimer::FTM_HISTORY_NUM; j++) 1021 for (U32 j = 0; j < LLFastTimer::FTM_HISTORY_NUM; j++)
1021 { 1022 {
1022 U64 ticks = ticks_sum[j+1][idx]; 1023 U64 ticks = ticks_sum[j+1][idx];
diff --git a/linden/indra/newview/llfeaturemanager.cpp b/linden/indra/newview/llfeaturemanager.cpp
index a3da4f5..7883953 100644
--- a/linden/indra/newview/llfeaturemanager.cpp
+++ b/linden/indra/newview/llfeaturemanager.cpp
@@ -447,8 +447,6 @@ void LLFeatureManager::applyRecommendedSettings()
447 { 447 {
448 gSavedSettings.setF32("RenderFarClip", 128.0f); 448 gSavedSettings.setF32("RenderFarClip", 128.0f);
449 } 449 }
450
451
452} 450}
453 451
454void LLFeatureManager::applyFeatures(bool skipFeatures) 452void LLFeatureManager::applyFeatures(bool skipFeatures)
diff --git a/linden/indra/newview/llfilepicker.cpp b/linden/indra/newview/llfilepicker.cpp
index bbcfba6..088da4b 100644
--- a/linden/indra/newview/llfilepicker.cpp
+++ b/linden/indra/newview/llfilepicker.cpp
@@ -933,7 +933,7 @@ void LLFilePicker::chooser_responder(GtkWidget *widget, gint response, gpointer
933 933
934GtkWindow* LLFilePicker::buildFilePicker(bool is_save, bool is_folder, std::string context) 934GtkWindow* LLFilePicker::buildFilePicker(bool is_save, bool is_folder, std::string context)
935{ 935{
936 if (ll_try_gtk_init() && 936 if (LLWindowSDL::ll_try_gtk_init() &&
937 ! gViewerWindow->getWindow()->getFullscreen()) 937 ! gViewerWindow->getWindow()->getFullscreen())
938 { 938 {
939 GtkWidget *win = NULL; 939 GtkWidget *win = NULL;
@@ -974,7 +974,7 @@ GtkWindow* LLFilePicker::buildFilePicker(bool is_save, bool is_folder, std::stri
974 // Make GTK tell the window manager to associate this 974 // Make GTK tell the window manager to associate this
975 // dialog with our non-GTK raw X11 window, which should try 975 // dialog with our non-GTK raw X11 window, which should try
976 // to keep it on top etc. 976 // to keep it on top etc.
977 Window XWindowID = get_SDL_XWindowID(); 977 Window XWindowID = LLWindowSDL::get_SDL_XWindowID();
978 if (None != XWindowID) 978 if (None != XWindowID)
979 { 979 {
980 gtk_widget_realize(GTK_WIDGET(win)); // so we can get its gdkwin 980 gtk_widget_realize(GTK_WIDGET(win)); // so we can get its gdkwin
diff --git a/linden/indra/newview/llfloateractivespeakers.cpp b/linden/indra/newview/llfloateractivespeakers.cpp
index 2352be3..bee6155 100644
--- a/linden/indra/newview/llfloateractivespeakers.cpp
+++ b/linden/indra/newview/llfloateractivespeakers.cpp
@@ -47,6 +47,7 @@
47#include "llsdutil.h" 47#include "llsdutil.h"
48#include "llimview.h" 48#include "llimview.h"
49#include "llviewerwindow.h" 49#include "llviewerwindow.h"
50#include "llappviewer.h"
50 51
51const F32 SPEAKER_TIMEOUT = 10.f; // seconds of not being on voice channel before removed from list of active speakers 52const F32 SPEAKER_TIMEOUT = 10.f; // seconds of not being on voice channel before removed from list of active speakers
52const F32 RESORT_TIMEOUT = 5.f; // seconds of mouse inactivity before it's ok to sort regardless of mouse-in-view. 53const F32 RESORT_TIMEOUT = 5.f; // seconds of mouse inactivity before it's ok to sort regardless of mouse-in-view.
@@ -1358,6 +1359,11 @@ void LLLocalSpeakerMgr::updateSpeakerList()
1358 // pull speakers from voice channel 1359 // pull speakers from voice channel
1359 LLSpeakerMgr::updateSpeakerList(); 1360 LLSpeakerMgr::updateSpeakerList();
1360 1361
1362 if (gDisconnected)//the world is cleared.
1363 {
1364 return ;
1365 }
1366
1361 // add non-voice speakers in chat range 1367 // add non-voice speakers in chat range
1362 std::vector< LLCharacter* >::iterator avatar_it; 1368 std::vector< LLCharacter* >::iterator avatar_it;
1363 for(avatar_it = LLCharacter::sInstances.begin(); avatar_it != LLCharacter::sInstances.end(); ++avatar_it) 1369 for(avatar_it = LLCharacter::sInstances.begin(); avatar_it != LLCharacter::sInstances.end(); ++avatar_it)
diff --git a/linden/indra/newview/llfloateranimpreview.cpp b/linden/indra/newview/llfloateranimpreview.cpp
index 66b7a56..95c18df 100644
--- a/linden/indra/newview/llfloateranimpreview.cpp
+++ b/linden/indra/newview/llfloateranimpreview.cpp
@@ -384,9 +384,10 @@ void LLFloaterAnimPreview::draw()
384 if (mMotionID.notNull() && mAnimPreview) 384 if (mMotionID.notNull() && mAnimPreview)
385 { 385 {
386 gGL.color3f(1.f, 1.f, 1.f); 386 gGL.color3f(1.f, 1.f, 1.f);
387 mAnimPreview->bindTexture();
388 387
389 gGL.begin( LLVertexBuffer::QUADS ); 388 gGL.getTexUnit(0)->bind(mAnimPreview->getTexture());
389
390 gGL.begin( LLRender::QUADS );
390 { 391 {
391 gGL.texCoord2f(0.f, 1.f); 392 gGL.texCoord2f(0.f, 1.f);
392 gGL.vertex2i(PREVIEW_HPAD, PREVIEW_TEXTURE_HEIGHT); 393 gGL.vertex2i(PREVIEW_HPAD, PREVIEW_TEXTURE_HEIGHT);
@@ -399,7 +400,7 @@ void LLFloaterAnimPreview::draw()
399 } 400 }
400 gGL.end(); 401 gGL.end();
401 402
402 mAnimPreview->unbindTexture(); 403 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
403 404
404 LLVOAvatar* avatarp = mAnimPreview->getDummyAvatar(); 405 LLVOAvatar* avatarp = mAnimPreview->getDummyAvatar();
405 if (!avatarp->areAnimationsPaused()) 406 if (!avatarp->areAnimationsPaused())
@@ -1068,7 +1069,7 @@ BOOL LLPreviewAnimation::render()
1068 glLoadIdentity(); 1069 glLoadIdentity();
1069 1070
1070 LLGLSUIDefault def; 1071 LLGLSUIDefault def;
1071 LLGLSNoTexture gls_no_texture; 1072 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
1072 gGL.color4f(0.15f, 0.2f, 0.3f, 1.f); 1073 gGL.color4f(0.15f, 0.2f, 0.3f, 1.f);
1073 1074
1074 gl_rect_2d_simple( mWidth, mHeight ); 1075 gl_rect_2d_simple( mWidth, mHeight );
diff --git a/linden/indra/newview/llfloaterauction.cpp b/linden/indra/newview/llfloaterauction.cpp
index 80c43ab..a5929fd 100644
--- a/linden/indra/newview/llfloaterauction.cpp
+++ b/linden/indra/newview/llfloaterauction.cpp
@@ -148,7 +148,7 @@ void LLFloaterAuction::draw()
148 if (childGetRect("snapshot_icon", rect)) 148 if (childGetRect("snapshot_icon", rect))
149 { 149 {
150 { 150 {
151 LLGLSNoTexture gls_no_texture; 151 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
152 gl_rect_2d(rect, LLColor4(0.f, 0.f, 0.f, 1.f)); 152 gl_rect_2d(rect, LLColor4(0.f, 0.f, 0.f, 1.f));
153 rect.stretch(-1); 153 rect.stretch(-1);
154 } 154 }
@@ -205,7 +205,7 @@ void LLFloaterAuction::onClickSnapshot(void* data)
205 LLVFile::writeFile(j2c->getData(), j2c->getDataSize(), gVFS, self->mImageID, LLAssetType::AT_TEXTURE); 205 LLVFile::writeFile(j2c->getData(), j2c->getDataSize(), gVFS, self->mImageID, LLAssetType::AT_TEXTURE);
206 206
207 self->mImage = new LLImageGL((LLImageRaw*)raw, FALSE); 207 self->mImage = new LLImageGL((LLImageRaw*)raw, FALSE);
208 self->mImage->bind(); 208 gGL.getTexUnit(0)->bind(self->mImage);
209 self->mImage->setClamp(TRUE, TRUE); 209 self->mImage->setClamp(TRUE, TRUE);
210 } 210 }
211 else 211 else
diff --git a/linden/indra/newview/llfloaterbeacons.cpp b/linden/indra/newview/llfloaterbeacons.cpp
new file mode 100644
index 0000000..0b73186
--- /dev/null
+++ b/linden/indra/newview/llfloaterbeacons.cpp
@@ -0,0 +1,150 @@
1/**
2 * @file llfloaterbeacons.cpp
3 * @brief Front-end to LLPipeline controls for highlighting various kinds of objects.
4 * @author Coco
5 *
6 * $LicenseInfo:firstyear=2001&license=viewergpl$
7 *
8 * Copyright (c) 2001-2008, Linden Research, Inc.
9 *
10 * Second Life Viewer Source Code
11 * The source code in this file ("Source Code") is provided by Linden Lab
12 * to you under the terms of the GNU General Public License, version 2.0
13 * ("GPL"), unless you have obtained a separate licensing agreement
14 * ("Other License"), formally executed by you and Linden Lab. Terms of
15 * the GPL can be found in doc/GPL-license.txt in this distribution, or
16 * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
17 *
18 * There are special exceptions to the terms and conditions of the GPL as
19 * it is applied to this Source Code. View the full text of the exception
20 * in the file doc/FLOSS-exception.txt in this software distribution, or
21 * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception
22 *
23 * By copying, modifying or distributing this software, you acknowledge
24 * that you have read and understood your obligations described above,
25 * and agree to abide by those obligations.
26 *
27 * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
28 * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
29 * COMPLETENESS OR PERFORMANCE.
30 * $/LicenseInfo$
31 */
32
33#include "llviewerprecompiledheaders.h"
34#include "llfloaterbeacons.h"
35#include "llviewercontrol.h"
36#include "lluictrlfactory.h"
37#include "llcheckboxctrl.h"
38#include "pipeline.h"
39
40
41LLFloaterBeacons::LLFloaterBeacons(const LLSD& seed)
42{
43 LLUICtrlFactory::getInstance()->buildFloater(this, "floater_beacons.xml");
44
45 // Initialize pipeline states from saved settings.
46 // OK to do at floater constructor time because beacons do not display unless the floater is open
47 // therefore it is OK to not initialize the pipeline state before needed.
48 // Note also that we should replace those pipeline statics with direct lookup of the saved settings
49 // eliminating the need to keep these states in sync.
50 LLPipeline::setRenderScriptedTouchBeacons(gSavedSettings.getBOOL("scripttouchbeacon"));
51 LLPipeline::setRenderScriptedBeacons( gSavedSettings.getBOOL("scriptsbeacon"));
52 LLPipeline::setRenderPhysicalBeacons( gSavedSettings.getBOOL("physicalbeacon"));
53 LLPipeline::setRenderSoundBeacons( gSavedSettings.getBOOL("soundsbeacon"));
54 LLPipeline::setRenderParticleBeacons( gSavedSettings.getBOOL("particlesbeacon"));
55 LLPipeline::setRenderHighlights( gSavedSettings.getBOOL("renderhighlights"));
56 LLPipeline::setRenderBeacons( gSavedSettings.getBOOL("renderbeacons"));
57}
58
59BOOL LLFloaterBeacons::postBuild()
60{
61 childSetCommitCallback("touch_only", onClickUICheck, this);
62 childSetCommitCallback("scripted", onClickUICheck, this);
63 childSetCommitCallback("physical", onClickUICheck, this);
64 childSetCommitCallback("sounds", onClickUICheck, this);
65 childSetCommitCallback("particles", onClickUICheck, this);
66 childSetCommitCallback("highlights", onClickUICheck, this);
67 childSetCommitCallback("beacons", onClickUICheck, this);
68 return TRUE;
69}
70
71// Needed to make the floater visibility toggle the beacons.
72// Too bad we can't just add control_name="BeaconAlwaysOn" to the XML.
73void LLFloaterBeacons::open()
74{
75 LLFloater::open();
76 gSavedSettings.setBOOL( "BeaconAlwaysOn", TRUE);
77}
78void LLFloaterBeacons::close(bool app_quitting)
79{
80 LLFloater::close(app_quitting);
81 if(!app_quitting)
82 {
83 gSavedSettings.setBOOL( "BeaconAlwaysOn", FALSE);
84 }
85}
86
87// Callback attached to each check box control to both affect their main purpose
88// and to implement the couple screwy interdependency rules that some have.
89//static
90void LLFloaterBeacons::onClickUICheck(LLUICtrl *ctrl, void* data)
91{
92 LLCheckBoxCtrl *check = (LLCheckBoxCtrl *)ctrl;
93 std::string name = check->getName();
94 LLFloaterBeacons* view = (LLFloaterBeacons*)data;
95 if( name == "touch_only")
96 {
97 LLPipeline::toggleRenderScriptedTouchBeacons(NULL);
98 // Don't allow both to be ON at the same time. Toggle the other one off if both now on.
99 if (
100 LLPipeline::getRenderScriptedTouchBeacons(NULL) &&
101 LLPipeline::getRenderScriptedBeacons(NULL) )
102 {
103 LLPipeline::setRenderScriptedBeacons(FALSE);
104 view->getChild<LLCheckBoxCtrl>("scripted")->setControlValue(LLSD(FALSE));
105 view->getChild<LLCheckBoxCtrl>("touch_only")->setControlValue(LLSD(TRUE)); // just to be sure it's in sync with llpipeline
106 }
107 }
108 else if(name == "scripted")
109 {
110 LLPipeline::toggleRenderScriptedBeacons(NULL);
111 // Don't allow both to be ON at the same time. Toggle the other one off if both now on.
112 if (
113 LLPipeline::getRenderScriptedTouchBeacons(NULL) &&
114 LLPipeline::getRenderScriptedBeacons(NULL) )
115 {
116 LLPipeline::setRenderScriptedTouchBeacons(FALSE);
117 view->getChild<LLCheckBoxCtrl>("touch_only")->setControlValue(LLSD(FALSE));
118 view->getChild<LLCheckBoxCtrl>("scripted")->setControlValue(LLSD(TRUE)); // just to be sure it's in sync with llpipeline
119 }
120 }
121 else if(name == "physical") LLPipeline::setRenderPhysicalBeacons(check->get());
122 else if(name == "sounds") LLPipeline::setRenderSoundBeacons(check->get());
123 else if(name == "particles") LLPipeline::setRenderParticleBeacons(check->get());
124 else if(name == "highlights")
125 {
126 LLPipeline::toggleRenderHighlights(NULL);
127 // Don't allow both to be OFF at the same time. Toggle the other one on if both now off.
128 if (
129 !LLPipeline::getRenderBeacons(NULL) &&
130 !LLPipeline::getRenderHighlights(NULL) )
131 {
132 LLPipeline::setRenderBeacons(TRUE);
133 view->getChild<LLCheckBoxCtrl>("beacons")->setControlValue(LLSD(TRUE));
134 view->getChild<LLCheckBoxCtrl>("highlights")->setControlValue(LLSD(FALSE)); // just to be sure it's in sync with llpipeline
135 }
136 }
137 else if(name == "beacons")
138 {
139 LLPipeline::toggleRenderBeacons(NULL);
140 // Don't allow both to be OFF at the same time. Toggle the other one on if both now off.
141 if (
142 !LLPipeline::getRenderBeacons(NULL) &&
143 !LLPipeline::getRenderHighlights(NULL) )
144 {
145 LLPipeline::setRenderHighlights(TRUE);
146 view->getChild<LLCheckBoxCtrl>("highlights")->setControlValue(LLSD(TRUE));
147 view->getChild<LLCheckBoxCtrl>("beacons")->setControlValue(LLSD(FALSE)); // just to be sure it's in sync with llpipeline
148 }
149 }
150}
diff --git a/linden/indra/newview/llfloaterbeacons.h b/linden/indra/newview/llfloaterbeacons.h
new file mode 100644
index 0000000..e608dab
--- /dev/null
+++ b/linden/indra/newview/llfloaterbeacons.h
@@ -0,0 +1,56 @@
1/**
2 * @file llfloaterbeacons.h
3 * @brief Front-end to LLPipeline controls for highlighting various kinds of objects.
4 * @author Coco
5 *
6 * $LicenseInfo:firstyear=2002&license=viewergpl$
7 *
8 * Copyright (c) 2002-2008, Linden Research, Inc.
9 *
10 * Second Life Viewer Source Code
11 * The source code in this file ("Source Code") is provided by Linden Lab
12 * to you under the terms of the GNU General Public License, version 2.0
13 * ("GPL"), unless you have obtained a separate licensing agreement
14 * ("Other License"), formally executed by you and Linden Lab. Terms of
15 * the GPL can be found in doc/GPL-license.txt in this distribution, or
16 * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
17 *
18 * There are special exceptions to the terms and conditions of the GPL as
19 * it is applied to this Source Code. View the full text of the exception
20 * in the file doc/FLOSS-exception.txt in this software distribution, or
21 * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception
22 *
23 * By copying, modifying or distributing this software, you acknowledge
24 * that you have read and understood your obligations described above,
25 * and agree to abide by those obligations.
26 *
27 * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
28 * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
29 * COMPLETENESS OR PERFORMANCE.
30 * $/LicenseInfo$
31 */
32
33#ifndef LL_LLFLOATERBEACONS_H
34#define LL_LLFLOATERBEACONS_H
35
36#include "llfloater.h"
37
38class LLFloaterBeacons : public LLFloater, public LLFloaterSingleton<LLFloaterBeacons>
39{
40 friend class LLUISingleton<LLFloaterBeacons, VisibilityPolicy<LLFloater> >;
41
42public:
43 /*virtual*/ BOOL postBuild();
44
45 // Needed to make the floater visibility toggle the beacons.
46 // Too bad we can't just add control_name="BeaconAlwaysOn" to the XML.
47 /*virtual*/ void open();
48 /*virtual*/ void close(bool app_quitting);
49
50private:
51 LLFloaterBeacons(const LLSD& seed);
52
53 static void onClickUICheck(LLUICtrl *ctrl, void* data);
54};
55
56#endif
diff --git a/linden/indra/newview/llfloaterbuy.cpp b/linden/indra/newview/llfloaterbuy.cpp
index 5d815fa..9e8556f 100644
--- a/linden/indra/newview/llfloaterbuy.cpp
+++ b/linden/indra/newview/llfloaterbuy.cpp
@@ -289,11 +289,6 @@ void LLFloaterBuy::inventoryChanged(LLViewerObject* obj,
289 removeVOInventoryListener(); 289 removeVOInventoryListener();
290} 290}
291 291
292void LLFloaterBuy::close(bool app_quitting)
293{
294 LLSelectMgr::getInstance()->deselectAll();
295 LLFloater::close(app_quitting);
296}
297 292
298// static 293// static
299void LLFloaterBuy::onClickBuy(void*) 294void LLFloaterBuy::onClickBuy(void*)
@@ -325,3 +320,10 @@ void LLFloaterBuy::onClickCancel(void*)
325 sInstance->close(); 320 sInstance->close();
326 } 321 }
327} 322}
323
324void LLFloaterBuy::onClose(bool app_quitting)
325{
326 // drop reference to current selection so selection goes away
327 mObjectSelection = NULL;
328 LLFloater::onClose(app_quitting);
329}
diff --git a/linden/indra/newview/llfloaterbuy.h b/linden/indra/newview/llfloaterbuy.h
index 0eef41b..8c0e144 100644
--- a/linden/indra/newview/llfloaterbuy.h
+++ b/linden/indra/newview/llfloaterbuy.h
@@ -57,6 +57,7 @@ protected:
57 LLFloaterBuy(); 57 LLFloaterBuy();
58 ~LLFloaterBuy(); 58 ~LLFloaterBuy();
59 59
60 /*virtual*/ void onClose(bool app_quitting);
60 void reset(); 61 void reset();
61 62
62 void requestObjectInventories(); 63 void requestObjectInventories();
@@ -65,8 +66,6 @@ protected:
65 S32 serial_num, 66 S32 serial_num,
66 void* data); 67 void* data);
67 68
68 /*virtual*/ void close(bool app_quitting = false);
69
70 static void onClickBuy(void*); 69 static void onClickBuy(void*);
71 static void onClickCancel(void*); 70 static void onClickCancel(void*);
72 71
diff --git a/linden/indra/newview/llfloaterbuycurrency.cpp b/linden/indra/newview/llfloaterbuycurrency.cpp
index cbd41f4..1cbf314 100644
--- a/linden/indra/newview/llfloaterbuycurrency.cpp
+++ b/linden/indra/newview/llfloaterbuycurrency.cpp
@@ -358,11 +358,6 @@ void LLFloaterBuyCurrencyUI::onClickErrorWeb(void* data)
358// static 358// static
359void LLFloaterBuyCurrency::buyCurrency() 359void LLFloaterBuyCurrency::buyCurrency()
360{ 360{
361 if (gHideLinks)
362 {
363 return;
364 }
365
366 LLFloaterBuyCurrencyUI* ui = LLFloaterBuyCurrencyUI::soleInstance(true); 361 LLFloaterBuyCurrencyUI* ui = LLFloaterBuyCurrencyUI::soleInstance(true);
367 ui->noTarget(); 362 ui->noTarget();
368 ui->updateUI(); 363 ui->updateUI();
@@ -371,15 +366,6 @@ void LLFloaterBuyCurrency::buyCurrency()
371 366
372void LLFloaterBuyCurrency::buyCurrency(const std::string& name, S32 price) 367void LLFloaterBuyCurrency::buyCurrency(const std::string& name, S32 price)
373{ 368{
374 if (gHideLinks)
375 {
376 LLStringUtil::format_map_t args;
377 args["[NAME]"] = name;
378 args["[PRICE]"] = llformat("%d", price);
379 gViewerWindow->alertXml("NotEnoughCurrency", args);
380 return;
381 }
382
383 LLFloaterBuyCurrencyUI* ui = LLFloaterBuyCurrencyUI::soleInstance(true); 369 LLFloaterBuyCurrencyUI* ui = LLFloaterBuyCurrencyUI::soleInstance(true);
384 ui->target(name, price); 370 ui->target(name, price);
385 ui->updateUI(); 371 ui->updateUI();
diff --git a/linden/indra/newview/llfloatercolorpicker.cpp b/linden/indra/newview/llfloatercolorpicker.cpp
index 1ffbeb3..9b2a5f6 100644
--- a/linden/indra/newview/llfloatercolorpicker.cpp
+++ b/linden/indra/newview/llfloatercolorpicker.cpp
@@ -165,7 +165,7 @@ createUI ()
165 } 165 }
166 } 166 }
167 mRGBImage = new LLImageGL ( (LLImageRaw*)raw, FALSE ); 167 mRGBImage = new LLImageGL ( (LLImageRaw*)raw, FALSE );
168 mRGBImage->bind(); 168 gGL.getTexUnit(0)->bind(mRGBImage);
169 mRGBImage->setClamp(TRUE, TRUE); 169 mRGBImage->setClamp(TRUE, TRUE);
170 170
171 // create palette 171 // create palette
@@ -543,9 +543,9 @@ void LLFloaterColorPicker::draw()
543 LLRect local_rect = getLocalRect(); 543 LLRect local_rect = getLocalRect();
544 if (gFocusMgr.childHasKeyboardFocus(this) && mSwatch->isInVisibleChain() && mContextConeOpacity > 0.001f) 544 if (gFocusMgr.childHasKeyboardFocus(this) && mSwatch->isInVisibleChain() && mContextConeOpacity > 0.001f)
545 { 545 {
546 LLGLSNoTexture no_texture; 546 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
547 LLGLEnable(GL_CULL_FACE); 547 LLGLEnable(GL_CULL_FACE);
548 gGL.begin(LLVertexBuffer::QUADS); 548 gGL.begin(LLRender::QUADS);
549 { 549 {
550 gGL.color4f(0.f, 0.f, 0.f, CONTEXT_CONE_IN_ALPHA * mContextConeOpacity); 550 gGL.color4f(0.f, 0.f, 0.f, CONTEXT_CONE_IN_ALPHA * mContextConeOpacity);
551 gGL.vertex2i(swatch_rect.mLeft, swatch_rect.mTop); 551 gGL.vertex2i(swatch_rect.mLeft, swatch_rect.mTop);
diff --git a/linden/indra/newview/llfloaterimagepreview.cpp b/linden/indra/newview/llfloaterimagepreview.cpp
index 912a4fc..8f592b2 100644
--- a/linden/indra/newview/llfloaterimagepreview.cpp
+++ b/linden/indra/newview/llfloaterimagepreview.cpp
@@ -232,14 +232,14 @@ void LLFloaterImagePreview::draw()
232 232
233 if (mGLName) 233 if (mGLName)
234 { 234 {
235 LLImageGL::bindExternalTexture( mGLName, 0, GL_TEXTURE_2D ); 235 gGL.getTexUnit(0)->bindManual(LLTexUnit::TT_TEXTURE, mGLName);
236 } 236 }
237 else 237 else
238 { 238 {
239 glGenTextures(1, &mGLName ); 239 glGenTextures(1, &mGLName );
240 stop_glerror(); 240 stop_glerror();
241 241
242 LLImageGL::bindExternalTexture( mGLName, 0, GL_TEXTURE_2D ); 242 gGL.getTexUnit(0)->bindManual(LLTexUnit::TT_TEXTURE, mGLName);
243 stop_glerror(); 243 stop_glerror();
244 244
245 glTexImage2D( 245 glTexImage2D(
@@ -251,8 +251,7 @@ void LLFloaterImagePreview::draw()
251 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 251 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
252 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 252 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
253 253
254 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 254 gGL.getTexUnit(0)->setTextureAddressMode(LLTexUnit::TAM_CLAMP);
255 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
256 if (mAvatarPreview) 255 if (mAvatarPreview)
257 { 256 {
258 mAvatarPreview->setTexture(mGLName); 257 mAvatarPreview->setTexture(mGLName);
@@ -261,7 +260,7 @@ void LLFloaterImagePreview::draw()
261 } 260 }
262 261
263 gGL.color3f(1.f, 1.f, 1.f); 262 gGL.color3f(1.f, 1.f, 1.f);
264 gGL.begin( LLVertexBuffer::QUADS ); 263 gGL.begin( LLRender::QUADS );
265 { 264 {
266 gGL.texCoord2f(mPreviewImageRect.mLeft, mPreviewImageRect.mTop); 265 gGL.texCoord2f(mPreviewImageRect.mLeft, mPreviewImageRect.mTop);
267 gGL.vertex2i(PREVIEW_HPAD, PREVIEW_TEXTURE_HEIGHT); 266 gGL.vertex2i(PREVIEW_HPAD, PREVIEW_TEXTURE_HEIGHT);
@@ -274,7 +273,7 @@ void LLFloaterImagePreview::draw()
274 } 273 }
275 gGL.end(); 274 gGL.end();
276 275
277 LLImageGL::unbindTexture(0, GL_TEXTURE_2D); 276 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
278 277
279 stop_glerror(); 278 stop_glerror();
280 } 279 }
@@ -285,11 +284,15 @@ void LLFloaterImagePreview::draw()
285 gGL.color3f(1.f, 1.f, 1.f); 284 gGL.color3f(1.f, 1.f, 1.f);
286 285
287 if (selected == 9) 286 if (selected == 9)
288 mSculptedPreview->bindTexture(); 287 {
288 gGL.getTexUnit(0)->bind(mSculptedPreview->getTexture());
289 }
289 else 290 else
290 mAvatarPreview->bindTexture(); 291 {
292 gGL.getTexUnit(0)->bind(mAvatarPreview->getTexture());
293 }
291 294
292 gGL.begin( LLVertexBuffer::QUADS ); 295 gGL.begin( LLRender::QUADS );
293 { 296 {
294 gGL.texCoord2f(0.f, 1.f); 297 gGL.texCoord2f(0.f, 1.f);
295 gGL.vertex2i(PREVIEW_HPAD, PREVIEW_TEXTURE_HEIGHT); 298 gGL.vertex2i(PREVIEW_HPAD, PREVIEW_TEXTURE_HEIGHT);
@@ -302,10 +305,7 @@ void LLFloaterImagePreview::draw()
302 } 305 }
303 gGL.end(); 306 gGL.end();
304 307
305 if (selected == 9) 308 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
306 mSculptedPreview->unbindTexture();
307 else
308 mAvatarPreview->unbindTexture();
309 } 309 }
310 } 310 }
311 } 311 }
@@ -774,7 +774,9 @@ LLImagePreviewSculpted::LLImagePreviewSculpted(S32 width, S32 height) : LLDynami
774 LLVolumeParams volume_params; 774 LLVolumeParams volume_params;
775 volume_params.setType(LL_PCODE_PROFILE_CIRCLE, LL_PCODE_PATH_CIRCLE); 775 volume_params.setType(LL_PCODE_PROFILE_CIRCLE, LL_PCODE_PATH_CIRCLE);
776 volume_params.setSculptID(LLUUID::null, LL_SCULPT_TYPE_SPHERE); 776 volume_params.setSculptID(LLUUID::null, LL_SCULPT_TYPE_SPHERE);
777 mVolume = new LLVolume(volume_params, (F32) MAX_LOD); 777
778 F32 const HIGHEST_LOD = 4.0f;
779 mVolume = new LLVolume(volume_params, HIGHEST_LOD);
778 780
779 /* 781 /*
780 mDummyAvatar = new LLVOAvatar(LLUUID::null, LL_PCODE_LEGACY_AVATAR, gAgent.getRegion()); 782 mDummyAvatar = new LLVOAvatar(LLUUID::null, LL_PCODE_LEGACY_AVATAR, gAgent.getRegion());
@@ -811,7 +813,36 @@ void LLImagePreviewSculpted::setPreviewTarget(LLImageRaw* imagep, F32 distance)
811 { 813 {
812 mVolume->sculpt(imagep->getWidth(), imagep->getHeight(), imagep->getComponents(), imagep->getData(), 0); 814 mVolume->sculpt(imagep->getWidth(), imagep->getHeight(), imagep->getComponents(), imagep->getData(), 0);
813 } 815 }
814 816
817 const LLVolumeFace &vf = mVolume->getVolumeFace(0);
818 U32 num_indices = vf.mIndices.size();
819 U32 num_vertices = vf.mVertices.size();
820
821 mVertexBuffer = new LLVertexBuffer(LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_NORMAL, 0);
822 mVertexBuffer->allocateBuffer(num_vertices, num_indices, TRUE);
823
824 LLStrider<LLVector3> vertex_strider;
825 LLStrider<LLVector3> normal_strider;
826 LLStrider<U16> index_strider;
827
828 mVertexBuffer->getVertexStrider(vertex_strider);
829 mVertexBuffer->getNormalStrider(normal_strider);
830 mVertexBuffer->getIndexStrider(index_strider);
831
832 // build vertices and normals
833 for (U32 i = 0; (S32)i < num_vertices; i++)
834 {
835 *(vertex_strider++) = vf.mVertices[i].mPosition;
836 LLVector3 normal = vf.mVertices[i].mNormal;
837 normal.normalize();
838 *(normal_strider++) = normal;
839 }
840
841 // build indices
842 for (U16 i = 0; i < num_indices; i++)
843 {
844 *(index_strider++) = vf.mIndices[i];
845 }
815} 846}
816 847
817 848
@@ -846,7 +877,7 @@ BOOL LLImagePreviewSculpted::render()
846 glMatrixMode(GL_MODELVIEW); 877 glMatrixMode(GL_MODELVIEW);
847 gGL.popMatrix(); 878 gGL.popMatrix();
848 879
849 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 880 glClear(GL_DEPTH_BUFFER_BIT);
850 881
851 LLVector3 target_pos(0, 0, 0); 882 LLVector3 target_pos(0, 0, 0);
852 883
@@ -865,55 +896,21 @@ BOOL LLImagePreviewSculpted::render()
865 LLViewerCamera::getInstance()->setView(LLViewerCamera::getInstance()->getDefaultFOV() / mCameraZoom); 896 LLViewerCamera::getInstance()->setView(LLViewerCamera::getInstance()->getDefaultFOV() / mCameraZoom);
866 LLViewerCamera::getInstance()->setPerspective(FALSE, mOrigin.mX, mOrigin.mY, mWidth, mHeight, FALSE); 897 LLViewerCamera::getInstance()->setPerspective(FALSE, mOrigin.mX, mOrigin.mY, mWidth, mHeight, FALSE);
867 898
868 gPipeline.enableLightsAvatar();
869
870 gGL.pushMatrix();
871 glScalef(0.5, 0.5, 0.5);
872
873 const LLVolumeFace &vf = mVolume->getVolumeFace(0); 899 const LLVolumeFace &vf = mVolume->getVolumeFace(0);
874 U32 num_indices = vf.mIndices.size(); 900 U32 num_indices = vf.mIndices.size();
875 U32 num_vertices = vf.mVertices.size(); 901
876 902 mVertexBuffer->setBuffer(LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_NORMAL);
877 if (num_vertices > 0 && num_indices > 0)
878 {
879 glEnableClientState(GL_NORMAL_ARRAY);
880 // build vertices and normals
881 F32* vertices = new F32[num_vertices * 3];
882 F32* normals = new F32[num_vertices * 3];
883
884 for (U32 i = 0; (S32)i < num_vertices; i++)
885 {
886 LLVector3 position = vf.mVertices[i].mPosition;
887 vertices[i*3] = position.mV[VX];
888 vertices[i*3+1] = position.mV[VY];
889 vertices[i*3+2] = position.mV[VZ];
890
891 LLVector3 normal = vf.mVertices[i].mNormal;
892 normals[i*3] = normal.mV[VX];
893 normals[i*3+1] = normal.mV[VY];
894 normals[i*3+2] = normal.mV[VZ];
895 }
896 903
897 // build indices 904 gPipeline.enableLightsAvatar();
898 U16* indices = new U16[num_indices]; 905 gGL.pushMatrix();
899 for (U16 i = 0; i < num_indices; i++) 906 const F32 SCALE = 1.25f;
900 { 907 gGL.scalef(SCALE, SCALE, SCALE);
901 indices[i] = vf.mIndices[i]; 908 const F32 BRIGHTNESS = 0.9f;
902 } 909 gGL.color3f(BRIGHTNESS, BRIGHTNESS, BRIGHTNESS);
910 mVertexBuffer->draw(LLRender::TRIANGLES, num_indices, 0);
903 911
904 gGL.color3f(0.4f, 0.4f, 0.4f); 912 gGL.popMatrix();
905 glVertexPointer(3, GL_FLOAT, 0, (void *)vertices);
906 glNormalPointer(GL_FLOAT, 0, (void *)normals);
907 glDrawRangeElements(GL_TRIANGLES, 0, num_vertices-1, num_indices, GL_UNSIGNED_SHORT, (void *)indices);
908 913
909 gGL.popMatrix();
910 glDisableClientState(GL_NORMAL_ARRAY);
911
912 delete [] indices;
913 delete [] vertices;
914 delete [] normals;
915 }
916
917 return TRUE; 914 return TRUE;
918} 915}
919 916
diff --git a/linden/indra/newview/llfloaterimagepreview.h b/linden/indra/newview/llfloaterimagepreview.h
index 9d80f09..3e72736 100644
--- a/linden/indra/newview/llfloaterimagepreview.h
+++ b/linden/indra/newview/llfloaterimagepreview.h
@@ -41,6 +41,7 @@ class LLJoint;
41class LLViewerJointMesh; 41class LLViewerJointMesh;
42class LLVOAvatar; 42class LLVOAvatar;
43class LLTextBox; 43class LLTextBox;
44class LLVertexBuffer;
44 45
45class LLImagePreviewSculpted : public LLDynamicTexture 46class LLImagePreviewSculpted : public LLDynamicTexture
46{ 47{
@@ -67,6 +68,7 @@ class LLImagePreviewSculpted : public LLDynamicTexture
67 F32 mCameraZoom; 68 F32 mCameraZoom;
68 LLVector3 mCameraOffset; 69 LLVector3 mCameraOffset;
69 LLPointer<LLVolume> mVolume; 70 LLPointer<LLVolume> mVolume;
71 LLPointer<LLVertexBuffer> mVertexBuffer;
70}; 72};
71 73
72 74
diff --git a/linden/indra/newview/llfloaterjoystick.cpp b/linden/indra/newview/llfloaterjoystick.cpp
index 172da1d..8f938ed 100644
--- a/linden/indra/newview/llfloaterjoystick.cpp
+++ b/linden/indra/newview/llfloaterjoystick.cpp
@@ -46,7 +46,7 @@
46#include "llviewerjoystick.h" 46#include "llviewerjoystick.h"
47 47
48LLFloaterJoystick::LLFloaterJoystick(const LLSD& data) 48LLFloaterJoystick::LLFloaterJoystick(const LLSD& data)
49 : LLFloater(std::string("floater_joystick")) 49 : LLFloater("floater_joystick")
50{ 50{
51 LLUICtrlFactory::getInstance()->buildFloater(this, "floater_joystick.xml"); 51 LLUICtrlFactory::getInstance()->buildFloater(this, "floater_joystick.xml");
52 center(); 52 center();
diff --git a/linden/indra/newview/llfloaterland.cpp b/linden/indra/newview/llfloaterland.cpp
index 891cde7..a459d4d 100644
--- a/linden/indra/newview/llfloaterland.cpp
+++ b/linden/indra/newview/llfloaterland.cpp
@@ -1448,7 +1448,7 @@ void LLPanelLandObjects::processParcelObjectOwnersReply(LLMessageSystem *msg, vo
1448 msg->getBOOLFast(_PREHASH_Data, _PREHASH_IsGroupOwned, is_group_owned, i); 1448 msg->getBOOLFast(_PREHASH_Data, _PREHASH_IsGroupOwned, is_group_owned, i);
1449 msg->getS32Fast (_PREHASH_Data, _PREHASH_Count, object_count, i); 1449 msg->getS32Fast (_PREHASH_Data, _PREHASH_Count, object_count, i);
1450 msg->getBOOLFast(_PREHASH_Data, _PREHASH_OnlineStatus, is_online, i); 1450 msg->getBOOLFast(_PREHASH_Data, _PREHASH_OnlineStatus, is_online, i);
1451 if(msg->getNumberOfBlocks("DataExtended")) 1451 if(msg->has("DataExtended"))
1452 { 1452 {
1453 msg->getU32("DataExtended", "TimeStamp", most_recent_time, i); 1453 msg->getU32("DataExtended", "TimeStamp", most_recent_time, i);
1454 } 1454 }
diff --git a/linden/indra/newview/llfloaterlandmark.cpp b/linden/indra/newview/llfloaterlandmark.cpp
index 71e35e8..a8c08bb 100644
--- a/linden/indra/newview/llfloaterlandmark.cpp
+++ b/linden/indra/newview/llfloaterlandmark.cpp
@@ -34,73 +34,28 @@
34#include "llfloaterlandmark.h" 34#include "llfloaterlandmark.h"
35 35
36#include "llagent.h" 36#include "llagent.h"
37#include "llviewerimagelist.h"
38#include "llcheckboxctrl.h" 37#include "llcheckboxctrl.h"
39#include "llcombobox.h"
40#include "llbutton.h"
41#include "lldraghandle.h"
42#include "llfocusmgr.h"
43#include "llviewerimage.h"
44#include "llviewerparcelmgr.h" 38#include "llviewerparcelmgr.h"
45#include "llfolderview.h" 39#include "llfolderview.h"
46#include "llinventory.h" 40#include "llinventory.h"
47#include "llinventorymodel.h" 41#include "llinventorymodel.h"
48#include "llinventoryview.h" 42#include "llinventoryview.h"
49#include "lllineeditor.h"
50#include "llui.h"
51#include "llviewerinventory.h" 43#include "llviewerinventory.h"
52#include "llpermissions.h" 44#include "llpermissions.h"
53#include "llsaleinfo.h" 45#include "llsaleinfo.h"
54#include "llassetstorage.h"
55#include "lltextbox.h"
56#include "llparcel.h" 46#include "llparcel.h"
57#include "llresizehandle.h" 47
58#include "llscrollcontainer.h" 48#include "llviewerwindow.h" // alertXml
59#include "lltoolmgr.h"
60#include "lltoolpipette.h"
61
62#include "lltool.h"
63#include "llviewerwindow.h"
64#include "llviewerobject.h"
65#include "llviewercontrol.h" 49#include "llviewercontrol.h"
66#include "llglheaders.h"
67#include "lluictrlfactory.h" 50#include "lluictrlfactory.h"
68 51
69#include "roles_constants.h" 52#include "roles_constants.h" // GP_LAND_ALLOW_LANDMARK
70 53
71 54
72
73static const S32 CLOSE_BTN_WIDTH = 100;
74const S32 PIPETTE_BTN_WIDTH = 32;
75static const S32 HPAD = 4;
76static const S32 VPAD = 4;
77static const S32 LINE = 16;
78static const S32 SMALL_BTN_WIDTH = 64;
79static const S32 TEX_PICKER_MIN_WIDTH =
80 (HPAD +
81 CLOSE_BTN_WIDTH +
82 HPAD +
83 CLOSE_BTN_WIDTH +
84 HPAD +
85 SMALL_BTN_WIDTH +
86 HPAD +
87 SMALL_BTN_WIDTH +
88 HPAD +
89 30 +
90 RESIZE_HANDLE_WIDTH * 2);
91static const S32 CLEAR_BTN_WIDTH = 50;
92static const S32 TEX_PICKER_MIN_HEIGHT = 290;
93static const S32 FOOTER_HEIGHT = 100;
94static const S32 BORDER_PAD = HPAD;
95static const S32 TEXTURE_INVENTORY_PADDING = 30;
96static const F32 CONTEXT_CONE_IN_ALPHA = 0.0f; 55static const F32 CONTEXT_CONE_IN_ALPHA = 0.0f;
97static const F32 CONTEXT_CONE_OUT_ALPHA = 1.f; 56static const F32 CONTEXT_CONE_OUT_ALPHA = 1.f;
98static const F32 CONTEXT_FADE_TIME = 0.08f; 57static const F32 CONTEXT_FADE_TIME = 0.08f;
99 58
100//static const char CURRENT_IMAGE_NAME[] = "Current Landmark";
101//static const char WHITE_IMAGE_NAME[] = "Blank Landmark";
102//static const char NO_IMAGE_NAME[] = "None";
103
104 59
105LLFloaterLandmark::LLFloaterLandmark(const LLSD& data) 60LLFloaterLandmark::LLFloaterLandmark(const LLSD& data)
106 : 61 :
@@ -167,6 +122,7 @@ LLFloaterLandmark::LLFloaterLandmark(const LLSD& data)
167LLFloaterLandmark::~LLFloaterLandmark() 122LLFloaterLandmark::~LLFloaterLandmark()
168{ 123{
169 delete mSavedFolderState; 124 delete mSavedFolderState;
125 mSavedFolderState = NULL;
170} 126}
171 127
172void LLFloaterLandmark::setActive( BOOL active ) 128void LLFloaterLandmark::setActive( BOOL active )
diff --git a/linden/indra/newview/llfloaterlandmark.h b/linden/indra/newview/llfloaterlandmark.h
index cf71138..27139a7 100644
--- a/linden/indra/newview/llfloaterlandmark.h
+++ b/linden/indra/newview/llfloaterlandmark.h
@@ -32,9 +32,7 @@
32#ifndef LL_LLFLOATERLANDMARK_H 32#ifndef LL_LLFLOATERLANDMARK_H
33#define LL_LLFLOATERLANDMARK_H 33#define LL_LLFLOATERLANDMARK_H
34 34
35#include "llcoord.h"
36#include "llfloater.h" 35#include "llfloater.h"
37#include "llstring.h"
38#include "lluictrl.h" 36#include "lluictrl.h"
39#include "llpermissionsflags.h" 37#include "llpermissionsflags.h"
40 38
diff --git a/linden/indra/newview/llfloaterpostcard.cpp b/linden/indra/newview/llfloaterpostcard.cpp
index b4bcdb7..4be8145 100644
--- a/linden/indra/newview/llfloaterpostcard.cpp
+++ b/linden/indra/newview/llfloaterpostcard.cpp
@@ -63,6 +63,8 @@
63 63
64#include "llassetuploadresponders.h" 64#include "llassetuploadresponders.h"
65 65
66#include <boost/regex.hpp> //boost.regex lib
67
66///---------------------------------------------------------------------------- 68///----------------------------------------------------------------------------
67/// Local function declarations, constants, enums, and typedefs 69/// Local function declarations, constants, enums, and typedefs
68///---------------------------------------------------------------------------- 70///----------------------------------------------------------------------------
@@ -180,7 +182,7 @@ void LLFloaterPostcard::draw()
180 rect.mBottom = (S32)((F32)rect.mTop - ((F32)rect.getWidth() / ratio)); 182 rect.mBottom = (S32)((F32)rect.mTop - ((F32)rect.getWidth() / ratio));
181 } 183 }
182 { 184 {
183 LLGLSNoTexture gls_no_texture; 185 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
184 gl_rect_2d(rect, LLColor4(0.f, 0.f, 0.f, 1.f)); 186 gl_rect_2d(rect, LLColor4(0.f, 0.f, 0.f, 1.f));
185 rect.stretch(-1); 187 rect.stretch(-1);
186 } 188 }
@@ -242,14 +244,16 @@ void LLFloaterPostcard::onClickSend(void* data)
242 244
243 std::string from(self->childGetValue("from_form").asString()); 245 std::string from(self->childGetValue("from_form").asString());
244 std::string to(self->childGetValue("to_form").asString()); 246 std::string to(self->childGetValue("to_form").asString());
245 247
246 if (to.empty() || to.find('@') == std::string::npos) 248 boost::regex emailFormat("[A-Za-z0-9.%+-_]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}");
249
250 if (to.empty() || !boost::regex_match(to, emailFormat))
247 { 251 {
248 gViewerWindow->alertXml("PromptRecipientEmail"); 252 gViewerWindow->alertXml("PromptRecipientEmail");
249 return; 253 return;
250 } 254 }
251 255
252 if (from.empty() || from.find('@') == std::string::npos) 256 if (from.empty() || !boost::regex_match(from, emailFormat))
253 { 257 {
254 gViewerWindow->alertXml("PromptSelfEmail"); 258 gViewerWindow->alertXml("PromptSelfEmail");
255 return; 259 return;
diff --git a/linden/indra/newview/llfloaterpreference.cpp b/linden/indra/newview/llfloaterpreference.cpp
index 82d8cc9..b907aed 100644
--- a/linden/indra/newview/llfloaterpreference.cpp
+++ b/linden/indra/newview/llfloaterpreference.cpp
@@ -424,8 +424,6 @@ void LLFloaterPreference::onClickAbout(void*)
424// static 424// static
425void LLFloaterPreference::onBtnOK( void* userdata ) 425void LLFloaterPreference::onBtnOK( void* userdata )
426{ 426{
427 LLPanelLogin::refreshLocation( false );
428
429 LLFloaterPreference *fp =(LLFloaterPreference *)userdata; 427 LLFloaterPreference *fp =(LLFloaterPreference *)userdata;
430 // commit any outstanding text entry 428 // commit any outstanding text entry
431 if (fp->hasFocus()) 429 if (fp->hasFocus())
@@ -453,6 +451,8 @@ void LLFloaterPreference::onBtnOK( void* userdata )
453 // Show beep, pop up dialog, etc. 451 // Show beep, pop up dialog, etc.
454 llinfos << "Can't close preferences!" << llendl; 452 llinfos << "Can't close preferences!" << llendl;
455 } 453 }
454
455 LLPanelLogin::refreshLocation( false );
456} 456}
457 457
458 458
diff --git a/linden/indra/newview/llfloatersnapshot.cpp b/linden/indra/newview/llfloatersnapshot.cpp
index 954bf9f..afa0785 100644
--- a/linden/indra/newview/llfloatersnapshot.cpp
+++ b/linden/indra/newview/llfloatersnapshot.cpp
@@ -151,7 +151,8 @@ public:
151 void resetThumbnailImage() { mThumbnailImage = NULL ; } 151 void resetThumbnailImage() { mThumbnailImage = NULL ; }
152 void drawPreviewRect(S32 offset_x, S32 offset_y) ; 152 void drawPreviewRect(S32 offset_x, S32 offset_y) ;
153 153
154 static void onIdle( void* snapshot_preview ); 154 // Returns TRUE when snapshot generated, FALSE otherwise.
155 static BOOL onIdle( void* snapshot_preview );
155 156
156private: 157private:
157 LLColor4 mColor; 158 LLColor4 mColor;
@@ -203,6 +204,8 @@ LLSnapshotLivePreview::LLSnapshotLivePreview (const LLRect& rect) :
203 mCurImageIndex(0), 204 mCurImageIndex(0),
204 mPreviewImage(NULL), 205 mPreviewImage(NULL),
205 mThumbnailImage(NULL) , 206 mThumbnailImage(NULL) ,
207 mThumbnailWidth(0),
208 mThumbnailHeight(0),
206 mPreviewImageEncoded(NULL), 209 mPreviewImageEncoded(NULL),
207 mFormattedImage(NULL), 210 mFormattedImage(NULL),
208 mShineCountdown(0), 211 mShineCountdown(0),
@@ -342,14 +345,11 @@ void LLSnapshotLivePreview::updateSnapshot(BOOL new_snapshot, BOOL new_thumbnail
342 mSnapshotDelayTimer.start(); 345 mSnapshotDelayTimer.start();
343 mSnapshotDelayTimer.setTimerExpirySec(delay); 346 mSnapshotDelayTimer.setTimerExpirySec(delay);
344 } 347 }
345 else if(new_thumbnail) 348 if(new_thumbnail)
346 { 349 {
347 mThumbnailUpToDate = FALSE ; 350 mThumbnailUpToDate = FALSE ;
348 } 351 }
349 else 352 setThumbnailImageSize();
350 {
351 setThumbnailImageSize() ;
352 }
353} 353}
354 354
355void LLSnapshotLivePreview::setSnapshotQuality(S32 quality) 355void LLSnapshotLivePreview::setSnapshotQuality(S32 quality)
@@ -417,14 +417,14 @@ void LLSnapshotLivePreview::draw()
417 417
418 LLColor4 image_color(1.f, 1.f, 1.f, 1.f); 418 LLColor4 image_color(1.f, 1.f, 1.f, 1.f);
419 gGL.color4fv(image_color.mV); 419 gGL.color4fv(image_color.mV);
420 LLViewerImage::bindTexture(mViewerImage[mCurImageIndex]); 420 gGL.getTexUnit(0)->bind(mViewerImage[mCurImageIndex]);
421 // calculate UV scale 421 // calculate UV scale
422 F32 uv_width = mImageScaled[mCurImageIndex] ? 1.f : llmin((F32)mWidth[mCurImageIndex] / (F32)mViewerImage[mCurImageIndex]->getWidth(), 1.f); 422 F32 uv_width = mImageScaled[mCurImageIndex] ? 1.f : llmin((F32)mWidth[mCurImageIndex] / (F32)mViewerImage[mCurImageIndex]->getWidth(), 1.f);
423 F32 uv_height = mImageScaled[mCurImageIndex] ? 1.f : llmin((F32)mHeight[mCurImageIndex] / (F32)mViewerImage[mCurImageIndex]->getHeight(), 1.f); 423 F32 uv_height = mImageScaled[mCurImageIndex] ? 1.f : llmin((F32)mHeight[mCurImageIndex] / (F32)mViewerImage[mCurImageIndex]->getHeight(), 1.f);
424 glPushMatrix(); 424 glPushMatrix();
425 { 425 {
426 glTranslatef((F32)rect.mLeft, (F32)rect.mBottom, 0.f); 426 glTranslatef((F32)rect.mLeft, (F32)rect.mBottom, 0.f);
427 gGL.begin(LLVertexBuffer::QUADS); 427 gGL.begin(LLRender::QUADS);
428 { 428 {
429 gGL.texCoord2f(uv_width, uv_height); 429 gGL.texCoord2f(uv_width, uv_height);
430 gGL.vertex2i(rect.getWidth(), rect.getHeight() ); 430 gGL.vertex2i(rect.getWidth(), rect.getHeight() );
@@ -486,8 +486,8 @@ void LLSnapshotLivePreview::draw()
486 S32 y1 = 0; 486 S32 y1 = 0;
487 S32 y2 = gViewerWindow->getWindowHeight(); 487 S32 y2 = gViewerWindow->getWindowHeight();
488 488
489 LLGLSNoTexture no_texture; 489 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
490 gGL.begin(LLVertexBuffer::QUADS); 490 gGL.begin(LLRender::QUADS);
491 { 491 {
492 gGL.color4f(1.f, 1.f, 1.f, 0.f); 492 gGL.color4f(1.f, 1.f, 1.f, 0.f);
493 gGL.vertex2i(x1, y1); 493 gGL.vertex2i(x1, y1);
@@ -515,10 +515,10 @@ void LLSnapshotLivePreview::draw()
515 515
516 // draw framing rectangle 516 // draw framing rectangle
517 { 517 {
518 LLGLSNoTexture no_texture; 518 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
519 gGL.color4f(1.f, 1.f, 1.f, 1.f); 519 gGL.color4f(1.f, 1.f, 1.f, 1.f);
520 LLRect outline_rect = mImageRect[mCurImageIndex]; 520 LLRect outline_rect = mImageRect[mCurImageIndex];
521 gGL.begin(LLVertexBuffer::QUADS); 521 gGL.begin(LLRender::QUADS);
522 { 522 {
523 gGL.vertex2i(outline_rect.mLeft - BORDER_WIDTH, outline_rect.mTop + BORDER_WIDTH); 523 gGL.vertex2i(outline_rect.mLeft - BORDER_WIDTH, outline_rect.mTop + BORDER_WIDTH);
524 gGL.vertex2i(outline_rect.mRight + BORDER_WIDTH, outline_rect.mTop + BORDER_WIDTH); 524 gGL.vertex2i(outline_rect.mRight + BORDER_WIDTH, outline_rect.mTop + BORDER_WIDTH);
@@ -553,7 +553,7 @@ void LLSnapshotLivePreview::draw()
553 F32 alpha = clamp_rescale(fall_interp, 0.f, 1.f, 0.8f, 0.4f); 553 F32 alpha = clamp_rescale(fall_interp, 0.f, 1.f, 0.8f, 0.4f);
554 LLColor4 image_color(1.f, 1.f, 1.f, alpha); 554 LLColor4 image_color(1.f, 1.f, 1.f, alpha);
555 gGL.color4fv(image_color.mV); 555 gGL.color4fv(image_color.mV);
556 LLViewerImage::bindTexture(mViewerImage[old_image_index]); 556 gGL.getTexUnit(0)->bind(mViewerImage[old_image_index]);
557 // calculate UV scale 557 // calculate UV scale
558 // *FIX get this to work with old image 558 // *FIX get this to work with old image
559 BOOL rescale = !mImageScaled[old_image_index] && mViewerImage[mCurImageIndex].notNull(); 559 BOOL rescale = !mImageScaled[old_image_index] && mViewerImage[mCurImageIndex].notNull();
@@ -564,7 +564,7 @@ void LLSnapshotLivePreview::draw()
564 LLRect& rect = mImageRect[old_image_index]; 564 LLRect& rect = mImageRect[old_image_index];
565 glTranslatef((F32)rect.mLeft, (F32)rect.mBottom - llround(getRect().getHeight() * 2.f * (fall_interp * fall_interp)), 0.f); 565 glTranslatef((F32)rect.mLeft, (F32)rect.mBottom - llround(getRect().getHeight() * 2.f * (fall_interp * fall_interp)), 0.f);
566 glRotatef(-45.f * fall_interp, 0.f, 0.f, 1.f); 566 glRotatef(-45.f * fall_interp, 0.f, 0.f, 1.f);
567 gGL.begin(LLVertexBuffer::QUADS); 567 gGL.begin(LLRender::QUADS);
568 { 568 {
569 gGL.texCoord2f(uv_width, uv_height); 569 gGL.texCoord2f(uv_width, uv_height);
570 gGL.vertex2i(rect.getWidth(), rect.getHeight() ); 570 gGL.vertex2i(rect.getWidth(), rect.getHeight() );
@@ -719,8 +719,11 @@ void LLSnapshotLivePreview::generateThumbnailImage(BOOL force_update)
719 mThumbnailUpdateLock = FALSE ; 719 mThumbnailUpdateLock = FALSE ;
720} 720}
721 721
722
723// Called often. Checks whether it's time to grab a new snapshot and if so, does it.
724// Returns TRUE if new snapshot generated, FALSE otherwise.
722//static 725//static
723void LLSnapshotLivePreview::onIdle( void* snapshot_preview ) 726BOOL LLSnapshotLivePreview::onIdle( void* snapshot_preview )
724{ 727{
725 LLSnapshotLivePreview* previewp = (LLSnapshotLivePreview*)snapshot_preview; 728 LLSnapshotLivePreview* previewp = (LLSnapshotLivePreview*)snapshot_preview;
726 729
@@ -733,7 +736,10 @@ void LLSnapshotLivePreview::onIdle( void* snapshot_preview )
733 previewp->mCameraRot = new_camera_rot; 736 previewp->mCameraRot = new_camera_rot;
734 // request a new snapshot whenever the camera moves, with a time delay 737 // request a new snapshot whenever the camera moves, with a time delay
735 BOOL autosnap = gSavedSettings.getBOOL("AutoSnapshot"); 738 BOOL autosnap = gSavedSettings.getBOOL("AutoSnapshot");
736 previewp->updateSnapshot(autosnap, FALSE, autosnap ? AUTO_SNAPSHOT_TIME_DELAY : 0.f); 739 previewp->updateSnapshot(
740 autosnap, // whether a new snapshot is needed or merely invalidate the existing one
741 FALSE, // or if 1st arg is false, whether to produce a new thumbnail image.
742 autosnap ? AUTO_SNAPSHOT_TIME_DELAY : 0.f); // shutter delay if 1st arg is true.
737 } 743 }
738 744
739 // see if it's time yet to snap the shot and bomb out otherwise. 745 // see if it's time yet to snap the shot and bomb out otherwise.
@@ -742,7 +748,7 @@ void LLSnapshotLivePreview::onIdle( void* snapshot_preview )
742 && !LLToolCamera::getInstance()->hasMouseCapture(); // don't take snapshots while ALT-zoom active 748 && !LLToolCamera::getInstance()->hasMouseCapture(); // don't take snapshots while ALT-zoom active
743 if ( ! previewp->mSnapshotActive) 749 if ( ! previewp->mSnapshotActive)
744 { 750 {
745 return; 751 return FALSE;
746 } 752 }
747 753
748 // time to produce a snapshot 754 // time to produce a snapshot
@@ -819,6 +825,7 @@ void LLSnapshotLivePreview::onIdle( void* snapshot_preview )
819 } 825 }
820 if (previewp->mFormattedImage->encode(previewp->mPreviewImage, 0)) 826 if (previewp->mFormattedImage->encode(previewp->mPreviewImage, 0))
821 { 827 {
828 previewp->mDataSize = previewp->mFormattedImage->getDataSize();
822 // special case BMP to copy instead of decode otherwise decode will crash. 829 // special case BMP to copy instead of decode otherwise decode will crash.
823 if(format == LLFloaterSnapshot::SNAPSHOT_FORMAT_BMP) 830 if(format == LLFloaterSnapshot::SNAPSHOT_FORMAT_BMP)
824 { 831 {
@@ -826,7 +833,6 @@ void LLSnapshotLivePreview::onIdle( void* snapshot_preview )
826 } 833 }
827 else 834 else
828 { 835 {
829 previewp->mDataSize = previewp->mFormattedImage->getDataSize();
830 previewp->mFormattedImage->decode(previewp->mPreviewImageEncoded, 0); 836 previewp->mFormattedImage->decode(previewp->mPreviewImageEncoded, 0);
831 } 837 }
832 } 838 }
@@ -855,7 +861,7 @@ void LLSnapshotLivePreview::onIdle( void* snapshot_preview )
855 861
856 previewp->mViewerImage[previewp->mCurImageIndex] = new LLImageGL(scaled, FALSE); 862 previewp->mViewerImage[previewp->mCurImageIndex] = new LLImageGL(scaled, FALSE);
857 previewp->mViewerImage[previewp->mCurImageIndex]->setMipFilterNearest(previewp->getSnapshotType() != SNAPSHOT_TEXTURE); 863 previewp->mViewerImage[previewp->mCurImageIndex]->setMipFilterNearest(previewp->getSnapshotType() != SNAPSHOT_TEXTURE);
858 LLViewerImage::bindTexture(previewp->mViewerImage[previewp->mCurImageIndex]); 864 gGL.getTexUnit(0)->bind(previewp->mViewerImage[previewp->mCurImageIndex]);
859 previewp->mViewerImage[previewp->mCurImageIndex]->setClamp(TRUE, TRUE); 865 previewp->mViewerImage[previewp->mCurImageIndex]->setClamp(TRUE, TRUE);
860 866
861 previewp->mSnapshotUpToDate = TRUE; 867 previewp->mSnapshotUpToDate = TRUE;
@@ -875,6 +881,8 @@ void LLSnapshotLivePreview::onIdle( void* snapshot_preview )
875 { 881 {
876 previewp->generateThumbnailImage() ; 882 previewp->generateThumbnailImage() ;
877 } 883 }
884
885 return TRUE;
878} 886}
879 887
880void LLSnapshotLivePreview::setSize(S32 w, S32 h) 888void LLSnapshotLivePreview::setSize(S32 w, S32 h)
@@ -952,7 +960,7 @@ void LLSnapshotLivePreview::saveTexture()
952 llwarns << "Error encoding snapshot" << llendl; 960 llwarns << "Error encoding snapshot" << llendl;
953 } 961 }
954 962
955 LLViewerStats::getInstance()->incStat(LLViewerStats::ST_SNAPSHOT_COUNT ); 963 LLViewerStats::getInstance()->incStat(LLViewerStats::ST_SNAPSHOT_COUNT );
956} 964}
957 965
958BOOL LLSnapshotLivePreview::saveLocal() 966BOOL LLSnapshotLivePreview::saveLocal()
@@ -996,7 +1004,8 @@ public:
996 static void onClickKeepOpenCheck(LLUICtrl *ctrl, void* data); 1004 static void onClickKeepOpenCheck(LLUICtrl *ctrl, void* data);
997 static void onClickKeepAspectCheck(LLUICtrl *ctrl, void* data); 1005 static void onClickKeepAspectCheck(LLUICtrl *ctrl, void* data);
998 static void onCommitQuality(LLUICtrl* ctrl, void* data); 1006 static void onCommitQuality(LLUICtrl* ctrl, void* data);
999 static void onCommitResolution(LLUICtrl* ctrl, void* data); 1007 static void onCommitResolution(LLUICtrl* ctrl, void* data) { updateResolution(ctrl, data); }
1008 static void updateResolution(LLUICtrl* ctrl, void* data, BOOL do_update = TRUE);
1000 static void onCommitFreezeFrame(LLUICtrl* ctrl, void* data); 1009 static void onCommitFreezeFrame(LLUICtrl* ctrl, void* data);
1001 static void onCommitLayerTypes(LLUICtrl* ctrl, void*data); 1010 static void onCommitLayerTypes(LLUICtrl* ctrl, void*data);
1002 static void onCommitSnapshotType(LLUICtrl* ctrl, void* data); 1011 static void onCommitSnapshotType(LLUICtrl* ctrl, void* data);
@@ -1093,11 +1102,8 @@ LLViewerWindow::ESnapshotType LLFloaterSnapshot::Impl::getLayerType(LLFloaterSna
1093void LLFloaterSnapshot::Impl::setResolution(LLFloaterSnapshot* floater, const std::string& comboname) 1102void LLFloaterSnapshot::Impl::setResolution(LLFloaterSnapshot* floater, const std::string& comboname)
1094{ 1103{
1095 LLComboBox* combo = floater->getChild<LLComboBox>(comboname); 1104 LLComboBox* combo = floater->getChild<LLComboBox>(comboname);
1096 if (combo)
1097 {
1098 combo->setVisible(TRUE); 1105 combo->setVisible(TRUE);
1099 onCommitResolution(combo, floater); 1106 updateResolution(combo, floater, FALSE); // to sync spinners with combo
1100 }
1101} 1107}
1102 1108
1103//static 1109//static
@@ -1107,22 +1113,18 @@ void LLFloaterSnapshot::Impl::updateLayout(LLFloaterSnapshot* floaterp)
1107 1113
1108 S32 delta_height = gSavedSettings.getBOOL("AdvanceSnapshot") ? 0 : floaterp->getUIWinHeightShort() - floaterp->getUIWinHeightLong() ; 1114 S32 delta_height = gSavedSettings.getBOOL("AdvanceSnapshot") ? 0 : floaterp->getUIWinHeightShort() - floaterp->getUIWinHeightLong() ;
1109 1115
1110 LLComboBox* combo;
1111 if(!gSavedSettings.getBOOL("AdvanceSnapshot")) //set to original window resolution 1116 if(!gSavedSettings.getBOOL("AdvanceSnapshot")) //set to original window resolution
1112 { 1117 {
1113 previewp->mKeepAspectRatio = TRUE ; 1118 previewp->mKeepAspectRatio = TRUE;
1114 1119
1115 combo = floaterp->getChild<LLComboBox>("postcard_size_combo"); 1120 floaterp->getChild<LLComboBox>("postcard_size_combo")->setCurrentByIndex(0);
1116 combo->setCurrentByIndex(0) ; 1121 gSavedSettings.setS32("SnapshotPostcardLastResolution", 0);
1117 gSavedSettings.setS32("SnapshotPostcardLastResolution", 0) ;
1118 1122
1119 combo = floaterp->getChild<LLComboBox>("texture_size_combo"); 1123 floaterp->getChild<LLComboBox>("texture_size_combo")->setCurrentByIndex(0);
1120 combo->setCurrentByIndex(0) ; 1124 gSavedSettings.setS32("SnapshotTextureLastResolution", 0);
1121 gSavedSettings.setS32("SnapshotTextureLastResolution", 0) ;
1122 1125
1123 combo = floaterp->getChild<LLComboBox>("local_size_combo"); 1126 floaterp->getChild<LLComboBox>("local_size_combo")->setCurrentByIndex(0);
1124 combo->setCurrentByIndex(0) ; 1127 gSavedSettings.setS32("SnapshotLocalLastResolution", 0);
1125 gSavedSettings.setS32("SnapshotLocalLastResolution", 0) ;
1126 1128
1127 LLSnapshotLivePreview* previewp = getPreviewView(floaterp); 1129 LLSnapshotLivePreview* previewp = getPreviewView(floaterp);
1128 previewp->setSize(gViewerWindow->getWindowDisplayWidth(), gViewerWindow->getWindowDisplayHeight()); 1130 previewp->setSize(gViewerWindow->getWindowDisplayWidth(), gViewerWindow->getWindowDisplayHeight());
@@ -1187,7 +1189,11 @@ void LLFloaterSnapshot::Impl::updateLayout(LLFloaterSnapshot* floaterp)
1187 } 1189 }
1188} 1190}
1189 1191
1190 1192// This is the main function that keeps all the GUI controls in sync with the saved settings.
1193// It should be called anytime a setting is changed that could affect the controls.
1194// No other methods should be changing any of the controls directly except for helpers called by this method.
1195// The basic pattern for programmatically changing the GUI settings is to first set the
1196// appropriate saved settings and then call this method to sync the GUI with them.
1191// static 1197// static
1192void LLFloaterSnapshot::Impl::updateControls(LLFloaterSnapshot* floater) 1198void LLFloaterSnapshot::Impl::updateControls(LLFloaterSnapshot* floater)
1193{ 1199{
@@ -1201,15 +1207,10 @@ void LLFloaterSnapshot::Impl::updateControls(LLFloaterSnapshot* floater)
1201 floater->childSetVisible("texture_size_combo", FALSE); 1207 floater->childSetVisible("texture_size_combo", FALSE);
1202 floater->childSetVisible("local_size_combo", FALSE); 1208 floater->childSetVisible("local_size_combo", FALSE);
1203 1209
1204 LLComboBox* combo; 1210 floater->getChild<LLComboBox>("postcard_size_combo")->selectNthItem(gSavedSettings.getS32("SnapshotPostcardLastResolution"));
1205 combo = floater->getChild<LLComboBox>("postcard_size_combo"); 1211 floater->getChild<LLComboBox>("texture_size_combo")->selectNthItem(gSavedSettings.getS32("SnapshotTextureLastResolution"));
1206 if (combo) combo->selectNthItem(gSavedSettings.getS32("SnapshotPostcardLastResolution")); 1212 floater->getChild<LLComboBox>("local_size_combo")->selectNthItem(gSavedSettings.getS32("SnapshotLocalLastResolution"));
1207 combo = floater->getChild<LLComboBox>("texture_size_combo"); 1213 floater->getChild<LLComboBox>("local_format_combo")->selectNthItem(gSavedSettings.getS32("SnapshotFormat"));
1208 if (combo) combo->selectNthItem(gSavedSettings.getS32("SnapshotTextureLastResolution"));
1209 combo = floater->getChild<LLComboBox>("local_size_combo");
1210 if (combo) combo->selectNthItem(gSavedSettings.getS32("SnapshotLocalLastResolution"));
1211 combo = floater->getChild<LLComboBox>("local_format_combo");
1212 if (combo) combo->selectNthItem(gSavedSettings.getS32("SnapshotFormat"));
1213 1214
1214 floater->childSetVisible("upload_btn", shot_type == LLSnapshotLivePreview::SNAPSHOT_TEXTURE); 1215 floater->childSetVisible("upload_btn", shot_type == LLSnapshotLivePreview::SNAPSHOT_TEXTURE);
1215 floater->childSetVisible("send_btn", shot_type == LLSnapshotLivePreview::SNAPSHOT_POSTCARD); 1216 floater->childSetVisible("send_btn", shot_type == LLSnapshotLivePreview::SNAPSHOT_POSTCARD);
@@ -1240,6 +1241,23 @@ void LLFloaterSnapshot::Impl::updateControls(LLFloaterSnapshot* floater)
1240 floater->childSetVisible("auto_snapshot_check", is_advance); 1241 floater->childSetVisible("auto_snapshot_check", is_advance);
1241 floater->childSetVisible("image_quality_slider", is_advance && show_slider); 1242 floater->childSetVisible("image_quality_slider", is_advance && show_slider);
1242 1243
1244 LLSnapshotLivePreview* previewp = getPreviewView(floater);
1245 BOOL got_bytes = previewp && previewp->getDataSize() > 0;
1246 BOOL got_snap = previewp->getSnapshotUpToDate();
1247
1248 floater->childSetEnabled("send_btn", shot_type == LLSnapshotLivePreview::SNAPSHOT_POSTCARD && got_bytes && got_snap && previewp->getDataSize() <= MAX_POSTCARD_DATASIZE);
1249 floater->childSetEnabled("upload_btn", shot_type == LLSnapshotLivePreview::SNAPSHOT_TEXTURE && got_bytes && got_snap);
1250 floater->childSetEnabled("save_btn", shot_type == LLSnapshotLivePreview::SNAPSHOT_LOCAL && got_bytes && got_snap);
1251
1252 LLLocale locale(LLLocale::USER_LOCALE);
1253 std::string bytes_string;
1254 LLResMgr::getInstance()->getIntegerString(bytes_string, (previewp->getDataSize()) >> 10 );
1255 floater->childSetTextArg("file_size_label", "[SIZE]", got_snap ? bytes_string : got_bytes ? floater->getString("unknown") : std::string("???"));
1256 floater->childSetColor("file_size_label",
1257 shot_type == LLSnapshotLivePreview::SNAPSHOT_POSTCARD
1258 && got_bytes
1259 && previewp->getDataSize() > MAX_POSTCARD_DATASIZE ? LLColor4::red : gColors.getColor( "LabelTextColor" ));
1260
1243 switch(shot_type) 1261 switch(shot_type)
1244 { 1262 {
1245 case LLSnapshotLivePreview::SNAPSHOT_POSTCARD: 1263 case LLSnapshotLivePreview::SNAPSHOT_POSTCARD:
@@ -1270,7 +1288,6 @@ void LLFloaterSnapshot::Impl::updateControls(LLFloaterSnapshot* floater)
1270 1288
1271 updateResolutionTextEntry(floater); 1289 updateResolutionTextEntry(floater);
1272 1290
1273 LLSnapshotLivePreview* previewp = getPreviewView(floater);
1274 if (previewp) 1291 if (previewp)
1275 { 1292 {
1276 previewp->setSnapshotType(shot_type); 1293 previewp->setSnapshotType(shot_type);
@@ -1389,6 +1406,7 @@ void LLFloaterSnapshot::Impl::onClickAutoSnap(LLUICtrl *ctrl, void* data)
1389 if (view) 1406 if (view)
1390 { 1407 {
1391 checkAutoSnapshot(getPreviewView(view)); 1408 checkAutoSnapshot(getPreviewView(view));
1409 updateControls(view);
1392 } 1410 }
1393} 1411}
1394 1412
@@ -1401,9 +1419,12 @@ void LLFloaterSnapshot::Impl::onClickMore(void* data)
1401 { 1419 {
1402 view->translate( 0, view->getUIWinHeightShort() - view->getUIWinHeightLong() ); 1420 view->translate( 0, view->getUIWinHeightShort() - view->getUIWinHeightLong() );
1403 view->reshape(view->getRect().getWidth(), view->getUIWinHeightLong()); 1421 view->reshape(view->getRect().getWidth(), view->getUIWinHeightLong());
1404
1405 updateControls(view) ; 1422 updateControls(view) ;
1406 updateLayout(view) ; 1423 updateLayout(view) ;
1424 if(getPreviewView(view))
1425 {
1426 getPreviewView(view)->setThumbnailImageSize() ;
1427 }
1407 } 1428 }
1408} 1429}
1409void LLFloaterSnapshot::Impl::onClickLess(void* data) 1430void LLFloaterSnapshot::Impl::onClickLess(void* data)
@@ -1415,10 +1436,8 @@ void LLFloaterSnapshot::Impl::onClickLess(void* data)
1415 { 1436 {
1416 view->translate( 0, view->getUIWinHeightLong() - view->getUIWinHeightShort() ); 1437 view->translate( 0, view->getUIWinHeightLong() - view->getUIWinHeightShort() );
1417 view->reshape(view->getRect().getWidth(), view->getUIWinHeightShort()); 1438 view->reshape(view->getRect().getWidth(), view->getUIWinHeightShort());
1418
1419 updateControls(view) ; 1439 updateControls(view) ;
1420 updateLayout(view) ; 1440 updateLayout(view) ;
1421
1422 if(getPreviewView(view)) 1441 if(getPreviewView(view))
1423 { 1442 {
1424 getPreviewView(view)->setThumbnailImageSize() ; 1443 getPreviewView(view)->setThumbnailImageSize() ;
@@ -1436,6 +1455,7 @@ void LLFloaterSnapshot::Impl::onClickUICheck(LLUICtrl *ctrl, void* data)
1436 if (view) 1455 if (view)
1437 { 1456 {
1438 checkAutoSnapshot(getPreviewView(view), TRUE); 1457 checkAutoSnapshot(getPreviewView(view), TRUE);
1458 updateControls(view);
1439 } 1459 }
1440} 1460}
1441 1461
@@ -1449,6 +1469,7 @@ void LLFloaterSnapshot::Impl::onClickHUDCheck(LLUICtrl *ctrl, void* data)
1449 if (view) 1469 if (view)
1450 { 1470 {
1451 checkAutoSnapshot(getPreviewView(view), TRUE); 1471 checkAutoSnapshot(getPreviewView(view), TRUE);
1472 updateControls(view);
1452 } 1473 }
1453} 1474}
1454 1475
@@ -1482,6 +1503,7 @@ void LLFloaterSnapshot::Impl::onClickKeepAspectCheck(LLUICtrl* ctrl, void* data)
1482 } 1503 }
1483 1504
1484 previewp->setSize(w, h) ; 1505 previewp->setSize(w, h) ;
1506 previewp->updateSnapshot(FALSE, TRUE);
1485 checkAutoSnapshot(previewp, TRUE); 1507 checkAutoSnapshot(previewp, TRUE);
1486 } 1508 }
1487 } 1509 }
@@ -1531,7 +1553,7 @@ void LLFloaterSnapshot::Impl::checkAspectRatio(LLFloaterSnapshot *view, S32 inde
1531 } 1553 }
1532#endif 1554#endif
1533 1555
1534 if(!index) //current window size 1556 if(0 == index) //current window size
1535 { 1557 {
1536 sAspectRatioCheckOff = TRUE ; 1558 sAspectRatioCheckOff = TRUE ;
1537 view->childSetEnabled("keep_aspect_check", FALSE) ; 1559 view->childSetEnabled("keep_aspect_check", FALSE) ;
@@ -1568,8 +1590,27 @@ void LLFloaterSnapshot::Impl::checkAspectRatio(LLFloaterSnapshot *view, S32 inde
1568 return ; 1590 return ;
1569} 1591}
1570 1592
1593static std::string lastSnapshotWidthName()
1594{
1595 switch(gSavedSettings.getS32("LastSnapshotType"))
1596 {
1597 case LLSnapshotLivePreview::SNAPSHOT_POSTCARD: return "LastSnapshotToEmailWidth";
1598 case LLSnapshotLivePreview::SNAPSHOT_TEXTURE: return "LastSnapshotToInventoryWidth";
1599 default: return "LastSnapshotToDiskWidth";
1600 }
1601}
1602static std::string lastSnapshotHeightName()
1603{
1604 switch(gSavedSettings.getS32("LastSnapshotType"))
1605 {
1606 case LLSnapshotLivePreview::SNAPSHOT_POSTCARD: return "LastSnapshotToEmailHeight";
1607 case LLSnapshotLivePreview::SNAPSHOT_TEXTURE: return "LastSnapshotToInventoryHeight";
1608 default: return "LastSnapshotToDiskHeight";
1609 }
1610}
1611
1571// static 1612// static
1572void LLFloaterSnapshot::Impl::onCommitResolution(LLUICtrl* ctrl, void* data) 1613void LLFloaterSnapshot::Impl::updateResolution(LLUICtrl* ctrl, void* data, BOOL do_update)
1573{ 1614{
1574 LLComboBox* combobox = (LLComboBox*)ctrl; 1615 LLComboBox* combobox = (LLComboBox*)ctrl;
1575 LLFloaterSnapshot *view = (LLFloaterSnapshot *)data; 1616 LLFloaterSnapshot *view = (LLFloaterSnapshot *)data;
@@ -1580,13 +1621,9 @@ void LLFloaterSnapshot::Impl::onCommitResolution(LLUICtrl* ctrl, void* data)
1580 } 1621 }
1581 1622
1582 // save off all selected resolution values 1623 // save off all selected resolution values
1583 LLComboBox* combo; 1624 gSavedSettings.setS32("SnapshotPostcardLastResolution", view->getChild<LLComboBox>("postcard_size_combo")->getCurrentIndex());
1584 combo = view->getChild<LLComboBox>("postcard_size_combo"); 1625 gSavedSettings.setS32("SnapshotTextureLastResolution", view->getChild<LLComboBox>("texture_size_combo")->getCurrentIndex());
1585 gSavedSettings.setS32("SnapshotPostcardLastResolution", combo->getCurrentIndex()); 1626 gSavedSettings.setS32("SnapshotLocalLastResolution", view->getChild<LLComboBox>("local_size_combo")->getCurrentIndex());
1586 combo = view->getChild<LLComboBox>("texture_size_combo");
1587 gSavedSettings.setS32("SnapshotTextureLastResolution", combo->getCurrentIndex());
1588 combo = view->getChild<LLComboBox>("local_size_combo");
1589 gSavedSettings.setS32("SnapshotLocalLastResolution", combo->getCurrentIndex());
1590 1627
1591 std::string sdstring = combobox->getSelectedValue(); 1628 std::string sdstring = combobox->getSelectedValue();
1592 LLSD sdres; 1629 LLSD sdres;
@@ -1601,15 +1638,17 @@ void LLFloaterSnapshot::Impl::onCommitResolution(LLUICtrl* ctrl, void* data)
1601 { 1638 {
1602 if (width == 0 || height == 0) 1639 if (width == 0 || height == 0)
1603 { 1640 {
1641 // take resolution from current window size
1604 previewp->setSize(gViewerWindow->getWindowDisplayWidth(), gViewerWindow->getWindowDisplayHeight()); 1642 previewp->setSize(gViewerWindow->getWindowDisplayWidth(), gViewerWindow->getWindowDisplayHeight());
1605 } 1643 }
1606 else if (width == -1 || height == -1) 1644 else if (width == -1 || height == -1)
1607 { 1645 {
1608 // load last custom value 1646 // load last custom value
1609 previewp->setSize(gSavedSettings.getS32("LastSnapshotWidth"), gSavedSettings.getS32("LastSnapshotHeight")); 1647 previewp->setSize(gSavedSettings.getS32(lastSnapshotWidthName()), gSavedSettings.getS32(lastSnapshotHeightName()));
1610 } 1648 }
1611 else 1649 else
1612 { 1650 {
1651 // use the resolution from the selected pre-canned drop-down choice
1613 previewp->setSize(width, height); 1652 previewp->setSize(width, height);
1614 } 1653 }
1615 1654
@@ -1623,10 +1662,18 @@ void LLFloaterSnapshot::Impl::onCommitResolution(LLUICtrl* ctrl, void* data)
1623 } 1662 }
1624 previewp->setSize(width, height); 1663 previewp->setSize(width, height);
1625 1664
1665 if(view->childGetValue("snapshot_width").asInteger() != width || view->childGetValue("snapshot_height").asInteger() != height)
1666 {
1626 view->childSetValue("snapshot_width", width); 1667 view->childSetValue("snapshot_width", width);
1627 view->childSetValue("snapshot_height", height); 1668 view->childSetValue("snapshot_height", height);
1628 // hide old preview as the aspect ratio could be wrong 1669 // hide old preview as the aspect ratio could be wrong
1629 checkAutoSnapshot(previewp, FALSE); 1670 checkAutoSnapshot(previewp, FALSE);
1671 getPreviewView(view)->updateSnapshot(FALSE, TRUE);
1672 if(do_update)
1673 {
1674 updateControls(view);
1675 }
1676 }
1630 } 1677 }
1631} 1678}
1632 1679
@@ -1675,17 +1722,28 @@ void LLFloaterSnapshot::Impl::onCommitSnapshotFormat(LLUICtrl* ctrl, void* data)
1675 1722
1676 1723
1677 1724
1678 1725// Sets the named size combo to "custom" mode.
1679// static 1726// static
1680void LLFloaterSnapshot::Impl::comboSetCustom(LLFloaterSnapshot* floater, const std::string& comboname) 1727void LLFloaterSnapshot::Impl::comboSetCustom(LLFloaterSnapshot* floater, const std::string& comboname)
1681{ 1728{
1682 LLComboBox* combo = floater->getChild<LLComboBox>(comboname); 1729 LLComboBox* combo = floater->getChild<LLComboBox>(comboname);
1683 if (combo)
1684 {
1685 combo->setCurrentByIndex(combo->getItemCount() - 1);
1686 1730
1687 checkAspectRatio(floater, -1);//combo->getCurrentIndex()) ; 1731 combo->setCurrentByIndex(combo->getItemCount() - 1); // "custom" is always the last index
1732
1733 if(comboname == "postcard_size_combo")
1734 {
1735 gSavedSettings.setS32("SnapshotPostcardLastResolution", combo->getCurrentIndex());
1736 }
1737 else if(comboname == "texture_size_combo")
1738 {
1739 gSavedSettings.setS32("SnapshotTextureLastResolution", combo->getCurrentIndex());
1688 } 1740 }
1741 else if(comboname == "local_size_combo")
1742 {
1743 gSavedSettings.setS32("SnapshotLocalLastResolution", combo->getCurrentIndex());
1744 }
1745
1746 checkAspectRatio(floater, -1); // -1 means custom
1689} 1747}
1690 1748
1691 1749
@@ -1711,8 +1769,8 @@ BOOL LLFloaterSnapshot::Impl::checkImageSize(LLSnapshotLivePreview* previewp, S3
1711 1769
1712 //round to nearest power of 2 based on the direction of movement 1770 //round to nearest power of 2 based on the direction of movement
1713 // i.e. higher power of two if increasing texture resolution 1771 // i.e. higher power of two if increasing texture resolution
1714 if(gSavedSettings.getS32("LastSnapshotWidth") < width || 1772 if(gSavedSettings.getS32("LastSnapshotToInventoryWidth") < width ||
1715 gSavedSettings.getS32("LastSnapshotHeight") < height) 1773 gSavedSettings.getS32("LastSnapshotToInventoryHeight") < height)
1716 { 1774 {
1717 // Up arrow pressed 1775 // Up arrow pressed
1718 width = get_next_power_two(width, MAX_TEXTURE_SIZE) ; 1776 width = get_next_power_two(width, MAX_TEXTURE_SIZE) ;
@@ -1772,20 +1830,10 @@ BOOL LLFloaterSnapshot::Impl::checkImageSize(LLSnapshotLivePreview* previewp, S3
1772//static 1830//static
1773void LLFloaterSnapshot::Impl::resetSnapshotSizeOnUI(LLFloaterSnapshot *view, S32 width, S32 height) 1831void LLFloaterSnapshot::Impl::resetSnapshotSizeOnUI(LLFloaterSnapshot *view, S32 width, S32 height)
1774{ 1832{
1775 LLSpinCtrl *sctrl = view->getChild<LLSpinCtrl>("snapshot_width") ; 1833 view->getChild<LLSpinCtrl>("snapshot_width")->forceSetValue(width);
1776 if(sctrl) 1834 view->getChild<LLSpinCtrl>("snapshot_height")->forceSetValue(height);
1777 { 1835 gSavedSettings.setS32(lastSnapshotWidthName(), width);
1778 sctrl->forceSetValue(width) ; 1836 gSavedSettings.setS32(lastSnapshotHeightName(), height);
1779 }
1780
1781 sctrl = view->getChild<LLSpinCtrl>("snapshot_height") ;
1782 if(sctrl)
1783 {
1784 sctrl->forceSetValue(height) ;
1785 }
1786
1787 gSavedSettings.setS32("LastSnapshotWidth", width);
1788 gSavedSettings.setS32("LastSnapshotHeight", height);
1789} 1837}
1790 1838
1791//static 1839//static
@@ -1839,15 +1887,17 @@ void LLFloaterSnapshot::Impl::onCommitCustomResolution(LLUICtrl *ctrl, void* dat
1839 1887
1840 previewp->setSize(w,h); 1888 previewp->setSize(w,h);
1841 checkAutoSnapshot(previewp, FALSE); 1889 checkAutoSnapshot(previewp, FALSE);
1890 previewp->updateSnapshot(FALSE, TRUE);
1842 comboSetCustom(view, "postcard_size_combo"); 1891 comboSetCustom(view, "postcard_size_combo");
1843 comboSetCustom(view, "texture_size_combo"); 1892 comboSetCustom(view, "texture_size_combo");
1844 comboSetCustom(view, "local_size_combo"); 1893 comboSetCustom(view, "local_size_combo");
1845 } 1894 }
1846 } 1895 }
1847 1896
1848 gSavedSettings.setS32("LastSnapshotWidth", w); 1897 gSavedSettings.setS32(lastSnapshotWidthName(), w);
1849 gSavedSettings.setS32("LastSnapshotHeight", h); 1898 gSavedSettings.setS32(lastSnapshotHeightName(), h);
1850 1899
1900 updateControls(view);
1851 } 1901 }
1852} 1902}
1853 1903
@@ -1883,6 +1933,7 @@ LLFloaterSnapshot::~LLFloaterSnapshot()
1883 delete &impl; 1933 delete &impl;
1884} 1934}
1885 1935
1936
1886BOOL LLFloaterSnapshot::postBuild() 1937BOOL LLFloaterSnapshot::postBuild()
1887{ 1938{
1888 childSetCommitCallback("snapshot_type_radio", Impl::onCommitSnapshotType, this); 1939 childSetCommitCallback("snapshot_type_radio", Impl::onCommitSnapshotType, this);
@@ -1890,11 +1941,6 @@ BOOL LLFloaterSnapshot::postBuild()
1890 1941
1891 childSetAction("new_snapshot_btn", Impl::onClickNewSnapshot, this); 1942 childSetAction("new_snapshot_btn", Impl::onClickNewSnapshot, this);
1892 1943
1893 childSetValue("auto_snapshot_check", gSavedSettings.getBOOL("AutoSnapshot"));
1894 childSetCommitCallback("auto_snapshot_check", Impl::onClickAutoSnap, this);
1895
1896 //childSetValue("advance_snapshot_check", gSavedSettings.getBOOL("AdvanceSnapshot"));
1897 //childSetCommitCallback("advance_snapshot_check", Impl::onClickAdvanceSnap, this);
1898 childSetAction("more_btn", Impl::onClickMore, this); 1944 childSetAction("more_btn", Impl::onClickMore, this);
1899 childSetAction("less_btn", Impl::onClickLess, this); 1945 childSetAction("less_btn", Impl::onClickLess, this);
1900 1946
@@ -1907,10 +1953,10 @@ BOOL LLFloaterSnapshot::postBuild()
1907 childSetValue("image_quality_slider", gSavedSettings.getS32("SnapshotQuality")); 1953 childSetValue("image_quality_slider", gSavedSettings.getS32("SnapshotQuality"));
1908 1954
1909 childSetCommitCallback("snapshot_width", Impl::onCommitCustomResolution, this); 1955 childSetCommitCallback("snapshot_width", Impl::onCommitCustomResolution, this);
1910
1911 childSetCommitCallback("snapshot_height", Impl::onCommitCustomResolution, this); 1956 childSetCommitCallback("snapshot_height", Impl::onCommitCustomResolution, this);
1912 1957
1913 childSetCommitCallback("ui_check", Impl::onClickUICheck, this); 1958 childSetCommitCallback("ui_check", Impl::onClickUICheck, this);
1959 childSetValue("ui_check", gSavedSettings.getBOOL("RenderUIInSnapshot"));
1914 1960
1915 childSetCommitCallback("hud_check", Impl::onClickHUDCheck, this); 1961 childSetCommitCallback("hud_check", Impl::onClickHUDCheck, this);
1916 childSetValue("hud_check", gSavedSettings.getBOOL("RenderHUDInSnapshot")); 1962 childSetValue("hud_check", gSavedSettings.getBOOL("RenderHUDInSnapshot"));
@@ -1925,12 +1971,15 @@ BOOL LLFloaterSnapshot::postBuild()
1925 childSetValue("layer_types", "colors"); 1971 childSetValue("layer_types", "colors");
1926 childSetEnabled("layer_types", FALSE); 1972 childSetEnabled("layer_types", FALSE);
1927 1973
1928 childSetValue("snapshot_width", gSavedSettings.getS32("LastSnapshotWidth")); 1974 childSetValue("snapshot_width", gSavedSettings.getS32(lastSnapshotWidthName()));
1929 childSetValue("snapshot_height", gSavedSettings.getS32("LastSnapshotHeight")); 1975 childSetValue("snapshot_height", gSavedSettings.getS32(lastSnapshotHeightName()));
1930 1976
1931 childSetValue("freeze_frame_check", gSavedSettings.getBOOL("UseFreezeFrame")); 1977 childSetValue("freeze_frame_check", gSavedSettings.getBOOL("UseFreezeFrame"));
1932 childSetCommitCallback("freeze_frame_check", Impl::onCommitFreezeFrame, this); 1978 childSetCommitCallback("freeze_frame_check", Impl::onCommitFreezeFrame, this);
1933 1979
1980 childSetValue("auto_snapshot_check", gSavedSettings.getBOOL("AutoSnapshot"));
1981 childSetCommitCallback("auto_snapshot_check", Impl::onClickAutoSnap, this);
1982
1934 childSetCommitCallback("postcard_size_combo", Impl::onCommitResolution, this); 1983 childSetCommitCallback("postcard_size_combo", Impl::onCommitResolution, this);
1935 childSetCommitCallback("texture_size_combo", Impl::onCommitResolution, this); 1984 childSetCommitCallback("texture_size_combo", Impl::onCommitResolution, this);
1936 childSetCommitCallback("local_size_combo", Impl::onCommitResolution, this); 1985 childSetCommitCallback("local_size_combo", Impl::onCommitResolution, this);
@@ -1960,53 +2009,6 @@ void LLFloaterSnapshot::draw()
1960 return; 2009 return;
1961 } 2010 }
1962 2011
1963 if(!isMinimized())
1964 {
1965 if (previewp && previewp->getDataSize() > 0)
1966 {
1967 LLLocale locale(LLLocale::USER_LOCALE);
1968
1969 std::string bytes_string;
1970 if (previewp->getSnapshotType() == LLSnapshotLivePreview::SNAPSHOT_POSTCARD &&
1971 previewp->getDataSize() > MAX_POSTCARD_DATASIZE)
1972 {
1973 childSetColor("file_size_label", LLColor4::red);
1974 childSetEnabled("send_btn", FALSE);
1975 }
1976 else
1977 {
1978 childSetColor("file_size_label", gColors.getColor( "LabelTextColor" ));
1979 childSetEnabled("send_btn", previewp->getSnapshotUpToDate());
1980 }
1981
1982 if (previewp->getSnapshotUpToDate())
1983 {
1984 std::string bytes_string;
1985 LLResMgr::getInstance()->getIntegerString(bytes_string, (previewp->getDataSize()) >> 10 );
1986 childSetTextArg("file_size_label", "[SIZE]", bytes_string);
1987 }
1988 else
1989 {
1990 childSetTextArg("file_size_label", "[SIZE]", getString("unknown"));
1991 childSetColor("file_size_label", gColors.getColor( "LabelTextColor" ));
1992 }
1993 childSetEnabled("upload_btn", previewp->getSnapshotUpToDate());
1994 childSetEnabled("save_btn", previewp->getSnapshotUpToDate());
1995
1996 }
1997 else
1998 {
1999 childSetTextArg("file_size_label", "[SIZE]", std::string("???"));
2000 childSetEnabled("upload_btn", FALSE);
2001 childSetEnabled("send_btn", FALSE);
2002 childSetEnabled("save_btn", FALSE);
2003 }
2004
2005 BOOL ui_in_snapshot = gSavedSettings.getBOOL("RenderUIInSnapshot");
2006 childSetValue("ui_check", ui_in_snapshot);
2007 childSetToolTip("ui_check", std::string("If selected shows the UI in the snapshot"));
2008 }
2009
2010 LLFloater::draw(); 2012 LLFloater::draw();
2011 2013
2012 if (previewp) 2014 if (previewp)
@@ -2071,10 +2073,15 @@ void LLFloaterSnapshot::hide(void*)
2071//static 2073//static
2072void LLFloaterSnapshot::update() 2074void LLFloaterSnapshot::update()
2073{ 2075{
2076 BOOL changed = FALSE;
2074 for (std::set<LLSnapshotLivePreview*>::iterator iter = LLSnapshotLivePreview::sList.begin(); 2077 for (std::set<LLSnapshotLivePreview*>::iterator iter = LLSnapshotLivePreview::sList.begin();
2075 iter != LLSnapshotLivePreview::sList.end(); ++iter) 2078 iter != LLSnapshotLivePreview::sList.end(); ++iter)
2076 { 2079 {
2077 LLSnapshotLivePreview::onIdle(*iter); 2080 changed |= LLSnapshotLivePreview::onIdle(*iter);
2081 }
2082 if(changed)
2083 {
2084 sInstance->impl.updateControls(sInstance);
2078 } 2085 }
2079} 2086}
2080 2087
diff --git a/linden/indra/newview/llfloatertopobjects.cpp b/linden/indra/newview/llfloatertopobjects.cpp
index ada5c68..96492e8 100644
--- a/linden/indra/newview/llfloatertopobjects.cpp
+++ b/linden/indra/newview/llfloatertopobjects.cpp
@@ -180,7 +180,7 @@ void LLFloaterTopObjects::handleReply(LLMessageSystem *msg, void** data)
180 msg->getF32Fast(_PREHASH_ReportData, _PREHASH_Score, score, block); 180 msg->getF32Fast(_PREHASH_ReportData, _PREHASH_Score, score, block);
181 msg->getStringFast(_PREHASH_ReportData, _PREHASH_TaskName, name_buf, block); 181 msg->getStringFast(_PREHASH_ReportData, _PREHASH_TaskName, name_buf, block);
182 msg->getStringFast(_PREHASH_ReportData, _PREHASH_OwnerName, owner_buf, block); 182 msg->getStringFast(_PREHASH_ReportData, _PREHASH_OwnerName, owner_buf, block);
183 if(msg->getNumberOfBlocks("DataExtended")) 183 if(msg->has("DataExtended"))
184 { 184 {
185 have_extended_data = true; 185 have_extended_data = true;
186 msg->getU32("DataExtended", "TimeStamp", time_stamp, block); 186 msg->getU32("DataExtended", "TimeStamp", time_stamp, block);
diff --git a/linden/indra/newview/llfolderview.cpp b/linden/indra/newview/llfolderview.cpp
index 8cefd5b..932addb 100644
--- a/linden/indra/newview/llfolderview.cpp
+++ b/linden/indra/newview/llfolderview.cpp
@@ -821,7 +821,7 @@ void LLFolderViewItem::draw()
821 // mShowSingleSelection is FALSE 821 // mShowSingleSelection is FALSE
822 if( mIsSelected ) 822 if( mIsSelected )
823 { 823 {
824 LLGLSNoTexture gls_no_texture; 824 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
825 LLColor4 bg_color = sHighlightBgColor; 825 LLColor4 bg_color = sHighlightBgColor;
826 //const S32 TRAILING_PAD = 5; // It just looks better with this. 826 //const S32 TRAILING_PAD = 5; // It just looks better with this.
827 if (!mIsCurSelection) 827 if (!mIsCurSelection)
@@ -876,7 +876,7 @@ void LLFolderViewItem::draw()
876 } 876 }
877 if (mDragAndDropTarget) 877 if (mDragAndDropTarget)
878 { 878 {
879 LLGLSNoTexture gls_no_texture; 879 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
880 gl_rect_2d( 880 gl_rect_2d(
881 0, 881 0,
882 getRect().getHeight(), 882 getRect().getHeight(),
diff --git a/linden/indra/newview/llframestatview.cpp b/linden/indra/newview/llframestatview.cpp
index 752c6c4..a7d08cf 100644
--- a/linden/indra/newview/llframestatview.cpp
+++ b/linden/indra/newview/llframestatview.cpp
@@ -98,7 +98,7 @@ void LLFrameStatView::draw()
98 S32 j; 98 S32 j;
99 LLStat *statp; 99 LLStat *statp;
100 100
101 LLGLSNoTexture gls_no_texture; 101 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
102 102
103 statp = mStats[0]; 103 statp = mStats[0];
104 if (!statp) 104 if (!statp)
@@ -159,7 +159,7 @@ void LLFrameStatView::draw()
159 for (i = 0; i < mNumStats; i++) 159 for (i = 0; i < mNumStats; i++)
160 { 160 {
161 // Draw the color key. 161 // Draw the color key.
162 LLGLSNoTexture gls_no_texture; 162 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
163 gl_rect_2d(left, top - 2, left + 10, top - 12, mColors[i]); 163 gl_rect_2d(left, top - 2, left + 10, top - 12, mColors[i]);
164 164
165 left = left + 15; 165 left = left + 15;
@@ -203,7 +203,7 @@ void LLFrameStatView::draw()
203 bottom = bottom - 4; 203 bottom = bottom - 4;
204 for (tick_value = 0; tick_value <= 100; tick_value += 20) 204 for (tick_value = 0; tick_value <= 100; tick_value += 20)
205 { 205 {
206 LLGLSNoTexture gls_no_texture; 206 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
207 left = 10 + llfloor(tick_value*(total_width/100.f)); 207 left = 10 + llfloor(tick_value*(total_width/100.f));
208 right = left + 1; 208 right = left + 1;
209 gl_rect_2d(left, top, right, bottom, LLColor4(1.f, 1.f, 1.f, 0.2f)); 209 gl_rect_2d(left, top, right, bottom, LLColor4(1.f, 1.f, 1.f, 0.2f));
@@ -253,7 +253,7 @@ void LLFrameStatView::draw()
253 bottom = top - graph_height - 4; 253 bottom = top - graph_height - 4;
254 for (tick_value = 0; tick_value <= 100; tick_value += 20) 254 for (tick_value = 0; tick_value <= 100; tick_value += 20)
255 { 255 {
256 LLGLSNoTexture gls_no_texture; 256 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
257 left = 10 + llfloor(tick_value*(total_width/100.f)); 257 left = 10 + llfloor(tick_value*(total_width/100.f));
258 right = left + 1; 258 right = left + 1;
259 gl_rect_2d(left, top, right, bottom, LLColor4(1.f, 1.f, 1.f, 0.25f)); 259 gl_rect_2d(left, top, right, bottom, LLColor4(1.f, 1.f, 1.f, 0.25f));
@@ -278,7 +278,7 @@ void LLFrameStatView::draw()
278 bottom = top - graph_height - 4; 278 bottom = top - graph_height - 4;
279 for (tick_value = 0; tick_value <= mTotalTime; tick_value += mLabelSpacing) 279 for (tick_value = 0; tick_value <= mTotalTime; tick_value += mLabelSpacing)
280 { 280 {
281 LLGLSNoTexture gls_no_texture; 281 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
282 left = 10 + llfloor(tick_value*time_scale); 282 left = 10 + llfloor(tick_value*time_scale);
283 right = left + 1; 283 right = left + 1;
284 gl_rect_2d(left, top, right, bottom, LLColor4(1.f, 1.f, 1.f, 0.25f)); 284 gl_rect_2d(left, top, right, bottom, LLColor4(1.f, 1.f, 1.f, 0.25f));
diff --git a/linden/indra/newview/llglsandbox.cpp b/linden/indra/newview/llglsandbox.cpp
index 45f674d..c5a626f 100644
--- a/linden/indra/newview/llglsandbox.cpp
+++ b/linden/indra/newview/llglsandbox.cpp
@@ -142,7 +142,7 @@ void LLAgent::renderAutoPilotTarget()
142 gGL.pushMatrix(); 142 gGL.pushMatrix();
143 143
144 // not textured 144 // not textured
145 LLGLSNoTexture no_texture; 145 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
146 146
147 // lovely green 147 // lovely green
148 glColor4f(0.f, 1.f, 1.f, 1.f); 148 glColor4f(0.f, 1.f, 1.f, 1.f);
@@ -355,10 +355,11 @@ void LLCompass::draw()
355 355
356 if (mBkgndTexture) 356 if (mBkgndTexture)
357 { 357 {
358 mBkgndTexture->bind(); 358 gGL.getTexUnit(0)->bind(mBkgndTexture.get());
359
359 gGL.color4f(1.0f, 1.0f, 1.0f, 1.0f); 360 gGL.color4f(1.0f, 1.0f, 1.0f, 1.0f);
360 361
361 gGL.begin(LLVertexBuffer::QUADS); 362 gGL.begin(LLRender::QUADS);
362 363
363 gGL.texCoord2f(1.f, 1.f); 364 gGL.texCoord2f(1.f, 1.f);
364 gGL.vertex2i(width, height); 365 gGL.vertex2i(width, height);
@@ -381,10 +382,10 @@ void LLCompass::draw()
381 382
382 if (mTexture) 383 if (mTexture)
383 { 384 {
384 mTexture->bind(); 385 gGL.getTexUnit(0)->bind(mTexture.get());
385 gGL.color4f(1.0f, 1.0f, 1.0f, 1.0f); 386 gGL.color4f(1.0f, 1.0f, 1.0f, 1.0f);
386 387
387 gGL.begin(LLVertexBuffer::QUADS); 388 gGL.begin(LLRender::QUADS);
388 389
389 gGL.texCoord2f(1.f, 1.f); 390 gGL.texCoord2f(1.f, 1.f);
390 gGL.vertex2i(width, height); 391 gGL.vertex2i(width, height);
@@ -426,9 +427,9 @@ void LLHorizontalCompass::draw()
426 F32 left = center - COMPASS_RANGE; 427 F32 left = center - COMPASS_RANGE;
427 F32 right = center + COMPASS_RANGE; 428 F32 right = center + COMPASS_RANGE;
428 429
429 mTexture->bind(); 430 gGL.getTexUnit(0)->bind(mTexture.get());
430 gGL.color4f(1.0f, 1.0f, 1.0f, 1.0f ); 431 gGL.color4f(1.0f, 1.0f, 1.0f, 1.0f );
431 gGL.begin( LLVertexBuffer::QUADS ); 432 gGL.begin( LLRender::QUADS );
432 433
433 gGL.texCoord2f(right, 1.f); 434 gGL.texCoord2f(right, 1.f);
434 gGL.vertex2i(width, height); 435 gGL.vertex2i(width, height);
@@ -447,7 +448,7 @@ void LLHorizontalCompass::draw()
447 448
448 // Draw the focus line 449 // Draw the focus line
449 { 450 {
450 LLGLSNoTexture gls_no_texture; 451 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
451 gGL.color4fv( mFocusColor.mV ); 452 gGL.color4fv( mFocusColor.mV );
452 gl_line_2d( half_width, 0, half_width, height ); 453 gl_line_2d( half_width, 0, half_width, height );
453 } 454 }
@@ -465,7 +466,7 @@ void LLWind::renderVectors()
465 466
466 F32 region_width_meters = LLWorld::getInstance()->getRegionWidthInMeters(); 467 F32 region_width_meters = LLWorld::getInstance()->getRegionWidthInMeters();
467 468
468 LLGLSNoTexture gls_no_texture; 469 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
469 gGL.pushMatrix(); 470 gGL.pushMatrix();
470 LLVector3 origin_agent; 471 LLVector3 origin_agent;
471 origin_agent = gAgent.getPosAgentFromGlobal(mOriginGlobal); 472 origin_agent = gAgent.getPosAgentFromGlobal(mOriginGlobal);
@@ -479,11 +480,11 @@ void LLWind::renderVectors()
479 gGL.pushMatrix(); 480 gGL.pushMatrix();
480 gGL.translatef((F32)i * region_width_meters/mSize, (F32)j * region_width_meters/mSize, 0.0); 481 gGL.translatef((F32)i * region_width_meters/mSize, (F32)j * region_width_meters/mSize, 0.0);
481 gGL.color3f(0,1,0); 482 gGL.color3f(0,1,0);
482 gGL.begin(LLVertexBuffer::POINTS); 483 gGL.begin(LLRender::POINTS);
483 gGL.vertex3f(0,0,0); 484 gGL.vertex3f(0,0,0);
484 gGL.end(); 485 gGL.end();
485 gGL.color3f(1,0,0); 486 gGL.color3f(1,0,0);
486 gGL.begin(LLVertexBuffer::LINES); 487 gGL.begin(LLRender::LINES);
487 gGL.vertex3f(x * 0.1f, y * 0.1f ,0.f); 488 gGL.vertex3f(x * 0.1f, y * 0.1f ,0.f);
488 gGL.vertex3f(x, y, 0.f); 489 gGL.vertex3f(x, y, 0.f);
489 gGL.end(); 490 gGL.end();
@@ -501,7 +502,7 @@ void LLViewerParcelMgr::renderRect(const LLVector3d &west_south_bottom_global,
501 const LLVector3d &east_north_top_global ) 502 const LLVector3d &east_north_top_global )
502{ 503{
503 LLGLSUIDefault gls_ui; 504 LLGLSUIDefault gls_ui;
504 LLGLSNoTexture gls_no_texture; 505 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
505 LLGLDepthTest gls_depth(GL_TRUE); 506 LLGLDepthTest gls_depth(GL_TRUE);
506 507
507 LLVector3 west_south_bottom_agent = gAgent.getPosAgentFromGlobal(west_south_bottom_global); 508 LLVector3 west_south_bottom_agent = gAgent.getPosAgentFromGlobal(west_south_bottom_global);
@@ -532,7 +533,7 @@ void LLViewerParcelMgr::renderRect(const LLVector3d &west_south_bottom_global,
532 gGL.color4f(1.f, 1.f, 0.f, 1.f); 533 gGL.color4f(1.f, 1.f, 0.f, 1.f);
533 534
534 // Cheat and give this the same pick-name as land 535 // Cheat and give this the same pick-name as land
535 gGL.begin(LLVertexBuffer::LINES); 536 gGL.begin(LLRender::LINES);
536 537
537 gGL.vertex3f(west, north, nw_bottom); 538 gGL.vertex3f(west, north, nw_bottom);
538 gGL.vertex3f(west, north, nw_top); 539 gGL.vertex3f(west, north, nw_top);
@@ -549,7 +550,7 @@ void LLViewerParcelMgr::renderRect(const LLVector3d &west_south_bottom_global,
549 gGL.end(); 550 gGL.end();
550 551
551 gGL.color4f(1.f, 1.f, 0.f, 0.2f); 552 gGL.color4f(1.f, 1.f, 0.f, 0.2f);
552 gGL.begin(LLVertexBuffer::QUADS); 553 gGL.begin(LLRender::QUADS);
553 554
554 gGL.vertex3f(west, north, nw_bottom); 555 gGL.vertex3f(west, north, nw_bottom);
555 gGL.vertex3f(west, north, nw_top); 556 gGL.vertex3f(west, north, nw_top);
@@ -609,14 +610,14 @@ void LLViewerParcelMgr::renderParcel(LLParcel* parcel )
609 F32 ne_top = ne_bottom + POST_HEIGHT; 610 F32 ne_top = ne_bottom + POST_HEIGHT;
610 F32 nw_top = nw_bottom + POST_HEIGHT; 611 F32 nw_top = nw_bottom + POST_HEIGHT;
611 612
612 LLGLSNoTexture gls_no_texture; 613 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
613 LLGLDepthTest gls_depth(GL_TRUE); 614 LLGLDepthTest gls_depth(GL_TRUE);
614 615
615 LLUI::setLineWidth(2.f); 616 LLUI::setLineWidth(2.f);
616 gGL.color4f(0.f, 1.f, 1.f, 1.f); 617 gGL.color4f(0.f, 1.f, 1.f, 1.f);
617 618
618 // Cheat and give this the same pick-name as land 619 // Cheat and give this the same pick-name as land
619 gGL.begin(LLVertexBuffer::LINES); 620 gGL.begin(LLRender::LINES);
620 621
621 gGL.vertex3f(west, north, nw_bottom); 622 gGL.vertex3f(west, north, nw_bottom);
622 gGL.vertex3f(west, north, nw_top); 623 gGL.vertex3f(west, north, nw_top);
@@ -633,7 +634,7 @@ void LLViewerParcelMgr::renderParcel(LLParcel* parcel )
633 gGL.end(); 634 gGL.end();
634 635
635 gGL.color4f(0.f, 1.f, 1.f, 0.2f); 636 gGL.color4f(0.f, 1.f, 1.f, 0.2f);
636 gGL.begin(LLVertexBuffer::QUADS); 637 gGL.begin(LLRender::QUADS);
637 638
638 gGL.vertex3f(west, north, nw_bottom); 639 gGL.vertex3f(west, north, nw_bottom);
639 gGL.vertex3f(west, north, nw_top); 640 gGL.vertex3f(west, north, nw_top);
@@ -759,7 +760,7 @@ void LLViewerParcelMgr::renderHighlightSegments(const U8* segments, LLViewerRegi
759 bool has_segments = false; 760 bool has_segments = false;
760 761
761 LLGLSUIDefault gls_ui; 762 LLGLSUIDefault gls_ui;
762 LLGLSNoTexture gls_no_texture; 763 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
763 LLGLDepthTest gls_depth(GL_TRUE); 764 LLGLDepthTest gls_depth(GL_TRUE);
764 765
765 gGL.color4f(1.f, 1.f, 0.f, 0.2f); 766 gGL.color4f(1.f, 1.f, 0.f, 0.2f);
@@ -786,7 +787,7 @@ void LLViewerParcelMgr::renderHighlightSegments(const U8* segments, LLViewerRegi
786 if (!has_segments) 787 if (!has_segments)
787 { 788 {
788 has_segments = true; 789 has_segments = true;
789 gGL.begin(LLVertexBuffer::QUADS); 790 gGL.begin(LLRender::QUADS);
790 } 791 }
791 renderOneSegment(x1, y1, x2, y2, PARCEL_POST_HEIGHT, SOUTH_MASK, regionp); 792 renderOneSegment(x1, y1, x2, y2, PARCEL_POST_HEIGHT, SOUTH_MASK, regionp);
792 } 793 }
@@ -802,7 +803,7 @@ void LLViewerParcelMgr::renderHighlightSegments(const U8* segments, LLViewerRegi
802 if (!has_segments) 803 if (!has_segments)
803 { 804 {
804 has_segments = true; 805 has_segments = true;
805 gGL.begin(LLVertexBuffer::QUADS); 806 gGL.begin(LLRender::QUADS);
806 } 807 }
807 renderOneSegment(x1, y1, x2, y2, PARCEL_POST_HEIGHT, WEST_MASK, regionp); 808 renderOneSegment(x1, y1, x2, y2, PARCEL_POST_HEIGHT, WEST_MASK, regionp);
808 } 809 }
@@ -850,14 +851,14 @@ void LLViewerParcelMgr::renderCollisionSegments(U8* segments, BOOL use_pass, LLV
850 851
851 if (use_pass && (mCollisionBanned == BA_NOT_ON_LIST)) 852 if (use_pass && (mCollisionBanned == BA_NOT_ON_LIST))
852 { 853 {
853 LLViewerImage::bindTexture(mPassImage); 854 gGL.getTexUnit(0)->bind(mPassImage);
854 } 855 }
855 else 856 else
856 { 857 {
857 LLViewerImage::bindTexture(mBlockedImage); 858 gGL.getTexUnit(0)->bind(mBlockedImage);
858 } 859 }
859 860
860 gGL.begin(LLVertexBuffer::QUADS); 861 gGL.begin(LLRender::QUADS);
861 862
862 for (y = 0; y < STRIDE; y++) 863 for (y = 0; y < STRIDE; y++)
863 { 864 {
@@ -1011,10 +1012,10 @@ void LLViewerObjectList::renderObjectBeacons()
1011 LLGLSUIDefault gls_ui; 1012 LLGLSUIDefault gls_ui;
1012 1013
1013 { 1014 {
1014 LLGLSNoTexture gls_ui_no_texture; 1015 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
1015 1016
1016 S32 last_line_width = -1; 1017 S32 last_line_width = -1;
1017 // gGL.begin(LLVertexBuffer::LINES); // Always happens in (line_width != last_line_width) 1018 // gGL.begin(LLRender::LINES); // Always happens in (line_width != last_line_width)
1018 1019
1019 for (S32 i = 0; i < mDebugBeacons.count(); i++) 1020 for (S32 i = 0; i < mDebugBeacons.count(); i++)
1020 { 1021 {
@@ -1031,7 +1032,7 @@ void LLViewerObjectList::renderObjectBeacons()
1031 } 1032 }
1032 glLineWidth( (F32)line_width ); 1033 glLineWidth( (F32)line_width );
1033 last_line_width = line_width; 1034 last_line_width = line_width;
1034 gGL.begin(LLVertexBuffer::LINES); 1035 gGL.begin(LLRender::LINES);
1035 } 1036 }
1036 1037
1037 const LLVector3 &thisline = debug_beacon.mPositionAgent; 1038 const LLVector3 &thisline = debug_beacon.mPositionAgent;
@@ -1049,11 +1050,11 @@ void LLViewerObjectList::renderObjectBeacons()
1049 } 1050 }
1050 1051
1051 { 1052 {
1052 LLGLSNoTexture gls_ui_no_texture; 1053 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
1053 LLGLDepthTest gls_depth(GL_TRUE); 1054 LLGLDepthTest gls_depth(GL_TRUE);
1054 1055
1055 S32 last_line_width = -1; 1056 S32 last_line_width = -1;
1056 // gGL.begin(LLVertexBuffer::LINES); // Always happens in (line_width != last_line_width) 1057 // gGL.begin(LLRender::LINES); // Always happens in (line_width != last_line_width)
1057 1058
1058 for (S32 i = 0; i < mDebugBeacons.count(); i++) 1059 for (S32 i = 0; i < mDebugBeacons.count(); i++)
1059 { 1060 {
@@ -1069,7 +1070,7 @@ void LLViewerObjectList::renderObjectBeacons()
1069 } 1070 }
1070 glLineWidth( (F32)line_width ); 1071 glLineWidth( (F32)line_width );
1071 last_line_width = line_width; 1072 last_line_width = line_width;
1072 gGL.begin(LLVertexBuffer::LINES); 1073 gGL.begin(LLRender::LINES);
1073 } 1074 }
1074 1075
1075 const LLVector3 &thisline = debug_beacon.mPositionAgent; 1076 const LLVector3 &thisline = debug_beacon.mPositionAgent;
diff --git a/linden/indra/newview/llgroupmgr.cpp b/linden/indra/newview/llgroupmgr.cpp
index 30b7cbd..35d408b 100644
--- a/linden/indra/newview/llgroupmgr.cpp
+++ b/linden/indra/newview/llgroupmgr.cpp
@@ -52,6 +52,7 @@
52#include "llfloaterdirectory.h" 52#include "llfloaterdirectory.h"
53#include "llfloatergroupinfo.h" 53#include "llfloatergroupinfo.h"
54#include "lluictrlfactory.h" 54#include "lluictrlfactory.h"
55#include <boost/regex.hpp>
55 56
56 57
57const U32 MAX_CACHED_GROUPS = 10; 58const U32 MAX_CACHED_GROUPS = 10;
@@ -791,6 +792,20 @@ LLGroupMgrGroupData* LLGroupMgr::getGroupData(const LLUUID& id)
791 return NULL; 792 return NULL;
792} 793}
793 794
795// Helper function for LLGroupMgr::processGroupMembersReply
796// This reformats date strings from MM/DD/YYYY to YYYY/MM/DD ( e.g. 1/27/2008 -> 2008/1/27 )
797// so that the sorter can sort by year before month before day.
798static void formatDateString(std::string &date_string)
799{
800 using namespace boost;
801 cmatch result;
802 const regex expression("([0-9]{1,2})/([0-9]{1,2})/([0-9]{4})");
803 if (regex_match(date_string.c_str(), result, expression))
804 {
805 date_string = result[3]+"/"+result[1]+"/"+result[2];
806 }
807}
808
794// static 809// static
795void LLGroupMgr::processGroupMembersReply(LLMessageSystem* msg, void** data) 810void LLGroupMgr::processGroupMembersReply(LLMessageSystem* msg, void** data)
796{ 811{
@@ -840,6 +855,8 @@ void LLGroupMgr::processGroupMembersReply(LLMessageSystem* msg, void** data)
840 855
841 if (member_id.notNull()) 856 if (member_id.notNull())
842 { 857 {
858 formatDateString(online_status); // reformat for sorting, e.g. 12/25/2008 -> 2008/12/25
859
843 //llinfos << "Member " << member_id << " has powers " << std::hex << agent_powers << std::dec << llendl; 860 //llinfos << "Member " << member_id << " has powers " << std::hex << agent_powers << std::dec << llendl;
844 LLGroupMemberData* newdata = new LLGroupMemberData(member_id, 861 LLGroupMemberData* newdata = new LLGroupMemberData(member_id,
845 contribution, 862 contribution,
diff --git a/linden/indra/newview/llhomelocationresponder.cpp b/linden/indra/newview/llhomelocationresponder.cpp
new file mode 100644
index 0000000..9b69310
--- /dev/null
+++ b/linden/indra/newview/llhomelocationresponder.cpp
@@ -0,0 +1,108 @@
1/**
2 * @file llhomelocationresponder.cpp
3 * @author Meadhbh Hamrick
4 * @brief Processes responses to the HomeLocation CapReq
5 *
6 * $LicenseInfo:firstyear=2008&license=viewergpl$
7 *
8 * Copyright (c) 2008, Linden Research, Inc.
9 *
10 * Second Life Viewer Source Code
11 * The source code in this file ("Source Code") is provided by Linden Lab
12 * to you under the terms of the GNU General Public License, version 2.0
13 * ("GPL"), unless you have obtained a separate licensing agreement
14 * ("Other License"), formally executed by you and Linden Lab. Terms of
15 * the GPL can be found in doc/GPL-license.txt in this distribution, or
16 * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
17 *
18 * There are special exceptions to the terms and conditions of the GPL as
19 * it is applied to this Source Code. View the full text of the exception
20 * in the file doc/FLOSS-exception.txt in this software distribution, or
21 * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception
22 *
23 * By copying, modifying or distributing this software, you acknowledge
24 * that you have read and understood your obligations described above,
25 * and agree to abide by those obligations.
26 *
27 * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
28 * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
29 * COMPLETENESS OR PERFORMANCE.
30 * $/LicenseInfo$
31 */
32
33/* File Inclusions */
34#include "llviewerprecompiledheaders.h"
35
36#include "llhomelocationresponder.h"
37#include "llsdutil.h"
38#include "llagent.h"
39#include "llviewerregion.h"
40
41void LLHomeLocationResponder::result( const LLSD& content )
42{
43 LLVector3 agent_pos;
44 bool error = true;
45
46 do {
47
48 // was the call to /agent/<agent-id>/home-location successful?
49 // If not, we keep error set to true
50 if( ! content.has("success") )
51 {
52 break;
53 }
54
55 if( 0 != strncmp("true", content["success"].asString().c_str(), 4 ) )
56 {
57 break;
58 }
59
60 // did the simulator return a "justified" home location?
61 // If no, we keep error set to true
62 if( ! content.has( "HomeLocation" ) )
63 {
64 break;
65 }
66
67 if( ! content["HomeLocation"].has("LocationPos") )
68 {
69 break;
70 }
71
72 if( ! content["HomeLocation"]["LocationPos"].has("X") )
73 {
74 break;
75 }
76
77 agent_pos.mV[VX] = content["HomeLocation"]["LocationPos"]["X"].asInteger();
78
79 if( ! content["HomeLocation"]["LocationPos"].has("Y") )
80 {
81 break;
82 }
83
84 agent_pos.mV[VY] = content["HomeLocation"]["LocationPos"]["Y"].asInteger();
85
86 if( ! content["HomeLocation"]["LocationPos"].has("Z") )
87 {
88 break;
89 }
90
91 agent_pos.mV[VZ] = content["HomeLocation"]["LocationPos"]["Z"].asInteger();
92
93 error = false;
94 } while( 0 );
95
96 if( ! error )
97 {
98 llinfos << "setting home position" << llendl;
99
100 LLViewerRegion *viewer_region = gAgent.getRegion();
101 gAgent.setHomePosRegion( viewer_region->getHandle(), agent_pos );
102 }
103}
104
105void LLHomeLocationResponder::error( const LLSD& content )
106{
107 llinfos << "received error(" << ll_pretty_print_sd( content ) << ")" << llendl;
108}
diff --git a/linden/indra/newview/llhomelocationresponder.h b/linden/indra/newview/llhomelocationresponder.h
new file mode 100644
index 0000000..08291b8
--- /dev/null
+++ b/linden/indra/newview/llhomelocationresponder.h
@@ -0,0 +1,47 @@
1/**
2 * @file llhomelocationresponder.h
3 * @author Meadhbh Hamrick
4 * @brief Processes responses to the HomeLocation CapReq
5 *
6 * $LicenseInfo:firstyear=2008&license=viewergpl$
7 *
8 * Copyright (c) 2008, Linden Research, Inc.
9 *
10 * Second Life Viewer Source Code
11 * The source code in this file ("Source Code") is provided by Linden Lab
12 * to you under the terms of the GNU General Public License, version 2.0
13 * ("GPL"), unless you have obtained a separate licensing agreement
14 * ("Other License"), formally executed by you and Linden Lab. Terms of
15 * the GPL can be found in doc/GPL-license.txt in this distribution, or
16 * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
17 *
18 * There are special exceptions to the terms and conditions of the GPL as
19 * it is applied to this Source Code. View the full text of the exception
20 * in the file doc/FLOSS-exception.txt in this software distribution, or
21 * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception
22 *
23 * By copying, modifying or distributing this software, you acknowledge
24 * that you have read and understood your obligations described above,
25 * and agree to abide by those obligations.
26 *
27 * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
28 * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
29 * COMPLETENESS OR PERFORMANCE.
30 * $/LicenseInfo$
31 */
32
33 /* Macro Definitions */
34#ifndef LL_LLHOMELOCATIONRESPONDER_H
35#define LL_LLHOMELOCATIONRESPONDER_H
36
37/* File Inclusions */
38#include "llhttpclient.h"
39
40/* Typedef, Enum, Class, Struct, etc. */
41class LLHomeLocationResponder : public LLHTTPClient::Responder
42{
43 virtual void result( const LLSD& content );
44 virtual void error( const LLSD& content );
45};
46
47#endif
diff --git a/linden/indra/newview/llhudeffectbeam.cpp b/linden/indra/newview/llhudeffectbeam.cpp
index d6c38d3..2b5fd79 100644
--- a/linden/indra/newview/llhudeffectbeam.cpp
+++ b/linden/indra/newview/llhudeffectbeam.cpp
@@ -251,7 +251,7 @@ void LLHUDEffectBeam::render()
251 } 251 }
252 252
253 LLGLSPipelineAlpha gls_pipeline_alpha; 253 LLGLSPipelineAlpha gls_pipeline_alpha;
254 LLImageGL::unbindTexture(0, GL_TEXTURE_2D); 254 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
255 255
256 256
257 // Interpolate the global fade alpha 257 // Interpolate the global fade alpha
diff --git a/linden/indra/newview/llhudeffectlookat.cpp b/linden/indra/newview/llhudeffectlookat.cpp
index b5f6ec7..5f0bb90 100644
--- a/linden/indra/newview/llhudeffectlookat.cpp
+++ b/linden/indra/newview/llhudeffectlookat.cpp
@@ -499,14 +499,14 @@ void LLHUDEffectLookAt::render()
499{ 499{
500 if (sDebugLookAt && mSourceObject.notNull()) 500 if (sDebugLookAt && mSourceObject.notNull())
501 { 501 {
502 LLGLSNoTexture gls_no_texture; 502 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
503 503
504 LLVector3 target = mTargetPos + ((LLVOAvatar*)(LLViewerObject*)mSourceObject)->mHeadp->getWorldPosition(); 504 LLVector3 target = mTargetPos + ((LLVOAvatar*)(LLViewerObject*)mSourceObject)->mHeadp->getWorldPosition();
505 glMatrixMode(GL_MODELVIEW); 505 glMatrixMode(GL_MODELVIEW);
506 gGL.pushMatrix(); 506 gGL.pushMatrix();
507 gGL.translatef(target.mV[VX], target.mV[VY], target.mV[VZ]); 507 gGL.translatef(target.mV[VX], target.mV[VY], target.mV[VZ]);
508 glScalef(0.3f, 0.3f, 0.3f); 508 glScalef(0.3f, 0.3f, 0.3f);
509 gGL.begin(LLVertexBuffer::LINES); 509 gGL.begin(LLRender::LINES);
510 { 510 {
511 LLColor3 color = (*mAttentions)[mTargetType].mColor; 511 LLColor3 color = (*mAttentions)[mTargetType].mColor;
512 gGL.color3f(color.mV[VRED], color.mV[VGREEN], color.mV[VBLUE]); 512 gGL.color3f(color.mV[VRED], color.mV[VGREEN], color.mV[VBLUE]);
diff --git a/linden/indra/newview/llhudeffectpointat.cpp b/linden/indra/newview/llhudeffectpointat.cpp
index 7ab03f2..2396e1a 100644
--- a/linden/indra/newview/llhudeffectpointat.cpp
+++ b/linden/indra/newview/llhudeffectpointat.cpp
@@ -328,13 +328,13 @@ void LLHUDEffectPointAt::render()
328 update(); 328 update();
329 if (sDebugPointAt && mTargetType != POINTAT_TARGET_NONE) 329 if (sDebugPointAt && mTargetType != POINTAT_TARGET_NONE)
330 { 330 {
331 LLGLSNoTexture gls_no_texture; 331 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
332 332
333 LLVector3 target = mTargetPos + mSourceObject->getRenderPosition(); 333 LLVector3 target = mTargetPos + mSourceObject->getRenderPosition();
334 gGL.pushMatrix(); 334 gGL.pushMatrix();
335 gGL.translatef(target.mV[VX], target.mV[VY], target.mV[VZ]); 335 gGL.translatef(target.mV[VX], target.mV[VY], target.mV[VZ]);
336 glScalef(0.3f, 0.3f, 0.3f); 336 glScalef(0.3f, 0.3f, 0.3f);
337 gGL.begin(LLVertexBuffer::LINES); 337 gGL.begin(LLRender::LINES);
338 { 338 {
339 gGL.color3f(1.f, 0.f, 0.f); 339 gGL.color3f(1.f, 0.f, 0.f);
340 gGL.vertex3f(-1.f, 0.f, 0.f); 340 gGL.vertex3f(-1.f, 0.f, 0.f);
diff --git a/linden/indra/newview/llhudicon.cpp b/linden/indra/newview/llhudicon.cpp
index 85cc996..5d5c6a1 100644
--- a/linden/indra/newview/llhudicon.cpp
+++ b/linden/indra/newview/llhudicon.cpp
@@ -86,7 +86,7 @@ void LLHUDIcon::renderIcon(BOOL for_select)
86 LLGLDepthTest gls_depth(GL_TRUE); 86 LLGLDepthTest gls_depth(GL_TRUE);
87 if (for_select) 87 if (for_select)
88 { 88 {
89 LLViewerImage::unbindTexture(0); 89 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
90 } 90 }
91 91
92 if (mHidden) 92 if (mHidden)
@@ -163,10 +163,10 @@ void LLHUDIcon::renderIcon(BOOL for_select)
163 LLColor4 icon_color = LLColor4::white; 163 LLColor4 icon_color = LLColor4::white;
164 icon_color.mV[VALPHA] = alpha_factor; 164 icon_color.mV[VALPHA] = alpha_factor;
165 gGL.color4fv(icon_color.mV); 165 gGL.color4fv(icon_color.mV);
166 LLViewerImage::bindTexture(mImagep); 166 gGL.getTexUnit(0)->bind(mImagep.get());
167 } 167 }
168 168
169 gGL.begin(LLVertexBuffer::QUADS); 169 gGL.begin(LLRender::QUADS);
170 { 170 {
171 gGL.texCoord2f(0.f, 1.f); 171 gGL.texCoord2f(0.f, 1.f);
172 gGL.vertex3fv(upper_left.mV); 172 gGL.vertex3fv(upper_left.mV);
diff --git a/linden/indra/newview/llhudtext.cpp b/linden/indra/newview/llhudtext.cpp
index c45c284..c5e5419 100644
--- a/linden/indra/newview/llhudtext.cpp
+++ b/linden/indra/newview/llhudtext.cpp
@@ -120,6 +120,111 @@ LLHUDText::~LLHUDText()
120} 120}
121 121
122 122
123BOOL LLHUDText::lineSegmentIntersect(const LLVector3& start, const LLVector3& end, LLVector3& intersection, BOOL debug_render)
124{
125 if (!mVisible || mHidden)
126 {
127 return FALSE;
128 }
129
130 // don't pick text that isn't bound to a viewerobject or isn't in a bubble
131 if (!mSourceObject || mSourceObject->mDrawable.isNull() || !mUseBubble)
132 {
133 return FALSE;
134 }
135
136 F32 alpha_factor = 1.f;
137 LLColor4 text_color = mColor;
138 if (mDoFade)
139 {
140 if (mLastDistance > mFadeDistance)
141 {
142 alpha_factor = llmax(0.f, 1.f - (mLastDistance - mFadeDistance)/mFadeRange);
143 text_color.mV[3] = text_color.mV[3]*alpha_factor;
144 }
145 }
146 if (text_color.mV[3] < 0.01f)
147 {
148 return FALSE;
149 }
150
151 mOffsetY = lltrunc(mHeight * ((mVertAlignment == ALIGN_VERT_CENTER) ? 0.5f : 1.f));
152
153 // scale screen size of borders down
154 //RN: for now, text on hud objects is never occluded
155
156 LLVector3 x_pixel_vec;
157 LLVector3 y_pixel_vec;
158
159 if (mOnHUDAttachment)
160 {
161 x_pixel_vec = LLVector3::y_axis / (F32)gViewerWindow->getWindowWidth();
162 y_pixel_vec = LLVector3::z_axis / (F32)gViewerWindow->getWindowHeight();
163 }
164 else
165 {
166 LLViewerCamera::getInstance()->getPixelVectors(mPositionAgent, y_pixel_vec, x_pixel_vec);
167 }
168
169 LLVector3 width_vec = mWidth * x_pixel_vec;
170 LLVector3 height_vec = mHeight * y_pixel_vec;
171
172 LLCoordGL screen_pos;
173 LLViewerCamera::getInstance()->projectPosAgentToScreen(mPositionAgent, screen_pos, FALSE);
174
175 LLVector2 screen_offset;
176 screen_offset = updateScreenPos(mPositionOffset);
177
178 LLVector3 render_position = mPositionAgent
179 + (x_pixel_vec * screen_offset.mV[VX])
180 + (y_pixel_vec * screen_offset.mV[VY]);
181
182
183 if (mUseBubble)
184 {
185 LLVector3 bg_pos = render_position
186 + (F32)mOffsetY * y_pixel_vec
187 - (width_vec / 2.f)
188 - (height_vec);
189 //LLUI::translate(bg_pos.mV[VX], bg_pos.mV[VY], bg_pos.mV[VZ]);
190
191 LLVector3 v[] =
192 {
193 bg_pos,
194 bg_pos + width_vec,
195 bg_pos + width_vec + height_vec,
196 bg_pos + height_vec,
197 };
198
199 if (debug_render)
200 {
201 gGL.begin(LLRender::LINE_STRIP);
202 gGL.vertex3fv(v[0].mV);
203 gGL.vertex3fv(v[1].mV);
204 gGL.vertex3fv(v[2].mV);
205 gGL.vertex3fv(v[3].mV);
206 gGL.vertex3fv(v[0].mV);
207 gGL.vertex3fv(v[2].mV);
208 gGL.end();
209 }
210
211 LLVector3 dir = end-start;
212 F32 t = 0.f;
213
214 if (LLTriangleRayIntersect(v[0], v[1], v[2], start, dir, NULL, NULL, &t, FALSE) ||
215 LLTriangleRayIntersect(v[2], v[3], v[0], start, dir, NULL, NULL, &t, FALSE) )
216 {
217 if (t <= 1.f)
218 {
219 intersection = start + dir*t;
220 return TRUE;
221 }
222 }
223 }
224
225 return FALSE;
226}
227
123void LLHUDText::render() 228void LLHUDText::render()
124{ 229{
125 if (!mOnHUDAttachment && sDisplayText) 230 if (!mOnHUDAttachment && sDisplayText)
@@ -152,7 +257,15 @@ void LLHUDText::renderText(BOOL for_select)
152 return; 257 return;
153 } 258 }
154 259
155 LLGLState gls_tex(GL_TEXTURE_2D, for_select ? FALSE : TRUE); 260 if (for_select)
261 {
262 gGL.getTexUnit(0)->disable();
263 }
264 else
265 {
266 gGL.getTexUnit(0)->enable(LLTexUnit::TT_TEXTURE);
267 }
268
156 LLGLState gls_blend(GL_BLEND, for_select ? FALSE : TRUE); 269 LLGLState gls_blend(GL_BLEND, for_select ? FALSE : TRUE);
157 LLGLState gls_alpha(GL_ALPHA_TEST, for_select ? FALSE : TRUE); 270 LLGLState gls_alpha(GL_ALPHA_TEST, for_select ? FALSE : TRUE);
158 271
@@ -261,7 +374,7 @@ void LLHUDText::renderText(BOOL for_select)
261 374
262 if (for_select) 375 if (for_select)
263 { 376 {
264 LLGLSNoTexture no_texture_state; 377 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
265 S32 name = mSourceObject->mGLName; 378 S32 name = mSourceObject->mGLName;
266 LLColor4U coloru((U8)(name >> 16), (U8)(name >> 8), (U8)name); 379 LLColor4U coloru((U8)(name >> 16), (U8)(name >> 8), (U8)name);
267 gGL.color4ubv(coloru.mV); 380 gGL.color4ubv(coloru.mV);
@@ -271,7 +384,7 @@ void LLHUDText::renderText(BOOL for_select)
271 } 384 }
272 else 385 else
273 { 386 {
274 LLViewerImage::bindTexture(imagep->getImage()); 387 gGL.getTexUnit(0)->bind(imagep->getImage());
275 388
276 gGL.color4fv(bg_color.mV); 389 gGL.color4fv(bg_color.mV);
277 gl_segmented_rect_3d_tex(border_scale_vec, scaled_border_width, scaled_border_height, width_vec, height_vec); 390 gl_segmented_rect_3d_tex(border_scale_vec, scaled_border_width, scaled_border_height, width_vec, height_vec);
@@ -309,7 +422,7 @@ void LLHUDText::renderText(BOOL for_select)
309 } 422 }
310 LLUI::popMatrix(); 423 LLUI::popMatrix();
311 424
312 LLImageGL::unbindTexture(0); 425 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
313 LLGLDepthTest gls_depth(mZCompare ? GL_TRUE : GL_FALSE, GL_FALSE); 426 LLGLDepthTest gls_depth(mZCompare ? GL_TRUE : GL_FALSE, GL_FALSE);
314 427
315 LLVector3 box_center_offset; 428 LLVector3 box_center_offset;
@@ -317,7 +430,7 @@ void LLHUDText::renderText(BOOL for_select)
317 LLUI::translate(box_center_offset.mV[VX], box_center_offset.mV[VY], box_center_offset.mV[VZ]); 430 LLUI::translate(box_center_offset.mV[VX], box_center_offset.mV[VY], box_center_offset.mV[VZ]);
318 gGL.color4fv(bg_color.mV); 431 gGL.color4fv(bg_color.mV);
319 LLUI::setLineWidth(2.0); 432 LLUI::setLineWidth(2.0);
320 gGL.begin(LLVertexBuffer::LINES); 433 gGL.begin(LLRender::LINES);
321 { 434 {
322 if (outside_width) 435 if (outside_width)
323 { 436 {
@@ -444,6 +557,10 @@ void LLHUDText::renderText(BOOL for_select)
444 } 557 }
445 /// Reset the default color to white. The renderer expects this to be the default. 558 /// Reset the default color to white. The renderer expects this to be the default.
446 glColor4f(1.0f, 1.0f, 1.0f, 1.0f); 559 glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
560 if (for_select)
561 {
562 gGL.getTexUnit(0)->enable(LLTexUnit::TT_TEXTURE);
563 }
447} 564}
448 565
449void LLHUDText::setStringUTF8(const std::string &wtext) 566void LLHUDText::setStringUTF8(const std::string &wtext)
diff --git a/linden/indra/newview/llhudtext.h b/linden/indra/newview/llhudtext.h
index 5719a19..6403622 100644
--- a/linden/indra/newview/llhudtext.h
+++ b/linden/indra/newview/llhudtext.h
@@ -123,6 +123,8 @@ public:
123 void setOnHUDAttachment(BOOL on_hud) { mOnHUDAttachment = on_hud; } 123 void setOnHUDAttachment(BOOL on_hud) { mOnHUDAttachment = on_hud; }
124 void shift(const LLVector3& offset); 124 void shift(const LLVector3& offset);
125 125
126 BOOL lineSegmentIntersect(const LLVector3& start, const LLVector3& end, LLVector3& intersection, BOOL debug_render = FALSE);
127
126 static void shiftAll(const LLVector3& offset); 128 static void shiftAll(const LLVector3& offset);
127 static void renderAllHUD(); 129 static void renderAllHUD();
128 static void addPickable(std::set<LLViewerObject*> &pick_list); 130 static void addPickable(std::set<LLViewerObject*> &pick_list);
diff --git a/linden/indra/newview/llinventorymodel.cpp b/linden/indra/newview/llinventorymodel.cpp
index b1e3017..c3392ce 100644
--- a/linden/indra/newview/llinventorymodel.cpp
+++ b/linden/indra/newview/llinventorymodel.cpp
@@ -73,7 +73,6 @@ F32 LLInventoryModel::sMinTimeBetweenFetches = 0.3f;
73F32 LLInventoryModel::sMaxTimeBetweenFetches = 10.f; 73F32 LLInventoryModel::sMaxTimeBetweenFetches = 10.f;
74BOOL LLInventoryModel::sTimelyFetchPending = FALSE; 74BOOL LLInventoryModel::sTimelyFetchPending = FALSE;
75LLFrameTimer LLInventoryModel::sFetchTimer; 75LLFrameTimer LLInventoryModel::sFetchTimer;
76LLInventoryModel::cat_map_t LLInventoryModel::sBulkFetchMap;
77S16 LLInventoryModel::sBulkFetchCount = 0; 76S16 LLInventoryModel::sBulkFetchCount = 0;
78 77
79// RN: for some reason, using std::queue in the header file confuses the compiler which things it's an xmlrpc_queue 78// RN: for some reason, using std::queue in the header file confuses the compiler which things it's an xmlrpc_queue
@@ -85,7 +84,7 @@ static std::deque<LLUUID> sFetchQueue;
85 84
86//BOOL decompress_file(const char* src_filename, const char* dst_filename); 85//BOOL decompress_file(const char* src_filename, const char* dst_filename);
87const F32 MAX_TIME_FOR_SINGLE_FETCH = 10.f; 86const F32 MAX_TIME_FOR_SINGLE_FETCH = 10.f;
88const S32 MAX_FETCH_RETRIES = 5; 87const S32 MAX_FETCH_RETRIES = 10;
89const char CACHE_FORMAT_STRING[] = "%s.inv"; 88const char CACHE_FORMAT_STRING[] = "%s.inv";
90const char* NEW_CATEGORY_NAME = "New Folder"; 89const char* NEW_CATEGORY_NAME = "New Folder";
91const char* NEW_CATEGORY_NAMES[LLAssetType::AT_COUNT] = 90const char* NEW_CATEGORY_NAMES[LLAssetType::AT_COUNT] =
@@ -990,13 +989,24 @@ BOOL LLInventoryModel::containsObserver(LLInventoryObserver* observer)
990// Call this method when it's time to update everyone on a new state, 989// Call this method when it's time to update everyone on a new state,
991// by default, the inventory model will not update observers 990// by default, the inventory model will not update observers
992// automatically. 991// automatically.
993void LLInventoryModel::notifyObservers() 992// The optional argument 'service_name' is used by Agent Inventory Service [DEV-20328]
993void LLInventoryModel::notifyObservers(const std::string service_name)
994{ 994{
995 for (observer_list_t::iterator iter = mObservers.begin(); 995 for (observer_list_t::iterator iter = mObservers.begin();
996 iter != mObservers.end(); ) 996 iter != mObservers.end(); )
997 { 997 {
998 LLInventoryObserver* observer = *iter; 998 LLInventoryObserver* observer = *iter;
999 observer->changed(mModifyMask); 999
1000 if (service_name.empty())
1001 {
1002 observer->changed(mModifyMask);
1003 }
1004 else
1005 {
1006 observer->mMessageName = service_name;
1007 observer->changed(mModifyMask);
1008 }
1009
1000 // safe way to incrament since changed may delete entries! (@!##%@!@&*!) 1010 // safe way to incrament since changed may delete entries! (@!##%@!@&*!)
1001 iter = mObservers.upper_bound(observer); 1011 iter = mObservers.upper_bound(observer);
1002 } 1012 }
@@ -1038,6 +1048,79 @@ void LLInventoryModel::mock(const LLUUID& root_id)
1038} 1048}
1039*/ 1049*/
1040 1050
1051//If we get back a normal response, handle it here
1052void LLInventoryModel::fetchInventoryResponder::result(const LLSD& content)
1053{
1054 start_new_inventory_observer();
1055
1056 /*LLUUID agent_id;
1057 agent_id = content["agent_id"].asUUID();
1058 if(agent_id != gAgent.getID())
1059 {
1060 llwarns << "Got a inventory update for the wrong agent: " << agent_id
1061 << llendl;
1062 return;
1063 }*/
1064 item_array_t items;
1065 update_map_t update;
1066 S32 count = content["items"].size();
1067 bool all_one_folder = true;
1068 LLUUID folder_id;
1069 // Does this loop ever execute more than once? -Gigs
1070 for(S32 i = 0; i < count; ++i)
1071 {
1072 LLPointer<LLViewerInventoryItem> titem = new LLViewerInventoryItem;
1073 titem->unpackMessage(content["items"][i]);
1074
1075 lldebugs << "LLInventoryModel::messageUpdateCore() item id:"
1076 << titem->getUUID() << llendl;
1077 items.push_back(titem);
1078 // examine update for changes.
1079 LLViewerInventoryItem* itemp = gInventory.getItem(titem->getUUID());
1080 if(itemp)
1081 {
1082 if(titem->getParentUUID() == itemp->getParentUUID())
1083 {
1084 update[titem->getParentUUID()];
1085 }
1086 else
1087 {
1088 ++update[titem->getParentUUID()];
1089 --update[itemp->getParentUUID()];
1090 }
1091 }
1092 else
1093 {
1094 ++update[titem->getParentUUID()];
1095 }
1096 if (folder_id.isNull())
1097 {
1098 folder_id = titem->getParentUUID();
1099 }
1100 else
1101 {
1102 all_one_folder = false;
1103 }
1104 }
1105
1106 U32 changes = 0x0;
1107 //as above, this loop never seems to loop more than once per call
1108 for (item_array_t::iterator it = items.begin(); it != items.end(); ++it)
1109 {
1110 changes |= gInventory.updateItem(*it);
1111 }
1112 gInventory.notifyObservers("fetchinventory");
1113 gViewerWindow->getWindow()->decBusyCount();
1114}
1115
1116//If we get back an error (not found, etc...), handle it here
1117void LLInventoryModel::fetchInventoryResponder::error(U32 status, const std::string& reason)
1118{
1119 llinfos << "fetchInventory::error "
1120 << status << ": " << reason << llendl;
1121 gInventory.notifyObservers("fetchinventory");
1122}
1123
1041void LLInventoryModel::fetchDescendentsOf(const LLUUID& folder_id) 1124void LLInventoryModel::fetchDescendentsOf(const LLUUID& folder_id)
1042{ 1125{
1043 LLViewerInventoryCategory* cat = getCategory(folder_id); 1126 LLViewerInventoryCategory* cat = getCategory(folder_id);
@@ -1065,21 +1148,31 @@ void LLInventoryModel::fetchDescendentsOf(const LLUUID& folder_id)
1065} 1148}
1066 1149
1067//Initialize statics. 1150//Initialize statics.
1068LLAlertDialog* LLInventoryModel::fetchDescendentsResponder::sRetryDialog=NULL;
1069LLSD LLInventoryModel::fetchDescendentsResponder::sRetrySD;
1070
1071bool LLInventoryModel::isBulkFetchProcessingComplete() 1151bool LLInventoryModel::isBulkFetchProcessingComplete()
1072{ 1152{
1073 return ( (sFetchQueue.empty() 1153 return ( (sFetchQueue.empty()
1074 && sBulkFetchMap.empty() 1154 && sBulkFetchCount<=0) ? TRUE : FALSE ) ;
1075 && sBulkFetchCount==0) ? TRUE : FALSE ) ;
1076} 1155}
1077 1156
1157class fetchDescendentsResponder: public LLHTTPClient::Responder
1158{
1159 public:
1160 fetchDescendentsResponder(const LLSD& request_sd) : mRequestSD(request_sd) {};
1161 //fetchDescendentsResponder() {};
1162 void result(const LLSD& content);
1163 void error(U32 status, const std::string& reason);
1164 public:
1165 typedef std::vector<LLViewerInventoryCategory*> folder_ref_t;
1166 protected:
1167 LLSD mRequestSD;
1168};
1169
1078//If we get back a normal response, handle it here 1170//If we get back a normal response, handle it here
1079void LLInventoryModel::fetchDescendentsResponder::result(const LLSD& content) 1171void fetchDescendentsResponder::result(const LLSD& content)
1080{ 1172{
1081 if (content.has("folders")) 1173 if (content.has("folders"))
1082 { 1174 {
1175
1083 for(LLSD::array_const_iterator folder_it = content["folders"].beginArray(); 1176 for(LLSD::array_const_iterator folder_it = content["folders"].beginArray();
1084 folder_it != content["folders"].endArray(); 1177 folder_it != content["folders"].endArray();
1085 ++folder_it) 1178 ++folder_it)
@@ -1087,19 +1180,54 @@ void LLInventoryModel::fetchDescendentsResponder::result(const LLSD& content)
1087 LLSD folder_sd = *folder_it; 1180 LLSD folder_sd = *folder_it;
1088 1181
1089 1182
1090 LLUUID agent_id = folder_sd["agent-id"]; 1183 //LLUUID agent_id = folder_sd["agent_id"];
1091 1184
1092 if(agent_id != gAgent.getID()) //This should never happen. 1185 //if(agent_id != gAgent.getID()) //This should never happen.
1093 { 1186 //{
1094 llwarns << "Got a UpdateInventoryItem for the wrong agent." 1187 // llwarns << "Got a UpdateInventoryItem for the wrong agent."
1095 << llendl; 1188 // << llendl;
1096 break; 1189 // break;
1097 } 1190 //}
1098 LLUUID parent_id = folder_sd["folder-id"]; 1191
1099 LLUUID owner_id = folder_sd["owner-id"]; 1192 LLUUID parent_id = folder_sd["folder_id"];
1193 LLUUID owner_id = folder_sd["owner_id"];
1100 S32 version = (S32)folder_sd["version"].asInteger(); 1194 S32 version = (S32)folder_sd["version"].asInteger();
1101 S32 descendents = (S32)folder_sd["descendents"].asInteger(); 1195 S32 descendents = (S32)folder_sd["descendents"].asInteger();
1102 LLPointer<LLViewerInventoryCategory> tcategory = new LLViewerInventoryCategory(owner_id); 1196 LLPointer<LLViewerInventoryCategory> tcategory = new LLViewerInventoryCategory(owner_id);
1197
1198 if (parent_id.isNull())
1199 {
1200 LLPointer<LLViewerInventoryItem> titem = new LLViewerInventoryItem;
1201 for(LLSD::array_const_iterator item_it = folder_sd["items"].beginArray();
1202 item_it != folder_sd["items"].endArray();
1203 ++item_it)
1204 {
1205 LLUUID lost_uuid = gInventory.findCategoryUUIDForType(LLAssetType::AT_LOST_AND_FOUND);
1206 if (lost_uuid.notNull())
1207 {
1208 LLSD item = *item_it;
1209 titem->unpackMessage(item);
1210
1211 LLInventoryModel::update_list_t update;
1212 LLInventoryModel::LLCategoryUpdate new_folder(lost_uuid, 1);
1213 update.push_back(new_folder);
1214 gInventory.accountForUpdate(update);
1215
1216 titem->setParent(lost_uuid);
1217 titem->updateParentOnServer(FALSE);
1218 gInventory.updateItem(titem);
1219 gInventory.notifyObservers("fetchDescendents");
1220
1221 }
1222 }
1223 }
1224
1225 LLViewerInventoryCategory* pcat = gInventory.getCategory(parent_id);
1226 if (!pcat)
1227 {
1228 continue;
1229 }
1230
1103 for(LLSD::array_const_iterator category_it = folder_sd["categories"].beginArray(); 1231 for(LLSD::array_const_iterator category_it = folder_sd["categories"].beginArray();
1104 category_it != folder_sd["categories"].endArray(); 1232 category_it != folder_sd["categories"].endArray();
1105 ++category_it) 1233 ++category_it)
@@ -1107,7 +1235,7 @@ void LLInventoryModel::fetchDescendentsResponder::result(const LLSD& content)
1107 LLSD category = *category_it; 1235 LLSD category = *category_it;
1108 tcategory->fromLLSD(category); 1236 tcategory->fromLLSD(category);
1109 1237
1110 if (sFullFetchStarted) 1238 if (LLInventoryModel::sFullFetchStarted)
1111 { 1239 {
1112 sFetchQueue.push_back(tcategory->getUUID()); 1240 sFetchQueue.push_back(tcategory->getUUID());
1113 } 1241 }
@@ -1139,37 +1267,37 @@ void LLInventoryModel::fetchDescendentsResponder::result(const LLSD& content)
1139 } 1267 }
1140 } 1268 }
1141 1269
1142 if (content.has("bad-folders")) 1270 if (content.has("bad_folders"))
1143 { 1271 {
1144 for(LLSD::array_const_iterator folder_it = content["bad-folders"].beginArray(); 1272 for(LLSD::array_const_iterator folder_it = content["bad_folders"].beginArray();
1145 folder_it != content["bad-folders"].endArray(); 1273 folder_it != content["bad_folders"].endArray();
1146 ++folder_it) 1274 ++folder_it)
1147 { 1275 {
1148 LLSD folder_sd = *folder_it; 1276 LLSD folder_sd = *folder_it;
1149 1277
1150 //These folders failed on the dataserver. We probably don't want to retry them. 1278 //These folders failed on the dataserver. We probably don't want to retry them.
1151 llinfos << "Folder " << folder_sd["folder-id"].asString() 1279 llinfos << "Folder " << folder_sd["folder_id"].asString()
1152 << "Error: " << folder_sd["error"].asString() << llendl; 1280 << "Error: " << folder_sd["error"].asString() << llendl;
1153 } 1281 }
1154 } 1282 }
1155 1283
1156 LLInventoryModel::incrBulkFetch(-1); 1284 LLInventoryModel::incrBulkFetch(-1);
1157 1285
1158 if (isBulkFetchProcessingComplete()) 1286 if (LLInventoryModel::isBulkFetchProcessingComplete())
1159 { 1287 {
1160 llinfos << "Inventory fetch completed" << llendl; 1288 llinfos << "Inventory fetch completed" << llendl;
1161 if (sFullFetchStarted) 1289 if (LLInventoryModel::sFullFetchStarted)
1162 { 1290 {
1163 sAllFoldersFetched = TRUE; 1291 LLInventoryModel::sAllFoldersFetched = TRUE;
1164 } 1292 }
1165 stopBackgroundFetch(); 1293 LLInventoryModel::stopBackgroundFetch();
1166 } 1294 }
1167 1295
1168 gInventory.notifyObservers(); 1296 gInventory.notifyObservers("fetchDescendents");
1169} 1297}
1170 1298
1171//If we get back an error (not found, etc...), handle it here 1299//If we get back an error (not found, etc...), handle it here
1172void LLInventoryModel::fetchDescendentsResponder::error(U32 status, const std::string& reason) 1300void fetchDescendentsResponder::error(U32 status, const std::string& reason)
1173{ 1301{
1174 llinfos << "fetchDescendentsResponder::error " 1302 llinfos << "fetchDescendentsResponder::error "
1175 << status << ": " << reason << llendl; 1303 << status << ": " << reason << llendl;
@@ -1183,61 +1311,22 @@ void LLInventoryModel::fetchDescendentsResponder::error(U32 status, const std::s
1183 ++folder_it) 1311 ++folder_it)
1184 { 1312 {
1185 LLSD folder_sd = *folder_it; 1313 LLSD folder_sd = *folder_it;
1186 sRetrySD["folders"].append(folder_sd); 1314 LLUUID folder_id = folder_sd["folder_id"];
1187 } 1315 sFetchQueue.push_front(folder_id);
1188 sMinTimeBetweenFetches = 10.0f; //Add 10 seconds for every time out in this sequence.
1189
1190 if (!sRetryDialog) //The dialog isn't up. Prompt the resident.
1191 {
1192 sRetryDialog = gViewerWindow->alertXml("RetryFetchInventoryDescendents", onClickRetry, this);
1193 } 1316 }
1194 } 1317 }
1195 else 1318 else
1196 { 1319 {
1197 if (isBulkFetchProcessingComplete()) 1320 if (LLInventoryModel::isBulkFetchProcessingComplete())
1198 { 1321 {
1199 if (sFullFetchStarted) 1322 if (LLInventoryModel::sFullFetchStarted)
1200 { 1323 {
1201 sAllFoldersFetched = TRUE; 1324 LLInventoryModel::sAllFoldersFetched = TRUE;
1202 } 1325 }
1203 stopBackgroundFetch(); 1326 LLInventoryModel::stopBackgroundFetch();
1204 } 1327 }
1205 } 1328 }
1206 gInventory.notifyObservers(); 1329 gInventory.notifyObservers("fetchDescendents");
1207}
1208
1209void LLInventoryModel::fetchDescendentsResponder::onClickRetry(S32 option, void* userdata)
1210{
1211 if (option == 0)
1212 {
1213 std::string url;
1214
1215 LLViewerRegion * agent_region = gAgent.getRegion();
1216 if (agent_region)
1217 {
1218 url = agent_region->getCapability("FetchInventoryDescendents");
1219 }
1220
1221 if (!url.empty()) //Capability found. Build up LLSD and use it.
1222 {
1223 LLSD body = sRetrySD;
1224 LLInventoryModel::incrBulkFetch(1);
1225 LLHTTPClient::post(url, body, new LLInventoryModel::fetchDescendentsResponder(body),300);
1226 }
1227 }
1228 else
1229 {
1230 if (isBulkFetchProcessingComplete())
1231 {
1232 if (sFullFetchStarted)
1233 {
1234 sAllFoldersFetched = TRUE;
1235 }
1236 stopBackgroundFetch();
1237 }
1238 }
1239 sRetryDialog=NULL;
1240 sRetrySD.clear();
1241} 1330}
1242 1331
1243//static Bundle up a bunch of requests to send all at once. 1332//static Bundle up a bunch of requests to send all at once.
@@ -1250,7 +1339,7 @@ void LLInventoryModel::bulkFetch(std::string url)
1250 1339
1251 S16 max_concurrent_fetches=8; 1340 S16 max_concurrent_fetches=8;
1252 F32 new_min_time = 0.5f; //HACK! Clean this up when old code goes away entirely. 1341 F32 new_min_time = 0.5f; //HACK! Clean this up when old code goes away entirely.
1253 if (sMinTimeBetweenFetches <= new_min_time) sMinTimeBetweenFetches=new_min_time; //HACK! See above. 1342 if (sMinTimeBetweenFetches < new_min_time) sMinTimeBetweenFetches=new_min_time; //HACK! See above.
1254 1343
1255 if(gDisconnected 1344 if(gDisconnected
1256 || sBulkFetchCount > max_concurrent_fetches 1345 || sBulkFetchCount > max_concurrent_fetches
@@ -1259,88 +1348,84 @@ void LLInventoryModel::bulkFetch(std::string url)
1259 return; // just bail if we are disconnected. 1348 return; // just bail if we are disconnected.
1260 } 1349 }
1261 1350
1262 //HACK. This is inelegant. We're shuffling a dequeue to a map to get rid of
1263 //redundant requests. When we get rid of the old code entirely, we can change
1264 //the dequeue to a map. In the new model, there is no benefit to queue order.
1265 U32 folder_count=0; 1351 U32 folder_count=0;
1266 U32 max_batch_size=10; 1352 U32 max_batch_size=5;
1267 while( !(sFetchQueue.empty() ) ) 1353
1268 { 1354 U32 sort_order = gSavedSettings.getU32("InventorySortOrder") & 0x1;
1269 LLViewerInventoryCategory* cat = gInventory.getCategory(sFetchQueue.front()); 1355
1270 1356 LLSD body;
1271 if (cat) 1357 LLSD body_lib;
1272 { 1358 while( !(sFetchQueue.empty() ) && (folder_count < max_batch_size) )
1273 if ( !gInventory.isCategoryComplete(cat->getUUID()) ) //grab this folder. 1359 {
1274 { 1360 if (sFetchQueue.front().isNull()) //DEV-17797
1275 sBulkFetchMap[(cat->getUUID())] = cat; 1361 {
1276 } 1362 LLSD folder_sd;
1277 else if (sFullFetchStarted) 1363 folder_sd["folder_id"] = LLUUID::null.asString();
1278 { //Already have this folder but append child folders to list. 1364 folder_sd["owner_id"] = gAgent.getID();
1279 // add all children to queue 1365 folder_sd["sort_order"] = (LLSD::Integer)sort_order;
1280 parent_cat_map_t::iterator cat_it = gInventory.mParentChildCategoryTree.find(cat->getUUID()); 1366 folder_sd["fetch_folders"] = (LLSD::Boolean)FALSE;
1281 if (cat_it != gInventory.mParentChildCategoryTree.end()) 1367 folder_sd["fetch_items"] = (LLSD::Boolean)TRUE;
1282 { 1368 body["folders"].append(folder_sd);
1283 cat_array_t* child_categories = cat_it->second; 1369 folder_count++;
1284 1370 }
1285 for (S32 child_num = 0; child_num < child_categories->count(); child_num++) 1371 else
1286 { 1372 {
1287 sFetchQueue.push_back(child_categories->get(child_num)->getUUID()); 1373
1288 }
1289 }
1290 1374
1291 } 1375 LLViewerInventoryCategory* cat = gInventory.getCategory(sFetchQueue.front());
1292 } 1376
1377 if (cat)
1378 {
1379 if ( LLViewerInventoryCategory::VERSION_UNKNOWN == cat->getVersion())
1380 {
1381 LLSD folder_sd;
1382 folder_sd["folder_id"] = cat->getUUID();
1383 folder_sd["owner_id"] = cat->getOwnerID();
1384 folder_sd["sort_order"] = (LLSD::Integer)sort_order;
1385 folder_sd["fetch_folders"] = TRUE; //(LLSD::Boolean)sFullFetchStarted;
1386 folder_sd["fetch_items"] = (LLSD::Boolean)TRUE;
1387
1388 if (ALEXANDRIA_LINDEN_ID == cat->getOwnerID())
1389 body_lib["folders"].append(folder_sd);
1390 else
1391 body["folders"].append(folder_sd);
1392 folder_count++;
1393 }
1394 if (sFullFetchStarted)
1395 { //Already have this folder but append child folders to list.
1396 // add all children to queue
1397 parent_cat_map_t::iterator cat_it = gInventory.mParentChildCategoryTree.find(cat->getUUID());
1398 if (cat_it != gInventory.mParentChildCategoryTree.end())
1399 {
1400 cat_array_t* child_categories = cat_it->second;
1401
1402 for (S32 child_num = 0; child_num < child_categories->count(); child_num++)
1403 {
1404 sFetchQueue.push_back(child_categories->get(child_num)->getUUID());
1405 }
1406 }
1407
1408 }
1409 }
1410 }
1293 sFetchQueue.pop_front(); 1411 sFetchQueue.pop_front();
1294 } 1412 }
1295 1413
1296
1297 if (!sBulkFetchMap.empty()) //There's stuff to fetch.
1298 {
1299 U32 sort_order = gSavedSettings.getU32("InventorySortOrder") & 0x1;
1300
1301 LLSD body;
1302
1303 cat_map_t::iterator iter=sBulkFetchMap.begin();
1304 while( iter!=sBulkFetchMap.end() && (folder_count < max_batch_size) )
1305 {
1306 LLViewerInventoryCategory* cat = iter->second;
1307
1308 if (cat && !gInventory.isCategoryComplete(cat->getUUID()) ) //Category exists
1309 {
1310 BOOL fetchItems=TRUE;
1311 if ( sFullFetchStarted
1312 && gInventory.isCategoryComplete(cat->getUUID()) )
1313 {
1314 fetchItems=FALSE;
1315 }
1316
1317 LLSD folder_sd;
1318 folder_sd["folder-id"] = cat->getUUID();
1319 folder_sd["owner-id"] = cat->getOwnerID();
1320 folder_sd["sort-order"] = (LLSD::Integer)sort_order;
1321 folder_sd["fetch-folders"] = (LLSD::Boolean)sFullFetchStarted;
1322 folder_sd["fetch-items"] = (LLSD::Boolean)fetchItems;
1323 body["folders"].append(folder_sd);
1324
1325 folder_count++;
1326 }
1327 sBulkFetchMap.erase(iter);
1328 iter=sBulkFetchMap.begin();
1329 }
1330
1331 if (iter == sBulkFetchMap.end()) sBulkFetchMap.clear();
1332
1333 if (folder_count > 0) 1414 if (folder_count > 0)
1334 { 1415 {
1335 sBulkFetchCount++; 1416 sBulkFetchCount++;
1336 1417 if (body["folders"].size())
1337 LLHTTPClient::post(url, body, new LLInventoryModel::fetchDescendentsResponder(body)); 1418 {
1419 LLHTTPClient::post(url, body, new fetchDescendentsResponder(body),300.0);
1420 }
1421 if (body_lib["folders"].size())
1422 {
1423 std::string url_lib = gAgent.getRegion()->getCapability("FetchLibDescendents");
1424 LLHTTPClient::post(url_lib, body_lib, new fetchDescendentsResponder(body_lib),300.0);
1425 }
1338 sFetchTimer.reset(); 1426 sFetchTimer.reset();
1339 } 1427 }
1340 1428 else if (isBulkFetchProcessingComplete())
1341 }
1342
1343 if (isBulkFetchProcessingComplete())
1344 { 1429 {
1345 if (sFullFetchStarted) 1430 if (sFullFetchStarted)
1346 { 1431 {
@@ -1391,6 +1476,14 @@ void LLInventoryModel::startBackgroundFetch(const LLUUID& cat_id)
1391} 1476}
1392 1477
1393//static 1478//static
1479void LLInventoryModel::findLostItems()
1480{
1481 sBackgroundFetchActive = TRUE;
1482 sFetchQueue.push_back(LLUUID::null);
1483 gIdleCallbacks.addFunction(&LLInventoryModel::backgroundFetch, NULL);
1484}
1485
1486//static
1394void LLInventoryModel::stopBackgroundFetch() 1487void LLInventoryModel::stopBackgroundFetch()
1395{ 1488{
1396 if (sBackgroundFetchActive) 1489 if (sBackgroundFetchActive)
@@ -1409,14 +1502,7 @@ void LLInventoryModel::backgroundFetch(void*)
1409 if (sBackgroundFetchActive) 1502 if (sBackgroundFetchActive)
1410 { 1503 {
1411 //If we'll be using the capability, we'll be sending batches and the background thing isn't as important. 1504 //If we'll be using the capability, we'll be sending batches and the background thing isn't as important.
1412 std::string url; 1505 std::string url = gAgent.getRegion()->getCapability("WebFetchInventoryDescendents");
1413
1414 LLViewerRegion * agent_region = gAgent.getRegion();
1415 if (agent_region)
1416 {
1417 url = agent_region->getCapability("FetchInventoryDescendents");
1418 }
1419
1420 if (!url.empty()) 1506 if (!url.empty())
1421 { 1507 {
1422 bulkFetch(url); 1508 bulkFetch(url);
@@ -3373,12 +3459,72 @@ bool LLInventoryFetchObserver::isEverythingComplete() const
3373 return mIncomplete.empty(); 3459 return mIncomplete.empty();
3374} 3460}
3375 3461
3462void fetch_items_from_llsd(const LLSD& items_llsd)
3463{
3464 if (!items_llsd.size()) return;
3465 LLSD body;
3466 body[0]["cap_name"] = "FetchInventory";
3467 body[1]["cap_name"] = "FetchLib";
3468 for (S32 i=0; i<items_llsd.size();i++)
3469 {
3470 if (items_llsd[i]["owner_id"].asString() == gAgent.getID().asString())
3471 {
3472 body[0]["items"].append(items_llsd[i]);
3473 continue;
3474 }
3475 if (items_llsd[i]["owner_id"].asString() == ALEXANDRIA_LINDEN_ID.asString())
3476 {
3477 body[1]["items"].append(items_llsd[i]);
3478 continue;
3479 }
3480 }
3481
3482 for (S32 i=0; i<body.size(); i++)
3483 {
3484 if (0 >= body[i].size()) continue;
3485 std::string url = gAgent.getRegion()->getCapability(body[i]["cap_name"].asString());
3486
3487 if (!url.empty())
3488 {
3489 body[i]["agent_id"] = gAgent.getID();
3490 LLHTTPClient::post(url, body[i], new LLInventoryModel::fetchInventoryResponder(body[i]));
3491 break;
3492 }
3493
3494 LLMessageSystem* msg = gMessageSystem;
3495 BOOL start_new_message = TRUE;
3496 for (S32 j=0; j<body[i]["items"].size(); j++)
3497 {
3498 LLSD item_entry = body[i]["items"][j];
3499 if(start_new_message)
3500 {
3501 start_new_message = FALSE;
3502 msg->newMessageFast(_PREHASH_FetchInventory);
3503 msg->nextBlockFast(_PREHASH_AgentData);
3504 msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
3505 msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
3506 }
3507 msg->nextBlockFast(_PREHASH_InventoryData);
3508 msg->addUUIDFast(_PREHASH_OwnerID, item_entry["owner_id"].asUUID());
3509 msg->addUUIDFast(_PREHASH_ItemID, item_entry["item_id"].asUUID());
3510 if(msg->isSendFull(NULL))
3511 {
3512 start_new_message = TRUE;
3513 gAgent.sendReliableMessage();
3514 }
3515 }
3516 if(!start_new_message)
3517 {
3518 gAgent.sendReliableMessage();
3519 }
3520 }
3521}
3522
3376void LLInventoryFetchObserver::fetchItems( 3523void LLInventoryFetchObserver::fetchItems(
3377 const LLInventoryFetchObserver::item_ref_t& ids) 3524 const LLInventoryFetchObserver::item_ref_t& ids)
3378{ 3525{
3379 LLMessageSystem* msg = gMessageSystem;
3380 BOOL start_new_message = TRUE;
3381 LLUUID owner_id; 3526 LLUUID owner_id;
3527 LLSD items_llsd;
3382 for(item_ref_t::const_iterator it = ids.begin(); it < ids.end(); ++it) 3528 for(item_ref_t::const_iterator it = ids.begin(); it < ids.end(); ++it)
3383 { 3529 {
3384 LLViewerInventoryItem* item = gInventory.getItem(*it); 3530 LLViewerInventoryItem* item = gInventory.getItem(*it);
@@ -3400,31 +3546,18 @@ void LLInventoryFetchObserver::fetchItems(
3400 // assume it's agent inventory. 3546 // assume it's agent inventory.
3401 owner_id = gAgent.getID(); 3547 owner_id = gAgent.getID();
3402 } 3548 }
3403 3549
3404 // It's incomplete, so put it on the incomplete container, and 3550 // It's incomplete, so put it on the incomplete container, and
3405 // pack this on the message. 3551 // pack this on the message.
3406 mIncomplete.push_back(*it); 3552 mIncomplete.push_back(*it);
3407 if(start_new_message) 3553
3408 { 3554 // Prepare the data to fetch
3409 start_new_message = FALSE; 3555 LLSD item_entry;
3410 msg->newMessageFast(_PREHASH_FetchInventory); 3556 item_entry["owner_id"] = owner_id;
3411 msg->nextBlockFast(_PREHASH_AgentData); 3557 item_entry["item_id"] = (*it);
3412 msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); 3558 items_llsd.append(item_entry);
3413 msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
3414 }
3415 msg->nextBlockFast(_PREHASH_InventoryData);
3416 msg->addUUIDFast(_PREHASH_OwnerID, owner_id);
3417 msg->addUUIDFast(_PREHASH_ItemID, (*it));
3418 if(msg->isSendFull(NULL))
3419 {
3420 start_new_message = TRUE;
3421 gAgent.sendReliableMessage();
3422 }
3423 }
3424 if(!start_new_message)
3425 {
3426 gAgent.sendReliableMessage();
3427 } 3559 }
3560 fetch_items_from_llsd(items_llsd);
3428} 3561}
3429 3562
3430// virtual 3563// virtual
@@ -3579,9 +3712,8 @@ void LLInventoryFetchComboObserver::fetch(
3579 // descendent of an incomplete folder because the item will show 3712 // descendent of an incomplete folder because the item will show
3580 // up in an inventory descendents message soon enough so we do not 3713 // up in an inventory descendents message soon enough so we do not
3581 // have to fetch it individually. 3714 // have to fetch it individually.
3715 LLSD items_llsd;
3582 LLUUID owner_id; 3716 LLUUID owner_id;
3583 LLMessageSystem* msg = gMessageSystem;
3584 bool start_new_message = true;
3585 for(item_ref_t::const_iterator iit = item_ids.begin(); iit != item_ids.end(); ++iit) 3717 for(item_ref_t::const_iterator iit = item_ids.begin(); iit != item_ids.end(); ++iit)
3586 { 3718 {
3587 LLViewerInventoryItem* item = gInventory.getItem(*iit); 3719 LLViewerInventoryItem* item = gInventory.getItem(*iit);
@@ -3604,33 +3736,17 @@ void LLInventoryFetchComboObserver::fetch(
3604 } 3736 }
3605 if(std::find(mIncompleteFolders.begin(), mIncompleteFolders.end(), item->getParentUUID()) == mIncompleteFolders.end()) 3737 if(std::find(mIncompleteFolders.begin(), mIncompleteFolders.end(), item->getParentUUID()) == mIncompleteFolders.end())
3606 { 3738 {
3607 lldebugs << "fetching item " << *iit << llendl; 3739 LLSD item_entry;
3608 if(start_new_message) 3740 item_entry["owner_id"] = owner_id;
3609 { 3741 item_entry["item_id"] = (*iit);
3610 start_new_message = false; 3742 items_llsd.append(item_entry);
3611 msg->newMessageFast(_PREHASH_FetchInventory);
3612 msg->nextBlockFast(_PREHASH_AgentData);
3613 msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
3614 msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
3615 }
3616 msg->nextBlockFast(_PREHASH_InventoryData);
3617 msg->addUUIDFast(_PREHASH_OwnerID, owner_id);
3618 msg->addUUIDFast(_PREHASH_ItemID, (*iit));
3619 if(msg->isSendFullFast(_PREHASH_InventoryData))
3620 {
3621 start_new_message = true;
3622 gAgent.sendReliableMessage();
3623 }
3624 } 3743 }
3625 else 3744 else
3626 { 3745 {
3627 lldebugs << "not worrying about " << *iit << llendl; 3746 lldebugs << "not worrying about " << *iit << llendl;
3628 } 3747 }
3629 } 3748 }
3630 if(!start_new_message) 3749 fetch_items_from_llsd(items_llsd);
3631 {
3632 gAgent.sendReliableMessage();
3633 }
3634} 3750}
3635 3751
3636void LLInventoryExistenceObserver::watchItem(const LLUUID& id) 3752void LLInventoryExistenceObserver::watchItem(const LLUUID& id)
@@ -3676,7 +3792,17 @@ void LLInventoryAddedObserver::changed(U32 mask)
3676 // the network, figure out which item was updated. 3792 // the network, figure out which item was updated.
3677 // Code from Gigs Taggert, sin allowed by JC. 3793 // Code from Gigs Taggert, sin allowed by JC.
3678 LLMessageSystem* msg = gMessageSystem; 3794 LLMessageSystem* msg = gMessageSystem;
3679 std::string msg_name = msg->getMessageName(); 3795
3796 std::string msg_name;
3797 if (mMessageName.empty())
3798 {
3799 msg_name = msg->getMessageName();
3800 }
3801 else
3802 {
3803 msg_name = mMessageName;
3804 }
3805
3680 if (msg_name.empty()) 3806 if (msg_name.empty())
3681 { 3807 {
3682 return; 3808 return;
diff --git a/linden/indra/newview/llinventorymodel.h b/linden/indra/newview/llinventorymodel.h
index 8017410..d2be761 100644
--- a/linden/indra/newview/llinventorymodel.h
+++ b/linden/indra/newview/llinventorymodel.h
@@ -69,6 +69,7 @@ public:
69 }; 69 };
70 virtual ~LLInventoryObserver() {}; 70 virtual ~LLInventoryObserver() {};
71 virtual void changed(U32 mask) = 0; 71 virtual void changed(U32 mask) = 0;
72 std::string mMessageName; // used by Agent Inventory Service only. [DEV-20328]
72}; 73};
73 74
74//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 75//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -110,20 +111,17 @@ public:
110 LLInventoryModel(); 111 LLInventoryModel();
111 ~LLInventoryModel(); 112 ~LLInventoryModel();
112 113
113 class fetchDescendentsResponder: public LLHTTPClient::Responder 114 class fetchInventoryResponder: public LLHTTPClient::Responder
114 { 115 {
115 public: 116 public:
116 fetchDescendentsResponder(const LLSD& request_sd) : mRequestSD(request_sd) {}; 117 fetchInventoryResponder(const LLSD& request_sd) : mRequestSD(request_sd) {};
117 void result(const LLSD& content); 118 void result(const LLSD& content);
118 void error(U32 status, const std::string& reason); 119 void error(U32 status, const std::string& reason);
119 static void onClickRetry(S32 option, void* userdata); 120
120 static void appendRetryList(LLSD retry_sd); 121 public:
121 public: 122 typedef std::vector<LLViewerInventoryCategory*> folder_ref_t;
122 typedef std::vector<LLViewerInventoryCategory*> folder_ref_t; 123 protected:
123 protected: 124 LLSD mRequestSD;
124 LLSD mRequestSD;
125 static LLSD sRetrySD;
126 static LLAlertDialog *sRetryDialog;
127 }; 125 };
128 126
129 // 127 //
@@ -268,7 +266,8 @@ public:
268 // Call this method when it's time to update everyone on a new 266 // Call this method when it's time to update everyone on a new
269 // state, by default, the inventory model will not update 267 // state, by default, the inventory model will not update
270 // observers automatically. 268 // observers automatically.
271 void notifyObservers(); 269 // The optional argument 'service_name' is used by Agent Inventory Service [DEV-20328]
270 void notifyObservers(const std::string service_name="");
272 271
273 // This allows outsiders to tell the inventory if something has 272 // This allows outsiders to tell the inventory if something has
274 // been changed 'under the hood', but outside the control of the 273 // been changed 'under the hood', but outside the control of the
@@ -370,7 +369,7 @@ public:
370 // start and stop background breadth-first fetching of inventory contents 369 // start and stop background breadth-first fetching of inventory contents
371 // this gets triggered when performing a filter-search 370 // this gets triggered when performing a filter-search
372 static void startBackgroundFetch(const LLUUID& cat_id = LLUUID::null); // start fetch process 371 static void startBackgroundFetch(const LLUUID& cat_id = LLUUID::null); // start fetch process
373 static void stopBackgroundFetch(); // stop fetch process 372 static void findLostItems();
374 static BOOL backgroundFetchActive(); 373 static BOOL backgroundFetchActive();
375 static bool isEverythingFetched(); 374 static bool isEverythingFetched();
376 static void backgroundFetch(void*); // background fetch idle function 375 static void backgroundFetch(void*); // background fetch idle function
@@ -419,7 +418,6 @@ protected:
419 static void processInventoryDescendents(LLMessageSystem* msg, void**); 418 static void processInventoryDescendents(LLMessageSystem* msg, void**);
420 static void processMoveInventoryItem(LLMessageSystem* msg, void**); 419 static void processMoveInventoryItem(LLMessageSystem* msg, void**);
421 static void processFetchInventoryReply(LLMessageSystem* msg, void**); 420 static void processFetchInventoryReply(LLMessageSystem* msg, void**);
422 static bool isBulkFetchProcessingComplete();
423 421
424 bool messageUpdateCore(LLMessageSystem* msg, bool do_accounting); 422 bool messageUpdateCore(LLMessageSystem* msg, bool do_accounting);
425 423
@@ -460,11 +458,8 @@ protected:
460 observer_list_t mObservers; 458 observer_list_t mObservers;
461 459
462 // completing the fetch once per session should be sufficient 460 // completing the fetch once per session should be sufficient
463 static cat_map_t sBulkFetchMap;
464 static BOOL sBackgroundFetchActive; 461 static BOOL sBackgroundFetchActive;
465 static BOOL sTimelyFetchPending; 462 static BOOL sTimelyFetchPending;
466 static BOOL sAllFoldersFetched;
467 static BOOL sFullFetchStarted;
468 static S32 sNumFetchRetries; 463 static S32 sNumFetchRetries;
469 static LLFrameTimer sFetchTimer; 464 static LLFrameTimer sFetchTimer;
470 static F32 sMinTimeBetweenFetches; 465 static F32 sMinTimeBetweenFetches;
@@ -477,6 +472,11 @@ protected:
477public: 472public:
478 // *NOTE: DEBUG functionality 473 // *NOTE: DEBUG functionality
479 void dumpInventory(); 474 void dumpInventory();
475 static bool isBulkFetchProcessingComplete();
476 static void stopBackgroundFetch(); // stop fetch process
477
478 static BOOL sFullFetchStarted;
479 static BOOL sAllFoldersFetched;
480}; 480};
481 481
482// a special inventory model for the agent 482// a special inventory model for the agent
diff --git a/linden/indra/newview/llinventoryview.cpp b/linden/indra/newview/llinventoryview.cpp
index f9dd70d..418578e 100644
--- a/linden/indra/newview/llinventoryview.cpp
+++ b/linden/indra/newview/llinventoryview.cpp
@@ -1329,6 +1329,16 @@ LLView* LLInventoryPanel::fromXML(LLXMLNodePtr node, LLView *parent, LLUICtrlFac
1329 return panel; 1329 return panel;
1330} 1330}
1331 1331
1332void LLInventoryPanel::draw()
1333{
1334 // select the desired item (in case it wasn't loaded when the selection was requested)
1335 if (mSelectThisID.notNull())
1336 {
1337 setSelection(mSelectThisID, false);
1338 }
1339 LLPanel::draw();
1340}
1341
1332void LLInventoryPanel::setFilterTypes(U32 filter_types) 1342void LLInventoryPanel::setFilterTypes(U32 filter_types)
1333{ 1343{
1334 mFolders->getFilter()->setFilterTypes(filter_types); 1344 mFolders->getFilter()->setFilterTypes(filter_types);
@@ -1701,15 +1711,21 @@ void LLInventoryPanel::setSelection(const LLUUID& obj_id, BOOL take_keyboard_foc
1701 LLFolderViewItem* itemp = mFolders->getItemByID(obj_id); 1711 LLFolderViewItem* itemp = mFolders->getItemByID(obj_id);
1702 if(itemp && itemp->getListener()) 1712 if(itemp && itemp->getListener())
1703 { 1713 {
1704 itemp->getListener()->arrangeAndSet(itemp, 1714 itemp->getListener()->arrangeAndSet(itemp, TRUE, take_keyboard_focus);
1705 TRUE, 1715 mSelectThisID.setNull();
1706 take_keyboard_focus); 1716 return;
1717 }
1718 else
1719 {
1720 // save the desired item to be selected later (if/when ready)
1721 mSelectThisID = obj_id;
1707 } 1722 }
1708} 1723}
1709 1724
1710void LLInventoryPanel::clearSelection() 1725void LLInventoryPanel::clearSelection()
1711{ 1726{
1712 mFolders->clearSelection(); 1727 mFolders->clearSelection();
1728 mSelectThisID.setNull();
1713} 1729}
1714 1730
1715void LLInventoryPanel::createNewItem(const std::string& name, 1731void LLInventoryPanel::createNewItem(const std::string& name,
diff --git a/linden/indra/newview/llinventoryview.h b/linden/indra/newview/llinventoryview.h
index a37d370..1cf8b8f 100644
--- a/linden/indra/newview/llinventoryview.h
+++ b/linden/indra/newview/llinventoryview.h
@@ -86,6 +86,7 @@ public:
86 static LLView* fromXML(LLXMLNodePtr node, LLView *parent, LLUICtrlFactory *factory); 86 static LLView* fromXML(LLXMLNodePtr node, LLView *parent, LLUICtrlFactory *factory);
87 87
88 // LLView methods 88 // LLView methods
89 void draw();
89 BOOL handleHover(S32 x, S32 y, MASK mask); 90 BOOL handleHover(S32 x, S32 y, MASK mask);
90 BOOL handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, 91 BOOL handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
91 EDragAndDropType cargo_type, 92 EDragAndDropType cargo_type,
@@ -150,7 +151,8 @@ protected:
150 LLFolderView* mFolders; 151 LLFolderView* mFolders;
151 LLScrollableContainerView* mScroller; 152 LLScrollableContainerView* mScroller;
152 BOOL mAllowMultiSelect; 153 BOOL mAllowMultiSelect;
153 const std::string mSortOrderSetting; 154 const std::string mSortOrderSetting;
155 LLUUID mSelectThisID; // if non null, select this item
154}; 156};
155 157
156class LLInventoryView; 158class LLInventoryView;
diff --git a/linden/indra/newview/lljoystickbutton.cpp b/linden/indra/newview/lljoystickbutton.cpp
index 773c57e..ff54569 100644
--- a/linden/indra/newview/lljoystickbutton.cpp
+++ b/linden/indra/newview/lljoystickbutton.cpp
@@ -651,11 +651,11 @@ void LLJoystickCameraRotate::drawRotatedImage( const LLImageGL* image, S32 rotat
651 { 1.f, 0.f } 651 { 1.f, 0.f }
652 }; 652 };
653 653
654 image->bind(); 654 gGL.getTexUnit(0)->bind(image);
655 655
656 gGL.color4fv(UI_VERTEX_COLOR.mV); 656 gGL.color4fv(UI_VERTEX_COLOR.mV);
657 657
658 gGL.begin(LLVertexBuffer::QUADS); 658 gGL.begin(LLRender::QUADS);
659 { 659 {
660 gGL.texCoord2fv( uv[ (rotations + 0) % 4]); 660 gGL.texCoord2fv( uv[ (rotations + 0) % 4]);
661 gGL.vertex2i(width, height ); 661 gGL.vertex2i(width, height );
diff --git a/linden/indra/newview/llmanip.cpp b/linden/indra/newview/llmanip.cpp
index 89f13fe..87e7a13 100644
--- a/linden/indra/newview/llmanip.cpp
+++ b/linden/indra/newview/llmanip.cpp
@@ -388,13 +388,13 @@ void LLManip::renderGuidelines(BOOL draw_x, BOOL draw_y, BOOL draw_z)
388 388
389 const F32 LINE_ALPHA = 0.33f; 389 const F32 LINE_ALPHA = 0.33f;
390 390
391 LLGLSNoTexture gls_no_texture; 391 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
392 LLUI::setLineWidth(1.5f); 392 LLUI::setLineWidth(1.5f);
393 393
394 if (draw_x) 394 if (draw_x)
395 { 395 {
396 gGL.color4f(1.f, 0.f, 0.f, LINE_ALPHA); 396 gGL.color4f(1.f, 0.f, 0.f, LINE_ALPHA);
397 gGL.begin(LLVertexBuffer::LINES); 397 gGL.begin(LLRender::LINES);
398 gGL.vertex3f( -region_size, 0.f, 0.f ); 398 gGL.vertex3f( -region_size, 0.f, 0.f );
399 gGL.vertex3f( region_size, 0.f, 0.f ); 399 gGL.vertex3f( region_size, 0.f, 0.f );
400 gGL.end(); 400 gGL.end();
@@ -403,7 +403,7 @@ void LLManip::renderGuidelines(BOOL draw_x, BOOL draw_y, BOOL draw_z)
403 if (draw_y) 403 if (draw_y)
404 { 404 {
405 gGL.color4f(0.f, 1.f, 0.f, LINE_ALPHA); 405 gGL.color4f(0.f, 1.f, 0.f, LINE_ALPHA);
406 gGL.begin(LLVertexBuffer::LINES); 406 gGL.begin(LLRender::LINES);
407 gGL.vertex3f( 0.f, -region_size, 0.f ); 407 gGL.vertex3f( 0.f, -region_size, 0.f );
408 gGL.vertex3f( 0.f, region_size, 0.f ); 408 gGL.vertex3f( 0.f, region_size, 0.f );
409 gGL.end(); 409 gGL.end();
@@ -412,7 +412,7 @@ void LLManip::renderGuidelines(BOOL draw_x, BOOL draw_y, BOOL draw_z)
412 if (draw_z) 412 if (draw_z)
413 { 413 {
414 gGL.color4f(0.f, 0.f, 1.f, LINE_ALPHA); 414 gGL.color4f(0.f, 0.f, 1.f, LINE_ALPHA);
415 gGL.begin(LLVertexBuffer::LINES); 415 gGL.begin(LLRender::LINES);
416 gGL.vertex3f( 0.f, 0.f, -region_size ); 416 gGL.vertex3f( 0.f, 0.f, -region_size );
417 gGL.vertex3f( 0.f, 0.f, region_size ); 417 gGL.vertex3f( 0.f, 0.f, region_size );
418 gGL.end(); 418 gGL.end();
diff --git a/linden/indra/newview/llmaniprotate.cpp b/linden/indra/newview/llmaniprotate.cpp
index 11b5e8c..ade07b4 100644
--- a/linden/indra/newview/llmaniprotate.cpp
+++ b/linden/indra/newview/llmaniprotate.cpp
@@ -115,7 +115,7 @@ void LLManipRotate::handleSelect()
115void LLManipRotate::render() 115void LLManipRotate::render()
116{ 116{
117 LLGLSUIDefault gls_ui; 117 LLGLSUIDefault gls_ui;
118 LLGLSNoTexture gls_no_texture; 118 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
119 LLGLDepthTest gls_depth(GL_TRUE); 119 LLGLDepthTest gls_depth(GL_TRUE);
120 LLGLEnable gl_blend(GL_BLEND); 120 LLGLEnable gl_blend(GL_BLEND);
121 LLGLEnable gls_alpha_test(GL_ALPHA_TEST); 121 LLGLEnable gls_alpha_test(GL_ALPHA_TEST);
@@ -838,7 +838,7 @@ void LLManipRotate::renderSnapGuides()
838 LLVector3 outer_point; 838 LLVector3 outer_point;
839 LLVector3 text_point; 839 LLVector3 text_point;
840 LLQuaternion rot(deg * DEG_TO_RAD, constraint_axis); 840 LLQuaternion rot(deg * DEG_TO_RAD, constraint_axis);
841 gGL.begin(LLVertexBuffer::LINES); 841 gGL.begin(LLRender::LINES);
842 { 842 {
843 inner_point = (projected_snap_axis * mRadiusMeters * SNAP_GUIDE_INNER_RADIUS * rot) + center; 843 inner_point = (projected_snap_axis * mRadiusMeters * SNAP_GUIDE_INNER_RADIUS * rot) + center;
844 F32 tick_length = 0.f; 844 F32 tick_length = 0.f;
@@ -1017,7 +1017,7 @@ void LLManipRotate::renderSnapGuides()
1017 object_axis = object_axis * SNAP_GUIDE_INNER_RADIUS * mRadiusMeters + center; 1017 object_axis = object_axis * SNAP_GUIDE_INNER_RADIUS * mRadiusMeters + center;
1018 LLVector3 line_start = center; 1018 LLVector3 line_start = center;
1019 1019
1020 gGL.begin(LLVertexBuffer::LINES); 1020 gGL.begin(LLRender::LINES);
1021 { 1021 {
1022 gGL.vertex3fv(line_start.mV); 1022 gGL.vertex3fv(line_start.mV);
1023 gGL.vertex3fv(object_axis.mV); 1023 gGL.vertex3fv(object_axis.mV);
@@ -1025,7 +1025,7 @@ void LLManipRotate::renderSnapGuides()
1025 gGL.end(); 1025 gGL.end();
1026 1026
1027 // draw snap guide arrow 1027 // draw snap guide arrow
1028 gGL.begin(LLVertexBuffer::TRIANGLES); 1028 gGL.begin(LLRender::TRIANGLES);
1029 { 1029 {
1030 LLVector3 arrow_dir; 1030 LLVector3 arrow_dir;
1031 LLVector3 arrow_span = (object_axis - line_start) % getConstraintAxis(); 1031 LLVector3 arrow_span = (object_axis - line_start) % getConstraintAxis();
@@ -1045,7 +1045,7 @@ void LLManipRotate::renderSnapGuides()
1045 1045
1046 { 1046 {
1047 LLGLDepthTest gls_depth(GL_TRUE); 1047 LLGLDepthTest gls_depth(GL_TRUE);
1048 gGL.begin(LLVertexBuffer::LINES); 1048 gGL.begin(LLRender::LINES);
1049 { 1049 {
1050 gGL.vertex3fv(line_start.mV); 1050 gGL.vertex3fv(line_start.mV);
1051 gGL.vertex3fv(object_axis.mV); 1051 gGL.vertex3fv(object_axis.mV);
@@ -1053,7 +1053,7 @@ void LLManipRotate::renderSnapGuides()
1053 gGL.end(); 1053 gGL.end();
1054 1054
1055 // draw snap guide arrow 1055 // draw snap guide arrow
1056 gGL.begin(LLVertexBuffer::TRIANGLES); 1056 gGL.begin(LLRender::TRIANGLES);
1057 { 1057 {
1058 LLVector3 arrow_dir; 1058 LLVector3 arrow_dir;
1059 LLVector3 arrow_span = (object_axis - line_start) % getConstraintAxis(); 1059 LLVector3 arrow_span = (object_axis - line_start) % getConstraintAxis();
diff --git a/linden/indra/newview/llmanipscale.cpp b/linden/indra/newview/llmanipscale.cpp
index 0fa5fa5..5c9c889 100644
--- a/linden/indra/newview/llmanipscale.cpp
+++ b/linden/indra/newview/llmanipscale.cpp
@@ -197,7 +197,7 @@ LLManipScale::~LLManipScale()
197void LLManipScale::render() 197void LLManipScale::render()
198{ 198{
199 LLGLSUIDefault gls_ui; 199 LLGLSUIDefault gls_ui;
200 LLGLSNoTexture gls_no_texture; 200 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
201 LLGLDepthTest gls_depth(GL_TRUE); 201 LLGLDepthTest gls_depth(GL_TRUE);
202 LLGLEnable gl_blend(GL_BLEND); 202 LLGLEnable gl_blend(GL_BLEND);
203 LLGLEnable gls_alpha_test(GL_ALPHA_TEST); 203 LLGLEnable gls_alpha_test(GL_ALPHA_TEST);
@@ -590,7 +590,7 @@ void LLManipScale::renderFaces( const LLBBox& bbox )
590 { 590 {
591 gGL.color4fv( default_normal_color.mV ); 591 gGL.color4fv( default_normal_color.mV );
592 LLGLDepthTest gls_depth(GL_FALSE); 592 LLGLDepthTest gls_depth(GL_FALSE);
593 gGL.begin(LLVertexBuffer::QUADS); 593 gGL.begin(LLRender::QUADS);
594 { 594 {
595 // Face 0 595 // Face 0
596 gGL.vertex3f(min.mV[VX], max.mV[VY], max.mV[VZ]); 596 gGL.vertex3f(min.mV[VX], max.mV[VY], max.mV[VZ]);
@@ -751,7 +751,7 @@ void LLManipScale::renderCorners( const LLBBox& bbox )
751 751
752void LLManipScale::renderBoxHandle( F32 x, F32 y, F32 z ) 752void LLManipScale::renderBoxHandle( F32 x, F32 y, F32 z )
753{ 753{
754 LLImageGL::unbindTexture(0); 754 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
755 LLGLDepthTest gls_depth(GL_FALSE); 755 LLGLDepthTest gls_depth(GL_FALSE);
756 756
757 glPushMatrix(); 757 glPushMatrix();
@@ -1528,7 +1528,7 @@ void LLManipScale::renderSnapGuides(const LLBBox& bbox)
1528 { 1528 {
1529 LLColor4 tick_color = setupSnapGuideRenderPass(pass); 1529 LLColor4 tick_color = setupSnapGuideRenderPass(pass);
1530 1530
1531 gGL.begin(LLVertexBuffer::LINES); 1531 gGL.begin(LLRender::LINES);
1532 LLVector3 line_mid = mScaleCenter + (mScaleSnapValue * mScaleDir) + (mSnapGuideDir1 * mSnapRegimeOffset); 1532 LLVector3 line_mid = mScaleCenter + (mScaleSnapValue * mScaleDir) + (mSnapGuideDir1 * mSnapRegimeOffset);
1533 LLVector3 line_start = line_mid - (mScaleDir * (llmin(mScaleSnapValue, mSnapGuideLength * 0.5f))); 1533 LLVector3 line_start = line_mid - (mScaleDir * (llmin(mScaleSnapValue, mSnapGuideLength * 0.5f)));
1534 LLVector3 line_end = line_mid + (mScaleDir * llmin(max_point_on_scale_line - mScaleSnapValue, mSnapGuideLength * 0.5f)); 1534 LLVector3 line_end = line_mid + (mScaleDir * llmin(max_point_on_scale_line - mScaleSnapValue, mSnapGuideLength * 0.5f));
@@ -1579,7 +1579,7 @@ void LLManipScale::renderSnapGuides(const LLBBox& bbox)
1579 if (mInSnapRegime) 1579 if (mInSnapRegime)
1580 { 1580 {
1581 // draw snap guide line 1581 // draw snap guide line
1582 gGL.begin(LLVertexBuffer::LINES); 1582 gGL.begin(LLRender::LINES);
1583 LLVector3 snap_line_center = mScaleCenter + (mScaleSnapValue * mScaleDir); 1583 LLVector3 snap_line_center = mScaleCenter + (mScaleSnapValue * mScaleDir);
1584 1584
1585 LLVector3 snap_line_start = snap_line_center + (mSnapGuideDir1 * mSnapRegimeOffset); 1585 LLVector3 snap_line_start = snap_line_center + (mSnapGuideDir1 * mSnapRegimeOffset);
@@ -1593,7 +1593,7 @@ void LLManipScale::renderSnapGuides(const LLBBox& bbox)
1593 gGL.end(); 1593 gGL.end();
1594 1594
1595 // draw snap guide arrow 1595 // draw snap guide arrow
1596 gGL.begin(LLVertexBuffer::TRIANGLES); 1596 gGL.begin(LLRender::TRIANGLES);
1597 { 1597 {
1598 //gGLSNoCullFaces.set(); 1598 //gGLSNoCullFaces.set();
1599 gGL.color4f(1.f, 1.f, 1.f, grid_alpha); 1599 gGL.color4f(1.f, 1.f, 1.f, grid_alpha);
@@ -1628,7 +1628,7 @@ void LLManipScale::renderSnapGuides(const LLBBox& bbox)
1628 start_tick = -(llmin(ticks_from_scale_center_1, num_ticks_per_side1)); 1628 start_tick = -(llmin(ticks_from_scale_center_1, num_ticks_per_side1));
1629 stop_tick = llmin(max_ticks1, num_ticks_per_side1); 1629 stop_tick = llmin(max_ticks1, num_ticks_per_side1);
1630 1630
1631 gGL.begin(LLVertexBuffer::LINES); 1631 gGL.begin(LLRender::LINES);
1632 // draw first row of ticks 1632 // draw first row of ticks
1633 for (S32 i = start_tick; i <= stop_tick; i++) 1633 for (S32 i = start_tick; i <= stop_tick; i++)
1634 { 1634 {
diff --git a/linden/indra/newview/llmaniptranslate.cpp b/linden/indra/newview/llmaniptranslate.cpp
index 2278453..30fa745 100644
--- a/linden/indra/newview/llmaniptranslate.cpp
+++ b/linden/indra/newview/llmaniptranslate.cpp
@@ -134,7 +134,7 @@ void LLManipTranslate::restoreGL()
134 134
135 GLuint* d = new GLuint[rez*rez]; 135 GLuint* d = new GLuint[rez*rez];
136 glGenTextures(1, &sGridTex); 136 glGenTextures(1, &sGridTex);
137 glBindTexture(GL_TEXTURE_2D, sGridTex); 137 gGL.getTexUnit(0)->bindManual(LLTexUnit::TT_TEXTURE, sGridTex);
138 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); 138 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
139 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 139 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
140 140
@@ -1052,7 +1052,7 @@ void LLManipTranslate::renderSnapGuides()
1052 F32 max_subdivisions = sGridMaxSubdivisionLevel;//(F32)gSavedSettings.getS32("GridSubdivision"); 1052 F32 max_subdivisions = sGridMaxSubdivisionLevel;//(F32)gSavedSettings.getS32("GridSubdivision");
1053 F32 line_alpha = gSavedSettings.getF32("GridOpacity"); 1053 F32 line_alpha = gSavedSettings.getF32("GridOpacity");
1054 1054
1055 LLGLSNoTexture gls_no_texture; 1055 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
1056 LLGLDepthTest gls_depth(GL_TRUE); 1056 LLGLDepthTest gls_depth(GL_TRUE);
1057 LLGLDisable gls_cull(GL_CULL_FACE); 1057 LLGLDisable gls_cull(GL_CULL_FACE);
1058 LLVector3 translate_axis; 1058 LLVector3 translate_axis;
@@ -1223,7 +1223,7 @@ void LLManipTranslate::renderSnapGuides()
1223 { 1223 {
1224 LLColor4 line_color = setupSnapGuideRenderPass(pass); 1224 LLColor4 line_color = setupSnapGuideRenderPass(pass);
1225 1225
1226 gGL.begin(LLVertexBuffer::LINES); 1226 gGL.begin(LLRender::LINES);
1227 { 1227 {
1228 LLVector3 line_start = selection_center + (mSnapOffsetMeters * mSnapOffsetAxis) + (translate_axis * (guide_size_meters * 0.5f + offset_nearest_grid_unit)); 1228 LLVector3 line_start = selection_center + (mSnapOffsetMeters * mSnapOffsetAxis) + (translate_axis * (guide_size_meters * 0.5f + offset_nearest_grid_unit));
1229 LLVector3 line_end = selection_center + (mSnapOffsetMeters * mSnapOffsetAxis) - (translate_axis * (guide_size_meters * 0.5f + offset_nearest_grid_unit)); 1229 LLVector3 line_end = selection_center + (mSnapOffsetMeters * mSnapOffsetAxis) - (translate_axis * (guide_size_meters * 0.5f + offset_nearest_grid_unit));
@@ -1299,7 +1299,7 @@ void LLManipTranslate::renderSnapGuides()
1299 LLVector3 line_start = selection_center - mSnapOffsetAxis * mSnapOffsetMeters; 1299 LLVector3 line_start = selection_center - mSnapOffsetAxis * mSnapOffsetMeters;
1300 LLVector3 line_end = selection_center + mSnapOffsetAxis * mSnapOffsetMeters; 1300 LLVector3 line_end = selection_center + mSnapOffsetAxis * mSnapOffsetMeters;
1301 1301
1302 gGL.begin(LLVertexBuffer::LINES); 1302 gGL.begin(LLRender::LINES);
1303 { 1303 {
1304 gGL.color4f(line_color.mV[VX], line_color.mV[VY], line_color.mV[VZ], line_color.mV[VW]); 1304 gGL.color4f(line_color.mV[VX], line_color.mV[VY], line_color.mV[VZ], line_color.mV[VW]);
1305 1305
@@ -1309,7 +1309,7 @@ void LLManipTranslate::renderSnapGuides()
1309 gGL.end(); 1309 gGL.end();
1310 1310
1311 // draw snap guide arrow 1311 // draw snap guide arrow
1312 gGL.begin(LLVertexBuffer::TRIANGLES); 1312 gGL.begin(LLRender::TRIANGLES);
1313 { 1313 {
1314 gGL.color4f(line_color.mV[VX], line_color.mV[VY], line_color.mV[VZ], line_color.mV[VW]); 1314 gGL.color4f(line_color.mV[VX], line_color.mV[VY], line_color.mV[VZ], line_color.mV[VW]);
1315 1315
@@ -1463,7 +1463,7 @@ void LLManipTranslate::renderSnapGuides()
1463 break; 1463 break;
1464 } 1464 }
1465 1465
1466 LLImageGL::unbindTexture(0); 1466 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
1467 highlightIntersection(normal, selection_center, grid_rotation, inner_color); 1467 highlightIntersection(normal, selection_center, grid_rotation, inner_color);
1468 1468
1469 gGL.pushMatrix(); 1469 gGL.pushMatrix();
@@ -1503,7 +1503,7 @@ void LLManipTranslate::renderSnapGuides()
1503 LLGLDisable stencil(GL_STENCIL_TEST); 1503 LLGLDisable stencil(GL_STENCIL_TEST);
1504 { 1504 {
1505 LLGLDepthTest gls_depth(GL_TRUE, GL_FALSE, GL_GREATER); 1505 LLGLDepthTest gls_depth(GL_TRUE, GL_FALSE, GL_GREATER);
1506 glBindTexture(GL_TEXTURE_2D, sGridTex); 1506 gGL.getTexUnit(0)->bindManual(LLTexUnit::TT_TEXTURE, sGridTex);
1507 gGL.flush(); 1507 gGL.flush();
1508 gGL.blendFunc(LLRender::BF_ZERO, LLRender::BF_ONE_MINUS_SOURCE_ALPHA); 1508 gGL.blendFunc(LLRender::BF_ZERO, LLRender::BF_ONE_MINUS_SOURCE_ALPHA);
1509 renderGrid(u,v,tiles,0.9f, 0.9f, 0.9f,a*0.15f); 1509 renderGrid(u,v,tiles,0.9f, 0.9f, 0.9f,a*0.15f);
@@ -1514,11 +1514,11 @@ void LLManipTranslate::renderSnapGuides()
1514 { 1514 {
1515 LLGLDisable alpha_test(GL_ALPHA_TEST); 1515 LLGLDisable alpha_test(GL_ALPHA_TEST);
1516 //draw black overlay 1516 //draw black overlay
1517 LLImageGL::unbindTexture(0); 1517 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
1518 renderGrid(u,v,tiles,0.0f, 0.0f, 0.0f,a*0.16f); 1518 renderGrid(u,v,tiles,0.0f, 0.0f, 0.0f,a*0.16f);
1519 1519
1520 //draw grid top 1520 //draw grid top
1521 glBindTexture(GL_TEXTURE_2D, sGridTex); 1521 gGL.getTexUnit(0)->bindManual(LLTexUnit::TT_TEXTURE, sGridTex);
1522 renderGrid(u,v,tiles,1,1,1,a); 1522 renderGrid(u,v,tiles,1,1,1,a);
1523 1523
1524 gGL.popMatrix(); 1524 gGL.popMatrix();
@@ -1564,7 +1564,7 @@ void LLManipTranslate::renderGrid(F32 x, F32 y, F32 size, F32 r, F32 g, F32 b, F
1564 1564
1565 for (F32 xx = -size-d; xx < size+d; xx += d) 1565 for (F32 xx = -size-d; xx < size+d; xx += d)
1566 { 1566 {
1567 gGL.begin(LLVertexBuffer::TRIANGLE_STRIP); 1567 gGL.begin(LLRender::TRIANGLE_STRIP);
1568 for (F32 yy = -size-d; yy < size+d; yy += d) 1568 for (F32 yy = -size-d; yy < size+d; yy += d)
1569 { 1569 {
1570 float dx, dy, da; 1570 float dx, dy, da;
@@ -1620,7 +1620,7 @@ void LLManipTranslate::highlightIntersection(LLVector3 normal,
1620 LLGLDepthTest depth (GL_TRUE, GL_FALSE, GL_ALWAYS); 1620 LLGLDepthTest depth (GL_TRUE, GL_FALSE, GL_ALWAYS);
1621 glStencilFunc(GL_ALWAYS, 0, stencil_mask); 1621 glStencilFunc(GL_ALWAYS, 0, stencil_mask);
1622 gGL.setColorMask(false, false); 1622 gGL.setColorMask(false, false);
1623 LLImageGL::unbindTexture(0); 1623 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
1624 glColor4f(1,1,1,1); 1624 glColor4f(1,1,1,1);
1625 1625
1626 //setup clip plane 1626 //setup clip plane
@@ -1686,7 +1686,7 @@ void LLManipTranslate::highlightIntersection(LLVector3 normal,
1686 1686
1687 //draw volume/plane intersections 1687 //draw volume/plane intersections
1688 { 1688 {
1689 LLImageGL::unbindTexture(0); 1689 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
1690 LLGLDepthTest depth(GL_FALSE); 1690 LLGLDepthTest depth(GL_FALSE);
1691 LLGLEnable stencil(GL_STENCIL_TEST); 1691 LLGLEnable stencil(GL_STENCIL_TEST);
1692 glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); 1692 glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
@@ -1834,7 +1834,7 @@ void LLManipTranslate::renderTranslationHandles()
1834 relative_camera_dir.normVec(); 1834 relative_camera_dir.normVec();
1835 1835
1836 { 1836 {
1837 LLGLSNoTexture gls_ui_no_texture; 1837 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
1838 LLGLDisable cull_face(GL_CULL_FACE); 1838 LLGLDisable cull_face(GL_CULL_FACE);
1839 1839
1840 LLColor4 color1; 1840 LLColor4 color1;
@@ -1877,7 +1877,7 @@ void LLManipTranslate::renderTranslationHandles()
1877 color1.setVec(0.f, 1.f, 0.f, 0.6f); 1877 color1.setVec(0.f, 1.f, 0.f, 0.6f);
1878 color2.setVec(0.f, 0.f, 1.f, 0.6f); 1878 color2.setVec(0.f, 0.f, 1.f, 0.6f);
1879 } 1879 }
1880 gGL.begin(LLVertexBuffer::TRIANGLES); 1880 gGL.begin(LLRender::TRIANGLES);
1881 { 1881 {
1882 gGL.color4fv(color1.mV); 1882 gGL.color4fv(color1.mV);
1883 gGL.vertex3f(0.f, mPlaneManipOffsetMeters * (-PLANE_TICK_SIZE * 0.25f), mPlaneManipOffsetMeters * (-PLANE_TICK_SIZE * 0.25f)); 1883 gGL.vertex3f(0.f, mPlaneManipOffsetMeters * (-PLANE_TICK_SIZE * 0.25f), mPlaneManipOffsetMeters * (-PLANE_TICK_SIZE * 0.25f));
@@ -1892,7 +1892,7 @@ void LLManipTranslate::renderTranslationHandles()
1892 gGL.end(); 1892 gGL.end();
1893 1893
1894 LLUI::setLineWidth(3.0f); 1894 LLUI::setLineWidth(3.0f);
1895 gGL.begin(LLVertexBuffer::LINES); 1895 gGL.begin(LLRender::LINES);
1896 { 1896 {
1897 gGL.color4f(0.f, 0.f, 0.f, 0.3f); 1897 gGL.color4f(0.f, 0.f, 0.f, 0.3f);
1898 gGL.vertex3f(0.f, mPlaneManipOffsetMeters * -PLANE_TICK_SIZE * 0.25f, mPlaneManipOffsetMeters * -PLANE_TICK_SIZE * 0.25f); 1898 gGL.vertex3f(0.f, mPlaneManipOffsetMeters * -PLANE_TICK_SIZE * 0.25f, mPlaneManipOffsetMeters * -PLANE_TICK_SIZE * 0.25f);
@@ -1932,7 +1932,7 @@ void LLManipTranslate::renderTranslationHandles()
1932 color2.setVec(1.f, 0.f, 0.f, 0.6f); 1932 color2.setVec(1.f, 0.f, 0.f, 0.6f);
1933 } 1933 }
1934 1934
1935 gGL.begin(LLVertexBuffer::TRIANGLES); 1935 gGL.begin(LLRender::TRIANGLES);
1936 { 1936 {
1937 gGL.color4fv(color1.mV); 1937 gGL.color4fv(color1.mV);
1938 gGL.vertex3f(mPlaneManipOffsetMeters * (PLANE_TICK_SIZE * 0.25f), 0.f, mPlaneManipOffsetMeters * (PLANE_TICK_SIZE * 0.25f)); 1938 gGL.vertex3f(mPlaneManipOffsetMeters * (PLANE_TICK_SIZE * 0.25f), 0.f, mPlaneManipOffsetMeters * (PLANE_TICK_SIZE * 0.25f));
@@ -1947,7 +1947,7 @@ void LLManipTranslate::renderTranslationHandles()
1947 gGL.end(); 1947 gGL.end();
1948 1948
1949 LLUI::setLineWidth(3.0f); 1949 LLUI::setLineWidth(3.0f);
1950 gGL.begin(LLVertexBuffer::LINES); 1950 gGL.begin(LLRender::LINES);
1951 { 1951 {
1952 gGL.color4f(0.f, 0.f, 0.f, 0.3f); 1952 gGL.color4f(0.f, 0.f, 0.f, 0.3f);
1953 gGL.vertex3f(mPlaneManipOffsetMeters * -PLANE_TICK_SIZE * 0.25f, 0.f, mPlaneManipOffsetMeters * -PLANE_TICK_SIZE * 0.25f); 1953 gGL.vertex3f(mPlaneManipOffsetMeters * -PLANE_TICK_SIZE * 0.25f, 0.f, mPlaneManipOffsetMeters * -PLANE_TICK_SIZE * 0.25f);
@@ -2011,7 +2011,7 @@ void LLManipTranslate::renderTranslationHandles()
2011 color2.setVec(0.f, 0.8f, 0.f, 0.6f); 2011 color2.setVec(0.f, 0.8f, 0.f, 0.6f);
2012 } 2012 }
2013 2013
2014 gGL.begin(LLVertexBuffer::TRIANGLES); 2014 gGL.begin(LLRender::TRIANGLES);
2015 { 2015 {
2016 gGL.color4fv(color1.mV); 2016 gGL.color4fv(color1.mV);
2017 gGL.vertex3fv(v0.mV); 2017 gGL.vertex3fv(v0.mV);
@@ -2026,7 +2026,7 @@ void LLManipTranslate::renderTranslationHandles()
2026 gGL.end(); 2026 gGL.end();
2027 2027
2028 LLUI::setLineWidth(3.0f); 2028 LLUI::setLineWidth(3.0f);
2029 gGL.begin(LLVertexBuffer::LINES); 2029 gGL.begin(LLRender::LINES);
2030 { 2030 {
2031 gGL.color4f(0.f, 0.f, 0.f, 0.3f); 2031 gGL.color4f(0.f, 0.f, 0.f, 0.3f);
2032 LLVector3 v12 = (v1 + v2) * .5f; 2032 LLVector3 v12 = (v1 + v2) * .5f;
@@ -2052,7 +2052,7 @@ void LLManipTranslate::renderTranslationHandles()
2052 } 2052 }
2053 } 2053 }
2054 { 2054 {
2055 LLGLSNoTexture gls_ui_no_texture; 2055 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
2056 2056
2057 // Since we draw handles with depth testing off, we need to draw them in the 2057 // Since we draw handles with depth testing off, we need to draw them in the
2058 // proper depth order. 2058 // proper depth order.
@@ -2126,7 +2126,7 @@ void LLManipTranslate::renderTranslationHandles()
2126 2126
2127void LLManipTranslate::renderArrow(S32 which_arrow, S32 selected_arrow, F32 box_size, F32 arrow_size, F32 handle_size, BOOL reverse_direction) 2127void LLManipTranslate::renderArrow(S32 which_arrow, S32 selected_arrow, F32 box_size, F32 arrow_size, F32 handle_size, BOOL reverse_direction)
2128{ 2128{
2129 LLGLSNoTexture gls_ui_no_texture; 2129 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
2130 LLGLEnable gls_blend(GL_BLEND); 2130 LLGLEnable gls_blend(GL_BLEND);
2131 LLGLEnable gls_color_material(GL_COLOR_MATERIAL); 2131 LLGLEnable gls_color_material(GL_COLOR_MATERIAL);
2132 2132
@@ -2160,7 +2160,7 @@ void LLManipTranslate::renderArrow(S32 which_arrow, S32 selected_arrow, F32 box_
2160 2160
2161 { 2161 {
2162 LLUI::setLineWidth(2.0f); 2162 LLUI::setLineWidth(2.0f);
2163 gGL.begin(LLVertexBuffer::LINES); 2163 gGL.begin(LLRender::LINES);
2164 vec.mV[index] = box_size; 2164 vec.mV[index] = box_size;
2165 gGL.vertex3f(vec.mV[0], vec.mV[1], vec.mV[2]); 2165 gGL.vertex3f(vec.mV[0], vec.mV[1], vec.mV[2]);
2166 2166
diff --git a/linden/indra/newview/llmapresponders.cpp b/linden/indra/newview/llmapresponders.cpp
index d16bc78..898ac58 100644
--- a/linden/indra/newview/llmapresponders.cpp
+++ b/linden/indra/newview/llmapresponders.cpp
@@ -66,7 +66,7 @@ void LLMapLayerResponder::result(const LLSD& result)
66 new_layer.LayerDefined = TRUE; 66 new_layer.LayerDefined = TRUE;
67 new_layer.LayerImageID = layer_data["ImageID"]; 67 new_layer.LayerImageID = layer_data["ImageID"];
68 new_layer.LayerImage = gImageList.getImage(new_layer.LayerImageID, MIPMAP_TRUE, FALSE); 68 new_layer.LayerImage = gImageList.getImage(new_layer.LayerImageID, MIPMAP_TRUE, FALSE);
69 new_layer.LayerImage->bindTexture(0); 69 gGL.getTexUnit(0)->bind(new_layer.LayerImage.get());
70 new_layer.LayerImage->setClamp(TRUE, TRUE); 70 new_layer.LayerImage->setClamp(TRUE, TRUE);
71 71
72 new_layer.LayerExtents.mLeft = layer_data["Left"]; 72 new_layer.LayerExtents.mLeft = layer_data["Left"];
@@ -163,7 +163,7 @@ void LLMapLayerResponder::result(const LLSD& result)
163 siminfo->mWaterHeight = (F32) water_height; 163 siminfo->mWaterHeight = (F32) water_height;
164 siminfo->mMapImageID[agent_flags] = image_id; 164 siminfo->mMapImageID[agent_flags] = image_id;
165 siminfo->mCurrentImage = gImageList.getImage(siminfo->mMapImageID[LLWorldMap::getInstance()->mCurrentMap], MIPMAP_TRUE, FALSE); 165 siminfo->mCurrentImage = gImageList.getImage(siminfo->mMapImageID[LLWorldMap::getInstance()->mCurrentMap], MIPMAP_TRUE, FALSE);
166 siminfo->mCurrentImage->bindTexture(0); 166 gGL.getTexUnit(0)->bind(siminfo->mCurrentImage.get());
167 siminfo->mCurrentImage->setClamp(TRUE, TRUE); 167 siminfo->mCurrentImage->setClamp(TRUE, TRUE);
168 168
169 if (siminfo->mMapImageID[2].notNull()) 169 if (siminfo->mMapImageID[2].notNull())
diff --git a/linden/indra/newview/llmemoryview.cpp b/linden/indra/newview/llmemoryview.cpp
index c814e2b..89001d4 100644
--- a/linden/indra/newview/llmemoryview.cpp
+++ b/linden/indra/newview/llmemoryview.cpp
@@ -146,7 +146,7 @@ void LLMemoryView::draw()
146 S32 height = getRect().getHeight(); 146 S32 height = getRect().getHeight();
147 147
148 LLGLSUIDefault gls_ui; 148 LLGLSUIDefault gls_ui;
149 LLGLSNoTexture gls_no_tex; 149 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
150 gl_rect_2d(0, height, width, 0, LLColor4(0.f, 0.f, 0.f, 0.25f)); 150 gl_rect_2d(0, height, width, 0, LLColor4(0.f, 0.f, 0.f, 0.25f));
151 151
152#if MEM_TRACK_TYPE 152#if MEM_TRACK_TYPE
diff --git a/linden/indra/newview/llmutelist.cpp b/linden/indra/newview/llmutelist.cpp
index 0cdfe83..fe42608 100644
--- a/linden/indra/newview/llmutelist.cpp
+++ b/linden/indra/newview/llmutelist.cpp
@@ -97,6 +97,26 @@ const char AGENT_SUFFIX[] = " (resident)";
97const char OBJECT_SUFFIX[] = " (object)"; 97const char OBJECT_SUFFIX[] = " (object)";
98const char GROUP_SUFFIX[] = " (group)"; 98const char GROUP_SUFFIX[] = " (group)";
99 99
100
101LLMute::LLMute(const LLUUID& id, const std::string& name, EType type, U32 flags)
102 : mID(id),
103 mName(name),
104 mType(type),
105 mFlags(flags)
106{
107 // muting is done by root objects only - try to find this objects root
108 LLViewerObject *objectp = gObjectList.findObject(mID);
109 if ((objectp) && (!objectp->isAvatar()))
110 {
111 LLViewerObject *parentp = (LLViewerObject *)objectp->getParent();
112 if (parentp)
113 {
114 mID = parentp->getID();
115 }
116 }
117}
118
119
100std::string LLMute::getDisplayName() const 120std::string LLMute::getDisplayName() const
101{ 121{
102 std::string name_with_suffix = mName; 122 std::string name_with_suffix = mName;
@@ -216,17 +236,24 @@ void LLMuteList::loadUserVolumes()
216//----------------------------------------------------------------------------- 236//-----------------------------------------------------------------------------
217LLMuteList::~LLMuteList() 237LLMuteList::~LLMuteList()
218{ 238{
219 std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, "volume_settings.xml"); 239 // If we quit from the login screen we will not have an SL account
220 LLSD settings_llsd; 240 // name. Don't try to save, otherwise we'll dump a file in
221 241 // C:\Program Files\SecondLife\ JC
222 for(user_volume_map_t::iterator iter = mUserVolumeSettings.begin(); iter != mUserVolumeSettings.end(); ++iter) 242 std::string user_dir = gDirUtilp->getLindenUserDir();
243 if (!user_dir.empty())
223 { 244 {
224 settings_llsd[iter->first.asString()] = iter->second; 245 std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, "volume_settings.xml");
225 } 246 LLSD settings_llsd;
226 247
227 llofstream file; 248 for(user_volume_map_t::iterator iter = mUserVolumeSettings.begin(); iter != mUserVolumeSettings.end(); ++iter)
228 file.open(filename); 249 {
229 LLSDSerialize::toPrettyXML(settings_llsd, file); 250 settings_llsd[iter->first.asString()] = iter->second;
251 }
252
253 llofstream file;
254 file.open(filename);
255 LLSDSerialize::toPrettyXML(settings_llsd, file);
256 }
230} 257}
231 258
232BOOL LLMuteList::isLinden(const std::string& name) const 259BOOL LLMuteList::isLinden(const std::string& name) const
diff --git a/linden/indra/newview/llmutelist.h b/linden/indra/newview/llmutelist.h
index 400f13e..af9c498 100644
--- a/linden/indra/newview/llmutelist.h
+++ b/linden/indra/newview/llmutelist.h
@@ -60,8 +60,7 @@ public:
60 flagAll = 0x0000000F // Mask of all currently defined flags 60 flagAll = 0x0000000F // Mask of all currently defined flags
61 }; 61 };
62 62
63 LLMute(const LLUUID& id, const std::string& name = std::string(), EType type = BY_NAME, U32 flags = 0) 63 LLMute(const LLUUID& id, const std::string& name = std::string(), EType type = BY_NAME, U32 flags = 0);
64 : mID(id), mName(name), mType(type),mFlags(flags) { }
65 64
66 // Returns name + suffix based on type 65 // Returns name + suffix based on type
67 // For example: "James Tester (resident)" 66 // For example: "James Tester (resident)"
diff --git a/linden/indra/newview/llnetmap.cpp b/linden/indra/newview/llnetmap.cpp
index b277998..36b6863 100644
--- a/linden/indra/newview/llnetmap.cpp
+++ b/linden/indra/newview/llnetmap.cpp
@@ -226,7 +226,7 @@ void LLNetMap::draw()
226 LLGLEnable scissor(GL_SCISSOR_TEST); 226 LLGLEnable scissor(GL_SCISSOR_TEST);
227 227
228 { 228 {
229 LLGLSNoTexture no_texture; 229 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
230 LLLocalClipRect clip(getLocalRect()); 230 LLLocalClipRect clip(getLocalRect());
231 231
232 glMatrixMode(GL_MODELVIEW); 232 glMatrixMode(GL_MODELVIEW);
@@ -286,8 +286,8 @@ void LLNetMap::draw()
286 286
287 287
288 // Draw using texture. 288 // Draw using texture.
289 LLViewerImage::bindTexture(regionp->getLand().getSTexture()); 289 gGL.getTexUnit(0)->bind(regionp->getLand().getSTexture());
290 gGL.begin(LLVertexBuffer::QUADS); 290 gGL.begin(LLRender::QUADS);
291 gGL.texCoord2f(0.f, 1.f); 291 gGL.texCoord2f(0.f, 1.f);
292 gGL.vertex2f(left, top); 292 gGL.vertex2f(left, top);
293 gGL.texCoord2f(0.f, 0.f); 293 gGL.texCoord2f(0.f, 0.f);
@@ -303,8 +303,8 @@ void LLNetMap::draw()
303 { 303 {
304 if (regionp->getLand().getWaterTexture()) 304 if (regionp->getLand().getWaterTexture())
305 { 305 {
306 LLViewerImage::bindTexture(regionp->getLand().getWaterTexture()); 306 gGL.getTexUnit(0)->bind(regionp->getLand().getWaterTexture());
307 gGL.begin(LLVertexBuffer::QUADS); 307 gGL.begin(LLRender::QUADS);
308 gGL.texCoord2f(0.f, 1.f); 308 gGL.texCoord2f(0.f, 1.f);
309 gGL.vertex2f(left, top); 309 gGL.vertex2f(left, top);
310 gGL.texCoord2f(0.f, 0.f); 310 gGL.texCoord2f(0.f, 0.f);
@@ -350,11 +350,11 @@ void LLNetMap::draw()
350 map_center_agent.mV[VX] *= gMiniMapScale/region_width; 350 map_center_agent.mV[VX] *= gMiniMapScale/region_width;
351 map_center_agent.mV[VY] *= gMiniMapScale/region_width; 351 map_center_agent.mV[VY] *= gMiniMapScale/region_width;
352 352
353 LLViewerImage::bindTexture(mObjectImagep); 353 gGL.getTexUnit(0)->bind(mObjectImagep);
354 F32 image_half_width = 0.5f*mObjectMapPixels; 354 F32 image_half_width = 0.5f*mObjectMapPixels;
355 F32 image_half_height = 0.5f*mObjectMapPixels; 355 F32 image_half_height = 0.5f*mObjectMapPixels;
356 356
357 gGL.begin(LLVertexBuffer::QUADS); 357 gGL.begin(LLRender::QUADS);
358 gGL.texCoord2f(0.f, 1.f); 358 gGL.texCoord2f(0.f, 1.f);
359 gGL.vertex2f(map_center_agent.mV[VX] - image_half_width, image_half_height + map_center_agent.mV[VY]); 359 gGL.vertex2f(map_center_agent.mV[VX] - image_half_width, image_half_height + map_center_agent.mV[VY]);
360 gGL.texCoord2f(0.f, 0.f); 360 gGL.texCoord2f(0.f, 0.f);
@@ -457,13 +457,13 @@ void LLNetMap::draw()
457 F32 ctr_y = (F32)center_sw_bottom; 457 F32 ctr_y = (F32)center_sw_bottom;
458 458
459 459
460 LLGLSNoTexture no_texture; 460 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
461 461
462 if( LLNetMap::sRotateMap ) 462 if( LLNetMap::sRotateMap )
463 { 463 {
464 gGL.color4fv(gFrustumMapColor.mV); 464 gGL.color4fv(gFrustumMapColor.mV);
465 465
466 gGL.begin( LLVertexBuffer::TRIANGLES ); 466 gGL.begin( LLRender::TRIANGLES );
467 gGL.vertex2f( ctr_x, ctr_y ); 467 gGL.vertex2f( ctr_x, ctr_y );
468 gGL.vertex2f( ctr_x - half_width_pixels, ctr_y + far_clip_pixels ); 468 gGL.vertex2f( ctr_x - half_width_pixels, ctr_y + far_clip_pixels );
469 gGL.vertex2f( ctr_x + half_width_pixels, ctr_y + far_clip_pixels ); 469 gGL.vertex2f( ctr_x + half_width_pixels, ctr_y + far_clip_pixels );
@@ -477,7 +477,7 @@ void LLNetMap::draw()
477 gGL.pushMatrix(); 477 gGL.pushMatrix();
478 gGL.translatef( ctr_x, ctr_y, 0 ); 478 gGL.translatef( ctr_x, ctr_y, 0 );
479 glRotatef( atan2( LLViewerCamera::getInstance()->getAtAxis().mV[VX], LLViewerCamera::getInstance()->getAtAxis().mV[VY] ) * RAD_TO_DEG, 0.f, 0.f, -1.f); 479 glRotatef( atan2( LLViewerCamera::getInstance()->getAtAxis().mV[VX], LLViewerCamera::getInstance()->getAtAxis().mV[VY] ) * RAD_TO_DEG, 0.f, 0.f, -1.f);
480 gGL.begin( LLVertexBuffer::TRIANGLES ); 480 gGL.begin( LLRender::TRIANGLES );
481 gGL.vertex2f( 0, 0 ); 481 gGL.vertex2f( 0, 0 );
482 gGL.vertex2f( -half_width_pixels, far_clip_pixels ); 482 gGL.vertex2f( -half_width_pixels, far_clip_pixels );
483 gGL.vertex2f( half_width_pixels, far_clip_pixels ); 483 gGL.vertex2f( half_width_pixels, far_clip_pixels );
@@ -642,7 +642,11 @@ void LLNetMap::renderScaledPointGlobal( const LLVector3d& pos, const LLColor4U &
642 LLVector3 local_pos; 642 LLVector3 local_pos;
643 local_pos.setVec( pos - mObjectImageCenterGlobal ); 643 local_pos.setVec( pos - mObjectImageCenterGlobal );
644 644
645 S32 diameter_pixels = llround(2 * radius_meters * mObjectMapTPM); 645 // DEV-17370 - megaprims of size > 4096 cause lag. (go figger.)
646 const F32 MAX_RADIUS = 256.0f;
647 F32 radius_clamped = llmin(radius_meters, MAX_RADIUS);
648
649 S32 diameter_pixels = llround(2 * radius_clamped * mObjectMapTPM);
646 renderPoint( local_pos, color, diameter_pixels ); 650 renderPoint( local_pos, color, diameter_pixels );
647} 651}
648 652
diff --git a/linden/indra/newview/llnotify.cpp b/linden/indra/newview/llnotify.cpp
index f703736..9c1f7a0 100644
--- a/linden/indra/newview/llnotify.cpp
+++ b/linden/indra/newview/llnotify.cpp
@@ -509,7 +509,7 @@ void LLNotifyBox::drawBackground() const
509 LLUIImagePtr imagep = LLUI::getUIImage("rounded_square.tga"); 509 LLUIImagePtr imagep = LLUI::getUIImage("rounded_square.tga");
510 if (imagep) 510 if (imagep)
511 { 511 {
512 LLViewerImage::bindTexture(imagep->getImage()); 512 gGL.getTexUnit(0)->bind(imagep->getImage());
513 // set proper background color depending on whether notify box is a caution or not 513 // set proper background color depending on whether notify box is a caution or not
514 LLColor4 color = mIsCaution? gColors.getColor("NotifyCautionBoxColor") : gColors.getColor("NotifyBoxColor"); 514 LLColor4 color = mIsCaution? gColors.getColor("NotifyCautionBoxColor") : gColors.getColor("NotifyBoxColor");
515 if(gFocusMgr.childHasKeyboardFocus( this )) 515 if(gFocusMgr.childHasKeyboardFocus( this ))
diff --git a/linden/indra/newview/llpaneldisplay.cpp b/linden/indra/newview/llpaneldisplay.cpp
index 3e60745..26e6fda 100644
--- a/linden/indra/newview/llpaneldisplay.cpp
+++ b/linden/indra/newview/llpaneldisplay.cpp
@@ -753,6 +753,8 @@ void LLPanelDisplay::onApplyResolution(LLUICtrl* src, void* user_data)
753 753
754void LLPanelDisplay::applyResolution() 754void LLPanelDisplay::applyResolution()
755{ 755{
756
757 gGL.flush();
756 char aspect_ratio_text[ASPECT_RATIO_STR_LEN]; /*Flawfinder: ignore*/ 758 char aspect_ratio_text[ASPECT_RATIO_STR_LEN]; /*Flawfinder: ignore*/
757 if (mCtrlAspectRatio->getCurrentIndex() == -1) 759 if (mCtrlAspectRatio->getCurrentIndex() == -1)
758 { 760 {
@@ -787,75 +789,15 @@ void LLPanelDisplay::applyResolution()
787 { 789 {
788 mAspectRatio = (F32)mCtrlAspectRatio->getValue().asReal(); 790 mAspectRatio = (F32)mCtrlAspectRatio->getValue().asReal();
789 } 791 }
790 792
791 // presumably, user entered a non-numeric value if aspect_ratio == 0.f 793 // presumably, user entered a non-numeric value if aspect_ratio == 0.f
792 if (mAspectRatio != 0.f) 794 if (mAspectRatio != 0.f)
793 { 795 {
794 mAspectRatio = llclamp(mAspectRatio, 0.2f, 5.f); 796 mAspectRatio = llclamp(mAspectRatio, 0.2f, 5.f);
795 gSavedSettings.setF32("FullScreenAspectRatio", mAspectRatio); 797 gSavedSettings.setF32("FullScreenAspectRatio", mAspectRatio);
796 if (gSavedSettings.getBOOL("FullScreenAutoDetectAspectRatio"))
797 {
798 gViewerWindow->getWindow()->setNativeAspectRatio(0.f);
799 }
800 else
801 {
802 gViewerWindow->getWindow()->setNativeAspectRatio(mAspectRatio);
803 }
804 } 798 }
805 gViewerWindow->reshape(gViewerWindow->getWindowDisplayWidth(), gViewerWindow->getWindowDisplayHeight());
806
807 // Screen resolution
808 S32 num_resolutions;
809 LLWindow::LLWindowResolution* supported_resolutions = gViewerWindow->getWindow()->getSupportedResolutions(num_resolutions);
810
811 // switching to windowed
812 BOOL fullscreen = !mCtrlWindowed->get();
813
814 // check if resolution has changed
815 BOOL targetFullscreen;
816 S32 targetWidth;
817 S32 targetHeight;
818 799
819 gViewerWindow->getTargetWindow(targetFullscreen, targetWidth, targetHeight); 800 gViewerWindow->requestResolutionUpdate(!mCtrlWindowed->get(), mCtrlFullScreen->getCurrentIndex());
820
821 if ((fullscreen != targetFullscreen) ||
822 (fullscreen &&
823 (supported_resolutions[mCtrlFullScreen->getCurrentIndex()].mWidth != targetWidth ||
824 supported_resolutions[mCtrlFullScreen->getCurrentIndex()].mHeight != targetHeight)
825 ))
826 {
827 // change fullscreen resolution or switch in/out of windowed mode
828 BOOL result;
829
830 BOOL logged_in = (LLStartUp::getStartupState() >= STATE_STARTED);
831 if (fullscreen)
832 {
833 result = gViewerWindow->changeDisplaySettings(TRUE,
834 LLCoordScreen( supported_resolutions[mCtrlFullScreen->getCurrentIndex()].mWidth,
835 supported_resolutions[mCtrlFullScreen->getCurrentIndex()].mHeight),
836 gSavedSettings.getBOOL("DisableVerticalSync"),
837 logged_in);
838 }
839 else
840 {
841 result = gViewerWindow->changeDisplaySettings(FALSE,
842 LLCoordScreen(gSavedSettings.getS32("WindowWidth"), gSavedSettings.getS32("WindowHeight")),
843 TRUE,
844 logged_in);
845 }
846 if (!result)
847 {
848
849 // GL is non-existent at this point, so we can't continue.
850 llerrs << "LLPanelDisplay::apply() failed" << llendl;
851 }
852 }
853
854 // force aspect ratio
855 if (fullscreen)
856 {
857 LLViewerCamera::getInstance()->setAspect( gViewerWindow->getDisplayAspectRatio() );
858 }
859 801
860 send_agent_update(TRUE); 802 send_agent_update(TRUE);
861 803
diff --git a/linden/indra/newview/llpanelgeneral.cpp b/linden/indra/newview/llpanelgeneral.cpp
index 256f02a..43b0f4c 100644
--- a/linden/indra/newview/llpanelgeneral.cpp
+++ b/linden/indra/newview/llpanelgeneral.cpp
@@ -31,75 +31,15 @@
31 31
32#include "llviewerprecompiledheaders.h" 32#include "llviewerprecompiledheaders.h"
33 33
34//file include
34#include "llpanelgeneral.h" 35#include "llpanelgeneral.h"
35 36
36// linden library includes
37#include "llerror.h"
38#include "llrect.h"
39#include "llfontgl.h"
40#include "message.h"
41#include "lluictrlfactory.h"
42
43// project includes 37// project includes
44#include "llagent.h"
45#include "llviewerwindow.h"
46#include "llcolorswatch.h" 38#include "llcolorswatch.h"
47#include "llcombobox.h" 39#include "llcombobox.h"
48#include "llconsole.h" 40#include "lluictrlfactory.h"
49#include "lllineeditor.h"
50#include "llpanellogin.h"
51#include "llnetmap.h"
52#include "llresmgr.h"
53#include "llspinctrl.h"
54#include "lltextbox.h"
55#include "llui.h"
56#include "llurlsimstring.h" 41#include "llurlsimstring.h"
57#include "llviewercontrol.h" 42#include "llviewercontrol.h"
58#include "llurlsimstring.h"
59
60#include "llcheckboxctrl.h"
61#include "llradiogroup.h"
62//
63// Imported globals
64//
65
66void set_crash_behavior(LLUICtrl* ctrl, void* data);
67void set_start_location(LLUICtrl* ctrl, void* data);
68
69
70//
71// Globals
72//
73
74//
75// Static functions
76//
77static void set_render_name_fade_out(LLUICtrl* ctrl, void* data)
78{
79 LLComboBox* combo = (LLComboBox*)ctrl;
80 if (!combo) return;
81 gSavedSettings.setS32("RenderName", combo->getCurrentIndex() );
82}
83
84void set_crash_behavior(LLUICtrl* ctrl, void* data)
85{
86 gCrashSettings.setS32(CRASH_BEHAVIOR_SETTING, ((LLComboBox*) ctrl)->getCurrentIndex());
87}
88
89void set_language(LLUICtrl* ctrl, void* data)
90{
91 gSavedSettings.setString("Language", ctrl->getValue().asString());
92}
93
94void LLPanelGeneral::set_start_location(LLUICtrl* ctrl, void* data)
95{
96 LLURLSimString::setString(ctrl->getValue().asString());
97}
98
99void LLPanelGeneral::set_specific_start_location(LLLineEditor* line_editor, void* data)
100{
101 LLURLSimString::setString(line_editor->getValue().asString());
102}
103 43
104LLPanelGeneral::LLPanelGeneral() 44LLPanelGeneral::LLPanelGeneral()
105{ 45{
@@ -108,50 +48,33 @@ LLPanelGeneral::LLPanelGeneral()
108 48
109BOOL LLPanelGeneral::postBuild() 49BOOL LLPanelGeneral::postBuild()
110{ 50{
111 childSetCommitCallback("fade_out_combobox", set_render_name_fade_out); 51 LLComboBox* fade_out_combobox = getChild<LLComboBox>("fade_out_combobox");
112 52 fade_out_combobox->setCurrentByIndex(gSavedSettings.getS32("RenderName"));
113 std::string region_name_prompt = getString("region_name_prompt"); 53
114 54 childSetValue("default_start_location", gSavedSettings.getBOOL("LoginLastLocation") ? "MyLastLocation" : "MyHome");
115 55 childSetValue("show_location_checkbox", gSavedSettings.getBOOL("ShowStartLocation"));
116 // location combobox 56 childSetValue("show_all_title_checkbox", gSavedSettings.getBOOL("RenderHideGroupTitleAll"));
117 LLComboBox* combo = getChild<LLComboBox>( "location_combobox"); 57 childSetValue("language_is_public", gSavedSettings.getBOOL("LanguageIsPublic"));
118 if (combo) 58
119 { 59 childSetValue("show_my_name_checkbox", gSavedSettings.getBOOL("RenderNameHideSelf"));
120 if (!LLURLSimString::sInstance.mSimString.empty()) 60 childSetValue("small_avatar_names_checkbox", gSavedSettings.getBOOL("SmallAvatarNames"));
121 { 61 childSetValue("show_my_title_checkbox", gSavedSettings.getBOOL("RenderHideGroupTitle"));
122 combo->setTextEntry(LLURLSimString::sInstance.mSimString); 62 childSetValue("afk_timeout_spinner", gSavedSettings.getF32("AFKTimeout"));
123 } 63 childSetValue("rotate_mini_map_checkbox", gSavedSettings.getBOOL("MiniMapRotate"));
124 64 childSetValue("notify_money_change_checkbox", gSavedSettings.getBOOL("NotifyMoneyChange"));
125 BOOL login_last = gSavedSettings.getBOOL("LoginLastLocation"); 65 childSetValue("use_system_color_picker_checkbox", gSavedSettings.getBOOL("UseDefaultColorPicker"));
126 if (!LLURLSimString::sInstance.mSimString.empty()) 66 childSetValue("show_search_panel", gSavedSettings.getBOOL("ShowSearchBar"));
127 { 67
128 combo->add( LLURLSimString::sInstance.mSimString ); 68 getChild<LLColorSwatchCtrl>("effect_color_swatch")->set(gSavedSettings.getColor4("EffectColor"));
129 combo->setCurrentByIndex( 2 ); 69
130 } 70 childSetValue("ui_scale_slider", gSavedSettings.getF32("UIScaleFactor"));
131 else 71 childSetValue("ui_auto_scale", gSavedSettings.getBOOL("UIAutoScale"));
132 { 72
133 combo->add( region_name_prompt ); 73 LLComboBox* crash_behavior_combobox = getChild<LLComboBox>("crash_behavior_combobox");
134 combo->setCurrentByIndex( login_last ? 1 : 0 ); 74 crash_behavior_combobox->setCurrentByIndex(gCrashSettings.getS32(CRASH_BEHAVIOR_SETTING));
135 }
136 combo->setCommitCallback( &set_start_location );
137 combo->setTextEntryCallback( &set_specific_start_location );
138 }
139
140 // Show location on login screen
141 childSetCommitCallback("show_location_checkbox", &LLPanelGeneral::clickShowStartLocation);
142
143 combo = getChild<LLComboBox>( "crash_behavior_combobox");
144 if (combo)
145 {
146 combo->setCurrentByIndex( gCrashSettings.getS32(CRASH_BEHAVIOR_SETTING) );
147 combo->setCommitCallback( &set_crash_behavior );
148 }
149 75
150 childSetCommitCallback("language_combobox", set_language );
151 childSetValue("language_combobox", gSavedSettings.getString("Language")); 76 childSetValue("language_combobox", gSavedSettings.getString("Language"));
152 77
153 refresh();
154
155 return TRUE; 78 return TRUE;
156} 79}
157 80
@@ -160,83 +83,34 @@ LLPanelGeneral::~LLPanelGeneral()
160 // Children all cleaned up by default view destructor. 83 // Children all cleaned up by default view destructor.
161} 84}
162 85
163void LLPanelGeneral::refresh()
164{
165 LLPanel::refresh();
166 BOOL login_last = gSavedSettings.getBOOL("LoginLastLocation");
167 LLComboBox* combo = getChild<LLComboBox>( "location_combobox");
168 if (combo)
169 {
170 if (!LLURLSimString::sInstance.mSimString.empty())
171 {
172 combo->setCurrentByIndex( 2 );
173 }
174 else
175 {
176 combo->setCurrentByIndex( login_last ? 1 : 0 );
177 }
178 //save current settings in case cancel is clicked
179 mLoginLocation = combo->getValue().asString();
180 }
181
182 mOldCrashBehavior = gCrashSettings.getS32(CRASH_BEHAVIOR_SETTING);
183 combo = getChild<LLComboBox>( "crash_behavior_combobox");
184 if (combo)
185 {
186 combo->setCurrentByIndex( mOldCrashBehavior );
187 }
188
189 mRenderName = gSavedSettings.getS32("RenderName");
190 combo = getChild<LLComboBox>("fade_out_combobox");
191 if (combo)
192 {
193 combo->setCurrentByIndex( mRenderName );
194 }
195
196 mRenderNameHideSelf = gSavedSettings.getBOOL("RenderNameHideSelf");
197 mSmallAvatarNames = gSavedSettings.getBOOL("SmallAvatarNames");
198 mRenderHideGroupTitle = gSavedSettings.getBOOL("RenderHideGroupTitle");
199 mChatOnlineNotification = gSavedSettings.getBOOL("ChatOnlineNotification");
200 mAFKTimeout = gSavedSettings.getF32("AFKTimeout");
201 mMiniMapRotate = gSavedSettings.getBOOL("MiniMapRotate");
202 mNotifyMoney = gSavedSettings.getBOOL("NotifyMoneyChange");
203 mUseDefaultColor = gSavedSettings.getBOOL("UseDefaultColorPicker");
204 mEffectColor = gSavedSettings.getColor4("EffectColor");
205 mShowSearch = gSavedSettings.getBOOL("ShowSearchBar");
206
207 mUIScaleFactor = gSavedSettings.getF32("UIScaleFactor");
208 mUIAutoScale = gSavedSettings.getBOOL("UIAutoScale");
209
210 mLanguage = gSavedSettings.getString("Language");
211}
212
213void LLPanelGeneral::apply() 86void LLPanelGeneral::apply()
214{ 87{
215} 88 LLComboBox* fade_out_combobox = getChild<LLComboBox>("fade_out_combobox");
216 89 gSavedSettings.setS32("RenderName", fade_out_combobox->getCurrentIndex());
217void LLPanelGeneral::cancel()
218{
219 gSavedSettings.setS32("RenderName", mRenderName);
220 gSavedSettings.setBOOL("RenderNameHideSelf", mRenderNameHideSelf );
221 gSavedSettings.setBOOL("SmallAvatarNames", mSmallAvatarNames );
222 gSavedSettings.setBOOL("RenderHideGroupTitle", mRenderHideGroupTitle );
223 gSavedSettings.setBOOL("ChatOnlineNotification", mChatOnlineNotification );
224 gSavedSettings.setF32("AFKTimeout", mAFKTimeout );
225 gSavedSettings.setBOOL("MiniMapRotate", mMiniMapRotate );
226 gSavedSettings.setBOOL("NotifyMoneyChange", mNotifyMoney );
227 gSavedSettings.setBOOL("UseDefaultColorPicker", mUseDefaultColor );
228 gSavedSettings.setBOOL("ShowSearchBar", mShowSearch);
229 gSavedSettings.setColor4("EffectColor", mEffectColor );
230 gSavedSettings.setF32("UIScaleFactor", mUIScaleFactor);
231 gSavedSettings.setBOOL("UIAutoScale", mUIAutoScale);
232 gSavedSettings.setString("Language", mLanguage);
233 90
234 LLURLSimString::setString(mLoginLocation); 91 gSavedSettings.setBOOL("LoginLastLocation", childGetValue("default_start_location").asString() == "MyLastLocation");
235 92 gSavedSettings.setBOOL("ShowStartLocation", childGetValue("show_location_checkbox"));
236 gCrashSettings.setS32(CRASH_BEHAVIOR_SETTING, mOldCrashBehavior); 93 gSavedSettings.setBOOL("RenderHideGroupTitleAll", childGetValue("show_all_title_checkbox"));
94 gSavedSettings.setBOOL("LanguageIsPublic", childGetValue("language_is_public"));
95 gSavedSettings.setBOOL("RenderNameHideSelf", childGetValue("show_my_name_checkbox"));
96 gSavedSettings.setBOOL("SmallAvatarNames", childGetValue("small_avatar_names_checkbox"));
97 gSavedSettings.setBOOL("RenderHideGroupTitle", childGetValue("show_my_title_checkbox"));
98 gSavedSettings.setF32("AFKTimeout", childGetValue("afk_timeout_spinner").asReal());
99 gSavedSettings.setBOOL("MiniMapRotate", childGetValue("rotate_mini_map_checkbox"));
100 gSavedSettings.setBOOL("NotifyMoneyChange", childGetValue("notify_money_change_checkbox"));
101 gSavedSettings.setBOOL("UseDefaultColorPicker", childGetValue("use_system_color_picker_checkbox"));
102 gSavedSettings.setBOOL("ShowSearchBar", childGetValue("show_search_panel"));
103 gSavedSettings.setColor4("EffectColor", childGetValue("effect_color_swatch"));
104 gSavedSettings.setF32("UIScaleFactor", childGetValue("ui_scale_slider").asReal());
105 gSavedSettings.setBOOL("UIAutoScale", childGetValue("ui_auto_scale"));
106 gSavedSettings.setString("Language", childGetValue("language_combobox"));
107
108 LLURLSimString::setString(childGetValue("location_combobox"));
109
110 LLComboBox* crash_behavior_combobox = getChild<LLComboBox>("crash_behavior_combobox");
111 gCrashSettings.setS32(CRASH_BEHAVIOR_SETTING, crash_behavior_combobox->getCurrentIndex());
237} 112}
238 113
239void LLPanelGeneral::clickShowStartLocation(LLUICtrl*, void* user_data) 114void LLPanelGeneral::cancel()
240{ 115{
241 LLPanelLogin::refreshLocation( false ); // in case LLPanelLogin is visible
242} 116}
diff --git a/linden/indra/newview/llpanelgeneral.h b/linden/indra/newview/llpanelgeneral.h
index a7b526d..5492a52 100644
--- a/linden/indra/newview/llpanelgeneral.h
+++ b/linden/indra/newview/llpanelgeneral.h
@@ -35,45 +35,16 @@
35 35
36#include "llpanel.h" 36#include "llpanel.h"
37 37
38class LLCheckBoxCtrl;
39class LLRadioGroup;
40class LLColorSwatchCtrl;
41class LLSpinCtrl;
42class LLTextBox;
43class LLComboBox;
44
45class LLPanelGeneral : public LLPanel 38class LLPanelGeneral : public LLPanel
46{ 39{
47public: 40public:
48 LLPanelGeneral(); 41 LLPanelGeneral();
49 virtual ~LLPanelGeneral(); 42 /*virtual*/ ~LLPanelGeneral();
43
44 BOOL postBuild();
50 45
51 virtual BOOL postBuild();
52 void refresh();
53 void apply(); 46 void apply();
54 void cancel(); 47 void cancel();
55
56 static void clickShowStartLocation(LLUICtrl*, void* user_data);
57 static void set_start_location(LLUICtrl* ctrl, void* data);
58 static void set_specific_start_location(LLLineEditor* line_editor, void* data);
59
60protected:
61 S32 mRenderName;
62 BOOL mRenderNameHideSelf;
63 BOOL mSmallAvatarNames;
64 BOOL mRenderHideGroupTitle;
65 BOOL mChatOnlineNotification;
66 BOOL mShowSearch;
67 F32 mAFKTimeout;
68 BOOL mNotifyMoney;
69 BOOL mUseDefaultColor;
70 LLColor4 mEffectColor;
71 F32 mUIScaleFactor;
72 BOOL mUIAutoScale;
73 BOOL mMiniMapRotate;
74 S32 mOldCrashBehavior;
75 std::string mLoginLocation;
76 std::string mLanguage;
77}; 48};
78 49
79#endif 50#endif
diff --git a/linden/indra/newview/llpanelgrouplandmoney.cpp b/linden/indra/newview/llpanelgrouplandmoney.cpp
index b8c9e69..6eb44e1 100644
--- a/linden/indra/newview/llpanelgrouplandmoney.cpp
+++ b/linden/indra/newview/llpanelgrouplandmoney.cpp
@@ -705,12 +705,13 @@ BOOL LLPanelGroupLandMoney::postBuild()
705 textp = getChild<LLTextEditor>("group_money_planning_text", true); 705 textp = getChild<LLTextEditor>("group_money_planning_text", true);
706 panelp = getChild<LLPanel>("group_money_planning_tab", true); 706 panelp = getChild<LLPanel>("group_money_planning_tab", true);
707 707
708 if ( !can_view ) 708 if ( 1 ) //!can_view
709 { 709 {
710 textp->setText(mImplementationp->mCantViewAccountsText); 710 textp->setText(mImplementationp->mCantViewAccountsText);
711 } 711 }
712 else 712 else
713 { 713 {
714 //Temporally disabled for DEV-11287.
714 mImplementationp->mMoneyPlanningTabEHp = 715 mImplementationp->mMoneyPlanningTabEHp =
715 new LLGroupMoneyPlanningTabEventHandler(textp, 716 new LLGroupMoneyPlanningTabEventHandler(textp,
716 tabcp, 717 tabcp,
diff --git a/linden/indra/newview/llpanelinput.cpp b/linden/indra/newview/llpanelinput.cpp
index 7034b1c..026dd71 100644
--- a/linden/indra/newview/llpanelinput.cpp
+++ b/linden/indra/newview/llpanelinput.cpp
@@ -30,46 +30,10 @@
30 */ 30 */
31 31
32#include "llviewerprecompiledheaders.h" 32#include "llviewerprecompiledheaders.h"
33
34#include "llpanelinput.h" 33#include "llpanelinput.h"
35
36// linden library includes
37#include "llerror.h"
38#include "llrect.h"
39#include "llfontgl.h"
40#include "message.h"
41#include "lluictrlfactory.h" 34#include "lluictrlfactory.h"
42
43// project includes
44#include "llviewerwindow.h"
45#include "llcheckboxctrl.h"
46#include "llfloaterjoystick.h"
47#include "llradiogroup.h"
48#include "llresmgr.h"
49#include "llspinctrl.h"
50#include "llslider.h"
51#include "llsliderctrl.h"
52#include "lltextbox.h"
53#include "llui.h"
54#include "llappviewer.h"
55#include "llviewercontrol.h" 35#include "llviewercontrol.h"
56 36#include "llfloaterjoystick.h"
57//Ventrella
58#include "llagent.h"
59//end Ventrella
60
61
62//
63// Imported globals
64//
65
66//
67// Globals
68//
69
70//
71// Static functions
72//
73 37
74 38
75LLPanelInput::LLPanelInput() 39LLPanelInput::LLPanelInput()
@@ -79,50 +43,41 @@ LLPanelInput::LLPanelInput()
79 43
80BOOL LLPanelInput::postBuild() 44BOOL LLPanelInput::postBuild()
81{ 45{
82 childSetAction("joystic_setup_button", onClickJoystickSetup, (void*)this); 46 childSetAction("joystick_setup_button", onClickJoystickSetup, (void*)this);
83 47
84 refresh(); 48 childSetValue("mouse_sensitivity", gSavedSettings.getF32("MouseSensitivity"));
49 childSetValue("automatic_fly", gSavedSettings.getBOOL("AutomaticFly"));
50 childSetValue("invert_mouse", gSavedSettings.getBOOL("InvertMouse"));
51 childSetValue("edit_camera_movement", gSavedSettings.getBOOL("EditCameraMovement"));
52 childSetValue("appearance_camera_movement", gSavedSettings.getBOOL("AppearanceCameraMovement"));
53 childSetValue("dynamic_camera_strength", gSavedSettings.getF32("DynamicCameraStrength"));
54 childSetValue("zoom_time", gSavedSettings.getF32("ZoomTime"));
55 childSetValue("camera_position_smoothing", gSavedSettings.getF32("CameraPositionSmoothing"));
56 childSetValue("first_person_avatar_visible", gSavedSettings.getBOOL("FirstPersonAvatarVisible"));
85 57
86 return TRUE; 58 return TRUE;
87} 59}
88 60
89
90LLPanelInput::~LLPanelInput() 61LLPanelInput::~LLPanelInput()
91{ 62{
92 // Children all cleaned up by default view destructor. 63 // Children all cleaned up by default view destructor.
93} 64}
94 65
95void LLPanelInput::refresh()
96{
97 LLPanel::refresh();
98
99 mMouseSensitivityVal = gSavedSettings.getF32("MouseSensitivity");
100 mAutomaticFly =gSavedSettings.getBOOL("AutomaticFly");
101 mInvertMouse = gSavedSettings.getBOOL("InvertMouse");
102 mEditCameraMovement = gSavedSettings.getBOOL("EditCameraMovement");
103 mAppearanceCameraMovement = gSavedSettings.getBOOL("AppearanceCameraMovement");
104 mDynamicCameraStrengthVal = gSavedSettings.getF32("DynamicCameraStrength");
105 mNumpadControlVal = gSavedSettings.getS32("NumpadControl");
106
107 // First Person Visibility
108 mFirstPersonAvatarVisible = gSavedSettings.getBOOL("FirstPersonAvatarVisible");
109}
110
111void LLPanelInput::apply() 66void LLPanelInput::apply()
112{ 67{
113 68 gSavedSettings.setF32("MouseSensitivity", childGetValue("mouse_sensitivity").asReal());
69 gSavedSettings.setBOOL("AutomaticFly", childGetValue("automatic_fly"));
70 gSavedSettings.setBOOL("InvertMouse", childGetValue("invert_mouse"));
71 gSavedSettings.setBOOL("EditCameraMovement", childGetValue("edit_camera_movement"));
72 gSavedSettings.setBOOL("AppearanceCameraMovement", childGetValue("appearance_camera_movement"));
73 gSavedSettings.setF32("DynamicCameraStrength", childGetValue("dynamic_camera_strength").asReal());
74 gSavedSettings.setF32("ZoomTime", childGetValue("zoom_time").asReal());
75 gSavedSettings.setF32("CameraPositionSmoothing", childGetValue("camera_position_smoothing").asReal());
76 gSavedSettings.setBOOL("FirstPersonAvatarVisible", childGetValue("first_person_avatar_visible"));
114} 77}
115 78
116void LLPanelInput::cancel() 79void LLPanelInput::cancel()
117{ 80{
118 gSavedSettings.setF32("MouseSensitivity", mMouseSensitivityVal);
119 gSavedSettings.setBOOL("AutomaticFly", mAutomaticFly);
120 gSavedSettings.setBOOL("InvertMouse", mInvertMouse);
121 gSavedSettings.setBOOL("EditCameraMovement", mEditCameraMovement);
122 gSavedSettings.setBOOL("AppearanceCameraMovement", mAppearanceCameraMovement);
123 gSavedSettings.setF32("DynamicCameraStrength", mDynamicCameraStrengthVal);
124 gSavedSettings.setS32("NumpadControl", mNumpadControlVal);
125 gSavedSettings.setBOOL("FirstPersonAvatarVisible", mFirstPersonAvatarVisible);
126} 81}
127 82
128//static 83//static
diff --git a/linden/indra/newview/llpanelinput.h b/linden/indra/newview/llpanelinput.h
index e73e0ed..2f99f99 100644
--- a/linden/indra/newview/llpanelinput.h
+++ b/linden/indra/newview/llpanelinput.h
@@ -34,11 +34,6 @@
34 34
35#include "llpanel.h" 35#include "llpanel.h"
36 36
37class LLCheckBoxCtrl;
38class LLSlider;
39class LLSliderCtrl;
40class LLSpinCtrl;
41
42class LLPanelInput : public LLPanel 37class LLPanelInput : public LLPanel
43{ 38{
44public: 39public:
@@ -46,23 +41,11 @@ public:
46 virtual ~LLPanelInput(); 41 virtual ~LLPanelInput();
47 42
48 virtual BOOL postBuild(); 43 virtual BOOL postBuild();
49 virtual void refresh();
50 void apply(); 44 void apply();
51 void cancel(); 45 void cancel();
52 46
53private: 47private:
54 static void onClickJoystickSetup(void* user_data); 48 static void onClickJoystickSetup(void* user_data);
55
56protected:
57 F32 mMouseSensitivityVal;
58 BOOL mAutomaticFly;
59 BOOL mInvertMouse;
60 BOOL mEditCameraMovement;
61 BOOL mAppearanceCameraMovement;
62 BOOL mFirstPersonAvatarVisible;
63 F32 mDynamicCameraStrengthVal;
64 S32 mNumpadControlVal;
65
66}; 49};
67 50
68#endif 51#endif
diff --git a/linden/indra/newview/llpanellogin.cpp b/linden/indra/newview/llpanellogin.cpp
index ffee058..c1c8949 100644
--- a/linden/indra/newview/llpanellogin.cpp
+++ b/linden/indra/newview/llpanellogin.cpp
@@ -63,7 +63,6 @@
63#include "llviewernetwork.h" 63#include "llviewernetwork.h"
64#include "llviewerwindow.h" // to link into child list 64#include "llviewerwindow.h" // to link into child list
65#include "llnotify.h" 65#include "llnotify.h"
66#include "llappviewer.h" // for gHideLinks
67#include "llurlsimstring.h" 66#include "llurlsimstring.h"
68#include "lluictrlfactory.h" 67#include "lluictrlfactory.h"
69#include "llhttpclient.h" 68#include "llhttpclient.h"
@@ -202,6 +201,26 @@ void LLLoginHandler::parse(const LLSD& queryMap)
202 { 201 {
203 grid_choice = GRID_INFO_ARUNA; 202 grid_choice = GRID_INFO_ARUNA;
204 } 203 }
204 else if (queryMap["grid"].asString() == "bharati")
205 {
206 grid_choice = GRID_INFO_BHARATI;
207 }
208 else if (queryMap["grid"].asString() == "chandra")
209 {
210 grid_choice = GRID_INFO_CHANDRA;
211 }
212 else if (queryMap["grid"].asString() == "danu")
213 {
214 grid_choice = GRID_INFO_DANU;
215 }
216 else if (queryMap["grid"].asString() == "parvati")
217 {
218 grid_choice = GRID_INFO_PARVATI;
219 }
220 else if (queryMap["grid"].asString() == "skanda")
221 {
222 grid_choice = GRID_INFO_SKANDA;
223 }
205 224
206 if(grid_choice != GRID_INFO_NONE) 225 if(grid_choice != GRID_INFO_NONE)
207 { 226 {
@@ -321,6 +340,11 @@ namespace {
321 boost::intrusive_ptr< LLIamHereLogin > gResponsePtr = 0; 340 boost::intrusive_ptr< LLIamHereLogin > gResponsePtr = 0;
322}; 341};
323 342
343void set_start_location(LLUICtrl* ctrl, void* data)
344{
345 LLURLSimString::setString(ctrl->getValue().asString());
346}
347
324//--------------------------------------------------------------------------- 348//---------------------------------------------------------------------------
325// Public methods 349// Public methods
326//--------------------------------------------------------------------------- 350//---------------------------------------------------------------------------
@@ -407,7 +431,7 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect,
407 combo->setCurrentByIndex( 0 ); 431 combo->setCurrentByIndex( 0 );
408 } 432 }
409 433
410 combo->setCommitCallback( &LLPanelGeneral::set_start_location ); 434 combo->setCommitCallback( &set_start_location );
411 435
412 LLComboBox* server_choice_combo = sInstance->getChild<LLComboBox>("server_combo"); 436 LLComboBox* server_choice_combo = sInstance->getChild<LLComboBox>("server_combo");
413 server_choice_combo->setCommitCallback(onSelectServer); 437 server_choice_combo->setCommitCallback(onSelectServer);
@@ -1066,15 +1090,8 @@ void LLPanelLogin::onClickConnect(void *)
1066 } 1090 }
1067 else 1091 else
1068 { 1092 {
1069 if (gHideLinks) 1093 gViewerWindow->alertXml("MustHaveAccountToLogIn",
1070 { 1094 LLPanelLogin::newAccountAlertCallback);
1071 gViewerWindow->alertXml("MustHaveAccountToLogInNoLinks");
1072 }
1073 else
1074 {
1075 gViewerWindow->alertXml("MustHaveAccountToLogIn",
1076 LLPanelLogin::newAccountAlertCallback);
1077 }
1078 } 1095 }
1079 } 1096 }
1080} 1097}
diff --git a/linden/indra/newview/llpanelmsgs.cpp b/linden/indra/newview/llpanelmsgs.cpp
index cc3579e..4d2ff54 100644
--- a/linden/indra/newview/llpanelmsgs.cpp
+++ b/linden/indra/newview/llpanelmsgs.cpp
@@ -39,17 +39,6 @@
39#include "lluictrlfactory.h" 39#include "lluictrlfactory.h"
40#include "llfirstuse.h" 40#include "llfirstuse.h"
41 41
42class LLPopupData
43{
44public:
45 LLPopupData() : mShowNewInventory(FALSE), mAutoAcceptNewInventory(FALSE) { }
46
47 BOOL mShowNewInventory;
48 BOOL mAutoAcceptNewInventory;
49};
50
51LLPopupData sPopupData;
52
53//----------------------------------------------------------------------------- 42//-----------------------------------------------------------------------------
54LLPanelMsgs::LLPanelMsgs() : 43LLPanelMsgs::LLPanelMsgs() :
55 LLPanel(std::string("Messages Panel")), 44 LLPanel(std::string("Messages Panel")),
@@ -75,8 +64,9 @@ BOOL LLPanelMsgs::postBuild()
75 childSetAction("skip_dialogs_btn", onClickSkipDialogs, this); 64 childSetAction("skip_dialogs_btn", onClickSkipDialogs, this);
76 buildLists(); 65 buildLists();
77 66
78 sPopupData.mAutoAcceptNewInventory = gSavedSettings.getBOOL("AutoAcceptNewInventory"); 67 childSetValue("accept_new_inventory", gSavedSettings.getBOOL("AutoAcceptNewInventory"));
79 sPopupData.mShowNewInventory = gSavedSettings.getBOOL("ShowNewInventory"); 68 childSetValue("show_new_inventory", gSavedSettings.getBOOL("ShowNewInventory"));
69 childSetValue("show_in_inventory", gSavedSettings.getBOOL("ShowInInventory"));
80 70
81 return TRUE; 71 return TRUE;
82} 72}
@@ -159,13 +149,13 @@ void LLPanelMsgs::draw()
159 149
160void LLPanelMsgs::apply() 150void LLPanelMsgs::apply()
161{ 151{
152 gSavedSettings.setBOOL("AutoAcceptNewInventory", childGetValue("accept_new_inventory"));
153 gSavedSettings.setBOOL("ShowNewInventory", childGetValue("show_new_inventory"));
154 gSavedSettings.setBOOL("ShowInInventory", childGetValue("show_in_inventory"));
162} 155}
163 156
164
165void LLPanelMsgs::cancel() 157void LLPanelMsgs::cancel()
166{ 158{
167 gSavedSettings.setBOOL("ShowNewInventory", sPopupData.mShowNewInventory);
168 gSavedSettings.setBOOL("AutoAcceptNewInventory", sPopupData.mAutoAcceptNewInventory);
169} 159}
170 160
171void LLPanelMsgs::resetAllIgnored() 161void LLPanelMsgs::resetAllIgnored()
diff --git a/linden/indra/newview/llpanelnetwork.cpp b/linden/indra/newview/llpanelnetwork.cpp
index e324c3b..f13f63a 100644
--- a/linden/indra/newview/llpanelnetwork.cpp
+++ b/linden/indra/newview/llpanelnetwork.cpp
@@ -31,29 +31,14 @@
31 31
32#include "llviewerprecompiledheaders.h" 32#include "llviewerprecompiledheaders.h"
33 33
34// file include 34//file include
35#include "llpanelnetwork.h" 35#include "llpanelnetwork.h"
36 36
37// linden library includes
38#include "llerror.h"
39#include "llrect.h"
40#include "llstring.h"
41
42// project includes 37// project includes
43#include "llbutton.h" 38#include "llcheckboxctrl.h"
44#include "lldirpicker.h" 39#include "lldirpicker.h"
45#include "llui.h"
46#include "lluictrlfactory.h" 40#include "lluictrlfactory.h"
47#include "llresmgr.h"
48#include "llsliderctrl.h"
49#include "llspinctrl.h"
50#include "llcheckboxctrl.h"
51#include "lltextbox.h"
52#include "llviewerregion.h"
53#include "llviewerthrottle.h"
54#include "llworld.h"
55#include "llviewercontrol.h" 41#include "llviewercontrol.h"
56#include "lluictrlfactory.h"
57#include "llviewerwindow.h" 42#include "llviewerwindow.h"
58 43
59LLPanelNetwork::LLPanelNetwork() 44LLPanelNetwork::LLPanelNetwork()
@@ -70,12 +55,13 @@ BOOL LLPanelNetwork::postBuild()
70 childSetAction("set_cache", onClickSetCache, this); 55 childSetAction("set_cache", onClickSetCache, this);
71 childSetAction("reset_cache", onClickResetCache, this); 56 childSetAction("reset_cache", onClickResetCache, this);
72 57
73 childSetEnabled("connection_port", 58 childSetEnabled("connection_port", gSavedSettings.getBOOL("ConnectionPortEnabled"));
74 gSavedSettings.getBOOL("ConnectionPortEnabled"));
75 childSetCommitCallback("connection_port_enabled", onCommitPort, this); 59 childSetCommitCallback("connection_port_enabled", onCommitPort, this);
76 60
77 61 childSetValue("cache_size", (F32)gSavedSettings.getU32("CacheSize"));
78 refresh(); 62 childSetValue("max_bandwidth", gSavedSettings.getF32("ThrottleBandwidthKBPS"));
63 childSetValue("connection_port_enabled", gSavedSettings.getBOOL("ConnectionPortEnabled"));
64 childSetValue("connection_port", (F32)gSavedSettings.getU32("ConnectionPort"));
79 65
80 return TRUE; 66 return TRUE;
81} 67}
@@ -88,24 +74,14 @@ LLPanelNetwork::~LLPanelNetwork()
88 74
89void LLPanelNetwork::apply() 75void LLPanelNetwork::apply()
90{ 76{
91} 77 gSavedSettings.setU32("CacheSize", childGetValue("cache_size").asInteger());
92 78 gSavedSettings.setF32("ThrottleBandwidthKBPS", childGetValue("max_bandwidth").asReal());
93void LLPanelNetwork::refresh() 79 gSavedSettings.setBOOL("ConnectionPortEnabled", childGetValue("connection_port_enabled"));
94{ 80 gSavedSettings.setU32("ConnectionPort", childGetValue("connection_port").asInteger());
95 LLPanel::refresh();
96
97 mCacheSetting = gSavedSettings.getU32("CacheSize");
98 mBandwidthBPS = gSavedSettings.getF32("ThrottleBandwidthKBPS")*1024;
99 mConnectionPortEnabled = gSavedSettings.getBOOL("ConnectionPortEnabled");
100 mConnectionPort = gSavedSettings.getU32("ConnectionPort");
101} 81}
102 82
103void LLPanelNetwork::cancel() 83void LLPanelNetwork::cancel()
104{ 84{
105 gSavedSettings.setU32("CacheSize", mCacheSetting);
106 gSavedSettings.setF32("ThrottleBandwidthKBPS", mBandwidthBPS/1024);
107 gSavedSettings.setBOOL("ConnectionPortEnabled", mConnectionPortEnabled);
108 gSavedSettings.setU32("ConnectionPort", mConnectionPort);
109} 85}
110 86
111// static 87// static
diff --git a/linden/indra/newview/llpanelnetwork.h b/linden/indra/newview/llpanelnetwork.h
index 9848461..e4b11d9 100644
--- a/linden/indra/newview/llpanelnetwork.h
+++ b/linden/indra/newview/llpanelnetwork.h
@@ -33,37 +33,23 @@
33#define LL_LLPANELNETWORK_H 33#define LL_LLPANELNETWORK_H
34 34
35#include "llpanel.h" 35#include "llpanel.h"
36#include "llviewerthrottle.h"
37
38class LLSliderCtrl;
39class LLCheckBoxCtrl;
40class LLLineEditor;
41class LLTextBox;
42class LLRadioGroup;
43class LLButton;
44 36
45class LLPanelNetwork : public LLPanel 37class LLPanelNetwork : public LLPanel
46{ 38{
47public: 39public:
48 LLPanelNetwork(); 40 LLPanelNetwork();
49 virtual ~LLPanelNetwork(); 41 ~LLPanelNetwork();
42
43 BOOL postBuild();
50 44
51 virtual BOOL postBuild(); 45 void apply();
52 virtual void refresh(); 46 void cancel();
53 virtual void apply(); // Apply the changed values.
54 virtual void cancel(); // Cancel the changed values.
55 47
56private: 48private:
57 static void onClickClearCache(void*); 49 static void onClickClearCache(void*);
58 static void onClickSetCache(void*); 50 static void onClickSetCache(void*);
59 static void onClickResetCache(void*); 51 static void onClickResetCache(void*);
60 static void onCommitPort(LLUICtrl* ctrl, void*); 52 static void onCommitPort(LLUICtrl* ctrl, void*);
61
62private:
63 U32 mCacheSetting;
64 F32 mBandwidthBPS;
65 BOOL mConnectionPortEnabled;
66 U32 mConnectionPort;
67}; 53};
68 54
69#endif 55#endif
diff --git a/linden/indra/newview/llpanelobject.cpp b/linden/indra/newview/llpanelobject.cpp
index 9022c14..1f386bf 100644
--- a/linden/indra/newview/llpanelobject.cpp
+++ b/linden/indra/newview/llpanelobject.cpp
@@ -365,6 +365,17 @@ void LLPanelObject::getState( )
365 BOOL enable_scale = objectp->permMove() && objectp->permModify(); 365 BOOL enable_scale = objectp->permMove() && objectp->permModify();
366 BOOL enable_rotate = objectp->permMove() && ( (objectp->permModify() && !objectp->isAttachment()) || !gSavedSettings.getBOOL("EditLinkedParts")); 366 BOOL enable_rotate = objectp->permMove() && ( (objectp->permModify() && !objectp->isAttachment()) || !gSavedSettings.getBOOL("EditLinkedParts"));
367 367
368 S32 selected_count = LLSelectMgr::getInstance()->getSelection()->getObjectCount();
369 BOOL single_volume = (LLSelectMgr::getInstance()->selectionAllPCode( LL_PCODE_VOLUME ))
370 && (selected_count == 1);
371
372 if (LLSelectMgr::getInstance()->getSelection()->getRootObjectCount() > 1)
373 {
374 enable_move = FALSE;
375 enable_scale = FALSE;
376 enable_rotate = FALSE;
377 }
378
368 LLVector3 vec; 379 LLVector3 vec;
369 if (enable_move) 380 if (enable_move)
370 { 381 {
@@ -438,9 +449,6 @@ void LLPanelObject::getState( )
438 // BUG? Check for all objects being editable? 449 // BUG? Check for all objects being editable?
439 S32 roots_selected = LLSelectMgr::getInstance()->getSelection()->getRootObjectCount(); 450 S32 roots_selected = LLSelectMgr::getInstance()->getSelection()->getRootObjectCount();
440 BOOL editable = root_objectp->permModify(); 451 BOOL editable = root_objectp->permModify();
441 S32 selected_count = LLSelectMgr::getInstance()->getSelection()->getObjectCount();
442 BOOL single_volume = (LLSelectMgr::getInstance()->selectionAllPCode( LL_PCODE_VOLUME ))
443 && (selected_count == 1);
444 452
445 // Select Single Message 453 // Select Single Message
446 childSetVisible("select_single", FALSE); 454 childSetVisible("select_single", FALSE);
diff --git a/linden/indra/newview/llpanelweb.cpp b/linden/indra/newview/llpanelweb.cpp
index 13ed9bf..101decd 100644
--- a/linden/indra/newview/llpanelweb.cpp
+++ b/linden/indra/newview/llpanelweb.cpp
@@ -34,22 +34,12 @@
34// file include 34// file include
35#include "llpanelweb.h" 35#include "llpanelweb.h"
36 36
37// linden library includes
38#include "llerror.h"
39#include "llrect.h"
40#include "llstring.h"
41
42// project includes 37// project includes
43#include "llbutton.h"
44#include "llcheckboxctrl.h" 38#include "llcheckboxctrl.h"
45#include "lllineeditor.h" 39#include "llmediamanager.h"
46#include "llui.h"
47#include "lluictrlfactory.h" 40#include "lluictrlfactory.h"
48#include "llviewercontrol.h" 41#include "llviewercontrol.h"
49#include "lluictrlfactory.h"
50#include "llviewerwindow.h" 42#include "llviewerwindow.h"
51#include "llmediamanager.h"
52
53 43
54// helper functions for getting/freeing the web browser media 44// helper functions for getting/freeing the web browser media
55// if creating/destroying these is too slow, we'll need to create 45// if creating/destroying these is too slow, we'll need to create
@@ -97,23 +87,21 @@ LLPanelWeb::LLPanelWeb()
97 87
98BOOL LLPanelWeb::postBuild() 88BOOL LLPanelWeb::postBuild()
99{ 89{
100 childSetAction( "clear_cache", onClickClearCache, this ); 90 childSetAction("clear_cache", onClickClearCache, this);
101 childSetAction( "clear_cookies", onClickClearCookies, this );
102 childSetCommitCallback("use_external_browser", onSelectBrowser, this );
103// childSetEnabled( "connection_port", gSavedSettings.getBOOL( "CookiesEnabled" ) );
104 childSetCommitCallback( "cookies_enabled", onCommitCookies, this );
105 childSetCommitCallback( "web_proxy_editor", onCommitWebProxyAddress, this);
106 childSetCommitCallback( "web_proxy_port", onCommitWebProxyPort, this);
107
108 childSetEnabled("web_proxy_editor",
109 gSavedSettings.getBOOL("BrowserProxyEnabled"));
110 childSetEnabled("web_proxy_port",
111 gSavedSettings.getBOOL("BrowserProxyEnabled"));
112 childSetEnabled("proxy_text_label",
113 gSavedSettings.getBOOL("BrowserProxyEnabled"));
114 childSetCommitCallback("web_proxy_enabled", onCommitWebProxyEnabled, this); 91 childSetCommitCallback("web_proxy_enabled", onCommitWebProxyEnabled, this);
115 92
116 refresh(); 93 std::string value = gSavedSettings.getBOOL("UseExternalBrowser") ? "external" : "internal";
94 childSetValue("use_external_browser", value);
95
96 childSetValue("cookies_enabled", gSavedSettings.getBOOL("CookiesEnabled"));
97
98 childSetValue("web_proxy_enabled", gSavedSettings.getBOOL("BrowserProxyEnabled"));
99 childSetValue("web_proxy_editor", gSavedSettings.getString("BrowserProxyAddress"));
100 childSetValue("web_proxy_port", gSavedSettings.getS32("BrowserProxyPort"));
101
102 childSetEnabled("proxy_text_label", gSavedSettings.getBOOL("BrowserProxyEnabled"));
103 childSetEnabled("web_proxy_editor", gSavedSettings.getBOOL("BrowserProxyEnabled"));
104 childSetEnabled("web_proxy_port", gSavedSettings.getBOOL("BrowserProxyEnabled"));
117 105
118 return TRUE; 106 return TRUE;
119} 107}
@@ -127,50 +115,29 @@ LLPanelWeb::~LLPanelWeb()
127 115
128void LLPanelWeb::apply() 116void LLPanelWeb::apply()
129{ 117{
130} 118 gSavedSettings.setBOOL("CookiesEnabled", childGetValue("cookies_enabled"));
131 119 gSavedSettings.setBOOL("BrowserProxyEnabled", childGetValue("web_proxy_enabled"));
132void LLPanelWeb::refresh() 120 gSavedSettings.setString("BrowserProxyAddress", childGetValue("web_proxy_editor"));
133{ 121 gSavedSettings.setS32("BrowserProxyPort", childGetValue("web_proxy_port"));
134 LLPanel::refresh();
135 122
136 mCookiesEnabled = gSavedSettings.getBOOL("CookiesEnabled"); 123 bool value = childGetValue("use_external_browser").asString() == "external" ? true : false;
137 mWebProxyEnabled = gSavedSettings.getBOOL("BrowserProxyEnabled"); 124 gSavedSettings.setBOOL("UseExternalBrowser", value);
138 mWebProxyAddress = gSavedSettings.getString("BrowserProxyAddress");
139 mWebProxyPort = gSavedSettings.getS32("BrowserProxyPort");
140 125
141 LLLineEditor* web_proxy_editor = getChild<LLLineEditor>("web_proxy_editor");
142 if (web_proxy_editor)
143 {
144 web_proxy_editor->setText( gSavedSettings.getString("BrowserProxyAddress") );
145 }
146 mExternalBrowser = gSavedSettings.getBOOL("UseExternalBrowser");
147
148 childSetValue("use_external_browser", mExternalBrowser ? "external" : "internal");
149
150 LLMediaBase *media_source = get_web_media(); 126 LLMediaBase *media_source = get_web_media();
151 if (media_source) 127 if (media_source)
152 media_source->enableCookies(mCookiesEnabled); 128 {
153 free_web_media(media_source); 129 media_source->enableCookies(childGetValue("cookies_enabled"));
154 130
131 bool proxy_enable = childGetValue("web_proxy_enabled");
132 std::string proxy_address = childGetValue("web_proxy_editor");
133 int proxy_port = childGetValue("web_proxy_port");
134 media_source->enableProxy(proxy_enable, proxy_address, proxy_port);
135 }
136 free_web_media(media_source);
155} 137}
156 138
157void LLPanelWeb::cancel() 139void LLPanelWeb::cancel()
158{ 140{
159
160 gSavedSettings.setBOOL( "CookiesEnabled", mCookiesEnabled );
161 gSavedSettings.setBOOL( "BrowserProxyEnabled", mWebProxyEnabled );
162 gSavedSettings.setString( "BrowserProxyAddress", mWebProxyAddress );
163 gSavedSettings.setS32( "BrowserProxyPort", mWebProxyPort );
164
165 gSavedSettings.setBOOL("UseExternalBrowser", mExternalBrowser);
166 LLMediaBase *media_source = get_web_media();
167 if (media_source)
168 {
169 media_source->enableCookies(mCookiesEnabled);
170 media_source->enableProxy( mWebProxyEnabled, mWebProxyAddress, mWebProxyPort );
171 }
172 free_web_media(media_source);
173
174} 141}
175 142
176// static 143// static
@@ -192,94 +159,15 @@ void LLPanelWeb::callback_clear_browser_cache(S32 option, void* userdata)
192} 159}
193 160
194// static 161// static
195void LLPanelWeb::onClickClearCookies(void*)
196{
197 gViewerWindow->alertXml("ConfirmClearCookies", callback_clear_cookies, 0);
198}
199
200//static
201void LLPanelWeb::callback_clear_cookies(S32 option, void* userdata)
202{
203 if ( option == 0 ) // YES
204 {
205 LLMediaBase *media_source = get_web_media();
206 if (media_source)
207 media_source->clearCookies();
208 free_web_media(media_source);
209 }
210}
211
212// static
213void LLPanelWeb::onCommitCookies(LLUICtrl* ctrl, void* data)
214{
215 LLPanelWeb* self = (LLPanelWeb*)data;
216 LLCheckBoxCtrl* check = (LLCheckBoxCtrl*)ctrl;
217
218 if (!self || !check) return;
219
220 LLMediaBase *media_source = get_web_media();
221 if (media_source)
222 media_source->enableCookies(check->get());
223 free_web_media(media_source);
224}
225// static
226void LLPanelWeb::onCommitWebProxyEnabled(LLUICtrl* ctrl, void* data) 162void LLPanelWeb::onCommitWebProxyEnabled(LLUICtrl* ctrl, void* data)
227{ 163{
228 LLPanelWeb* self = (LLPanelWeb*)data; 164 LLPanelWeb* self = (LLPanelWeb*)data;
229 LLCheckBoxCtrl* check = (LLCheckBoxCtrl*)ctrl; 165 LLCheckBoxCtrl* check = (LLCheckBoxCtrl*)ctrl;
230 166
231 if (!self || !check) return; 167 if (!self || !check) return;
232 self->childSetEnabled("web_proxy_editor", 168 self->childSetEnabled("web_proxy_editor", check->get());
233 check->get()); 169 self->childSetEnabled("web_proxy_port", check->get());
234 self->childSetEnabled("web_proxy_port", 170 self->childSetEnabled("proxy_text_label", check->get());
235 check->get());
236 self->childSetEnabled("proxy_text_label",
237 check->get());
238
239 LLMediaBase *media_source = get_web_media();
240 if (media_source)
241 {
242 media_source->enableProxy( gSavedSettings.getBOOL("BrowserProxyEnabled"),
243 gSavedSettings.getString("BrowserProxyAddress"),
244 gSavedSettings.getS32("BrowserProxyPort") );
245 }
246 free_web_media(media_source);
247
248}
249
250void LLPanelWeb::onCommitWebProxyAddress(LLUICtrl *ctrl, void *userdata)
251{
252 LLLineEditor* web_proxy = (LLLineEditor*)ctrl;
253
254 if (web_proxy)
255 {
256 gSavedSettings.setString("BrowserProxyAddress", web_proxy->getText());
257 }
258 LLMediaBase *media_source = get_web_media();
259 if (media_source)
260 {
261 media_source->enableProxy( gSavedSettings.getBOOL("BrowserProxyEnabled"),
262 gSavedSettings.getString("BrowserProxyAddress"),
263 gSavedSettings.getS32("BrowserProxyPort") );
264 }
265 free_web_media(media_source);
266}
267 171
268void LLPanelWeb::onCommitWebProxyPort(LLUICtrl *ctrl, void *userdata)
269{
270 LLMediaBase *media_source = get_web_media();
271 if (media_source)
272 {
273 media_source->enableProxy( gSavedSettings.getBOOL("BrowserProxyEnabled"),
274 gSavedSettings.getString("BrowserProxyAddress"),
275 gSavedSettings.getS32("BrowserProxyPort") );
276 }
277 free_web_media(media_source);
278}
279 172
280// static
281void LLPanelWeb::onSelectBrowser(LLUICtrl* ctrl, void* data)
282{
283 // "external" or "internal"
284 gSavedSettings.setBOOL("UseExternalBrowser", ctrl->getValue().asString() == "external");
285} 173}
diff --git a/linden/indra/newview/llpanelweb.h b/linden/indra/newview/llpanelweb.h
index 34d7b3d..fc8cf28 100644
--- a/linden/indra/newview/llpanelweb.h
+++ b/linden/indra/newview/llpanelweb.h
@@ -33,39 +33,22 @@
33#define LL_LLPANELWEB_H 33#define LL_LLPANELWEB_H
34 34
35#include "llpanel.h" 35#include "llpanel.h"
36#include "llviewerthrottle.h"
37
38class LLCheckBoxCtrl;
39class LLButton;
40 36
41class LLPanelWeb : public LLPanel 37class LLPanelWeb : public LLPanel
42{ 38{
43public: 39public:
44 LLPanelWeb(); 40 LLPanelWeb();
45 virtual ~LLPanelWeb(); 41 ~LLPanelWeb();
42
43 BOOL postBuild();
46 44
47 virtual BOOL postBuild(); 45 void apply();
48 virtual void refresh(); 46 void cancel();
49 virtual void apply(); // Apply the changed values.
50 virtual void cancel(); // Cancel the changed values.
51 47
52private: 48private:
53 static void onClickClearCache(void*); 49 static void onClickClearCache(void* data);
54 static void onClickClearCookies(void*);
55 static void callback_clear_browser_cache(S32 option, void* userdata); 50 static void callback_clear_browser_cache(S32 option, void* userdata);
56 static void callback_clear_cookies(S32 option, void* userdata);
57 static void onCommitCookies(LLUICtrl* ctrl, void* data);
58 static void onCommitWebProxyEnabled(LLUICtrl* ctrl, void* data); 51 static void onCommitWebProxyEnabled(LLUICtrl* ctrl, void* data);
59 static void onCommitWebProxyAddress(LLUICtrl *ctrl, void *userdata);
60 static void onCommitWebProxyPort(LLUICtrl *ctrl, void *userdata);
61 static void onSelectBrowser(LLUICtrl* ctrl, void* data);
62
63private:
64 BOOL mCookiesEnabled;
65 BOOL mWebProxyEnabled;
66 std::string mWebProxyAddress;
67 S32 mWebProxyPort;
68 BOOL mExternalBrowser;
69}; 52};
70 53
71#endif 54#endif
diff --git a/linden/indra/newview/llpolymesh.h b/linden/indra/newview/llpolymesh.h
index 7f4f087..671bf03 100644
--- a/linden/indra/newview/llpolymesh.h
+++ b/linden/indra/newview/llpolymesh.h
@@ -150,7 +150,7 @@ public:
150class LLJointRenderData 150class LLJointRenderData
151{ 151{
152public: 152public:
153 LLJointRenderData(const LLMatrix4* world_matrix, LLSkinJoint* skin_joint) : mWorldMatrix(world_matrix), mSkinJoint(skin_joint){} 153 LLJointRenderData(const LLMatrix4* world_matrix, LLSkinJoint* skin_joint) : mWorldMatrix(world_matrix), mSkinJoint(skin_joint) {}
154 ~LLJointRenderData(){} 154 ~LLJointRenderData(){}
155 155
156 const LLMatrix4* mWorldMatrix; 156 const LLMatrix4* mWorldMatrix;
diff --git a/linden/indra/newview/llprefschat.cpp b/linden/indra/newview/llprefschat.cpp
index e045e61..139a365 100644
--- a/linden/indra/newview/llprefschat.cpp
+++ b/linden/indra/newview/llprefschat.cpp
@@ -36,6 +36,8 @@
36#include "lltexteditor.h" 36#include "lltexteditor.h"
37#include "llviewercontrol.h" 37#include "llviewercontrol.h"
38#include "lluictrlfactory.h" 38#include "lluictrlfactory.h"
39#include "llcolorswatch.h"
40#include "llradiogroup.h"
39#include "llstylemap.h" 41#include "llstylemap.h"
40 42
41class LLPrefsChatImpl : public LLPanel 43class LLPrefsChatImpl : public LLPanel
@@ -43,8 +45,6 @@ class LLPrefsChatImpl : public LLPanel
43public: 45public:
44 LLPrefsChatImpl(); 46 LLPrefsChatImpl();
45 /*virtual*/ ~LLPrefsChatImpl(){}; 47 /*virtual*/ ~LLPrefsChatImpl(){};
46
47 virtual void refresh();
48 48
49 void apply(); 49 void apply();
50 void cancel(); 50 void cancel();
@@ -79,12 +79,30 @@ LLPrefsChatImpl::LLPrefsChatImpl()
79{ 79{
80 LLUICtrlFactory::getInstance()->buildPanel(this, "panel_preferences_chat.xml"); 80 LLUICtrlFactory::getInstance()->buildPanel(this, "panel_preferences_chat.xml");
81 81
82 refresh(); 82 getChild<LLRadioGroup>("chat_font_size")->setSelectedIndex(gSavedSettings.getS32("ChatFontSize"));
83} 83 childSetValue("fade_chat_time", gSavedSettings.getF32("ChatPersistTime"));
84 childSetValue("max_chat_count", gSavedSettings.getS32("ConsoleMaxLines"));
85
86 getChild<LLColorSwatchCtrl>("system")->set(gSavedSettings.getColor4("SystemChatColor"));
87 getChild<LLColorSwatchCtrl>("user")->set(gSavedSettings.getColor4("UserChatColor"));
88 getChild<LLColorSwatchCtrl>("agent")->set(gSavedSettings.getColor4("AgentChatColor"));
89 getChild<LLColorSwatchCtrl>("im")->set(gSavedSettings.getColor4("IMChatColor"));
90 getChild<LLColorSwatchCtrl>("script_error")->set(gSavedSettings.getColor4("ScriptErrorColor"));
91 getChild<LLColorSwatchCtrl>("objects")->set(gSavedSettings.getColor4("ObjectChatColor"));
92 getChild<LLColorSwatchCtrl>("owner")->set(gSavedSettings.getColor4("llOwnerSayChatColor"));
93 getChild<LLColorSwatchCtrl>("background")->set(gSavedSettings.getColor4("BackgroundChatColor"));
94 getChild<LLColorSwatchCtrl>("links")->set(gSavedSettings.getColor4("HTMLLinkColor"));
95
96 childSetValue("arrow_keys_move_avatar_check", gSavedSettings.getBOOL("ArrowKeysMoveAvatar"));
97 childSetValue("show_timestamps_check", gSavedSettings.getBOOL("ChatShowTimestamps"));
98 childSetValue("script_errors_as_chat", gSavedSettings.getBOOL("ScriptErrorsAsChat"));
84 99
85void LLPrefsChatImpl::refresh() 100 childSetValue("bubble_text_chat", gSavedSettings.getBOOL("UseChatBubbles"));
86{ 101 childSetValue("chat_full_width_check", gSavedSettings.getBOOL("ChatFullWidth"));
87 LLPanel::refresh(); 102 childSetValue("close_chat_on_return_check", gSavedSettings.getBOOL("CloseChatOnReturn"));
103 childSetValue("play_typing_animation", gSavedSettings.getBOOL("PlayTypingAnim"));
104 childSetValue("console_opacity", gSavedSettings.getF32("ConsoleBackgroundOpacity"));
105 childSetValue("bubble_chat_opacity", gSavedSettings.getF32("ChatBubbleOpacity"));
88 106
89 //set values 107 //set values
90 mChatSize = gSavedSettings.getS32("ChatFontSize"); 108 mChatSize = gSavedSettings.getS32("ChatFontSize");
@@ -137,7 +155,32 @@ void LLPrefsChatImpl::cancel()
137 155
138void LLPrefsChatImpl::apply() 156void LLPrefsChatImpl::apply()
139{ 157{
140 158 gSavedSettings.setS32("ChatFontSize", getChild<LLRadioGroup>("chat_font_size")->getSelectedIndex());
159 gSavedSettings.setF32("ChatPersistTime", childGetValue("fade_chat_time").asReal());
160 gSavedSettings.setS32("ConsoleMaxLines", childGetValue("max_chat_count"));
161
162 gSavedSettings.setColor4("SystemChatColor", childGetValue("system"));
163 gSavedSettings.setColor4("UserChatColor", childGetValue("user"));
164 gSavedSettings.setColor4("AgentChatColor", childGetValue("agent"));
165 gSavedSettings.setColor4("IMChatColor", childGetValue("im"));
166 gSavedSettings.setColor4("ScriptErrorColor", childGetValue("script_error"));
167 gSavedSettings.setColor4("ObjectChatColor", childGetValue("objects"));
168 gSavedSettings.setColor4("llOwnerSayChatColor", childGetValue("owner"));
169 gSavedSettings.setColor4("BackgroundChatColor", childGetValue("background"));
170
171 gSavedSettings.setColor4("HTMLLinkColor", childGetValue("links"));
172 LLTextEditor::setLinkColor(childGetValue("links"));
173
174 gSavedSettings.setBOOL("ArrowKeysMoveAvatar", childGetValue("arrow_keys_move_avatar_check"));
175 gSavedSettings.setBOOL("ChatShowTimestamps", childGetValue("show_timestamps_check"));
176 gSavedSettings.setBOOL("ScriptErrorsAsChat", childGetValue("script_errors_as_chat"));
177 gSavedSettings.setBOOL("UseChatBubbles", childGetValue("bubble_text_chat"));
178 gSavedSettings.setBOOL("ChatFullWidth", childGetValue("chat_full_width_check"));
179 gSavedSettings.setBOOL("CloseChatOnReturn", childGetValue("close_chat_on_return_check"));
180 gSavedSettings.setBOOL("PlayTypingAnim", childGetValue("play_typing_animation"));
181
182 gSavedSettings.setF32("ConsoleBackgroundOpacity", childGetValue("console_opacity").asReal());
183 gSavedSettings.setF32("ChatBubbleOpacity", childGetValue("bubble_chat_opacity").asReal());
141} 184}
142 185
143//--------------------------------------------------------------------------- 186//---------------------------------------------------------------------------
@@ -154,7 +197,6 @@ LLPrefsChat::~LLPrefsChat()
154void LLPrefsChat::apply() 197void LLPrefsChat::apply()
155{ 198{
156 impl.apply(); 199 impl.apply();
157 LLTextEditor::setLinkColor( gSavedSettings.getColor4("HTMLLinkColor") );
158 LLStyleMap::instance().update(); 200 LLStyleMap::instance().update();
159} 201}
160 202
diff --git a/linden/indra/newview/llprefsim.cpp b/linden/indra/newview/llprefsim.cpp
index 5333df8..6673a4e 100644
--- a/linden/indra/newview/llprefsim.cpp
+++ b/linden/indra/newview/llprefsim.cpp
@@ -55,34 +55,18 @@ public:
55 /*virtual*/ BOOL postBuild(); 55 /*virtual*/ BOOL postBuild();
56 56
57 void apply(); 57 void apply();
58 void refresh();
59 void cancel(); 58 void cancel();
60 void setPersonalInfo( 59 void setPersonalInfo(const std::string& visibility, bool im_via_email, const std::string& email);
61 const std::string& visibility,
62 bool im_via_email,
63 const std::string& email);
64 void enableHistory(); 60 void enableHistory();
61
65 static void onClickLogPath(void* user_data); 62 static void onClickLogPath(void* user_data);
66 static void onCommitLogging( LLUICtrl* ctrl, void* user_data); 63 static void onCommitLogging(LLUICtrl* ctrl, void* user_data);
67 64
68protected: 65protected:
69 BOOL mIMInChatHistory; 66
70 BOOL mLogInstantMessages;
71 BOOL mLogChat;
72 BOOL mLogShowHistory;
73 BOOL mShowTimestamps;
74 BOOL mIMLogTimestamp;
75 BOOL mLogChatTimestamp;
76 BOOL mLogIMChat;
77 BOOL mLogTimestampDate;
78
79 std::string mIMBusyResponse;
80 std::string mLogPath;
81
82 bool mGotPersonalInfo; 67 bool mGotPersonalInfo;
83 bool mOriginalIMViaEmail; 68 bool mOriginalIMViaEmail;
84 69
85 // online status info
86 bool mOriginalHideOnlineStatus; 70 bool mOriginalHideOnlineStatus;
87 std::string mDirectoryVisibility; 71 std::string mDirectoryVisibility;
88}; 72};
@@ -94,34 +78,8 @@ LLPrefsIMImpl::LLPrefsIMImpl()
94 LLUICtrlFactory::getInstance()->buildPanel(this, "panel_preferences_im.xml"); 78 LLUICtrlFactory::getInstance()->buildPanel(this, "panel_preferences_im.xml");
95} 79}
96 80
97void LLPrefsIMImpl::refresh()
98{
99 mIMInChatHistory = gSavedSettings.getBOOL("IMInChatHistory");
100 mShowTimestamps = gSavedSettings.getBOOL("IMShowTimestamps");
101 mIMBusyResponse = gSavedPerAccountSettings.getString("BusyModeResponse");
102 mLogPath = gSavedPerAccountSettings.getString("InstantMessageLogPath");
103 mLogInstantMessages= gSavedPerAccountSettings.getBOOL("LogInstantMessages");
104 mLogChat = gSavedPerAccountSettings.getBOOL("LogChat");
105 mLogShowHistory = gSavedPerAccountSettings.getBOOL("LogShowHistory");
106 mIMLogTimestamp = gSavedPerAccountSettings.getBOOL("IMLogTimestamp");
107 mLogChatTimestamp = gSavedPerAccountSettings.getBOOL("LogChatTimestamp");
108 mLogIMChat = gSavedPerAccountSettings.getBOOL("LogChatIM");
109 mLogTimestampDate = gSavedPerAccountSettings.getBOOL("LogTimestampDate");
110}
111
112void LLPrefsIMImpl::cancel() 81void LLPrefsIMImpl::cancel()
113{ 82{
114 gSavedSettings.setBOOL("IMInChatHistory", mIMInChatHistory);
115 gSavedSettings.setBOOL("IMShowTimestamps", mShowTimestamps);
116 gSavedPerAccountSettings.setString("BusyModeResponse", mIMBusyResponse);
117 gSavedPerAccountSettings.setString("InstantMessageLogPath",mLogPath);
118 gSavedPerAccountSettings.setBOOL("LogInstantMessages",mLogInstantMessages);
119 gSavedPerAccountSettings.setBOOL("LogChat",mLogChat);
120 gSavedPerAccountSettings.setBOOL("LogShowHistory",mLogShowHistory);
121 gSavedPerAccountSettings.setBOOL("IMLogTimestamp",mIMLogTimestamp);
122 gSavedPerAccountSettings.setBOOL("LogChatTimestamp",mLogChatTimestamp);
123 gSavedPerAccountSettings.setBOOL("LogChatIM",mLogIMChat);
124 gSavedPerAccountSettings.setBOOL("LogTimestampDate",mLogTimestampDate);
125} 83}
126 84
127BOOL LLPrefsIMImpl::postBuild() 85BOOL LLPrefsIMImpl::postBuild()
@@ -133,12 +91,13 @@ BOOL LLPrefsIMImpl::postBuild()
133 return FALSE; 91 return FALSE;
134 } 92 }
135 93
136 mGotPersonalInfo = false;
137 mOriginalIMViaEmail = false;
138 mOriginalHideOnlineStatus = true;
139 childSetLabelArg("send_im_to_email", "[EMAIL]", getString("log_in_to_change")); 94 childSetLabelArg("send_im_to_email", "[EMAIL]", getString("log_in_to_change"));
140 95
141 // Don't enable this until we get personal data 96 // Don't enable this until we get personal data
97 childDisable("include_im_in_chat_history");
98 childDisable("show_timestamps_check");
99 childDisable("friends_online_notify_checkbox");
100
142 childDisable("online_visibility"); 101 childDisable("online_visibility");
143 childDisable("send_im_to_email"); 102 childDisable("send_im_to_email");
144 childDisable("log_instant_messages"); 103 childDisable("log_instant_messages");
@@ -152,17 +111,20 @@ BOOL LLPrefsIMImpl::postBuild()
152 childDisable("log_date_timestamp"); 111 childDisable("log_date_timestamp");
153 112
154 childSetText("busy_response", getString("log_in_to_change")); 113 childSetText("busy_response", getString("log_in_to_change"));
155 114
156 refresh(); 115 childSetValue("include_im_in_chat_history", gSavedSettings.getBOOL("IMInChatHistory"));
157 116 childSetValue("show_timestamps_check", gSavedSettings.getBOOL("IMShowTimestamps"));
158 childSetText("log_path_string", mLogPath); 117 childSetValue("friends_online_notify_checkbox", gSavedSettings.getBOOL("ChatOnlineNotification"));
159 childSetValue("log_instant_messages", mLogInstantMessages); 118
160 childSetValue("log_chat", mLogChat); 119 childSetText("log_path_string", gSavedPerAccountSettings.getString("InstantMessageLogPath"));
161 childSetValue("log_show_history", mLogShowHistory); 120 childSetValue("log_instant_messages", gSavedPerAccountSettings.getBOOL("LogInstantMessages"));
162 childSetValue("log_instant_messages_timestamp", mIMLogTimestamp); 121 childSetValue("log_chat", gSavedPerAccountSettings.getBOOL("LogChat"));
163 childSetValue("log_chat_timestamp", mLogChatTimestamp); 122 childSetValue("log_show_history", gSavedPerAccountSettings.getBOOL("LogShowHistory"));
164 childSetValue("log_chat_IM", mLogIMChat); 123 childSetValue("log_instant_messages_timestamp", gSavedPerAccountSettings.getBOOL("IMLogTimestamp"));
165 childSetValue("log_date_timestamp",mLogTimestampDate); 124 childSetValue("log_chat_timestamp", gSavedPerAccountSettings.getBOOL("LogChatTimestamp"));
125 childSetValue("log_chat_IM", gSavedPerAccountSettings.getBOOL("LogChatIM"));
126 childSetValue("log_date_timestamp", gSavedPerAccountSettings.getBOOL("LogTimestampDate"));
127
166 childSetAction("log_path_button", onClickLogPath, this); 128 childSetAction("log_path_button", onClickLogPath, this);
167 childSetCommitCallback("log_chat",onCommitLogging,this); 129 childSetCommitCallback("log_chat",onCommitLogging,this);
168 childSetCommitCallback("log_instant_messages",onCommitLogging,this); 130 childSetCommitCallback("log_instant_messages",onCommitLogging,this);
@@ -199,6 +161,10 @@ void LLPrefsIMImpl::apply()
199 161
200 gSavedPerAccountSettings.setString("BusyModeResponse", std::string(wstring_to_utf8str(busy_response))); 162 gSavedPerAccountSettings.setString("BusyModeResponse", std::string(wstring_to_utf8str(busy_response)));
201 163
164 gSavedSettings.setBOOL("IMInChatHistory", childGetValue("include_im_in_chat_history").asBoolean());
165 gSavedSettings.setBOOL("IMShowTimestamps", childGetValue("show_timestamps_check").asBoolean());
166 gSavedSettings.setBOOL("ChatOnlineNotification", childGetValue("friends_online_notify_checkbox").asBoolean());
167
202 gSavedPerAccountSettings.setString("InstantMessageLogPath", childGetText("log_path_string")); 168 gSavedPerAccountSettings.setString("InstantMessageLogPath", childGetText("log_path_string"));
203 gSavedPerAccountSettings.setBOOL("LogInstantMessages",childGetValue("log_instant_messages").asBoolean()); 169 gSavedPerAccountSettings.setBOOL("LogInstantMessages",childGetValue("log_instant_messages").asBoolean());
204 gSavedPerAccountSettings.setBOOL("LogChat",childGetValue("log_chat").asBoolean()); 170 gSavedPerAccountSettings.setBOOL("LogChat",childGetValue("log_chat").asBoolean());
@@ -245,14 +211,12 @@ void LLPrefsIMImpl::apply()
245 } 211 }
246} 212}
247 213
248void LLPrefsIMImpl::setPersonalInfo( 214void LLPrefsIMImpl::setPersonalInfo(const std::string& visibility, bool im_via_email, const std::string& email)
249 const std::string& visibility,
250 bool im_via_email,
251 const std::string& email)
252{ 215{
253 mGotPersonalInfo = true; 216 mGotPersonalInfo = true;
254 mOriginalIMViaEmail = im_via_email; 217 mOriginalIMViaEmail = im_via_email;
255 mDirectoryVisibility = visibility; 218 mDirectoryVisibility = visibility;
219
256 if(visibility == VISIBILITY_DEFAULT) 220 if(visibility == VISIBILITY_DEFAULT)
257 { 221 {
258 mOriginalHideOnlineStatus = false; 222 mOriginalHideOnlineStatus = false;
@@ -267,6 +231,11 @@ void LLPrefsIMImpl::setPersonalInfo(
267 { 231 {
268 mOriginalHideOnlineStatus = true; 232 mOriginalHideOnlineStatus = true;
269 } 233 }
234
235 childEnable("include_im_in_chat_history");
236 childEnable("show_timestamps_check");
237 childEnable("friends_online_notify_checkbox");
238
270 childSetValue("online_visibility", mOriginalHideOnlineStatus); 239 childSetValue("online_visibility", mOriginalHideOnlineStatus);
271 childSetLabelArg("online_visibility", "[DIR_VIS]", mDirectoryVisibility); 240 childSetLabelArg("online_visibility", "[DIR_VIS]", mDirectoryVisibility);
272 childEnable("send_im_to_email"); 241 childEnable("send_im_to_email");
@@ -308,7 +277,7 @@ void LLPrefsIMImpl::onClickLogPath(void* user_data)
308 std::string proposed_name(self->childGetText("log_path_string")); 277 std::string proposed_name(self->childGetText("log_path_string"));
309 278
310 LLDirPicker& picker = LLDirPicker::instance(); 279 LLDirPicker& picker = LLDirPicker::instance();
311 if (! picker.getDir(&proposed_name ) ) 280 if (!picker.getDir(&proposed_name ) )
312 { 281 {
313 return; //Canceled! 282 return; //Canceled!
314 } 283 }
diff --git a/linden/indra/newview/llprefsvoice.cpp b/linden/indra/newview/llprefsvoice.cpp
index 6661f08..1421c3e 100644
--- a/linden/indra/newview/llprefsvoice.cpp
+++ b/linden/indra/newview/llprefsvoice.cpp
@@ -35,245 +35,164 @@
35#include "llprefsvoice.h" 35#include "llprefsvoice.h"
36 36
37#include "llcheckboxctrl.h" 37#include "llcheckboxctrl.h"
38#include "llcombobox.h" 38#include "llfloatervoicedevicesettings.h"
39 39#include "llfocusmgr.h"
40#include "llkeyboard.h"
41#include "llmodaldialog.h"
40#include "llviewercontrol.h" 42#include "llviewercontrol.h"
41#include "lluictrlfactory.h" 43#include "lluictrlfactory.h"
42 44
43#include "llmodaldialog.h"
44#include "llkeyboard.h"
45#include "llfocusmgr.h"
46#include "llfloatervoicedevicesettings.h"
47
48#include "llappviewer.h"
49
50#include "llvoiceclient.h"
51 45
52class LLVoiceHotkeySelectDialog : public LLModalDialog 46class LLVoiceSetKeyDialog : public LLModalDialog
53{ 47{
54private:
55 LLPrefsVoiceLogic *mParent;
56 LLFloater *mOldFrontmost;
57
58public: 48public:
59 LLVoiceHotkeySelectDialog( LLPrefsVoiceLogic *parent ) 49 LLVoiceSetKeyDialog(LLPrefsVoice* parent);
60 : LLModalDialog( LLStringUtil::null, 240, 100 ), 50 ~LLVoiceSetKeyDialog();
61 mParent( parent )
62 {
63 mOldFrontmost = gFloaterView->getFrontmost();
64
65 LLUICtrlFactory::getInstance()->buildFloater(this, "floater_select_key.xml");
66
67 childSetAction("Cancel", LLVoiceHotkeySelectDialog::onCancel, this );
68 childSetFocus("Cancel");
69 }
70
71 /*virtual*/ void setFocus( BOOL b )
72 {
73 LLFloater::setFocus(b);
74
75 // This forces keyboard processing to happen at the raw key level instead of going through handleUnicodeChar.
76 if (b)
77 {
78 gFocusMgr.setKeystrokesOnly(TRUE);
79 }
80 }
81
82 static void onCancel( void* userdata );
83 51
84 BOOL handleKeyHere(KEY key, MASK mask); 52 BOOL handleKeyHere(KEY key, MASK mask);
85 53
86}; 54 static void onCancel(void* user_data);
87
88LLPrefsVoiceLogic::LLPrefsVoiceLogic(LLPanel* panelp) :
89 mPanel(panelp)
90{
91 init();
92}
93
94void LLPrefsVoiceLogic::init()
95{
96 mEnableVoice = gSavedSettings.getBOOL("EnableVoiceChat");
97
98 mVoiceCallsFriendsOnly = gSavedSettings.getBOOL("VoiceCallsFriendsOnly");
99 mModifier = gSavedSettings.getString("PushToTalkButton");
100 mPushToTalkToggle = gSavedSettings.getBOOL("PushToTalkToggle");
101 mEarLocation = gSavedSettings.getS32("VoiceEarLocation");
102
103 LLUICtrl* ear_location = mPanel->getChild<LLUICtrl>("ear_location");
104 mCtrlEarLocation = ear_location->getSelectionInterface();
105 if (mCtrlEarLocation)
106 {
107 mCtrlEarLocation->selectByValue(LLSD(gSavedSettings.getS32("VoiceEarLocation")));
108 }
109 mPanel->childSetCommitCallback("ear_location", onEarLocationCommit, this );
110
111 mPanel->childSetAction("set_voice_hotkey_button", onClickSetKey, this);
112 mPanel->childSetAction("set_voice_middlemouse_button", onClickSetMiddleMouse, this);
113
114 refresh();
115 mEatNextSetKeyClick = FALSE;
116}
117 55
118void LLPrefsVoiceLogic::refresh() 56private:
119{ 57 LLPrefsVoice* mParent;
120 BOOL voiceDisabled = gSavedSettings.getBOOL("CmdLineDisableVoice"); 58};
121 mPanel->childSetVisible("voice_unavailable", voiceDisabled);
122 mPanel->childSetVisible("enable_voice_check", !voiceDisabled);
123 mPanel->childSetEnabled("enable_voice_check", !voiceDisabled);
124
125 bool enable = !voiceDisabled && gSavedSettings.getBOOL("EnableVoiceChat");
126
127 mPanel->childSetEnabled("friends_only_check", enable);
128 mPanel->childSetEnabled("push_to_talk_check", enable);
129 mPanel->childSetEnabled("push_to_talk_label", enable);
130 mPanel->childSetEnabled("voice_call_friends_only_check", enable);
131 mPanel->childSetEnabled("push_to_talk_toggle_check", enable);
132 mPanel->childSetEnabled("ear_location", enable);
133 mPanel->childSetEnabled("set_voice_hotkey_button", enable);
134 mPanel->childSetEnabled("set_voice_middlemouse_button", enable);
135}
136 59
137void LLPrefsVoiceLogic::cancel() 60LLVoiceSetKeyDialog::LLVoiceSetKeyDialog(LLPrefsVoice* parent)
61 : LLModalDialog(LLStringUtil::null, 240, 100), mParent(parent)
138{ 62{
139 gSavedSettings.setBOOL("EnableVoiceChat", mEnableVoice); 63 LLUICtrlFactory::getInstance()->buildFloater(this, "floater_select_key.xml");
140 gSavedSettings.setBOOL("VoiceCallsFriendsOnly", mVoiceCallsFriendsOnly); 64 childSetAction("Cancel", onCancel, this);
141 gSavedSettings.setString("PushToTalkButton", mModifier); 65 childSetFocus("Cancel");
142 gSavedSettings.setBOOL("PushToTalkToggle", mPushToTalkToggle );
143 gSavedSettings.setS32("VoiceEarLocation", mEarLocation);
144}
145 66
146void LLPrefsVoiceLogic::apply() 67 gFocusMgr.setKeystrokesOnly(TRUE);
147{
148} 68}
149 69
150//static 70LLVoiceSetKeyDialog::~LLVoiceSetKeyDialog()
151void LLPrefsVoiceLogic::onEarLocationCommit(LLUICtrl* ctrl, void* user_data)
152{ 71{
153 LLCtrlSelectionInterface* interfacep = ctrl->getSelectionInterface();
154 if (interfacep)
155 {
156 gSavedSettings.setS32("VoiceEarLocation", interfacep->getSelectedValue().asInteger());
157 }
158} 72}
159 73
160// static 74BOOL LLVoiceSetKeyDialog::handleKeyHere(KEY key, MASK mask)
161void LLPrefsVoiceLogic::onClickSetKey(void* user_data)
162{ 75{
163 LLPrefsVoiceLogic* self=(LLPrefsVoiceLogic*)user_data; 76 BOOL result = TRUE;
164 if(self->mEatNextSetKeyClick) 77
78 if(key == 'Q' && mask == MASK_CONTROL)
165 { 79 {
166 self->mEatNextSetKeyClick = false; 80 result = FALSE;
167 } 81 }
168 else 82 else
169 { 83 {
170 LLVoiceHotkeySelectDialog* dialog = new LLVoiceHotkeySelectDialog( self ); 84 mParent->setKey(key);
171 dialog->startModal();
172 // dialog will delete itself
173 } 85 }
174}
175 86
87 close();
88 return result;
89}
176 90
177// static 91//static
178void LLPrefsVoiceLogic::onClickSetMiddleMouse(void* user_data) 92void LLVoiceSetKeyDialog::onCancel(void* user_data)
179{ 93{
180// LLPrefsVoiceLogic* self=(LLPrefsVoiceLogic*)user_data; 94 LLVoiceSetKeyDialog* self = (LLVoiceSetKeyDialog*)user_data;
181 95 self->close();
182 gSavedSettings.setString("PushToTalkButton", "MiddleMouse");
183} 96}
184 97
185void LLPrefsVoiceLogic::setKey(KEY key, MASK mask) 98//--------------------------------------------------------------------
186{ 99//LLPrefsVoice
187 std::string keystring = LLKeyboard::stringFromKey(key); 100LLPrefsVoice::LLPrefsVoice()
188 gSavedSettings.setString("PushToTalkButton", keystring); 101 : LLPanel(std::string("Voice Chat Panel"))
189 102{
190 if(key == ' ') 103 LLUICtrlFactory::getInstance()->buildPanel(this, "panel_preferences_voice.xml");
191 {
192 // This will cause the select dialog to immediately reopen.
193 // Eat the next click event.
194 mEatNextSetKeyClick = TRUE;
195 }
196} 104}
197 105
198void LLVoiceHotkeySelectDialog::onCancel( void* userdata ) 106LLPrefsVoice::~LLPrefsVoice()
199{ 107{
200 LLVoiceHotkeySelectDialog* self = (LLVoiceHotkeySelectDialog*) userdata;
201 self->close(); // destroys this object
202 self->mOldFrontmost->setFrontmost(TRUE);
203} 108}
204 109
205BOOL LLVoiceHotkeySelectDialog::handleKeyHere(KEY key, MASK mask) 110BOOL LLPrefsVoice::postBuild()
206{ 111{
207 BOOL result = TRUE; 112 childSetCommitCallback("enable_voice_check", onCommitEnableVoiceChat, this);
208 113 childSetAction("set_voice_hotkey_button", onClickSetKey, this);
209 // Suck up all keystokes except CTRL-Q. 114 childSetAction("set_voice_middlemouse_button", onClickSetMiddleMouse, this);
210 BOOL is_quit = ('Q' == key) && (MASK_CONTROL == mask); 115 childSetAction("device_settings_btn", onClickVoiceDeviceSettings, NULL);
211 if(is_quit)
212 {
213 result = FALSE;
214 }
215 else
216 {
217 mParent->setKey(key, mask);
218 }
219 116
220 close(); // destroys this object 117 BOOL voice_disabled = gSavedSettings.getBOOL("CmdLineDisableVoice");
221 mOldFrontmost->setFrontmost(TRUE); 118 childSetVisible("voice_unavailable", voice_disabled);
222 119 childSetVisible("enable_voice_check", !voice_disabled);
223 return result; 120 childSetEnabled("enable_voice_check", !voice_disabled);
224}
225 121
226//--------------------------------------------------------------------------- 122 bool enable = !voice_disabled && gSavedSettings.getBOOL("EnableVoiceChat");
123 childSetValue("enable_voice_check", enable);
124 onCommitEnableVoiceChat(getChild<LLCheckBoxCtrl>("enable_voice_check"), this);
227 125
126 childSetValue("modifier_combo", gSavedSettings.getString("PushToTalkButton"));
127 childSetValue("voice_call_friends_only_check", gSavedSettings.getBOOL("VoiceCallsFriendsOnly"));
128 childSetValue("push_to_talk_toggle_check", gSavedSettings.getBOOL("PushToTalkToggle"));
129 childSetValue("ear_location", gSavedSettings.getS32("VoiceEarLocation"));
228 130
229LLPrefsVoice::LLPrefsVoice() 131 return TRUE;
230 : LLPanel(std::string("Voice Chat Panel")) 132}
231{
232 LLUICtrlFactory::getInstance()->buildPanel(this, "panel_preferences_voice.xml");
233 mLogic = new LLPrefsVoiceLogic(this);
234 childSetAction("device_settings_btn", onClickVoiceDeviceSettingsBtn, this);
235 133
236 // create floater immediately and keep it hidden 134void LLPrefsVoice::apply()
237 // since it stores preference state for audio devices 135{
238 mVoiceDeviceSettings = LLFloaterVoiceDeviceSettings::getInstance(); 136 gSavedSettings.setBOOL("EnableVoiceChat", childGetValue("enable_voice_check"));
137
138 gSavedSettings.setString("PushToTalkButton", childGetValue("modifier_combo"));
139 gSavedSettings.setBOOL("VoiceCallsFriendsOnly", childGetValue("voice_call_friends_only_check"));
140 gSavedSettings.setBOOL("PushToTalkToggle", childGetValue("push_to_talk_toggle_check"));
141 gSavedSettings.setS32("VoiceEarLocation", childGetValue("ear_location"));
239} 142}
240 143
241LLPrefsVoice::~LLPrefsVoice() 144void LLPrefsVoice::cancel()
145{
146}
147
148void LLPrefsVoice::setKey(KEY key)
242{ 149{
243 delete mLogic; 150 childSetValue("modifier_combo", LLKeyboard::stringFromKey(key));
244} 151}
245 152
246void LLPrefsVoice::draw() 153//static
154void LLPrefsVoice::onCommitEnableVoiceChat(LLUICtrl* ctrl, void* user_data)
247{ 155{
248 bool enable = !gSavedSettings.getBOOL("CmdLineDisableVoice") 156 LLPrefsVoice* self = (LLPrefsVoice*)user_data;
249 && gSavedSettings.getBOOL("EnableVoiceChat"); 157 LLCheckBoxCtrl* enable_voice_chat = (LLCheckBoxCtrl*)ctrl;
250 childSetEnabled("device_settings_btn", enable); 158
159 bool enable = enable_voice_chat->getValue();
251 160
252 mLogic->refresh(); 161 self->childSetEnabled("modifier_combo", enable);
253 mVoiceDeviceSettings->refresh(); 162 self->childSetEnabled("friends_only_check", enable);
254 LLPanel::draw(); 163 self->childSetEnabled("push_to_talk_label", enable);
164 self->childSetEnabled("voice_call_friends_only_check", enable);
165 self->childSetEnabled("push_to_talk_toggle_check", enable);
166 self->childSetEnabled("ear_location", enable);
167 self->childSetEnabled("set_voice_hotkey_button", enable);
168 self->childSetEnabled("set_voice_middlemouse_button", enable);
169 self->childSetEnabled("device_settings_btn", enable);
255} 170}
256 171
257void LLPrefsVoice::apply() 172//static
173void LLPrefsVoice::onClickSetKey(void* user_data)
258{ 174{
259 mLogic->apply(); 175 LLPrefsVoice* self = (LLPrefsVoice*)user_data;
260 mVoiceDeviceSettings->apply(); 176 LLVoiceSetKeyDialog* dialog = new LLVoiceSetKeyDialog(self);
177 dialog->startModal();
261} 178}
262 179
263void LLPrefsVoice::cancel() 180//static
181void LLPrefsVoice::onClickSetMiddleMouse(void* user_data)
264{ 182{
265 mLogic->cancel(); 183 LLPrefsVoice* self = (LLPrefsVoice*)user_data;
266 mVoiceDeviceSettings->cancel(); 184 self->childSetValue("modifier_combo", "MiddleMouse");
267} 185}
268 186
269//static 187//static
270void LLPrefsVoice::onClickVoiceDeviceSettingsBtn(void* user_data) 188void LLPrefsVoice::onClickVoiceDeviceSettings(void* user_data)
271{ 189{
272 LLPrefsVoice* prefs = (LLPrefsVoice*)user_data; 190 LLPrefsVoice* voice_prefs = (LLPrefsVoice*)user_data;
273 prefs->mVoiceDeviceSettings->open(); 191 LLFloaterVoiceDeviceSettings* device_settings_floater = LLFloaterVoiceDeviceSettings::showInstance();
274 LLFloater* parent_floater = gFloaterView->getParentFloater(prefs); 192 LLFloater* parent_floater = gFloaterView->getParentFloater(voice_prefs);
275 if (parent_floater) 193 if(parent_floater)
276 { 194 {
277 parent_floater->addDependentFloater(prefs->mVoiceDeviceSettings, FALSE); 195 parent_floater->addDependentFloater(device_settings_floater, FALSE);
278 } 196 }
279} 197}
198
diff --git a/linden/indra/newview/llprefsvoice.h b/linden/indra/newview/llprefsvoice.h
index 836108d..a7cba73 100644
--- a/linden/indra/newview/llprefsvoice.h
+++ b/linden/indra/newview/llprefsvoice.h
@@ -34,55 +34,24 @@
34 34
35#include "llpanel.h" 35#include "llpanel.h"
36 36
37class LLFloaterVoiceDeviceSettings;
38
39class LLPrefsVoiceLogic
40{
41public:
42 LLPrefsVoiceLogic(LLPanel* panelp);
43 virtual ~LLPrefsVoiceLogic(){};
44
45 virtual void init();
46
47 void apply();
48 void cancel();
49 void refresh();
50
51 void setKey(KEY key, MASK mask);
52
53protected:
54
55 static void onClickSetKey(void* user_data);
56 static void onClickSetMiddleMouse(void* user_data);
57 static void onEarLocationCommit(LLUICtrl* ctrl, void* user_data);
58
59 BOOL mEnableVoice;
60 BOOL mVoiceCallsFriendsOnly;
61 std::string mModifier;
62 BOOL mPushToTalkToggle;
63 S32 mEarLocation;
64 LLCtrlSelectionInterface *mCtrlEarLocation;
65
66 BOOL mEatNextSetKeyClick;
67
68 LLPanel* mPanel;
69};
70
71class LLPrefsVoice : public LLPanel 37class LLPrefsVoice : public LLPanel
72{ 38{
73public: 39public:
74 LLPrefsVoice(); 40 LLPrefsVoice();
75 ~LLPrefsVoice(); 41 ~LLPrefsVoice();
76 42
77 /*virtual*/ void draw(); 43 BOOL postBuild();
44
78 void apply(); 45 void apply();
79 void cancel(); 46 void cancel();
80 47
81protected: 48 void setKey(KEY key);
82 static void onClickVoiceDeviceSettingsBtn(void* user_data);
83 49
84 LLPrefsVoiceLogic* mLogic; 50private:
85 LLFloaterVoiceDeviceSettings* mVoiceDeviceSettings; 51 static void onCommitEnableVoiceChat(LLUICtrl* ctrl, void* user_data);
52 static void onClickSetKey(void* user_data);
53 static void onClickSetMiddleMouse(void* user_data);
54 static void onClickVoiceDeviceSettings(void* user_data);
86}; 55};
87 56
88#endif // LLPREFSVOICE_H 57#endif // LLPREFSVOICE_H
diff --git a/linden/indra/newview/llpreviewscript.cpp b/linden/indra/newview/llpreviewscript.cpp
index 52fca27..2b87128 100644
--- a/linden/indra/newview/llpreviewscript.cpp
+++ b/linden/indra/newview/llpreviewscript.cpp
@@ -101,7 +101,7 @@ const std::string HELLO_LSL =
101 " llSay(0, \"Touched.\");\n" 101 " llSay(0, \"Touched.\");\n"
102 " }\n" 102 " }\n"
103 "}\n"; 103 "}\n";
104const std::string HELP_LSL = "lsl_guide.html"; 104const std::string HELP_LSL_URL = "http://wiki.secondlife.com/wiki/LSL_Portal";
105 105
106const std::string DEFAULT_SCRIPT_NAME = "New Script"; // *TODO:Translate? 106const std::string DEFAULT_SCRIPT_NAME = "New Script"; // *TODO:Translate?
107const std::string DEFAULT_SCRIPT_DESC = "(No Description)"; // *TODO:Translate? 107const std::string DEFAULT_SCRIPT_DESC = "(No Description)"; // *TODO:Translate?
@@ -294,7 +294,7 @@ LLScriptEdCore::LLScriptEdCore(
294 const std::string& name, 294 const std::string& name,
295 const LLRect& rect, 295 const LLRect& rect,
296 const std::string& sample, 296 const std::string& sample,
297 const std::string& help, 297 const std::string& help_url,
298 const LLHandle<LLFloater>& floater_handle, 298 const LLHandle<LLFloater>& floater_handle,
299 void (*load_callback)(void*), 299 void (*load_callback)(void*),
300 void (*save_callback)(void*, BOOL), 300 void (*save_callback)(void*, BOOL),
@@ -304,7 +304,7 @@ LLScriptEdCore::LLScriptEdCore(
304 : 304 :
305 LLPanel( std::string("name"), rect ), 305 LLPanel( std::string("name"), rect ),
306 mSampleText(sample), 306 mSampleText(sample),
307 mHelpFile ( help ), 307 mHelpURL(help_url),
308 mEditor( NULL ), 308 mEditor( NULL ),
309 mLoadCallback( load_callback ), 309 mLoadCallback( load_callback ),
310 mSaveCallback( save_callback ), 310 mSaveCallback( save_callback ),
@@ -547,7 +547,6 @@ void LLScriptEdCore::setHelpPage(const std::string& help_string)
547 if (!history_combo) return; 547 if (!history_combo) return;
548 548
549 LLUIString url_string = gSavedSettings.getString("LSLHelpURL"); 549 LLUIString url_string = gSavedSettings.getString("LSLHelpURL");
550 url_string.setArg("[APP_DIRECTORY]", gDirUtilp->getWorkingDir());
551 url_string.setArg("[LSL_STRING]", help_string); 550 url_string.setArg("[LSL_STRING]", help_string);
552 551
553 addHelpItemToHistory(help_string); 552 addHelpItemToHistory(help_string);
@@ -556,6 +555,7 @@ void LLScriptEdCore::setHelpPage(const std::string& help_string)
556 555
557} 556}
558 557
558
559void LLScriptEdCore::addHelpItemToHistory(const std::string& help_string) 559void LLScriptEdCore::addHelpItemToHistory(const std::string& help_string)
560{ 560{
561 if (help_string.empty()) return; 561 if (help_string.empty()) return;
@@ -647,7 +647,7 @@ void LLScriptEdCore::onHelpWebDialog(S32 option, void* userdata)
647 switch(option) 647 switch(option)
648 { 648 {
649 case 0: 649 case 0:
650 load_url_local_file(corep->mHelpFile); 650 LLWeb::loadURL(corep->mHelpURL);
651 break; 651 break;
652 default: 652 default:
653 break; 653 break;
@@ -773,7 +773,6 @@ void LLScriptEdCore::onHelpComboCommit(LLUICtrl* ctrl, void* userdata)
773 773
774 LLWebBrowserCtrl* web_browser = live_help_floater->getChild<LLWebBrowserCtrl>("lsl_guide_html"); 774 LLWebBrowserCtrl* web_browser = live_help_floater->getChild<LLWebBrowserCtrl>("lsl_guide_html");
775 LLUIString url_string = gSavedSettings.getString("LSLHelpURL"); 775 LLUIString url_string = gSavedSettings.getString("LSLHelpURL");
776 url_string.setArg("[APP_DIRECTORY]", gDirUtilp->getWorkingDir());
777 url_string.setArg("[LSL_STRING]", help_string); 776 url_string.setArg("[LSL_STRING]", help_string);
778 web_browser->navigateTo(url_string); 777 web_browser->navigateTo(url_string);
779 } 778 }
@@ -1072,7 +1071,7 @@ void* LLPreviewLSL::createScriptEdPanel(void* userdata)
1072 self->mScriptEd = new LLScriptEdCore("script panel", 1071 self->mScriptEd = new LLScriptEdCore("script panel",
1073 LLRect(), 1072 LLRect(),
1074 HELLO_LSL, 1073 HELLO_LSL,
1075 HELP_LSL, 1074 HELP_LSL_URL,
1076 self->getHandle(), 1075 self->getHandle(),
1077 LLPreviewLSL::onLoad, 1076 LLPreviewLSL::onLoad,
1078 LLPreviewLSL::onSave, 1077 LLPreviewLSL::onSave,
@@ -1590,7 +1589,7 @@ void* LLLiveLSLEditor::createScriptEdPanel(void* userdata)
1590 self->mScriptEd = new LLScriptEdCore("script ed panel", 1589 self->mScriptEd = new LLScriptEdCore("script ed panel",
1591 LLRect(), 1590 LLRect(),
1592 HELLO_LSL, 1591 HELLO_LSL,
1593 HELP_LSL, 1592 HELP_LSL_URL,
1594 self->getHandle(), 1593 self->getHandle(),
1595 &LLLiveLSLEditor::onLoad, 1594 &LLLiveLSLEditor::onLoad,
1596 &LLLiveLSLEditor::onSave, 1595 &LLLiveLSLEditor::onSave,
diff --git a/linden/indra/newview/llpreviewscript.h b/linden/indra/newview/llpreviewscript.h
index 977b9ce..58de041 100644
--- a/linden/indra/newview/llpreviewscript.h
+++ b/linden/indra/newview/llpreviewscript.h
@@ -65,7 +65,7 @@ public:
65 const std::string& name, 65 const std::string& name,
66 const LLRect& rect, 66 const LLRect& rect,
67 const std::string& sample, 67 const std::string& sample,
68 const std::string& help, 68 const std::string& help_url,
69 const LLHandle<LLFloater>& floater_handle, 69 const LLHandle<LLFloater>& floater_handle,
70 void (*load_callback)(void* userdata), 70 void (*load_callback)(void* userdata),
71 void (*save_callback)(void* userdata, BOOL close_after_save), 71 void (*save_callback)(void* userdata, BOOL close_after_save),
@@ -132,7 +132,7 @@ protected:
132 132
133private: 133private:
134 std::string mSampleText; 134 std::string mSampleText;
135 std::string mHelpFile; 135 std::string mHelpURL;
136 LLTextEditor* mEditor; 136 LLTextEditor* mEditor;
137 void (*mLoadCallback)(void* userdata); 137 void (*mLoadCallback)(void* userdata);
138 void (*mSaveCallback)(void* userdata, BOOL close_after_save); 138 void (*mSaveCallback)(void* userdata, BOOL close_after_save);
diff --git a/linden/indra/newview/llpreviewsound.cpp b/linden/indra/newview/llpreviewsound.cpp
index 9ba6fd5..6b79bfb 100644
--- a/linden/indra/newview/llpreviewsound.cpp
+++ b/linden/indra/newview/llpreviewsound.cpp
@@ -106,7 +106,6 @@ void LLPreviewSound::auditionSound( void *userdata )
106 if(item && gAudiop) 106 if(item && gAudiop)
107 { 107 {
108 LLVector3d lpos_global = gAgent.getPositionGlobal(); 108 LLVector3d lpos_global = gAgent.getPositionGlobal();
109 F32 volume = gSavedSettings.getBOOL("MuteSounds") ? 0.f : SOUND_GAIN * gSavedSettings.getF32("AudioLevelSFX"); 109 gAudiop->triggerSound(item->getAssetUUID(), gAgent.getID(), SOUND_GAIN, LLAudioEngine::AUDIO_TYPE_UI, lpos_global);
110 gAudiop->triggerSound(item->getAssetUUID(), gAgent.getID(), volume, lpos_global);
111 } 110 }
112} 111}
diff --git a/linden/indra/newview/llpreviewtexture.cpp b/linden/indra/newview/llpreviewtexture.cpp
index 0a204dc..47a2cbc 100644
--- a/linden/indra/newview/llpreviewtexture.cpp
+++ b/linden/indra/newview/llpreviewtexture.cpp
@@ -200,7 +200,7 @@ void LLPreviewTexture::draw()
200 if (!isMinimized()) 200 if (!isMinimized())
201 { 201 {
202 LLGLSUIDefault gls_ui; 202 LLGLSUIDefault gls_ui;
203 LLGLSNoTexture gls_notex; 203 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
204 204
205 const LLRect& border = mClientRect; 205 const LLRect& border = mClientRect;
206 LLRect interior = mClientRect; 206 LLRect interior = mClientRect;
@@ -299,20 +299,20 @@ BOOL LLPreviewTexture::canSaveAs() const
299// virtual 299// virtual
300void LLPreviewTexture::saveAs() 300void LLPreviewTexture::saveAs()
301{ 301{
302 if( !mLoadingFullImage ) 302 if( mLoadingFullImage ) return;
303
304 LLFilePicker& file_picker = LLFilePicker::instance();
305 if( !file_picker.getSaveFile( LLFilePicker::FFSAVE_TGA, LLDir::getScrubbedFileName(getItem()->getName())) )
303 { 306 {
304 LLFilePicker& file_picker = LLFilePicker::instance(); 307 // User canceled or we failed to acquire save file.
305 if( !file_picker.getSaveFile( LLFilePicker::FFSAVE_TGA ) ) 308 return;
306 {
307 // User canceled save.
308 return;
309 }
310 mSaveFileName = file_picker.getFirstFile();
311 mLoadingFullImage = TRUE;
312 getWindow()->incBusyCount();
313 mImage->setLoadedCallback( LLPreviewTexture::onFileLoadedForSave,
314 0, TRUE, FALSE, new LLUUID( mItemUUID ) );
315 } 309 }
310 // remember the user-approved/edited file name.
311 mSaveFileName = file_picker.getFirstFile();
312 mLoadingFullImage = TRUE;
313 getWindow()->incBusyCount();
314 mImage->setLoadedCallback( LLPreviewTexture::onFileLoadedForSave,
315 0, TRUE, FALSE, new LLUUID( mItemUUID ) );
316} 316}
317 317
318 318
diff --git a/linden/indra/newview/llprogressview.cpp b/linden/indra/newview/llprogressview.cpp
index 123c583..4354254 100644
--- a/linden/indra/newview/llprogressview.cpp
+++ b/linden/indra/newview/llprogressview.cpp
@@ -208,7 +208,7 @@ void LLProgressView::draw()
208 if (gStartImageGL) 208 if (gStartImageGL)
209 { 209 {
210 LLGLSUIDefault gls_ui; 210 LLGLSUIDefault gls_ui;
211 LLViewerImage::bindTexture(gStartImageGL); 211 gGL.getTexUnit(0)->bind(gStartImageGL);
212 gGL.color4f(1.f, 1.f, 1.f, mFadeTimer.getStarted() ? clamp_rescale(mFadeTimer.getElapsedTimeF32(), 0.f, FADE_IN_TIME, 1.f, 0.f) : 1.f); 212 gGL.color4f(1.f, 1.f, 1.f, mFadeTimer.getStarted() ? clamp_rescale(mFadeTimer.getElapsedTimeF32(), 0.f, FADE_IN_TIME, 1.f, 0.f) : 1.f);
213 F32 image_aspect = (F32)gStartImageWidth / (F32)gStartImageHeight; 213 F32 image_aspect = (F32)gStartImageWidth / (F32)gStartImageHeight;
214 F32 view_aspect = (F32)width / (F32)height; 214 F32 view_aspect = (F32)width / (F32)height;
@@ -224,11 +224,11 @@ void LLProgressView::draw()
224 glScalef(1.f, view_aspect / image_aspect, 1.f); 224 glScalef(1.f, view_aspect / image_aspect, 1.f);
225 } 225 }
226 gl_rect_2d_simple_tex( getRect().getWidth(), getRect().getHeight() ); 226 gl_rect_2d_simple_tex( getRect().getWidth(), getRect().getHeight() );
227 gStartImageGL->unbindTexture(0, GL_TEXTURE_2D); 227 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
228 } 228 }
229 else 229 else
230 { 230 {
231 LLGLSNoTexture gls_no_texture; 231 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
232 gGL.color4f(0.f, 0.f, 0.f, 1.f); 232 gGL.color4f(0.f, 0.f, 0.f, 1.f);
233 gl_rect_2d(getRect()); 233 gl_rect_2d(getRect());
234 } 234 }
diff --git a/linden/indra/newview/llselectmgr.cpp b/linden/indra/newview/llselectmgr.cpp
index 2e4983c..e3b57b8 100644
--- a/linden/indra/newview/llselectmgr.cpp
+++ b/linden/indra/newview/llselectmgr.cpp
@@ -4828,7 +4828,7 @@ void LLSelectMgr::renderSilhouettes(BOOL for_hud)
4828 return; 4828 return;
4829 } 4829 }
4830 4830
4831 LLViewerImage::bindTexture(mSilhouetteImagep); 4831 gGL.getTexUnit(0)->bind(mSilhouetteImagep.get());
4832 LLGLSPipelineSelection gls_select; 4832 LLGLSPipelineSelection gls_select;
4833 gGL.setAlphaRejectSettings(LLRender::CF_GREATER, 0.f); 4833 gGL.setAlphaRejectSettings(LLRender::CF_GREATER, 0.f);
4834 LLGLEnable blend(GL_BLEND); 4834 LLGLEnable blend(GL_BLEND);
@@ -4936,7 +4936,7 @@ void LLSelectMgr::renderSilhouettes(BOOL for_hud)
4936 stop_glerror(); 4936 stop_glerror();
4937 } 4937 }
4938 4938
4939 mSilhouetteImagep->unbindTexture(0, GL_TEXTURE_2D); 4939 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
4940 gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT); 4940 gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT);
4941} 4941}
4942 4942
@@ -5313,7 +5313,7 @@ void LLSelectNode::renderOneSilhouette(const LLColor4 &color)
5313 5313
5314 LLGLDepthTest gls_depth(GL_TRUE, GL_FALSE, GL_GEQUAL); 5314 LLGLDepthTest gls_depth(GL_TRUE, GL_FALSE, GL_GEQUAL);
5315 gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT); 5315 gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT);
5316 gGL.begin(LLVertexBuffer::LINES); 5316 gGL.begin(LLRender::LINES);
5317 { 5317 {
5318 S32 i = 0; 5318 S32 i = 0;
5319 for (S32 seg_num = 0; seg_num < (S32)mSilhouetteSegments.size(); seg_num++) 5319 for (S32 seg_num = 0; seg_num < (S32)mSilhouetteSegments.size(); seg_num++)
@@ -5334,7 +5334,7 @@ void LLSelectNode::renderOneSilhouette(const LLColor4 &color)
5334 5334
5335 gGL.flush(); 5335 gGL.flush();
5336 gGL.setSceneBlendType(LLRender::BT_ALPHA); 5336 gGL.setSceneBlendType(LLRender::BT_ALPHA);
5337 gGL.begin(LLVertexBuffer::TRIANGLES); 5337 gGL.begin(LLRender::TRIANGLES);
5338 { 5338 {
5339 S32 i = 0; 5339 S32 i = 0;
5340 for (S32 seg_num = 0; seg_num < (S32)mSilhouetteSegments.size(); seg_num++) 5340 for (S32 seg_num = 0; seg_num < (S32)mSilhouetteSegments.size(); seg_num++)
@@ -5940,9 +5940,9 @@ S32 LLObjectSelection::getRootObjectCount()
5940 return count; 5940 return count;
5941} 5941}
5942 5942
5943bool LLObjectSelection::applyToObjects(LLSelectedObjectFunctor* func, bool firstonly) 5943bool LLObjectSelection::applyToObjects(LLSelectedObjectFunctor* func)
5944{ 5944{
5945 bool result = firstonly ? false : true; 5945 bool result = true;
5946 for (iterator iter = begin(); iter != end(); ) 5946 for (iterator iter = begin(); iter != end(); )
5947 { 5947 {
5948 iterator nextiter = iter++; 5948 iterator nextiter = iter++;
@@ -5950,10 +5950,7 @@ bool LLObjectSelection::applyToObjects(LLSelectedObjectFunctor* func, bool first
5950 if (!object) 5950 if (!object)
5951 continue; 5951 continue;
5952 bool r = func->apply(object); 5952 bool r = func->apply(object);
5953 if (firstonly && r) 5953 result = result && r;
5954 return true;
5955 else
5956 result = result && r;
5957 } 5954 }
5958 return result; 5955 return result;
5959} 5956}
diff --git a/linden/indra/newview/llselectmgr.h b/linden/indra/newview/llselectmgr.h
index d85ba04..a59b1c8 100644
--- a/linden/indra/newview/llselectmgr.h
+++ b/linden/indra/newview/llselectmgr.h
@@ -316,7 +316,7 @@ public:
316 // If firstonly is FALSE, returns the AND of all apply() calls. 316 // If firstonly is FALSE, returns the AND of all apply() calls.
317 // Else returns TRUE immediately if any apply() call succeeds (i.e. OR with early exit) 317 // Else returns TRUE immediately if any apply() call succeeds (i.e. OR with early exit)
318 bool applyToRootObjects(LLSelectedObjectFunctor* func, bool firstonly = false); 318 bool applyToRootObjects(LLSelectedObjectFunctor* func, bool firstonly = false);
319 bool applyToObjects(LLSelectedObjectFunctor* func, bool firstonly = false); 319 bool applyToObjects(LLSelectedObjectFunctor* func);
320 bool applyToTEs(LLSelectedTEFunctor* func, bool firstonly = false); 320 bool applyToTEs(LLSelectedTEFunctor* func, bool firstonly = false);
321 bool applyToRootNodes(LLSelectedNodeFunctor* func, bool firstonly = false); 321 bool applyToRootNodes(LLSelectedNodeFunctor* func, bool firstonly = false);
322 bool applyToNodes(LLSelectedNodeFunctor* func, bool firstonly = false); 322 bool applyToNodes(LLSelectedNodeFunctor* func, bool firstonly = false);
diff --git a/linden/indra/newview/llsky.cpp b/linden/indra/newview/llsky.cpp
index 8265d9d..18029a7 100644
--- a/linden/indra/newview/llsky.cpp
+++ b/linden/indra/newview/llsky.cpp
@@ -284,16 +284,16 @@ LLColor4U LLSky::getFadeColor() const
284 284
285void LLSky::init(const LLVector3 &sun_direction) 285void LLSky::init(const LLVector3 &sun_direction)
286{ 286{
287 mVOWLSkyp = static_cast<LLVOWLSky*>(gObjectList.createObjectViewer(LLViewerObject::LL_VO_WL_SKY, gAgent.getRegion())); 287 mVOWLSkyp = static_cast<LLVOWLSky*>(gObjectList.createObjectViewer(LLViewerObject::LL_VO_WL_SKY, NULL));
288 mVOWLSkyp->initSunDirection(sun_direction, LLVector3::zero); 288 mVOWLSkyp->initSunDirection(sun_direction, LLVector3::zero);
289 gPipeline.addObject(mVOWLSkyp.get()); 289 gPipeline.addObject(mVOWLSkyp.get());
290 290
291 mVOSkyp = (LLVOSky *)gObjectList.createObjectViewer(LLViewerObject::LL_VO_SKY, gAgent.getRegion()); 291 mVOSkyp = (LLVOSky *)gObjectList.createObjectViewer(LLViewerObject::LL_VO_SKY, NULL);
292 mVOSkyp->initSunDirection(sun_direction, LLVector3()); 292 mVOSkyp->initSunDirection(sun_direction, LLVector3());
293 gPipeline.addObject((LLViewerObject *)mVOSkyp); 293 gPipeline.addObject((LLViewerObject *)mVOSkyp);
294 294
295 295
296 mVOGroundp = (LLVOGround*)gObjectList.createObjectViewer(LLViewerObject::LL_VO_GROUND, gAgent.getRegion()); 296 mVOGroundp = (LLVOGround*)gObjectList.createObjectViewer(LLViewerObject::LL_VO_GROUND, NULL);
297 LLVOGround *groundp = mVOGroundp; 297 LLVOGround *groundp = mVOGroundp;
298 gPipeline.addObject((LLViewerObject *)groundp); 298 gPipeline.addObject((LLViewerObject *)groundp);
299 299
diff --git a/linden/indra/newview/llspatialpartition.cpp b/linden/indra/newview/llspatialpartition.cpp
index 9f5d115..6247686 100644
--- a/linden/indra/newview/llspatialpartition.cpp
+++ b/linden/indra/newview/llspatialpartition.cpp
@@ -46,6 +46,7 @@
46#include "pipeline.h" 46#include "pipeline.h"
47#include "llrender.h" 47#include "llrender.h"
48#include "lloctree.h" 48#include "lloctree.h"
49#include "llvoavatar.h"
49 50
50const F32 SG_OCCLUSION_FUDGE = 1.01f; 51const F32 SG_OCCLUSION_FUDGE = 1.01f;
51#define SG_DISCARD_TOLERANCE 0.01f 52#define SG_DISCARD_TOLERANCE 0.01f
@@ -1624,7 +1625,7 @@ public:
1624 1625
1625void drawBox(const LLVector3& c, const LLVector3& r) 1626void drawBox(const LLVector3& c, const LLVector3& r)
1626{ 1627{
1627 gGL.begin(LLVertexBuffer::TRIANGLE_STRIP); 1628 gGL.begin(LLRender::TRIANGLE_STRIP);
1628 //left front 1629 //left front
1629 gGL.vertex3fv((c+r.scaledVec(LLVector3(-1,1,-1))).mV); 1630 gGL.vertex3fv((c+r.scaledVec(LLVector3(-1,1,-1))).mV);
1630 gGL.vertex3fv((c+r.scaledVec(LLVector3(-1,1,1))).mV); 1631 gGL.vertex3fv((c+r.scaledVec(LLVector3(-1,1,1))).mV);
@@ -1643,7 +1644,7 @@ void drawBox(const LLVector3& c, const LLVector3& r)
1643 gGL.end(); 1644 gGL.end();
1644 1645
1645 //bottom 1646 //bottom
1646 gGL.begin(LLVertexBuffer::TRIANGLE_STRIP); 1647 gGL.begin(LLRender::TRIANGLE_STRIP);
1647 gGL.vertex3fv((c+r.scaledVec(LLVector3(1,1,-1))).mV); 1648 gGL.vertex3fv((c+r.scaledVec(LLVector3(1,1,-1))).mV);
1648 gGL.vertex3fv((c+r.scaledVec(LLVector3(1,-1,-1))).mV); 1649 gGL.vertex3fv((c+r.scaledVec(LLVector3(1,-1,-1))).mV);
1649 gGL.vertex3fv((c+r.scaledVec(LLVector3(-1,1,-1))).mV); 1650 gGL.vertex3fv((c+r.scaledVec(LLVector3(-1,1,-1))).mV);
@@ -1651,7 +1652,7 @@ void drawBox(const LLVector3& c, const LLVector3& r)
1651 gGL.end(); 1652 gGL.end();
1652 1653
1653 //top 1654 //top
1654 gGL.begin(LLVertexBuffer::TRIANGLE_STRIP); 1655 gGL.begin(LLRender::TRIANGLE_STRIP);
1655 gGL.vertex3fv((c+r.scaledVec(LLVector3(1,1,1))).mV); 1656 gGL.vertex3fv((c+r.scaledVec(LLVector3(1,1,1))).mV);
1656 gGL.vertex3fv((c+r.scaledVec(LLVector3(-1,1,1))).mV); 1657 gGL.vertex3fv((c+r.scaledVec(LLVector3(-1,1,1))).mV);
1657 gGL.vertex3fv((c+r.scaledVec(LLVector3(1,-1,1))).mV); 1658 gGL.vertex3fv((c+r.scaledVec(LLVector3(1,-1,1))).mV);
@@ -1666,7 +1667,7 @@ void drawBoxOutline(const LLVector3& pos, const LLVector3& size)
1666 LLVector3 v3 = size.scaledVec(LLVector3(-1,-1,1)); 1667 LLVector3 v3 = size.scaledVec(LLVector3(-1,-1,1));
1667 LLVector3 v4 = size.scaledVec(LLVector3( 1,-1,1)); 1668 LLVector3 v4 = size.scaledVec(LLVector3( 1,-1,1));
1668 1669
1669 gGL.begin(LLVertexBuffer::LINES); 1670 gGL.begin(LLRender::LINES);
1670 1671
1671 //top 1672 //top
1672 gGL.vertex3fv((pos+v1).mV); 1673 gGL.vertex3fv((pos+v1).mV);
@@ -1814,7 +1815,7 @@ void pushVerts(LLDrawInfo* params, U32 mask)
1814{ 1815{
1815 LLRenderPass::applyModelMatrix(*params); 1816 LLRenderPass::applyModelMatrix(*params);
1816 params->mVertexBuffer->setBuffer(mask); 1817 params->mVertexBuffer->setBuffer(mask);
1817 params->mVertexBuffer->drawRange(params->mParticle ? LLVertexBuffer::POINTS : LLVertexBuffer::TRIANGLES, 1818 params->mVertexBuffer->drawRange(params->mParticle ? LLRender::POINTS : LLRender::TRIANGLES,
1818 params->mStart, params->mEnd, params->mCount, params->mOffset); 1819 params->mStart, params->mEnd, params->mCount, params->mOffset);
1819} 1820}
1820 1821
@@ -1843,7 +1844,7 @@ void pushVerts(LLFace* face, U32 mask)
1843 U16 end = start + face->getGeomCount()-1; 1844 U16 end = start + face->getGeomCount()-1;
1844 U32 count = face->getIndicesCount(); 1845 U32 count = face->getIndicesCount();
1845 U16 offset = face->getIndicesStart(); 1846 U16 offset = face->getIndicesStart();
1846 buffer->drawRange(LLVertexBuffer::TRIANGLES, start, end, count, offset); 1847 buffer->drawRange(LLRender::TRIANGLES, start, end, count, offset);
1847 } 1848 }
1848 1849
1849} 1850}
@@ -1853,7 +1854,7 @@ void pushBufferVerts(LLVertexBuffer* buffer, U32 mask)
1853 if (buffer) 1854 if (buffer)
1854 { 1855 {
1855 buffer->setBuffer(mask); 1856 buffer->setBuffer(mask);
1856 buffer->drawRange(LLVertexBuffer::TRIANGLES, 0, buffer->getRequestedVerts()-1, buffer->getRequestedIndices(), 0); 1857 buffer->drawRange(LLRender::TRIANGLES, 0, buffer->getRequestedVerts()-1, buffer->getRequestedIndices(), 0);
1857 } 1858 }
1858} 1859}
1859 1860
@@ -1902,7 +1903,7 @@ void pushVertsColorCoded(LLSpatialGroup* group, U32 mask)
1902 LLRenderPass::applyModelMatrix(*params); 1903 LLRenderPass::applyModelMatrix(*params);
1903 glColor4f(colors[col].mV[0], colors[col].mV[1], colors[col].mV[2], 0.5f); 1904 glColor4f(colors[col].mV[0], colors[col].mV[1], colors[col].mV[2], 0.5f);
1904 params->mVertexBuffer->setBuffer(mask); 1905 params->mVertexBuffer->setBuffer(mask);
1905 params->mVertexBuffer->drawRange(params->mParticle ? LLVertexBuffer::POINTS : LLVertexBuffer::TRIANGLES, 1906 params->mVertexBuffer->drawRange(params->mParticle ? LLRender::POINTS : LLRender::TRIANGLES,
1906 params->mStart, params->mEnd, params->mCount, params->mOffset); 1907 params->mStart, params->mEnd, params->mCount, params->mOffset);
1907 col = (col+1)%col_count; 1908 col = (col+1)%col_count;
1908 } 1909 }
@@ -1972,7 +1973,7 @@ void renderOctree(LLSpatialGroup* group)
1972 face->mVertexBuffer->setBuffer(LLVertexBuffer::MAP_VERTEX); 1973 face->mVertexBuffer->setBuffer(LLVertexBuffer::MAP_VERTEX);
1973 //drawBox((face->mExtents[0] + face->mExtents[1])*0.5f, 1974 //drawBox((face->mExtents[0] + face->mExtents[1])*0.5f,
1974 // (face->mExtents[1]-face->mExtents[0])*0.5f); 1975 // (face->mExtents[1]-face->mExtents[0])*0.5f);
1975 face->mVertexBuffer->draw(LLVertexBuffer::TRIANGLES, face->getIndicesCount(), face->getIndicesStart()); 1976 face->mVertexBuffer->draw(LLRender::TRIANGLES, face->getIndicesCount(), face->getIndicesStart());
1976 } 1977 }
1977 } 1978 }
1978 1979
@@ -2103,6 +2104,7 @@ void renderBoundingBox(LLDrawable* drawable)
2103 gGL.color4f(0.5f,0.5f,0.5f,1.0f); 2104 gGL.color4f(0.5f,0.5f,0.5f,1.0f);
2104 break; 2105 break;
2105 case LLViewerObject::LL_VO_PART_GROUP: 2106 case LLViewerObject::LL_VO_PART_GROUP:
2107 case LLViewerObject::LL_VO_HUD_PART_GROUP:
2106 gGL.color4f(0,0,1,1); 2108 gGL.color4f(0,0,1,1);
2107 break; 2109 break;
2108 case LLViewerObject::LL_VO_WATER: 2110 case LLViewerObject::LL_VO_WATER:
@@ -2222,7 +2224,7 @@ void renderPoints(LLDrawable* drawablep)
2222 LLGLDepthTest depth(GL_FALSE, GL_FALSE); 2224 LLGLDepthTest depth(GL_FALSE, GL_FALSE);
2223 if (drawablep->getNumFaces()) 2225 if (drawablep->getNumFaces())
2224 { 2226 {
2225 gGL.begin(LLVertexBuffer::POINTS); 2227 gGL.begin(LLRender::POINTS);
2226 gGL.color3f(1,1,1); 2228 gGL.color3f(1,1,1);
2227 LLVector3 center(drawablep->getPositionGroup()); 2229 LLVector3 center(drawablep->getPositionGroup());
2228 for (S32 i = 0; i < drawablep->getNumFaces(); i++) 2230 for (S32 i = 0; i < drawablep->getNumFaces(); i++)
@@ -2298,9 +2300,17 @@ void renderRaycast(LLDrawable* drawablep)
2298 LLGLEnable blend(GL_BLEND); 2300 LLGLEnable blend(GL_BLEND);
2299 gGL.color4f(0,1,1,0.5f); 2301 gGL.color4f(0,1,1,0.5f);
2300 2302
2301 for (S32 i = 0; i < drawablep->getNumFaces(); i++) 2303 if (drawablep->getVOVolume() && gDebugRaycastFaceHit != -1)
2302 { 2304 {
2303 pushVerts(drawablep->getFace(i), LLVertexBuffer::MAP_VERTEX); 2305 glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
2306 pushVerts(drawablep->getFace(gDebugRaycastFaceHit), LLVertexBuffer::MAP_VERTEX);
2307 glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
2308 }
2309 else if (drawablep->isAvatar())
2310 {
2311 LLGLDepthTest depth(GL_FALSE);
2312 LLVOAvatar* av = (LLVOAvatar*) drawablep->getVObj().get();
2313 av->renderCollisionVolumes();
2304 } 2314 }
2305 2315
2306 // draw intersection point 2316 // draw intersection point
@@ -2468,7 +2478,7 @@ void LLSpatialPartition::renderDebug()
2468 LLGLDisable cullface(GL_CULL_FACE); 2478 LLGLDisable cullface(GL_CULL_FACE);
2469 LLGLEnable blend(GL_BLEND); 2479 LLGLEnable blend(GL_BLEND);
2470 gGL.setSceneBlendType(LLRender::BT_ALPHA); 2480 gGL.setSceneBlendType(LLRender::BT_ALPHA);
2471 LLImageGL::unbindTexture(0); 2481 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
2472 gPipeline.disableLights(); 2482 gPipeline.disableLights();
2473 2483
2474 LLSpatialBridge* bridge = asBridge(); 2484 LLSpatialBridge* bridge = asBridge();
@@ -2508,8 +2518,9 @@ public:
2508 LLVector3 *mNormal; 2518 LLVector3 *mNormal;
2509 LLVector3 *mBinormal; 2519 LLVector3 *mBinormal;
2510 LLDrawable* mHit; 2520 LLDrawable* mHit;
2511 2521 BOOL mPickTransparent;
2512 LLOctreeIntersect(LLVector3 start, LLVector3 end, 2522
2523 LLOctreeIntersect(LLVector3 start, LLVector3 end, BOOL pick_transparent,
2513 S32* face_hit, LLVector3* intersection, LLVector2* tex_coord, LLVector3* normal, LLVector3* binormal) 2524 S32* face_hit, LLVector3* intersection, LLVector2* tex_coord, LLVector3* normal, LLVector3* binormal)
2514 : mStart(start), 2525 : mStart(start),
2515 mEnd(end), 2526 mEnd(end),
@@ -2518,14 +2529,15 @@ public:
2518 mTexCoord(tex_coord), 2529 mTexCoord(tex_coord),
2519 mNormal(normal), 2530 mNormal(normal),
2520 mBinormal(binormal), 2531 mBinormal(binormal),
2521 mHit(NULL) 2532 mHit(NULL),
2533 mPickTransparent(pick_transparent)
2522 { 2534 {
2523 } 2535 }
2524 2536
2525 virtual void visit(const LLSpatialGroup::OctreeNode* branch) 2537 virtual void visit(const LLSpatialGroup::OctreeNode* branch)
2526 { 2538 {
2527 for (LLSpatialGroup::OctreeNode::const_element_iter i = branch->getData().begin(); i != branch->getData().end(); ++i) 2539 for (LLSpatialGroup::OctreeNode::const_element_iter i = branch->getData().begin(); i != branch->getData().end(); ++i)
2528 { 2540 {
2529 check(*i); 2541 check(*i);
2530 } 2542 }
2531 } 2543 }
@@ -2570,25 +2582,35 @@ public:
2570 2582
2571 virtual bool check(LLDrawable* drawable) 2583 virtual bool check(LLDrawable* drawable)
2572 { 2584 {
2585 LLVector3 local_start = mStart;
2586 LLVector3 local_end = mEnd;
2587
2588 if (!gPipeline.hasRenderType(drawable->getRenderType()) || !drawable->isVisible())
2589 {
2590 return false;
2591 }
2592
2573 if (drawable->isSpatialBridge()) 2593 if (drawable->isSpatialBridge())
2574 { 2594 {
2575 LLSpatialPartition *part = drawable->asPartition(); 2595 LLSpatialPartition *part = drawable->asPartition();
2576 2596 LLSpatialBridge* bridge = part->asBridge();
2577 check(part->mOctree); 2597 if (bridge && gPipeline.hasRenderType(bridge->mDrawableType))
2578 } 2598 {
2579 2599 check(part->mOctree);
2600 }
2601 }
2580 else 2602 else
2581 { 2603 {
2582 LLViewerObject* vobj = drawable->getVObj(); 2604 LLViewerObject* vobj = drawable->getVObj();
2583 2605
2584 if (vobj) 2606 if (vobj)
2585 { 2607 {
2586 LLVector3 intersection; 2608 LLVector3 intersection;
2587 if (vobj->lineSegmentIntersect(mStart, mEnd, -1, mFaceHit, &intersection, mTexCoord, mNormal, mBinormal)) 2609 if (vobj->lineSegmentIntersect(mStart, mEnd, -1, mPickTransparent, mFaceHit, &intersection, mTexCoord, mNormal, mBinormal))
2588 { 2610 {
2589 mEnd = intersection; // shorten ray so we only find CLOSER hits 2611 mEnd = intersection; // shorten ray so we only find CLOSER hits
2590 if (mIntersection) 2612 if (mIntersection)
2591 { 2613 {
2592 *mIntersection = intersection; 2614 *mIntersection = intersection;
2593 } 2615 }
2594 2616
@@ -2596,12 +2618,13 @@ public:
2596 } 2618 }
2597 } 2619 }
2598 } 2620 }
2599 2621
2600 return false; 2622 return false;
2601 } 2623 }
2602}; 2624};
2603 2625
2604LLDrawable* LLSpatialPartition::lineSegmentIntersect(const LLVector3& start, const LLVector3& end, 2626LLDrawable* LLSpatialPartition::lineSegmentIntersect(const LLVector3& start, const LLVector3& end,
2627 BOOL pick_transparent,
2605 S32* face_hit, // return the face hit 2628 S32* face_hit, // return the face hit
2606 LLVector3* intersection, // return the intersection point 2629 LLVector3* intersection, // return the intersection point
2607 LLVector2* tex_coord, // return the texture coordinates of the intersection point 2630 LLVector2* tex_coord, // return the texture coordinates of the intersection point
@@ -2610,7 +2633,7 @@ LLDrawable* LLSpatialPartition::lineSegmentIntersect(const LLVector3& start, con
2610 ) 2633 )
2611 2634
2612{ 2635{
2613 LLOctreeIntersect intersect(start, end, face_hit, intersection, tex_coord, normal, bi_normal); 2636 LLOctreeIntersect intersect(start, end, pick_transparent, face_hit, intersection, tex_coord, normal, bi_normal);
2614 LLDrawable* drawable = intersect.check(mOctree); 2637 LLDrawable* drawable = intersect.check(mOctree);
2615 2638
2616 return drawable; 2639 return drawable;
diff --git a/linden/indra/newview/llspatialpartition.h b/linden/indra/newview/llspatialpartition.h
index bd09da2..f42d55b 100644
--- a/linden/indra/newview/llspatialpartition.h
+++ b/linden/indra/newview/llspatialpartition.h
@@ -301,6 +301,7 @@ public:
301 BOOL remove(LLDrawable *drawablep, LLSpatialGroup *curp); 301 BOOL remove(LLDrawable *drawablep, LLSpatialGroup *curp);
302 302
303 LLDrawable* lineSegmentIntersect(const LLVector3& start, const LLVector3& end, 303 LLDrawable* lineSegmentIntersect(const LLVector3& start, const LLVector3& end,
304 BOOL pick_transparent,
304 S32* face_hit, // return the face hit 305 S32* face_hit, // return the face hit
305 LLVector3* intersection = NULL, // return the intersection point 306 LLVector3* intersection = NULL, // return the intersection point
306 LLVector2* tex_coord = NULL, // return the texture coordinates of the intersection point 307 LLVector2* tex_coord = NULL, // return the texture coordinates of the intersection point
@@ -482,6 +483,12 @@ protected:
482 U32 mRenderPass; 483 U32 mRenderPass;
483}; 484};
484 485
486class LLHUDParticlePartition : public LLParticlePartition
487{
488public:
489 LLHUDParticlePartition();
490};
491
485//spatial partition for grass (implemented in LLVOGrass.cpp) 492//spatial partition for grass (implemented in LLVOGrass.cpp)
486class LLGrassPartition : public LLParticlePartition 493class LLGrassPartition : public LLParticlePartition
487{ 494{
diff --git a/linden/indra/newview/llsprite.cpp b/linden/indra/newview/llsprite.cpp
index 7da1d48..0032ee8 100644
--- a/linden/indra/newview/llsprite.cpp
+++ b/linden/indra/newview/llsprite.cpp
@@ -126,8 +126,8 @@ void LLSprite::updateFace(LLFace &face)
126 LLVector3 camera_vec = mPosition - sCameraPosition; 126 LLVector3 camera_vec = mPosition - sCameraPosition;
127 mScaledRight = camera_vec % LLVector3(0.f, 0.f, 1.f); 127 mScaledRight = camera_vec % LLVector3(0.f, 0.f, 1.f);
128 mScaledUp = -(camera_vec % mScaledRight); 128 mScaledUp = -(camera_vec % mScaledRight);
129 mScaledUp.normVec(); 129 mScaledUp.normalize();
130 mScaledRight.normVec(); 130 mScaledRight.normalize();
131 mScaledUp *= mHeightDiv2; 131 mScaledUp *= mHeightDiv2;
132 mScaledRight *= mWidthDiv2; 132 mScaledRight *= mWidthDiv2;
133 133
@@ -156,7 +156,7 @@ void LLSprite::updateFace(LLFace &face)
156 else 156 else
157 { 157 {
158 x_axis = sNormal % LLVector3(0.f, -1.f, 0.f); 158 x_axis = sNormal % LLVector3(0.f, -1.f, 0.f);
159 x_axis.normVec(); 159 x_axis.normalize();
160 160
161 y_axis = sNormal % x_axis; 161 y_axis = sNormal % x_axis;
162 } 162 }
diff --git a/linden/indra/newview/llsprite.h b/linden/indra/newview/llsprite.h
index 7170cb2..e721bef 100644
--- a/linden/indra/newview/llsprite.h
+++ b/linden/indra/newview/llsprite.h
@@ -73,7 +73,7 @@ public:
73 void setColor(const LLColor4 &color); 73 void setColor(const LLColor4 &color);
74 void setColor(const F32 r, const F32 g, const F32 b, const F32 a); 74 void setColor(const F32 r, const F32 g, const F32 b, const F32 a);
75 void setAlpha(const F32 alpha) { mColor.mV[VALPHA] = alpha; } 75 void setAlpha(const F32 alpha) { mColor.mV[VALPHA] = alpha; }
76 void setNormal(const LLVector3 &normal) { sNormal = normal; sNormal.normVec();} 76 void setNormal(const LLVector3 &normal) { sNormal = normal; sNormal.normalize();}
77 77
78 F32 getAlpha(); 78 F32 getAlpha();
79 79
diff --git a/linden/indra/newview/llstartup.cpp b/linden/indra/newview/llstartup.cpp
index 0978fbb..2ce111f 100644
--- a/linden/indra/newview/llstartup.cpp
+++ b/linden/indra/newview/llstartup.cpp
@@ -89,6 +89,7 @@
89#include "llfeaturemanager.h" 89#include "llfeaturemanager.h"
90#include "llfirstuse.h" 90#include "llfirstuse.h"
91#include "llfloateractivespeakers.h" 91#include "llfloateractivespeakers.h"
92#include "llfloaterbeacons.h"
92#include "llfloatercamera.h" 93#include "llfloatercamera.h"
93#include "llfloaterchat.h" 94#include "llfloaterchat.h"
94#include "llfloatergesture.h" 95#include "llfloatergesture.h"
@@ -244,6 +245,7 @@ void callback_choose_gender(S32 option, void* userdata);
244void init_start_screen(S32 location_id); 245void init_start_screen(S32 location_id);
245void release_start_screen(); 246void release_start_screen();
246void reset_login(); 247void reset_login();
248void apply_udp_blacklist(const std::string& csv);
247 249
248void callback_cache_name(const LLUUID& id, const std::string& firstname, const std::string& lastname, BOOL is_group, void* data) 250void callback_cache_name(const LLUUID& id, const std::string& firstname, const std::string& lastname, BOOL is_group, void* data)
249{ 251{
@@ -750,6 +752,12 @@ bool idle_startup()
750 gLoginMenuBarView->setVisible( TRUE ); 752 gLoginMenuBarView->setVisible( TRUE );
751 gLoginMenuBarView->setEnabled( TRUE ); 753 gLoginMenuBarView->setEnabled( TRUE );
752 754
755 // DEV-16927. The following code removes errant keystrokes that happen while the window is being
756 // first made visible.
757#ifdef _WIN32
758 MSG msg;
759 while( PeekMessage( &msg, /*All hWnds owned by this thread */ NULL, WM_KEYFIRST, WM_KEYLAST, PM_REMOVE ) );
760#endif
753 timeout.reset(); 761 timeout.reset();
754 return FALSE; 762 return FALSE;
755 } 763 }
@@ -842,6 +850,20 @@ bool idle_startup()
842 LLFile::mkdir(gDirUtilp->getChatLogsDir()); 850 LLFile::mkdir(gDirUtilp->getChatLogsDir());
843 LLFile::mkdir(gDirUtilp->getPerAccountChatLogsDir()); 851 LLFile::mkdir(gDirUtilp->getPerAccountChatLogsDir());
844 852
853 //good as place as any to create user windlight directories
854 std::string user_windlight_path_name(gDirUtilp->getExpandedFilename( LL_PATH_USER_SETTINGS , "windlight", ""));
855 LLFile::mkdir(user_windlight_path_name.c_str());
856
857 std::string user_windlight_skies_path_name(gDirUtilp->getExpandedFilename( LL_PATH_USER_SETTINGS , "windlight/skies", ""));
858 LLFile::mkdir(user_windlight_skies_path_name.c_str());
859
860 std::string user_windlight_water_path_name(gDirUtilp->getExpandedFilename( LL_PATH_USER_SETTINGS , "windlight/water", ""));
861 LLFile::mkdir(user_windlight_water_path_name.c_str());
862
863 std::string user_windlight_days_path_name(gDirUtilp->getExpandedFilename( LL_PATH_USER_SETTINGS , "windlight/days", ""));
864 LLFile::mkdir(user_windlight_days_path_name.c_str());
865
866
845 if (show_connect_box) 867 if (show_connect_box)
846 { 868 {
847 if ( LLPanelLogin::isGridComboDirty() ) 869 if ( LLPanelLogin::isGridComboDirty() )
@@ -1094,6 +1116,7 @@ bool idle_startup()
1094 LL_DEBUGS("AppInit") << "STATE_LOGIN_PROCESS_RESPONSE" << LL_ENDL; 1116 LL_DEBUGS("AppInit") << "STATE_LOGIN_PROCESS_RESPONSE" << LL_ENDL;
1095 std::ostringstream emsg; 1117 std::ostringstream emsg;
1096 bool quit = false; 1118 bool quit = false;
1119 bool update = false;
1097 std::string login_response; 1120 std::string login_response;
1098 std::string reason_response; 1121 std::string reason_response;
1099 std::string message_response; 1122 std::string message_response;
@@ -1137,11 +1160,7 @@ bool idle_startup()
1137 reason_response = LLUserAuth::getInstance()->getResponse("reason"); 1160 reason_response = LLUserAuth::getInstance()->getResponse("reason");
1138 message_response = LLUserAuth::getInstance()->getResponse("message"); 1161 message_response = LLUserAuth::getInstance()->getResponse("message");
1139 1162
1140 if (gHideLinks && reason_response == "disabled") 1163 if (!message_response.empty())
1141 {
1142 emsg << gDisabledMessage;
1143 }
1144 else if (!message_response.empty())
1145 { 1164 {
1146 // XUI: fix translation for strings returned during login 1165 // XUI: fix translation for strings returned during login
1147 // We need a generic table for translations 1166 // We need a generic table for translations
@@ -1199,16 +1218,7 @@ bool idle_startup()
1199 if(reason_response == "update") 1218 if(reason_response == "update")
1200 { 1219 {
1201 auth_message = LLUserAuth::getInstance()->getResponse("message"); 1220 auth_message = LLUserAuth::getInstance()->getResponse("message");
1202 if (show_connect_box) 1221 update = true;
1203 {
1204 update_app(TRUE, auth_message);
1205 LLStartUp::setStartupState( STATE_UPDATE_CHECK );
1206 return false;
1207 }
1208 else
1209 {
1210 quit = true;
1211 }
1212 } 1222 }
1213 if(reason_response == "optional") 1223 if(reason_response == "optional")
1214 { 1224 {
@@ -1246,6 +1256,21 @@ bool idle_startup()
1246 break; 1256 break;
1247 } 1257 }
1248 1258
1259 if (update || gSavedSettings.getBOOL("ForceMandatoryUpdate"))
1260 {
1261 gSavedSettings.setBOOL("ForceMandatoryUpdate", FALSE);
1262 if (show_connect_box)
1263 {
1264 update_app(TRUE, auth_message);
1265 LLStartUp::setStartupState( STATE_UPDATE_CHECK );
1266 return false;
1267 }
1268 else
1269 {
1270 quit = true;
1271 }
1272 }
1273
1249 // Version update and we're not showing the dialog 1274 // Version update and we're not showing the dialog
1250 if(quit) 1275 if(quit)
1251 { 1276 {
@@ -1256,8 +1281,14 @@ bool idle_startup()
1256 1281
1257 if(successful_login) 1282 if(successful_login)
1258 { 1283 {
1259 // unpack login data needed by the application
1260 std::string text; 1284 std::string text;
1285 text = LLUserAuth::getInstance()->getResponse("udp_blacklist");
1286 if(!text.empty())
1287 {
1288 apply_udp_blacklist(text);
1289 }
1290
1291 // unpack login data needed by the application
1261 text = LLUserAuth::getInstance()->getResponse("agent_id"); 1292 text = LLUserAuth::getInstance()->getResponse("agent_id");
1262 if(!text.empty()) gAgentID.set(text); 1293 if(!text.empty()) gAgentID.set(text);
1263 gDebugInfo["AgentID"] = text; 1294 gDebugInfo["AgentID"] = text;
@@ -1630,6 +1661,11 @@ bool idle_startup()
1630 LLFloaterActiveSpeakers::showInstance(); 1661 LLFloaterActiveSpeakers::showInstance();
1631 } 1662 }
1632 1663
1664 if (gSavedSettings.getBOOL("BeaconAlwaysOn"))
1665 {
1666 LLFloaterBeacons::showInstance();
1667 }
1668
1633 if (!gNoRender) 1669 if (!gNoRender)
1634 { 1670 {
1635 // Move the progress view in front of the UI 1671 // Move the progress view in front of the UI
@@ -2251,6 +2287,9 @@ bool idle_startup()
2251 } 2287 }
2252 } 2288 }
2253 2289
2290 //DEV-17797. get null folder. Any items found here moved to Lost and Found
2291 LLInventoryModel::findLostItems();
2292
2254 LLStartUp::setStartupState( STATE_PRECACHE ); 2293 LLStartUp::setStartupState( STATE_PRECACHE );
2255 timeout.reset(); 2294 timeout.reset();
2256 return FALSE; 2295 return FALSE;
@@ -2428,7 +2467,7 @@ bool idle_startup()
2428 gDebugView->mFastTimerView->setVisible(TRUE); 2467 gDebugView->mFastTimerView->setVisible(TRUE);
2429#endif 2468#endif
2430 2469
2431 LLAppViewer::instance()->initMainloopTimeout("Mainloop Init"); 2470 LLAppViewer::instance()->handleLoginComplete();
2432 2471
2433 return TRUE; 2472 return TRUE;
2434 } 2473 }
@@ -2744,7 +2783,6 @@ void update_app(BOOL mandatory, const std::string& auth_msg)
2744 2783
2745void update_dialog_callback(S32 option, void *userdata) 2784void update_dialog_callback(S32 option, void *userdata)
2746{ 2785{
2747 std::string update_exe_path;
2748 bool mandatory = userdata != NULL; 2786 bool mandatory = userdata != NULL;
2749 2787
2750#if !LL_RELEASE_FOR_DOWNLOAD 2788#if !LL_RELEASE_FOR_DOWNLOAD
@@ -2787,29 +2825,41 @@ void update_dialog_callback(S32 option, void *userdata)
2787 // *TODO constantize this guy 2825 // *TODO constantize this guy
2788 LLURI update_url = LLURI::buildHTTP("secondlife.com", 80, "update.php", query_map); 2826 LLURI update_url = LLURI::buildHTTP("secondlife.com", 80, "update.php", query_map);
2789 2827
2828 if(LLAppViewer::sUpdaterInfo)
2829 {
2830 delete LLAppViewer::sUpdaterInfo ;
2831 }
2832 LLAppViewer::sUpdaterInfo = new LLAppViewer::LLUpdaterInfo() ;
2833
2790#if LL_WINDOWS 2834#if LL_WINDOWS
2791 update_exe_path = gDirUtilp->getTempFilename(); 2835 LLAppViewer::sUpdaterInfo->mUpdateExePath = gDirUtilp->getTempFilename();
2792 if (update_exe_path.empty()) 2836 if (LLAppViewer::sUpdaterInfo->mUpdateExePath.empty())
2793 { 2837 {
2838 delete LLAppViewer::sUpdaterInfo ;
2839 LLAppViewer::sUpdaterInfo = NULL ;
2840
2794 // We're hosed, bail 2841 // We're hosed, bail
2795 LL_WARNS("AppInit") << "LLDir::getTempFilename() failed" << LL_ENDL; 2842 LL_WARNS("AppInit") << "LLDir::getTempFilename() failed" << LL_ENDL;
2796 LLAppViewer::instance()->forceQuit(); 2843 LLAppViewer::instance()->forceQuit();
2797 return; 2844 return;
2798 } 2845 }
2799 2846
2800 update_exe_path += ".exe"; 2847 LLAppViewer::sUpdaterInfo->mUpdateExePath += ".exe";
2801 2848
2802 std::string updater_source = gDirUtilp->getAppRODataDir(); 2849 std::string updater_source = gDirUtilp->getAppRODataDir();
2803 updater_source += gDirUtilp->getDirDelimiter(); 2850 updater_source += gDirUtilp->getDirDelimiter();
2804 updater_source += "updater.exe"; 2851 updater_source += "updater.exe";
2805 2852
2806 LL_DEBUGS("AppInit") << "Calling CopyFile source: " << updater_source 2853 LL_DEBUGS("AppInit") << "Calling CopyFile source: " << updater_source
2807 << " dest: " << update_exe_path 2854 << " dest: " << LLAppViewer::sUpdaterInfo->mUpdateExePath
2808 << LL_ENDL; 2855 << LL_ENDL;
2809 2856
2810 2857
2811 if (!CopyFileA(updater_source.c_str(), update_exe_path.c_str(), FALSE)) 2858 if (!CopyFileA(updater_source.c_str(), LLAppViewer::sUpdaterInfo->mUpdateExePath.c_str(), FALSE))
2812 { 2859 {
2860 delete LLAppViewer::sUpdaterInfo ;
2861 LLAppViewer::sUpdaterInfo = NULL ;
2862
2813 LL_WARNS("AppInit") << "Unable to copy the updater!" << LL_ENDL; 2863 LL_WARNS("AppInit") << "Unable to copy the updater!" << LL_ENDL;
2814 LLAppViewer::instance()->forceQuit(); 2864 LLAppViewer::instance()->forceQuit();
2815 return; 2865 return;
@@ -2822,41 +2872,13 @@ void update_dialog_callback(S32 option, void *userdata)
2822 gSavedSettings.setString( "NextLoginLocation", LLURLSimString::sInstance.mSimString ); 2872 gSavedSettings.setString( "NextLoginLocation", LLURLSimString::sInstance.mSimString );
2823 }; 2873 };
2824 2874
2825 std::ostringstream params; 2875 LLAppViewer::sUpdaterInfo->mParams << "-url \"" << update_url.asString() << "\"";
2826 params << "-url \"" << update_url.asString() << "\"";
2827 if (gHideLinks)
2828 {
2829 // Figure out the program name.
2830 const std::string& data_dir = gDirUtilp->getAppRODataDir();
2831 // Roll back from the end, stopping at the first '\'
2832 const char* program_name = data_dir.c_str() + data_dir.size(); /* Flawfinder: ignore */
2833 while ( (data_dir != --program_name) &&
2834 *(program_name) != '\\');
2835
2836 if ( *(program_name) == '\\')
2837 {
2838 // We found a '\'.
2839 program_name++;
2840 }
2841 else
2842 {
2843 // Oops.
2844 program_name = "SecondLife";
2845 }
2846 2876
2847 params << " -silent -name \"" << LLAppViewer::instance()->getSecondLifeTitle() << "\""; 2877 LL_DEBUGS("AppInit") << "Calling updater: " << LLAppViewer::sUpdaterInfo->mUpdateExePath << " " << LLAppViewer::sUpdaterInfo->mParams.str() << LL_ENDL;
2848 params << " -program \"" << program_name << "\"";
2849 }
2850
2851 LL_DEBUGS("AppInit") << "Calling updater: " << update_exe_path << " " << params.str() << LL_ENDL;
2852 2878
2853 //Explicitly remove the marker file, otherwise we pass the lock onto the child process and things get weird. 2879 //Explicitly remove the marker file, otherwise we pass the lock onto the child process and things get weird.
2854 LLAppViewer::instance()->removeMarkerFile(); // In case updater fails 2880 LLAppViewer::instance()->removeMarkerFile(); // In case updater fails
2855 2881
2856 // Use spawn() to run asynchronously
2857 int retval = _spawnl(_P_NOWAIT, update_exe_path.c_str(), update_exe_path.c_str(), params.str().c_str(), NULL);
2858 LL_DEBUGS("AppInit") << "Spawn returned " << retval << LL_ENDL;
2859
2860#elif LL_DARWIN 2882#elif LL_DARWIN
2861 // if a sim name was passed in via command line parameter (typically through a SLURL) 2883 // if a sim name was passed in via command line parameter (typically through a SLURL)
2862 if ( LLURLSimString::sInstance.mSimString.length() ) 2884 if ( LLURLSimString::sInstance.mSimString.length() )
@@ -2865,18 +2887,15 @@ void update_dialog_callback(S32 option, void *userdata)
2865 gSavedSettings.setString( "NextLoginLocation", LLURLSimString::sInstance.mSimString ); 2887 gSavedSettings.setString( "NextLoginLocation", LLURLSimString::sInstance.mSimString );
2866 }; 2888 };
2867 2889
2868 update_exe_path = "'"; 2890 LLAppViewer::sUpdaterInfo->mUpdateExePath = "'";
2869 update_exe_path += gDirUtilp->getAppRODataDir(); 2891 LLAppViewer::sUpdaterInfo->mUpdateExePath += gDirUtilp->getAppRODataDir();
2870 update_exe_path += "/mac-updater.app/Contents/MacOS/mac-updater' -url \""; 2892 LLAppViewer::sUpdaterInfo->mUpdateExePath += "/mac-updater.app/Contents/MacOS/mac-updater' -url \"";
2871 update_exe_path += update_url.asString(); 2893 LLAppViewer::sUpdaterInfo->mUpdateExePath += update_url.asString();
2872 update_exe_path += "\" -name \""; 2894 LLAppViewer::sUpdaterInfo->mUpdateExePath += "\" -name \"";
2873 update_exe_path += LLAppViewer::instance()->getSecondLifeTitle(); 2895 LLAppViewer::sUpdaterInfo->mUpdateExePath += LLAppViewer::instance()->getSecondLifeTitle();
2874 update_exe_path += "\" &"; 2896 LLAppViewer::sUpdaterInfo->mUpdateExePath += "\" &";
2875 2897
2876 LL_DEBUGS("AppInit") << "Calling updater: " << update_exe_path << LL_ENDL; 2898 LL_DEBUGS("AppInit") << "Calling updater: " << LLAppViewer::sUpdaterInfo->mUpdateExePath << LL_ENDL;
2877
2878 // Run the auto-updater.
2879 system(update_exe_path.c_str()); /* Flawfinder: ignore */
2880 2899
2881#elif LL_LINUX 2900#elif LL_LINUX
2882 OSMessageBox("Automatic updating is not yet implemented for Linux.\n" 2901 OSMessageBox("Automatic updating is not yet implemented for Linux.\n"
@@ -3533,7 +3552,7 @@ void init_stat_view()
3533 stat_barp->mDisplayBar = FALSE; 3552 stat_barp->mDisplayBar = FALSE;
3534 stat_barp->mDisplayMean = FALSE; 3553 stat_barp->mDisplayMean = FALSE;
3535 3554
3536 stat_barp = sim_time_viewp->addStat("Sim Time (Physics)", &(LLViewerStats::getInstance()->mSimSimPhysicsMsec)); 3555 stat_barp = sim_time_viewp->addStat("Physics Time", &(LLViewerStats::getInstance()->mSimSimPhysicsMsec));
3537 stat_barp->setUnitLabel("ms"); 3556 stat_barp->setUnitLabel("ms");
3538 stat_barp->mPrecision = 1; 3557 stat_barp->mPrecision = 1;
3539 stat_barp->mMinBar = 0.f; 3558 stat_barp->mMinBar = 0.f;
@@ -3544,45 +3563,7 @@ void init_stat_view()
3544 stat_barp->mDisplayBar = FALSE; 3563 stat_barp->mDisplayBar = FALSE;
3545 stat_barp->mDisplayMean = FALSE; 3564 stat_barp->mDisplayMean = FALSE;
3546 3565
3547 LLStatView *physics_time_viewp; 3566 stat_barp = sim_time_viewp->addStat("Simulation Time", &(LLViewerStats::getInstance()->mSimSimOtherMsec));
3548 physics_time_viewp = new LLStatView("physics perf view", "Physics Details (ms)", "", rect);
3549 sim_time_viewp->addChildAtEnd(physics_time_viewp);
3550 {
3551 stat_barp = physics_time_viewp->addStat("Physics Step", &(LLViewerStats::getInstance()->mSimSimPhysicsStepMsec));
3552 stat_barp->setUnitLabel("ms");
3553 stat_barp->mPrecision = 1;
3554 stat_barp->mMinBar = 0.f;
3555 stat_barp->mMaxBar = 40.f;
3556 stat_barp->mTickSpacing = 10.f;
3557 stat_barp->mLabelSpacing = 20.f;
3558 stat_barp->mPerSec = FALSE;
3559 stat_barp->mDisplayBar = FALSE;
3560 stat_barp->mDisplayMean = FALSE;
3561
3562 stat_barp = physics_time_viewp->addStat("Update Shapes", &(LLViewerStats::getInstance()->mSimSimPhysicsShapeUpdateMsec));
3563 stat_barp->setUnitLabel("ms");
3564 stat_barp->mPrecision = 1;
3565 stat_barp->mMinBar = 0.f;
3566 stat_barp->mMaxBar = 40.f;
3567 stat_barp->mTickSpacing = 10.f;
3568 stat_barp->mLabelSpacing = 20.f;
3569 stat_barp->mPerSec = FALSE;
3570 stat_barp->mDisplayBar = FALSE;
3571 stat_barp->mDisplayMean = FALSE;
3572
3573 stat_barp = physics_time_viewp->addStat("Other", &(LLViewerStats::getInstance()->mSimSimPhysicsOtherMsec));
3574 stat_barp->setUnitLabel("ms");
3575 stat_barp->mPrecision = 1;
3576 stat_barp->mMinBar = 0.f;
3577 stat_barp->mMaxBar = 40.f;
3578 stat_barp->mTickSpacing = 10.f;
3579 stat_barp->mLabelSpacing = 20.f;
3580 stat_barp->mPerSec = FALSE;
3581 stat_barp->mDisplayBar = FALSE;
3582 stat_barp->mDisplayMean = FALSE;
3583 }
3584
3585 stat_barp = sim_time_viewp->addStat("Sim Time (Other)", &(LLViewerStats::getInstance()->mSimSimOtherMsec));
3586 stat_barp->setUnitLabel("ms"); 3567 stat_barp->setUnitLabel("ms");
3587 stat_barp->mPrecision = 1; 3568 stat_barp->mPrecision = 1;
3588 stat_barp->mMinBar = 0.f; 3569 stat_barp->mMinBar = 0.f;
@@ -3626,6 +3607,79 @@ void init_stat_view()
3626 stat_barp->mDisplayBar = FALSE; 3607 stat_barp->mDisplayBar = FALSE;
3627 stat_barp->mDisplayMean = FALSE; 3608 stat_barp->mDisplayMean = FALSE;
3628 3609
3610 stat_barp = sim_time_viewp->addStat("Spare Time", &(LLViewerStats::getInstance()->mSimSpareMsec));
3611 stat_barp->setUnitLabel("ms");
3612 stat_barp->mPrecision = 1;
3613 stat_barp->mMinBar = 0.f;
3614 stat_barp->mMaxBar = 40.f;
3615 stat_barp->mTickSpacing = 10.f;
3616 stat_barp->mLabelSpacing = 20.f;
3617 stat_barp->mPerSec = FALSE;
3618 stat_barp->mDisplayBar = FALSE;
3619 stat_barp->mDisplayMean = FALSE;
3620
3621
3622 // 2nd level time blocks under 'Details' second
3623 LLStatView *detailed_time_viewp;
3624 detailed_time_viewp = new LLStatView("sim perf view", "Time Details (ms)", "", rect);
3625 sim_time_viewp->addChildAtEnd(detailed_time_viewp);
3626 {
3627 stat_barp = detailed_time_viewp->addStat(" Physics Step", &(LLViewerStats::getInstance()->mSimSimPhysicsStepMsec));
3628 stat_barp->setUnitLabel("ms");
3629 stat_barp->mPrecision = 1;
3630 stat_barp->mMinBar = 0.f;
3631 stat_barp->mMaxBar = 40.f;
3632 stat_barp->mTickSpacing = 10.f;
3633 stat_barp->mLabelSpacing = 20.f;
3634 stat_barp->mPerSec = FALSE;
3635 stat_barp->mDisplayBar = FALSE;
3636 stat_barp->mDisplayMean = FALSE;
3637
3638 stat_barp = detailed_time_viewp->addStat(" Update Physics Shapes", &(LLViewerStats::getInstance()->mSimSimPhysicsShapeUpdateMsec));
3639 stat_barp->setUnitLabel("ms");
3640 stat_barp->mPrecision = 1;
3641 stat_barp->mMinBar = 0.f;
3642 stat_barp->mMaxBar = 40.f;
3643 stat_barp->mTickSpacing = 10.f;
3644 stat_barp->mLabelSpacing = 20.f;
3645 stat_barp->mPerSec = FALSE;
3646 stat_barp->mDisplayBar = FALSE;
3647 stat_barp->mDisplayMean = FALSE;
3648
3649 stat_barp = detailed_time_viewp->addStat(" Physics Other", &(LLViewerStats::getInstance()->mSimSimPhysicsOtherMsec));
3650 stat_barp->setUnitLabel("ms");
3651 stat_barp->mPrecision = 1;
3652 stat_barp->mMinBar = 0.f;
3653 stat_barp->mMaxBar = 40.f;
3654 stat_barp->mTickSpacing = 10.f;
3655 stat_barp->mLabelSpacing = 20.f;
3656 stat_barp->mPerSec = FALSE;
3657 stat_barp->mDisplayBar = FALSE;
3658 stat_barp->mDisplayMean = FALSE;
3659
3660 stat_barp = detailed_time_viewp->addStat(" Sleep Time", &(LLViewerStats::getInstance()->mSimSleepMsec));
3661 stat_barp->setUnitLabel("ms");
3662 stat_barp->mPrecision = 1;
3663 stat_barp->mMinBar = 0.f;
3664 stat_barp->mMaxBar = 40.f;
3665 stat_barp->mTickSpacing = 10.f;
3666 stat_barp->mLabelSpacing = 20.f;
3667 stat_barp->mPerSec = FALSE;
3668 stat_barp->mDisplayBar = FALSE;
3669 stat_barp->mDisplayMean = FALSE;
3670
3671 stat_barp = detailed_time_viewp->addStat(" Pump IO", &(LLViewerStats::getInstance()->mSimPumpIOMsec));
3672 stat_barp->setUnitLabel("ms");
3673 stat_barp->mPrecision = 1;
3674 stat_barp->mMinBar = 0.f;
3675 stat_barp->mMaxBar = 40.f;
3676 stat_barp->mTickSpacing = 10.f;
3677 stat_barp->mLabelSpacing = 20.f;
3678 stat_barp->mPerSec = FALSE;
3679 stat_barp->mDisplayBar = FALSE;
3680 stat_barp->mDisplayMean = FALSE;
3681 }
3682
3629 LLRect r = gDebugView->mFloaterStatsp->getRect(); 3683 LLRect r = gDebugView->mFloaterStatsp->getRect();
3630 3684
3631 // Reshape based on the parameters we set. 3685 // Reshape based on the parameters we set.
@@ -3887,3 +3941,28 @@ void login_alert_done(S32 option, void* user_data)
3887 LLPanelLogin::giveFocus(); 3941 LLPanelLogin::giveFocus();
3888} 3942}
3889 3943
3944
3945void apply_udp_blacklist(const std::string& csv)
3946{
3947
3948 std::string::size_type start = 0;
3949 std::string::size_type comma = 0;
3950 do
3951 {
3952 comma = csv.find(",", start);
3953 if (comma == std::string::npos)
3954 {
3955 comma = csv.length();
3956 }
3957 std::string item(csv, start, comma-start);
3958
3959 lldebugs << "udp_blacklist " << item << llendl;
3960 gMessageSystem->banUdpMessage(item);
3961
3962 start = comma + 1;
3963
3964 }
3965 while(comma < csv.length());
3966
3967}
3968
diff --git a/linden/indra/newview/llstatbar.cpp b/linden/indra/newview/llstatbar.cpp
index 19a9442..d88e89f 100644
--- a/linden/indra/newview/llstatbar.cpp
+++ b/linden/indra/newview/llstatbar.cpp
@@ -166,7 +166,7 @@ void LLStatBar::draw()
166 bottom = bar_top - bar_height - tick_height/2; 166 bottom = bar_top - bar_height - tick_height/2;
167 167
168 LLGLSUIDefault gls_ui; 168 LLGLSUIDefault gls_ui;
169 LLGLSNoTexture gls_no_texture; 169 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
170 for (tick_value = mMinBar; tick_value <= mMaxBar; tick_value += mTickSpacing) 170 for (tick_value = mMinBar; tick_value <= mMaxBar; tick_value += mTickSpacing)
171 { 171 {
172 left = llfloor((tick_value - mMinBar)*value_scale); 172 left = llfloor((tick_value - mMinBar)*value_scale);
diff --git a/linden/indra/newview/llsurface.cpp b/linden/indra/newview/llsurface.cpp
index 017517c..b046f97 100644
--- a/linden/indra/newview/llsurface.cpp
+++ b/linden/indra/newview/llsurface.cpp
@@ -33,6 +33,8 @@
33 33
34#include "llsurface.h" 34#include "llsurface.h"
35 35
36#include "llrender.h"
37
36#include "llviewerimagelist.h" 38#include "llviewerimagelist.h"
37#include "llpatchvertexarray.h" 39#include "llpatchvertexarray.h"
38#include "patch_dct.h" 40#include "patch_dct.h"
@@ -249,7 +251,7 @@ void LLSurface::createSTexture()
249 251
250 mSTexturep = new LLViewerImage(raw, FALSE); 252 mSTexturep = new LLViewerImage(raw, FALSE);
251 mSTexturep->dontDiscard(); 253 mSTexturep->dontDiscard();
252 mSTexturep->bind(); 254 gGL.getTexUnit(0)->bind(mSTexturep.get());
253 mSTexturep->setClamp(TRUE, TRUE); 255 mSTexturep->setClamp(TRUE, TRUE);
254 gImageList.addImage(mSTexturep); 256 gImageList.addImage(mSTexturep);
255 } 257 }
@@ -274,7 +276,7 @@ void LLSurface::createWaterTexture()
274 } 276 }
275 mWaterTexturep = new LLViewerImage(raw, FALSE); 277 mWaterTexturep = new LLViewerImage(raw, FALSE);
276 mWaterTexturep->dontDiscard(); 278 mWaterTexturep->dontDiscard();
277 mWaterTexturep->bind(); 279 gGL.getTexUnit(0)->bind(mWaterTexturep.get());
278 mWaterTexturep->setClamp(TRUE, TRUE); 280 mWaterTexturep->setClamp(TRUE, TRUE);
279 gImageList.addImage(mWaterTexturep); 281 gImageList.addImage(mWaterTexturep);
280 } 282 }
diff --git a/linden/indra/newview/lltexlayer.cpp b/linden/indra/newview/lltexlayer.cpp
index e331146..a687344 100644
--- a/linden/indra/newview/lltexlayer.cpp
+++ b/linden/indra/newview/lltexlayer.cpp
@@ -60,8 +60,6 @@
60// SJB: We really always want to use the GL cache; 60// SJB: We really always want to use the GL cache;
61// let GL page textures in and out of video RAM instead of trying to do so by hand. 61// let GL page textures in and out of video RAM instead of trying to do so by hand.
62 62
63LLGradientPaletteList gGradientPaletteList;
64
65// static 63// static
66S32 LLTexLayerSetBuffer::sGLByteCount = 0; 64S32 LLTexLayerSetBuffer::sGLByteCount = 0;
67S32 LLTexLayerSetBuffer::sGLBumpByteCount = 0; 65S32 LLTexLayerSetBuffer::sGLBumpByteCount = 0;
@@ -96,7 +94,6 @@ LLTexLayerSetBuffer::LLTexLayerSetBuffer( LLTexLayerSet* owner, S32 width, S32 h
96 mNeedsUpload( FALSE ), 94 mNeedsUpload( FALSE ),
97 mUploadPending( FALSE ), // Not used for any logic here, just to sync sending of updates 95 mUploadPending( FALSE ), // Not used for any logic here, just to sync sending of updates
98 mTexLayerSet( owner ), 96 mTexLayerSet( owner ),
99 mInitialized( FALSE ),
100 mBumpTexName(0) 97 mBumpTexName(0)
101{ 98{
102 LLTexLayerSetBuffer::sGLByteCount += getSize(); 99 LLTexLayerSetBuffer::sGLByteCount += getSize();
@@ -106,11 +103,10 @@ LLTexLayerSetBuffer::LLTexLayerSetBuffer( LLTexLayerSet* owner, S32 width, S32 h
106 LLGLSUIDefault gls_ui; 103 LLGLSUIDefault gls_ui;
107 glGenTextures(1, (GLuint*) &mBumpTexName); 104 glGenTextures(1, (GLuint*) &mBumpTexName);
108 105
109 LLImageGL::bindExternalTexture(mBumpTexName, 0, GL_TEXTURE_2D); 106 gGL.getTexUnit(0)->bindManual(LLTexUnit::TT_TEXTURE, mBumpTexName);
110 stop_glerror(); 107 stop_glerror();
111 108
112 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 109 gGL.getTexUnit(0)->setTextureAddressMode(LLTexUnit::TAM_CLAMP);
113 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
114 110
115 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 111 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
116 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 112 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
@@ -118,7 +114,7 @@ LLTexLayerSetBuffer::LLTexLayerSetBuffer( LLTexLayerSet* owner, S32 width, S32 h
118 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); 114 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
119 stop_glerror(); 115 stop_glerror();
120 116
121 LLImageGL::unbindTexture(0, GL_TEXTURE_2D); 117 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
122 118
123 LLImageGL::sGlobalTextureMemory += mWidth * mHeight * 4; 119 LLImageGL::sGlobalTextureMemory += mWidth * mHeight * 4;
124 LLTexLayerSetBuffer::sGLBumpByteCount += mWidth * mHeight * 4; 120 LLTexLayerSetBuffer::sGLBumpByteCount += mWidth * mHeight * 4;
@@ -259,7 +255,7 @@ BOOL LLTexLayerSetBuffer::render()
259 LLGLSUIDefault gls_ui; 255 LLGLSUIDefault gls_ui;
260 256
261 // read back into texture (this is done externally for the color data) 257 // read back into texture (this is done externally for the color data)
262 LLImageGL::bindExternalTexture( mBumpTexName, 0, GL_TEXTURE_2D ); 258 gGL.getTexUnit(0)->bindManual(LLTexUnit::TT_TEXTURE, mBumpTexName);
263 stop_glerror(); 259 stop_glerror();
264 260
265 glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, mOrigin.mX, mOrigin.mY, mWidth, mHeight); 261 glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, mOrigin.mX, mOrigin.mY, mWidth, mHeight);
@@ -299,12 +295,17 @@ BOOL LLTexLayerSetBuffer::render()
299 gGL.setSceneBlendType(LLRender::BT_ALPHA); 295 gGL.setSceneBlendType(LLRender::BT_ALPHA);
300 296
301 // we have valid texture data now 297 // we have valid texture data now
302 mInitialized = TRUE; 298 mTexture->setInitialized(true);
303 mNeedsUpdate = FALSE; 299 mNeedsUpdate = FALSE;
304 300
305 return success; 301 return success;
306} 302}
307 303
304bool LLTexLayerSetBuffer::isInitialized(void) const
305{
306 return mTexture->isInitialized();
307}
308
308BOOL LLTexLayerSetBuffer::updateImmediate() 309BOOL LLTexLayerSetBuffer::updateImmediate()
309{ 310{
310 mNeedsUpdate = TRUE; 311 mNeedsUpdate = TRUE;
@@ -551,24 +552,12 @@ void LLTexLayerSetBuffer::onTextureUploadComplete(const LLUUID& uuid, void* user
551 delete baked_upload_data; 552 delete baked_upload_data;
552} 553}
553 554
554
555void LLTexLayerSetBuffer::bindTexture()
556{
557 if( mInitialized )
558 {
559 LLDynamicTexture::bindTexture();
560 }
561 else
562 {
563 gImageList.getImage(IMG_DEFAULT)->bind();
564 }
565}
566
567void LLTexLayerSetBuffer::bindBumpTexture( U32 stage ) 555void LLTexLayerSetBuffer::bindBumpTexture( U32 stage )
568{ 556{
569 if( mBumpTexName ) 557 if( mBumpTexName )
570 { 558 {
571 LLImageGL::bindExternalTexture(mBumpTexName, stage, GL_TEXTURE_2D); 559 gGL.getTexUnit(stage)->bindManual(LLTexUnit::TT_TEXTURE, mBumpTexName);
560 gGL.getTexUnit(0)->activate();
572 561
573 if( mLastBindTime != LLImageGL::sLastFrameTime ) 562 if( mLastBindTime != LLImageGL::sLastFrameTime )
574 { 563 {
@@ -578,7 +567,8 @@ void LLTexLayerSetBuffer::bindBumpTexture( U32 stage )
578 } 567 }
579 else 568 else
580 { 569 {
581 LLImageGL::unbindTexture(stage, GL_TEXTURE_2D); 570 gGL.getTexUnit(stage)->unbind(LLTexUnit::TT_TEXTURE);
571 gGL.getTexUnit(0)->activate();
582 } 572 }
583} 573}
584 574
@@ -786,7 +776,7 @@ BOOL LLTexLayerSet::render( S32 x, S32 y, S32 width, S32 height )
786 if( image_gl ) 776 if( image_gl )
787 { 777 {
788 LLGLSUIDefault gls_ui; 778 LLGLSUIDefault gls_ui;
789 image_gl->bind(); 779 gGL.getTexUnit(0)->bind(image_gl);
790 gl_rect_2d_simple_tex( width, height ); 780 gl_rect_2d_simple_tex( width, height );
791 } 781 }
792 else 782 else
@@ -794,7 +784,7 @@ BOOL LLTexLayerSet::render( S32 x, S32 y, S32 width, S32 height )
794 success = FALSE; 784 success = FALSE;
795 } 785 }
796 } 786 }
797 LLImageGL::unbindTexture(0, GL_TEXTURE_2D); 787 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
798 788
799 gGL.flush(); 789 gGL.flush();
800 gGL.setColorMask(true, true); 790 gGL.setColorMask(true, true);
@@ -804,7 +794,8 @@ BOOL LLTexLayerSet::render( S32 x, S32 y, S32 width, S32 height )
804 if( getInfo()->mClearAlpha ) 794 if( getInfo()->mClearAlpha )
805 { 795 {
806 // Set the alpha channel to one (clean up after previous blending) 796 // Set the alpha channel to one (clean up after previous blending)
807 LLGLSNoTextureNoAlphaTest gls_no_alpha; 797 LLGLDisable no_alpha(GL_ALPHA_TEST);
798 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
808 gGL.color4f( 0.f, 0.f, 0.f, 1.f ); 799 gGL.color4f( 0.f, 0.f, 0.f, 1.f );
809 gGL.flush(); 800 gGL.flush();
810 gGL.setColorMask(false, true); 801 gGL.setColorMask(false, true);
@@ -838,7 +829,8 @@ BOOL LLTexLayerSet::renderBump( S32 x, S32 y, S32 width, S32 height )
838 } 829 }
839 830
840 // Set the alpha channel to one (clean up after previous blending) 831 // Set the alpha channel to one (clean up after previous blending)
841 LLGLSNoTextureNoAlphaTest gls_no_texture_no_alpha; 832 LLGLDisable no_alpha(GL_ALPHA_TEST);
833 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
842 gGL.color4f( 0.f, 0.f, 0.f, 1.f ); 834 gGL.color4f( 0.f, 0.f, 0.f, 1.f );
843 gGL.setColorMask(false, true); 835 gGL.setColorMask(false, true);
844 836
@@ -1358,13 +1350,13 @@ BOOL LLTexLayer::render( S32 x, S32 y, S32 width, S32 height )
1358 BOOL old_clamps = image_gl->getClampS(); 1350 BOOL old_clamps = image_gl->getClampS();
1359 BOOL old_clampt = image_gl->getClampT(); 1351 BOOL old_clampt = image_gl->getClampT();
1360 1352
1361 image_gl->bind(); 1353 gGL.getTexUnit(0)->bind(image_gl);
1362 image_gl->setClamp(TRUE, TRUE); 1354 image_gl->setClamp(TRUE, TRUE);
1363 1355
1364 gl_rect_2d_simple_tex( width, height ); 1356 gl_rect_2d_simple_tex( width, height );
1365 1357
1366 image_gl->setClamp(old_clamps, old_clampt); 1358 image_gl->setClamp(old_clamps, old_clampt);
1367 image_gl->unbindTexture(0, GL_TEXTURE_2D); 1359 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
1368 } 1360 }
1369 } 1361 }
1370 else 1362 else
@@ -1380,9 +1372,9 @@ BOOL LLTexLayer::render( S32 x, S32 y, S32 width, S32 height )
1380 LLImageGL* image_gl = gTexStaticImageList.getImageGL( getInfo()->mStaticImageFileName, getInfo()->mStaticImageIsMask ); 1372 LLImageGL* image_gl = gTexStaticImageList.getImageGL( getInfo()->mStaticImageFileName, getInfo()->mStaticImageIsMask );
1381 if( image_gl ) 1373 if( image_gl )
1382 { 1374 {
1383 image_gl->bind(); 1375 gGL.getTexUnit(0)->bind(image_gl);
1384 gl_rect_2d_simple_tex( width, height ); 1376 gl_rect_2d_simple_tex( width, height );
1385 image_gl->unbindTexture(0, GL_TEXTURE_2D); 1377 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
1386 } 1378 }
1387 else 1379 else
1388 { 1380 {
@@ -1396,7 +1388,8 @@ BOOL LLTexLayer::render( S32 x, S32 y, S32 width, S32 height )
1396 getInfo()->mStaticImageFileName.empty() && 1388 getInfo()->mStaticImageFileName.empty() &&
1397 color_specified ) 1389 color_specified )
1398 { 1390 {
1399 LLGLSNoTextureNoAlphaTest gls; 1391 LLGLDisable no_alpha(GL_ALPHA_TEST);
1392 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
1400 gGL.color4fv( net_color.mV); 1393 gGL.color4fv( net_color.mV);
1401 gl_rect_2d_simple( width, height ); 1394 gl_rect_2d_simple( width, height );
1402 } 1395 }
@@ -1518,7 +1511,8 @@ BOOL LLTexLayer::renderAlphaMasks( S32 x, S32 y, S32 width, S32 height, LLColor4
1518 // Note: if the first param is a mulitply, multiply against the current buffer's alpha 1511 // Note: if the first param is a mulitply, multiply against the current buffer's alpha
1519 if( !first_param || !first_param->getMultiplyBlend() ) 1512 if( !first_param || !first_param->getMultiplyBlend() )
1520 { 1513 {
1521 LLGLSNoTextureNoAlphaTest gls_no_texture_no_alpha_test; 1514 LLGLDisable no_alpha(GL_ALPHA_TEST);
1515 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
1522 1516
1523 // Clear the alpha 1517 // Clear the alpha
1524 gGL.flush(); 1518 gGL.flush();
@@ -1555,13 +1549,13 @@ BOOL LLTexLayer::renderAlphaMasks( S32 x, S32 y, S32 width, S32 height, LLColor4
1555 1549
1556 BOOL old_clamps = image_gl->getClampS(); 1550 BOOL old_clamps = image_gl->getClampS();
1557 BOOL old_clampt = image_gl->getClampT(); 1551 BOOL old_clampt = image_gl->getClampT();
1558 image_gl->bind(); 1552 gGL.getTexUnit(0)->bind(image_gl);
1559 image_gl->setClamp(TRUE, TRUE); 1553 image_gl->setClamp(TRUE, TRUE);
1560 1554
1561 gl_rect_2d_simple_tex( width, height ); 1555 gl_rect_2d_simple_tex( width, height );
1562 1556
1563 image_gl->setClamp(old_clamps, old_clampt); 1557 image_gl->setClamp(old_clamps, old_clampt);
1564 image_gl->unbindTexture(0, GL_TEXTURE_2D); 1558 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
1565 } 1559 }
1566 } 1560 }
1567 else 1561 else
@@ -1581,9 +1575,9 @@ BOOL LLTexLayer::renderAlphaMasks( S32 x, S32 y, S32 width, S32 height, LLColor4
1581 ( (image_gl->getComponents() == 1) && getInfo()->mStaticImageIsMask ) ) 1575 ( (image_gl->getComponents() == 1) && getInfo()->mStaticImageIsMask ) )
1582 { 1576 {
1583 LLGLSNoAlphaTest gls_no_alpha_test; 1577 LLGLSNoAlphaTest gls_no_alpha_test;
1584 image_gl->bind(); 1578 gGL.getTexUnit(0)->bind(image_gl);
1585 gl_rect_2d_simple_tex( width, height ); 1579 gl_rect_2d_simple_tex( width, height );
1586 image_gl->unbindTexture(0, GL_TEXTURE_2D); 1580 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
1587 } 1581 }
1588 } 1582 }
1589 else 1583 else
@@ -1597,7 +1591,8 @@ BOOL LLTexLayer::renderAlphaMasks( S32 x, S32 y, S32 width, S32 height, LLColor4
1597 // Note: we're still using gGL.blendFunc( GL_DST_ALPHA, GL_ZERO ); 1591 // Note: we're still using gGL.blendFunc( GL_DST_ALPHA, GL_ZERO );
1598 if( colorp->mV[VW] != 1.f ) 1592 if( colorp->mV[VW] != 1.f )
1599 { 1593 {
1600 LLGLSNoTextureNoAlphaTest gls_no_texture_no_alpha_test; 1594 LLGLDisable no_alpha(GL_ALPHA_TEST);
1595 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
1601 gGL.color4fv( colorp->mV ); 1596 gGL.color4fv( colorp->mV );
1602 gl_rect_2d_simple( width, height ); 1597 gl_rect_2d_simple( width, height );
1603 } 1598 }
@@ -1700,7 +1695,7 @@ BOOL LLTexLayer::renderImageRaw( U8* in_data, S32 in_width, S32 in_height, S32 i
1700 glGenTextures(1, &name ); 1695 glGenTextures(1, &name );
1701 stop_glerror(); 1696 stop_glerror();
1702 1697
1703 LLImageGL::bindExternalTexture( name, 0, GL_TEXTURE_2D ); 1698 gGL.getTexUnit(0)->bindManual(LLTexUnit::TT_TEXTURE, name);
1704 stop_glerror(); 1699 stop_glerror();
1705 1700
1706 glTexImage2D( 1701 glTexImage2D(
@@ -1712,12 +1707,11 @@ BOOL LLTexLayer::renderImageRaw( U8* in_data, S32 in_width, S32 in_height, S32 i
1712 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 1707 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
1713 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 1708 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
1714 1709
1715 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 1710 gGL.getTexUnit(0)->setTextureAddressMode(LLTexUnit::TAM_CLAMP);
1716 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
1717 1711
1718 gl_rect_2d_simple_tex( width, height ); 1712 gl_rect_2d_simple_tex( width, height );
1719 1713
1720 LLImageGL::unbindTexture(0, GL_TEXTURE_2D); 1714 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
1721 1715
1722 glDeleteTextures(1, &name ); 1716 glDeleteTextures(1, &name );
1723 stop_glerror(); 1717 stop_glerror();
@@ -1736,7 +1730,7 @@ BOOL LLTexLayer::renderImageRaw( U8* in_data, S32 in_width, S32 in_height, S32 i
1736 1730
1737 gl_rect_2d_simple_tex( width, height ); 1731 gl_rect_2d_simple_tex( width, height );
1738 1732
1739 LLImageGL::unbindTexture(0, GL_TEXTURE_2D); 1733 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
1740 } 1734 }
1741 1735
1742 return TRUE; 1736 return TRUE;
@@ -1800,8 +1794,6 @@ BOOL LLTexLayerParamAlphaInfo::parseXml(LLXmlTreeNode* node)
1800 static LLStdStringHandle domain_string = LLXmlTree::addAttributeString("domain"); 1794 static LLStdStringHandle domain_string = LLXmlTree::addAttributeString("domain");
1801 param_alpha_node->getFastAttributeF32( domain_string, mDomain ); 1795 param_alpha_node->getFastAttributeF32( domain_string, mDomain );
1802 1796
1803 gGradientPaletteList.initPalette(mDomain);
1804
1805 return TRUE; 1797 return TRUE;
1806} 1798}
1807 1799
@@ -1996,7 +1988,7 @@ BOOL LLTexLayerParamAlpha::render( S32 x, S32 y, S32 width, S32 height )
1996 if( !mCachedProcessedImageGL || 1988 if( !mCachedProcessedImageGL ||
1997 (mCachedProcessedImageGL->getWidth() != image_tga_width) || 1989 (mCachedProcessedImageGL->getWidth() != image_tga_width) ||
1998 (mCachedProcessedImageGL->getHeight() != image_tga_height) || 1990 (mCachedProcessedImageGL->getHeight() != image_tga_height) ||
1999 (weight_changed && !(gGLManager.mHasPalettedTextures && gPipeline.hasRenderDebugFeatureMask(LLPipeline::RENDER_DEBUG_FEATURE_PALETTE))) ) 1991 (weight_changed ))
2000 { 1992 {
2001// llinfos << "Building Cached Alpha: " << mName << ": (" << mStaticImageRaw->getWidth() << ", " << mStaticImageRaw->getHeight() << ") " << effective_weight << llendl; 1993// llinfos << "Building Cached Alpha: " << mName << ": (" << mStaticImageRaw->getWidth() << ", " << mStaticImageRaw->getHeight() << ") " << effective_weight << llendl;
2002 mCachedEffectiveWeight = effective_weight; 1994 mCachedEffectiveWeight = effective_weight;
@@ -2008,71 +2000,34 @@ BOOL LLTexLayerParamAlpha::render( S32 x, S32 y, S32 width, S32 height )
2008 // We now have something in one of our caches 2000 // We now have something in one of our caches
2009 LLTexLayerSet::sHasCaches |= mCachedProcessedImageGL ? TRUE : FALSE; 2001 LLTexLayerSet::sHasCaches |= mCachedProcessedImageGL ? TRUE : FALSE;
2010 2002
2011 if (gGLManager.mHasPalettedTextures && gPipeline.hasRenderDebugFeatureMask(LLPipeline::RENDER_DEBUG_FEATURE_PALETTE)) 2003
2012 { 2004 mCachedProcessedImageGL->setExplicitFormat( GL_ALPHA8, GL_ALPHA );
2013 // interpret luminance values as color index table
2014 mCachedProcessedImageGL->setExplicitFormat( GL_COLOR_INDEX8_EXT, GL_COLOR_INDEX );
2015 }
2016 else
2017 {
2018 mCachedProcessedImageGL->setExplicitFormat( GL_ALPHA8, GL_ALPHA );
2019 }
2020 } 2005 }
2021 2006
2022 // Applies domain and effective weight to data as it is decoded. Also resizes the raw image if needed. 2007 // Applies domain and effective weight to data as it is decoded. Also resizes the raw image if needed.
2023 if (gGLManager.mHasPalettedTextures && gPipeline.hasRenderDebugFeatureMask(LLPipeline::RENDER_DEBUG_FEATURE_PALETTE)) 2008 mStaticImageRaw = NULL;
2024 { 2009 mStaticImageRaw = new LLImageRaw;
2025 mStaticImageRaw = NULL; 2010 mStaticImageTGA->decodeAndProcess( mStaticImageRaw, getInfo()->mDomain, effective_weight );
2026 mStaticImageRaw = new LLImageRaw; 2011 mNeedsCreateTexture = TRUE;
2027 mStaticImageTGA->decode(mStaticImageRaw);
2028 mNeedsCreateTexture = TRUE;
2029 }
2030 else
2031 {
2032 mStaticImageRaw = NULL;
2033 mStaticImageRaw = new LLImageRaw;
2034 mStaticImageTGA->decodeAndProcess( mStaticImageRaw, getInfo()->mDomain, effective_weight );
2035 mNeedsCreateTexture = TRUE;
2036 }
2037 } 2012 }
2038 2013
2039 if( mCachedProcessedImageGL ) 2014 if( mCachedProcessedImageGL )
2040 { 2015 {
2041 { 2016 {
2042 if (gGLManager.mHasPalettedTextures && gPipeline.hasRenderDebugFeatureMask(LLPipeline::RENDER_DEBUG_FEATURE_PALETTE)) 2017 // Create the GL texture, and then hang onto it for future use.
2043 { 2018 if( mNeedsCreateTexture )
2044 if( mNeedsCreateTexture )
2045 {
2046 mCachedProcessedImageGL->createGLTexture(0, mStaticImageRaw);
2047 mNeedsCreateTexture = FALSE;
2048
2049 mCachedProcessedImageGL->bind();
2050 mCachedProcessedImageGL->setClamp(TRUE, TRUE);
2051 }
2052
2053 LLGLSNoAlphaTest gls_no_alpha_test;
2054 mCachedProcessedImageGL->bind();
2055 gGradientPaletteList.setHardwarePalette( getInfo()->mDomain, effective_weight );
2056 gl_rect_2d_simple_tex( width, height );
2057 mCachedProcessedImageGL->unbindTexture(0, GL_TEXTURE_2D);
2058 }
2059 else
2060 { 2019 {
2061 // Create the GL texture, and then hang onto it for future use. 2020 mCachedProcessedImageGL->createGLTexture(0, mStaticImageRaw);
2062 if( mNeedsCreateTexture ) 2021 mNeedsCreateTexture = FALSE;
2063 { 2022
2064 mCachedProcessedImageGL->createGLTexture(0, mStaticImageRaw); 2023 gGL.getTexUnit(0)->bind(mCachedProcessedImageGL);
2065 mNeedsCreateTexture = FALSE; 2024 mCachedProcessedImageGL->setClamp(TRUE, TRUE);
2066
2067 mCachedProcessedImageGL->bind();
2068 mCachedProcessedImageGL->setClamp(TRUE, TRUE);
2069 }
2070
2071 LLGLSNoAlphaTest gls_no_alpha_test;
2072 mCachedProcessedImageGL->bind();
2073 gl_rect_2d_simple_tex( width, height );
2074 mCachedProcessedImageGL->unbindTexture(0, GL_TEXTURE_2D);
2075 } 2025 }
2026
2027 LLGLSNoAlphaTest gls_no_alpha_test;
2028 gGL.getTexUnit(0)->bind(mCachedProcessedImageGL);
2029 gl_rect_2d_simple_tex( width, height );
2030 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
2076 stop_glerror(); 2031 stop_glerror();
2077 } 2032 }
2078 } 2033 }
@@ -2086,7 +2041,8 @@ BOOL LLTexLayerParamAlpha::render( S32 x, S32 y, S32 width, S32 height )
2086 } 2041 }
2087 else 2042 else
2088 { 2043 {
2089 LLGLSNoTextureNoAlphaTest gls_no_texture_no_alpha_test; 2044 LLGLDisable no_alpha(GL_ALPHA_TEST);
2045 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
2090 gGL.color4f( 0.f, 0.f, 0.f, effective_weight ); 2046 gGL.color4f( 0.f, 0.f, 0.f, effective_weight );
2091 gl_rect_2d_simple( width, height ); 2047 gl_rect_2d_simple( width, height );
2092 } 2048 }
@@ -2519,7 +2475,7 @@ LLImageGL* LLTexStaticImageList::getImageGL(const std::string& file_name, BOOL i
2519 } 2475 }
2520 image_gl->createGLTexture(0, image_raw); 2476 image_gl->createGLTexture(0, image_raw);
2521 2477
2522 image_gl->bind(); 2478 gGL.getTexUnit(0)->bind(image_gl);
2523 image_gl->setClamp(TRUE, TRUE); 2479 image_gl->setClamp(TRUE, TRUE);
2524 2480
2525 mStaticImageListGL [ namekey ] = image_gl; 2481 mStaticImageListGL [ namekey ] = image_gl;
@@ -2559,68 +2515,3 @@ LLMaskedMorph::LLMaskedMorph( LLPolyMorphTarget *morph_target, BOOL invert ) : m
2559 morph_target->addPendingMorphMask(); 2515 morph_target->addPendingMorphMask();
2560} 2516}
2561 2517
2562
2563//-----------------------------------------------------------------------------
2564// LLGradientPaletteList
2565//-----------------------------------------------------------------------------
2566
2567LLGradientPaletteList::~LLGradientPaletteList()
2568{
2569 // Note: can't just call deleteAllData() because the data values are arrays.
2570 for( palette_map_t::iterator iter = mPaletteMap.begin();
2571 iter != mPaletteMap.end(); iter++ )
2572 {
2573 U8* data = iter->second;
2574 delete []data;
2575 }
2576}
2577
2578void LLGradientPaletteList::initPalette(F32 domain)
2579{
2580 palette_map_t::iterator iter = mPaletteMap.find( domain );
2581 if( iter == mPaletteMap.end() )
2582 {
2583 U8 *palette = new U8[512 * 4];
2584 mPaletteMap[domain] = palette;
2585 S32 ramp_start = 255 - llfloor(domain * 255.f);
2586 S32 ramp_end = 255;
2587 F32 ramp_factor = (ramp_end == ramp_start) ? 0.f : (255.f / ((F32)ramp_end - (F32)ramp_start));
2588
2589 // *TODO: move conditionals outside of loop, since this really
2590 // is just a sequential process.
2591 for (S32 i = 0; i < 512; i++)
2592 {
2593 palette[(i * 4) + 1] = 0;
2594 palette[(i * 4) + 2] = 0;
2595 if (i <= ramp_start)
2596 {
2597 palette[(i * 4)] = 0;
2598 palette[(i * 4) + 3] = 0;
2599 }
2600 else if (i < ramp_end)
2601 {
2602 palette[(i * 4)] = llfloor(((F32)i - (F32)ramp_start) * ramp_factor);
2603 palette[(i * 4) + 3] = llfloor(((F32)i - (F32)ramp_start) * ramp_factor);
2604 }
2605 else
2606 {
2607 palette[(i * 4)] = 255;
2608 palette[(i * 4) + 3] = 255;
2609 }
2610 }
2611 }
2612}
2613
2614void LLGradientPaletteList::setHardwarePalette( F32 domain, F32 effective_weight )
2615{
2616 palette_map_t::iterator iter = mPaletteMap.find( domain );
2617 if( iter != mPaletteMap.end() )
2618 {
2619 U8* palette = iter->second;
2620 set_palette( palette + llfloor(effective_weight * (255.f * (1.f - domain))) * 4);
2621 }
2622 else
2623 {
2624 llwarns << "LLGradientPaletteList::setHardwarePalette() missing domain " << domain << llendl;
2625 }
2626}
diff --git a/linden/indra/newview/lltexlayer.h b/linden/indra/newview/lltexlayer.h
index 742b484..bd59c66 100644
--- a/linden/indra/newview/lltexlayer.h
+++ b/linden/indra/newview/lltexlayer.h
@@ -211,9 +211,8 @@ public:
211 virtual void postRender(BOOL success); 211 virtual void postRender(BOOL success);
212 virtual BOOL render(); 212 virtual BOOL render();
213 BOOL updateImmediate(); 213 BOOL updateImmediate();
214 virtual void bindTexture();
215 void bindBumpTexture( U32 stage ); 214 void bindBumpTexture( U32 stage );
216 BOOL isInitialized() { return mInitialized; } // Initialized here means that we've done at least one render 215 bool isInitialized(void) const;
217 BOOL needsRender(); 216 BOOL needsRender();
218 void requestUpdate(); 217 void requestUpdate();
219 void requestUpload(); 218 void requestUpload();
@@ -236,7 +235,6 @@ private:
236 BOOL mUploadPending; 235 BOOL mUploadPending;
237 LLUUID mUploadID; // Identifys the current upload process (null if none). Used to avoid overlaps (eg, when the user rapidly makes two changes outside of Face Edit) 236 LLUUID mUploadID; // Identifys the current upload process (null if none). Used to avoid overlaps (eg, when the user rapidly makes two changes outside of Face Edit)
238 LLTexLayerSet* mTexLayerSet; 237 LLTexLayerSet* mTexLayerSet;
239 BOOL mInitialized;
240 LLGLuint mBumpTexName; // zero if none 238 LLGLuint mBumpTexName; // zero if none
241 239
242 static S32 sGLByteCount; 240 static S32 sGLByteCount;
@@ -529,41 +527,6 @@ public:
529}; 527};
530 528
531 529
532//-----------------------------------------------------------------------------
533// LLGradientPaletteList
534// A static set of ramp grayscale palettes. The "effective_weight" is used
535// to determine the x position of the ramp (offset)
536//
537// "Domain" isn't really the right word. It refers to the width of the
538// ramp portion of the function that relates input and output pixel values.
539// A domain of 0 gives a step function.
540//
541// | /----------------
542// O| / |
543// u| / |
544// t| / |
545// p|------------------/ |
546// u| | |
547// t|<---------------->|<-->|
548// | "offset" "domain"
549// |
550// --+---Input--------------------------------
551// |
552//-----------------------------------------------------------------------------
553class LLGradientPaletteList
554{
555public:
556 LLGradientPaletteList() {}
557 ~LLGradientPaletteList();
558
559 void initPalette(F32 domain);
560 void setHardwarePalette(F32 domain, F32 effective_weight);
561
562private:
563 typedef std::map<F32, U8*> palette_map_t;
564 palette_map_t mPaletteMap;
565};
566
567// Used by LLTexLayerSetBuffer for a callback. 530// Used by LLTexLayerSetBuffer for a callback.
568class LLBakedUploadData 531class LLBakedUploadData
569{ 532{
diff --git a/linden/indra/newview/lltexturectrl.cpp b/linden/indra/newview/lltexturectrl.cpp
index 382a4f3..38ca3b7 100644
--- a/linden/indra/newview/lltexturectrl.cpp
+++ b/linden/indra/newview/lltexturectrl.cpp
@@ -483,9 +483,9 @@ void LLFloaterTexturePicker::draw()
483 LLRect local_rect = getLocalRect(); 483 LLRect local_rect = getLocalRect();
484 if (gFocusMgr.childHasKeyboardFocus(this) && mOwner->isInVisibleChain() && mContextConeOpacity > 0.001f) 484 if (gFocusMgr.childHasKeyboardFocus(this) && mOwner->isInVisibleChain() && mContextConeOpacity > 0.001f)
485 { 485 {
486 LLGLSNoTexture no_texture; 486 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
487 LLGLEnable(GL_CULL_FACE); 487 LLGLEnable(GL_CULL_FACE);
488 gGL.begin(LLVertexBuffer::QUADS); 488 gGL.begin(LLRender::QUADS);
489 { 489 {
490 gGL.color4f(0.f, 0.f, 0.f, CONTEXT_CONE_IN_ALPHA * mContextConeOpacity); 490 gGL.color4f(0.f, 0.f, 0.f, CONTEXT_CONE_IN_ALPHA * mContextConeOpacity);
491 gGL.vertex2i(owner_rect.mLeft, owner_rect.mTop); 491 gGL.vertex2i(owner_rect.mLeft, owner_rect.mTop);
diff --git a/linden/indra/newview/lltextureview.cpp b/linden/indra/newview/lltextureview.cpp
index 49bc968..c5da2cf 100644
--- a/linden/indra/newview/lltextureview.cpp
+++ b/linden/indra/newview/lltextureview.cpp
@@ -247,7 +247,7 @@ void LLTextureBar::draw()
247 LLFontGL::sMonospace->renderUTF8(fetch_state_desc[state].desc, 0, title_x2, getRect().getHeight(), 247 LLFontGL::sMonospace->renderUTF8(fetch_state_desc[state].desc, 0, title_x2, getRect().getHeight(),
248 fetch_state_desc[state].color, 248 fetch_state_desc[state].color,
249 LLFontGL::LEFT, LLFontGL::TOP); 249 LLFontGL::LEFT, LLFontGL::TOP);
250 LLGLSNoTexture gls_no_texture; 250 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
251 251
252 // Draw the progress bar. 252 // Draw the progress bar.
253 S32 bar_width = 100; 253 S32 bar_width = 100;
@@ -383,9 +383,9 @@ private:
383 383
384void LLGLTexMemBar::draw() 384void LLGLTexMemBar::draw()
385{ 385{
386 S32 bound_mem = LLViewerImage::sBoundTextureMemory; 386 S32 bound_mem = (LLViewerImage::sBoundTextureMemory >> 20);
387 S32 max_bound_mem = LLViewerImage::sMaxBoundTextureMem; 387 S32 max_bound_mem = LLViewerImage::sMaxBoundTextureMem;
388 S32 total_mem = LLViewerImage::sTotalTextureMemory; 388 S32 total_mem = (LLViewerImage::sTotalTextureMemory >> 20);
389 S32 max_total_mem = LLViewerImage::sMaxTotalTextureMem; 389 S32 max_total_mem = LLViewerImage::sMaxTotalTextureMem;
390 F32 discard_bias = LLViewerImage::sDesiredDiscardBias; 390 F32 discard_bias = LLViewerImage::sDesiredDiscardBias;
391 S32 line_height = (S32)(LLFontGL::sMonospace->getLineHeight() + .5f); 391 S32 line_height = (S32)(LLFontGL::sMonospace->getLineHeight() + .5f);
@@ -396,10 +396,10 @@ void LLGLTexMemBar::draw()
396 396
397 std::string text; 397 std::string text;
398 text = llformat("GL Tot: %d/%d MB Bound: %d/%d MB Discard Bias: %.2f", 398 text = llformat("GL Tot: %d/%d MB Bound: %d/%d MB Discard Bias: %.2f",
399 total_mem/(1024*1024), 399 total_mem,
400 max_total_mem/(1024*1024), 400 max_total_mem,
401 bound_mem/(1024*1024), 401 bound_mem,
402 max_bound_mem/(1024*1024), 402 max_bound_mem,
403 discard_bias); 403 discard_bias);
404 404
405 LLFontGL::sMonospace->renderUTF8(text, 0, 0, line_height*3, 405 LLFontGL::sMonospace->renderUTF8(text, 0, 0, line_height*3,
@@ -415,7 +415,7 @@ void LLGLTexMemBar::draw()
415 415
416 F32 bar_scale = (F32)bar_width / (max_bound_mem * 1.5f); 416 F32 bar_scale = (F32)bar_width / (max_bound_mem * 1.5f);
417 417
418 LLGLSNoTexture gls_no_texture; 418 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
419 419
420 gGL.color4f(0.5f, 0.5f, 0.5f, 0.75f); 420 gGL.color4f(0.5f, 0.5f, 0.5f, 0.75f);
421 gl_rect_2d(left, top, right, bottom); 421 gl_rect_2d(left, top, right, bottom);
diff --git a/linden/indra/newview/lltool.cpp b/linden/indra/newview/lltool.cpp
index cb0d3b1..b807276 100644
--- a/linden/indra/newview/lltool.cpp
+++ b/linden/indra/newview/lltool.cpp
@@ -42,6 +42,7 @@
42#include "lltoolfocus.h" 42#include "lltoolfocus.h"
43#include "llfocusmgr.h" 43#include "llfocusmgr.h"
44#include "llagent.h" 44#include "llagent.h"
45#include "llviewerjoystick.h"
45 46
46extern BOOL gDebugClicks; 47extern BOOL gDebugClicks;
47 48
@@ -160,6 +161,11 @@ BOOL LLTool::handleKey(KEY key, MASK mask)
160 161
161LLTool* LLTool::getOverrideTool(MASK mask) 162LLTool* LLTool::getOverrideTool(MASK mask)
162{ 163{
164 // NOTE: if in flycam mode, ALT-ZOOM camera should be disabled
165 if (LLViewerJoystick::getInstance()->getOverrideCamera())
166 {
167 return NULL;
168 }
163 if (mask & MASK_ALT) 169 if (mask & MASK_ALT)
164 { 170 {
165 return LLToolCamera::getInstance(); 171 return LLToolCamera::getInstance();
diff --git a/linden/indra/newview/lltoolbrush.cpp b/linden/indra/newview/lltoolbrush.cpp
index 0869cf3..6391789 100644
--- a/linden/indra/newview/lltoolbrush.cpp
+++ b/linden/indra/newview/lltoolbrush.cpp
@@ -491,7 +491,7 @@ void LLToolBrushLand::renderOverlay(LLSurface& land, const LLVector3& pos_region
491 const LLVector3& pos_world) 491 const LLVector3& pos_world)
492{ 492{
493 glMatrixMode(GL_MODELVIEW); 493 glMatrixMode(GL_MODELVIEW);
494 LLGLSNoTexture gls_no_texture; 494 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
495 LLGLDepthTest mDepthTest(GL_TRUE); 495 LLGLDepthTest mDepthTest(GL_TRUE);
496 glPushMatrix(); 496 glPushMatrix();
497 gGL.color4fv(OVERLAY_COLOR.mV); 497 gGL.color4fv(OVERLAY_COLOR.mV);
@@ -503,7 +503,7 @@ void LLToolBrushLand::renderOverlay(LLSurface& land, const LLVector3& pos_region
503 S32 radioAction = gSavedSettings.getS32("RadioLandBrushAction"); 503 S32 radioAction = gSavedSettings.getS32("RadioLandBrushAction");
504 F32 force = gSavedSettings.getF32("LandBrushForce"); // .1 to 100? 504 F32 force = gSavedSettings.getF32("LandBrushForce"); // .1 to 100?
505 505
506 gGL.begin(LLVertexBuffer::LINES); 506 gGL.begin(LLRender::LINES);
507 for(S32 di = -half_edge; di <= half_edge; di++) 507 for(S32 di = -half_edge; di <= half_edge; di++)
508 { 508 {
509 if((i+di) < 0 || (i+di) >= (S32)land.mGridsPerEdge) continue; 509 if((i+di) < 0 || (i+di) >= (S32)land.mGridsPerEdge) continue;
diff --git a/linden/indra/newview/lltoolmorph.cpp b/linden/indra/newview/lltoolmorph.cpp
index 2fbf4ae..9666e66 100644
--- a/linden/indra/newview/lltoolmorph.cpp
+++ b/linden/indra/newview/lltoolmorph.cpp
@@ -240,6 +240,7 @@ BOOL LLVisualParamHint::render()
240 } 240 }
241 avatarp->setVisualParamWeight(mVisualParam, mLastParamWeight); 241 avatarp->setVisualParamWeight(mVisualParam, mLastParamWeight);
242 gGL.color4f(1,1,1,1); 242 gGL.color4f(1,1,1,1);
243 mTexture->setInitialized(true);
243 return TRUE; 244 return TRUE;
244} 245}
245 246
@@ -251,12 +252,12 @@ void LLVisualParamHint::draw()
251{ 252{
252 if (!mIsVisible) return; 253 if (!mIsVisible) return;
253 254
254 bindTexture(); 255 gGL.getTexUnit(0)->bind(getTexture());
255 256
256 gGL.color4f(1.f, 1.f, 1.f, 1.f); 257 gGL.color4f(1.f, 1.f, 1.f, 1.f);
257 258
258 LLGLSUIDefault gls_ui; 259 LLGLSUIDefault gls_ui;
259 gGL.begin(LLVertexBuffer::QUADS); 260 gGL.begin(LLRender::QUADS);
260 { 261 {
261 gGL.texCoord2i(0, 1); 262 gGL.texCoord2i(0, 1);
262 gGL.vertex2i(0, mHeight); 263 gGL.vertex2i(0, mHeight);
@@ -269,7 +270,7 @@ void LLVisualParamHint::draw()
269 } 270 }
270 gGL.end(); 271 gGL.end();
271 272
272 LLImageGL::unbindTexture(0, GL_TEXTURE_2D); 273 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
273} 274}
274 275
275//----------------------------------------------------------------------------- 276//-----------------------------------------------------------------------------
diff --git a/linden/indra/newview/lltoolplacer.cpp b/linden/indra/newview/lltoolplacer.cpp
index 30347be..721e59e 100644
--- a/linden/indra/newview/lltoolplacer.cpp
+++ b/linden/indra/newview/lltoolplacer.cpp
@@ -224,8 +224,8 @@ BOOL LLToolPlacer::addObject( LLPCode pcode, S32 x, S32 y, U8 use_physics )
224 // Play creation sound 224 // Play creation sound
225 if (gAudiop) 225 if (gAudiop)
226 { 226 {
227 F32 volume = gSavedSettings.getBOOL("MuteUI") ? 0.f : gSavedSettings.getF32("AudioLevelUI"); 227 gAudiop->triggerSound( LLUUID(gSavedSettings.getString("UISndObjectCreate")),
228 gAudiop->triggerSound( LLUUID(gSavedSettings.getString("UISndObjectCreate")), gAgent.getID(), volume); 228 gAgent.getID(), 1.0f, LLAudioEngine::AUDIO_TYPE_UI);
229 } 229 }
230 230
231 gMessageSystem->newMessageFast(_PREHASH_ObjectAdd); 231 gMessageSystem->newMessageFast(_PREHASH_ObjectAdd);
diff --git a/linden/indra/newview/lltoolselectrect.cpp b/linden/indra/newview/lltoolselectrect.cpp
index 26d9756..b7067dc 100644
--- a/linden/indra/newview/lltoolselectrect.cpp
+++ b/linden/indra/newview/lltoolselectrect.cpp
@@ -175,7 +175,7 @@ void LLToolSelectRect::draw()
175 { 175 {
176 gGL.color4f(1.f, 1.f, 0.f, 1.f); 176 gGL.color4f(1.f, 1.f, 0.f, 1.f);
177 } 177 }
178 LLGLSNoTexture gls_no_texture; 178 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
179 gl_rect_2d( 179 gl_rect_2d(
180 llmin(mDragStartX, mDragEndX), 180 llmin(mDragStartX, mDragEndX),
181 llmax(mDragStartY, mDragEndY), 181 llmax(mDragStartY, mDragEndY),
diff --git a/linden/indra/newview/lltracker.cpp b/linden/indra/newview/lltracker.cpp
index 8572283..82e6bf2 100644
--- a/linden/indra/newview/lltracker.cpp
+++ b/linden/indra/newview/lltracker.cpp
@@ -445,7 +445,7 @@ void draw_shockwave(F32 center_z, F32 t, S32 steps, LLColor4 color)
445 F32 y = 0.f; 445 F32 y = 0.f;
446 446
447 LLColor4 ccol = LLColor4(1,1,1,(1.f-t)*0.25f); 447 LLColor4 ccol = LLColor4(1,1,1,(1.f-t)*0.25f);
448 gGL.begin(LLVertexBuffer::TRIANGLE_FAN); 448 gGL.begin(LLRender::TRIANGLE_FAN);
449 gGL.color4fv(ccol.mV); 449 gGL.color4fv(ccol.mV);
450 gGL.vertex3f(0.f, 0.f, center_z); 450 gGL.vertex3f(0.f, 0.f, center_z);
451 // make sure circle is complete 451 // make sure circle is complete
@@ -494,7 +494,8 @@ void LLTracker::renderBeacon(LLVector3d pos_global,
494 494
495 LLVector3 pos_agent = gAgent.getPosAgentFromGlobal(pos_global); 495 LLVector3 pos_agent = gAgent.getPosAgentFromGlobal(pos_global);
496 496
497 LLGLSTracker gls_tracker; // default - TEXTURE + CULL_FACE + LIGHTING + GL_BLEND + GL_ALPHA_TEST 497 LLGLSTracker gls_tracker; // default+ CULL_FACE + LIGHTING + GL_BLEND + GL_ALPHA_TEST
498 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
498 LLGLDisable cull_face(GL_CULL_FACE); 499 LLGLDisable cull_face(GL_CULL_FACE);
499 LLGLDepthTest gls_depth(GL_TRUE, GL_FALSE); 500 LLGLDepthTest gls_depth(GL_TRUE, GL_FALSE);
500 501
@@ -535,7 +536,7 @@ void LLTracker::renderBeacon(LLVector3d pos_global,
535 an *= 2.f; 536 an *= 2.f;
536 an += 1.0f+dr; 537 an += 1.0f+dr;
537 538
538 gGL.begin(LLVertexBuffer::TRIANGLE_STRIP); 539 gGL.begin(LLRender::TRIANGLE_STRIP);
539 gGL.color4fv(col_edge.mV); 540 gGL.color4fv(col_edge.mV);
540 gGL.vertex3f(-x*a, -y*a, z); 541 gGL.vertex3f(-x*a, -y*a, z);
541 gGL.color4fv(col_edge_next.mV); 542 gGL.color4fv(col_edge_next.mV);
diff --git a/linden/indra/newview/lluserauth.cpp b/linden/indra/newview/lluserauth.cpp
index a9b00e1..bb6ee16 100644
--- a/linden/indra/newview/lluserauth.cpp
+++ b/linden/indra/newview/lluserauth.cpp
@@ -324,17 +324,29 @@ static void parseOptionInto(
324 while(opt) 324 while(opt)
325 { 325 {
326 key.assign(XMLRPC_GetValueID(opt)); 326 key.assign(XMLRPC_GetValueID(opt));
327 //llinfos "option key: " << key << llendl; 327 //llinfos << "option key: " << key << llendl;
328 type = XMLRPC_GetValueTypeEasy(opt); 328 type = XMLRPC_GetValueTypeEasy(opt);
329 if(xmlrpc_type_string == type) 329 if(xmlrpc_type_string == type)
330 { 330 {
331 val.assign(XMLRPC_GetValueString(opt)); 331 val.assign(XMLRPC_GetValueString(opt));
332 //llinfos << "string val: " << val << llendl;
332 } 333 }
333 else if(xmlrpc_type_int == type) 334 else if(xmlrpc_type_int == type)
334 { 335 {
335 val = llformat("%d", XMLRPC_GetValueInt(opt)); 336 val = llformat("%d", XMLRPC_GetValueInt(opt));
337 //llinfos << "int val: " << val << llendl;
336 } 338 }
337 //llinfos "option val: " << val << llendl; 339 else if(xmlrpc_type_double == type)
340 {
341 val = llformat("%g", XMLRPC_GetValueDouble(opt));
342 //llinfos << "double val: " << val << llendl;
343 }
344 else
345 { // Can't understand the type
346 val = "???";
347 //llinfos << "unknown value type: " << type << llendl;
348 }
349
338 responses.insert(LLUserAuth::response_t::value_type(key, val)); 350 responses.insert(LLUserAuth::response_t::value_type(key, val));
339 opt = XMLRPC_VectorNext(row); 351 opt = XMLRPC_VectorNext(row);
340 } 352 }
diff --git a/linden/indra/newview/llvelocitybar.cpp b/linden/indra/newview/llvelocitybar.cpp
index e8b9a74..3d5784f 100644
--- a/linden/indra/newview/llvelocitybar.cpp
+++ b/linden/indra/newview/llvelocitybar.cpp
@@ -63,7 +63,7 @@ void LLVelocityBar::draw()
63 // Set bar color 63 // Set bar color
64 // 64 //
65 65
66 LLGLSNoTexture gls_no_texture; 66 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
67 67
68 // draw background box 68 // draw background box
69 // gGL.color4f(0.f, 0.f, 0.f, 0.3f); 69 // gGL.color4f(0.f, 0.f, 0.f, 0.3f);
diff --git a/linden/indra/newview/llvieweraudio.cpp b/linden/indra/newview/llvieweraudio.cpp
index 122a0bc..23a685a 100644
--- a/linden/indra/newview/llvieweraudio.cpp
+++ b/linden/indra/newview/llvieweraudio.cpp
@@ -139,6 +139,14 @@ void audio_update_volume(bool force_update)
139 { 139 {
140 audio_update_wind(true); 140 audio_update_wind(true);
141 } 141 }
142
143 // handle secondary gains
144 gAudiop->setSecondaryGain(LLAudioEngine::AUDIO_TYPE_SFX,
145 gSavedSettings.getBOOL("MuteSounds") ? 0.f : gSavedSettings.getF32("AudioLevelSFX"));
146 gAudiop->setSecondaryGain(LLAudioEngine::AUDIO_TYPE_UI,
147 gSavedSettings.getBOOL("MuteUI") ? 0.f : gSavedSettings.getF32("AudioLevelUI"));
148 gAudiop->setSecondaryGain(LLAudioEngine::AUDIO_TYPE_AMBIENT,
149 gSavedSettings.getBOOL("MuteAmbient") ? 0.f : gSavedSettings.getF32("AudioLevelAmbient"));
142 } 150 }
143 151
144 // Streaming Music 152 // Streaming Music
diff --git a/linden/indra/newview/llviewerdisplay.cpp b/linden/indra/newview/llviewerdisplay.cpp
index 627609b..4db26a0 100644
--- a/linden/indra/newview/llviewerdisplay.cpp
+++ b/linden/indra/newview/llviewerdisplay.cpp
@@ -248,8 +248,11 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
248 248
249 gViewerWindow->checkSettings(); 249 gViewerWindow->checkSettings();
250 250
251 LLAppViewer::instance()->pingMainloopTimeout("Display:Pick"); 251 {
252 gViewerWindow->performPick(); 252 LLFastTimer ftm(LLFastTimer::FTM_PICK);
253 LLAppViewer::instance()->pingMainloopTimeout("Display:Pick");
254 gViewerWindow->performPick();
255 }
253 256
254 257
255 LLAppViewer::instance()->pingMainloopTimeout("Display:CheckStates"); 258 LLAppViewer::instance()->pingMainloopTimeout("Display:CheckStates");
@@ -373,6 +376,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
373 gAgent.setTeleportMessage( 376 gAgent.setTeleportMessage(
374 LLAgent::sTeleportProgressMessages["arriving"]); 377 LLAgent::sTeleportProgressMessages["arriving"]);
375 gImageList.mForceResetTextureStats = TRUE; 378 gImageList.mForceResetTextureStats = TRUE;
379 gAgent.resetView(TRUE, TRUE);
376 break; 380 break;
377 381
378 case LLAgent::TELEPORT_ARRIVING: 382 case LLAgent::TELEPORT_ARRIVING:
@@ -690,7 +694,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
690 // glMatrixMode(GL_MODELVIEW); 694 // glMatrixMode(GL_MODELVIEW);
691 // glPushMatrix(); 695 // glPushMatrix();
692 // { 696 // {
693 // LLGLSNoTexture gls_no_texture; 697 // gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
694 698
695 // glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_TRUE); 699 // glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_TRUE);
696 // glLoadIdentity(); 700 // glLoadIdentity();
@@ -997,8 +1001,8 @@ void render_ui()
997 1001
998void renderCoordinateAxes() 1002void renderCoordinateAxes()
999{ 1003{
1000 LLGLSNoTexture gls_no_texture; 1004 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
1001 gGL.begin(LLVertexBuffer::LINES); 1005 gGL.begin(LLRender::LINES);
1002 gGL.color3f(1.0f, 0.0f, 0.0f); // i direction = X-Axis = red 1006 gGL.color3f(1.0f, 0.0f, 0.0f); // i direction = X-Axis = red
1003 gGL.vertex3f(0.0f, 0.0f, 0.0f); 1007 gGL.vertex3f(0.0f, 0.0f, 0.0f);
1004 gGL.vertex3f(2.0f, 0.0f, 0.0f); 1008 gGL.vertex3f(2.0f, 0.0f, 0.0f);
@@ -1048,10 +1052,10 @@ void renderCoordinateAxes()
1048void draw_axes() 1052void draw_axes()
1049{ 1053{
1050 LLGLSUIDefault gls_ui; 1054 LLGLSUIDefault gls_ui;
1051 LLGLSNoTexture gls_no_texture; 1055 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
1052 // A vertical white line at origin 1056 // A vertical white line at origin
1053 LLVector3 v = gAgent.getPositionAgent(); 1057 LLVector3 v = gAgent.getPositionAgent();
1054 gGL.begin(LLVertexBuffer::LINES); 1058 gGL.begin(LLRender::LINES);
1055 gGL.color3f(1.0f, 1.0f, 1.0f); 1059 gGL.color3f(1.0f, 1.0f, 1.0f);
1056 gGL.vertex3f(0.0f, 0.0f, 0.0f); 1060 gGL.vertex3f(0.0f, 0.0f, 0.0f);
1057 gGL.vertex3f(0.0f, 0.0f, 40.0f); 1061 gGL.vertex3f(0.0f, 0.0f, 40.0f);
@@ -1194,7 +1198,7 @@ void render_disconnected_background()
1194 raw->expandToPowerOfTwo(); 1198 raw->expandToPowerOfTwo();
1195 gDisconnectedImagep->createGLTexture(0, raw); 1199 gDisconnectedImagep->createGLTexture(0, raw);
1196 gStartImageGL = gDisconnectedImagep; 1200 gStartImageGL = gDisconnectedImagep;
1197 LLImageGL::unbindTexture(0, GL_TEXTURE_2D); 1201 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
1198 } 1202 }
1199 1203
1200 // Make sure the progress view always fills the entire window. 1204 // Make sure the progress view always fills the entire window.
@@ -1213,10 +1217,10 @@ void render_disconnected_background()
1213 const LLVector2& display_scale = gViewerWindow->getDisplayScale(); 1217 const LLVector2& display_scale = gViewerWindow->getDisplayScale();
1214 glScalef(display_scale.mV[VX], display_scale.mV[VY], 1.f); 1218 glScalef(display_scale.mV[VX], display_scale.mV[VY], 1.f);
1215 1219
1216 LLViewerImage::bindTexture(gDisconnectedImagep); 1220 gGL.getTexUnit(0)->bind(gDisconnectedImagep);
1217 gGL.color4f(1.f, 1.f, 1.f, 1.f); 1221 gGL.color4f(1.f, 1.f, 1.f, 1.f);
1218 gl_rect_2d_simple_tex(width, height); 1222 gl_rect_2d_simple_tex(width, height);
1219 LLImageGL::unbindTexture(0, GL_TEXTURE_2D); 1223 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
1220 } 1224 }
1221 glPopMatrix(); 1225 glPopMatrix();
1222 } 1226 }
diff --git a/linden/indra/newview/llviewerimage.cpp b/linden/indra/newview/llviewerimage.cpp
index 0b70f51..6ad6ca2 100644
--- a/linden/indra/newview/llviewerimage.cpp
+++ b/linden/indra/newview/llviewerimage.cpp
@@ -149,23 +149,13 @@ F32 texmem_middle_bound_scale = 0.925f;
149//static 149//static
150void LLViewerImage::updateClass(const F32 velocity, const F32 angular_velocity) 150void LLViewerImage::updateClass(const F32 velocity, const F32 angular_velocity)
151{ 151{
152 sBoundTextureMemory = LLImageGL::sBoundTextureMemory; 152 sBoundTextureMemory = LLImageGL::sBoundTextureMemory;//in bytes
153 sTotalTextureMemory = LLImageGL::sGlobalTextureMemory; 153 sTotalTextureMemory = LLImageGL::sGlobalTextureMemory;//in bytes
154 sMaxBoundTextureMem = gImageList.getMaxResidentTexMem(); 154 sMaxBoundTextureMem = gImageList.getMaxResidentTexMem();//in MB
155 155 sMaxTotalTextureMem = gImageList.getMaxTotalTextureMem() ;//in MB
156 sMaxTotalTextureMem = sMaxBoundTextureMem * 2; 156
157 if (sMaxBoundTextureMem > 64000000) 157 if ((sBoundTextureMemory >> 20) >= sMaxBoundTextureMem ||
158 { 158 (sTotalTextureMemory >> 20) >= sMaxTotalTextureMem)
159 sMaxTotalTextureMem -= sMaxBoundTextureMem/4;
160 }
161
162 if ((U32)sMaxTotalTextureMem > gSysMemory.getPhysicalMemoryClamped() - (U32)min_non_tex_system_mem)
163 {
164 sMaxTotalTextureMem = (S32)gSysMemory.getPhysicalMemoryClamped() - min_non_tex_system_mem;
165 }
166
167 if (sBoundTextureMemory >= sMaxBoundTextureMem ||
168 sTotalTextureMemory >= sMaxTotalTextureMem)
169 { 159 {
170 // If we are using more texture memory than we should, 160 // If we are using more texture memory than we should,
171 // scale up the desired discard level 161 // scale up the desired discard level
@@ -176,8 +166,8 @@ void LLViewerImage::updateClass(const F32 velocity, const F32 angular_velocity)
176 } 166 }
177 } 167 }
178 else if (sDesiredDiscardBias > 0.0f && 168 else if (sDesiredDiscardBias > 0.0f &&
179 sBoundTextureMemory < sMaxBoundTextureMem*texmem_lower_bound_scale && 169 (sBoundTextureMemory >> 20) < sMaxBoundTextureMem*texmem_lower_bound_scale &&
180 sTotalTextureMemory < sMaxTotalTextureMem*texmem_lower_bound_scale) 170 (sTotalTextureMemory >> 20) < sMaxTotalTextureMem*texmem_lower_bound_scale)
181 { 171 {
182 // If we are using less texture memory than we should, 172 // If we are using less texture memory than we should,
183 // scale down the desired discard level 173 // scale down the desired discard level
@@ -1210,45 +1200,58 @@ void LLViewerImage::setKnownDrawSize(S32 width, S32 height)
1210} 1200}
1211 1201
1212// virtual 1202// virtual
1213BOOL LLViewerImage::bind(S32 stage) const 1203bool LLViewerImage::bindError(S32 stage) const
1214{ 1204{
1215 if (stage == -1) 1205 if (stage < 0) return false;
1206
1207 if (gNoRender)
1216 { 1208 {
1217 return TRUE; 1209 return false;
1218 } 1210 }
1211
1212 bool res = true;
1219 1213
1220 if (gNoRender) 1214 // On failure to bind, what should we set the currently bound texture to?
1215 if (mIsMissingAsset && !sMissingAssetImagep.isNull() && (this != (LLImageGL *)sMissingAssetImagep))
1221 { 1216 {
1222 return true; 1217 res = gGL.getTexUnit(stage)->bind(sMissingAssetImagep.get());
1223 } 1218 }
1224 BOOL res = bindTextureInternal(stage); 1219 if (!res && !sDefaultImagep.isNull() && (this != (LLImageGL *)sDefaultImagep))
1225 if (res)
1226 { 1220 {
1227 //llassert_always(mIsMissingAsset == FALSE); 1221 // use default if we've got it
1228 1222 res = gGL.getTexUnit(stage)->bind(sDefaultImagep.get());
1229 } 1223 }
1230 else 1224 if (!res && !sNullImagep.isNull() && (this != (LLImageGL *)sNullImagep))
1231 { 1225 {
1232 // On failure to bind, what should we set the currently bound texture to? 1226 res = gGL.getTexUnit(stage)->bind(sNullImagep.get());
1233 if (mIsMissingAsset && !sMissingAssetImagep.isNull() && (this != (LLImageGL *)sMissingAssetImagep)) 1227 }
1234 { 1228 if (!res)
1235 res = sMissingAssetImagep->bind( stage ); 1229 {
1236 } 1230 llwarns << "LLViewerImage::bindError failed." << llendl;
1237 if (!res && !sDefaultImagep.isNull() && (this != (LLImageGL *)sDefaultImagep))
1238 {
1239 // use default if we've got it
1240 res = sDefaultImagep->bind(stage);
1241 }
1242 if (!res && !sNullImagep.isNull() && (this != (LLImageGL *)sNullImagep))
1243 {
1244 res = sNullImagep->bind(stage);
1245 }
1246 if (!res)
1247 {
1248 llwarns << "LLViewerImage::bindTexture failed." << llendl;
1249 }
1250 stop_glerror();
1251 } 1231 }
1232 stop_glerror();
1233 return res;
1234}
1235
1236bool LLViewerImage::bindDefaultImage(S32 stage) const
1237{
1238 if (stage < 0) return false;
1239
1240 bool res = true;
1241 if (!sDefaultImagep.isNull() && (this != (LLImageGL *)sDefaultImagep))
1242 {
1243 // use default if we've got it
1244 res = gGL.getTexUnit(stage)->bind(sDefaultImagep.get());
1245 }
1246 if (!res && !sNullImagep.isNull() && (this != (LLImageGL *)sNullImagep))
1247 {
1248 res = gGL.getTexUnit(stage)->bind(sNullImagep.get());
1249 }
1250 if (!res)
1251 {
1252 llwarns << "LLViewerImage::bindError failed." << llendl;
1253 }
1254 stop_glerror();
1252 return res; 1255 return res;
1253} 1256}
1254 1257
diff --git a/linden/indra/newview/llviewerimage.h b/linden/indra/newview/llviewerimage.h
index 60d9fb8..523f66a 100644
--- a/linden/indra/newview/llviewerimage.h
+++ b/linden/indra/newview/llviewerimage.h
@@ -86,17 +86,6 @@ public:
86 static LLViewerImage * getImage(const LLUUID &image_id); 86 static LLViewerImage * getImage(const LLUUID &image_id);
87 // lightweight wrapper for gImageList.getImage() 87 // lightweight wrapper for gImageList.getImage()
88 88
89 static BOOL bindTexture(LLImageGL* image, const U32 stage = 0)
90 {
91 if (image)
92 {
93 return image->bind(stage);
94 }
95 else
96 {
97 return sDefaultImagep->bind(stage);
98 }
99 }
100 89
101 struct Compare 90 struct Compare
102 { 91 {
@@ -189,7 +178,8 @@ public:
189 178
190 /*virtual*/ void dump(); // debug info to llinfos 179 /*virtual*/ void dump(); // debug info to llinfos
191 180
192 /*virtual*/ BOOL bind(const S32 stage = 0) const; 181 /*virtual*/ bool bindError(const S32 stage = 0) const;
182 /*virtual*/ bool bindDefaultImage(const S32 stage = 0) const;
193 183
194 void reinit(BOOL usemipmaps = TRUE); 184 void reinit(BOOL usemipmaps = TRUE);
195 185
diff --git a/linden/indra/newview/llviewerimagelist.cpp b/linden/indra/newview/llviewerimagelist.cpp
index a79a76a..1e58fce 100644
--- a/linden/indra/newview/llviewerimagelist.cpp
+++ b/linden/indra/newview/llviewerimagelist.cpp
@@ -89,7 +89,8 @@ LLStat LLViewerImageList::sFormattedMemStat(32, TRUE);
89LLViewerImageList::LLViewerImageList() 89LLViewerImageList::LLViewerImageList()
90 : mForceResetTextureStats(FALSE), 90 : mForceResetTextureStats(FALSE),
91 mUpdateStats(FALSE), 91 mUpdateStats(FALSE),
92 mMaxResidentTexMem(0) 92 mMaxResidentTexMem(0),
93 mMaxTotalTextureMem(0)
93{ 94{
94} 95}
95 96
@@ -97,6 +98,7 @@ void LLViewerImageList::init()
97{ 98{
98 sNumImages = 0; 99 sNumImages = 0;
99 mMaxResidentTexMem = 0; 100 mMaxResidentTexMem = 0;
101 mMaxTotalTextureMem = 0 ;
100 102
101 if (gNoRender) 103 if (gNoRender)
102 { 104 {
@@ -918,12 +920,14 @@ LLPointer<LLImageJ2C> LLViewerImageList::convertToUploadFile(LLPointer<LLImageRa
918} 920}
919 921
920const S32 MIN_VIDEO_RAM = 32; 922const S32 MIN_VIDEO_RAM = 32;
921const S32 MAX_VIDEO_RAM = 2048; 923const S32 MAX_VIDEO_RAM = 512; // 512MB max for performance reasons.
922 924
923// Returns min setting for TextureMemory (in MB) 925// Returns min setting for TextureMemory (in MB)
924S32 LLViewerImageList::getMinVideoRamSetting() 926S32 LLViewerImageList::getMinVideoRamSetting()
925{ 927{
926 return MIN_VIDEO_RAM; 928 S32 system_ram = (S32)(gSysMemory.getPhysicalMemoryClamped() >> 20);
929 //min texture mem sets to 128M if total physical mem is more than 1.5GB
930 return (system_ram > 1500) ? 128 : MIN_VIDEO_RAM;
927} 931}
928 932
929//static 933//static
@@ -956,8 +960,8 @@ S32 LLViewerImageList::getMaxVideoRamSetting(bool get_recommended)
956 max_texmem = llmin(max_texmem, (S32)(system_ram/2)); 960 max_texmem = llmin(max_texmem, (S32)(system_ram/2));
957 else 961 else
958 max_texmem = llmin(max_texmem, (S32)(system_ram)); 962 max_texmem = llmin(max_texmem, (S32)(system_ram));
959 963
960 max_texmem = llclamp(max_texmem, MIN_VIDEO_RAM, MAX_VIDEO_RAM); 964 max_texmem = llclamp(max_texmem, getMinVideoRamSetting(), MAX_VIDEO_RAM);
961 965
962 return max_texmem; 966 return max_texmem;
963} 967}
@@ -994,7 +998,18 @@ void LLViewerImageList::updateMaxResidentTexMem(S32 mem)
994 998
995 S32 vb_mem = mem; 999 S32 vb_mem = mem;
996 S32 fb_mem = llmax(VIDEO_CARD_FRAMEBUFFER_MEM, vb_mem/4); 1000 S32 fb_mem = llmax(VIDEO_CARD_FRAMEBUFFER_MEM, vb_mem/4);
997 mMaxResidentTexMem = (vb_mem - fb_mem)<<20; 1001 mMaxResidentTexMem = (vb_mem - fb_mem) ; //in MB
1002
1003 mMaxTotalTextureMem = mMaxResidentTexMem * 2;
1004 if (mMaxResidentTexMem > 640)
1005 {
1006 mMaxTotalTextureMem -= (mMaxResidentTexMem >> 2);
1007 }
1008
1009 if (mMaxTotalTextureMem > (S32)(gSysMemory.getPhysicalMemoryClamped() >> 20) - 128)
1010 {
1011 mMaxTotalTextureMem = (gSysMemory.getPhysicalMemoryClamped() >> 20) - 128 ;
1012 }
998 1013
999 llinfos << "Total Video Memory set to: " << vb_mem << " MB" << llendl; 1014 llinfos << "Total Video Memory set to: " << vb_mem << " MB" << llendl;
1000 llinfos << "Available Texture Memory set to: " << (vb_mem - fb_mem) << " MB" << llendl; 1015 llinfos << "Available Texture Memory set to: " << (vb_mem - fb_mem) << " MB" << llendl;
diff --git a/linden/indra/newview/llviewerimagelist.h b/linden/indra/newview/llviewerimagelist.h
index 8aa9913..1f1a122 100644
--- a/linden/indra/newview/llviewerimagelist.h
+++ b/linden/indra/newview/llviewerimagelist.h
@@ -129,6 +129,7 @@ public:
129 void setUpdateStats(BOOL b) { mUpdateStats = b; } 129 void setUpdateStats(BOOL b) { mUpdateStats = b; }
130 130
131 S32 getMaxResidentTexMem() const { return mMaxResidentTexMem; } 131 S32 getMaxResidentTexMem() const { return mMaxResidentTexMem; }
132 S32 getMaxTotalTextureMem() const { return mMaxTotalTextureMem;}
132 S32 getNumImages() { return mImageList.size(); } 133 S32 getNumImages() { return mImageList.size(); }
133 134
134 void updateMaxResidentTexMem(S32 mem); 135 void updateMaxResidentTexMem(S32 mem);
@@ -170,6 +171,7 @@ private:
170 171
171 BOOL mUpdateStats; 172 BOOL mUpdateStats;
172 S32 mMaxResidentTexMem; 173 S32 mMaxResidentTexMem;
174 S32 mMaxTotalTextureMem;
173 LLFrameTimer mForceDecodeTimer; 175 LLFrameTimer mForceDecodeTimer;
174 176
175public: 177public:
diff --git a/linden/indra/newview/llviewerinventory.cpp b/linden/indra/newview/llviewerinventory.cpp
index 6d9d685..0323bb7 100644
--- a/linden/indra/newview/llviewerinventory.cpp
+++ b/linden/indra/newview/llviewerinventory.cpp
@@ -196,15 +196,34 @@ void LLViewerInventoryItem::fetchFromServer(void) const
196{ 196{
197 if(!mIsComplete) 197 if(!mIsComplete)
198 { 198 {
199 LLMessageSystem* msg = gMessageSystem; 199 std::string url;
200 msg->newMessage("FetchInventory"); 200
201 msg->nextBlock("AgentData"); 201 if( ALEXANDRIA_LINDEN_ID.getString() == mPermissions.getOwner().getString())
202 msg->addUUID("AgentID", gAgent.getID()); 202 url = gAgent.getRegion()->getCapability("FetchLib");
203 msg->addUUID("SessionID", gAgent.getSessionID()); 203 else
204 msg->nextBlock("InventoryData"); 204 url = gAgent.getRegion()->getCapability("FetchInventory");
205 msg->addUUID("OwnerID", mPermissions.getOwner()); 205
206 msg->addUUID("ItemID", mUUID); 206 if (!url.empty())
207 gAgent.sendReliableMessage(); 207 {
208 LLSD body;
209 body["agent_id"] = gAgent.getID();
210 body["items"][0]["owner_id"] = mPermissions.getOwner();
211 body["items"][0]["item_id"] = mUUID;
212
213 LLHTTPClient::post(url, body, new LLInventoryModel::fetchInventoryResponder(body));
214 }
215 else
216 {
217 LLMessageSystem* msg = gMessageSystem;
218 msg->newMessage("FetchInventory");
219 msg->nextBlock("AgentData");
220 msg->addUUID("AgentID", gAgent.getID());
221 msg->addUUID("SessionID", gAgent.getSessionID());
222 msg->nextBlock("InventoryData");
223 msg->addUUID("OwnerID", mPermissions.getOwner());
224 msg->addUUID("ItemID", mUUID);
225 gAgent.sendReliableMessage();
226 }
208 } 227 }
209 else 228 else
210 { 229 {
@@ -441,7 +460,7 @@ bool LLViewerInventoryCategory::fetchDescendents()
441 // This comes from LLInventoryFilter from llfolderview.h 460 // This comes from LLInventoryFilter from llfolderview.h
442 U32 sort_order = gSavedSettings.getU32("InventorySortOrder") & 0x1; 461 U32 sort_order = gSavedSettings.getU32("InventorySortOrder") & 0x1;
443 462
444 std::string url = gAgent.getRegion()->getCapability("FetchInventoryDescendents"); 463 std::string url = gAgent.getRegion()->getCapability("WebFetchInventoryDescendents");
445 464
446 if (!url.empty()) //Capability found. Build up LLSD and use it. 465 if (!url.empty()) //Capability found. Build up LLSD and use it.
447 { 466 {
@@ -449,7 +468,7 @@ bool LLViewerInventoryCategory::fetchDescendents()
449 } 468 }
450 else 469 else
451 { //Deprecated, but if we don't have a capability, use the old system. 470 { //Deprecated, but if we don't have a capability, use the old system.
452 llinfos << "FetchInventoryDescendents capability not found. Using deprecated UDP message." << llendl; 471 llinfos << "WebFetchInventoryDescendents capability not found. Using deprecated UDP message." << llendl;
453 LLMessageSystem* msg = gMessageSystem; 472 LLMessageSystem* msg = gMessageSystem;
454 msg->newMessage("FetchInventoryDescendents"); 473 msg->newMessage("FetchInventoryDescendents");
455 msg->nextBlock("AgentData"); 474 msg->nextBlock("AgentData");
diff --git a/linden/indra/newview/llviewerjoint.cpp b/linden/indra/newview/llviewerjoint.cpp
index 914448e..d0359d6 100644
--- a/linden/indra/newview/llviewerjoint.cpp
+++ b/linden/indra/newview/llviewerjoint.cpp
@@ -149,7 +149,7 @@ void LLViewerJoint::setValid( BOOL valid, BOOL recursive )
149// //---------------------------------------------------------------- 149// //----------------------------------------------------------------
150// if (mComponents & SC_AXES) 150// if (mComponents & SC_AXES)
151// { 151// {
152// gGL.begin(LLVertexBuffer::LINES); 152// gGL.begin(LLRender::LINES);
153// gGL.color3f( 1.0f, 0.0f, 0.0f ); 153// gGL.color3f( 1.0f, 0.0f, 0.0f );
154// gGL.vertex3f( 0.0f, 0.0f, 0.0f ); 154// gGL.vertex3f( 0.0f, 0.0f, 0.0f );
155// gGL.vertex3f( 0.1f, 0.0f, 0.0f ); 155// gGL.vertex3f( 0.1f, 0.0f, 0.0f );
@@ -171,7 +171,7 @@ void LLViewerJoint::setValid( BOOL valid, BOOL recursive )
171// { 171// {
172// gGL.color3f( 1.0f, 1.0f, 0.0f ); 172// gGL.color3f( 1.0f, 1.0f, 0.0f );
173 173
174// gGL.begin(LLVertexBuffer::TRIANGLES); 174// gGL.begin(LLRender::TRIANGLES);
175 175
176// // joint top half 176// // joint top half
177// glNormal3f(nc, nc, nc); 177// glNormal3f(nc, nc, nc);
@@ -362,7 +362,7 @@ U32 LLViewerJoint::render( F32 pixelArea, BOOL first_pass )
362// // render the bone 362// // render the bone
363// gGL.color3f( 0.5f, 0.5f, 0.0f ); 363// gGL.color3f( 0.5f, 0.5f, 0.0f );
364 364
365// gGL.begin(LLVertexBuffer::TRIANGLES); 365// gGL.begin(LLRender::TRIANGLES);
366 366
367// gGL.vertex3f( length, 0.0f, 0.0f); 367// gGL.vertex3f( length, 0.0f, 0.0f);
368// gGL.vertex3f( 0.0f, boneSize, 0.0f); 368// gGL.vertex3f( 0.0f, boneSize, 0.0f);
@@ -524,14 +524,69 @@ LLViewerJointCollisionVolume::LLViewerJointCollisionVolume(const std::string &na
524void LLViewerJointCollisionVolume::renderCollision() 524void LLViewerJointCollisionVolume::renderCollision()
525{ 525{
526 updateWorldMatrix(); 526 updateWorldMatrix();
527 glMatrixMode(GL_MODELVIEW); 527
528 glPushMatrix(); 528 gGL.pushMatrix();
529 glMultMatrixf( &mXform.getWorldMatrix().mMatrix[0][0] ); 529 glMultMatrixf( &mXform.getWorldMatrix().mMatrix[0][0] );
530 530
531 glColor3f( 0.f, 0.f, 1.f ); 531 gGL.color3f( 0.f, 0.f, 1.f );
532 gSphere.render(); 532
533 gGL.begin(LLRender::LINES);
534
535 LLVector3 v[] =
536 {
537 LLVector3(1,0,0),
538 LLVector3(-1,0,0),
539 LLVector3(0,1,0),
540 LLVector3(0,-1,0),
541
542 LLVector3(0,0,-1),
543 LLVector3(0,0,1),
544 };
545
546 //sides
547 gGL.vertex3fv(v[0].mV);
548 gGL.vertex3fv(v[2].mV);
549
550 gGL.vertex3fv(v[0].mV);
551 gGL.vertex3fv(v[3].mV);
552
553 gGL.vertex3fv(v[1].mV);
554 gGL.vertex3fv(v[2].mV);
555
556 gGL.vertex3fv(v[1].mV);
557 gGL.vertex3fv(v[3].mV);
558
559
560 //top
561 gGL.vertex3fv(v[0].mV);
562 gGL.vertex3fv(v[4].mV);
563
564 gGL.vertex3fv(v[1].mV);
565 gGL.vertex3fv(v[4].mV);
566
567 gGL.vertex3fv(v[2].mV);
568 gGL.vertex3fv(v[4].mV);
569
570 gGL.vertex3fv(v[3].mV);
571 gGL.vertex3fv(v[4].mV);
572
573
574 //bottom
575 gGL.vertex3fv(v[0].mV);
576 gGL.vertex3fv(v[5].mV);
577
578 gGL.vertex3fv(v[1].mV);
579 gGL.vertex3fv(v[5].mV);
580
581 gGL.vertex3fv(v[2].mV);
582 gGL.vertex3fv(v[5].mV);
583
584 gGL.vertex3fv(v[3].mV);
585 gGL.vertex3fv(v[5].mV);
586
587 gGL.end();
533 588
534 glPopMatrix(); 589 gGL.popMatrix();
535} 590}
536 591
537LLVector3 LLViewerJointCollisionVolume::getVolumePos(LLVector3 &offset) 592LLVector3 LLViewerJointCollisionVolume::getVolumePos(LLVector3 &offset)
diff --git a/linden/indra/newview/llviewerjointattachment.cpp b/linden/indra/newview/llviewerjointattachment.cpp
index 4b58361..42b8d9a 100644
--- a/linden/indra/newview/llviewerjointattachment.cpp
+++ b/linden/indra/newview/llviewerjointattachment.cpp
@@ -91,7 +91,7 @@ U32 LLViewerJointAttachment::drawShape( F32 pixelArea, BOOL first_pass )
91 LLGLDisable cull_face(GL_CULL_FACE); 91 LLGLDisable cull_face(GL_CULL_FACE);
92 92
93 gGL.color4f(1.f, 1.f, 1.f, 1.f); 93 gGL.color4f(1.f, 1.f, 1.f, 1.f);
94 gGL.begin(LLVertexBuffer::QUADS); 94 gGL.begin(LLRender::QUADS);
95 { 95 {
96 gGL.vertex3f(-0.1f, 0.1f, 0.f); 96 gGL.vertex3f(-0.1f, 0.1f, 0.f);
97 gGL.vertex3f(-0.1f, -0.1f, 0.f); 97 gGL.vertex3f(-0.1f, -0.1f, 0.f);
diff --git a/linden/indra/newview/llviewerjointmesh.cpp b/linden/indra/newview/llviewerjointmesh.cpp
index b590907..5c2002b 100644
--- a/linden/indra/newview/llviewerjointmesh.cpp
+++ b/linden/indra/newview/llviewerjointmesh.cpp
@@ -537,7 +537,7 @@ U32 LLViewerJointMesh::drawShape( F32 pixelArea, BOOL first_pass)
537 537
538 if (mTestImageName) 538 if (mTestImageName)
539 { 539 {
540 LLImageGL::bindExternalTexture( mTestImageName, 0, GL_TEXTURE_2D ); 540 gGL.getTexUnit(0)->bindManual(LLTexUnit::TT_TEXTURE, mTestImageName);
541 541
542 if (mIsTransparent) 542 if (mIsTransparent)
543 { 543 {
@@ -553,12 +553,12 @@ U32 LLViewerJointMesh::drawShape( F32 pixelArea, BOOL first_pass)
553 { 553 {
554 if( mLayerSet->hasComposite() ) 554 if( mLayerSet->hasComposite() )
555 { 555 {
556 mLayerSet->getComposite()->bindTexture(); 556 gGL.getTexUnit(0)->bind(mLayerSet->getComposite()->getTexture());
557 } 557 }
558 else 558 else
559 { 559 {
560 llwarns << "Layerset without composite" << llendl; 560 llwarns << "Layerset without composite" << llendl;
561 gImageList.getImage(IMG_DEFAULT)->bind(); 561 gGL.getTexUnit(0)->bind(gImageList.getImage(IMG_DEFAULT));
562 } 562 }
563 } 563 }
564 else 564 else
@@ -566,13 +566,13 @@ U32 LLViewerJointMesh::drawShape( F32 pixelArea, BOOL first_pass)
566 { 566 {
567 if (!mTexture->getClampS() || !mTexture->getClampT()) 567 if (!mTexture->getClampS() || !mTexture->getClampT())
568 { 568 {
569 mTexture->bind(); 569 gGL.getTexUnit(0)->bind(mTexture.get());
570 mTexture->overrideClamp (TRUE, TRUE); 570 mTexture->overrideClamp (TRUE, TRUE);
571 } 571 }
572 } 572 }
573 else 573 else
574 { 574 {
575 gImageList.getImage(IMG_DEFAULT_AVATAR)->bind(); 575 gGL.getTexUnit(0)->bind(gImageList.getImage(IMG_DEFAULT_AVATAR));
576 } 576 }
577 577
578 if (gRenderForSelect) 578 if (gRenderForSelect)
@@ -584,7 +584,7 @@ U32 LLViewerJointMesh::drawShape( F32 pixelArea, BOOL first_pass)
584 } 584 }
585 else 585 else
586 { 586 {
587 LLImageGL::unbindTexture(0); 587 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
588 } 588 }
589 } 589 }
590 590
@@ -605,14 +605,14 @@ U32 LLViewerJointMesh::drawShape( F32 pixelArea, BOOL first_pass)
605 } 605 }
606 } 606 }
607 607
608 mFace->mVertexBuffer->drawRange(LLVertexBuffer::TRIANGLES, start, end, count, offset); 608 mFace->mVertexBuffer->drawRange(LLRender::TRIANGLES, start, end, count, offset);
609 } 609 }
610 else 610 else
611 { 611 {
612 glPushMatrix(); 612 glPushMatrix();
613 LLMatrix4 jointToWorld = getWorldMatrix(); 613 LLMatrix4 jointToWorld = getWorldMatrix();
614 glMultMatrixf((GLfloat*)jointToWorld.mMatrix); 614 glMultMatrixf((GLfloat*)jointToWorld.mMatrix);
615 mFace->mVertexBuffer->drawRange(LLVertexBuffer::TRIANGLES, start, end, count, offset); 615 mFace->mVertexBuffer->drawRange(LLRender::TRIANGLES, start, end, count, offset);
616 glPopMatrix(); 616 glPopMatrix();
617 } 617 }
618 gPipeline.addTrianglesDrawn(count/3); 618 gPipeline.addTrianglesDrawn(count/3);
@@ -626,7 +626,7 @@ U32 LLViewerJointMesh::drawShape( F32 pixelArea, BOOL first_pass)
626 626
627 if (mTexture.notNull()) 627 if (mTexture.notNull())
628 { 628 {
629 mTexture->bind(); 629 gGL.getTexUnit(0)->bind(mTexture.get());
630 mTexture->restoreClamp(); 630 mTexture->restoreClamp();
631 } 631 }
632 632
diff --git a/linden/indra/newview/llviewermedia.cpp b/linden/indra/newview/llviewermedia.cpp
index e99c838..00639cc 100644
--- a/linden/indra/newview/llviewermedia.cpp
+++ b/linden/indra/newview/llviewermedia.cpp
@@ -552,6 +552,7 @@ void LLViewerMedia::buildMediaManagerData( LLMediaManagerData* init_data )
552// static 552// static
553void LLViewerMedia::cleanupClass() 553void LLViewerMedia::cleanupClass()
554{ 554{
555 stop() ;
555 LLMediaManager::cleanupClass(); 556 LLMediaManager::cleanupClass();
556} 557}
557 558
diff --git a/linden/indra/newview/llviewermenu.cpp b/linden/indra/newview/llviewermenu.cpp
index c2a8055..9782d4b 100644
--- a/linden/indra/newview/llviewermenu.cpp
+++ b/linden/indra/newview/llviewermenu.cpp
@@ -85,6 +85,7 @@
85#include "llfloateranimpreview.h" 85#include "llfloateranimpreview.h"
86#include "llfloateravatarinfo.h" 86#include "llfloateravatarinfo.h"
87#include "llfloateravatartextures.h" 87#include "llfloateravatartextures.h"
88#include "llfloaterbeacons.h"
88#include "llfloaterbuildoptions.h" 89#include "llfloaterbuildoptions.h"
89#include "llfloaterbump.h" 90#include "llfloaterbump.h"
90#include "llfloaterbuy.h" 91#include "llfloaterbuy.h"
@@ -323,13 +324,6 @@ void handle_talk_to(void *userdata);
323// Debug menu 324// Debug menu
324void show_permissions_control(void*); 325void show_permissions_control(void*);
325void toggle_build_options(void* user_data); 326void toggle_build_options(void* user_data);
326#if 0 // Unused
327void handle_audio_status_1(void*);
328void handle_audio_status_2(void*);
329void handle_audio_status_3(void*);
330void handle_audio_status_4(void*);
331#endif
332void manage_landmarks(void*);
333void reload_ui(void*); 327void reload_ui(void*);
334void handle_agent_stop_moving(void*); 328void handle_agent_stop_moving(void*);
335void print_packets_lost(void*); 329void print_packets_lost(void*);
@@ -795,12 +789,6 @@ void init_client_menu(LLMenuGL* menu)
795 &menu_check_control, 789 &menu_check_control,
796 (void*)"QuietSnapshotsToDisk")); 790 (void*)"QuietSnapshotsToDisk"));
797 791
798 menu->append(new LLMenuItemCheckGL( "Compress Snapshots to Disk",
799 &menu_toggle_control,
800 NULL,
801 &menu_check_control,
802 (void*)"CompressSnapshotsToDisk"));
803
804 menu->append(new LLMenuItemCheckGL("Show Mouselook Crosshairs", 792 menu->append(new LLMenuItemCheckGL("Show Mouselook Crosshairs",
805 &menu_toggle_control, 793 &menu_toggle_control,
806 NULL, 794 NULL,
@@ -948,6 +936,7 @@ void init_client_menu(LLMenuGL* menu)
948 sub->append(new LLMenuItemCallGL("Force LLError And Crash", &force_error_llerror)); 936 sub->append(new LLMenuItemCallGL("Force LLError And Crash", &force_error_llerror));
949 sub->append(new LLMenuItemCallGL("Force Bad Memory Access", &force_error_bad_memory_access)); 937 sub->append(new LLMenuItemCallGL("Force Bad Memory Access", &force_error_bad_memory_access));
950 sub->append(new LLMenuItemCallGL("Force Infinite Loop", &force_error_infinite_loop)); 938 sub->append(new LLMenuItemCallGL("Force Infinite Loop", &force_error_infinite_loop));
939 sub->append(new LLMenuItemCallGL("Force Disconnect Viewer", &handle_disconnect_viewer));
951 // *NOTE:Mani this isn't handled yet... sub->append(new LLMenuItemCallGL("Force Software Exception", &force_error_unhandled_exception)); 940 // *NOTE:Mani this isn't handled yet... sub->append(new LLMenuItemCallGL("Force Software Exception", &force_error_unhandled_exception));
952 sub->createJumpKeys(); 941 sub->createJumpKeys();
953 menu->appendMenu(sub); 942 menu->appendMenu(sub);
@@ -1162,10 +1151,6 @@ void init_debug_rendering_menu(LLMenuGL* menu)
1162 &LLPipeline::toggleRenderDebugFeature, NULL, 1151 &LLPipeline::toggleRenderDebugFeature, NULL,
1163 &LLPipeline::toggleRenderDebugFeatureControl, 1152 &LLPipeline::toggleRenderDebugFeatureControl,
1164 (void*)LLPipeline::RENDER_DEBUG_FEATURE_FOG, KEY_F6, MASK_ALT|MASK_CONTROL)); 1153 (void*)LLPipeline::RENDER_DEBUG_FEATURE_FOG, KEY_F6, MASK_ALT|MASK_CONTROL));
1165 sub_menu->append(new LLMenuItemCheckGL("Palletized Textures",
1166 &LLPipeline::toggleRenderDebugFeature, NULL,
1167 &LLPipeline::toggleRenderDebugFeatureControl,
1168 (void*)LLPipeline::RENDER_DEBUG_FEATURE_PALETTE, KEY_F7, MASK_ALT|MASK_CONTROL));
1169 sub_menu->append(new LLMenuItemCheckGL("Test FRInfo", 1154 sub_menu->append(new LLMenuItemCheckGL("Test FRInfo",
1170 &LLPipeline::toggleRenderDebugFeature, NULL, 1155 &LLPipeline::toggleRenderDebugFeature, NULL,
1171 &LLPipeline::toggleRenderDebugFeatureControl, 1156 &LLPipeline::toggleRenderDebugFeatureControl,
@@ -1216,9 +1201,6 @@ void init_debug_rendering_menu(LLMenuGL* menu)
1216 sub_menu->append(new LLMenuItemCheckGL("Face Area (sqrt(A))",&LLPipeline::toggleRenderDebug, NULL, 1201 sub_menu->append(new LLMenuItemCheckGL("Face Area (sqrt(A))",&LLPipeline::toggleRenderDebug, NULL,
1217 &LLPipeline::toggleRenderDebugControl, 1202 &LLPipeline::toggleRenderDebugControl,
1218 (void*)LLPipeline::RENDER_DEBUG_FACE_AREA)); 1203 (void*)LLPipeline::RENDER_DEBUG_FACE_AREA));
1219 sub_menu->append(new LLMenuItemCheckGL("Pick Render", &LLPipeline::toggleRenderDebug, NULL,
1220 &LLPipeline::toggleRenderDebugControl,
1221 (void*)LLPipeline::RENDER_DEBUG_PICKING));
1222 sub_menu->append(new LLMenuItemCheckGL("Lights", &LLPipeline::toggleRenderDebug, NULL, 1204 sub_menu->append(new LLMenuItemCheckGL("Lights", &LLPipeline::toggleRenderDebug, NULL,
1223 &LLPipeline::toggleRenderDebugControl, 1205 &LLPipeline::toggleRenderDebugControl,
1224 (void*)LLPipeline::RENDER_DEBUG_LIGHTS)); 1206 (void*)LLPipeline::RENDER_DEBUG_LIGHTS));
@@ -1237,9 +1219,7 @@ void init_debug_rendering_menu(LLMenuGL* menu)
1237 sub_menu->append(new LLMenuItemCheckGL("Sculpt", &LLPipeline::toggleRenderDebug, NULL, 1219 sub_menu->append(new LLMenuItemCheckGL("Sculpt", &LLPipeline::toggleRenderDebug, NULL,
1238 &LLPipeline::toggleRenderDebugControl, 1220 &LLPipeline::toggleRenderDebugControl,
1239 (void*)LLPipeline::RENDER_DEBUG_SCULPTED)); 1221 (void*)LLPipeline::RENDER_DEBUG_SCULPTED));
1240 1222
1241 sub_menu->append(new LLMenuItemToggleGL("Show Select Buffer", &gDebugSelect));
1242
1243 sub_menu->append(new LLMenuItemCallGL("Vectorize Perf Test", &run_vectorize_perf_test)); 1223 sub_menu->append(new LLMenuItemCallGL("Vectorize Perf Test", &run_vectorize_perf_test));
1244 1224
1245 sub_menu = new LLMenuGL("Render Tests"); 1225 sub_menu = new LLMenuGL("Render Tests");
@@ -1757,6 +1737,24 @@ class LLViewCheckJoystickFlycam : public view_listener_t
1757 } 1737 }
1758}; 1738};
1759 1739
1740class LLViewCommunicate : public view_listener_t
1741{
1742 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
1743 {
1744 if (LLFloaterChatterBox::getInstance()->getFloaterCount() == 0)
1745 {
1746 LLFloaterMyFriends::toggleInstance();
1747 }
1748 else
1749 {
1750 LLFloaterChatterBox::toggleInstance();
1751 }
1752
1753 return true;
1754 }
1755};
1756
1757
1760void handle_toggle_flycam() 1758void handle_toggle_flycam()
1761{ 1759{
1762 LLViewerJoystick::getInstance()->toggleFlycam(); 1760 LLViewerJoystick::getInstance()->toggleFlycam();
@@ -2225,37 +2223,71 @@ class LLAvatarDebug : public view_listener_t
2225 } 2223 }
2226}; 2224};
2227 2225
2226struct MenuCallbackData
2227{
2228 bool ban_enabled;
2229 LLUUID avatar_id;
2230};
2231
2228void callback_eject(S32 option, void* data) 2232void callback_eject(S32 option, void* data)
2229{ 2233{
2230 LLUUID* avatar_id = (LLUUID*) data; 2234 MenuCallbackData *callback_data = (MenuCallbackData*)data;
2235 if (!callback_data)
2236 {
2237 return;
2238 }
2239 if (2 == option)
2240 {
2241 // Cancle button.
2242 return;
2243 }
2244 LLUUID avatar_id = callback_data->avatar_id;
2245 bool ban_enabled = callback_data->ban_enabled;
2231 2246
2232 if (0 == option || 1 == option) 2247 if (0 == option)
2233 { 2248 {
2249 // Eject button
2234 LLMessageSystem* msg = gMessageSystem; 2250 LLMessageSystem* msg = gMessageSystem;
2235 LLViewerObject* avatar = gObjectList.findObject(*avatar_id); 2251 LLViewerObject* avatar = gObjectList.findObject(avatar_id);
2236 2252
2237 if (avatar) 2253 if (avatar)
2238 { 2254 {
2239 U32 flags = 0x0; 2255 U32 flags = 0x0;
2240 if (1 == option) 2256 msg->newMessage("EjectUser");
2241 { 2257 msg->nextBlock("AgentData");
2242 // eject and add to ban list 2258 msg->addUUID("AgentID", gAgent.getID() );
2243 flags |= 0x1; 2259 msg->addUUID("SessionID", gAgent.getSessionID() );
2244 } 2260 msg->nextBlock("Data");
2261 msg->addUUID("TargetID", avatar_id );
2262 msg->addU32("Flags", flags );
2263 msg->sendReliable( avatar->getRegion()->getHost() );
2264 }
2265 }
2266 else if (ban_enabled)
2267 {
2268 // This is tricky. It is similar to say if it is not an 'Eject' button,
2269 // and it is also not an 'Cancle' button, and ban_enabled==ture,
2270 // it should be the 'Eject and Ban' button.
2271 LLMessageSystem* msg = gMessageSystem;
2272 LLViewerObject* avatar = gObjectList.findObject(avatar_id);
2245 2273
2274 if (avatar)
2275 {
2276 U32 flags = 0x1;
2246 msg->newMessage("EjectUser"); 2277 msg->newMessage("EjectUser");
2247 msg->nextBlock("AgentData"); 2278 msg->nextBlock("AgentData");
2248 msg->addUUID("AgentID", gAgent.getID() ); 2279 msg->addUUID("AgentID", gAgent.getID() );
2249 msg->addUUID("SessionID", gAgent.getSessionID() ); 2280 msg->addUUID("SessionID", gAgent.getSessionID() );
2250 msg->nextBlock("Data"); 2281 msg->nextBlock("Data");
2251 msg->addUUID("TargetID", *avatar_id ); 2282 msg->addUUID("TargetID", avatar_id );
2252 msg->addU32("Flags", flags ); 2283 msg->addU32("Flags", flags );
2253 msg->sendReliable( avatar->getRegion()->getHost() ); 2284 msg->sendReliable( avatar->getRegion()->getHost() );
2254 } 2285 }
2255 } 2286 }
2256 2287
2257 delete avatar_id; 2288
2258 avatar_id = NULL; 2289 delete callback_data;
2290 callback_data = NULL;
2259} 2291}
2260 2292
2261class LLAvatarEject : public view_listener_t 2293class LLAvatarEject : public view_listener_t
@@ -2265,23 +2297,50 @@ class LLAvatarEject : public view_listener_t
2265 LLVOAvatar* avatar = find_avatar_from_object( LLSelectMgr::getInstance()->getSelection()->getPrimaryObject() ); 2297 LLVOAvatar* avatar = find_avatar_from_object( LLSelectMgr::getInstance()->getSelection()->getPrimaryObject() );
2266 if( avatar ) 2298 if( avatar )
2267 { 2299 {
2268 LLUUID* avatar_id = new LLUUID( avatar->getID() ); 2300 MenuCallbackData *data = new MenuCallbackData;
2301 (*data).avatar_id = avatar->getID();
2269 std::string fullname = avatar->getFullname(); 2302 std::string fullname = avatar->getFullname();
2270 2303
2271 if (!fullname.empty()) 2304 const LLVector3d& pos = avatar->getPositionGlobal();
2305 LLParcel* parcel = LLViewerParcelMgr::getInstance()->selectParcelAt(pos)->getParcel();
2306
2307 if (LLViewerParcelMgr::getInstance()->isParcelOwnedByAgent(parcel,GP_LAND_MANAGE_BANNED))
2272 { 2308 {
2273 LLStringUtil::format_map_t args; 2309 (*data).ban_enabled = true;
2274 args["[AVATAR_NAME]"] = fullname; 2310 if (!fullname.empty())
2275 gViewerWindow->alertXml("EjectAvatarFullname", 2311 {
2276 args, 2312 LLStringUtil::format_map_t args;
2277 callback_eject, 2313 args["[AVATAR_NAME]"] = fullname;
2278 (void*)avatar_id); 2314 gViewerWindow->alertXml("EjectAvatarFullname",
2315 args,
2316 callback_eject,
2317 (void*)data);
2318 }
2319 else
2320 {
2321 gViewerWindow->alertXml("EjectAvatar",
2322 callback_eject,
2323 (void*)data);
2324 }
2279 } 2325 }
2280 else 2326 else
2281 { 2327 {
2282 gViewerWindow->alertXml("EjectAvatar", 2328 (*data).ban_enabled = false;
2283 callback_eject, 2329 if (!fullname.empty())
2284 (void*)avatar_id); 2330 {
2331 LLStringUtil::format_map_t args;
2332 args["[AVATAR_NAME]"] = fullname;
2333 gViewerWindow->alertXml("EjectAvatarFullnameNoBan",
2334 args,
2335 callback_eject,
2336 (void*)data);
2337 }
2338 else
2339 {
2340 gViewerWindow->alertXml("EjectAvatarNoBan",
2341 callback_eject,
2342 (void*)data);
2343 }
2285 } 2344 }
2286 } 2345 }
2287 return true; 2346 return true;
@@ -2298,12 +2357,18 @@ class LLAvatarEnableFreezeEject : public view_listener_t
2298 if (new_value) 2357 if (new_value)
2299 { 2358 {
2300 const LLVector3& pos = avatar->getPositionRegion(); 2359 const LLVector3& pos = avatar->getPositionRegion();
2360 const LLVector3d& pos_global = avatar->getPositionGlobal();
2361 LLParcel* parcel = LLViewerParcelMgr::getInstance()->selectParcelAt(pos_global)->getParcel();
2301 LLViewerRegion* region = avatar->getRegion(); 2362 LLViewerRegion* region = avatar->getRegion();
2302 new_value = (region != NULL); 2363 new_value = (region != NULL);
2303 2364
2304 if (new_value) 2365 if (new_value)
2305 { 2366 {
2306 new_value = (region->isOwnedSelf(pos) || region->isOwnedGroup(pos)); 2367 new_value = region->isOwnedSelf(pos);
2368 if (!new_value || region->isOwnedGroup(pos))
2369 {
2370 new_value = LLViewerParcelMgr::getInstance()->isParcelOwnedByAgent(parcel,GP_LAND_ADMIN);
2371 }
2307 } 2372 }
2308 } 2373 }
2309 2374
@@ -2674,33 +2739,6 @@ void process_grant_godlike_powers(LLMessageSystem* msg, void**)
2674 } 2739 }
2675} 2740}
2676 2741
2677void load_url_local_file(const std::string& file_name)
2678{
2679 if( gAgent.cameraMouselook() )
2680 {
2681 gAgent.changeCameraToDefault();
2682 }
2683
2684#if LL_DARWIN || LL_LINUX || LL_SOLARIS
2685 // MBW -- If the Mac client is in fullscreen mode, it needs to go windowed so the browser will be visible.
2686 if(gViewerWindow->mWindow->getFullscreen())
2687 {
2688 gViewerWindow->toggleFullscreen(TRUE);
2689 }
2690#endif
2691
2692 // JC - system() blocks until IE has launched.
2693 // spawn() runs asynchronously, but opens a command prompt.
2694 // ShellExecute() just opens the damn file with the default
2695 // web browser.
2696 std::string full_path = "file:///";
2697 full_path.append(gDirUtilp->getAppRODataDir());
2698 full_path.append(gDirUtilp->getDirDelimiter());
2699 full_path.append(file_name);
2700
2701 LLWeb::loadURL(full_path);
2702}
2703
2704/* 2742/*
2705class LLHaveCallingcard : public LLInventoryCollectFunctor 2743class LLHaveCallingcard : public LLInventoryCollectFunctor
2706{ 2744{
@@ -2908,63 +2946,16 @@ void show_permissions_control(void*)
2908 floaterp->mPermissions->addPermissionsData("foo3", LLUUID::null, 0); 2946 floaterp->mPermissions->addPermissionsData("foo3", LLUUID::null, 0);
2909} 2947}
2910 2948
2911#if 0 // Unused (these just modify AudioInfoPage which is not used anywhere in the code
2912void handle_audio_status_1(void*)
2913{
2914 S32 page = gSavedSettings.getS32("AudioInfoPage");
2915 if (1 == page)
2916 {
2917 page = 0;
2918 }
2919 else
2920 {
2921 page = 1;
2922 }
2923 gSavedSettings.setS32("AudioInfoPage", page);
2924}
2925
2926void handle_audio_status_2(void*)
2927{
2928 S32 page = gSavedSettings.getS32("AudioInfoPage");
2929 if (2 == page)
2930 {
2931 page = 0;
2932 }
2933 else
2934 {
2935 page = 2;
2936 }
2937 gSavedSettings.setS32("AudioInfoPage", page);
2938}
2939
2940void handle_audio_status_3(void*)
2941{
2942 S32 page = gSavedSettings.getS32("AudioInfoPage");
2943 if (3 == page)
2944 {
2945 page = 0;
2946 }
2947 else
2948 {
2949 page = 3;
2950 }
2951 gSavedSettings.setS32("AudioInfoPage", page);
2952}
2953 2949
2954void handle_audio_status_4(void*) 2950class LLCreateLandmarkCallback : public LLInventoryCallback
2955{ 2951{
2956 S32 page = gSavedSettings.getS32("AudioInfoPage"); 2952public:
2957 if (4 == page) 2953 /*virtual*/ void fire(const LLUUID& inv_item)
2958 {
2959 page = 0;
2960 }
2961 else
2962 { 2954 {
2963 page = 4; 2955 llinfos << "Created landmark with inventory id " << inv_item
2956 << llendl;
2964 } 2957 }
2965 gSavedSettings.setS32("AudioInfoPage", page); 2958};
2966}
2967#endif
2968 2959
2969void reload_ui(void *) 2960void reload_ui(void *)
2970{ 2961{
@@ -3197,26 +3188,7 @@ void reset_view_final( BOOL proceed, void* )
3197 return; 3188 return;
3198 } 3189 }
3199 3190
3200 gAgent.changeCameraToDefault(); 3191 gAgent.resetView(TRUE, TRUE);
3201
3202 if (LLViewerJoystick::getInstance()->getOverrideCamera())
3203 {
3204 handle_toggle_flycam();
3205 }
3206
3207 // reset avatar mode from eventual residual motion
3208 if (LLToolMgr::getInstance()->inBuildMode())
3209 {
3210 LLViewerJoystick::getInstance()->moveAvatar(true);
3211 }
3212
3213 gAgent.resetView(!gFloaterTools->getVisible());
3214 gFloaterTools->close();
3215
3216 gViewerWindow->showCursor();
3217
3218 // Switch back to basic toolset
3219 LLToolMgr::getInstance()->setCurrentToolset(gBasicToolset);
3220} 3192}
3221 3193
3222class LLViewLookAtLastChatter : public view_listener_t 3194class LLViewLookAtLastChatter : public view_listener_t
@@ -4881,7 +4853,7 @@ class LLWorldCreateLandmark : public view_listener_t
4881 LLAssetType::AT_LANDMARK, 4853 LLAssetType::AT_LANDMARK,
4882 LLInventoryType::IT_LANDMARK, 4854 LLInventoryType::IT_LANDMARK,
4883 NOT_WEARABLE, PERM_ALL, 4855 NOT_WEARABLE, PERM_ALL,
4884 NULL); 4856 new LLCreateLandmarkCallback);
4885 return true; 4857 return true;
4886 } 4858 }
4887}; 4859};
@@ -5301,6 +5273,10 @@ class LLShowFloater : public view_listener_t
5301 { 5273 {
5302 LLFloaterActiveSpeakers::toggleInstance(LLSD()); 5274 LLFloaterActiveSpeakers::toggleInstance(LLSD());
5303 } 5275 }
5276 else if (floater_name == "beacons")
5277 {
5278 LLFloaterBeacons::toggleInstance(LLSD());
5279 }
5304 return true; 5280 return true;
5305 } 5281 }
5306}; 5282};
@@ -5348,6 +5324,10 @@ class LLFloaterVisible : public view_listener_t
5348 { 5324 {
5349 new_value = LLFloaterActiveSpeakers::instanceVisible(LLSD()); 5325 new_value = LLFloaterActiveSpeakers::instanceVisible(LLSD());
5350 } 5326 }
5327 else if (floater_name == "beacons")
5328 {
5329 new_value = LLFloaterBeacons::instanceVisible(LLSD());
5330 }
5351 gMenuHolder->findControl(control_name)->setValue(new_value); 5331 gMenuHolder->findControl(control_name)->setValue(new_value);
5352 return true; 5332 return true;
5353 } 5333 }
@@ -5384,37 +5364,6 @@ class LLPromptShowURL : public view_listener_t
5384 } 5364 }
5385}; 5365};
5386 5366
5387void callback_show_file(S32 option, void* data)
5388{
5389 std::string* filenamep = (std::string*)data;
5390 if (0 == option)
5391 {
5392 load_url_local_file(*filenamep);
5393 }
5394 delete filenamep;
5395}
5396
5397class LLPromptShowFile : public view_listener_t
5398{
5399 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
5400 {
5401 std::string param = userdata.asString();
5402 std::string::size_type offset = param.find(",");
5403 if (offset != param.npos)
5404 {
5405 std::string alert = param.substr(0, offset);
5406 std::string file = param.substr(offset+1);
5407 std::string* file_copy = new std::string(file);
5408 gViewerWindow->alertXml(alert, callback_show_file, file_copy);
5409 }
5410 else
5411 {
5412 llinfos << "PromptShowFile invalid parameters! Expecting \"ALERT,FILE\"." << llendl;
5413 }
5414 return true;
5415 }
5416};
5417
5418class LLShowAgentProfile : public view_listener_t 5367class LLShowAgentProfile : public view_listener_t
5419{ 5368{
5420 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata) 5369 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
@@ -6038,10 +5987,10 @@ namespace
6038 5987
6039void queue_actions(LLFloaterScriptQueue* q, const std::string& noscriptmsg, const std::string& nomodmsg) 5988void queue_actions(LLFloaterScriptQueue* q, const std::string& noscriptmsg, const std::string& nomodmsg)
6040{ 5989{
6041 // Apply until an object fails
6042 QueueObjects func(q); 5990 QueueObjects func(q);
6043 const bool firstonly = true; 5991 LLSelectMgr *mgr = LLSelectMgr::getInstance();
6044 bool fail = LLSelectMgr::getInstance()->getSelection()->applyToObjects(&func, firstonly); 5992 LLObjectSelectionHandle selectHandle = mgr->getSelection();
5993 bool fail = selectHandle->applyToObjects(&func);
6045 if(fail) 5994 if(fail)
6046 { 5995 {
6047 if ( !func.scripted ) 5996 if ( !func.scripted )
@@ -6066,61 +6015,67 @@ void queue_actions(LLFloaterScriptQueue* q, const std::string& noscriptmsg, cons
6066 } 6015 }
6067} 6016}
6068 6017
6018void handle_compile_queue(std::string to_lang)
6019{
6020 LLFloaterCompileQueue* queue;
6021 if (to_lang == "mono")
6022 {
6023 queue = LLFloaterCompileQueue::create(TRUE);
6024 }
6025 else
6026 {
6027 queue = LLFloaterCompileQueue::create(FALSE);
6028 }
6029 queue_actions(queue, "CannotRecompileSelectObjectsNoScripts", "CannotRecompileSelectObjectsNoPermission");
6030}
6031
6032void handle_reset_selection(void)
6033{
6034 LLFloaterResetQueue* queue = LLFloaterResetQueue::create();
6035 queue_actions(queue, "CannotResetSelectObjectsNoScripts", "CannotResetSelectObjectsNoPermission");
6036}
6037
6038void handle_set_run_selection(void)
6039{
6040 LLFloaterRunQueue* queue = LLFloaterRunQueue::create();
6041 queue_actions(queue, "CannotSetRunningSelectObjectsNoScripts", "CannotSerRunningSelectObjectsNoPermission");
6042}
6043
6044void handle_set_not_run_selection(void)
6045{
6046 LLFloaterNotRunQueue* queue = LLFloaterNotRunQueue::create();
6047 queue_actions(queue, "CannotSetRunningNotSelectObjectsNoScripts", "CannotSerRunningNotSelectObjectsNoPermission");
6048}
6049
6069class LLToolsSelectedScriptAction : public view_listener_t 6050class LLToolsSelectedScriptAction : public view_listener_t
6070{ 6051{
6071 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata) 6052 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
6072 { 6053 {
6073 std::string action = userdata.asString(); 6054 std::string action = userdata.asString();
6074 LLFloaterScriptQueue* queue = NULL;
6075 if (action == "compile mono") 6055 if (action == "compile mono")
6076 { 6056 {
6077 queue = LLFloaterCompileQueue::create(TRUE); 6057 handle_compile_queue("mono");
6078 } 6058 }
6079 if (action == "compile lsl") 6059 if (action == "compile lsl")
6080 { 6060 {
6081 queue = LLFloaterCompileQueue::create(FALSE); 6061 handle_compile_queue("lsl");
6082 } 6062 }
6083 else if (action == "reset") 6063 else if (action == "reset")
6084 { 6064 {
6085 queue = LLFloaterResetQueue::create(); 6065 handle_reset_selection();
6086 } 6066 }
6087 else if (action == "start") 6067 else if (action == "start")
6088 { 6068 {
6089 queue = LLFloaterRunQueue::create(); 6069 handle_set_run_selection();
6090 } 6070 }
6091 else if (action == "stop") 6071 else if (action == "stop")
6092 { 6072 {
6093 queue = LLFloaterNotRunQueue::create(); 6073 handle_set_not_run_selection();
6094 }
6095 if (!queue)
6096 {
6097 return true;
6098 } 6074 }
6099
6100 queue_actions(queue, "CannotRecompileSelectObjectsNoScripts", "CannotRecompileSelectObjectsNoPermission");
6101
6102 return true; 6075 return true;
6103 } 6076 }
6104}; 6077};
6105 6078
6106void handle_reset_selection(void*)
6107{
6108 LLFloaterResetQueue* queue = LLFloaterResetQueue::create();
6109 queue_actions(queue, "CannotResetSelectObjectsNoScripts", "CannotResetSelectObjectsNoPermission");
6110}
6111
6112void handle_set_run_selection(void*)
6113{
6114 LLFloaterRunQueue* queue = LLFloaterRunQueue::create();
6115 queue_actions(queue, "CannotSetRunningSelectObjectsNoScripts", "CannotSerRunningSelectObjectsNoPermission");
6116}
6117
6118void handle_set_not_run_selection(void*)
6119{
6120 LLFloaterNotRunQueue* queue = LLFloaterNotRunQueue::create();
6121 queue_actions(queue, "CannotSetRunningNotSelectObjectsNoScripts", "CannotSerRunningNotSelectObjectsNoPermission");
6122}
6123
6124void handle_selected_texture_info(void*) 6079void handle_selected_texture_info(void*)
6125{ 6080{
6126 for (LLObjectSelection::valid_iterator iter = LLSelectMgr::getInstance()->getSelection()->valid_begin(); 6081 for (LLObjectSelection::valid_iterator iter = LLSelectMgr::getInstance()->getSelection()->valid_begin();
@@ -7139,148 +7094,6 @@ class LLViewCheckHighlightTransparent : public view_listener_t
7139 } 7094 }
7140}; 7095};
7141 7096
7142class LLViewBeaconWidth : public view_listener_t
7143{
7144 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
7145 {
7146 std::string width = userdata.asString();
7147 if(width == "1")
7148 {
7149 gSavedSettings.setS32("DebugBeaconLineWidth", 1);
7150 }
7151 else if(width == "4")
7152 {
7153 gSavedSettings.setS32("DebugBeaconLineWidth", 4);
7154 }
7155 else if(width == "16")
7156 {
7157 gSavedSettings.setS32("DebugBeaconLineWidth", 16);
7158 }
7159 else if(width == "32")
7160 {
7161 gSavedSettings.setS32("DebugBeaconLineWidth", 32);
7162 }
7163
7164 return true;
7165 }
7166};
7167
7168
7169class LLViewToggleBeacon : public view_listener_t
7170{
7171 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
7172 {
7173 std::string beacon = userdata.asString();
7174 if (beacon == "scriptsbeacon")
7175 {
7176 LLPipeline::toggleRenderScriptedBeacons(NULL);
7177 gSavedSettings.setBOOL( "scriptsbeacon", LLPipeline::getRenderScriptedBeacons(NULL) );
7178 // toggle the other one off if it's on
7179 if (LLPipeline::getRenderScriptedBeacons(NULL) && LLPipeline::getRenderScriptedTouchBeacons(NULL))
7180 {
7181 LLPipeline::toggleRenderScriptedTouchBeacons(NULL);
7182 gSavedSettings.setBOOL( "scripttouchbeacon", LLPipeline::getRenderScriptedTouchBeacons(NULL) );
7183 }
7184 }
7185 else if (beacon == "physicalbeacon")
7186 {
7187 LLPipeline::toggleRenderPhysicalBeacons(NULL);
7188 gSavedSettings.setBOOL( "physicalbeacon", LLPipeline::getRenderPhysicalBeacons(NULL) );
7189 }
7190 else if (beacon == "soundsbeacon")
7191 {
7192 LLPipeline::toggleRenderSoundBeacons(NULL);
7193 gSavedSettings.setBOOL( "soundsbeacon", LLPipeline::getRenderSoundBeacons(NULL) );
7194 }
7195 else if (beacon == "particlesbeacon")
7196 {
7197 LLPipeline::toggleRenderParticleBeacons(NULL);
7198 gSavedSettings.setBOOL( "particlesbeacon", LLPipeline::getRenderParticleBeacons(NULL) );
7199 }
7200 else if (beacon == "scripttouchbeacon")
7201 {
7202 LLPipeline::toggleRenderScriptedTouchBeacons(NULL);
7203 gSavedSettings.setBOOL( "scripttouchbeacon", LLPipeline::getRenderScriptedTouchBeacons(NULL) );
7204 // toggle the other one off if it's on
7205 if (LLPipeline::getRenderScriptedBeacons(NULL) && LLPipeline::getRenderScriptedTouchBeacons(NULL))
7206 {
7207 LLPipeline::toggleRenderScriptedBeacons(NULL);
7208 gSavedSettings.setBOOL( "scriptsbeacon", LLPipeline::getRenderScriptedBeacons(NULL) );
7209 }
7210 }
7211 else if (beacon == "renderbeacons")
7212 {
7213 LLPipeline::toggleRenderBeacons(NULL);
7214 gSavedSettings.setBOOL( "renderbeacons", LLPipeline::getRenderBeacons(NULL) );
7215 // toggle the other one on if it's not
7216 if (!LLPipeline::getRenderBeacons(NULL) && !LLPipeline::getRenderHighlights(NULL))
7217 {
7218 LLPipeline::toggleRenderHighlights(NULL);
7219 gSavedSettings.setBOOL( "renderhighlights", LLPipeline::getRenderHighlights(NULL) );
7220 }
7221 }
7222 else if (beacon == "renderhighlights")
7223 {
7224 LLPipeline::toggleRenderHighlights(NULL);
7225 gSavedSettings.setBOOL( "renderhighlights", LLPipeline::getRenderHighlights(NULL) );
7226 // toggle the other one on if it's not
7227 if (!LLPipeline::getRenderBeacons(NULL) && !LLPipeline::getRenderHighlights(NULL))
7228 {
7229 LLPipeline::toggleRenderBeacons(NULL);
7230 gSavedSettings.setBOOL( "renderbeacons", LLPipeline::getRenderBeacons(NULL) );
7231 }
7232 }
7233
7234 return true;
7235 }
7236};
7237
7238class LLViewCheckBeaconEnabled : public view_listener_t
7239{
7240 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
7241 {
7242 std::string beacon = userdata["data"].asString();
7243 bool new_value = false;
7244 if (beacon == "scriptsbeacon")
7245 {
7246 new_value = gSavedSettings.getBOOL( "scriptsbeacon");
7247 LLPipeline::setRenderScriptedBeacons(new_value);
7248 }
7249 else if (beacon == "physicalbeacon")
7250 {
7251 new_value = gSavedSettings.getBOOL( "physicalbeacon");
7252 LLPipeline::setRenderPhysicalBeacons(new_value);
7253 }
7254 else if (beacon == "soundsbeacon")
7255 {
7256 new_value = gSavedSettings.getBOOL( "soundsbeacon");
7257 LLPipeline::setRenderSoundBeacons(new_value);
7258 }
7259 else if (beacon == "particlesbeacon")
7260 {
7261 new_value = gSavedSettings.getBOOL( "particlesbeacon");
7262 LLPipeline::setRenderParticleBeacons(new_value);
7263 }
7264 else if (beacon == "scripttouchbeacon")
7265 {
7266 new_value = gSavedSettings.getBOOL( "scripttouchbeacon");
7267 LLPipeline::setRenderScriptedTouchBeacons(new_value);
7268 }
7269 else if (beacon == "renderbeacons")
7270 {
7271 new_value = gSavedSettings.getBOOL( "renderbeacons");
7272 LLPipeline::setRenderBeacons(new_value);
7273 }
7274 else if (beacon == "renderhighlights")
7275 {
7276 new_value = gSavedSettings.getBOOL( "renderhighlights");
7277 LLPipeline::setRenderHighlights(new_value);
7278 }
7279 gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value);
7280 return true;
7281 }
7282};
7283
7284class LLViewToggleRenderType : public view_listener_t 7097class LLViewToggleRenderType : public view_listener_t
7285{ 7098{
7286 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata) 7099 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
@@ -7622,12 +7435,11 @@ void initialize_menus()
7622 addMenu(new LLViewMouselook(), "View.Mouselook"); 7435 addMenu(new LLViewMouselook(), "View.Mouselook");
7623 addMenu(new LLViewBuildMode(), "View.BuildMode"); 7436 addMenu(new LLViewBuildMode(), "View.BuildMode");
7624 addMenu(new LLViewJoystickFlycam(), "View.JoystickFlycam"); 7437 addMenu(new LLViewJoystickFlycam(), "View.JoystickFlycam");
7438 addMenu(new LLViewCommunicate(), "View.Communicate");
7625 addMenu(new LLViewResetView(), "View.ResetView"); 7439 addMenu(new LLViewResetView(), "View.ResetView");
7626 addMenu(new LLViewLookAtLastChatter(), "View.LookAtLastChatter"); 7440 addMenu(new LLViewLookAtLastChatter(), "View.LookAtLastChatter");
7627 addMenu(new LLViewShowHoverTips(), "View.ShowHoverTips"); 7441 addMenu(new LLViewShowHoverTips(), "View.ShowHoverTips");
7628 addMenu(new LLViewHighlightTransparent(), "View.HighlightTransparent"); 7442 addMenu(new LLViewHighlightTransparent(), "View.HighlightTransparent");
7629 addMenu(new LLViewToggleBeacon(), "View.ToggleBeacon");
7630 addMenu(new LLViewBeaconWidth(), "View.BeaconWidth");
7631 addMenu(new LLViewToggleRenderType(), "View.ToggleRenderType"); 7443 addMenu(new LLViewToggleRenderType(), "View.ToggleRenderType");
7632 addMenu(new LLViewShowHUDAttachments(), "View.ShowHUDAttachments"); 7444 addMenu(new LLViewShowHUDAttachments(), "View.ShowHUDAttachments");
7633 addMenu(new LLViewZoomOut(), "View.ZoomOut"); 7445 addMenu(new LLViewZoomOut(), "View.ZoomOut");
@@ -7643,7 +7455,6 @@ void initialize_menus()
7643 addMenu(new LLViewCheckJoystickFlycam(), "View.CheckJoystickFlycam"); 7455 addMenu(new LLViewCheckJoystickFlycam(), "View.CheckJoystickFlycam");
7644 addMenu(new LLViewCheckShowHoverTips(), "View.CheckShowHoverTips"); 7456 addMenu(new LLViewCheckShowHoverTips(), "View.CheckShowHoverTips");
7645 addMenu(new LLViewCheckHighlightTransparent(), "View.CheckHighlightTransparent"); 7457 addMenu(new LLViewCheckHighlightTransparent(), "View.CheckHighlightTransparent");
7646 addMenu(new LLViewCheckBeaconEnabled(), "View.CheckBeaconEnabled");
7647 addMenu(new LLViewCheckRenderType(), "View.CheckRenderType"); 7458 addMenu(new LLViewCheckRenderType(), "View.CheckRenderType");
7648 addMenu(new LLViewCheckHUDAttachments(), "View.CheckHUDAttachments"); 7459 addMenu(new LLViewCheckHUDAttachments(), "View.CheckHUDAttachments");
7649 7460
@@ -7777,7 +7588,6 @@ void initialize_menus()
7777 // Generic actions 7588 // Generic actions
7778 addMenu(new LLShowFloater(), "ShowFloater"); 7589 addMenu(new LLShowFloater(), "ShowFloater");
7779 addMenu(new LLPromptShowURL(), "PromptShowURL"); 7590 addMenu(new LLPromptShowURL(), "PromptShowURL");
7780 addMenu(new LLPromptShowFile(), "PromptShowFile");
7781 addMenu(new LLShowAgentProfile(), "ShowAgentProfile"); 7591 addMenu(new LLShowAgentProfile(), "ShowAgentProfile");
7782 addMenu(new LLShowAgentGroups(), "ShowAgentGroups"); 7592 addMenu(new LLShowAgentGroups(), "ShowAgentGroups");
7783 addMenu(new LLToggleControl(), "ToggleControl"); 7593 addMenu(new LLToggleControl(), "ToggleControl");
diff --git a/linden/indra/newview/llviewermenu.h b/linden/indra/newview/llviewermenu.h
index e003e90..495e826 100644
--- a/linden/indra/newview/llviewermenu.h
+++ b/linden/indra/newview/llviewermenu.h
@@ -50,7 +50,6 @@ void cleanup_menus();
50void show_debug_menus(); // checks for if menus should be shown first. 50void show_debug_menus(); // checks for if menus should be shown first.
51void show_context_menu( S32 x, S32 y, MASK mask ); 51void show_context_menu( S32 x, S32 y, MASK mask );
52void show_build_mode_context_menu(S32 x, S32 y, MASK mask); 52void show_build_mode_context_menu(S32 x, S32 y, MASK mask);
53void load_url_local_file(const std::string& file_name);
54BOOL enable_save_into_inventory(void*); 53BOOL enable_save_into_inventory(void*);
55void handle_reset_view(); 54void handle_reset_view();
56void handle_cut(void*); 55void handle_cut(void*);
diff --git a/linden/indra/newview/llviewermenufile.cpp b/linden/indra/newview/llviewermenufile.cpp
index 5dd760e..d9d8636 100644
--- a/linden/indra/newview/llviewermenufile.cpp
+++ b/linden/indra/newview/llviewermenufile.cpp
@@ -503,7 +503,7 @@ void handle_compress_image(void*)
503 } 503 }
504 else 504 else
505 { 505 {
506 llinfos << "Compression failed: " << LLImageBase::getLastError() << llendl; 506 llinfos << "Compression failed: " << LLImage::getLastError() << llendl;
507 } 507 }
508 508
509 infile = picker.getNextFile(); 509 infile = picker.getNextFile();
@@ -554,9 +554,9 @@ void upload_new_resource(const std::string& src_filename, std::string name,
554 IMG_CODEC_BMP )) 554 IMG_CODEC_BMP ))
555 { 555 {
556 error_message = llformat( "Problem with file %s:\n\n%s\n", 556 error_message = llformat( "Problem with file %s:\n\n%s\n",
557 src_filename.c_str(), LLImageBase::getLastError().c_str()); 557 src_filename.c_str(), LLImage::getLastError().c_str());
558 args["[FILE]"] = src_filename; 558 args["[FILE]"] = src_filename;
559 args["[ERROR]"] = LLImageBase::getLastError(); 559 args["[ERROR]"] = LLImage::getLastError();
560 upload_error(error_message, "ProblemWithFile", filename, args); 560 upload_error(error_message, "ProblemWithFile", filename, args);
561 return; 561 return;
562 } 562 }
@@ -569,9 +569,9 @@ void upload_new_resource(const std::string& src_filename, std::string name,
569 IMG_CODEC_TGA )) 569 IMG_CODEC_TGA ))
570 { 570 {
571 error_message = llformat("Problem with file %s:\n\n%s\n", 571 error_message = llformat("Problem with file %s:\n\n%s\n",
572 src_filename.c_str(), LLImageBase::getLastError().c_str()); 572 src_filename.c_str(), LLImage::getLastError().c_str());
573 args["[FILE]"] = src_filename; 573 args["[FILE]"] = src_filename;
574 args["[ERROR]"] = LLImageBase::getLastError(); 574 args["[ERROR]"] = LLImage::getLastError();
575 upload_error(error_message, "ProblemWithFile", filename, args); 575 upload_error(error_message, "ProblemWithFile", filename, args);
576 return; 576 return;
577 } 577 }
@@ -584,9 +584,9 @@ void upload_new_resource(const std::string& src_filename, std::string name,
584 IMG_CODEC_JPEG )) 584 IMG_CODEC_JPEG ))
585 { 585 {
586 error_message = llformat("Problem with file %s:\n\n%s\n", 586 error_message = llformat("Problem with file %s:\n\n%s\n",
587 src_filename.c_str(), LLImageBase::getLastError().c_str()); 587 src_filename.c_str(), LLImage::getLastError().c_str());
588 args["[FILE]"] = src_filename; 588 args["[FILE]"] = src_filename;
589 args["[ERROR]"] = LLImageBase::getLastError(); 589 args["[ERROR]"] = LLImage::getLastError();
590 upload_error(error_message, "ProblemWithFile", filename, args); 590 upload_error(error_message, "ProblemWithFile", filename, args);
591 return; 591 return;
592 } 592 }
@@ -599,9 +599,9 @@ void upload_new_resource(const std::string& src_filename, std::string name,
599 IMG_CODEC_PNG )) 599 IMG_CODEC_PNG ))
600 { 600 {
601 error_message = llformat("Problem with file %s:\n\n%s\n", 601 error_message = llformat("Problem with file %s:\n\n%s\n",
602 src_filename.c_str(), LLImageBase::getLastError().c_str()); 602 src_filename.c_str(), LLImage::getLastError().c_str());
603 args["[FILE]"] = src_filename; 603 args["[FILE]"] = src_filename;
604 args["[ERROR]"] = LLImageBase::getLastError(); 604 args["[ERROR]"] = LLImage::getLastError();
605 upload_error(error_message, "ProblemWithFile", filename, args); 605 upload_error(error_message, "ProblemWithFile", filename, args);
606 return; 606 return;
607 } 607 }
diff --git a/linden/indra/newview/llviewermessage.cpp b/linden/indra/newview/llviewermessage.cpp
index 0e39026..30e5e26 100644
--- a/linden/indra/newview/llviewermessage.cpp
+++ b/linden/indra/newview/llviewermessage.cpp
@@ -356,7 +356,7 @@ void process_layer_data(LLMessageSystem *mesgsys, void **user_data)
356// size_t nread = fread(buffer, 1, length, fXML); 356// size_t nread = fread(buffer, 1, length, fXML);
357// if (nread < (size_t) length) 357// if (nread < (size_t) length)
358// { 358// {
359// llwarns << "Short read" << llendl; 359// LL_WARNS("Messaging") << "Short read" << LL_ENDL;
360// } 360// }
361// buffer[nread] = '\0'; 361// buffer[nread] = '\0';
362// fclose(fXML); 362// fclose(fXML);
@@ -3308,8 +3308,7 @@ void process_sound_trigger(LLMessageSystem *msg, void **)
3308 return; 3308 return;
3309 } 3309 }
3310 3310
3311 F32 volume = gSavedSettings.getBOOL("MuteSounds") ? 0.f : (gain * gSavedSettings.getF32("AudioLevelSFX")); 3311 gAudiop->triggerSound(sound_id, owner_id, gain, LLAudioEngine::AUDIO_TYPE_SFX, pos_global);
3312 gAudiop->triggerSound(sound_id, owner_id, volume, pos_global);
3313} 3312}
3314 3313
3315void process_preload_sound(LLMessageSystem *msg, void **user_data) 3314void process_preload_sound(LLMessageSystem *msg, void **user_data)
@@ -3506,6 +3505,15 @@ void process_sim_stats(LLMessageSystem *msg, void **user_data)
3506 case LL_SIM_STAT_SIMPHYSICSMEMORY: 3505 case LL_SIM_STAT_SIMPHYSICSMEMORY:
3507 LLViewerStats::getInstance()->mPhysicsMemoryAllocated.addValue(stat_value); 3506 LLViewerStats::getInstance()->mPhysicsMemoryAllocated.addValue(stat_value);
3508 break; 3507 break;
3508 case LL_SIM_STAT_SIMSPARETIME:
3509 LLViewerStats::getInstance()->mSimSpareMsec.addValue(stat_value);
3510 break;
3511 case LL_SIM_STAT_SIMSLEEPTIME:
3512 LLViewerStats::getInstance()->mSimSleepMsec.addValue(stat_value);
3513 break;
3514 case LL_SIM_STAT_IOPUMPTIME:
3515 LLViewerStats::getInstance()->mSimPumpIOMsec.addValue(stat_value);
3516 break;
3509 default: 3517 default:
3510 // Used to be a commented out warning. 3518 // Used to be a commented out warning.
3511 LL_DEBUGS("Messaging") << "Unknown stat id" << stat_id << LL_ENDL; 3519 LL_DEBUGS("Messaging") << "Unknown stat id" << stat_id << LL_ENDL;
@@ -4718,7 +4726,7 @@ void process_teleport_local(LLMessageSystem *msg,void**)
4718 gAgent.slamLookAt(look_at); 4726 gAgent.slamLookAt(look_at);
4719 4727
4720 // likewise make sure the camera is behind the avatar 4728 // likewise make sure the camera is behind the avatar
4721 gAgent.resetView(TRUE); 4729 gAgent.resetView(TRUE, TRUE);
4722 4730
4723 // send camera update to new region 4731 // send camera update to new region
4724 gAgent.updateCamera(); 4732 gAgent.updateCamera();
diff --git a/linden/indra/newview/llviewernetwork.cpp b/linden/indra/newview/llviewernetwork.cpp
index 13d432a..25bdcb7 100644
--- a/linden/indra/newview/llviewernetwork.cpp
+++ b/linden/indra/newview/llviewernetwork.cpp
@@ -58,10 +58,22 @@ static LLGridData gGridInfo[GRID_INFO_COUNT] =
58 "util.aruna.lindenlab.com", 58 "util.aruna.lindenlab.com",
59 "https://login.aruna.lindenlab.com/cgi-bin/login.cgi", 59 "https://login.aruna.lindenlab.com/cgi-bin/login.cgi",
60 "http://aruna-secondlife.webdev.lindenlab.com/helpers/" }, 60 "http://aruna-secondlife.webdev.lindenlab.com/helpers/" },
61 { "Bharati",
62 "util.bharati.lindenlab.com",
63 "https://login.bharati.lindenlab.com/cgi-bin/login.cgi",
64 "http://bharati-secondlife.webdev.lindenlab.com/helpers/" },
65 { "Chandra",
66 "util.chandra.lindenlab.com",
67 "https://login.chandra.lindenlab.com/cgi-bin/login.cgi",
68 "http://chandra-secondlife.webdev.lindenlab.com/helpers/" },
61 { "Damballah", 69 { "Damballah",
62 "util.damballah.lindenlab.com", 70 "util.damballah.lindenlab.com",
63 "https://login.damballah.lindenlab.com/cgi-bin/login.cgi", 71 "https://login.damballah.lindenlab.com/cgi-bin/login.cgi",
64 "http://damballah-secondlife.webdev.lindenlab.com/helpers/" }, 72 "http://damballah-secondlife.webdev.lindenlab.com/helpers/" },
73 { "Danu",
74 "util.danu.lindenlab.com",
75 "https://login.danu.lindenlab.com/cgi-bin/login.cgi",
76 "http://danu-secondlife.webdev.lindenlab.com/helpers/" },
65 { "Durga", 77 { "Durga",
66 "util.durga.lindenlab.com", 78 "util.durga.lindenlab.com",
67 "https://login.durga.lindenlab.com/cgi-bin/login.cgi", 79 "https://login.durga.lindenlab.com/cgi-bin/login.cgi",
@@ -82,6 +94,10 @@ static LLGridData gGridInfo[GRID_INFO_COUNT] =
82 "util.nandi.lindenlab.com", 94 "util.nandi.lindenlab.com",
83 "https://login.nandi.lindenlab.com/cgi-bin/login.cgi", 95 "https://login.nandi.lindenlab.com/cgi-bin/login.cgi",
84 "http://nandi-secondlife.webdev.lindenlab.com/helpers/" }, 96 "http://nandi-secondlife.webdev.lindenlab.com/helpers/" },
97 { "Parvati",
98 "util.parvati.lindenlab.com",
99 "https://login.parvati.lindenlab.com/cgi-bin/login.cgi",
100 "http://parvati-secondlife.webdev.lindenlab.com/helpers/" },
85 { "Radha", 101 { "Radha",
86 "util.radha.lindenlab.com", 102 "util.radha.lindenlab.com",
87 "https://login.radha.lindenlab.com/cgi-bin/login.cgi", 103 "https://login.radha.lindenlab.com/cgi-bin/login.cgi",
@@ -98,6 +114,10 @@ static LLGridData gGridInfo[GRID_INFO_COUNT] =
98 "util.shakti.lindenlab.com", 114 "util.shakti.lindenlab.com",
99 "https://login.shakti.lindenlab.com/cgi-bin/login.cgi", 115 "https://login.shakti.lindenlab.com/cgi-bin/login.cgi",
100 "http://shakti-secondlife.webdev.lindenlab.com/helpers/" }, 116 "http://shakti-secondlife.webdev.lindenlab.com/helpers/" },
117 { "Skanda",
118 "util.skanda.lindenlab.com",
119 "https://login.skanda.lindenlab.com/cgi-bin/login.cgi",
120 "http://skanda-secondlife.webdev.lindenlab.com/helpers/" },
101 { "Soma", 121 { "Soma",
102 "util.soma.lindenlab.com", 122 "util.soma.lindenlab.com",
103 "https://login.soma.lindenlab.com/cgi-bin/login.cgi", 123 "https://login.soma.lindenlab.com/cgi-bin/login.cgi",
diff --git a/linden/indra/newview/llviewernetwork.h b/linden/indra/newview/llviewernetwork.h
index 53bb0ab..73c3a5d 100644
--- a/linden/indra/newview/llviewernetwork.h
+++ b/linden/indra/newview/llviewernetwork.h
@@ -41,16 +41,21 @@ enum EGridInfo
41 GRID_INFO_ADITI, 41 GRID_INFO_ADITI,
42 GRID_INFO_AGNI, 42 GRID_INFO_AGNI,
43 GRID_INFO_ARUNA, 43 GRID_INFO_ARUNA,
44 GRID_INFO_BHARATI,
45 GRID_INFO_CHANDRA,
44 GRID_INFO_DAMBALLAH, 46 GRID_INFO_DAMBALLAH,
47 GRID_INFO_DANU,
45 GRID_INFO_DURGA, 48 GRID_INFO_DURGA,
46 GRID_INFO_GANGA, 49 GRID_INFO_GANGA,
47 GRID_INFO_MITRA, 50 GRID_INFO_MITRA,
48 GRID_INFO_MOHINI, 51 GRID_INFO_MOHINI,
49 GRID_INFO_NANDI, 52 GRID_INFO_NANDI,
53 GRID_INFO_PARVATI,
50 GRID_INFO_RADHA, 54 GRID_INFO_RADHA,
51 GRID_INFO_RAVI, 55 GRID_INFO_RAVI,
52 GRID_INFO_SIVA, 56 GRID_INFO_SIVA,
53 GRID_INFO_SHAKTI, 57 GRID_INFO_SHAKTI,
58 GRID_INFO_SKANDA,
54 GRID_INFO_SOMA, 59 GRID_INFO_SOMA,
55 GRID_INFO_UMA, 60 GRID_INFO_UMA,
56 GRID_INFO_VAAK, 61 GRID_INFO_VAAK,
diff --git a/linden/indra/newview/llviewerobject.cpp b/linden/indra/newview/llviewerobject.cpp
index c560ced..6dc9af1 100644
--- a/linden/indra/newview/llviewerobject.cpp
+++ b/linden/indra/newview/llviewerobject.cpp
@@ -150,6 +150,8 @@ LLViewerObject *LLViewerObject::createObject(const LLUUID &id, const LLPCode pco
150 res = new LLVOGround(id, pcode, regionp); break; 150 res = new LLVOGround(id, pcode, regionp); break;
151 case LL_VO_PART_GROUP: 151 case LL_VO_PART_GROUP:
152 res = new LLVOPartGroup(id, pcode, regionp); break; 152 res = new LLVOPartGroup(id, pcode, regionp); break;
153 case LL_VO_HUD_PART_GROUP:
154 res = new LLVOHUDPartGroup(id, pcode, regionp); break;
153 case LL_VO_WL_SKY: 155 case LL_VO_WL_SKY:
154 res = new LLVOWLSky(id, pcode, regionp); break; 156 res = new LLVOWLSky(id, pcode, regionp); break;
155 default: 157 default:
@@ -159,7 +161,7 @@ LLViewerObject *LLViewerObject::createObject(const LLUUID &id, const LLPCode pco
159 return res; 161 return res;
160} 162}
161 163
162LLViewerObject::LLViewerObject(const LLUUID &id, const LLPCode pcode, LLViewerRegion *regionp) 164LLViewerObject::LLViewerObject(const LLUUID &id, const LLPCode pcode, LLViewerRegion *regionp, BOOL is_global)
163: LLPrimitive(), 165: LLPrimitive(),
164 mChildList(), 166 mChildList(),
165 mID(id), 167 mID(id),
@@ -201,7 +203,10 @@ LLViewerObject::LLViewerObject(const LLUUID &id, const LLPCode pcode, LLViewerRe
201 mMedia(NULL), 203 mMedia(NULL),
202 mClickAction(0) 204 mClickAction(0)
203{ 205{
204 llassert(mRegionp); 206 if(!is_global)
207 {
208 llassert(mRegionp);
209 }
205 210
206 LLPrimitive::init_primitive(pcode); 211 LLPrimitive::init_primitive(pcode);
207 212
@@ -209,7 +214,11 @@ LLViewerObject::LLViewerObject(const LLUUID &id, const LLPCode pcode, LLViewerRe
209 mLastInterpUpdateSecs = LLFrameTimer::getElapsedSeconds(); 214 mLastInterpUpdateSecs = LLFrameTimer::getElapsedSeconds();
210 215
211 mPositionRegion = LLVector3(0.f, 0.f, 0.f); 216 mPositionRegion = LLVector3(0.f, 0.f, 0.f);
212 mPositionAgent = mRegionp->getOriginAgent(); 217
218 if(!is_global)
219 {
220 mPositionAgent = mRegionp->getOriginAgent();
221 }
213 222
214 LLViewerObject::sNumObjects++; 223 LLViewerObject::sNumObjects++;
215} 224}
@@ -2763,12 +2772,6 @@ void LLViewerObject::setPixelAreaAndAngle(LLAgent &agent)
2763 2772
2764BOOL LLViewerObject::updateLOD() 2773BOOL LLViewerObject::updateLOD()
2765{ 2774{
2766 // Update volume of looping sounds
2767 if (mAudioSourcep && mAudioSourcep->isLoop())
2768 {
2769 F32 volume = gSavedSettings.getBOOL("MuteSounds") ? 0.f : (mAudioGain * gSavedSettings.getF32("AudioLevelSFX"));
2770 mAudioSourcep->setGain(volume);
2771 }
2772 return FALSE; 2775 return FALSE;
2773} 2776}
2774 2777
@@ -3055,28 +3058,38 @@ LLNameValue *LLViewerObject::getNVPair(const std::string& name) const
3055 3058
3056void LLViewerObject::updatePositionCaches() const 3059void LLViewerObject::updatePositionCaches() const
3057{ 3060{
3058 if (!isRoot()) 3061 if(mRegionp)
3059 {
3060 mPositionRegion = ((LLViewerObject *)getParent())->getPositionRegion() + getPosition() * getParent()->getRotation();
3061 mPositionAgent = mRegionp->getPosAgentFromRegion(mPositionRegion);
3062 }
3063 else
3064 { 3062 {
3065 mPositionRegion = getPosition(); 3063 if (!isRoot())
3066 mPositionAgent = mRegionp->getPosAgentFromRegion(mPositionRegion); 3064 {
3065 mPositionRegion = ((LLViewerObject *)getParent())->getPositionRegion() + getPosition() * getParent()->getRotation();
3066 mPositionAgent = mRegionp->getPosAgentFromRegion(mPositionRegion);
3067 }
3068 else
3069 {
3070 mPositionRegion = getPosition();
3071 mPositionAgent = mRegionp->getPosAgentFromRegion(mPositionRegion);
3072 }
3067 } 3073 }
3068} 3074}
3069 3075
3070const LLVector3d LLViewerObject::getPositionGlobal() const 3076const LLVector3d LLViewerObject::getPositionGlobal() const
3071{ 3077{
3072 LLVector3d position_global = mRegionp->getPosGlobalFromRegion(getPositionRegion()); 3078 if(mRegionp)
3073
3074 if (isAttachment())
3075 { 3079 {
3076 position_global = gAgent.getPosGlobalFromAgent(getRenderPosition()); 3080 LLVector3d position_global = mRegionp->getPosGlobalFromRegion(getPositionRegion());
3077 }
3078 3081
3079 return position_global; 3082 if (isAttachment())
3083 {
3084 position_global = gAgent.getPosGlobalFromAgent(getRenderPosition());
3085 }
3086 return position_global;
3087 }
3088 else
3089 {
3090 LLVector3d position_global(getPosition());
3091 return position_global;
3092 }
3080} 3093}
3081 3094
3082const LLVector3 &LLViewerObject::getPositionAgent() const 3095const LLVector3 &LLViewerObject::getPositionAgent() const
@@ -3398,6 +3411,7 @@ LLViewerObject* LLViewerObject::getRootEdit() const
3398 3411
3399BOOL LLViewerObject::lineSegmentIntersect(const LLVector3& start, const LLVector3& end, 3412BOOL LLViewerObject::lineSegmentIntersect(const LLVector3& start, const LLVector3& end,
3400 S32 face, 3413 S32 face,
3414 BOOL pick_transparent,
3401 S32* face_hit, 3415 S32* face_hit,
3402 LLVector3* intersection, 3416 LLVector3* intersection,
3403 LLVector2* tex_coord, 3417 LLVector2* tex_coord,
@@ -3407,6 +3421,20 @@ BOOL LLViewerObject::lineSegmentIntersect(const LLVector3& start, const LLVector
3407 return false; 3421 return false;
3408} 3422}
3409 3423
3424BOOL LLViewerObject::lineSegmentBoundingBox(const LLVector3& start, const LLVector3& end)
3425{
3426 if (mDrawable.isNull() || mDrawable->isDead())
3427 {
3428 return FALSE;
3429 }
3430
3431 const LLVector3* ext = mDrawable->getSpatialExtents();
3432
3433 LLVector3 center = (ext[1]+ext[0])*0.5f;
3434 LLVector3 size = (ext[1]-ext[0])*0.5f;
3435
3436 return LLLineSegmentBoxIntersect(start, end, center, size);
3437}
3410 3438
3411U8 LLViewerObject::getMediaType() const 3439U8 LLViewerObject::getMediaType() const
3412{ 3440{
@@ -4331,8 +4359,7 @@ void LLViewerObject::setAttachedSound(const LLUUID &audio_uuid, const LLUUID& ow
4331 { 4359 {
4332 BOOL queue = flags & LL_SOUND_FLAG_QUEUE; 4360 BOOL queue = flags & LL_SOUND_FLAG_QUEUE;
4333 mAudioGain = gain; 4361 mAudioGain = gain;
4334 F32 volume = gSavedSettings.getBOOL("MuteSounds") ? 0.f : gain * gSavedSettings.getF32("AudioLevelSFX"); 4362 mAudioSourcep->setGain(gain);
4335 mAudioSourcep->setGain(volume);
4336 mAudioSourcep->setLoop(flags & LL_SOUND_FLAG_LOOP); 4363 mAudioSourcep->setLoop(flags & LL_SOUND_FLAG_LOOP);
4337 mAudioSourcep->setSyncMaster(flags & LL_SOUND_FLAG_SYNC_MASTER); 4364 mAudioSourcep->setSyncMaster(flags & LL_SOUND_FLAG_SYNC_MASTER);
4338 mAudioSourcep->setSyncSlave(flags & LL_SOUND_FLAG_SYNC_SLAVE); 4365 mAudioSourcep->setSyncSlave(flags & LL_SOUND_FLAG_SYNC_SLAVE);
@@ -4370,8 +4397,7 @@ void LLViewerObject::adjustAudioGain(const F32 gain)
4370 if (mAudioSourcep) 4397 if (mAudioSourcep)
4371 { 4398 {
4372 mAudioGain = gain; 4399 mAudioGain = gain;
4373 F32 volume = gSavedSettings.getBOOL("MuteSounds") ? 0.f : mAudioGain * gSavedSettings.getF32("AudioLevelSFX"); 4400 mAudioSourcep->setGain(mAudioGain);
4374 mAudioSourcep->setGain(volume);
4375 } 4401 }
4376} 4402}
4377 4403
diff --git a/linden/indra/newview/llviewerobject.h b/linden/indra/newview/llviewerobject.h
index 06d385c..5827dc2 100644
--- a/linden/indra/newview/llviewerobject.h
+++ b/linden/indra/newview/llviewerobject.h
@@ -132,7 +132,7 @@ public:
132 typedef std::list<LLPointer<LLViewerObject> > child_list_t; 132 typedef std::list<LLPointer<LLViewerObject> > child_list_t;
133 typedef const child_list_t const_child_list_t; 133 typedef const child_list_t const_child_list_t;
134 134
135 LLViewerObject(const LLUUID &id, const LLPCode type, LLViewerRegion *regionp); 135 LLViewerObject(const LLUUID &id, const LLPCode type, LLViewerRegion *regionp, BOOL is_global = FALSE);
136 MEM_TYPE_NEW(LLMemType::MTYPE_OBJECT); 136 MEM_TYPE_NEW(LLMemType::MTYPE_OBJECT);
137 137
138 virtual void markDead(); // Mark this object as dead, and clean up its references 138 virtual void markDead(); // Mark this object as dead, and clean up its references
@@ -248,6 +248,7 @@ public:
248 //returns TRUE if intersection detected and returns information about intersection 248 //returns TRUE if intersection detected and returns information about intersection
249 virtual BOOL lineSegmentIntersect(const LLVector3& start, const LLVector3& end, 249 virtual BOOL lineSegmentIntersect(const LLVector3& start, const LLVector3& end,
250 S32 face = -1, // which face to check, -1 = ALL_SIDES 250 S32 face = -1, // which face to check, -1 = ALL_SIDES
251 BOOL pick_transparent = FALSE,
251 S32* face_hit = NULL, // which face was hit 252 S32* face_hit = NULL, // which face was hit
252 LLVector3* intersection = NULL, // return the intersection point 253 LLVector3* intersection = NULL, // return the intersection point
253 LLVector2* tex_coord = NULL, // return the texture coordinates of the intersection point 254 LLVector2* tex_coord = NULL, // return the texture coordinates of the intersection point
@@ -255,6 +256,8 @@ public:
255 LLVector3* bi_normal = NULL // return the surface bi-normal at the intersection point 256 LLVector3* bi_normal = NULL // return the surface bi-normal at the intersection point
256 ); 257 );
257 258
259 virtual BOOL lineSegmentBoundingBox(const LLVector3& start, const LLVector3& end);
260
258 virtual const LLVector3d getPositionGlobal() const; 261 virtual const LLVector3d getPositionGlobal() const;
259 virtual const LLVector3 &getPositionRegion() const; 262 virtual const LLVector3 &getPositionRegion() const;
260 virtual const LLVector3 getPositionEdit() const; 263 virtual const LLVector3 getPositionEdit() const;
@@ -507,6 +510,7 @@ public:
507 LL_VO_PART_GROUP = LL_PCODE_APP | 0x90, 510 LL_VO_PART_GROUP = LL_PCODE_APP | 0x90,
508 LL_VO_TRIANGLE_TORUS = LL_PCODE_APP | 0xa0, 511 LL_VO_TRIANGLE_TORUS = LL_PCODE_APP | 0xa0,
509 LL_VO_WL_SKY = LL_PCODE_APP | 0xb0, // should this be moved to 0x40? 512 LL_VO_WL_SKY = LL_PCODE_APP | 0xb0, // should this be moved to 0x40?
513 LL_VO_HUD_PART_GROUP = LL_PCODE_APP | 0xc0,
510 } EVOType; 514 } EVOType;
511 515
512 LLUUID mID; 516 LLUUID mID;
@@ -705,8 +709,8 @@ public:
705class LLStaticViewerObject : public LLViewerObject 709class LLStaticViewerObject : public LLViewerObject
706{ 710{
707public: 711public:
708 LLStaticViewerObject(const LLUUID& id, const LLPCode type, LLViewerRegion* regionp) 712 LLStaticViewerObject(const LLUUID& id, const LLPCode type, LLViewerRegion* regionp, BOOL is_global = FALSE)
709 : LLViewerObject(id,type,regionp) 713 : LLViewerObject(id,type,regionp, is_global)
710 { } 714 { }
711 715
712 virtual void updateDrawable(BOOL force_damped); 716 virtual void updateDrawable(BOOL force_damped);
diff --git a/linden/indra/newview/llviewerobjectlist.cpp b/linden/indra/newview/llviewerobjectlist.cpp
index 163b039..f3d7bd9 100644
--- a/linden/indra/newview/llviewerobjectlist.cpp
+++ b/linden/indra/newview/llviewerobjectlist.cpp
@@ -163,15 +163,20 @@ U64 LLViewerObjectList::getIndex(const U32 local_id,
163 163
164BOOL LLViewerObjectList::removeFromLocalIDTable(const LLViewerObject &object) 164BOOL LLViewerObjectList::removeFromLocalIDTable(const LLViewerObject &object)
165{ 165{
166 U32 local_id = object.mLocalID; 166 if(object.getRegion())
167 LLHost region_host = object.getRegion()->getHost(); 167 {
168 U32 ip = region_host.getAddress(); 168 U32 local_id = object.mLocalID;
169 U32 port = region_host.getPort(); 169 LLHost region_host = object.getRegion()->getHost();
170 U64 ipport = (((U64)ip) << 32) | (U64)port; 170 U32 ip = region_host.getAddress();
171 U32 index = sIPAndPortToIndex[ipport]; 171 U32 port = region_host.getPort();
172 U64 ipport = (((U64)ip) << 32) | (U64)port;
173 U32 index = sIPAndPortToIndex[ipport];
174
175 U64 indexid = (((U64)index) << 32) | (U64)local_id;
176 return sIndexAndLocalIDToUUID.erase(indexid) > 0 ? TRUE : FALSE;
177 }
172 178
173 U64 indexid = (((U64)index) << 32) | (U64)local_id; 179 return FALSE ;
174 return sIndexAndLocalIDToUUID.erase(indexid) > 0 ? TRUE : FALSE;
175} 180}
176 181
177void LLViewerObjectList::setUUIDAndLocal(const LLUUID &id, 182void LLViewerObjectList::setUUIDAndLocal(const LLUUID &id,
@@ -822,8 +827,15 @@ void LLViewerObjectList::removeDrawable(LLDrawable* drawablep)
822 827
823 for (S32 i = 0; i < drawablep->getNumFaces(); i++) 828 for (S32 i = 0; i < drawablep->getNumFaces(); i++)
824 { 829 {
825 LLViewerObject* objectp = drawablep->getFace(i)->getViewerObject(); 830 LLFace* facep = drawablep->getFace(i) ;
826 mSelectPickList.erase(objectp); 831 if(facep)
832 {
833 LLViewerObject* objectp = facep->getViewerObject();
834 if(objectp)
835 {
836 mSelectPickList.erase(objectp);
837 }
838 }
827 } 839 }
828} 840}
829 841
@@ -898,7 +910,7 @@ void LLViewerObjectList::killAllObjects()
898 if (!mMapObjects.empty()) 910 if (!mMapObjects.empty())
899 { 911 {
900 llwarns << "Some objects still on map object list!" << llendl; 912 llwarns << "Some objects still on map object list!" << llendl;
901 mActiveObjects.clear(); 913 mMapObjects.clear();
902 } 914 }
903} 915}
904 916
diff --git a/linden/indra/newview/llviewerparcelmedia.cpp b/linden/indra/newview/llviewerparcelmedia.cpp
index 956ed03..5f29ea6 100644
--- a/linden/indra/newview/llviewerparcelmedia.cpp
+++ b/linden/indra/newview/llviewerparcelmedia.cpp
@@ -344,7 +344,7 @@ void LLViewerParcelMedia::processParcelMediaUpdate( LLMessageSystem *msg, void *
344 media_url = media_url_buffer; 344 media_url = media_url_buffer;
345 msg->getU8("DataBlock", "MediaAutoScale", media_auto_scale); 345 msg->getU8("DataBlock", "MediaAutoScale", media_auto_scale);
346 346
347 if (msg->getNumberOfBlocks("DataBlockExtended")) // do we have the extended data? 347 if (msg->has("DataBlockExtended")) // do we have the extended data?
348 { 348 {
349 char media_type_buffer[257]; 349 char media_type_buffer[257];
350 msg->getString("DataBlockExtended", "MediaType", 255, media_type_buffer); 350 msg->getString("DataBlockExtended", "MediaType", 255, media_type_buffer);
diff --git a/linden/indra/newview/llviewerparceloverlay.cpp b/linden/indra/newview/llviewerparceloverlay.cpp
index b50ddb6..392f8cd 100644
--- a/linden/indra/newview/llviewerparceloverlay.cpp
+++ b/linden/indra/newview/llviewerparceloverlay.cpp
@@ -72,7 +72,7 @@ LLViewerParcelOverlay::LLViewerParcelOverlay(LLViewerRegion* region, F32 region_
72 mImageRaw = new LLImageRaw(mParcelGridsPerEdge, mParcelGridsPerEdge, OVERLAY_IMG_COMPONENTS); 72 mImageRaw = new LLImageRaw(mParcelGridsPerEdge, mParcelGridsPerEdge, OVERLAY_IMG_COMPONENTS);
73 mTexture->createGLTexture(0, mImageRaw); 73 mTexture->createGLTexture(0, mImageRaw);
74 gGL.getTexUnit(0)->activate(); 74 gGL.getTexUnit(0)->activate();
75 mTexture->bind(0); 75 gGL.getTexUnit(0)->bind(mTexture);
76 mTexture->setClamp(TRUE, TRUE); 76 mTexture->setClamp(TRUE, TRUE);
77 mTexture->setMipFilterNearest(TRUE); 77 mTexture->setMipFilterNearest(TRUE);
78 78
@@ -748,7 +748,7 @@ S32 LLViewerParcelOverlay::renderPropertyLines ()
748 LLSurface& land = mRegion->getLand(); 748 LLSurface& land = mRegion->getLand();
749 749
750 LLGLSUIDefault gls_ui; // called from pipeline 750 LLGLSUIDefault gls_ui; // called from pipeline
751 LLGLSNoTexture gls_no_texture; 751 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
752 LLGLDepthTest mDepthTest(GL_TRUE); 752 LLGLDepthTest mDepthTest(GL_TRUE);
753 753
754 // Find camera height off the ground (not from zero) 754 // Find camera height off the ground (not from zero)
@@ -826,7 +826,7 @@ S32 LLViewerParcelOverlay::renderPropertyLines ()
826 continue; 826 continue;
827 } 827 }
828 828
829 gGL.begin(LLVertexBuffer::TRIANGLE_STRIP); 829 gGL.begin(LLRender::TRIANGLE_STRIP);
830 830
831 for (j = 0; j < vertex_per_edge; j++) 831 for (j = 0; j < vertex_per_edge; j++)
832 { 832 {
@@ -848,7 +848,7 @@ S32 LLViewerParcelOverlay::renderPropertyLines ()
848 colorp = mColorArray + BYTES_PER_COLOR * i; 848 colorp = mColorArray + BYTES_PER_COLOR * i;
849 vertexp = mVertexArray + FLOATS_PER_VERTEX * i; 849 vertexp = mVertexArray + FLOATS_PER_VERTEX * i;
850 850
851 gGL.begin(LLVertexBuffer::TRIANGLE_STRIP); 851 gGL.begin(LLRender::TRIANGLE_STRIP);
852 852
853 for (j = 0; j < vertex_per_edge; j++) 853 for (j = 0; j < vertex_per_edge; j++)
854 { 854 {
diff --git a/linden/indra/newview/llviewerpartsim.cpp b/linden/indra/newview/llviewerpartsim.cpp
index d27e0df..95fb307 100644
--- a/linden/indra/newview/llviewerpartsim.cpp
+++ b/linden/indra/newview/llviewerpartsim.cpp
@@ -116,7 +116,8 @@ void LLViewerPart::init(LLPointer<LLViewerPartSource> sourcep, LLViewerImage *im
116// 116//
117 117
118 118
119LLViewerPartGroup::LLViewerPartGroup(const LLVector3 &center_agent, const F32 box_side) 119LLViewerPartGroup::LLViewerPartGroup(const LLVector3 &center_agent, const F32 box_side, bool hud)
120 : mHud(hud)
120{ 121{
121 LLMemType mt(LLMemType::MTYPE_PARTICLES); 122 LLMemType mt(LLMemType::MTYPE_PARTICLES);
122 mVOPartGroupp = NULL; 123 mVOPartGroupp = NULL;
@@ -133,7 +134,14 @@ LLViewerPartGroup::LLViewerPartGroup(const LLVector3 &center_agent, const F32 bo
133 mCenterAgent = center_agent; 134 mCenterAgent = center_agent;
134 mBoxRadius = F_SQRT3*box_side*0.5f; 135 mBoxRadius = F_SQRT3*box_side*0.5f;
135 136
137 if (mHud)
138 {
139 mVOPartGroupp = (LLVOPartGroup *)gObjectList.createObjectViewer(LLViewerObject::LL_VO_HUD_PART_GROUP, getRegion());
140 }
141 else
142 {
136 mVOPartGroupp = (LLVOPartGroup *)gObjectList.createObjectViewer(LLViewerObject::LL_VO_PART_GROUP, getRegion()); 143 mVOPartGroupp = (LLVOPartGroup *)gObjectList.createObjectViewer(LLViewerObject::LL_VO_PART_GROUP, getRegion());
144 }
137 mVOPartGroupp->setViewerPartGroup(this); 145 mVOPartGroupp->setViewerPartGroup(this);
138 mVOPartGroupp->setPositionAgent(getCenterAgent()); 146 mVOPartGroupp->setPositionAgent(getCenterAgent());
139 F32 scale = box_side * 0.5f; 147 F32 scale = box_side * 0.5f;
@@ -223,6 +231,12 @@ BOOL LLViewerPartGroup::posInGroup(const LLVector3 &pos, const F32 desired_size)
223BOOL LLViewerPartGroup::addPart(LLViewerPart* part, F32 desired_size) 231BOOL LLViewerPartGroup::addPart(LLViewerPart* part, F32 desired_size)
224{ 232{
225 LLMemType mt(LLMemType::MTYPE_PARTICLES); 233 LLMemType mt(LLMemType::MTYPE_PARTICLES);
234
235 if (part->mFlags & LLPartData::LL_PART_HUD && !mHud)
236 {
237 return FALSE;
238 }
239
226 BOOL uniform_part = part->mScale.mV[0] == part->mScale.mV[1] && 240 BOOL uniform_part = part->mScale.mV[0] == part->mScale.mV[1] &&
227 !(part->mFlags & LLPartData::LL_PART_FOLLOW_VELOCITY_MASK); 241 !(part->mFlags & LLPartData::LL_PART_FOLLOW_VELOCITY_MASK);
228 242
@@ -530,7 +544,7 @@ LLViewerPartGroup *LLViewerPartSim::put(LLViewerPart* part)
530 if(!return_group) 544 if(!return_group)
531 { 545 {
532 llassert_always(part->mPosAgent.isFinite()); 546 llassert_always(part->mPosAgent.isFinite());
533 LLViewerPartGroup *groupp = createViewerPartGroup(part->mPosAgent, desired_size); 547 LLViewerPartGroup *groupp = createViewerPartGroup(part->mPosAgent, desired_size, part->mFlags & LLPartData::LL_PART_HUD);
534 groupp->mUniformParticles = (part->mScale.mV[0] == part->mScale.mV[1] && 548 groupp->mUniformParticles = (part->mScale.mV[0] == part->mScale.mV[1] &&
535 !(part->mFlags & LLPartData::LL_PART_FOLLOW_VELOCITY_MASK)); 549 !(part->mFlags & LLPartData::LL_PART_FOLLOW_VELOCITY_MASK));
536 if (!groupp->addPart(part)) 550 if (!groupp->addPart(part))
@@ -555,12 +569,12 @@ LLViewerPartGroup *LLViewerPartSim::put(LLViewerPart* part)
555 return return_group ; 569 return return_group ;
556} 570}
557 571
558LLViewerPartGroup *LLViewerPartSim::createViewerPartGroup(const LLVector3 &pos_agent, const F32 desired_size) 572LLViewerPartGroup *LLViewerPartSim::createViewerPartGroup(const LLVector3 &pos_agent, const F32 desired_size, bool hud)
559{ 573{
560 LLMemType mt(LLMemType::MTYPE_PARTICLES); 574 LLMemType mt(LLMemType::MTYPE_PARTICLES);
561 //find a box that has a center position divisible by PART_SIM_BOX_SIDE that encompasses 575 //find a box that has a center position divisible by PART_SIM_BOX_SIDE that encompasses
562 //pos_agent 576 //pos_agent
563 LLViewerPartGroup *groupp = new LLViewerPartGroup(pos_agent, desired_size); 577 LLViewerPartGroup *groupp = new LLViewerPartGroup(pos_agent, desired_size, hud);
564 mViewerPartGroups.push_back(groupp); 578 mViewerPartGroups.push_back(groupp);
565 return groupp; 579 return groupp;
566} 580}
diff --git a/linden/indra/newview/llviewerpartsim.h b/linden/indra/newview/llviewerpartsim.h
index 0f51240..b6001ee 100644
--- a/linden/indra/newview/llviewerpartsim.h
+++ b/linden/indra/newview/llviewerpartsim.h
@@ -87,7 +87,8 @@ class LLViewerPartGroup
87{ 87{
88public: 88public:
89 LLViewerPartGroup(const LLVector3 &center, 89 LLViewerPartGroup(const LLVector3 &center,
90 const F32 box_radius); 90 const F32 box_radius,
91 bool hud);
91 virtual ~LLViewerPartGroup(); 92 virtual ~LLViewerPartGroup();
92 93
93 void cleanup(); 94 void cleanup();
@@ -115,6 +116,7 @@ public:
115 U32 mID; 116 U32 mID;
116 117
117 F32 mSkippedTime; 118 F32 mSkippedTime;
119 bool mHud;
118 120
119protected: 121protected:
120 LLVector3 mCenterAgent; 122 LLVector3 mCenterAgent;
@@ -178,7 +180,7 @@ public:
178 U32 mID; 180 U32 mID;
179 181
180protected: 182protected:
181 LLViewerPartGroup *createViewerPartGroup(const LLVector3 &pos_agent, const F32 desired_size); 183 LLViewerPartGroup *createViewerPartGroup(const LLVector3 &pos_agent, const F32 desired_size, bool hud);
182 LLViewerPartGroup *put(LLViewerPart* part); 184 LLViewerPartGroup *put(LLViewerPart* part);
183 185
184 group_list_t mViewerPartGroups; 186 group_list_t mViewerPartGroups;
diff --git a/linden/indra/newview/llviewerpartsource.cpp b/linden/indra/newview/llviewerpartsource.cpp
index dcef8c2..13da131 100644
--- a/linden/indra/newview/llviewerpartsource.cpp
+++ b/linden/indra/newview/llviewerpartsource.cpp
@@ -33,6 +33,7 @@
33#include "llviewerpartsource.h" 33#include "llviewerpartsource.h"
34 34
35#include "llviewercontrol.h" 35#include "llviewercontrol.h"
36#include "llrender.h"
36 37
37#include "llagent.h" 38#include "llagent.h"
38#include "lldrawable.h" 39#include "lldrawable.h"
@@ -69,7 +70,7 @@ void LLViewerPartSource::updatePart(LLViewerPart &part, const F32 dt)
69{ 70{
70} 71}
71 72
72void LLViewerPartSource::update(const F32 dt) 73void LLViewerPartSource::update(const F32 dt)
73{ 74{
74 llerrs << "Creating default part source!" << llendl; 75 llerrs << "Creating default part source!" << llendl;
75} 76}
@@ -99,7 +100,7 @@ LLViewerPartSourceScript::LLViewerPartSourceScript(LLViewerObject *source_objp)
99 mSourceObjectp = source_objp; 100 mSourceObjectp = source_objp;
100 mPosAgent = mSourceObjectp->getPositionAgent(); 101 mPosAgent = mSourceObjectp->getPositionAgent();
101 mImagep = gImageList.getImageFromFile("pixiesmall.j2c"); 102 mImagep = gImageList.getImageFromFile("pixiesmall.j2c");
102 mImagep->bind(); 103 gGL.getTexUnit(0)->bind(mImagep.get());
103 mImagep->setClamp(TRUE, TRUE); 104 mImagep->setClamp(TRUE, TRUE);
104} 105}
105 106
@@ -282,6 +283,10 @@ void LLViewerPartSourceScript::update(const F32 dt)
282 283
283 part->init(this, mImagep, NULL); 284 part->init(this, mImagep, NULL);
284 part->mFlags = mPartSysData.mPartData.mFlags; 285 part->mFlags = mPartSysData.mPartData.mFlags;
286 if (!mSourceObjectp.isNull() && mSourceObjectp->isHUDAttachment())
287 {
288 part->mFlags |= LLPartData::LL_PART_HUD;
289 }
285 part->mMaxAge = mPartSysData.mPartData.mMaxAge; 290 part->mMaxAge = mPartSysData.mPartData.mMaxAge;
286 part->mStartColor = mPartSysData.mPartData.mStartColor; 291 part->mStartColor = mPartSysData.mPartData.mStartColor;
287 part->mEndColor = mPartSysData.mPartData.mEndColor; 292 part->mEndColor = mPartSysData.mPartData.mEndColor;
diff --git a/linden/indra/newview/llviewerregion.cpp b/linden/indra/newview/llviewerregion.cpp
index 08dc979..507481a 100644
--- a/linden/indra/newview/llviewerregion.cpp
+++ b/linden/indra/newview/llviewerregion.cpp
@@ -215,6 +215,7 @@ LLViewerRegion::LLViewerRegion(const U64 &handle,
215 mObjectPartition.push_back(new LLGrassPartition()); //PARTITION_GRASS 215 mObjectPartition.push_back(new LLGrassPartition()); //PARTITION_GRASS
216 mObjectPartition.push_back(new LLVolumePartition()); //PARTITION_VOLUME 216 mObjectPartition.push_back(new LLVolumePartition()); //PARTITION_VOLUME
217 mObjectPartition.push_back(new LLBridgePartition()); //PARTITION_BRIDGE 217 mObjectPartition.push_back(new LLBridgePartition()); //PARTITION_BRIDGE
218 mObjectPartition.push_back(new LLHUDParticlePartition());//PARTITION_HUD_PARTICLE
218 mObjectPartition.push_back(NULL); //PARTITION_NONE 219 mObjectPartition.push_back(NULL); //PARTITION_NONE
219 220
220} 221}
@@ -1028,12 +1029,18 @@ void LLViewerRegion::updateCoarseLocations(LLMessageSystem* msg)
1028 msg->getS16Fast(_PREHASH_Index, _PREHASH_You, agent_index); 1029 msg->getS16Fast(_PREHASH_Index, _PREHASH_You, agent_index);
1029 msg->getS16Fast(_PREHASH_Index, _PREHASH_Prey, target_index); 1030 msg->getS16Fast(_PREHASH_Index, _PREHASH_Prey, target_index);
1030 1031
1032 BOOL has_agent_data = msg->has(_PREHASH_AgentData);
1031 S32 count = msg->getNumberOfBlocksFast(_PREHASH_Location); 1033 S32 count = msg->getNumberOfBlocksFast(_PREHASH_Location);
1032 for(S32 i = 0; i < count; i++) 1034 for(S32 i = 0; i < count; i++)
1033 { 1035 {
1034 msg->getU8Fast(_PREHASH_Location, _PREHASH_X, x_pos, i); 1036 msg->getU8Fast(_PREHASH_Location, _PREHASH_X, x_pos, i);
1035 msg->getU8Fast(_PREHASH_Location, _PREHASH_Y, y_pos, i); 1037 msg->getU8Fast(_PREHASH_Location, _PREHASH_Y, y_pos, i);
1036 msg->getU8Fast(_PREHASH_Location, _PREHASH_Z, z_pos, i); 1038 msg->getU8Fast(_PREHASH_Location, _PREHASH_Z, z_pos, i);
1039 LLUUID agent_id = LLUUID::null;
1040 if(has_agent_data)
1041 {
1042 msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id, i);
1043 }
1037 1044
1038 //llinfos << " object X: " << (S32)x_pos << " Y: " << (S32)y_pos 1045 //llinfos << " object X: " << (S32)x_pos << " Y: " << (S32)y_pos
1039 // << " Z: " << (S32)(z_pos * 4) 1046 // << " Z: " << (S32)(z_pos * 4)
@@ -1059,6 +1066,10 @@ void LLViewerRegion::updateCoarseLocations(LLMessageSystem* msg)
1059 pos <<= 8; 1066 pos <<= 8;
1060 pos |= z_pos; 1067 pos |= z_pos;
1061 mMapAvatars.put(pos); 1068 mMapAvatars.put(pos);
1069 if(has_agent_data)
1070 {
1071 mMapAvatarIDs.put(agent_id);
1072 }
1062 } 1073 }
1063 } 1074 }
1064} 1075}
@@ -1387,8 +1398,12 @@ void LLViewerRegion::setSeedCapability(const std::string& url)
1387 capabilityNames.append("DispatchRegionInfo"); 1398 capabilityNames.append("DispatchRegionInfo");
1388 capabilityNames.append("EstateChangeInfo"); 1399 capabilityNames.append("EstateChangeInfo");
1389 capabilityNames.append("EventQueueGet"); 1400 capabilityNames.append("EventQueueGet");
1390 capabilityNames.append("FetchInventoryDescendents"); 1401 capabilityNames.append("FetchInventory");
1402 capabilityNames.append("WebFetchInventoryDescendents");
1403 capabilityNames.append("FetchLib");
1404 capabilityNames.append("FetchLibDescendents");
1391 capabilityNames.append("GroupProposalBallot"); 1405 capabilityNames.append("GroupProposalBallot");
1406 capabilityNames.append("HomeLocation");
1392 capabilityNames.append("MapLayer"); 1407 capabilityNames.append("MapLayer");
1393 capabilityNames.append("MapLayerGod"); 1408 capabilityNames.append("MapLayerGod");
1394 capabilityNames.append("NewFileAgentInventory"); 1409 capabilityNames.append("NewFileAgentInventory");
diff --git a/linden/indra/newview/llviewerregion.h b/linden/indra/newview/llviewerregion.h
index d65ad23..097bfcc 100644
--- a/linden/indra/newview/llviewerregion.h
+++ b/linden/indra/newview/llviewerregion.h
@@ -81,6 +81,7 @@ public:
81 PARTITION_GRASS, 81 PARTITION_GRASS,
82 PARTITION_VOLUME, 82 PARTITION_VOLUME,
83 PARTITION_BRIDGE, 83 PARTITION_BRIDGE,
84 PARTITION_HUD_PARTICLE,
84 PARTITION_NONE, 85 PARTITION_NONE,
85 NUM_PARTITIONS 86 NUM_PARTITIONS
86 } eObjectPartitions; 87 } eObjectPartitions;
diff --git a/linden/indra/newview/llviewershadermgr.cpp b/linden/indra/newview/llviewershadermgr.cpp
index a654120..44f6abe 100644
--- a/linden/indra/newview/llviewershadermgr.cpp
+++ b/linden/indra/newview/llviewershadermgr.cpp
@@ -108,7 +108,7 @@ GLint gAvatarMatrixParam;
108LLViewerShaderMgr::LLViewerShaderMgr() : 108LLViewerShaderMgr::LLViewerShaderMgr() :
109 mVertexShaderLevel(SHADER_COUNT, 0) 109 mVertexShaderLevel(SHADER_COUNT, 0)
110{ 110{
111/// Make sure WL Sky is the first program 111 /// Make sure WL Sky is the first program
112 mShaderList.push_back(&gWLSkyProgram); 112 mShaderList.push_back(&gWLSkyProgram);
113 mShaderList.push_back(&gWLCloudProgram); 113 mShaderList.push_back(&gWLCloudProgram);
114 mShaderList.push_back(&gAvatarProgram); 114 mShaderList.push_back(&gAvatarProgram);
@@ -139,28 +139,28 @@ LLViewerShaderMgr * LLViewerShaderMgr::instance()
139 if(NULL == sInstance) 139 if(NULL == sInstance)
140 { 140 {
141 sInstance = new LLViewerShaderMgr(); 141 sInstance = new LLViewerShaderMgr();
142 }
143
144 return static_cast<LLViewerShaderMgr*>(sInstance);
145 } 142 }
146 143
144 return static_cast<LLViewerShaderMgr*>(sInstance);
145}
146
147void LLViewerShaderMgr::initAttribsAndUniforms(void) 147void LLViewerShaderMgr::initAttribsAndUniforms(void)
148 { 148{
149 if (mReservedAttribs.empty()) 149 if (mReservedAttribs.empty())
150 { 150 {
151 mReservedAttribs.push_back("materialColor"); 151 mReservedAttribs.push_back("materialColor");
152 mReservedAttribs.push_back("specularColor"); 152 mReservedAttribs.push_back("specularColor");
153 mReservedAttribs.push_back("binormal"); 153 mReservedAttribs.push_back("binormal");
154 154
155 mAvatarAttribs.reserve(5); 155 mAvatarAttribs.reserve(5);
156 mAvatarAttribs.push_back("weight"); 156 mAvatarAttribs.push_back("weight");
157 mAvatarAttribs.push_back("clothing"); 157 mAvatarAttribs.push_back("clothing");
158 mAvatarAttribs.push_back("gWindDir"); 158 mAvatarAttribs.push_back("gWindDir");
159 mAvatarAttribs.push_back("gSinWaveParams"); 159 mAvatarAttribs.push_back("gSinWaveParams");
160 mAvatarAttribs.push_back("gGravity"); 160 mAvatarAttribs.push_back("gGravity");
161 161
162 mAvatarUniforms.push_back("matrixPalette"); 162 mAvatarUniforms.push_back("matrixPalette");
163 163
164 mReservedUniforms.reserve(24); 164 mReservedUniforms.reserve(24);
165 mReservedUniforms.push_back("diffuseMap"); 165 mReservedUniforms.push_back("diffuseMap");
166 mReservedUniforms.push_back("specularMap"); 166 mReservedUniforms.push_back("specularMap");
@@ -186,16 +186,16 @@ void LLViewerShaderMgr::initAttribsAndUniforms(void)
186 mReservedUniforms.push_back("cloud_scale"); 186 mReservedUniforms.push_back("cloud_scale");
187 mReservedUniforms.push_back("gamma"); 187 mReservedUniforms.push_back("gamma");
188 mReservedUniforms.push_back("scene_light_strength"); 188 mReservedUniforms.push_back("scene_light_strength");
189 189
190 mWLUniforms.push_back("camPosLocal"); 190 mWLUniforms.push_back("camPosLocal");
191 191
192 mTerrainUniforms.reserve(5); 192 mTerrainUniforms.reserve(5);
193 mTerrainUniforms.push_back("detail_0"); 193 mTerrainUniforms.push_back("detail_0");
194 mTerrainUniforms.push_back("detail_1"); 194 mTerrainUniforms.push_back("detail_1");
195 mTerrainUniforms.push_back("detail_2"); 195 mTerrainUniforms.push_back("detail_2");
196 mTerrainUniforms.push_back("detail_3"); 196 mTerrainUniforms.push_back("detail_3");
197 mTerrainUniforms.push_back("alpha_ramp"); 197 mTerrainUniforms.push_back("alpha_ramp");
198 198
199 mGlowUniforms.push_back("glowDelta"); 199 mGlowUniforms.push_back("glowDelta");
200 mGlowUniforms.push_back("glowStrength"); 200 mGlowUniforms.push_back("glowStrength");
201 201
@@ -204,7 +204,7 @@ void LLViewerShaderMgr::initAttribsAndUniforms(void)
204 mGlowExtractUniforms.push_back("lumWeights"); 204 mGlowExtractUniforms.push_back("lumWeights");
205 mGlowExtractUniforms.push_back("warmthWeights"); 205 mGlowExtractUniforms.push_back("warmthWeights");
206 mGlowExtractUniforms.push_back("warmthAmount"); 206 mGlowExtractUniforms.push_back("warmthAmount");
207 207
208 mShinyUniforms.push_back("origin"); 208 mShinyUniforms.push_back("origin");
209 209
210 mWaterUniforms.reserve(12); 210 mWaterUniforms.reserve(12);
@@ -222,9 +222,9 @@ void LLViewerShaderMgr::initAttribsAndUniforms(void)
222 mWaterUniforms.push_back("kd"); 222 mWaterUniforms.push_back("kd");
223 mWaterUniforms.push_back("refScale"); 223 mWaterUniforms.push_back("refScale");
224 mWaterUniforms.push_back("waterHeight"); 224 mWaterUniforms.push_back("waterHeight");
225 } 225 }
226 } 226}
227 227
228 228
229//============================================================================ 229//============================================================================
230// Set Levels 230// Set Levels
@@ -1087,12 +1087,12 @@ BOOL LLViewerShaderMgr::loadShadersWindLight()
1087} 1087}
1088 1088
1089std::string LLViewerShaderMgr::getShaderDirPrefix(void) 1089std::string LLViewerShaderMgr::getShaderDirPrefix(void)
1090 { 1090{
1091 return gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "shaders/class"); 1091 return gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "shaders/class");
1092 } 1092}
1093 1093
1094void LLViewerShaderMgr::updateShaderUniforms(LLGLSLShader * shader) 1094void LLViewerShaderMgr::updateShaderUniforms(LLGLSLShader * shader)
1095 { 1095{
1096 LLWLParamManager::instance()->updateShaderUniforms(shader); 1096 LLWLParamManager::instance()->updateShaderUniforms(shader);
1097 LLWaterParamManager::instance()->updateShaderUniforms(shader); 1097 LLWaterParamManager::instance()->updateShaderUniforms(shader);
1098} 1098}
diff --git a/linden/indra/newview/llviewerstats.h b/linden/indra/newview/llviewerstats.h
index f33ad02..5ae8cdc 100644
--- a/linden/indra/newview/llviewerstats.h
+++ b/linden/indra/newview/llviewerstats.h
@@ -77,6 +77,9 @@ public:
77 LLStat mSimAgentMsec; 77 LLStat mSimAgentMsec;
78 LLStat mSimImagesMsec; 78 LLStat mSimImagesMsec;
79 LLStat mSimScriptMsec; 79 LLStat mSimScriptMsec;
80 LLStat mSimSpareMsec;
81 LLStat mSimSleepMsec;
82 LLStat mSimPumpIOMsec;
80 83
81 LLStat mSimMainAgents; 84 LLStat mSimMainAgents;
82 LLStat mSimChildAgents; 85 LLStat mSimChildAgents;
diff --git a/linden/indra/newview/llviewertexteditor.cpp b/linden/indra/newview/llviewertexteditor.cpp
index 8a55b3f..1dda1ca 100644
--- a/linden/indra/newview/llviewertexteditor.cpp
+++ b/linden/indra/newview/llviewertexteditor.cpp
@@ -1402,8 +1402,7 @@ void LLViewerTextEditor::openEmbeddedSound( LLInventoryItem* item )
1402 const F32 SOUND_GAIN = 1.0f; 1402 const F32 SOUND_GAIN = 1.0f;
1403 if(gAudiop) 1403 if(gAudiop)
1404 { 1404 {
1405 F32 volume = gSavedSettings.getBOOL("MuteSounds") ? 0.f : (SOUND_GAIN * gSavedSettings.getF32("AudioLevelSFX")); 1405 gAudiop->triggerSound(item->getAssetUUID(), gAgentID, SOUND_GAIN, LLAudioEngine::AUDIO_TYPE_UI, lpos_global);
1406 gAudiop->triggerSound(item->getAssetUUID(), gAgentID, volume, lpos_global);
1407 } 1406 }
1408 showCopyToInvDialog( item ); 1407 showCopyToInvDialog( item );
1409} 1408}
diff --git a/linden/indra/newview/llviewerwindow.cpp b/linden/indra/newview/llviewerwindow.cpp
index 64c042a..106ad08 100644
--- a/linden/indra/newview/llviewerwindow.cpp
+++ b/linden/indra/newview/llviewerwindow.cpp
@@ -168,6 +168,7 @@
168#include "llviewerobjectlist.h" 168#include "llviewerobjectlist.h"
169#include "llviewerparcelmgr.h" 169#include "llviewerparcelmgr.h"
170#include "llviewerregion.h" 170#include "llviewerregion.h"
171#include "llviewershadermgr.h"
171#include "llviewerstats.h" 172#include "llviewerstats.h"
172#include "llvoavatar.h" 173#include "llvoavatar.h"
173#include "llvovolume.h" 174#include "llvovolume.h"
@@ -182,7 +183,6 @@
182#include "llviewernetwork.h" 183#include "llviewernetwork.h"
183 184
184#if LL_WINDOWS 185#if LL_WINDOWS
185#include "llwindebug.h"
186#include <tchar.h> // For Unicode conversion methods 186#include <tchar.h> // For Unicode conversion methods
187#endif 187#endif
188 188
@@ -218,6 +218,7 @@ LLVector3 gDebugRaycastIntersection;
218LLVector2 gDebugRaycastTexCoord; 218LLVector2 gDebugRaycastTexCoord;
219LLVector3 gDebugRaycastNormal; 219LLVector3 gDebugRaycastNormal;
220LLVector3 gDebugRaycastBinormal; 220LLVector3 gDebugRaycastBinormal;
221S32 gDebugRaycastFaceHit;
221 222
222// HUD display lines in lower right 223// HUD display lines in lower right
223BOOL gDisplayWindInfo = FALSE; 224BOOL gDisplayWindInfo = FALSE;
@@ -1102,6 +1103,7 @@ void LLViewerWindow::handleQuit(LLWindow *window)
1102void LLViewerWindow::handleResize(LLWindow *window, S32 width, S32 height) 1103void LLViewerWindow::handleResize(LLWindow *window, S32 width, S32 height)
1103{ 1104{
1104 reshape(width, height); 1105 reshape(width, height);
1106 mResDirty = true;
1105} 1107}
1106 1108
1107// The top-level window has gained focus (e.g. via ALT-TAB) 1109// The top-level window has gained focus (e.g. via ALT-TAB)
@@ -1258,6 +1260,8 @@ BOOL LLViewerWindow::handleActivate(LLWindow *window, BOOL activated)
1258 1260
1259BOOL LLViewerWindow::handleActivateApp(LLWindow *window, BOOL activating) 1261BOOL LLViewerWindow::handleActivateApp(LLWindow *window, BOOL activating)
1260{ 1262{
1263 //if (!activating) gAgent.changeCameraToDefault();
1264
1261 LLViewerJoystick::getInstance()->setNeedsReset(true); 1265 LLViewerJoystick::getInstance()->setNeedsReset(true);
1262 return FALSE; 1266 return FALSE;
1263} 1267}
@@ -1410,7 +1414,11 @@ LLViewerWindow::LLViewerWindow(
1410 mHideCursorPermanent( FALSE ), 1414 mHideCursorPermanent( FALSE ),
1411 mCursorHidden(FALSE), 1415 mCursorHidden(FALSE),
1412 mIgnoreActivate( FALSE ), 1416 mIgnoreActivate( FALSE ),
1413 mHoverPick() 1417 mHoverPick(),
1418 mResDirty(false),
1419 mStatesDirty(false),
1420 mIsFullscreenChecked(false),
1421 mCurrResolutionIndex(0)
1414{ 1422{
1415 // Default to application directory. 1423 // Default to application directory.
1416 LLViewerWindow::sSnapshotBaseName = "Snapshot"; 1424 LLViewerWindow::sSnapshotBaseName = "Snapshot";
@@ -1426,12 +1434,12 @@ LLViewerWindow::LLViewerWindow(
1426 !gNoRender, 1434 !gNoRender,
1427 ignore_pixel_depth, 1435 ignore_pixel_depth,
1428 gSavedSettings.getU32("RenderFSAASamples")); 1436 gSavedSettings.getU32("RenderFSAASamples"));
1429#if LL_WINDOWS 1437
1430 if (!LLWinDebug::checkExceptionHandler()) 1438 if (!LLAppViewer::instance()->restoreErrorTrap())
1431 { 1439 {
1432 LL_WARNS("Window") << " Someone took over my exception handler (post createWindow)!" << LL_ENDL; 1440 LL_WARNS("Window") << " Someone took over my signal/exception handler (post createWindow)!" << LL_ENDL;
1433 } 1441 }
1434#endif 1442
1435 1443
1436 if (NULL == mWindow) 1444 if (NULL == mWindow)
1437 { 1445 {
@@ -1545,7 +1553,7 @@ void LLViewerWindow::initGLDefaults()
1545 glPixelStorei(GL_PACK_ALIGNMENT,1); 1553 glPixelStorei(GL_PACK_ALIGNMENT,1);
1546 glPixelStorei(GL_UNPACK_ALIGNMENT,1); 1554 glPixelStorei(GL_UNPACK_ALIGNMENT,1);
1547 1555
1548 glEnable(GL_TEXTURE_2D); 1556 gGL.getTexUnit(0)->enable(LLTexUnit::TT_TEXTURE);
1549 1557
1550 // lights for objects 1558 // lights for objects
1551 glShadeModel( GL_SMOOTH ); 1559 glShadeModel( GL_SMOOTH );
@@ -3042,8 +3050,9 @@ BOOL LLViewerWindow::handlePerFrameHover()
3042 3050
3043 if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_RAYCAST)) 3051 if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_RAYCAST))
3044 { 3052 {
3045 gDebugRaycastObject = cursorIntersect(-1, -1, 512.f, NULL, -1, 3053 gDebugRaycastFaceHit = -1;
3046 NULL, 3054 gDebugRaycastObject = cursorIntersect(-1, -1, 512.f, NULL, -1, FALSE,
3055 &gDebugRaycastFaceHit,
3047 &gDebugRaycastIntersection, 3056 &gDebugRaycastIntersection,
3048 &gDebugRaycastTexCoord, 3057 &gDebugRaycastTexCoord,
3049 &gDebugRaycastNormal, 3058 &gDebugRaycastNormal,
@@ -3184,7 +3193,7 @@ void LLViewerWindow::renderSelections( BOOL for_gl_pick, BOOL pick_parcel_walls,
3184 // Render light for editing 3193 // Render light for editing
3185 if (LLSelectMgr::sRenderLightRadius && LLToolMgr::getInstance()->inEdit()) 3194 if (LLSelectMgr::sRenderLightRadius && LLToolMgr::getInstance()->inEdit())
3186 { 3195 {
3187 LLImageGL::unbindTexture(0); 3196 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
3188 LLGLEnable gls_blend(GL_BLEND); 3197 LLGLEnable gls_blend(GL_BLEND);
3189 LLGLEnable gls_cull(GL_CULL_FACE); 3198 LLGLEnable gls_cull(GL_CULL_FACE);
3190 LLGLDepthTest gls_depth(GL_TRUE, GL_FALSE); 3199 LLGLDepthTest gls_depth(GL_TRUE, GL_FALSE);
@@ -3398,7 +3407,7 @@ void LLViewerWindow::schedulePick(LLPickInfo& pick_info)
3398 llassert_always(pick_info.mScreenRegion.notNull()); 3407 llassert_always(pick_info.mScreenRegion.notNull());
3399 mPicks.push_back(pick_info); 3408 mPicks.push_back(pick_info);
3400 3409
3401 S32 scaled_x = llround((F32)pick_info.mMousePt.mX * mDisplayScale.mV[VX]); 3410 /*S32 scaled_x = llround((F32)pick_info.mMousePt.mX * mDisplayScale.mV[VX]);
3402 S32 scaled_y = llround((F32)pick_info.mMousePt.mY * mDisplayScale.mV[VY]); 3411 S32 scaled_y = llround((F32)pick_info.mMousePt.mY * mDisplayScale.mV[VY]);
3403 3412
3404 // Default to not hitting anything 3413 // Default to not hitting anything
@@ -3467,7 +3476,7 @@ void LLViewerWindow::schedulePick(LLPickInfo& pick_info)
3467 3476
3468 setup3DRender(); 3477 setup3DRender();
3469 setup2DRender(); 3478 setup2DRender();
3470 setupViewport(); 3479 setupViewport();*/
3471 3480
3472 // delay further event processing until we receive results of pick 3481 // delay further event processing until we receive results of pick
3473 mWindow->delayInputProcessing(); 3482 mWindow->delayInputProcessing();
@@ -3529,6 +3538,7 @@ LLPickInfo LLViewerWindow::pickImmediate(S32 x, S32 y_from_bot, BOOL pick_trans
3529LLViewerObject* LLViewerWindow::cursorIntersect(S32 mouse_x, S32 mouse_y, F32 depth, 3538LLViewerObject* LLViewerWindow::cursorIntersect(S32 mouse_x, S32 mouse_y, F32 depth,
3530 LLViewerObject *this_object, 3539 LLViewerObject *this_object,
3531 S32 this_face, 3540 S32 this_face,
3541 BOOL pick_transparent,
3532 S32* face_hit, 3542 S32* face_hit,
3533 LLVector3 *intersection, 3543 LLVector3 *intersection,
3534 LLVector2 *uv, 3544 LLVector2 *uv,
@@ -3562,7 +3572,7 @@ LLViewerObject* LLViewerWindow::cursorIntersect(S32 mouse_x, S32 mouse_y, F32 de
3562 { 3572 {
3563 if (this_object->isHUDAttachment()) // is a HUD object? 3573 if (this_object->isHUDAttachment()) // is a HUD object?
3564 { 3574 {
3565 if (this_object->lineSegmentIntersect(mouse_hud_start, mouse_hud_end, this_face, 3575 if (this_object->lineSegmentIntersect(mouse_hud_start, mouse_hud_end, this_face, pick_transparent,
3566 face_hit, intersection, uv, normal, binormal)) 3576 face_hit, intersection, uv, normal, binormal))
3567 { 3577 {
3568 found = this_object; 3578 found = this_object;
@@ -3571,7 +3581,7 @@ LLViewerObject* LLViewerWindow::cursorIntersect(S32 mouse_x, S32 mouse_y, F32 de
3571 3581
3572 else // is a world object 3582 else // is a world object
3573 { 3583 {
3574 if (this_object->lineSegmentIntersect(mouse_world_start, mouse_world_end, this_face, 3584 if (this_object->lineSegmentIntersect(mouse_world_start, mouse_world_end, this_face, pick_transparent,
3575 face_hit, intersection, uv, normal, binormal)) 3585 face_hit, intersection, uv, normal, binormal))
3576 { 3586 {
3577 found = this_object; 3587 found = this_object;
@@ -3581,13 +3591,13 @@ LLViewerObject* LLViewerWindow::cursorIntersect(S32 mouse_x, S32 mouse_y, F32 de
3581 3591
3582 else // check ALL objects 3592 else // check ALL objects
3583 { 3593 {
3584 found = gPipeline.lineSegmentIntersectInHUD(mouse_hud_start, mouse_hud_end, 3594 found = gPipeline.lineSegmentIntersectInHUD(mouse_hud_start, mouse_hud_end, pick_transparent,
3585 face_hit, intersection, uv, normal, binormal); 3595 face_hit, intersection, uv, normal, binormal);
3586 3596
3587 if (!found) // if not found in HUD, look in world: 3597 if (!found) // if not found in HUD, look in world:
3588 3598
3589 { 3599 {
3590 found = gPipeline.lineSegmentIntersectInWorld(mouse_world_start, mouse_world_end, 3600 found = gPipeline.lineSegmentIntersectInWorld(mouse_world_start, mouse_world_end, pick_transparent,
3591 face_hit, intersection, uv, normal, binormal); 3601 face_hit, intersection, uv, normal, binormal);
3592 } 3602 }
3593 3603
@@ -3811,13 +3821,8 @@ BOOL LLViewerWindow::saveImageNumbered(LLImageFormatted *image)
3811 return FALSE; 3821 return FALSE;
3812 } 3822 }
3813 3823
3814 std::string extension("." + image->getExtension());
3815 if (extension.empty())
3816 {
3817 extension = (gSavedSettings.getBOOL("CompressSnapshotsToDisk")) ? ".j2c" : ".bmp";
3818 }
3819
3820 LLFilePicker::ESaveFilter pick_type; 3824 LLFilePicker::ESaveFilter pick_type;
3825 std::string extension("." + image->getExtension());
3821 if (extension == ".j2c") 3826 if (extension == ".j2c")
3822 pick_type = LLFilePicker::FFSAVE_J2C; 3827 pick_type = LLFilePicker::FFSAVE_J2C;
3823 else if (extension == ".bmp") 3828 else if (extension == ".bmp")
@@ -3835,7 +3840,8 @@ BOOL LLViewerWindow::saveImageNumbered(LLImageFormatted *image)
3835 if ( ! isSnapshotLocSet()) 3840 if ( ! isSnapshotLocSet())
3836 { 3841 {
3837 std::string proposed_name( sSnapshotBaseName ); 3842 std::string proposed_name( sSnapshotBaseName );
3838 proposed_name.append( extension ); 3843
3844 // getSaveFile will append an appropriate extension to the proposed name, based on the ESaveFilter constant passed in.
3839 3845
3840 // pick a directory in which to save 3846 // pick a directory in which to save
3841 LLFilePicker& picker = LLFilePicker::instance(); 3847 LLFilePicker& picker = LLFilePicker::instance();
@@ -4152,7 +4158,7 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei
4152 4158
4153 snapshot_width = image_width; 4159 snapshot_width = image_width;
4154 snapshot_height = image_height; 4160 snapshot_height = image_height;
4155 target.allocate(snapshot_width, snapshot_height, GL_RGBA, TRUE, GL_TEXTURE_RECTANGLE_ARB, TRUE); 4161 target.allocate(snapshot_width, snapshot_height, GL_RGBA, TRUE, LLTexUnit::TT_RECT_TEXTURE, TRUE);
4156 window_width = snapshot_width; 4162 window_width = snapshot_width;
4157 window_height = snapshot_height; 4163 window_height = snapshot_height;
4158 scale_factor = 1.f; 4164 scale_factor = 1.f;
@@ -4380,7 +4386,7 @@ void LLViewerWindow::drawMouselookInstructions()
4380 llround(font->getLineHeight() + 2 * INSTRUCTIONS_PAD)); 4386 llround(font->getLineHeight() + 2 * INSTRUCTIONS_PAD));
4381 4387
4382 { 4388 {
4383 LLGLSNoTexture gls_no_texture; 4389 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
4384 gGL.color4f( 0.9f, 0.9f, 0.9f, 1.0f ); 4390 gGL.color4f( 0.9f, 0.9f, 0.9f, 1.0f );
4385 gl_rect_2d( instructions_rect ); 4391 gl_rect_2d( instructions_rect );
4386 } 4392 }
@@ -4586,12 +4592,10 @@ void LLViewerWindow::restoreGL(const std::string& progress_message)
4586 setProgressString(progress_message); 4592 setProgressString(progress_message);
4587 } 4593 }
4588 llinfos << "...Restoring GL done" << llendl; 4594 llinfos << "...Restoring GL done" << llendl;
4589#if LL_WINDOWS 4595 if(!LLAppViewer::instance()->restoreErrorTrap())
4590 if(!LLWinDebug::checkExceptionHandler())
4591 { 4596 {
4592 llwarns << " Someone took over my exception handler (post restoreGL)!" << llendl; 4597 llwarns << " Someone took over my signal/exception handler (post restoreGL)!" << llendl;
4593 } 4598 }
4594#endif
4595 4599
4596 } 4600 }
4597} 4601}
@@ -4647,9 +4651,97 @@ void LLViewerWindow::getTargetWindow(BOOL& fullscreen, S32& width, S32& height)
4647 } 4651 }
4648} 4652}
4649 4653
4654bool LLViewerWindow::updateResolution()
4655{
4656 if (gSavedSettings.getBOOL("FullScreenAutoDetectAspectRatio"))
4657 {
4658 getWindow()->setNativeAspectRatio(0.f);
4659 }
4660 else
4661 {
4662 getWindow()->setNativeAspectRatio(gSavedSettings.getF32("FullScreenAspectRatio"));
4663 }
4664
4665 reshape(getWindowDisplayWidth(), getWindowDisplayHeight());
4666
4667 // Screen resolution
4668 S32 num_resolutions;
4669 LLWindow::LLWindowResolution* supported_resolutions = getWindow()->getSupportedResolutions(num_resolutions);
4670
4671 // check if resolution has changed
4672 BOOL targetFullscreen;
4673 S32 targetWidth;
4674 S32 targetHeight;
4675
4676 getTargetWindow(targetFullscreen, targetWidth, targetHeight);
4677
4678 if ((mIsFullscreenChecked != (bool) targetFullscreen) ||
4679 (mIsFullscreenChecked &&
4680 (supported_resolutions[mCurrResolutionIndex].mWidth != targetWidth ||
4681 supported_resolutions[mCurrResolutionIndex].mHeight != targetHeight)
4682 ))
4683 {
4684 // change fullscreen resolution or switch in/out of windowed mode
4685 BOOL result;
4686
4687 BOOL logged_in = (LLStartUp::getStartupState() >= STATE_STARTED);
4688 if (mIsFullscreenChecked)
4689 {
4690 result = changeDisplaySettings(TRUE,
4691 LLCoordScreen( supported_resolutions[mCurrResolutionIndex].mWidth,
4692 supported_resolutions[mCurrResolutionIndex].mHeight),
4693 gSavedSettings.getBOOL("DisableVerticalSync"),
4694 logged_in);
4695 }
4696 else
4697 {
4698 result = changeDisplaySettings(FALSE,
4699 LLCoordScreen(gSavedSettings.getS32("WindowWidth"), gSavedSettings.getS32("WindowHeight")),
4700 TRUE,
4701 logged_in);
4702 }
4703 if (!result)
4704 {
4705
4706 // GL is non-existent at this point, so we can't continue.
4707 llerrs << "LLPanelDisplay::apply() failed" << llendl;
4708 }
4709 }
4710
4711 // force aspect ratio
4712 if (mIsFullscreenChecked)
4713 {
4714 LLViewerCamera::getInstance()->setAspect( getDisplayAspectRatio() );
4715 }
4716 return true;
4717}
4718
4719void LLViewerWindow::requestResolutionUpdate(bool fullscreen_checked, U32 resolution_index)
4720{
4721 mResDirty = true;
4722 mIsFullscreenChecked = fullscreen_checked;
4723 mCurrResolutionIndex = resolution_index;
4724}
4725
4650 4726
4651BOOL LLViewerWindow::checkSettings() 4727BOOL LLViewerWindow::checkSettings()
4652{ 4728{
4729 if (mStatesDirty)
4730 {
4731 gGL.refreshState();
4732 LLViewerShaderMgr::instance()->setShaders();
4733 mStatesDirty = false;
4734 }
4735
4736 // We want to update the resolution AFTER the states getting refreshed not before.
4737 if (mResDirty)
4738 {
4739 updateResolution();
4740 mResDirty = false;
4741 // This will force a state update the next frame.
4742 mStatesDirty = true;
4743 }
4744
4653 BOOL is_fullscreen = mWindow->getFullscreen(); 4745 BOOL is_fullscreen = mWindow->getFullscreen();
4654 if (is_fullscreen && !mWantFullscreen) 4746 if (is_fullscreen && !mWantFullscreen)
4655 { 4747 {
@@ -4658,6 +4750,7 @@ BOOL LLViewerWindow::checkSettings()
4658 gSavedSettings.getS32("WindowHeight")), 4750 gSavedSettings.getS32("WindowHeight")),
4659 TRUE, 4751 TRUE,
4660 mShowFullscreenProgress); 4752 mShowFullscreenProgress);
4753 mStatesDirty = true;
4661 return TRUE; 4754 return TRUE;
4662 } 4755 }
4663 else if (!is_fullscreen && mWantFullscreen) 4756 else if (!is_fullscreen && mWantFullscreen)
@@ -4677,6 +4770,7 @@ BOOL LLViewerWindow::checkSettings()
4677 4770
4678 LLGLState::checkStates(); 4771 LLGLState::checkStates();
4679 LLGLState::checkTextureChannels(); 4772 LLGLState::checkTextureChannels();
4773 mStatesDirty = true;
4680 return TRUE; 4774 return TRUE;
4681 } 4775 }
4682 return FALSE; 4776 return FALSE;
@@ -5103,25 +5197,34 @@ LLPickInfo::~LLPickInfo()
5103 5197
5104void LLPickInfo::fetchResults() 5198void LLPickInfo::fetchResults()
5105{ 5199{
5200
5201 S32 face_hit = -1;
5202 LLVector3 intersection, normal, binormal;
5203 LLVector2 uv;
5204
5205 LLViewerObject* hit_object = gViewerWindow->cursorIntersect(-1, -1, 512.f,
5206 NULL, -1, mPickTransparent, &face_hit,
5207 &intersection, &uv, &normal, &binormal);
5208
5106 // read back colors and depth values from buffer 5209 // read back colors and depth values from buffer
5107 glReadPixels(mScreenRegion.mLeft, mScreenRegion.mBottom, mScreenRegion.getWidth(), mScreenRegion.getHeight(), GL_RGBA, GL_UNSIGNED_BYTE, mPickBuffer); 5210 //glReadPixels(mScreenRegion.mLeft, mScreenRegion.mBottom, mScreenRegion.getWidth(), mScreenRegion.getHeight(), GL_RGBA, GL_UNSIGNED_BYTE, mPickBuffer);
5108 glReadPixels(mScreenRegion.mLeft, mScreenRegion.mBottom, mScreenRegion.getWidth(), mScreenRegion.getHeight(), GL_DEPTH_COMPONENT, GL_FLOAT, mPickDepthBuffer ); 5211 //glReadPixels(mScreenRegion.mLeft, mScreenRegion.mBottom, mScreenRegion.getWidth(), mScreenRegion.getHeight(), GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, mPickDepthBuffer );
5109 5212
5110 // find pick region that is fully onscreen 5213 // find pick region that is fully onscreen
5111 LLCoordGL scaled_pick_point;; 5214 LLCoordGL scaled_pick_point;;
5112 scaled_pick_point.mX = llclamp(llround((F32)mMousePt.mX * gViewerWindow->getDisplayScale().mV[VX]), PICK_HALF_WIDTH, gViewerWindow->getWindowDisplayWidth() - PICK_HALF_WIDTH); 5215 scaled_pick_point.mX = llclamp(llround((F32)mMousePt.mX * gViewerWindow->getDisplayScale().mV[VX]), PICK_HALF_WIDTH, gViewerWindow->getWindowDisplayWidth() - PICK_HALF_WIDTH);
5113 scaled_pick_point.mY = llclamp(llround((F32)mMousePt.mY * gViewerWindow->getDisplayScale().mV[VY]), PICK_HALF_WIDTH, gViewerWindow->getWindowDisplayHeight() - PICK_HALF_WIDTH); 5216 scaled_pick_point.mY = llclamp(llround((F32)mMousePt.mY * gViewerWindow->getDisplayScale().mV[VY]), PICK_HALF_WIDTH, gViewerWindow->getWindowDisplayHeight() - PICK_HALF_WIDTH);
5114 S32 pixel_index = PICK_HALF_WIDTH * PICK_DIAMETER + PICK_HALF_WIDTH; 5217 //S32 pixel_index = PICK_HALF_WIDTH * PICK_DIAMETER + PICK_HALF_WIDTH;
5115 S32 pick_id = (U32)mPickBuffer[(pixel_index * 4) + 0] << 16 | (U32)mPickBuffer[(pixel_index * 4) + 1] << 8 | (U32)mPickBuffer[(pixel_index * 4) + 2]; 5218 //S32 pick_id = (U32)mPickBuffer[(pixel_index * 4) + 0] << 16 | (U32)mPickBuffer[(pixel_index * 4) + 1] << 8 | (U32)mPickBuffer[(pixel_index * 4) + 2];
5116 F32 depth = mPickDepthBuffer[pixel_index]; 5219 //F32 depth = mPickDepthBuffer[pixel_index];
5117 5220
5118 S32 x_offset = mMousePt.mX - llround((F32)scaled_pick_point.mX / gViewerWindow->getDisplayScale().mV[VX]); 5221 //S32 x_offset = mMousePt.mX - llround((F32)scaled_pick_point.mX / gViewerWindow->getDisplayScale().mV[VX]);
5119 S32 y_offset = mMousePt.mY - llround((F32)scaled_pick_point.mY / gViewerWindow->getDisplayScale().mV[VY]); 5222 //S32 y_offset = mMousePt.mY - llround((F32)scaled_pick_point.mY / gViewerWindow->getDisplayScale().mV[VY]);
5120 5223
5121 mPickPt = mMousePt; 5224 mPickPt = mMousePt;
5122 5225
5123 // we hit nothing, scan surrounding pixels for something useful 5226 // we hit nothing, scan surrounding pixels for something useful
5124 if (!pick_id) 5227 /*if (!pick_id)
5125 { 5228 {
5126 S32 closest_distance = 10000; 5229 S32 closest_distance = 10000;
5127 //S32 closest_pick_name = 0; 5230 //S32 closest_pick_name = 0;
@@ -5142,25 +5245,21 @@ void LLPickInfo::fetchResults()
5142 } 5245 }
5143 } 5246 }
5144 } 5247 }
5145 } 5248 }*/
5146 5249
5147 U32 te_offset = ((U32)pick_id >> 20);
5148 pick_id &= 0x000fffff;
5149 5250
5150 //unproject relative clicked coordinate from window coordinate using GL 5251 U32 te_offset = face_hit > -1 ? face_hit : 0;
5151 GLint viewport[4]; 5252 //pick_id &= 0x000fffff;
5152 GLdouble modelview[16];
5153 GLdouble projection[16];
5154 GLfloat winX, winY;
5155 GLdouble posX, posY, posZ;
5156 5253
5157 LLViewerObject* objectp = gObjectList.getSelectedObject(pick_id); 5254 //unproject relative clicked coordinate from window coordinate using GL
5255
5256 LLViewerObject* objectp = hit_object;
5158 5257
5159 if (pick_id == (S32)GL_NAME_PARCEL_WALL) 5258 //if (pick_id == (S32)GL_NAME_PARCEL_WALL)
5160 { 5259 //{
5161 mPickType = PICK_PARCEL_WALL; 5260 // mPickType = PICK_PARCEL_WALL;
5162 } 5261 //}
5163 else if (objectp) 5262 if (objectp)
5164 { 5263 {
5165 if( objectp->getPCode() == LLViewerObject::LL_VO_SURFACE_PATCH ) 5264 if( objectp->getPCode() == LLViewerObject::LL_VO_SURFACE_PATCH )
5166 { 5265 {
@@ -5186,11 +5285,11 @@ void LLPickInfo::fetchResults()
5186 { 5285 {
5187 mPickType = PICK_OBJECT; 5286 mPickType = PICK_OBJECT;
5188 } 5287 }
5189 mObjectOffset = gAgent.calcFocusOffset(objectp, mPickPt.mX, mPickPt.mY); 5288 mObjectOffset = gAgent.calcFocusOffset(objectp, intersection, mPickPt.mX, mPickPt.mY);
5190 mObjectID = objectp->mID; 5289 mObjectID = objectp->mID;
5191 mObjectFace = (te_offset == NO_FACE) ? -1 : (S32)te_offset; 5290 mObjectFace = (te_offset == NO_FACE) ? -1 : (S32)te_offset;
5192 5291
5193 glh::matrix4f newModel((F32*)LLViewerCamera::getInstance()->getModelview().mMatrix); 5292 /*glh::matrix4f newModel((F32*)LLViewerCamera::getInstance()->getModelview().mMatrix);
5194 5293
5195 for(U32 i = 0; i < 16; ++i) 5294 for(U32 i = 0; i < 16; ++i)
5196 { 5295 {
@@ -5202,9 +5301,9 @@ void LLPickInfo::fetchResults()
5202 winX = ((F32)mPickPt.mX) * gViewerWindow->getDisplayScale().mV[VX]; 5301 winX = ((F32)mPickPt.mX) * gViewerWindow->getDisplayScale().mV[VX];
5203 winY = ((F32)mPickPt.mY) * gViewerWindow->getDisplayScale().mV[VY]; 5302 winY = ((F32)mPickPt.mY) * gViewerWindow->getDisplayScale().mV[VY];
5204 5303
5205 gluUnProject( winX, winY, depth, modelview, projection, viewport, &posX, &posY, &posZ); 5304 gluUnProject( winX, winY, depth, modelview, projection, viewport, &posX, &posY, &posZ);*/
5206 5305
5207 mPosGlobal = gAgent.getPosGlobalFromAgent(LLVector3(posX, posY, posZ)); 5306 mPosGlobal = gAgent.getPosGlobalFromAgent(intersection);
5208 5307
5209 if (mWantSurfaceInfo) 5308 if (mWantSurfaceInfo)
5210 { 5309 {
@@ -5212,16 +5311,16 @@ void LLPickInfo::fetchResults()
5212 } 5311 }
5213 } 5312 }
5214 } 5313 }
5215 else 5314 //else
5216 { 5315 //{
5217 // was this name referring to a hud icon? 5316 // was this name referring to a hud icon?
5218 mHUDIcon = LLHUDIcon::handlePick(pick_id); 5317 // mHUDIcon = LLHUDIcon::handlePick(pick_id);
5219 if (mHUDIcon) 5318 // if (mHUDIcon)
5220 { 5319 // {
5221 mPickType = PICK_ICON; 5320 // mPickType = PICK_ICON;
5222 mPosGlobal = mHUDIcon->getPositionGlobal(); 5321 // mPosGlobal = mHUDIcon->getPositionGlobal();
5223 } 5322 // }
5224 } 5323 //}
5225 5324
5226 if (mPickCallback) 5325 if (mPickCallback)
5227 { 5326 {
@@ -5236,16 +5335,19 @@ LLPointer<LLViewerObject> LLPickInfo::getObject() const
5236 5335
5237void LLPickInfo::updateXYCoords() 5336void LLPickInfo::updateXYCoords()
5238{ 5337{
5239 const LLTextureEntry* tep = getObject()->getTE(mObjectFace); 5338 if (mObjectFace > -1)
5240 LLPointer<LLViewerImage> imagep = gImageList.getImage(tep->getID());
5241 if(mUVCoords.mV[VX] >= 0.f && mUVCoords.mV[VY] >= 0.f && imagep.notNull())
5242 { 5339 {
5243 LLCoordGL coords; 5340 const LLTextureEntry* tep = getObject()->getTE(mObjectFace);
5244 5341 LLPointer<LLViewerImage> imagep = gImageList.getImage(tep->getID());
5245 coords.mX = llround(mUVCoords.mV[VX] * (F32)imagep->getWidth()); 5342 if(mUVCoords.mV[VX] >= 0.f && mUVCoords.mV[VY] >= 0.f && imagep.notNull())
5246 coords.mY = llround(mUVCoords.mV[VY] * (F32)imagep->getHeight()); 5343 {
5344 LLCoordGL coords;
5345
5346 coords.mX = llround(mUVCoords.mV[VX] * (F32)imagep->getWidth());
5347 coords.mY = llround(mUVCoords.mV[VY] * (F32)imagep->getHeight());
5247 5348
5248 gViewerWindow->getWindow()->convertCoords(coords, &mXYCoords); 5349 gViewerWindow->getWindow()->convertCoords(coords, &mXYCoords);
5350 }
5249 } 5351 }
5250} 5352}
5251 5353
@@ -5256,7 +5358,7 @@ void LLPickInfo::drawPickBuffer() const
5256 gGL.pushMatrix(); 5358 gGL.pushMatrix();
5257 LLGLDisable no_blend(GL_BLEND); 5359 LLGLDisable no_blend(GL_BLEND);
5258 LLGLDisable no_alpha_test(GL_ALPHA_TEST); 5360 LLGLDisable no_alpha_test(GL_ALPHA_TEST);
5259 LLGLSNoTexture no_texture; 5361 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
5260 glPixelZoom(10.f, 10.f); 5362 glPixelZoom(10.f, 10.f);
5261 LLVector2 display_scale = gViewerWindow->getDisplayScale(); 5363 LLVector2 display_scale = gViewerWindow->getDisplayScale();
5262 glRasterPos2f(((F32)mMousePt.mX * display_scale.mV[VX] + 10.f), 5364 glRasterPos2f(((F32)mMousePt.mX * display_scale.mV[VX] + 10.f),
@@ -5308,7 +5410,7 @@ void LLPickInfo::getSurfaceInfo()
5308 if (objectp) 5410 if (objectp)
5309 { 5411 {
5310 if (gViewerWindow->cursorIntersect(llround((F32)mMousePt.mX), llround((F32)mMousePt.mY), 1024.f, 5412 if (gViewerWindow->cursorIntersect(llround((F32)mMousePt.mX), llround((F32)mMousePt.mY), 1024.f,
5311 objectp, -1, 5413 objectp, -1, mPickTransparent,
5312 &mObjectFace, 5414 &mObjectFace,
5313 &mIntersection, 5415 &mIntersection,
5314 &mSTCoords, 5416 &mSTCoords,
@@ -5317,7 +5419,7 @@ void LLPickInfo::getSurfaceInfo()
5317 { 5419 {
5318 // if we succeeded with the intersect above, compute the texture coordinates: 5420 // if we succeeded with the intersect above, compute the texture coordinates:
5319 5421
5320 if (objectp->mDrawable.notNull()) 5422 if (objectp->mDrawable.notNull() && mObjectFace > -1)
5321 { 5423 {
5322 LLFace* facep = objectp->mDrawable->getFace(mObjectFace); 5424 LLFace* facep = objectp->mDrawable->getFace(mObjectFace);
5323 5425
diff --git a/linden/indra/newview/llviewerwindow.h b/linden/indra/newview/llviewerwindow.h
index 21df0d5..28fcb3e 100644
--- a/linden/indra/newview/llviewerwindow.h
+++ b/linden/indra/newview/llviewerwindow.h
@@ -313,6 +313,7 @@ public:
313 LLViewerObject* cursorIntersect(S32 mouse_x = -1, S32 mouse_y = -1, F32 depth = 512.f, 313 LLViewerObject* cursorIntersect(S32 mouse_x = -1, S32 mouse_y = -1, F32 depth = 512.f,
314 LLViewerObject *this_object = NULL, 314 LLViewerObject *this_object = NULL,
315 S32 this_face = -1, 315 S32 this_face = -1,
316 BOOL pick_transparent = FALSE,
316 S32* face_hit = NULL, 317 S32* face_hit = NULL,
317 LLVector3 *intersection = NULL, 318 LLVector3 *intersection = NULL,
318 LLVector2 *uv = NULL, 319 LLVector2 *uv = NULL,
@@ -340,6 +341,8 @@ public:
340 void toggleFullscreen(BOOL show_progress); 341 void toggleFullscreen(BOOL show_progress);
341 342
342 // handle shutting down GL and bringing it back up 343 // handle shutting down GL and bringing it back up
344 bool updateResolution(void);
345 void requestResolutionUpdate(bool fullscreen_checked, U32 resolution_index);
343 BOOL checkSettings(); 346 BOOL checkSettings();
344 void restartDisplay(BOOL show_progress_bar); 347 void restartDisplay(BOOL show_progress_bar);
345 BOOL changeDisplaySettings(BOOL fullscreen, LLCoordScreen size, BOOL disable_vsync, BOOL show_progress_bar); 348 BOOL changeDisplaySettings(BOOL fullscreen, LLCoordScreen size, BOOL disable_vsync, BOOL show_progress_bar);
@@ -421,6 +424,11 @@ protected:
421 std::string mInitAlert; // Window / GL initialization requires an alert 424 std::string mInitAlert; // Window / GL initialization requires an alert
422 425
423 class LLDebugText* mDebugText; // Internal class for debug text 426 class LLDebugText* mDebugText; // Internal class for debug text
427
428 bool mResDirty;
429 bool mStatesDirty;
430 bool mIsFullscreenChecked; // Did the user check the fullscreen checkbox in the display settings
431 U32 mCurrResolutionIndex;
424 432
425protected: 433protected:
426 static std::string sSnapshotBaseName; 434 static std::string sSnapshotBaseName;
@@ -473,6 +481,7 @@ extern LLVector3 gDebugRaycastIntersection;
473extern LLVector2 gDebugRaycastTexCoord; 481extern LLVector2 gDebugRaycastTexCoord;
474extern LLVector3 gDebugRaycastNormal; 482extern LLVector3 gDebugRaycastNormal;
475extern LLVector3 gDebugRaycastBinormal; 483extern LLVector3 gDebugRaycastBinormal;
484extern S32 gDebugRaycastFaceHit;
476 485
477extern S32 CHAT_BAR_HEIGHT; 486extern S32 CHAT_BAR_HEIGHT;
478 487
diff --git a/linden/indra/newview/llvoavatar.cpp b/linden/indra/newview/llvoavatar.cpp
index e480eb3..c3ad4f9 100644
--- a/linden/indra/newview/llvoavatar.cpp
+++ b/linden/indra/newview/llvoavatar.cpp
@@ -244,6 +244,11 @@ static F32 calc_bouncy_animation(F32 x)
244 return -(cosf(x * F_PI * 2.5f - F_PI_BY_TWO))*(0.4f + x * -0.1f) + x * 1.3f; 244 return -(cosf(x * F_PI * 2.5f - F_PI_BY_TWO))*(0.4f + x * -0.1f) + x * 1.3f;
245} 245}
246 246
247BOOL LLLineSegmentCapsuleIntersect(const LLVector3& start, const LLVector3& end, const LLVector3& p1, const LLVector3& p2, const F32& radius, LLVector3& result)
248{
249 return FALSE;
250}
251
247//----------------------------------------------------------------------------- 252//-----------------------------------------------------------------------------
248// Static Data 253// Static Data
249//----------------------------------------------------------------------------- 254//-----------------------------------------------------------------------------
@@ -753,7 +758,7 @@ LLVOAvatar::LLVOAvatar(
753 mRippleTimeLast = 0.f; 758 mRippleTimeLast = 0.f;
754 759
755 mShadowImagep = gImageList.getImageFromFile("foot_shadow.j2c"); 760 mShadowImagep = gImageList.getImageFromFile("foot_shadow.j2c");
756 mShadowImagep->bind(); 761 gGL.getTexUnit(0)->bind(mShadowImagep.get());
757 mShadowImagep->setClamp(TRUE, TRUE); 762 mShadowImagep->setClamp(TRUE, TRUE);
758 763
759 mInAir = FALSE; 764 mInAir = FALSE;
@@ -1131,7 +1136,7 @@ void LLVOAvatar::dumpBakedStatus()
1131 } 1136 }
1132 1137
1133 1138
1134 F64 dist_to_camera = (inst->getPositionGlobal() - camera_pos_global).magVec(); 1139 F64 dist_to_camera = (inst->getPositionGlobal() - camera_pos_global).length();
1135 llcont << " " << dist_to_camera << "m "; 1140 llcont << " " << dist_to_camera << "m ";
1136 1141
1137 llcont << " " << inst->mPixelArea << " pixels"; 1142 llcont << " " << inst->mPixelArea << " pixels";
@@ -1569,6 +1574,96 @@ void LLVOAvatar::getSpatialExtents(LLVector3& newMin, LLVector3& newMax)
1569 newMax += buffer; 1574 newMax += buffer;
1570} 1575}
1571 1576
1577//-----------------------------------------------------------------------------
1578// renderCollisionVolumes()
1579//-----------------------------------------------------------------------------
1580void LLVOAvatar::renderCollisionVolumes()
1581{
1582 for (S32 i = 0; i < mNumCollisionVolumes; i++)
1583 {
1584 mCollisionVolumes[i].renderCollision();
1585 }
1586
1587 if (mNameText.notNull())
1588 {
1589 LLVector3 unused;
1590 mNameText->lineSegmentIntersect(LLVector3(0,0,0), LLVector3(0,0,1), unused, TRUE);
1591 }
1592}
1593
1594BOOL LLVOAvatar::lineSegmentIntersect(const LLVector3& start, const LLVector3& end,
1595 S32 face,
1596 BOOL pick_transparent,
1597 S32* face_hit,
1598 LLVector3* intersection,
1599 LLVector2* tex_coord,
1600 LLVector3* normal,
1601 LLVector3* bi_normal
1602 )
1603{
1604
1605 if (mIsSelf && !gAgent.needsRenderAvatar())
1606 {
1607 return FALSE;
1608 }
1609
1610 if (lineSegmentBoundingBox(start, end))
1611 {
1612 for (S32 i = 0; i < mNumCollisionVolumes; ++i)
1613 {
1614 mCollisionVolumes[i].updateWorldMatrix();
1615
1616 glh::matrix4f mat((F32*) mCollisionVolumes[i].getXform()->getWorldMatrix().mMatrix);
1617 glh::matrix4f inverse = mat.inverse();
1618 glh::matrix4f norm_mat = inverse.transpose();
1619
1620 glh::vec3f p1(start.mV);
1621 glh::vec3f p2(end.mV);
1622
1623 inverse.mult_matrix_vec(p1);
1624 inverse.mult_matrix_vec(p2);
1625
1626 LLVector3 position;
1627 LLVector3 norm;
1628
1629 if (linesegment_sphere(LLVector3(p1.v), LLVector3(p2.v), LLVector3(0,0,0), 1.f, position, norm))
1630 {
1631 glh::vec3f res_pos(position.mV);
1632 mat.mult_matrix_vec(res_pos);
1633
1634 norm.normalize();
1635 glh::vec3f res_norm(norm.mV);
1636 norm_mat.mult_matrix_dir(res_norm);
1637
1638 if (intersection)
1639 {
1640 *intersection = LLVector3(res_pos.v);
1641 }
1642
1643 if (normal)
1644 {
1645 *normal = LLVector3(res_norm.v);
1646 }
1647
1648 return TRUE;
1649 }
1650 }
1651 }
1652
1653 LLVector3 position;
1654 if (mNameText.notNull() && mNameText->lineSegmentIntersect(start, end, position))
1655 {
1656 if (intersection)
1657 {
1658 *intersection = position;
1659 }
1660
1661 return TRUE;
1662 }
1663
1664 return FALSE;
1665}
1666
1572 1667
1573//----------------------------------------------------------------------------- 1668//-----------------------------------------------------------------------------
1574// parseSkeletonFile() 1669// parseSkeletonFile()
@@ -2737,8 +2832,8 @@ void LLVOAvatar::idleUpdateMisc(bool detailed_update)
2737 else 2832 else
2738 { 2833 {
2739 getSpatialExtents(ext[0], ext[1]); 2834 getSpatialExtents(ext[0], ext[1]);
2740 if ((ext[1]-mImpostorExtents[1]).magVec() > 0.05f || 2835 if ((ext[1]-mImpostorExtents[1]).length() > 0.05f ||
2741 (ext[0]-mImpostorExtents[0]).magVec() > 0.05f) 2836 (ext[0]-mImpostorExtents[0]).length() > 0.05f)
2742 { 2837 {
2743 mNeedsImpostorUpdate = TRUE; 2838 mNeedsImpostorUpdate = TRUE;
2744 } 2839 }
@@ -2905,7 +3000,7 @@ void LLVOAvatar::idleUpdateWindEffect()
2905 F32 time_delta = mRippleTimer.getElapsedTimeF32() - mRippleTimeLast; 3000 F32 time_delta = mRippleTimer.getElapsedTimeF32() - mRippleTimeLast;
2906 mRippleTimeLast = mRippleTimer.getElapsedTimeF32(); 3001 mRippleTimeLast = mRippleTimer.getElapsedTimeF32();
2907 LLVector3 velocity = getVelocity(); 3002 LLVector3 velocity = getVelocity();
2908 F32 speed = velocity.magVec(); 3003 F32 speed = velocity.length();
2909 //RN: velocity varies too much frame to frame for this to work 3004 //RN: velocity varies too much frame to frame for this to work
2910 mRippleAccel.clearVec();//lerp(mRippleAccel, (velocity - mLastVel) * time_delta, LLCriticalDamp::getInterpolant(0.02f)); 3005 mRippleAccel.clearVec();//lerp(mRippleAccel, (velocity - mLastVel) * time_delta, LLCriticalDamp::getInterpolant(0.02f));
2911 mLastVel = velocity; 3006 mLastVel = velocity;
@@ -2924,7 +3019,7 @@ void LLVOAvatar::idleUpdateWindEffect()
2924 } 3019 }
2925 3020
2926 wind.mV[VZ] += hover_strength; 3021 wind.mV[VZ] += hover_strength;
2927 wind.normVec(); 3022 wind.normalize();
2928 3023
2929 wind.mV[VW] = llmin(0.025f + (speed * 0.015f) + hover_strength, 0.5f); 3024 wind.mV[VW] = llmin(0.025f + (speed * 0.015f) + hover_strength, 0.5f);
2930 F32 interp; 3025 F32 interp;
@@ -3047,10 +3142,10 @@ void LLVOAvatar::idleUpdateNameTag(const LLVector3& root_pos_last)
3047 LLVector3 pixel_up_vec; 3142 LLVector3 pixel_up_vec;
3048 LLViewerCamera::getInstance()->getPixelVectors(root_pos_last, pixel_up_vec, pixel_right_vec); 3143 LLViewerCamera::getInstance()->getPixelVectors(root_pos_last, pixel_up_vec, pixel_right_vec);
3049 LLVector3 camera_to_av = root_pos_last - LLViewerCamera::getInstance()->getOrigin(); 3144 LLVector3 camera_to_av = root_pos_last - LLViewerCamera::getInstance()->getOrigin();
3050 camera_to_av.normVec(); 3145 camera_to_av.normalize();
3051 LLVector3 local_camera_at = camera_to_av * ~root_rot; 3146 LLVector3 local_camera_at = camera_to_av * ~root_rot;
3052 LLVector3 local_camera_up = camera_to_av % LLViewerCamera::getInstance()->getLeftAxis(); 3147 LLVector3 local_camera_up = camera_to_av % LLViewerCamera::getInstance()->getLeftAxis();
3053 local_camera_up.normVec(); 3148 local_camera_up.normalize();
3054 local_camera_up = local_camera_up * ~root_rot; 3149 local_camera_up = local_camera_up * ~root_rot;
3055 3150
3056 local_camera_up.scaleVec(mBodySize * 0.5f); 3151 local_camera_up.scaleVec(mBodySize * 0.5f);
@@ -3509,7 +3604,7 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent)
3509 3604
3510 LLVector3 xyVel = getVelocity(); 3605 LLVector3 xyVel = getVelocity();
3511 xyVel.mV[VZ] = 0.0f; 3606 xyVel.mV[VZ] = 0.0f;
3512 speed = xyVel.magVec(); 3607 speed = xyVel.length();
3513 3608
3514 BOOL throttle = TRUE; 3609 BOOL throttle = TRUE;
3515 3610
@@ -3594,14 +3689,14 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent)
3594 if (mIsSelf) 3689 if (mIsSelf)
3595 { 3690 {
3596 primDir = agent.getAtAxis() - projected_vec(agent.getAtAxis(), agent.getReferenceUpVector()); 3691 primDir = agent.getAtAxis() - projected_vec(agent.getAtAxis(), agent.getReferenceUpVector());
3597 primDir.normVec(); 3692 primDir.normalize();
3598 } 3693 }
3599 else 3694 else
3600 { 3695 {
3601 primDir = getRotation().getMatrix3().getFwdRow(); 3696 primDir = getRotation().getMatrix3().getFwdRow();
3602 } 3697 }
3603 LLVector3 velDir = getVelocity(); 3698 LLVector3 velDir = getVelocity();
3604 velDir.normVec(); 3699 velDir.normalize();
3605 if ( mSignaledAnimations.find(ANIM_AGENT_WALK) != mSignaledAnimations.end()) 3700 if ( mSignaledAnimations.find(ANIM_AGENT_WALK) != mSignaledAnimations.end())
3606 { 3701 {
3607 F32 vpD = velDir * primDir; 3702 F32 vpD = velDir * primDir;
@@ -3623,13 +3718,13 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent)
3623 LLVector3 at_axis = LLViewerCamera::getInstance()->getAtAxis(); 3718 LLVector3 at_axis = LLViewerCamera::getInstance()->getAtAxis();
3624 LLVector3 up_vector = gAgent.getReferenceUpVector(); 3719 LLVector3 up_vector = gAgent.getReferenceUpVector();
3625 at_axis -= up_vector * (at_axis * up_vector); 3720 at_axis -= up_vector * (at_axis * up_vector);
3626 at_axis.normVec(); 3721 at_axis.normalize();
3627 3722
3628 F32 dot = fwdDir * at_axis; 3723 F32 dot = fwdDir * at_axis;
3629 if (dot < 0.f) 3724 if (dot < 0.f)
3630 { 3725 {
3631 fwdDir -= 2.f * at_axis * dot; 3726 fwdDir -= 2.f * at_axis * dot;
3632 fwdDir.normVec(); 3727 fwdDir.normalize();
3633 } 3728 }
3634 } 3729 }
3635 3730
@@ -3697,7 +3792,7 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent)
3697 3792
3698 // Now compute the full world space rotation for the whole body (wQv) 3793 // Now compute the full world space rotation for the whole body (wQv)
3699 LLVector3 leftDir = upDir % fwdDir; 3794 LLVector3 leftDir = upDir % fwdDir;
3700 leftDir.normVec(); 3795 leftDir.normalize();
3701 fwdDir = leftDir % upDir; 3796 fwdDir = leftDir % upDir;
3702 LLQuaternion wQv( fwdDir, leftDir, upDir ); 3797 LLQuaternion wQv( fwdDir, leftDir, upDir );
3703 3798
@@ -3828,10 +3923,7 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent)
3828// AUDIO_STEP_LO_SPEED, AUDIO_STEP_HI_SPEED, 3923// AUDIO_STEP_LO_SPEED, AUDIO_STEP_HI_SPEED,
3829// AUDIO_STEP_LO_GAIN, AUDIO_STEP_HI_GAIN ); 3924// AUDIO_STEP_LO_GAIN, AUDIO_STEP_HI_GAIN );
3830 3925
3831 F32 ambient_volume = gSavedSettings.getF32("AudioLevelAmbient"); 3926 const F32 STEP_VOLUME = 0.5f;
3832 F32 gain = gSavedSettings.getBOOL("MuteAmbient")
3833 ? 0.f
3834 : (.50f * ambient_volume * ambient_volume);
3835 LLUUID& step_sound_id = getStepSound(); 3927 LLUUID& step_sound_id = getStepSound();
3836 3928
3837 LLVector3d foot_pos_global = gAgent.getPosGlobalFromAgent(foot_pos_agent); 3929 LLVector3d foot_pos_global = gAgent.getPosGlobalFromAgent(foot_pos_agent);
@@ -3839,7 +3931,7 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent)
3839 if (LLViewerParcelMgr::getInstance()->canHearSound(foot_pos_global) 3931 if (LLViewerParcelMgr::getInstance()->canHearSound(foot_pos_global)
3840 && !LLMuteList::getInstance()->isMuted(getID(), LLMute::flagObjectSounds)) 3932 && !LLMuteList::getInstance()->isMuted(getID(), LLMute::flagObjectSounds))
3841 { 3933 {
3842 gAudiop->triggerSound(step_sound_id, getID(), gain, foot_pos_global); 3934 gAudiop->triggerSound(step_sound_id, getID(), STEP_VOLUME, LLAudioEngine::AUDIO_TYPE_AMBIENT, foot_pos_global);
3843 } 3935 }
3844 } 3936 }
3845 } 3937 }
@@ -4141,7 +4233,7 @@ U32 LLVOAvatar::renderSkinned(EAvatarRenderPass pass)
4141 LLVector3 collide_point = slaved_pos; 4233 LLVector3 collide_point = slaved_pos;
4142 collide_point.mV[VZ] -= foot_plane_normal.mV[VZ] * (dist_from_plane + COLLISION_TOLERANCE - FOOT_COLLIDE_FUDGE); 4234 collide_point.mV[VZ] -= foot_plane_normal.mV[VZ] * (dist_from_plane + COLLISION_TOLERANCE - FOOT_COLLIDE_FUDGE);
4143 4235
4144 gGL.begin(LLVertexBuffer::LINES); 4236 gGL.begin(LLRender::LINES);
4145 { 4237 {
4146 F32 SQUARE_SIZE = 0.2f; 4238 F32 SQUARE_SIZE = 0.2f;
4147 gGL.color4f(1.f, 0.f, 0.f, 1.f); 4239 gGL.color4f(1.f, 0.f, 0.f, 1.f);
@@ -4288,7 +4380,7 @@ U32 LLVOAvatar::renderFootShadows()
4288 LLGLDepthTest test(GL_TRUE, GL_FALSE); 4380 LLGLDepthTest test(GL_TRUE, GL_FALSE);
4289 //render foot shadows 4381 //render foot shadows
4290 LLGLEnable blend(GL_BLEND); 4382 LLGLEnable blend(GL_BLEND);
4291 mShadowImagep->bind(); 4383 gGL.getTexUnit(0)->bind(mShadowImagep.get());
4292 glColor4fv(mShadow0Facep->getRenderColor().mV); 4384 glColor4fv(mShadow0Facep->getRenderColor().mV);
4293 mShadow0Facep->renderIndexed(foot_mask); 4385 mShadow0Facep->renderIndexed(foot_mask);
4294 glColor4fv(mShadow1Facep->getRenderColor().mV); 4386 glColor4fv(mShadow1Facep->getRenderColor().mV);
@@ -4306,7 +4398,7 @@ U32 LLVOAvatar::renderImpostor(LLColor4U color)
4306 4398
4307 LLVector3 pos(getRenderPosition()+mImpostorOffset); 4399 LLVector3 pos(getRenderPosition()+mImpostorOffset);
4308 LLVector3 at = (pos - LLViewerCamera::getInstance()->getOrigin()); 4400 LLVector3 at = (pos - LLViewerCamera::getInstance()->getOrigin());
4309 at.normVec(); 4401 at.normalize();
4310 LLVector3 left = LLViewerCamera::getInstance()->getUpAxis() % at; 4402 LLVector3 left = LLViewerCamera::getInstance()->getUpAxis() % at;
4311 LLVector3 up = at%left; 4403 LLVector3 up = at%left;
4312 4404
@@ -4334,8 +4426,8 @@ U32 LLVOAvatar::renderImpostor(LLColor4U color)
4334 color.mV[3] = (U8) (alpha*255); 4426 color.mV[3] = (U8) (alpha*255);
4335 4427
4336 gGL.color4ubv(color.mV); 4428 gGL.color4ubv(color.mV);
4337 mImpostor.bindTexture(); 4429 gGL.getTexUnit(0)->bind(&mImpostor);
4338 gGL.begin(LLVertexBuffer::QUADS); 4430 gGL.begin(LLRender::QUADS);
4339 gGL.texCoord2f(0,0); 4431 gGL.texCoord2f(0,0);
4340 gGL.vertex3fv((pos+left-up).mV); 4432 gGL.vertex3fv((pos+left-up).mV);
4341 gGL.texCoord2f(1,0); 4433 gGL.texCoord2f(1,0);
@@ -4350,17 +4442,6 @@ U32 LLVOAvatar::renderImpostor(LLColor4U color)
4350 return 6; 4442 return 6;
4351} 4443}
4352 4444
4353//-----------------------------------------------------------------------------
4354// renderCollisionVolumes()
4355//-----------------------------------------------------------------------------
4356void LLVOAvatar::renderCollisionVolumes()
4357{
4358 for (S32 i = 0; i < mNumCollisionVolumes; i++)
4359 {
4360 mCollisionVolumes[i].renderCollision();
4361 }
4362}
4363
4364//------------------------------------------------------------------------ 4445//------------------------------------------------------------------------
4365// LLVOAvatar::updateTextures() 4446// LLVOAvatar::updateTextures()
4366//------------------------------------------------------------------------ 4447//------------------------------------------------------------------------
@@ -4395,23 +4476,23 @@ void LLVOAvatar::updateTextures(LLAgent &agent)
4395 { 4476 {
4396 if( head_baked && ! mHeadBakedLoaded ) 4477 if( head_baked && ! mHeadBakedLoaded )
4397 { 4478 {
4398 getTEImage( TEX_HEAD_BAKED )->bind(); 4479 gGL.getTexUnit(0)->bind(getTEImage( TEX_HEAD_BAKED ));
4399 } 4480 }
4400 if( upper_baked && ! mUpperBakedLoaded ) 4481 if( upper_baked && ! mUpperBakedLoaded )
4401 { 4482 {
4402 getTEImage( TEX_UPPER_BAKED )->bind(); 4483 gGL.getTexUnit(0)->bind(getTEImage( TEX_UPPER_BAKED ));
4403 } 4484 }
4404 if( lower_baked && ! mLowerBakedLoaded ) 4485 if( lower_baked && ! mLowerBakedLoaded )
4405 { 4486 {
4406 getTEImage( TEX_LOWER_BAKED )->bind(); 4487 gGL.getTexUnit(0)->bind(getTEImage( TEX_LOWER_BAKED ));
4407 } 4488 }
4408 if( eyes_baked && ! mEyesBakedLoaded ) 4489 if( eyes_baked && ! mEyesBakedLoaded )
4409 { 4490 {
4410 getTEImage( TEX_EYES_BAKED )->bind(); 4491 gGL.getTexUnit(0)->bind(getTEImage( TEX_EYES_BAKED ));
4411 } 4492 }
4412 if( skirt_baked && ! mSkirtBakedLoaded ) 4493 if( skirt_baked && ! mSkirtBakedLoaded )
4413 { 4494 {
4414 getTEImage( TEX_SKIRT_BAKED )->bind(); 4495 gGL.getTexUnit(0)->bind(getTEImage( TEX_SKIRT_BAKED ));
4415 } 4496 }
4416 } 4497 }
4417 4498
@@ -4813,14 +4894,12 @@ BOOL LLVOAvatar::processSingleAnimationStateChange( const LLUUID& anim_id, BOOL
4813 // to support both spatialized and non-spatialized instances of the same sound 4894 // to support both spatialized and non-spatialized instances of the same sound
4814 //if (mIsSelf) 4895 //if (mIsSelf)
4815 //{ 4896 //{
4816 // F32 volume = gain * gSavedSettings.getF32("AudioLevelUI") 4897 // gAudiop->triggerSound(LLUUID(gSavedSettings.getString("UISndTyping")), 1.0f, LLAudioEngine::AUDIO_TYPE_UI);
4817 // gAudiop->triggerSound(LLUUID(gSavedSettings.getString("UISndTyping")), volume);
4818 //} 4898 //}
4819 //else 4899 //else
4820 { 4900 {
4821 LLUUID sound_id = LLUUID(gSavedSettings.getString("UISndTyping")); 4901 LLUUID sound_id = LLUUID(gSavedSettings.getString("UISndTyping"));
4822 F32 volume = gSavedSettings.getBOOL("MuteSounds") ? 0.f : gSavedSettings.getF32("AudioLevelSFX"); 4902 gAudiop->triggerSound(sound_id, getID(), 1.0f, LLAudioEngine::AUDIO_TYPE_SFX, char_pos_global);
4823 gAudiop->triggerSound(sound_id, getID(), volume, char_pos_global);
4824 } 4903 }
4825 } 4904 }
4826 } 4905 }
@@ -5719,7 +5798,9 @@ BOOL LLVOAvatar::loadMeshNodes()
5719 5798
5720 // llinfos << "Parsing mesh data for " << type << "..." << llendl; 5799 // llinfos << "Parsing mesh data for " << type << "..." << llendl;
5721 5800
5722 mesh->setColor( 0.8f, 0.8f, 0.8f, 1.0f ); 5801 // If this isn't set to white (1.0), avatars will *ALWAYS* be darker than their surroundings.
5802 // Do not touch!!!
5803 mesh->setColor( 1.0f, 1.0f, 1.0f, 1.0f );
5723 5804
5724 LLPolyMesh *poly_mesh = NULL; 5805 LLPolyMesh *poly_mesh = NULL;
5725 5806
@@ -5837,7 +5918,7 @@ void LLVOAvatar::setPixelAreaAndAngle(LLAgent &agent)
5837 } 5918 }
5838 else 5919 else
5839 { 5920 {
5840 F32 radius = size.magVec(); 5921 F32 radius = size.length();
5841 mAppAngle = (F32) atan2( radius, range) * RAD_TO_DEG; 5922 mAppAngle = (F32) atan2( radius, range) * RAD_TO_DEG;
5842 } 5923 }
5843 5924
@@ -6009,7 +6090,7 @@ void LLVOAvatar::updateShadowFaces()
6009 sprite.setPosition(shadow_pos_agent); 6090 sprite.setPosition(shadow_pos_agent);
6010 6091
6011 LLVector3 foot_to_knee = mKneeLeftp->getWorldPosition() - joint_world_pos; 6092 LLVector3 foot_to_knee = mKneeLeftp->getWorldPosition() - joint_world_pos;
6012 //foot_to_knee.normVec(); 6093 //foot_to_knee.normalize();
6013 foot_to_knee -= projected_vec(foot_to_knee, sun_vec); 6094 foot_to_knee -= projected_vec(foot_to_knee, sun_vec);
6014 sprite.setYaw(azimuth(sun_vec - foot_to_knee)); 6095 sprite.setYaw(azimuth(sun_vec - foot_to_knee));
6015 6096
@@ -6042,7 +6123,7 @@ void LLVOAvatar::updateShadowFaces()
6042 sprite.setPosition(shadow_pos_agent); 6123 sprite.setPosition(shadow_pos_agent);
6043 6124
6044 LLVector3 foot_to_knee = mKneeRightp->getWorldPosition() - joint_world_pos; 6125 LLVector3 foot_to_knee = mKneeRightp->getWorldPosition() - joint_world_pos;
6045 //foot_to_knee.normVec(); 6126 //foot_to_knee.normalize();
6046 foot_to_knee -= projected_vec(foot_to_knee, sun_vec); 6127 foot_to_knee -= projected_vec(foot_to_knee, sun_vec);
6047 sprite.setYaw(azimuth(sun_vec - foot_to_knee)); 6128 sprite.setYaw(azimuth(sun_vec - foot_to_knee));
6048 6129
@@ -6403,7 +6484,7 @@ void LLVOAvatar::getOffObject()
6403 LLVector3 at_axis = LLVector3::x_axis; 6484 LLVector3 at_axis = LLVector3::x_axis;
6404 at_axis = at_axis * av_rot; 6485 at_axis = at_axis * av_rot;
6405 at_axis.mV[VZ] = 0.f; 6486 at_axis.mV[VZ] = 0.f;
6406 at_axis.normVec(); 6487 at_axis.normalize();
6407 gAgent.resetAxes(at_axis); 6488 gAgent.resetAxes(at_axis);
6408 6489
6409 //reset orientation 6490 //reset orientation
@@ -6957,7 +7038,7 @@ BOOL LLVOAvatar::bindScratchTexture( LLGLenum format )
6957 GLuint gl_name = getScratchTexName( format, &texture_bytes ); 7038 GLuint gl_name = getScratchTexName( format, &texture_bytes );
6958 if( gl_name ) 7039 if( gl_name )
6959 { 7040 {
6960 LLImageGL::bindExternalTexture( gl_name, 0, GL_TEXTURE_2D ); 7041 gGL.getTexUnit(0)->bindManual(LLTexUnit::TT_TEXTURE, gl_name);
6961 stop_glerror(); 7042 stop_glerror();
6962 7043
6963 F32* last_bind_time = LLVOAvatar::sScratchTexLastBindTime.getIfThere( format ); 7044 F32* last_bind_time = LLVOAvatar::sScratchTexLastBindTime.getIfThere( format );
@@ -7015,7 +7096,7 @@ LLGLuint LLVOAvatar::getScratchTexName( LLGLenum format, U32* texture_bytes )
7015 glGenTextures(1, &name ); 7096 glGenTextures(1, &name );
7016 stop_glerror(); 7097 stop_glerror();
7017 7098
7018 LLImageGL::bindExternalTexture( name, 0, GL_TEXTURE_2D ); 7099 gGL.getTexUnit(0)->bindManual(LLTexUnit::TT_TEXTURE, name);
7019 stop_glerror(); 7100 stop_glerror();
7020 7101
7021 glTexImage2D( 7102 glTexImage2D(
@@ -7030,7 +7111,7 @@ LLGLuint LLVOAvatar::getScratchTexName( LLGLenum format, U32* texture_bytes )
7030 glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE ); 7111 glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );
7031 stop_glerror(); 7112 stop_glerror();
7032 7113
7033 LLImageGL::unbindTexture(0, GL_TEXTURE_2D); 7114 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
7034 stop_glerror(); 7115 stop_glerror();
7035 7116
7036 LLVOAvatar::sScratchTexNames.addData( format, new LLGLuint( name ) ); 7117 LLVOAvatar::sScratchTexNames.addData( format, new LLGLuint( name ) );
@@ -8639,7 +8720,7 @@ void LLVOAvatar::onBakedTextureMasksLoaded( BOOL success, LLViewerImage *src_vi,
8639 glGenTextures(1, (GLuint*) &gl_name ); 8720 glGenTextures(1, (GLuint*) &gl_name );
8640 stop_glerror(); 8721 stop_glerror();
8641 8722
8642 LLImageGL::bindExternalTexture( gl_name, 0, GL_TEXTURE_2D ); 8723 gGL.getTexUnit(0)->bindManual(LLTexUnit::TT_TEXTURE, gl_name);
8643 stop_glerror(); 8724 stop_glerror();
8644 8725
8645 glTexImage2D( 8726 glTexImage2D(
@@ -9914,7 +9995,7 @@ void LLVOAvatar::getImpostorValues(LLVector3* extents, LLVector3& angle, F32& di
9914 extents[1] = ext[1]; 9995 extents[1] = ext[1];
9915 9996
9916 LLVector3 at = LLViewerCamera::getInstance()->getOrigin()-(getRenderPosition()+mImpostorOffset); 9997 LLVector3 at = LLViewerCamera::getInstance()->getOrigin()-(getRenderPosition()+mImpostorOffset);
9917 distance = at.normVec(); 9998 distance = at.normalize();
9918 F32 da = 1.f - (at*LLViewerCamera::getInstance()->getAtAxis()); 9999 F32 da = 1.f - (at*LLViewerCamera::getInstance()->getAtAxis());
9919 angle.mV[0] = LLViewerCamera::getInstance()->getYaw()*da; 10000 angle.mV[0] = LLViewerCamera::getInstance()->getYaw()*da;
9920 angle.mV[1] = LLViewerCamera::getInstance()->getPitch()*da; 10001 angle.mV[1] = LLViewerCamera::getInstance()->getPitch()*da;
diff --git a/linden/indra/newview/llvoavatar.h b/linden/indra/newview/llvoavatar.h
index d66ddfc..8265e8a 100644
--- a/linden/indra/newview/llvoavatar.h
+++ b/linden/indra/newview/llvoavatar.h
@@ -308,6 +308,16 @@ public:
308 U32 renderTransparent(); 308 U32 renderTransparent();
309 void renderCollisionVolumes(); 309 void renderCollisionVolumes();
310 310
311 /*virtual*/ BOOL lineSegmentIntersect(const LLVector3& start, const LLVector3& end,
312 S32 face = -1, // which face to check, -1 = ALL_SIDES
313 BOOL pick_transparent = FALSE,
314 S32* face_hit = NULL, // which face was hit
315 LLVector3* intersection = NULL, // return the intersection point
316 LLVector2* tex_coord = NULL, // return the texture coordinates of the intersection point
317 LLVector3* normal = NULL, // return the surface normal at the intersection point
318 LLVector3* bi_normal = NULL // return the surface bi-normal at the intersection point
319 );
320
311 /*virtual*/ void updateTextures(LLAgent &agent); 321 /*virtual*/ void updateTextures(LLAgent &agent);
312 // If setting a baked texture, need to request it from a non-local sim. 322 // If setting a baked texture, need to request it from a non-local sim.
313 /*virtual*/ S32 setTETexture(const U8 te, const LLUUID& uuid); 323 /*virtual*/ S32 setTETexture(const U8 te, const LLUUID& uuid);
diff --git a/linden/indra/newview/llvograss.cpp b/linden/indra/newview/llvograss.cpp
index a028a63..821cf3e 100644
--- a/linden/indra/newview/llvograss.cpp
+++ b/linden/indra/newview/llvograss.cpp
@@ -273,9 +273,9 @@ U32 LLVOGrass::processUpdateMessage(LLMessageSystem *mesgsys,
273 273
274 updateSpecies(); 274 updateSpecies();
275 275
276 if ( (getVelocity().magVecSquared() > 0.f) 276 if ( (getVelocity().lengthSquared() > 0.f)
277 ||(getAcceleration().magVecSquared() > 0.f) 277 ||(getAcceleration().lengthSquared() > 0.f)
278 ||(getAngularVelocity().magVecSquared() > 0.f)) 278 ||(getAngularVelocity().lengthSquared() > 0.f))
279 { 279 {
280 llinfos << "ACK! Moving grass!" << llendl; 280 llinfos << "ACK! Moving grass!" << llendl;
281 setVelocity(LLVector3::zero); 281 setVelocity(LLVector3::zero);
@@ -322,7 +322,7 @@ void LLVOGrass::setPixelAreaAndAngle(LLAgent &agent)
322{ 322{
323 // This should be the camera's center, as soon as we move to all region-local. 323 // This should be the camera's center, as soon as we move to all region-local.
324 LLVector3 relative_position = getPositionAgent() - agent.getCameraPositionAgent(); 324 LLVector3 relative_position = getPositionAgent() - agent.getCameraPositionAgent();
325 F32 range = relative_position.magVec(); 325 F32 range = relative_position.length();
326 326
327 F32 max_scale = getMaxScale(); 327 F32 max_scale = getMaxScale();
328 328
@@ -501,7 +501,7 @@ void LLVOGrass::getGeometry(S32 idx,
501 501
502 LLVector3 normal1 = (v1-v2) % (v2-v3); 502 LLVector3 normal1 = (v1-v2) % (v2-v3);
503 normal1.mV[VZ] = 0.75f; 503 normal1.mV[VZ] = 0.75f;
504 normal1.normVec(); 504 normal1.normalize();
505 LLVector3 normal2 = -normal1; 505 LLVector3 normal2 = -normal1;
506 normal2.mV[VZ] = -normal2.mV[VZ]; 506 normal2.mV[VZ] = -normal2.mV[VZ];
507 507
@@ -578,3 +578,146 @@ void LLVOGrass::updateDrawable(BOOL force_damped)
578 } 578 }
579 clearChanged(SHIFTED); 579 clearChanged(SHIFTED);
580} 580}
581
582// virtual
583BOOL LLVOGrass::lineSegmentIntersect(const LLVector3& start, const LLVector3& end, S32 face, BOOL pick_transparent, S32 *face_hitp,
584 LLVector3* intersection,LLVector2* tex_coord, LLVector3* normal, LLVector3* bi_normal)
585
586{
587 BOOL ret = FALSE;
588 if (!mbCanSelect ||
589 mDrawable->isDead() ||
590 !gPipeline.hasRenderType(mDrawable->getRenderType()))
591 {
592 return FALSE;
593 }
594
595 LLVector3 dir = end-start;
596
597 mPatch = mRegionp->getLand().resolvePatchRegion(getPositionRegion());
598
599 LLVector3 position;
600 // Create random blades of grass with gaussian distribution
601 F32 x,y,xf,yf,dzx,dzy;
602
603 LLColor4U color(255,255,255,255);
604
605 F32 width = sSpeciesTable[mSpecies]->mBladeSizeX;
606 F32 height = sSpeciesTable[mSpecies]->mBladeSizeY;
607
608 LLVector2 tc[4];
609 LLVector3 v[4];
610 // LLVector3 n[4]; // unused!
611
612 F32 closest_t = 1.f;
613
614 for (S32 i = 0; i < mNumBlades; i++)
615 {
616 x = exp_x[i] * mScale.mV[VX];
617 y = exp_y[i] * mScale.mV[VY];
618 xf = rot_x[i] * GRASS_BLADE_BASE * width * w_mod[i];
619 yf = rot_y[i] * GRASS_BLADE_BASE * width * w_mod[i];
620 dzx = dz_x [i];
621 dzy = dz_y [i];
622
623 LLVector3 v1,v2,v3;
624 F32 blade_height= GRASS_BLADE_HEIGHT * height * w_mod[i];
625
626 tc[0] = LLVector2(0, 0);
627 tc[1] = LLVector2(0, 0.98f);
628 tc[2] = LLVector2(1, 0);
629 tc[3] = LLVector2(1, 0.98f);
630
631 position.mV[0] = mPosition.mV[VX] + x + xf;
632 position.mV[1] = mPosition.mV[VY] + y + yf;
633 position.mV[2] = mRegionp->getLand().resolveHeightRegion(position);
634 v[0] = v1 = position + mRegionp->getOriginAgent();
635
636
637
638 position.mV[0] += dzx;
639 position.mV[1] += dzy;
640 position.mV[2] += blade_height;
641 v[1] = v2 = position + mRegionp->getOriginAgent();
642
643 position.mV[0] = mPosition.mV[VX] + x - xf;
644 position.mV[1] = mPosition.mV[VY] + y - xf;
645 position.mV[2] = mRegionp->getLand().resolveHeightRegion(position);
646 v[2] = v3 = position + mRegionp->getOriginAgent();
647
648 LLVector3 normal1 = (v1-v2) % (v2-v3);
649 normal1.normalize();
650
651 position.mV[0] += dzx;
652 position.mV[1] += dzy;
653 position.mV[2] += blade_height;
654 v[3] = v1 = position + mRegionp->getOriginAgent();
655
656
657 F32 a,b,t;
658
659 BOOL hit = FALSE;
660
661
662 U32 idx0 = 0,idx1 = 0,idx2 = 0;
663
664 if (LLTriangleRayIntersect(v[0], v[1], v[2], start, dir, &a, &b, &t, FALSE))
665 {
666 hit = TRUE;
667 idx0 = 0; idx1 = 1; idx2 = 2;
668 }
669 else if (LLTriangleRayIntersect(v[1], v[3], v[2], start, dir, &a, &b, &t, FALSE))
670 {
671 hit = TRUE;
672 idx0 = 1; idx1 = 3; idx2 = 2;
673 }
674 else if (LLTriangleRayIntersect(v[2], v[1], v[0], start, dir, &a, &b, &t, FALSE))
675 {
676 normal1 = -normal1;
677 hit = TRUE;
678 idx0 = 2; idx1 = 1; idx2 = 0;
679 }
680 else if (LLTriangleRayIntersect(v[2], v[3], v[1], start, dir, &a, &b, &t, FALSE))
681 {
682 normal1 = -normal1;
683 hit = TRUE;
684 idx0 = 2; idx1 = 3; idx2 = 1;
685 }
686
687 if (hit)
688 {
689 if (t >= 0.f &&
690 t <= 1.f &&
691 t < closest_t)
692 {
693
694 LLVector2 hit_tc = ((1.f - a - b) * tc[idx0] +
695 a * tc[idx1] +
696 b * tc[idx2]);
697 if (pick_transparent ||
698 getTEImage(0)->getMask(hit_tc))
699 {
700 closest_t = t;
701 if (intersection != NULL)
702 {
703 *intersection = start+dir*closest_t;
704 }
705
706 if (tex_coord != NULL)
707 {
708 *tex_coord = hit_tc;
709 }
710
711 if (normal != NULL)
712 {
713 *normal = normal1;
714 }
715 ret = TRUE;
716 }
717 }
718 }
719 }
720
721 return ret;
722}
723
diff --git a/linden/indra/newview/llvograss.h b/linden/indra/newview/llvograss.h
index 679f5dc..fa22ebb 100644
--- a/linden/indra/newview/llvograss.h
+++ b/linden/indra/newview/llvograss.h
@@ -80,6 +80,16 @@ public:
80 /*virtual*/ BOOL isActive() const; // Whether this object needs to do an idleUpdate. 80 /*virtual*/ BOOL isActive() const; // Whether this object needs to do an idleUpdate.
81 BOOL idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time); 81 BOOL idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time);
82 82
83 /*virtual*/ BOOL lineSegmentIntersect(const LLVector3& start, const LLVector3& end,
84 S32 face = -1, // which face to check, -1 = ALL_SIDES
85 BOOL pick_transparent = FALSE,
86 S32* face_hit = NULL, // which face was hit
87 LLVector3* intersection = NULL, // return the intersection point
88 LLVector2* tex_coord = NULL, // return the texture coordinates of the intersection point
89 LLVector3* normal = NULL, // return the surface normal at the intersection point
90 LLVector3* bi_normal = NULL // return the surface bi-normal at the intersection point
91 );
92
83 static S32 sMaxGrassSpecies; 93 static S32 sMaxGrassSpecies;
84 94
85 struct GrassSpeciesData 95 struct GrassSpeciesData
diff --git a/linden/indra/newview/llvoground.cpp b/linden/indra/newview/llvoground.cpp
index 32622ec..166c879 100644
--- a/linden/indra/newview/llvoground.cpp
+++ b/linden/indra/newview/llvoground.cpp
@@ -45,7 +45,7 @@
45#include "pipeline.h" 45#include "pipeline.h"
46 46
47LLVOGround::LLVOGround(const LLUUID &id, const LLPCode pcode, LLViewerRegion *regionp) 47LLVOGround::LLVOGround(const LLUUID &id, const LLPCode pcode, LLViewerRegion *regionp)
48: LLStaticViewerObject(id, pcode, regionp) 48: LLStaticViewerObject(id, pcode, regionp, TRUE)
49{ 49{
50 mbCanSelect = FALSE; 50 mbCanSelect = FALSE;
51} 51}
diff --git a/linden/indra/newview/llvoicevisualizer.cpp b/linden/indra/newview/llvoicevisualizer.cpp
index f00247b..ad00804 100644
--- a/linden/indra/newview/llvoicevisualizer.cpp
+++ b/linden/indra/newview/llvoicevisualizer.cpp
@@ -378,20 +378,20 @@ void LLVoiceVisualizer::render()
378 //----------------------------- 378 //-----------------------------
379 // bind texture 0 (the dot) 379 // bind texture 0 (the dot)
380 //----------------------------- 380 //-----------------------------
381 mSoundSymbol.mTexture[0]->bind(); 381 gGL.getTexUnit(0)->bind(mSoundSymbol.mTexture[0]);
382 382
383 //------------------------------------------------------------- 383 //-------------------------------------------------------------
384 // now render the dot 384 // now render the dot
385 //------------------------------------------------------------- 385 //-------------------------------------------------------------
386 gGL.color4fv( LLColor4( 1.0f, 1.0f, 1.0f, DOT_OPACITY ).mV ); 386 gGL.color4fv( LLColor4( 1.0f, 1.0f, 1.0f, DOT_OPACITY ).mV );
387 387
388 gGL.begin( LLVertexBuffer::TRIANGLE_STRIP ); 388 gGL.begin( LLRender::TRIANGLE_STRIP );
389 gGL.texCoord2i( 0, 0 ); gGL.vertex3fv( bottomLeft.mV ); 389 gGL.texCoord2i( 0, 0 ); gGL.vertex3fv( bottomLeft.mV );
390 gGL.texCoord2i( 1, 0 ); gGL.vertex3fv( bottomRight.mV ); 390 gGL.texCoord2i( 1, 0 ); gGL.vertex3fv( bottomRight.mV );
391 gGL.texCoord2i( 0, 1 ); gGL.vertex3fv( topLeft.mV ); 391 gGL.texCoord2i( 0, 1 ); gGL.vertex3fv( topLeft.mV );
392 gGL.end(); 392 gGL.end();
393 393
394 gGL.begin( LLVertexBuffer::TRIANGLE_STRIP ); 394 gGL.begin( LLRender::TRIANGLE_STRIP );
395 gGL.texCoord2i( 1, 0 ); gGL.vertex3fv( bottomRight.mV ); 395 gGL.texCoord2i( 1, 0 ); gGL.vertex3fv( bottomRight.mV );
396 gGL.texCoord2i( 1, 1 ); gGL.vertex3fv( topRight.mV ); 396 gGL.texCoord2i( 1, 1 ); gGL.vertex3fv( topRight.mV );
397 gGL.texCoord2i( 0, 1 ); gGL.vertex3fv( topLeft.mV ); 397 gGL.texCoord2i( 0, 1 ); gGL.vertex3fv( topLeft.mV );
@@ -503,18 +503,19 @@ void LLVoiceVisualizer::render()
503 LLVector3 topRight = mSoundSymbol.mPosition - l + u; 503 LLVector3 topRight = mSoundSymbol.mPosition - l + u;
504 504
505 gGL.color4fv( LLColor4( red, green, blue, mSoundSymbol.mWaveOpacity[i] ).mV ); 505 gGL.color4fv( LLColor4( red, green, blue, mSoundSymbol.mWaveOpacity[i] ).mV );
506 mSoundSymbol.mTexture[i]->bind(); 506 gGL.getTexUnit(0)->bind(mSoundSymbol.mTexture[i]);
507
507 508
508 //--------------------------------------------------- 509 //---------------------------------------------------
509 // now, render the mofo 510 // now, render the mofo
510 //--------------------------------------------------- 511 //---------------------------------------------------
511 gGL.begin( LLVertexBuffer::TRIANGLE_STRIP ); 512 gGL.begin( LLRender::TRIANGLE_STRIP );
512 gGL.texCoord2i( 0, 0 ); gGL.vertex3fv( bottomLeft.mV ); 513 gGL.texCoord2i( 0, 0 ); gGL.vertex3fv( bottomLeft.mV );
513 gGL.texCoord2i( 1, 0 ); gGL.vertex3fv( bottomRight.mV ); 514 gGL.texCoord2i( 1, 0 ); gGL.vertex3fv( bottomRight.mV );
514 gGL.texCoord2i( 0, 1 ); gGL.vertex3fv( topLeft.mV ); 515 gGL.texCoord2i( 0, 1 ); gGL.vertex3fv( topLeft.mV );
515 gGL.end(); 516 gGL.end();
516 517
517 gGL.begin( LLVertexBuffer::TRIANGLE_STRIP ); 518 gGL.begin( LLRender::TRIANGLE_STRIP );
518 gGL.texCoord2i( 1, 0 ); gGL.vertex3fv( bottomRight.mV ); 519 gGL.texCoord2i( 1, 0 ); gGL.vertex3fv( bottomRight.mV );
519 gGL.texCoord2i( 1, 1 ); gGL.vertex3fv( topRight.mV ); 520 gGL.texCoord2i( 1, 1 ); gGL.vertex3fv( topRight.mV );
520 gGL.texCoord2i( 0, 1 ); gGL.vertex3fv( topLeft.mV ); 521 gGL.texCoord2i( 0, 1 ); gGL.vertex3fv( topLeft.mV );
@@ -550,8 +551,8 @@ VoiceGesticulationLevel LLVoiceVisualizer::getCurrentGesticulationLevel()
550 //----------------------------------------------------------------------------------------- 551 //-----------------------------------------------------------------------------------------
551 F32 range = mMaxGesticulationAmplitude - mMinGesticulationAmplitude; 552 F32 range = mMaxGesticulationAmplitude - mMinGesticulationAmplitude;
552 553
553 if ( mSpeakingAmplitude > mMinGesticulationAmplitude + range * 0.66666f ) { gesticulationLevel = VOICE_GESTICULATION_LEVEL_HIGH; } 554 if ( mSpeakingAmplitude > mMinGesticulationAmplitude + range * 0.5f ) { gesticulationLevel = VOICE_GESTICULATION_LEVEL_HIGH; }
554 else if ( mSpeakingAmplitude > mMinGesticulationAmplitude + range * 0.33333f ) { gesticulationLevel = VOICE_GESTICULATION_LEVEL_MEDIUM; } 555 else if ( mSpeakingAmplitude > mMinGesticulationAmplitude + range * 0.25f ) { gesticulationLevel = VOICE_GESTICULATION_LEVEL_MEDIUM; }
555 else if ( mSpeakingAmplitude > mMinGesticulationAmplitude + range * 0.00000f ) { gesticulationLevel = VOICE_GESTICULATION_LEVEL_LOW; } 556 else if ( mSpeakingAmplitude > mMinGesticulationAmplitude + range * 0.00000f ) { gesticulationLevel = VOICE_GESTICULATION_LEVEL_LOW; }
556 557
557 return gesticulationLevel; 558 return gesticulationLevel;
diff --git a/linden/indra/newview/llvopartgroup.cpp b/linden/indra/newview/llvopartgroup.cpp
index 11d7341..fb91cfa 100644
--- a/linden/indra/newview/llvopartgroup.cpp
+++ b/linden/indra/newview/llvopartgroup.cpp
@@ -95,7 +95,7 @@ void LLVOPartGroup::setPixelAreaAndAngle(LLAgent &agent)
95{ 95{
96 // mPixelArea is calculated during render 96 // mPixelArea is calculated during render
97 F32 mid_scale = getMidScale(); 97 F32 mid_scale = getMidScale();
98 F32 range = (getRenderPosition()-LLViewerCamera::getInstance()->getOrigin()).magVec(); 98 F32 range = (getRenderPosition()-LLViewerCamera::getInstance()->getOrigin()).length();
99 99
100 if (range < 0.001f || isHUDAttachment()) // range == zero 100 if (range < 0.001f || isHUDAttachment()) // range == zero
101 { 101 {
@@ -133,15 +133,16 @@ F32 LLVOPartGroup::getPartSize(S32 idx)
133 return 0.f; 133 return 0.f;
134} 134}
135 135
136LLVector3 LLVOPartGroup::getCameraPosition() const
137{
138 return gAgent.getCameraPositionAgent();
139}
140
136BOOL LLVOPartGroup::updateGeometry(LLDrawable *drawable) 141BOOL LLVOPartGroup::updateGeometry(LLDrawable *drawable)
137{ 142{
138 LLFastTimer ftm(LLFastTimer::FTM_UPDATE_PARTICLES); 143 LLFastTimer ftm(LLFastTimer::FTM_UPDATE_PARTICLES);
139 144
140 dirtySpatialGroup(); 145 dirtySpatialGroup();
141
142 LLVector3 at;
143 LLVector3 position_agent;
144 LLVector3 camera_agent = LLViewerCamera::getInstance()->getOrigin();
145 146
146 S32 num_parts = mViewerPartGroupp->getCount(); 147 S32 num_parts = mViewerPartGroupp->getCount();
147 LLFace *facep; 148 LLFace *facep;
@@ -187,9 +188,9 @@ BOOL LLVOPartGroup::updateGeometry(LLDrawable *drawable)
187 const LLViewerPart *part = mViewerPartGroupp->mParticles[i]; 188 const LLViewerPart *part = mViewerPartGroupp->mParticles[i];
188 189
189 LLVector3 part_pos_agent(part->mPosAgent); 190 LLVector3 part_pos_agent(part->mPosAgent);
190 at = part_pos_agent - camera_agent; 191 LLVector3 at(part_pos_agent - LLViewerCamera::getInstance()->getOrigin());
191 192
192 F32 camera_dist_squared = at.magVecSquared(); 193 F32 camera_dist_squared = at.lengthSquared();
193 F32 inv_camera_dist_squared; 194 F32 inv_camera_dist_squared;
194 if (camera_dist_squared > 1.f) 195 if (camera_dist_squared > 1.f)
195 inv_camera_dist_squared = 1.f / camera_dist_squared; 196 inv_camera_dist_squared = 1.f / camera_dist_squared;
@@ -278,36 +279,38 @@ void LLVOPartGroup::getGeometry(S32 idx,
278 279
279 280
280 LLVector3 part_pos_agent(part.mPosAgent); 281 LLVector3 part_pos_agent(part.mPosAgent);
281 LLVector3 camera_agent = gAgent.getCameraPositionAgent(); 282 LLVector3 camera_agent = getCameraPosition();
282 LLVector3 at = part_pos_agent - camera_agent; 283 LLVector3 at = part_pos_agent - camera_agent;
283 LLVector3 up, right; 284 LLVector3 up;
285 LLVector3 right;
284 286
285 right = at % LLVector3(0.f, 0.f, 1.f); 287 right = at % LLVector3(0.f, 0.f, 1.f);
286 right.normVec(); 288 right.normalize();
287 up = right % at; 289 up = right % at;
288 up.normVec(); 290 up.normalize();
289 291
290 if (part.mFlags & LLPartData::LL_PART_FOLLOW_VELOCITY_MASK) 292 if (part.mFlags & LLPartData::LL_PART_FOLLOW_VELOCITY_MASK)
291 { 293 {
292 LLVector3 normvel = part.mVelocity; 294 LLVector3 normvel = part.mVelocity;
293 normvel.normVec(); 295 normvel.normalize();
294 LLVector2 up_fracs; 296 LLVector2 up_fracs;
295 up_fracs.mV[0] = normvel*right; 297 up_fracs.mV[0] = normvel*right;
296 up_fracs.mV[1] = normvel*up; 298 up_fracs.mV[1] = normvel*up;
297 up_fracs.normVec(); 299 up_fracs.normalize();
298 LLVector3 new_up; 300 LLVector3 new_up;
299 LLVector3 new_right; 301 LLVector3 new_right;
300 new_up = up_fracs.mV[0] * right + up_fracs.mV[1]*up; 302 new_up = up_fracs.mV[0] * right + up_fracs.mV[1]*up;
301 new_right = up_fracs.mV[1] * right - up_fracs.mV[0]*up; 303 new_right = up_fracs.mV[1] * right - up_fracs.mV[0]*up;
302 up = new_up; 304 up = new_up;
303 right = new_right; 305 right = new_right;
304 up.normVec(); 306 up.normalize();
305 right.normVec(); 307 right.normalize();
306 } 308 }
307 309
308 right *= 0.5f*part.mScale.mV[0]; 310 right *= 0.5f*part.mScale.mV[0];
309 up *= 0.5f*part.mScale.mV[1]; 311 up *= 0.5f*part.mScale.mV[1];
310 312
313
311 const LLVector3& normal = -LLViewerCamera::getInstance()->getXAxis(); 314 const LLVector3& normal = -LLViewerCamera::getInstance()->getXAxis();
312 315
313 *verticesp++ = part_pos_agent + up - right; 316 *verticesp++ = part_pos_agent + up - right;
@@ -355,6 +358,13 @@ LLParticlePartition::LLParticlePartition()
355 mLODPeriod = 1; 358 mLODPeriod = 1;
356} 359}
357 360
361LLHUDParticlePartition::LLHUDParticlePartition() :
362 LLParticlePartition()
363{
364 mDrawableType = LLPipeline::RENDER_TYPE_HUD;
365 mPartitionType = LLViewerRegion::PARTITION_HUD_PARTICLE;
366}
367
358void LLParticlePartition::addGeometryCount(LLSpatialGroup* group, U32& vertex_count, U32& index_count) 368void LLParticlePartition::addGeometryCount(LLSpatialGroup* group, U32& vertex_count, U32& index_count)
359{ 369{
360 group->mBufferUsage = mBufferUsage; 370 group->mBufferUsage = mBufferUsage;
@@ -480,3 +490,24 @@ F32 LLParticlePartition::calcPixelArea(LLSpatialGroup* group, LLCamera& camera)
480 return 1024.f; 490 return 1024.f;
481} 491}
482 492
493U32 LLVOHUDPartGroup::getPartitionType() const
494{
495 // Commenting out and returning PARTITION_NONE because DEV-16909
496 // (SVC-2396: Particles not handled properly as hud) didn't work completely
497 // so this disables HUD particles until they can be fixed properly. -MG
498 //return LLViewerRegion::PARTITION_HUD_PARTICLE;
499 return LLViewerRegion::PARTITION_NONE;
500}
501
502LLDrawable* LLVOHUDPartGroup::createDrawable(LLPipeline *pipeline)
503{
504 pipeline->allocDrawable(this);
505 mDrawable->setLit(FALSE);
506 mDrawable->setRenderType(LLPipeline::RENDER_TYPE_HUD);
507 return mDrawable;
508}
509
510LLVector3 LLVOHUDPartGroup::getCameraPosition() const
511{
512 return LLVector3(-1,0,0);
513}
diff --git a/linden/indra/newview/llvopartgroup.h b/linden/indra/newview/llvopartgroup.h
index 5fe6750..037aa63 100644
--- a/linden/indra/newview/llvopartgroup.h
+++ b/linden/indra/newview/llvopartgroup.h
@@ -80,6 +80,23 @@ protected:
80 ~LLVOPartGroup(); 80 ~LLVOPartGroup();
81 81
82 LLViewerPartGroup *mViewerPartGroupp; 82 LLViewerPartGroup *mViewerPartGroupp;
83
84 virtual LLVector3 getCameraPosition() const;
85
86};
87
88
89class LLVOHUDPartGroup : public LLVOPartGroup
90{
91public:
92 LLVOHUDPartGroup(const LLUUID &id, const LLPCode pcode, LLViewerRegion *regionp) :
93 LLVOPartGroup(id, pcode, regionp)
94 {
95 }
96protected:
97 LLDrawable* createDrawable(LLPipeline *pipeline);
98 U32 getPartitionType() const;
99 virtual LLVector3 getCameraPosition() const;
83}; 100};
84 101
85#endif // LL_LLVOPARTGROUP_H 102#endif // LL_LLVOPARTGROUP_H
diff --git a/linden/indra/newview/llvosky.cpp b/linden/indra/newview/llvosky.cpp
index 60f674e..8c3b718 100644
--- a/linden/indra/newview/llvosky.cpp
+++ b/linden/indra/newview/llvosky.cpp
@@ -294,7 +294,7 @@ void LLSkyTex::createGLImage(S32 which)
294 294
295void LLSkyTex::bindTexture(BOOL curr) 295void LLSkyTex::bindTexture(BOOL curr)
296{ 296{
297 mImageGL[getWhich(curr)]->bind(); 297 gGL.getTexUnit(0)->bind(mImageGL[getWhich(curr)]);
298} 298}
299 299
300/*************************************** 300/***************************************
@@ -308,7 +308,7 @@ S32 LLVOSky::sTileResX = sResolution/NUM_TILES_X;
308S32 LLVOSky::sTileResY = sResolution/NUM_TILES_Y; 308S32 LLVOSky::sTileResY = sResolution/NUM_TILES_Y;
309 309
310LLVOSky::LLVOSky(const LLUUID &id, const LLPCode pcode, LLViewerRegion *regionp) 310LLVOSky::LLVOSky(const LLUUID &id, const LLPCode pcode, LLViewerRegion *regionp)
311: LLStaticViewerObject(id, pcode, regionp), 311: LLStaticViewerObject(id, pcode, regionp, TRUE),
312 mSun(SUN_DISK_RADIUS), mMoon(MOON_DISK_RADIUS), 312 mSun(SUN_DISK_RADIUS), mMoon(MOON_DISK_RADIUS),
313 mBrightnessScale(1.f), 313 mBrightnessScale(1.f),
314 mBrightnessScaleNew(0.f), 314 mBrightnessScaleNew(0.f),
@@ -528,7 +528,7 @@ void LLVOSky::initSkyTextureDirs(const S32 side, const S32 tile)
528 coeff[x_coef] = F32((x<<1) + 1) * inv_res - 1.f; 528 coeff[x_coef] = F32((x<<1) + 1) * inv_res - 1.f;
529 coeff[y_coef] = F32((y<<1) + 1) * inv_res - 1.f; 529 coeff[y_coef] = F32((y<<1) + 1) * inv_res - 1.f;
530 LLVector3 dir(coeff[0], coeff[1], coeff[2]); 530 LLVector3 dir(coeff[0], coeff[1], coeff[2]);
531 dir.normVec(); 531 dir.normalize();
532 mSkyTex[side].setDir(dir, x, y); 532 mSkyTex[side].setDir(dir, x, y);
533 mShinyTex[side].setDir(dir, x, y); 533 mShinyTex[side].setDir(dir, x, y);
534 } 534 }
@@ -762,7 +762,7 @@ void LLVOSky::calcSkyColorWLVert(LLVector3 & Pn, LLColor3 & vary_HazeColor, LLCo
762 Pn *= (-32000.f / Pn[1]); 762 Pn *= (-32000.f / Pn[1]);
763 } 763 }
764 764
765 Plen = Pn.magVec(); 765 Plen = Pn.length();
766 Pn /= Plen; 766 Pn /= Plen;
767 767
768 // Initialize temp variables 768 // Initialize temp variables
@@ -1082,7 +1082,7 @@ BOOL LLVOSky::updateSky()
1082 const static F32 COLOR_CHANGE_THRESHOLD = 0.01f; 1082 const static F32 COLOR_CHANGE_THRESHOLD = 0.01f;
1083 1083
1084 LLVector3 direction = mSun.getDirection(); 1084 LLVector3 direction = mSun.getDirection();
1085 direction.normVec(); 1085 direction.normalize();
1086 const F32 dot_lighting = direction * mLastLightingDirection; 1086 const F32 dot_lighting = direction * mLastLightingDirection;
1087 1087
1088 LLColor3 delta_color; 1088 LLColor3 delta_color;
@@ -1092,7 +1092,7 @@ BOOL LLVOSky::updateSky()
1092 1092
1093 if ( mForceUpdate 1093 if ( mForceUpdate
1094 || ((dot_lighting < LIGHT_DIRECTION_THRESHOLD) 1094 || ((dot_lighting < LIGHT_DIRECTION_THRESHOLD)
1095 || (delta_color.magVec() > COLOR_CHANGE_THRESHOLD) 1095 || (delta_color.length() > COLOR_CHANGE_THRESHOLD)
1096 || !mInitialized) 1096 || !mInitialized)
1097 && !direction.isExactlyZero()) 1097 && !direction.isExactlyZero())
1098 { 1098 {
@@ -1336,8 +1336,8 @@ BOOL LLVOSky::updateGeometry(LLDrawable *drawable)
1336 const LLVector3 &look_at = LLViewerCamera::getInstance()->getAtAxis(); 1336 const LLVector3 &look_at = LLViewerCamera::getInstance()->getAtAxis();
1337 LLVector3 right = look_at % LLVector3::z_axis; 1337 LLVector3 right = look_at % LLVector3::z_axis;
1338 LLVector3 up = right % look_at; 1338 LLVector3 up = right % look_at;
1339 right.normVec(); 1339 right.normalize();
1340 up.normVec(); 1340 up.normalize();
1341 1341
1342 const static F32 elevation_factor = 0.0f/sResolution; 1342 const static F32 elevation_factor = 0.0f/sResolution;
1343 const F32 cos_max_angle = cosHorizon(elevation_factor); 1343 const F32 cos_max_angle = cosHorizon(elevation_factor);
@@ -1417,8 +1417,8 @@ BOOL LLVOSky::updateHeavenlyBodyGeometry(LLDrawable *drawable, const S32 f, cons
1417 1417
1418 LLVector3 hb_right = to_dir % LLVector3::z_axis; 1418 LLVector3 hb_right = to_dir % LLVector3::z_axis;
1419 LLVector3 hb_up = hb_right % to_dir; 1419 LLVector3 hb_up = hb_right % to_dir;
1420 hb_right.normVec(); 1420 hb_right.normalize();
1421 hb_up.normVec(); 1421 hb_up.normalize();
1422 1422
1423 //const static F32 cos_max_turn = sqrt(3.f) / 2; // 30 degrees 1423 //const static F32 cos_max_turn = sqrt(3.f) / 2; // 30 degrees
1424 //const F32 cos_turn_right = 1. / (llmax(cos_max_turn, hb_right * right)); 1424 //const F32 cos_turn_right = 1. / (llmax(cos_max_turn, hb_right * right));
@@ -1601,8 +1601,8 @@ void LLVOSky::updateSunHaloGeometry(LLDrawable *drawable )
1601 1601
1602 const LLVector3 right = 2 * (v_corner[2] - v_corner[0]); 1602 const LLVector3 right = 2 * (v_corner[2] - v_corner[0]);
1603 LLVector3 up = 2 * (v_corner[2] - v_corner[3]); 1603 LLVector3 up = 2 * (v_corner[2] - v_corner[3]);
1604 up.normVec(); 1604 up.normalize();
1605 F32 size = right.magVec(); 1605 F32 size = right.length();
1606 up = size * up; 1606 up = size * up;
1607 const LLVector3 draw_pos = 0.25 * (v_corner[0] + v_corner[1] + v_corner[2] + v_corner[3]); 1607 const LLVector3 draw_pos = 0.25 * (v_corner[0] + v_corner[1] + v_corner[2] + v_corner[3]);
1608 1608
@@ -1654,7 +1654,7 @@ void LLVOSky::updateSunHaloGeometry(LLDrawable *drawable )
1654F32 dtReflection(const LLVector3& p, F32 cos_dir_from_top, F32 sin_dir_from_top, F32 diff_angl_dir) 1654F32 dtReflection(const LLVector3& p, F32 cos_dir_from_top, F32 sin_dir_from_top, F32 diff_angl_dir)
1655{ 1655{
1656 LLVector3 P = p; 1656 LLVector3 P = p;
1657 P.normVec(); 1657 P.normalize();
1658 1658
1659 const F32 cos_dir_angle = -P.mV[VZ]; 1659 const F32 cos_dir_angle = -P.mV[VZ];
1660 const F32 sin_dir_angle = sqrt(1 - cos_dir_angle * cos_dir_angle); 1660 const F32 sin_dir_angle = sqrt(1 - cos_dir_angle * cos_dir_angle);
@@ -1679,9 +1679,9 @@ F32 dtClip(const LLVector3& v0, const LLVector3& v1, F32 far_clip2)
1679{ 1679{
1680 F32 dt_clip; 1680 F32 dt_clip;
1681 const LLVector3 otrezok = v1 - v0; 1681 const LLVector3 otrezok = v1 - v0;
1682 const F32 A = otrezok.magVecSquared(); 1682 const F32 A = otrezok.lengthSquared();
1683 const F32 B = v0 * otrezok; 1683 const F32 B = v0 * otrezok;
1684 const F32 C = v0.magVecSquared() - far_clip2; 1684 const F32 C = v0.lengthSquared() - far_clip2;
1685 const F32 det = sqrt(B*B - A*C); 1685 const F32 det = sqrt(B*B - A*C);
1686 dt_clip = (-B - det) / A; 1686 dt_clip = (-B - det) / A;
1687 if ((dt_clip < 0) || (dt_clip > 1)) 1687 if ((dt_clip < 0) || (dt_clip > 1))
@@ -1701,16 +1701,16 @@ void LLVOSky::updateReflectionGeometry(LLDrawable *drawable, F32 H,
1701 LLVector3 hb_pos = to_dir * (HORIZON_DIST - 10); 1701 LLVector3 hb_pos = to_dir * (HORIZON_DIST - 10);
1702 LLVector3 to_dir_proj = to_dir; 1702 LLVector3 to_dir_proj = to_dir;
1703 to_dir_proj.mV[VZ] = 0; 1703 to_dir_proj.mV[VZ] = 0;
1704 to_dir_proj.normVec(); 1704 to_dir_proj.normalize();
1705 1705
1706 LLVector3 Right = to_dir % LLVector3::z_axis; 1706 LLVector3 Right = to_dir % LLVector3::z_axis;
1707 LLVector3 Up = Right % to_dir; 1707 LLVector3 Up = Right % to_dir;
1708 Right.normVec(); 1708 Right.normalize();
1709 Up.normVec(); 1709 Up.normalize();
1710 1710
1711 // finding angle between look direction and sprite. 1711 // finding angle between look direction and sprite.
1712 LLVector3 look_at_right = look_at % LLVector3::z_axis; 1712 LLVector3 look_at_right = look_at % LLVector3::z_axis;
1713 look_at_right.normVec(); 1713 look_at_right.normalize();
1714 1714
1715 const static F32 cos_horizon_angle = cosHorizon(0.0f/sResolution); 1715 const static F32 cos_horizon_angle = cosHorizon(0.0f/sResolution);
1716 //const static F32 horizon_angle = acos(cos_horizon_angle); 1716 //const static F32 horizon_angle = acos(cos_horizon_angle);
@@ -1745,7 +1745,7 @@ void LLVOSky::updateReflectionGeometry(LLDrawable *drawable, F32 H,
1745 else 1745 else
1746 dt_hor = llmax(0.0f, llmin(1.0f, dt_hor)); 1746 dt_hor = llmax(0.0f, llmin(1.0f, dt_hor));
1747 1747
1748 top_hb.normVec(); 1748 top_hb.normalize();
1749 const F32 cos_angle_of_view = fabs(top_hb.mV[VZ]); 1749 const F32 cos_angle_of_view = fabs(top_hb.mV[VZ]);
1750 const F32 extension = llmin (5.0f, 1.0f / cos_angle_of_view); 1750 const F32 extension = llmin (5.0f, 1.0f / cos_angle_of_view);
1751 1751
@@ -1762,11 +1762,11 @@ void LLVOSky::updateReflectionGeometry(LLDrawable *drawable, F32 H,
1762 F32 cos_dir_from_top[2]; 1762 F32 cos_dir_from_top[2];
1763 1763
1764 LLVector3 dir = stretch_corner[0]; 1764 LLVector3 dir = stretch_corner[0];
1765 dir.normVec(); 1765 dir.normalize();
1766 cos_dir_from_top[0] = dir.mV[VZ]; 1766 cos_dir_from_top[0] = dir.mV[VZ];
1767 1767
1768 dir = stretch_corner[1]; 1768 dir = stretch_corner[1];
1769 dir.normVec(); 1769 dir.normalize();
1770 cos_dir_from_top[1] = dir.mV[VZ]; 1770 cos_dir_from_top[1] = dir.mV[VZ];
1771 1771
1772 const F32 sin_dir_from_top = sqrt(1 - cos_dir_from_top[0] * cos_dir_from_top[0]); 1772 const F32 sin_dir_from_top = sqrt(1 - cos_dir_from_top[0] * cos_dir_from_top[0]);
@@ -1789,7 +1789,7 @@ void LLVOSky::updateReflectionGeometry(LLDrawable *drawable, F32 H,
1789 for (vtx = 0; vtx < 2; ++vtx) 1789 for (vtx = 0; vtx < 2; ++vtx)
1790 { 1790 {
1791 LLVector3 light_proj = v_corner[vtx]; 1791 LLVector3 light_proj = v_corner[vtx];
1792 light_proj.normVec(); 1792 light_proj.normalize();
1793 1793
1794 const F32 z = light_proj.mV[VZ]; 1794 const F32 z = light_proj.mV[VZ];
1795 const F32 sin_angle = sqrt(1 - z * z); 1795 const F32 sin_angle = sqrt(1 - z * z);
@@ -1813,9 +1813,9 @@ void LLVOSky::updateReflectionGeometry(LLDrawable *drawable, F32 H,
1813 S32 side = 0; 1813 S32 side = 0;
1814 LLVector3 refl_corn_norm[2]; 1814 LLVector3 refl_corn_norm[2];
1815 refl_corn_norm[0] = v_refl_corner[1]; 1815 refl_corn_norm[0] = v_refl_corner[1];
1816 refl_corn_norm[0].normVec(); 1816 refl_corn_norm[0].normalize();
1817 refl_corn_norm[1] = v_refl_corner[3]; 1817 refl_corn_norm[1] = v_refl_corner[3];
1818 refl_corn_norm[1].normVec(); 1818 refl_corn_norm[1].normalize();
1819 1819
1820 F32 cos_refl_look_at[2]; 1820 F32 cos_refl_look_at[2];
1821 cos_refl_look_at[0] = refl_corn_norm[0] * look_at; 1821 cos_refl_look_at[0] = refl_corn_norm[0] * look_at;
@@ -1833,13 +1833,13 @@ void LLVOSky::updateReflectionGeometry(LLDrawable *drawable, F32 H,
1833 F32 dt_clip; 1833 F32 dt_clip;
1834 F32 vtx_near2, vtx_far2; 1834 F32 vtx_near2, vtx_far2;
1835 1835
1836 if ((vtx_far2 = v_refl_corner[side].magVecSquared()) > far_clip2) 1836 if ((vtx_far2 = v_refl_corner[side].lengthSquared()) > far_clip2)
1837 { 1837 {
1838 // whole thing is sprite: reflection is beyond far clip plane. 1838 // whole thing is sprite: reflection is beyond far clip plane.
1839 dt_clip = 1.1f; 1839 dt_clip = 1.1f;
1840 quads = 1; 1840 quads = 1;
1841 } 1841 }
1842 else if ((vtx_near2 = v_refl_corner[side+1].magVecSquared()) > far_clip2) 1842 else if ((vtx_near2 = v_refl_corner[side+1].lengthSquared()) > far_clip2)
1843 { 1843 {
1844 // part is reflection, the rest is sprite. 1844 // part is reflection, the rest is sprite.
1845 dt_clip = dtClip(v_refl_corner[side + 1], v_refl_corner[side], far_clip2); 1845 dt_clip = dtClip(v_refl_corner[side + 1], v_refl_corner[side], far_clip2);
@@ -1903,7 +1903,7 @@ void LLVOSky::updateReflectionGeometry(LLDrawable *drawable, F32 H,
1903 { 1903 {
1904 for (S32 vtx = 0; vtx < 4; ++vtx) 1904 for (S32 vtx = 0; vtx < 4; ++vtx)
1905 { 1905 {
1906 F32 ratio = far_clip / v_refl_corner[vtx].magVec(); 1906 F32 ratio = far_clip / v_refl_corner[vtx].length();
1907 *(verticesp++) = v_refl_corner[vtx] = ratio * v_refl_corner[vtx] + mCameraPosAgent; 1907 *(verticesp++) = v_refl_corner[vtx] = ratio * v_refl_corner[vtx] + mCameraPosAgent;
1908 } 1908 }
1909 const LLVector3 draw_pos = 0.25 * 1909 const LLVector3 draw_pos = 0.25 *
@@ -1912,10 +1912,10 @@ void LLVOSky::updateReflectionGeometry(LLDrawable *drawable, F32 H,
1912 } 1912 }
1913 else 1913 else
1914 { 1914 {
1915 F32 ratio = far_clip / v_refl_corner[1].magVec(); 1915 F32 ratio = far_clip / v_refl_corner[1].length();
1916 v_sprite_corner[1] = v_refl_corner[1] * ratio; 1916 v_sprite_corner[1] = v_refl_corner[1] * ratio;
1917 1917
1918 ratio = far_clip / v_refl_corner[3].magVec(); 1918 ratio = far_clip / v_refl_corner[3].length();
1919 v_sprite_corner[3] = v_refl_corner[3] * ratio; 1919 v_sprite_corner[3] = v_refl_corner[3] * ratio;
1920 1920
1921 v_refl_corner[1] = (1 - dt_clip) * v_refl_corner[1] + dt_clip * v_refl_corner[0]; 1921 v_refl_corner[1] = (1 - dt_clip) * v_refl_corner[1] + dt_clip * v_refl_corner[0];
@@ -2039,20 +2039,20 @@ void LLVOSky::updateFog(const F32 distance)
2039 LLVector3 tosun = getToSunLast(); 2039 LLVector3 tosun = getToSunLast();
2040 const F32 tosun_z = tosun.mV[VZ]; 2040 const F32 tosun_z = tosun.mV[VZ];
2041 tosun.mV[VZ] = 0.f; 2041 tosun.mV[VZ] = 0.f;
2042 tosun.normVec(); 2042 tosun.normalize();
2043 LLVector3 perp_tosun; 2043 LLVector3 perp_tosun;
2044 perp_tosun.mV[VX] = -tosun.mV[VY]; 2044 perp_tosun.mV[VX] = -tosun.mV[VY];
2045 perp_tosun.mV[VY] = tosun.mV[VX]; 2045 perp_tosun.mV[VY] = tosun.mV[VX];
2046 LLVector3 tosun_45 = tosun + perp_tosun; 2046 LLVector3 tosun_45 = tosun + perp_tosun;
2047 tosun_45.normVec(); 2047 tosun_45.normalize();
2048 2048
2049 F32 delta = 0.06f; 2049 F32 delta = 0.06f;
2050 tosun.mV[VZ] = delta; 2050 tosun.mV[VZ] = delta;
2051 perp_tosun.mV[VZ] = delta; 2051 perp_tosun.mV[VZ] = delta;
2052 tosun_45.mV[VZ] = delta; 2052 tosun_45.mV[VZ] = delta;
2053 tosun.normVec(); 2053 tosun.normalize();
2054 perp_tosun.normVec(); 2054 perp_tosun.normalize();
2055 tosun_45.normVec(); 2055 tosun_45.normalize();
2056 2056
2057 // Sky colors, just slightly above the horizon in the direction of the sun, perpendicular to the sun, and at a 45 degree angle to the sun. 2057 // Sky colors, just slightly above the horizon in the direction of the sun, perpendicular to the sun, and at a 45 degree angle to the sun.
2058 initAtmospherics(); 2058 initAtmospherics();
@@ -2202,8 +2202,8 @@ F32 azimuth(const LLVector3 &v)
2202 2202
2203void LLVOSky::initSunDirection(const LLVector3 &sun_dir, const LLVector3 &sun_ang_velocity) 2203void LLVOSky::initSunDirection(const LLVector3 &sun_dir, const LLVector3 &sun_ang_velocity)
2204{ 2204{
2205 LLVector3 sun_direction = (sun_dir.magVec() == 0) ? LLVector3::x_axis : sun_dir; 2205 LLVector3 sun_direction = (sun_dir.length() == 0) ? LLVector3::x_axis : sun_dir;
2206 sun_direction.normVec(); 2206 sun_direction.normalize();
2207 mSun.setDirection(sun_direction); 2207 mSun.setDirection(sun_direction);
2208 mSun.renewDirection(); 2208 mSun.renewDirection();
2209 mSun.setAngularVelocity(sun_ang_velocity); 2209 mSun.setAngularVelocity(sun_ang_velocity);
@@ -2222,8 +2222,8 @@ void LLVOSky::initSunDirection(const LLVector3 &sun_dir, const LLVector3 &sun_an
2222 2222
2223void LLVOSky::setSunDirection(const LLVector3 &sun_dir, const LLVector3 &sun_ang_velocity) 2223void LLVOSky::setSunDirection(const LLVector3 &sun_dir, const LLVector3 &sun_ang_velocity)
2224{ 2224{
2225 LLVector3 sun_direction = (sun_dir.magVec() == 0) ? LLVector3::x_axis : sun_dir; 2225 LLVector3 sun_direction = (sun_dir.length() == 0) ? LLVector3::x_axis : sun_dir;
2226 sun_direction.normVec(); 2226 sun_direction.normalize();
2227 2227
2228 // Push the sun "South" as it approaches directly overhead so that we can always see bump mapping 2228 // Push the sun "South" as it approaches directly overhead so that we can always see bump mapping
2229 // on the upward facing faces of cubes. 2229 // on the upward facing faces of cubes.
@@ -2239,7 +2239,7 @@ void LLVOSky::setSunDirection(const LLVector3 &sun_dir, const LLVector3 &sun_ang
2239 // Blend between normal sun dir and adjusted sun dir based on how close we are 2239 // Blend between normal sun dir and adjusted sun dir based on how close we are
2240 // to having the sun overhead. 2240 // to having the sun overhead.
2241 mBumpSunDir = adjustedDir * sunDot + newDir * (1.0f - sunDot); 2241 mBumpSunDir = adjustedDir * sunDot + newDir * (1.0f - sunDot);
2242 mBumpSunDir.normVec(); 2242 mBumpSunDir.normalize();
2243 2243
2244 F32 dp = mLastLightingDirection * sun_direction; 2244 F32 dp = mLastLightingDirection * sun_direction;
2245 mSun.setDirection(sun_direction); 2245 mSun.setDirection(sun_direction);
diff --git a/linden/indra/newview/llvosurfacepatch.cpp b/linden/indra/newview/llvosurfacepatch.cpp
index 310a745..7055b30 100644
--- a/linden/indra/newview/llvosurfacepatch.cpp
+++ b/linden/indra/newview/llvosurfacepatch.cpp
@@ -916,6 +916,87 @@ void LLVOSurfacePatch::getGeomSizesEast(const S32 stride, const S32 east_stride,
916 } 916 }
917} 917}
918 918
919BOOL LLVOSurfacePatch::lineSegmentIntersect(const LLVector3& start, const LLVector3& end, S32 face, BOOL pick_transparent, S32 *face_hitp,
920 LLVector3* intersection,LLVector2* tex_coord, LLVector3* normal, LLVector3* bi_normal)
921
922{
923
924 if (!lineSegmentBoundingBox(start, end))
925 {
926 return FALSE;
927 }
928
929 LLVector3 delta = end-start;
930
931 LLVector3 pdelta = delta;
932 pdelta.mV[2] = 0;
933
934 F32 plength = pdelta.length();
935
936 F32 tdelta = 1.f/plength;
937
938 LLVector3 origin = start - mRegionp->getOriginAgent();
939
940 if (mRegionp->getLandHeightRegion(origin) > origin.mV[2])
941 {
942 //origin is under ground, treat as no intersection
943 return FALSE;
944 }
945
946 //step one meter at a time until intersection point found
947
948 F32 t = 0.f;
949 while ( t <= 1.f)
950 {
951 LLVector3 sample = origin + delta*t;
952
953 F32 height = mRegionp->getLandHeightRegion(sample);
954 if (height > sample.mV[2])
955 { //ray went below ground, positive intersection
956 //quick and dirty binary search to get impact point
957 tdelta = -tdelta*0.5f;
958 F32 err_dist = 0.001f;
959 F32 dist = fabsf(sample.mV[2] - height);
960
961 while (dist > err_dist && tdelta*tdelta > 0.0f)
962 {
963 t += tdelta;
964 sample = origin+delta*t;
965 height = mRegionp->getLandHeightRegion(sample);
966 if ((tdelta < 0 && height < sample.mV[2]) ||
967 (height > sample.mV[2] && tdelta > 0))
968 { //jumped over intersection point, go back
969 tdelta = -tdelta;
970 }
971 tdelta *= 0.5f;
972 dist = fabsf(sample.mV[2] - height);
973 }
974
975 if (intersection)
976 {
977 sample.mV[2] = mRegionp->getLandHeightRegion(sample);
978 *intersection = sample + mRegionp->getOriginAgent();
979 }
980
981 if (normal)
982 {
983 *normal = mRegionp->getLand().resolveNormalGlobal(mRegionp->getPosGlobalFromRegion(sample));
984 }
985
986 return TRUE;
987 }
988
989 t += tdelta;
990 if (t > 1 && t < 1.f+tdelta*0.99f)
991 { //make sure end point is checked (saves vertical lines coming up negative)
992 t = 1.f;
993 }
994 }
995
996
997 return FALSE;
998}
999
919void LLVOSurfacePatch::updateSpatialExtents(LLVector3& newMin, LLVector3 &newMax) 1000void LLVOSurfacePatch::updateSpatialExtents(LLVector3& newMin, LLVector3 &newMax)
920{ 1001{
921 LLVector3 posAgent = getPositionAgent(); 1002 LLVector3 posAgent = getPositionAgent();
diff --git a/linden/indra/newview/llvosurfacepatch.h b/linden/indra/newview/llvosurfacepatch.h
index 52c11c9..f014ca6 100644
--- a/linden/indra/newview/llvosurfacepatch.h
+++ b/linden/indra/newview/llvosurfacepatch.h
@@ -85,6 +85,16 @@ public:
85 void dirtyPatch(); 85 void dirtyPatch();
86 void dirtyGeom(); 86 void dirtyGeom();
87 87
88 /*virtual*/ BOOL lineSegmentIntersect(const LLVector3& start, const LLVector3& end,
89 S32 face = -1, // which face to check, -1 = ALL_SIDES
90 BOOL pick_transparent = FALSE,
91 S32* face_hit = NULL, // which face was hit
92 LLVector3* intersection = NULL, // return the intersection point
93 LLVector2* tex_coord = NULL, // return the texture coordinates of the intersection point
94 LLVector3* normal = NULL, // return the surface normal at the intersection point
95 LLVector3* bi_normal = NULL // return the surface bi-normal at the intersection point
96 );
97
88 BOOL mDirtiedPatch; 98 BOOL mDirtiedPatch;
89protected: 99protected:
90 ~LLVOSurfacePatch(); 100 ~LLVOSurfacePatch();
diff --git a/linden/indra/newview/llvotextbubble.cpp b/linden/indra/newview/llvotextbubble.cpp
index 5424cc8..69b57d9 100644
--- a/linden/indra/newview/llvotextbubble.cpp
+++ b/linden/indra/newview/llvotextbubble.cpp
@@ -126,7 +126,7 @@ void LLVOTextBubble::updateTextures(LLAgent &agent)
126 126
127 LLVector3 position_local = getPositionAgent() - agent.getCameraPositionAgent(); 127 LLVector3 position_local = getPositionAgent() - agent.getCameraPositionAgent();
128 F32 dot_product = position_local * agent.getFrameAgent().getAtAxis(); 128 F32 dot_product = position_local * agent.getFrameAgent().getAtAxis();
129 F32 cos_angle = dot_product / position_local.magVec(); 129 F32 cos_angle = dot_product / position_local.length();
130 130
131 if (cos_angle > 1.f) 131 if (cos_angle > 1.f)
132 { 132 {
diff --git a/linden/indra/newview/llvotree.cpp b/linden/indra/newview/llvotree.cpp
index c86803d..06ab222 100644
--- a/linden/indra/newview/llvotree.cpp
+++ b/linden/indra/newview/llvotree.cpp
@@ -273,9 +273,9 @@ U32 LLVOTree::processUpdateMessage(LLMessageSystem *mesgsys,
273 // Do base class updates... 273 // Do base class updates...
274 U32 retval = LLViewerObject::processUpdateMessage(mesgsys, user_data, block_num, update_type, dp); 274 U32 retval = LLViewerObject::processUpdateMessage(mesgsys, user_data, block_num, update_type, dp);
275 275
276 if ( (getVelocity().magVecSquared() > 0.f) 276 if ( (getVelocity().lengthSquared() > 0.f)
277 ||(getAcceleration().magVecSquared() > 0.f) 277 ||(getAcceleration().lengthSquared() > 0.f)
278 ||(getAngularVelocity().magVecSquared() > 0.f)) 278 ||(getAngularVelocity().lengthSquared() > 0.f))
279 { 279 {
280 llinfos << "ACK! Moving tree!" << llendl; 280 llinfos << "ACK! Moving tree!" << llendl;
281 setVelocity(LLVector3::zero); 281 setVelocity(LLVector3::zero);
@@ -312,7 +312,7 @@ U32 LLVOTree::processUpdateMessage(LLMessageSystem *mesgsys,
312 mTreeImagep = gImageList.getImage(sSpeciesTable[mSpecies]->mTextureID); 312 mTreeImagep = gImageList.getImage(sSpeciesTable[mSpecies]->mTextureID);
313 if (mTreeImagep) 313 if (mTreeImagep)
314 { 314 {
315 mTreeImagep->bindTexture(0); 315 gGL.getTexUnit(0)->bind(mTreeImagep.get());
316 } 316 }
317 mBranchLength = sSpeciesTable[mSpecies]->mBranchLength; 317 mBranchLength = sSpeciesTable[mSpecies]->mBranchLength;
318 mTrunkLength = sSpeciesTable[mSpecies]->mTrunkLength; 318 mTrunkLength = sSpeciesTable[mSpecies]->mTrunkLength;
@@ -359,14 +359,14 @@ BOOL LLVOTree::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time)
359 mTrunkBend += mTrunkVel; 359 mTrunkBend += mTrunkVel;
360 mTrunkVel *= 0.99f; // Add damping 360 mTrunkVel *= 0.99f; // Add damping
361 361
362 if (mTrunkBend.magVec() > 1.f) 362 if (mTrunkBend.length() > 1.f)
363 { 363 {
364 mTrunkBend.normVec(); 364 mTrunkBend.normalize();
365 } 365 }
366 366
367 if (mTrunkVel.magVec() > 1.f) 367 if (mTrunkVel.length() > 1.f)
368 { 368 {
369 mTrunkVel.normVec(); 369 mTrunkVel.normalize();
370 } 370 }
371 371
372 return TRUE; 372 return TRUE;
@@ -391,7 +391,7 @@ void LLVOTree::setPixelAreaAndAngle(LLAgent &agent)
391 391
392 // This should be the camera's center, as soon as we move to all region-local. 392 // This should be the camera's center, as soon as we move to all region-local.
393 LLVector3 relative_position = getPositionAgent() - agent.getCameraPositionAgent(); 393 LLVector3 relative_position = getPositionAgent() - agent.getCameraPositionAgent();
394 F32 range = relative_position.magVec(); // ugh, square root 394 F32 range = relative_position.length(); // ugh, square root
395 395
396 F32 max_scale = mBillboardScale * getMaxScale(); 396 F32 max_scale = mBillboardScale * getMaxScale();
397 F32 area = max_scale * (max_scale*mBillboardRatio); 397 F32 area = max_scale * (max_scale*mBillboardRatio);
@@ -713,9 +713,9 @@ BOOL LLVOTree::updateGeometry(LLDrawable *drawable)
713 LLVector2 tc; 713 LLVector2 tc;
714 // This isn't totally accurate. Should compute based on slope as well. 714 // This isn't totally accurate. Should compute based on slope as well.
715 start_radius = r0 * (1.f + 1.2f*fabs(z - 0.66f*height)/height); 715 start_radius = r0 * (1.f + 1.2f*fabs(z - 0.66f*height)/height);
716 nvec.setVec( cos(nangle * DEG_TO_RAD)*start_radius*nvec_scale, 716 nvec.set( cos(nangle * DEG_TO_RAD)*start_radius*nvec_scale,
717 sin(nangle * DEG_TO_RAD)*start_radius*nvec_scale, 717 sin(nangle * DEG_TO_RAD)*start_radius*nvec_scale,
718 z*nvec_scalez); 718 z*nvec_scalez);
719 // First and last slice at 0 radius (to bring in top/bottom of structure) 719 // First and last slice at 0 radius (to bring in top/bottom of structure)
720 radius = start_radius + turbulence3((F32*)&nvec.mV, (F32)fractal_depth)*noise_scale; 720 radius = start_radius + turbulence3((F32*)&nvec.mV, (F32)fractal_depth)*noise_scale;
721 721
@@ -918,7 +918,7 @@ void LLVOTree::updateRadius()
918 918
919void LLVOTree::updateSpatialExtents(LLVector3& newMin, LLVector3& newMax) 919void LLVOTree::updateSpatialExtents(LLVector3& newMin, LLVector3& newMax)
920{ 920{
921 F32 radius = getScale().magVec()*0.05f; 921 F32 radius = getScale().length()*0.05f;
922 LLVector3 center = getRenderPosition(); 922 LLVector3 center = getRenderPosition();
923 923
924 F32 sz = mBillboardScale*mBillboardRatio*radius*0.5f; 924 F32 sz = mBillboardScale*mBillboardRatio*radius*0.5f;
@@ -926,11 +926,53 @@ void LLVOTree::updateSpatialExtents(LLVector3& newMin, LLVector3& newMax)
926 926
927 center += LLVector3(0, 0, size.mV[2]) * getRotation(); 927 center += LLVector3(0, 0, size.mV[2]) * getRotation();
928 928
929 newMin.setVec(center-size); 929 newMin.set(center-size);
930 newMax.setVec(center+size); 930 newMax.set(center+size);
931 mDrawable->setPositionGroup(center); 931 mDrawable->setPositionGroup(center);
932} 932}
933 933
934BOOL LLVOTree::lineSegmentIntersect(const LLVector3& start, const LLVector3& end, S32 face, BOOL pick_transparent, S32 *face_hitp,
935 LLVector3* intersection,LLVector2* tex_coord, LLVector3* normal, LLVector3* bi_normal)
936
937{
938
939 if (!lineSegmentBoundingBox(start, end))
940 {
941 return FALSE;
942 }
943
944 const LLVector3* ext = mDrawable->getSpatialExtents();
945
946 LLVector3 center = (ext[1]+ext[0])*0.5f;
947 LLVector3 size = (ext[1]-ext[0]);
948
949 LLQuaternion quat = getRotation();
950
951 center -= LLVector3(0,0,size.magVec() * 0.25f)*quat;
952
953 size.scaleVec(LLVector3(0.25f, 0.25f, 1.f));
954 size.mV[0] = llmin(size.mV[0], 1.f);
955 size.mV[1] = llmin(size.mV[1], 1.f);
956
957 LLVector3 pos, norm;
958
959 if (linesegment_tetrahedron(start, end, center, size, quat, pos, norm))
960 {
961 if (intersection)
962 {
963 *intersection = pos;
964 }
965
966 if (normal)
967 {
968 *normal = norm;
969 }
970 return TRUE;
971 }
972
973 return FALSE;
974}
975
934U32 LLVOTree::getPartitionType() const 976U32 LLVOTree::getPartitionType() const
935{ 977{
936 return LLViewerRegion::PARTITION_TREE; 978 return LLViewerRegion::PARTITION_TREE;
diff --git a/linden/indra/newview/llvotree.h b/linden/indra/newview/llvotree.h
index 180e5b0..d6152a5 100644
--- a/linden/indra/newview/llvotree.h
+++ b/linden/indra/newview/llvotree.h
@@ -80,6 +80,17 @@ public:
80 80
81 U32 drawBranchPipeline(LLMatrix4& matrix, U16* indicesp, S32 trunk_LOD, S32 stop_level, U16 depth, U16 trunk_depth, F32 scale, F32 twist, F32 droop, F32 branches, F32 alpha); 81 U32 drawBranchPipeline(LLMatrix4& matrix, U16* indicesp, S32 trunk_LOD, S32 stop_level, U16 depth, U16 trunk_depth, F32 scale, F32 twist, F32 droop, F32 branches, F32 alpha);
82 82
83
84 /*virtual*/ BOOL lineSegmentIntersect(const LLVector3& start, const LLVector3& end,
85 S32 face = -1, // which face to check, -1 = ALL_SIDES
86 BOOL pick_transparent = FALSE,
87 S32* face_hit = NULL, // which face was hit
88 LLVector3* intersection = NULL, // return the intersection point
89 LLVector2* tex_coord = NULL, // return the texture coordinates of the intersection point
90 LLVector3* normal = NULL, // return the surface normal at the intersection point
91 LLVector3* bi_normal = NULL // return the surface bi-normal at the intersection point
92 );
93
83 static S32 sMaxTreeSpecies; 94 static S32 sMaxTreeSpecies;
84 95
85 struct TreeSpeciesData 96 struct TreeSpeciesData
diff --git a/linden/indra/newview/llvovolume.cpp b/linden/indra/newview/llvovolume.cpp
index 9d8369f..47289ff 100644
--- a/linden/indra/newview/llvovolume.cpp
+++ b/linden/indra/newview/llvovolume.cpp
@@ -90,7 +90,7 @@ LLVOVolume::LLVOVolume(const LLUUID &id, const LLPCode pcode, LLViewerRegion *re
90 mLOD = MIN_LOD; 90 mLOD = MIN_LOD;
91 mSculptLevel = -2; 91 mSculptLevel = -2;
92 mTextureAnimp = NULL; 92 mTextureAnimp = NULL;
93 mVObjRadius = LLVector3(1,1,0.5f).magVec(); 93 mVObjRadius = LLVector3(1,1,0.5f).length();
94 mNumFaces = 0; 94 mNumFaces = 0;
95 mLODChanged = FALSE; 95 mLODChanged = FALSE;
96 mSculptChanged = FALSE; 96 mSculptChanged = FALSE;
@@ -577,7 +577,7 @@ F32 LLVOVolume::getTextureVirtualSize(LLFace* face)
577 577
578 //get area of circle in texture space 578 //get area of circle in texture space
579 LLVector2 tdim = face->mTexExtents[1] - face->mTexExtents[0]; 579 LLVector2 tdim = face->mTexExtents[1] - face->mTexExtents[0];
580 F32 texel_area = (tdim * 0.5f).magVecSquared()*3.14159f; 580 F32 texel_area = (tdim * 0.5f).lengthSquared()*3.14159f;
581 if (texel_area <= 0) 581 if (texel_area <= 0)
582 { 582 {
583 // Probably animated, use default 583 // Probably animated, use default
@@ -605,7 +605,7 @@ BOOL LLVOVolume::setMaterial(const U8 material)
605void LLVOVolume::setTexture(const S32 face) 605void LLVOVolume::setTexture(const S32 face)
606{ 606{
607 llassert(face < getNumTEs()); 607 llassert(face < getNumTEs());
608 LLViewerImage::bindTexture(getTEImage(face)); 608 gGL.getTexUnit(0)->bind(getTEImage(face));
609} 609}
610 610
611void LLVOVolume::setScale(const LLVector3 &scale, BOOL damped) 611void LLVOVolume::setScale(const LLVector3 &scale, BOOL damped)
@@ -828,7 +828,7 @@ BOOL LLVOVolume::calcLOD()
828 828
829 S32 cur_detail = 0; 829 S32 cur_detail = 0;
830 830
831 F32 radius = getVolume()->mLODScaleBias.scaledVec(getScale()).magVec(); 831 F32 radius = getVolume()->mLODScaleBias.scaledVec(getScale()).length();
832 F32 distance = mDrawable->mDistanceWRTCamera; 832 F32 distance = mDrawable->mDistanceWRTCamera;
833 distance *= sDistanceFactor; 833 distance *= sDistanceFactor;
834 834
@@ -1687,7 +1687,7 @@ void LLVOVolume::generateSilhouette(LLSelectNode* nodep, const LLVector3& view_p
1687 1687
1688 //transform view vector into volume space 1688 //transform view vector into volume space
1689 view_vector -= getRenderPosition(); 1689 view_vector -= getRenderPosition();
1690 mDrawable->mDistanceWRTCamera = view_vector.magVec(); 1690 mDrawable->mDistanceWRTCamera = view_vector.length();
1691 LLQuaternion worldRot = getRenderRotation(); 1691 LLQuaternion worldRot = getRenderRotation();
1692 view_vector = view_vector * ~worldRot; 1692 view_vector = view_vector * ~worldRot;
1693 if (!isVolumeGlobal()) 1693 if (!isVolumeGlobal())
@@ -1728,7 +1728,7 @@ void LLVOVolume::updateRadius()
1728 return; 1728 return;
1729 } 1729 }
1730 1730
1731 mVObjRadius = getScale().magVec(); 1731 mVObjRadius = getScale().length();
1732 mDrawable->setRadius(mVObjRadius); 1732 mDrawable->setRadius(mVObjRadius);
1733} 1733}
1734 1734
@@ -1841,7 +1841,7 @@ F32 LLVOVolume::getBinRadius()
1841 } 1841 }
1842 else if (shrink_wrap) 1842 else if (shrink_wrap)
1843 { 1843 {
1844 radius = (ext[1]-ext[0]).magVec()*0.5f; 1844 radius = (ext[1]-ext[0]).length()*0.5f;
1845 } 1845 }
1846 else if (mDrawable->isStatic()) 1846 else if (mDrawable->isStatic())
1847 { 1847 {
@@ -1934,10 +1934,18 @@ LLVector3 LLVOVolume::volumeDirectionToAgent(const LLVector3& dir) const
1934} 1934}
1935 1935
1936 1936
1937BOOL LLVOVolume::lineSegmentIntersect(const LLVector3& start, const LLVector3& end, S32 face, S32 *face_hitp, 1937BOOL LLVOVolume::lineSegmentIntersect(const LLVector3& start, const LLVector3& end, S32 face, BOOL pick_transparent, S32 *face_hitp,
1938 LLVector3* intersection,LLVector2* tex_coord, LLVector3* normal, LLVector3* bi_normal) 1938 LLVector3* intersection,LLVector2* tex_coord, LLVector3* normal, LLVector3* bi_normal)
1939 1939
1940{ 1940{
1941 if (!mbCanSelect ||
1942 (gHideSelectedObjects && isSelected()) ||
1943 mDrawable->isDead() ||
1944 !gPipeline.hasRenderType(mDrawable->getRenderType()))
1945 {
1946 return FALSE;
1947 }
1948
1941 LLVolume* volume = getVolume(); 1949 LLVolume* volume = getVolume();
1942 if (volume) 1950 if (volume)
1943 { 1951 {
@@ -1946,37 +1954,88 @@ BOOL LLVOVolume::lineSegmentIntersect(const LLVector3& start, const LLVector3& e
1946 v_start = agentPositionToVolume(start); 1954 v_start = agentPositionToVolume(start);
1947 v_end = agentPositionToVolume(end); 1955 v_end = agentPositionToVolume(end);
1948 1956
1949 S32 face_hit = volume->lineSegmentIntersect(v_start, v_end, face, 1957 LLVector3 p;
1950 intersection, tex_coord, normal, bi_normal); 1958 LLVector3 n;
1951 if (face_hit >= 0) 1959 LLVector2 tc;
1960 LLVector3 bn;
1961
1962 if (intersection != NULL)
1952 { 1963 {
1953 if (face_hitp != NULL) 1964 p = *intersection;
1954 { 1965 }
1955 *face_hitp = face_hit; 1966
1956 } 1967 if (tex_coord != NULL)
1968 {
1969 tc = *tex_coord;
1970 }
1971
1972 if (normal != NULL)
1973 {
1974 n = *normal;
1975 }
1976
1977 if (bi_normal != NULL)
1978 {
1979 bn = *bi_normal;
1980 }
1981
1982 S32 face_hit = -1;
1983
1984 S32 start_face, end_face;
1985 if (face == -1)
1986 {
1987 start_face = 0;
1988 end_face = volume->getNumFaces();
1989 }
1990 else
1991 {
1992 start_face = face;
1993 end_face = face+1;
1994 }
1995
1996 for (S32 i = start_face; i < end_face; ++i)
1997 {
1998 face_hit = volume->lineSegmentIntersect(v_start, v_end, i,
1999 &p, &tc, &n, &bn);
1957 2000
1958 if (intersection != NULL) 2001 if (face_hit >= 0)
1959 { 2002 {
1960 *intersection = volumePositionToAgent(*intersection); // must map back to agent space 2003 LLFace* face = mDrawable->getFace(face_hit);
1961 } 2004 if (pick_transparent || !face->getTexture() || face->getTexture()->getMask(face->surfaceToTexture(tc, p, n)))
2005 {
2006 if (face_hitp != NULL)
2007 {
2008 *face_hitp = face_hit;
2009 }
2010
2011 if (intersection != NULL)
2012 {
2013 *intersection = volumePositionToAgent(p); // must map back to agent space
2014 }
1962 2015
1963 if (normal != NULL) 2016 if (normal != NULL)
1964 { 2017 {
1965 *normal = volumeDirectionToAgent(*normal); 2018 *normal = volumeDirectionToAgent(n);
1966 (*normal).normVec(); 2019 (*normal).normVec();
1967 } 2020 }
1968 2021
1969 if (bi_normal != NULL) 2022 if (bi_normal != NULL)
1970 { 2023 {
1971 *bi_normal = volumeDirectionToAgent(*bi_normal); 2024 *bi_normal = volumeDirectionToAgent(bn);
1972 (*bi_normal).normVec(); 2025 (*bi_normal).normVec();
1973 } 2026 }
1974 2027
1975 2028 if (tex_coord != NULL)
1976 return TRUE; 2029 {
2030 *tex_coord = tc;
2031 }
2032
2033 return TRUE;
2034 }
2035 }
1977 } 2036 }
1978 } 2037 }
1979 2038
1980 return FALSE; 2039 return FALSE;
1981} 2040}
1982 2041
diff --git a/linden/indra/newview/llvovolume.h b/linden/indra/newview/llvovolume.h
index d8828f0..9502bc3 100644
--- a/linden/indra/newview/llvovolume.h
+++ b/linden/indra/newview/llvovolume.h
@@ -114,6 +114,7 @@ public:
114 114
115 /*virtual*/ BOOL lineSegmentIntersect(const LLVector3& start, const LLVector3& end, 115 /*virtual*/ BOOL lineSegmentIntersect(const LLVector3& start, const LLVector3& end,
116 S32 face = -1, // which face to check, -1 = ALL_SIDES 116 S32 face = -1, // which face to check, -1 = ALL_SIDES
117 BOOL pick_transparent = FALSE,
117 S32* face_hit = NULL, // which face was hit 118 S32* face_hit = NULL, // which face was hit
118 LLVector3* intersection = NULL, // return the intersection point 119 LLVector3* intersection = NULL, // return the intersection point
119 LLVector2* tex_coord = NULL, // return the texture coordinates of the intersection point 120 LLVector2* tex_coord = NULL, // return the texture coordinates of the intersection point
diff --git a/linden/indra/newview/llvowlsky.cpp b/linden/indra/newview/llvowlsky.cpp
index 159603e..7c8e874 100644
--- a/linden/indra/newview/llvowlsky.cpp
+++ b/linden/indra/newview/llvowlsky.cpp
@@ -87,7 +87,7 @@ inline U32 LLVOWLSky::getStarsNumIndices(void)
87} 87}
88 88
89LLVOWLSky::LLVOWLSky(const LLUUID &id, const LLPCode pcode, LLViewerRegion *regionp) 89LLVOWLSky::LLVOWLSky(const LLUUID &id, const LLPCode pcode, LLViewerRegion *regionp)
90 : LLStaticViewerObject(id, pcode, regionp) 90 : LLStaticViewerObject(id, pcode, regionp, TRUE)
91{ 91{
92 initStars(); 92 initStars();
93} 93}
@@ -488,7 +488,7 @@ void LLVOWLSky::drawStars(void)
488 if (mStarsVerts.notNull()) 488 if (mStarsVerts.notNull())
489 { 489 {
490 mStarsVerts->setBuffer(LLDrawPoolWLSky::STAR_VERTEX_DATA_MASK); 490 mStarsVerts->setBuffer(LLDrawPoolWLSky::STAR_VERTEX_DATA_MASK);
491 mStarsVerts->draw(LLVertexBuffer::POINTS, getStarsNumIndices(), 0); 491 mStarsVerts->draw(LLRender::POINTS, getStarsNumIndices(), 0);
492 } 492 }
493} 493}
494 494
@@ -513,7 +513,7 @@ void LLVOWLSky::drawDome(void)
513 strips_segment->setBuffer(data_mask); 513 strips_segment->setBuffer(data_mask);
514 514
515 strips_segment->drawRange( 515 strips_segment->drawRange(
516 LLVertexBuffer::TRIANGLE_STRIP, 516 LLRender::TRIANGLE_STRIP,
517 0, strips_segment->getRequestedVerts()-1, strips_segment->getRequestedIndices(), 517 0, strips_segment->getRequestedVerts()-1, strips_segment->getRequestedIndices(),
518 0); 518 0);
519 gPipeline.addTrianglesDrawn(strips_segment->getRequestedIndices() - 2); 519 gPipeline.addTrianglesDrawn(strips_segment->getRequestedIndices() - 2);
diff --git a/linden/indra/newview/llwaterparammanager.cpp b/linden/indra/newview/llwaterparammanager.cpp
index f4f1163..e61c5b6 100644
--- a/linden/indra/newview/llwaterparammanager.cpp
+++ b/linden/indra/newview/llwaterparammanager.cpp
@@ -89,48 +89,57 @@ LLWaterParamManager::~LLWaterParamManager()
89void LLWaterParamManager::loadAllPresets(const std::string& file_name) 89void LLWaterParamManager::loadAllPresets(const std::string& file_name)
90{ 90{
91 std::string path_name(gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "windlight/water", "")); 91 std::string path_name(gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "windlight/water", ""));
92 LL_INFOS2("AppInit", "Shaders") << "Loading water settings from " << path_name << LL_ENDL; 92 LL_INFOS2("AppInit", "Shaders") << "Loading Default water settings from " << path_name << LL_ENDL;
93 93
94 //mParamList.clear();
95
96 bool found = true; 94 bool found = true;
97 while(found) 95 while(found)
98 { 96 {
99 std::string name; 97 std::string name;
100 found = gDirUtilp->getNextFileInDir(path_name, "*.xml", name, false); 98 found = gDirUtilp->getNextFileInDir(path_name, "*.xml", name, false);
101 99 if(found)
102 LL_DEBUGS2("AppInit", "Shaders") << "name: " << name << LL_ENDL;
103
104 // if we have one
105 if(found)
106 { 100 {
101
102 name=name.erase(name.length()-4);
103
107 // bugfix for SL-46920: preventing filenames that break stuff. 104 // bugfix for SL-46920: preventing filenames that break stuff.
108 char * curl_str = curl_unescape(name.c_str(), name.size()); 105 char * curl_str = curl_unescape(name.c_str(), name.size());
109 std::string unescaped_name(curl_str); 106 std::string unescaped_name(curl_str);
110 curl_free(curl_str); 107 curl_free(curl_str);
111 curl_str = NULL; 108 curl_str = NULL;
112 109
113 // not much error checking here since we're getting rid of this 110 LL_DEBUGS2("AppInit", "Shaders") << "name: " << name << LL_ENDL;
114 std::string water_name = unescaped_name.substr(0, unescaped_name.size() - 4); 111 loadPreset(unescaped_name,FALSE);
115 112 }
116 std::string cur_path(gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "windlight/water", name)); 113 }
117 LL_DEBUGS2("AppInit", "Shaders") << "Loading water from " << cur_path << LL_ENDL; 114
115 // And repeat for user presets, note the user presets will modify any system presets already loaded
116
117 std::string path_name2(gDirUtilp->getExpandedFilename( LL_PATH_USER_SETTINGS , "windlight/water", ""));
118 LL_INFOS2("AppInit", "Shaders") << "Loading User water settings from " << path_name2 << LL_ENDL;
118 119
119 llifstream water_xml(cur_path); 120 found = true;
120 if (water_xml) 121 while(found)
121 { 122 {
122 LLSD water_data(LLSD::emptyMap()); 123 std::string name;
123 LLPointer<LLSDParser> parser = new LLSDXMLParser(); 124 found = gDirUtilp->getNextFileInDir(path_name2, "*.xml", name, false);
124 parser->parse(water_xml, water_data, LLSDSerialize::SIZE_UNLIMITED); 125 if(found)
126 {
127 name=name.erase(name.length()-4);
125 128
126 addParamSet(water_name, water_data); 129 // bugfix for SL-46920: preventing filenames that break stuff.
127 water_xml.close(); 130 char * curl_str = curl_unescape(name.c_str(), name.size());
128 } 131 std::string unescaped_name(curl_str);
132 curl_free(curl_str);
133 curl_str = NULL;
134
135 LL_DEBUGS2("AppInit", "Shaders") << "name: " << name << LL_ENDL;
136 loadPreset(unescaped_name,FALSE);
129 } 137 }
130 } 138 }
139
131} 140}
132 141
133void LLWaterParamManager::loadPreset(const std::string & name) 142void LLWaterParamManager::loadPreset(const std::string & name,bool propagate)
134{ 143{
135 // bugfix for SL-46920: preventing filenames that break stuff. 144 // bugfix for SL-46920: preventing filenames that break stuff.
136 char * curl_str = curl_escape(name.c_str(), name.size()); 145 char * curl_str = curl_escape(name.c_str(), name.size());
@@ -142,8 +151,17 @@ void LLWaterParamManager::loadPreset(const std::string & name)
142 151
143 std::string pathName(gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "windlight/water", escaped_filename)); 152 std::string pathName(gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "windlight/water", escaped_filename));
144 llinfos << "Loading water settings from " << pathName << llendl; 153 llinfos << "Loading water settings from " << pathName << llendl;
145 154
146 llifstream presetsXML(pathName); 155 std::ifstream presetsXML;
156 presetsXML.open(pathName.c_str());
157
158 // That failed, try loading from the users area instead.
159 if(!presetsXML)
160 {
161 pathName=gDirUtilp->getExpandedFilename( LL_PATH_USER_SETTINGS , "windlight/water", escaped_filename);
162 llinfos << "Loading User water setting from " << pathName << llendl;
163 presetsXML.open(pathName.c_str());
164 }
147 165
148 if (presetsXML) 166 if (presetsXML)
149 { 167 {
@@ -170,10 +188,12 @@ void LLWaterParamManager::loadPreset(const std::string & name)
170 return; 188 return;
171 } 189 }
172 190
173 getParamSet(name, mCurParams); 191 if(propagate)
174 192 {
175 propagateParameters(); 193 getParamSet(name, mCurParams);
176} 194 propagateParameters();
195 }
196}
177 197
178void LLWaterParamManager::savePreset(const std::string & name) 198void LLWaterParamManager::savePreset(const std::string & name)
179{ 199{
@@ -187,7 +207,7 @@ void LLWaterParamManager::savePreset(const std::string & name)
187 207
188 // make an empty llsd 208 // make an empty llsd
189 LLSD paramsData(LLSD::emptyMap()); 209 LLSD paramsData(LLSD::emptyMap());
190 std::string pathName(gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "windlight/water", escaped_filename)); 210 std::string pathName(gDirUtilp->getExpandedFilename( LL_PATH_USER_SETTINGS , "windlight/water", escaped_filename));
191 211
192 // fill it with LLSD windlight params 212 // fill it with LLSD windlight params
193 paramsData = mParamList[name].getAll(); 213 paramsData = mParamList[name].getAll();
@@ -390,7 +410,8 @@ bool LLWaterParamManager::removeParamSet(const std::string& name, bool delete_fr
390 410
391 if(delete_from_disk) 411 if(delete_from_disk)
392 { 412 {
393 std::string path_name(gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "windlight/water", "")); 413
414 std::string path_name(gDirUtilp->getExpandedFilename( LL_PATH_USER_SETTINGS , "windlight/water", ""));
394 415
395 // use full curl escaped name 416 // use full curl escaped name
396 char * curl_str = curl_escape(name.c_str(), name.size()); 417 char * curl_str = curl_escape(name.c_str(), name.size());
diff --git a/linden/indra/newview/llwaterparammanager.h b/linden/indra/newview/llwaterparammanager.h
index 872725e..a351697 100644
--- a/linden/indra/newview/llwaterparammanager.h
+++ b/linden/indra/newview/llwaterparammanager.h
@@ -228,7 +228,8 @@ public:
228 void loadAllPresets(const std::string & fileName); 228 void loadAllPresets(const std::string & fileName);
229 229
230 /// load an individual preset into the sky 230 /// load an individual preset into the sky
231 void loadPreset(const std::string & name); 231
232 void loadPreset(const std::string & name,bool propagate=true);
232 233
233 /// save the parameter presets to file 234 /// save the parameter presets to file
234 void savePreset(const std::string & name); 235 void savePreset(const std::string & name);
diff --git a/linden/indra/newview/llwebbrowserctrl.cpp b/linden/indra/newview/llwebbrowserctrl.cpp
index e9a7132..8c56e5c 100644
--- a/linden/indra/newview/llwebbrowserctrl.cpp
+++ b/linden/indra/newview/llwebbrowserctrl.cpp
@@ -596,14 +596,14 @@ void LLWebBrowserCtrl::draw()
596 } 596 }
597 597
598 // scale texture to fit the space using texture coords 598 // scale texture to fit the space using texture coords
599 mWebBrowserImage->bindTexture(); 599 gGL.getTexUnit(0)->bind(mWebBrowserImage->getTexture());
600 gGL.color4fv( LLColor4::white.mV ); 600 gGL.color4fv( LLColor4::white.mV );
601 F32 max_u = ( F32 )mWebBrowserImage->getBrowserWidth() / ( F32 )mWebBrowserImage->getWidth(); 601 F32 max_u = ( F32 )mWebBrowserImage->getBrowserWidth() / ( F32 )mWebBrowserImage->getWidth();
602 F32 max_v = ( F32 )mWebBrowserImage->getBrowserHeight() / ( F32 )mWebBrowserImage->getHeight(); 602 F32 max_v = ( F32 )mWebBrowserImage->getBrowserHeight() / ( F32 )mWebBrowserImage->getHeight();
603 603
604 // draw the browser 604 // draw the browser
605 gGL.setSceneBlendType(LLRender::BT_REPLACE); 605 gGL.setSceneBlendType(LLRender::BT_REPLACE);
606 gGL.begin( LLVertexBuffer::QUADS ); 606 gGL.begin( LLRender::QUADS );
607 { 607 {
608 // render using web browser reported width and height, instead of trying to invert GL scale 608 // render using web browser reported width and height, instead of trying to invert GL scale
609 gGL.texCoord2f( max_u, max_v ); 609 gGL.texCoord2f( max_u, max_v );
diff --git a/linden/indra/newview/llwindebug.cpp b/linden/indra/newview/llwindebug.cpp
index d2f6748..04457eb 100644
--- a/linden/indra/newview/llwindebug.cpp
+++ b/linden/indra/newview/llwindebug.cpp
@@ -42,6 +42,7 @@
42#pragma warning(disable: 4200) //nonstandard extension used : zero-sized array in struct/union 42#pragma warning(disable: 4200) //nonstandard extension used : zero-sized array in struct/union
43#pragma warning(disable: 4100) //unreferenced formal parameter 43#pragma warning(disable: 4100) //unreferenced formal parameter
44 44
45
45/* 46/*
46LLSD Block for Windows Dump Information 47LLSD Block for Windows Dump Information
47<llsd> 48<llsd>
@@ -552,6 +553,58 @@ void LLMemoryReserve::release()
552 553
553static LLMemoryReserve gEmergencyMemoryReserve; 554static LLMemoryReserve gEmergencyMemoryReserve;
554 555
556#ifndef _M_IX86
557 #error "The following code only works for x86!"
558#endif
559LPTOP_LEVEL_EXCEPTION_FILTER WINAPI MyDummySetUnhandledExceptionFilter(
560 LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilter)
561{
562 if(lpTopLevelExceptionFilter == gFilterFunc)
563 return gFilterFunc;
564
565 llinfos << "Someone tried to set the exception filter. Listing call stack modules" << llendl;
566 LLSD cs_info;
567 GetCallStackData(NULL, cs_info);
568
569 if(cs_info.has("CallStack") && cs_info["CallStack"].isArray())
570 {
571 LLSD cs = cs_info["CallStack"];
572 for(LLSD::array_iterator i = cs.beginArray();
573 i != cs.endArray();
574 ++i)
575 {
576 llinfos << "Module: " << (*i)["ModuleName"] << llendl;
577 }
578 }
579
580 return gFilterFunc;
581}
582
583BOOL PreventSetUnhandledExceptionFilter()
584{
585 HMODULE hKernel32 = LoadLibrary(_T("kernel32.dll"));
586 if (hKernel32 == NULL)
587 return FALSE;
588
589 void *pOrgEntry = GetProcAddress(hKernel32, "SetUnhandledExceptionFilter");
590 if(pOrgEntry == NULL)
591 return FALSE;
592
593 unsigned char newJump[ 100 ];
594 DWORD dwOrgEntryAddr = (DWORD)pOrgEntry;
595 dwOrgEntryAddr += 5; // add 5 for 5 op-codes for jmp far
596 void *pNewFunc = &MyDummySetUnhandledExceptionFilter;
597 DWORD dwNewEntryAddr = (DWORD) pNewFunc;
598 DWORD dwRelativeAddr = dwNewEntryAddr - dwOrgEntryAddr;
599
600 newJump[ 0 ] = 0xE9; // JMP absolute
601 memcpy(&newJump[ 1 ], &dwRelativeAddr, sizeof(pNewFunc));
602 SIZE_T bytesWritten;
603 BOOL bRet = WriteProcessMemory(GetCurrentProcess(),
604 pOrgEntry, newJump, sizeof(pNewFunc) + 1, &bytesWritten);
605 return bRet;
606}
607
555// static 608// static
556void LLWinDebug::initExceptionHandler(LPTOP_LEVEL_EXCEPTION_FILTER filter_func) 609void LLWinDebug::initExceptionHandler(LPTOP_LEVEL_EXCEPTION_FILTER filter_func)
557{ 610{
@@ -602,6 +655,9 @@ void LLWinDebug::initExceptionHandler(LPTOP_LEVEL_EXCEPTION_FILTER filter_func)
602 LPTOP_LEVEL_EXCEPTION_FILTER prev_filter; 655 LPTOP_LEVEL_EXCEPTION_FILTER prev_filter;
603 prev_filter = SetUnhandledExceptionFilter(filter_func); 656 prev_filter = SetUnhandledExceptionFilter(filter_func);
604 657
658 // *REMOVE:Mani
659 //PreventSetUnhandledExceptionFilter();
660
605 if(prev_filter != gFilterFunc) 661 if(prev_filter != gFilterFunc)
606 { 662 {
607 LL_WARNS("AppInit") 663 LL_WARNS("AppInit")
@@ -737,3 +793,10 @@ void LLWinDebug::generateCrashStacks(struct _EXCEPTION_POINTERS *exception_infop
737 LLSDSerialize::toPrettyXML(info, out_file); 793 LLSDSerialize::toPrettyXML(info, out_file);
738 out_file.close(); 794 out_file.close();
739} 795}
796
797void LLWinDebug::clearCrashStacks()
798{
799 LLSD info;
800 std::string dump_path = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, "SecondLifeException.log");
801 LLFile::remove(dump_path);
802}
diff --git a/linden/indra/newview/llwindebug.h b/linden/indra/newview/llwindebug.h
index eef2340..e6e32b4 100644
--- a/linden/indra/newview/llwindebug.h
+++ b/linden/indra/newview/llwindebug.h
@@ -39,7 +39,6 @@ class LLWinDebug
39{ 39{
40public: 40public:
41 41
42
43 /** 42 /**
44 * @brief initialize the llwindebug exception filter callback 43 * @brief initialize the llwindebug exception filter callback
45 * 44 *
@@ -66,6 +65,8 @@ public:
66 static bool checkExceptionHandler(); 65 static bool checkExceptionHandler();
67 66
68 static void generateCrashStacks(struct _EXCEPTION_POINTERS *pExceptionInfo = NULL); 67 static void generateCrashStacks(struct _EXCEPTION_POINTERS *pExceptionInfo = NULL);
68 static void clearCrashStacks(); // Delete the crash stack file(s).
69
69 static void writeDumpToFile(MINIDUMP_TYPE type, MINIDUMP_EXCEPTION_INFORMATION *ExInfop, const std::string& filename); 70 static void writeDumpToFile(MINIDUMP_TYPE type, MINIDUMP_EXCEPTION_INFORMATION *ExInfop, const std::string& filename);
70private: 71private:
71}; 72};
diff --git a/linden/indra/newview/llwlparammanager.cpp b/linden/indra/newview/llwlparammanager.cpp
index 1707fe9..b522284 100644
--- a/linden/indra/newview/llwlparammanager.cpp
+++ b/linden/indra/newview/llwlparammanager.cpp
@@ -106,84 +106,65 @@ LLWLParamManager::~LLWLParamManager()
106 106
107void LLWLParamManager::loadPresets(const std::string& file_name) 107void LLWLParamManager::loadPresets(const std::string& file_name)
108{ 108{
109 // if fileName exists, use legacy loading form the big file, otherwise, search the sky 109 std::string path_name(gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "windlight/skies", ""));
110 // directory, and add the list 110 LL_INFOS2("AppInit", "Shaders") << "Loading Default WindLight settings from " << path_name << LL_ENDL;
111 if(file_name != "") 111
112 bool found = true;
113 while(found)
112 { 114 {
113 std::string path_name(gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "windlight", file_name)); 115 std::string name;
114 LL_INFOS2("AppInit", "Shaders") << "Loading WindLight settings from " << path_name << LL_ENDL; 116 found = gDirUtilp->getNextFileInDir(path_name, "*.xml", name, false);
115 117 if(found)
116 llifstream presetsXML(path_name);
117
118 if (presetsXML)
119 { 118 {
120 LLSD paramsData(LLSD::emptyMap());
121 119
122 LLPointer<LLSDParser> parser = new LLSDXMLParser(); 120 name=name.erase(name.length()-4);
123 121
124 parser->parse(presetsXML, paramsData, LLSDSerialize::SIZE_UNLIMITED); 122 // bugfix for SL-46920: preventing filenames that break stuff.
123 char * curl_str = curl_unescape(name.c_str(), name.size());
124 std::string unescaped_name(curl_str);
125 curl_free(curl_str);
126 curl_str = NULL;
125 127
126 LLSD::map_const_iterator endParams = paramsData.endMap(); 128 LL_DEBUGS2("AppInit", "Shaders") << "name: " << name << LL_ENDL;
127 for(LLSD::map_const_iterator curParams = paramsData.beginMap(); 129 loadPreset(unescaped_name,FALSE);
128 curParams != endParams;
129 ++curParams)
130 {
131 addParamSet(curParams->first, curParams->second);
132 }
133 } 130 }
134 } 131 }
135 132
136 // otherwise, search the sky directory and find things there 133 // And repeat for user presets, note the user presets will modify any system presets already loaded
137 else 134
135 std::string path_name2(gDirUtilp->getExpandedFilename( LL_PATH_USER_SETTINGS , "windlight/skies", ""));
136 LL_INFOS2("AppInit", "Shaders") << "Loading User WindLight settings from " << path_name2 << LL_ENDL;
137
138 found = true;
139 while(found)
138 { 140 {
139 std::string path_name(gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "windlight/skies", "")); 141 std::string name;
140 LL_INFOS2("AppInit", "Shaders") << "Loading WindLight settings from " << path_name << LL_ENDL; 142 found = gDirUtilp->getNextFileInDir(path_name2, "*.xml", name, false);
141 143 if(found)
142 //mParamList.clear();
143
144 bool found = true;
145 while(found)
146 { 144 {
147 std::string name; 145 name=name.erase(name.length()-4);
148 found = gDirUtilp->getNextFileInDir(path_name, "*.xml", name, false); 146
147 // bugfix for SL-46920: preventing filenames that break stuff.
148 char * curl_str = curl_unescape(name.c_str(), name.size());
149 std::string unescaped_name(curl_str);
150 curl_free(curl_str);
151 curl_str = NULL;
149 152
150 LL_DEBUGS2("AppInit", "Shaders") << "name: " << name << LL_ENDL; 153 LL_DEBUGS2("AppInit", "Shaders") << "name: " << name << LL_ENDL;
151 154 loadPreset(unescaped_name,FALSE);
152 // if we have one
153 if(found)
154 {
155 // bugfix for SL-46920: preventing filenames that break stuff.
156 char * curl_str = curl_unescape(name.c_str(), name.size());
157 std::string unescaped_name(curl_str);
158 curl_free(curl_str);
159 curl_str = NULL;
160
161 // not much error checking here since we're getting rid of this
162 std::string sky_name = unescaped_name.substr(0, unescaped_name.size() - 4);
163
164 std::string cur_path(gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "windlight/skies", name));
165 LL_DEBUGS2("AppInit", "Shaders") << "Loading sky from " << cur_path << LL_ENDL;
166
167 llifstream sky_xml(cur_path);
168 if (sky_xml)
169 {
170 LLSD sky_data(LLSD::emptyMap());
171 LLPointer<LLSDParser> parser = new LLSDXMLParser();
172 parser->parse(sky_xml, sky_data, LLSDSerialize::SIZE_UNLIMITED);
173
174 addParamSet(sky_name, sky_data);
175 sky_xml.close();
176 }
177 }
178 } 155 }
179 } 156 }
157
180} 158}
181 159
182void LLWLParamManager::savePresets(const std::string & fileName) 160void LLWLParamManager::savePresets(const std::string & fileName)
183{ 161{
162 //Nobody currently calls me, but if they did, then its reasonable to write the data out to the user's folder
163 //and not over the RO system wide version.
164
184 LLSD paramsData(LLSD::emptyMap()); 165 LLSD paramsData(LLSD::emptyMap());
185 166
186 std::string pathName(gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "windlight", fileName)); 167 std::string pathName(gDirUtilp->getExpandedFilename( LL_PATH_USER_SETTINGS , "windlight", fileName));
187 168
188 for(std::map<std::string, LLWLParamSet>::iterator mIt = mParamList.begin(); 169 for(std::map<std::string, LLWLParamSet>::iterator mIt = mParamList.begin();
189 mIt != mParamList.end(); 170 mIt != mParamList.end();
@@ -201,8 +182,9 @@ void LLWLParamManager::savePresets(const std::string & fileName)
201 presetsXML.close(); 182 presetsXML.close();
202} 183}
203 184
204void LLWLParamManager::loadPreset(const std::string & name) 185void LLWLParamManager::loadPreset(const std::string & name,bool propagate)
205{ 186{
187
206 // bugfix for SL-46920: preventing filenames that break stuff. 188 // bugfix for SL-46920: preventing filenames that break stuff.
207 char * curl_str = curl_escape(name.c_str(), name.size()); 189 char * curl_str = curl_escape(name.c_str(), name.size());
208 std::string escaped_filename(curl_str); 190 std::string escaped_filename(curl_str);
@@ -214,7 +196,16 @@ void LLWLParamManager::loadPreset(const std::string & name)
214 std::string pathName(gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "windlight/skies", escaped_filename)); 196 std::string pathName(gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "windlight/skies", escaped_filename));
215 llinfos << "Loading WindLight sky setting from " << pathName << llendl; 197 llinfos << "Loading WindLight sky setting from " << pathName << llendl;
216 198
217 llifstream presetsXML(pathName); 199 llifstream presetsXML;
200 presetsXML.open(pathName.c_str());
201
202 // That failed, try loading from the users area instead.
203 if(!presetsXML)
204 {
205 pathName=gDirUtilp->getExpandedFilename( LL_PATH_USER_SETTINGS , "windlight/skies", escaped_filename);
206 llinfos << "Loading User WindLight sky setting from " << pathName << llendl;
207 presetsXML.open(pathName.c_str());
208 }
218 209
219 if (presetsXML) 210 if (presetsXML)
220 { 211 {
@@ -241,10 +232,13 @@ void LLWLParamManager::loadPreset(const std::string & name)
241 return; 232 return;
242 } 233 }
243 234
244 getParamSet(name, mCurParams); 235
245 236 if(propagate)
246 propagateParameters(); 237 {
247} 238 getParamSet(name, mCurParams);
239 propagateParameters();
240 }
241}
248 242
249void LLWLParamManager::savePreset(const std::string & name) 243void LLWLParamManager::savePreset(const std::string & name)
250{ 244{
@@ -258,7 +252,7 @@ void LLWLParamManager::savePreset(const std::string & name)
258 252
259 // make an empty llsd 253 // make an empty llsd
260 LLSD paramsData(LLSD::emptyMap()); 254 LLSD paramsData(LLSD::emptyMap());
261 std::string pathName(gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "windlight/skies", escaped_filename)); 255 std::string pathName(gDirUtilp->getExpandedFilename( LL_PATH_USER_SETTINGS , "windlight/skies", escaped_filename));
262 256
263 // fill it with LLSD windlight params 257 // fill it with LLSD windlight params
264 paramsData = mParamList[name].getAll(); 258 paramsData = mParamList[name].getAll();
@@ -533,7 +527,7 @@ bool LLWLParamManager::removeParamSet(const std::string& name, bool delete_from_
533 527
534 if(delete_from_disk) 528 if(delete_from_disk)
535 { 529 {
536 std::string path_name(gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "windlight/skies", "")); 530 std::string path_name(gDirUtilp->getExpandedFilename( LL_PATH_USER_SETTINGS , "windlight/skies", ""));
537 531
538 // use full curl escaped name 532 // use full curl escaped name
539 char * curl_str = curl_escape(name.c_str(), name.size()); 533 char * curl_str = curl_escape(name.c_str(), name.size());
diff --git a/linden/indra/newview/llwlparammanager.h b/linden/indra/newview/llwlparammanager.h
index 7094051..2e1edad 100644
--- a/linden/indra/newview/llwlparammanager.h
+++ b/linden/indra/newview/llwlparammanager.h
@@ -135,7 +135,7 @@ public:
135 void savePresets(const std::string & fileName); 135 void savePresets(const std::string & fileName);
136 136
137 /// load an individual preset into the sky 137 /// load an individual preset into the sky
138 void loadPreset(const std::string & name); 138 void loadPreset(const std::string & name,bool propogate=true);
139 139
140 /// save the parameter presets to file 140 /// save the parameter presets to file
141 void savePreset(const std::string & name); 141 void savePreset(const std::string & name);
@@ -195,7 +195,6 @@ public:
195 // singleton pattern implementation 195 // singleton pattern implementation
196 static LLWLParamManager * instance(); 196 static LLWLParamManager * instance();
197 197
198
199public: 198public:
200 199
201 // helper variables 200 // helper variables
diff --git a/linden/indra/newview/llworld.cpp b/linden/indra/newview/llworld.cpp
index 66c4068..28df561 100644
--- a/linden/indra/newview/llworld.cpp
+++ b/linden/indra/newview/llworld.cpp
@@ -32,6 +32,7 @@
32#include "llviewerprecompiledheaders.h" 32#include "llviewerprecompiledheaders.h"
33 33
34#include "llworld.h" 34#include "llworld.h"
35#include "llrender.h"
35 36
36#include "indra_constants.h" 37#include "indra_constants.h"
37#include "llstl.h" 38#include "llstl.h"
@@ -108,7 +109,7 @@ LLWorld::LLWorld() :
108 *(default_texture++) = MAX_WATER_COLOR.mV[3]; 109 *(default_texture++) = MAX_WATER_COLOR.mV[3];
109 110
110 mDefaultWaterTexturep = new LLViewerImage(raw, FALSE); 111 mDefaultWaterTexturep = new LLViewerImage(raw, FALSE);
111 mDefaultWaterTexturep->bind(); 112 gGL.getTexUnit(0)->bind(mDefaultWaterTexturep.get());
112 mDefaultWaterTexturep->setClamp(TRUE, TRUE); 113 mDefaultWaterTexturep->setClamp(TRUE, TRUE);
113 114
114} 115}
diff --git a/linden/indra/newview/llworldmap.cpp b/linden/indra/newview/llworldmap.cpp
index 1048fe9..e83f6a9 100644
--- a/linden/indra/newview/llworldmap.cpp
+++ b/linden/indra/newview/llworldmap.cpp
@@ -498,7 +498,8 @@ void LLWorldMap::processMapLayerReply(LLMessageSystem* msg, void**)
498 new_layer.LayerDefined = TRUE; 498 new_layer.LayerDefined = TRUE;
499 msg->getUUIDFast(_PREHASH_LayerData, _PREHASH_ImageID, new_layer.LayerImageID, block); 499 msg->getUUIDFast(_PREHASH_LayerData, _PREHASH_ImageID, new_layer.LayerImageID, block);
500 new_layer.LayerImage = gImageList.getImage(new_layer.LayerImageID, MIPMAP_TRUE, FALSE); 500 new_layer.LayerImage = gImageList.getImage(new_layer.LayerImageID, MIPMAP_TRUE, FALSE);
501 new_layer.LayerImage->bindTexture(0); 501
502 gGL.getTexUnit(0)->bind(new_layer.LayerImage.get());
502 new_layer.LayerImage->setClamp(TRUE, TRUE); 503 new_layer.LayerImage->setClamp(TRUE, TRUE);
503 504
504 U32 left, right, top, bottom; 505 U32 left, right, top, bottom;
@@ -610,7 +611,7 @@ void LLWorldMap::processMapBlockReply(LLMessageSystem* msg, void**)
610 siminfo->mWaterHeight = (F32) water_height; 611 siminfo->mWaterHeight = (F32) water_height;
611 siminfo->mMapImageID[agent_flags] = image_id; 612 siminfo->mMapImageID[agent_flags] = image_id;
612 siminfo->mCurrentImage = gImageList.getImage(siminfo->mMapImageID[LLWorldMap::getInstance()->mCurrentMap], MIPMAP_TRUE, FALSE); 613 siminfo->mCurrentImage = gImageList.getImage(siminfo->mMapImageID[LLWorldMap::getInstance()->mCurrentMap], MIPMAP_TRUE, FALSE);
613 siminfo->mCurrentImage->bindTexture(0); 614 gGL.getTexUnit(0)->bind(siminfo->mCurrentImage.get());
614 siminfo->mCurrentImage->setClamp(TRUE, TRUE); 615 siminfo->mCurrentImage->setClamp(TRUE, TRUE);
615 616
616 if (siminfo->mMapImageID[2].notNull()) 617 if (siminfo->mMapImageID[2].notNull())
diff --git a/linden/indra/newview/llworldmapview.cpp b/linden/indra/newview/llworldmapview.cpp
index 92d9588..3fd1d11 100644
--- a/linden/indra/newview/llworldmapview.cpp
+++ b/linden/indra/newview/llworldmapview.cpp
@@ -301,7 +301,7 @@ void LLWorldMapView::draw()
301 301
302 LLLocalClipRect clip(getLocalRect()); 302 LLLocalClipRect clip(getLocalRect());
303 { 303 {
304 LLGLSNoTexture no_texture; 304 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
305 305
306 glMatrixMode(GL_MODELVIEW); 306 glMatrixMode(GL_MODELVIEW);
307 307
@@ -377,7 +377,7 @@ void LLWorldMapView::draw()
377 377
378 // Draw using the texture. If we don't clamp we get artifact at 378 // Draw using the texture. If we don't clamp we get artifact at
379 // the edge. 379 // the edge.
380 LLViewerImage::bindTexture(current_image); 380 gGL.getTexUnit(0)->bind(current_image);
381 381
382 // Draw map image into RGB 382 // Draw map image into RGB
383 //gGL.blendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 383 //gGL.blendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
@@ -385,7 +385,7 @@ void LLWorldMapView::draw()
385 gGL.setColorMask(true, false); 385 gGL.setColorMask(true, false);
386 gGL.color4f(1.f, 1.f, 1.f, layer_alpha); 386 gGL.color4f(1.f, 1.f, 1.f, layer_alpha);
387 387
388 gGL.begin(LLVertexBuffer::QUADS); 388 gGL.begin(LLRender::QUADS);
389 gGL.texCoord2f(0.0f, 1.0f); 389 gGL.texCoord2f(0.0f, 1.0f);
390 gGL.vertex3f(left, top, -1.0f); 390 gGL.vertex3f(left, top, -1.0f);
391 gGL.texCoord2f(0.0f, 0.0f); 391 gGL.texCoord2f(0.0f, 0.0f);
@@ -401,7 +401,7 @@ void LLWorldMapView::draw()
401 gGL.setColorMask(false, true); 401 gGL.setColorMask(false, true);
402 gGL.color4f(1.f, 1.f, 1.f, 1.f); 402 gGL.color4f(1.f, 1.f, 1.f, 1.f);
403 403
404 gGL.begin(LLVertexBuffer::QUADS); 404 gGL.begin(LLRender::QUADS);
405 gGL.texCoord2f(0.0f, 1.0f); 405 gGL.texCoord2f(0.0f, 1.0f);
406 gGL.vertex2f(left, top); 406 gGL.vertex2f(left, top);
407 gGL.texCoord2f(0.0f, 0.0f); 407 gGL.texCoord2f(0.0f, 0.0f);
@@ -434,7 +434,7 @@ void LLWorldMapView::draw()
434 if (info->mOverlayImage.isNull() && info->mMapImageID[2].notNull()) 434 if (info->mOverlayImage.isNull() && info->mMapImageID[2].notNull())
435 { 435 {
436 info->mOverlayImage = gImageList.getImage(info->mMapImageID[2], MIPMAP_TRUE, FALSE); 436 info->mOverlayImage = gImageList.getImage(info->mMapImageID[2], MIPMAP_TRUE, FALSE);
437 info->mOverlayImage->bind(0); 437 gGL.getTexUnit(0)->bind(info->mOverlayImage.get());
438 info->mOverlayImage->setClamp(TRUE, TRUE); 438 info->mOverlayImage->setClamp(TRUE, TRUE);
439 } 439 }
440 440
@@ -536,13 +536,13 @@ void LLWorldMapView::draw()
536 // Draw using the texture. If we don't clamp we get artifact at 536 // Draw using the texture. If we don't clamp we get artifact at
537 // the edge. 537 // the edge.
538 LLGLSUIDefault gls_ui; 538 LLGLSUIDefault gls_ui;
539 LLViewerImage::bindTexture(simimage); 539 gGL.getTexUnit(0)->bind(simimage);
540 540
541 gGL.setSceneBlendType(LLRender::BT_ALPHA); 541 gGL.setSceneBlendType(LLRender::BT_ALPHA);
542 F32 alpha = sim_alpha * info->mAlpha; 542 F32 alpha = sim_alpha * info->mAlpha;
543 gGL.color4f(1.f, 1.0f, 1.0f, alpha); 543 gGL.color4f(1.f, 1.0f, 1.0f, alpha);
544 544
545 gGL.begin(LLVertexBuffer::QUADS); 545 gGL.begin(LLRender::QUADS);
546 gGL.texCoord2f(0.f, 1.f); 546 gGL.texCoord2f(0.f, 1.f);
547 gGL.vertex3f(left, top, 0.f); 547 gGL.vertex3f(left, top, 0.f);
548 gGL.texCoord2f(0.f, 0.f); 548 gGL.texCoord2f(0.f, 0.f);
@@ -555,9 +555,9 @@ void LLWorldMapView::draw()
555 555
556 if (gSavedSettings.getBOOL("MapShowLandForSale") && overlayimage && overlayimage->getHasGLTexture()) 556 if (gSavedSettings.getBOOL("MapShowLandForSale") && overlayimage && overlayimage->getHasGLTexture())
557 { 557 {
558 LLViewerImage::bindTexture(overlayimage); 558 gGL.getTexUnit(0)->bind(overlayimage);
559 gGL.color4f(1.f, 1.f, 1.f, alpha); 559 gGL.color4f(1.f, 1.f, 1.f, alpha);
560 gGL.begin(LLVertexBuffer::QUADS); 560 gGL.begin(LLRender::QUADS);
561 gGL.texCoord2f(0.f, 1.f); 561 gGL.texCoord2f(0.f, 1.f);
562 gGL.vertex3f(left, top, -0.5f); 562 gGL.vertex3f(left, top, -0.5f);
563 gGL.texCoord2f(0.f, 0.f); 563 gGL.texCoord2f(0.f, 0.f);
@@ -577,8 +577,8 @@ void LLWorldMapView::draw()
577 gGL.setColorMask(false, true); 577 gGL.setColorMask(false, true);
578 gGL.color4f(1.f, 1.f, 1.f, 1.f); 578 gGL.color4f(1.f, 1.f, 1.f, 1.f);
579 579
580 LLGLSNoTexture gls_no_texture; 580 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
581 gGL.begin(LLVertexBuffer::QUADS); 581 gGL.begin(LLRender::QUADS);
582 gGL.vertex2f(left, top); 582 gGL.vertex2f(left, top);
583 gGL.vertex2f(left, bottom); 583 gGL.vertex2f(left, bottom);
584 gGL.vertex2f(right, bottom); 584 gGL.vertex2f(right, bottom);
@@ -596,8 +596,8 @@ void LLWorldMapView::draw()
596 gGL.blendFunc(LLRender::BF_DEST_ALPHA, LLRender::BF_SOURCE_ALPHA); 596 gGL.blendFunc(LLRender::BF_DEST_ALPHA, LLRender::BF_SOURCE_ALPHA);
597 gGL.color4f(0.2f, 0.0f, 0.0f, 0.4f); 597 gGL.color4f(0.2f, 0.0f, 0.0f, 0.4f);
598 598
599 LLGLSNoTexture gls_no_texture; 599 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
600 gGL.begin(LLVertexBuffer::QUADS); 600 gGL.begin(LLRender::QUADS);
601 gGL.vertex2f(left, top); 601 gGL.vertex2f(left, top);
602 gGL.vertex2f(left, bottom); 602 gGL.vertex2f(left, bottom);
603 gGL.vertex2f(right, bottom); 603 gGL.vertex2f(right, bottom);
@@ -612,9 +612,9 @@ void LLWorldMapView::draw()
612 { 612 {
613 gGL.blendFunc(LLRender::BF_DEST_ALPHA, LLRender::BF_ZERO); 613 gGL.blendFunc(LLRender::BF_DEST_ALPHA, LLRender::BF_ZERO);
614 614
615 LLGLSNoTexture gls_no_texture; 615 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
616 gGL.color3f(1.f, 0.f, 0.f); 616 gGL.color3f(1.f, 0.f, 0.f);
617 gGL.begin(LLVertexBuffer::LINES); 617 gGL.begin(LLRender::LINES);
618 gGL.vertex2f(left, top); 618 gGL.vertex2f(left, top);
619 gGL.vertex2f(right, bottom); 619 gGL.vertex2f(right, bottom);
620 gGL.vertex2f(left, bottom); 620 gGL.vertex2f(left, bottom);
@@ -683,7 +683,7 @@ void LLWorldMapView::draw()
683 // Draw background rectangle 683 // Draw background rectangle
684 LLGLSUIDefault gls_ui; 684 LLGLSUIDefault gls_ui;
685 { 685 {
686 LLGLSNoTexture gls_no_texture; 686 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
687 gGL.setAlphaRejectSettings(LLRender::CF_GREATER_EQUAL, 0.f); 687 gGL.setAlphaRejectSettings(LLRender::CF_GREATER_EQUAL, 0.f);
688 gGL.blendFunc(LLRender::BF_ONE_MINUS_DEST_ALPHA, LLRender::BF_DEST_ALPHA); 688 gGL.blendFunc(LLRender::BF_ONE_MINUS_DEST_ALPHA, LLRender::BF_DEST_ALPHA);
689 gGL.color4fv( mBackgroundColor.mV ); 689 gGL.color4fv( mBackgroundColor.mV );
@@ -969,7 +969,7 @@ void LLWorldMapView::drawFrustum()
969 F32 ctr_x = getRect().getWidth() * 0.5f + sPanX; 969 F32 ctr_x = getRect().getWidth() * 0.5f + sPanX;
970 F32 ctr_y = getRect().getHeight() * 0.5f + sPanY; 970 F32 ctr_y = getRect().getHeight() * 0.5f + sPanY;
971 971
972 LLGLSNoTexture gls_no_texture; 972 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
973 973
974 // Since we don't rotate the map, we have to rotate the frustum. 974 // Since we don't rotate the map, we have to rotate the frustum.
975 gGL.pushMatrix(); 975 gGL.pushMatrix();
@@ -978,7 +978,7 @@ void LLWorldMapView::drawFrustum()
978 978
979 // Draw triangle with more alpha in far pixels to make it 979 // Draw triangle with more alpha in far pixels to make it
980 // fade out in distance. 980 // fade out in distance.
981 gGL.begin( LLVertexBuffer::TRIANGLES ); 981 gGL.begin( LLRender::TRIANGLES );
982 gGL.color4f(1.f, 1.f, 1.f, 0.25f); 982 gGL.color4f(1.f, 1.f, 1.f, 0.25f);
983 gGL.vertex2f( 0, 0 ); 983 gGL.vertex2f( 0, 0 );
984 984
@@ -1184,11 +1184,11 @@ static void drawDot(F32 x_pixels, F32 y_pixels,
1184 F32 top = y_pixels + dot_radius; 1184 F32 top = y_pixels + dot_radius;
1185 F32 bottom = y_pixels - dot_radius; 1185 F32 bottom = y_pixels - dot_radius;
1186 1186
1187 LLGLSNoTexture gls_no_texture; 1187 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
1188 gGL.color4fv( color.mV ); 1188 gGL.color4fv( color.mV );
1189 LLUI::setLineWidth(1.5f); 1189 LLUI::setLineWidth(1.5f);
1190 F32 h_bar = relative_z > HEIGHT_THRESHOLD ? top : bottom; // horizontal bar Y 1190 F32 h_bar = relative_z > HEIGHT_THRESHOLD ? top : bottom; // horizontal bar Y
1191 gGL.begin( LLVertexBuffer::LINES ); 1191 gGL.begin( LLRender::LINES );
1192 gGL.vertex2f(center, top); 1192 gGL.vertex2f(center, top);
1193 gGL.vertex2f(left, h_bar); 1193 gGL.vertex2f(left, h_bar);
1194 gGL.vertex2f(right, h_bar); 1194 gGL.vertex2f(right, h_bar);
diff --git a/linden/indra/newview/lsl_guide.html b/linden/indra/newview/lsl_guide.html
deleted file mode 100644
index aa660b8..0000000
--- a/linden/indra/newview/lsl_guide.html
+++ /dev/null
@@ -1,22078 +0,0 @@
1<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN""http://www.w3.org/TR/html4/loose.dtd">
2<HTML
3><HEAD
4><TITLE
5>Linden Scripting Language Guide</TITLE
6><META
7NAME="GENERATOR"
8CONTENT="Modular DocBook HTML Stylesheet Version 1.79"></HEAD
9><BODY
10CLASS="book"
11BGCOLOR="#FFFFFF"
12TEXT="#000000"
13LINK="#0000FF"
14VLINK="#840084"
15ALINK="#0000FF"
16><DIV
17CLASS="BOOK"
18><A
19NAME="AEN1"
20></A
21><DIV
22CLASS="TITLEPAGE"
23><H1
24CLASS="title"
25><A
26NAME="AEN2"
27>Linden Scripting Language Guide</A
28></H1
29><H3
30CLASS="author"
31><A
32NAME="AEN4"
33></A
34>Aaron Brashears</H3
35><H3
36CLASS="author"
37><A
38NAME="AEN7"
39></A
40>Andrew Meadows</H3
41><H3
42CLASS="author"
43><A
44NAME="AEN10"
45></A
46>Cory Ondrejka</H3
47><H3
48CLASS="author"
49><A
50NAME="AEN13"
51></A
52>Doug Soo</H3
53><H3
54CLASS="author"
55><A
56NAME="AEN16"
57></A
58>Donald Kjer</H3
59><P
60CLASS="copyright"
61>Copyright &copy; 2007 Linden Lab</P
62><DIV
63CLASS="legalnotice"
64><P
65></P
66><A
67NAME="AEN22"
68></A
69><P
70><SPAN
71CLASS="trademark"
72>Linden Lab</SPAN
73>&reg; and
74 <SPAN
75CLASS="trademark"
76>Second Life</SPAN
77>&reg; are registered
78 trademarks of Linden Research, Inc.</P
79><P
80></P
81></DIV
82><HR></DIV
83><DIV
84CLASS="TOC"
85><DL
86><DT
87><B
88>Table of Contents</B
89></DT
90><DT
91>1. <A
92HREF="#AEN27"
93>Introduction</A
94></DT
95><DT
96>2. <A
97HREF="#AEN33"
98>Getting Started</A
99></DT
100><DD
101><DL
102><DT
103>2.1. <A
104HREF="#AEN36"
105>Hello Avatar</A
106></DT
107><DD
108><DL
109><DT
110>2.1.1. <A
111HREF="#AEN50"
112>Creating the Script</A
113></DT
114><DT
115>2.1.2. <A
116HREF="#AEN56"
117>Default State</A
118></DT
119><DT
120>2.1.3. <A
121HREF="#AEN67"
122>Functions</A
123></DT
124><DT
125>2.1.4. <A
126HREF="#AEN82"
127>Touch Event</A
128></DT
129><DT
130>2.1.5. <A
131HREF="#AEN90"
132>Try it Out</A
133></DT
134></DL
135></DD
136><DT
137>2.2. <A
138HREF="#AEN103"
139>Using The Built-In Editor</A
140></DT
141><DT
142>2.3. <A
143HREF="#AEN106"
144>Using Alternative Editors</A
145></DT
146></DL
147></DD
148><DT
149>3. <A
150HREF="#AEN109"
151>Basics</A
152></DT
153><DD
154><DL
155><DT
156>3.1. <A
157HREF="#AEN112"
158>Comments</A
159></DT
160><DT
161>3.2. <A
162HREF="#AEN129"
163>Arithmetic Operations</A
164></DT
165><DD
166><DL
167><DT
168>3.2.1. <A
169HREF="#AEN132"
170>Assignment</A
171></DT
172><DT
173>3.2.2. <A
174HREF="#AEN139"
175>Hexadecimal Entry</A
176></DT
177><DT
178>3.2.3. <A
179HREF="#AEN145"
180>Binary Arithmetic Operators</A
181></DT
182><DT
183>3.2.4. <A
184HREF="#AEN185"
185>Boolean Operators</A
186></DT
187><DT
188>3.2.5. <A
189HREF="#AEN217"
190>Bitwise Operators</A
191></DT
192></DL
193></DD
194><DT
195>3.3. <A
196HREF="#AEN237"
197>Types</A
198></DT
199><DD
200><DL
201><DT
202>3.3.1. <A
203HREF="#AEN318"
204>Type Conversion</A
205></DT
206></DL
207></DD
208><DT
209>3.4. <A
210HREF="#AEN360"
211>Global Functions</A
212></DT
213><DT
214>3.5. <A
215HREF="#AEN365"
216>Global Variables</A
217></DT
218><DT
219>3.6. <A
220HREF="#AEN373"
221>Local Variables</A
222></DT
223></DL
224></DD
225><DT
226>4. <A
227HREF="#AEN378"
228>Flow Control</A
229></DT
230><DD
231><DL
232><DT
233>4.1. <A
234HREF="#AEN381"
235>Conditional Statements</A
236></DT
237><DT
238>4.2. <A
239HREF="#AEN394"
240>Loop Constructs</A
241></DT
242><DD
243><DL
244><DT
245>4.2.1. <A
246HREF="#AEN397"
247>for loop</A
248></DT
249><DT
250>4.2.2. <A
251HREF="#AEN403"
252>do-while loop</A
253></DT
254><DT
255>4.2.3. <A
256HREF="#AEN409"
257>while loop</A
258></DT
259></DL
260></DD
261><DT
262>4.3. <A
263HREF="#AEN415"
264>Jumps</A
265></DT
266><DT
267>4.4. <A
268HREF="#AEN421"
269>State Change</A
270></DT
271></DL
272></DD
273><DT
274>5. <A
275HREF="#AEN427"
276>States</A
277></DT
278><DD
279><DL
280><DT
281>5.1. <A
282HREF="#AEN431"
283>state_entry()</A
284></DT
285><DT
286>5.2. <A
287HREF="#AEN440"
288>state_exit()</A
289></DT
290><DT
291>5.3. <A
292HREF="#AEN449"
293>States vs. Global variables</A
294></DT
295></DL
296></DD
297><DT
298>6. <A
299HREF="#AEN452"
300>Math</A
301></DT
302><DD
303><DL
304><DT
305>6.1. <A
306HREF="#AEN454"
307>Tables of Functions</A
308></DT
309></DL
310></DD
311><DT
312>7. <A
313HREF="#AEN561"
314>Strings</A
315></DT
316><DD
317><DL
318><DT
319>7.1. <A
320HREF="#AEN563"
321>Tables of Functions</A
322></DT
323></DL
324></DD
325><DT
326>8. <A
327HREF="#AEN605"
328>Lists</A
329></DT
330><DD
331><DL
332><DT
333>8.1. <A
334HREF="#AEN607"
335>Tables of Functions</A
336></DT
337></DL
338></DD
339><DT
340>9. <A
341HREF="#AEN670"
342>Communication</A
343></DT
344><DD
345><DL
346><DT
347>9.1. <A
348HREF="#AEN672"
349>Tables of Functions</A
350></DT
351></DL
352></DD
353><DT
354>10. <A
355HREF="#AEN715"
356>Inventory</A
357></DT
358><DD
359><DL
360><DT
361>10.1. <A
362HREF="#AEN717"
363>Tables of Functions</A
364></DT
365></DL
366></DD
367><DT
368>11. <A
369HREF="#AEN768"
370>Vehicles</A
371></DT
372><DD
373><DL
374><DT
375>11.1. <A
376HREF="#AEN790"
377>Overview</A
378></DT
379><DT
380>11.2. <A
381HREF="#AEN801"
382>Warnings</A
383></DT
384><DT
385>11.3. <A
386HREF="#AEN815"
387>Definitions</A
388></DT
389><DT
390>11.4. <A
391HREF="#AEN826"
392>Setting the Vehicle Type</A
393></DT
394><DT
395>11.5. <A
396HREF="#AEN837"
397>Linear and Angular Deflection</A
398></DT
399><DT
400>11.6. <A
401HREF="#AEN853"
402>Moving and Steering the Vehicle</A
403></DT
404><DT
405>11.7. <A
406HREF="#AEN866"
407>The Linear Motor</A
408></DT
409><DT
410>11.8. <A
411HREF="#AEN898"
412>The Angular Motor</A
413></DT
414><DT
415>11.9. <A
416HREF="#AEN921"
417>Using the Camera to Steer</A
418></DT
419><DT
420>11.10. <A
421HREF="#AEN938"
422>The Vertical Attractor</A
423></DT
424><DT
425>11.11. <A
426HREF="#AEN949"
427>Banking</A
428></DT
429><DT
430>11.12. <A
431HREF="#AEN956"
432>Friction Timescales</A
433></DT
434><DT
435>11.13. <A
436HREF="#AEN972"
437>Buoyancy</A
438></DT
439><DT
440>11.14. <A
441HREF="#AEN979"
442>Hover</A
443></DT
444><DT
445>11.15. <A
446HREF="#AEN990"
447>Reference Frame</A
448></DT
449></DL
450></DD
451><DT
452>A. <A
453HREF="#AEN999"
454>Linden Library Functions</A
455></DT
456><DD
457><DL
458><DT
459>A.1. <A
460HREF="#AEN1002"
461>llAbs</A
462></DT
463><DT
464>A.2. <A
465HREF="#AEN1012"
466>llAcos</A
467></DT
468><DT
469>A.3. <A
470HREF="#AEN1022"
471>llAddToLandPassList</A
472></DT
473><DT
474>A.4. <A
475HREF="#AEN1035"
476>llAdjustSoundVolume</A
477></DT
478><DT
479>A.5. <A
480HREF="#AEN1047"
481>llAllowInventoryDrop</A
482></DT
483><DT
484>A.6. <A
485HREF="#AEN1057"
486>llAngleBetween</A
487></DT
488><DT
489>A.7. <A
490HREF="#AEN1070"
491>llApplyImpulse</A
492></DT
493><DT
494>A.8. <A
495HREF="#AEN1083"
496>llApplyRotationalImpulse</A
497></DT
498><DT
499>A.9. <A
500HREF="#AEN1096"
501>llAsin</A
502></DT
503><DT
504>A.10. <A
505HREF="#AEN1106"
506>llAtan2</A
507></DT
508><DT
509>A.11. <A
510HREF="#AEN1119"
511>llAttachToAvatar</A
512></DT
513><DT
514>A.12. <A
515HREF="#AEN1134"
516>llAvatarOnSitTarget</A
517></DT
518><DT
519>A.13. <A
520HREF="#AEN1144"
521>llAxes2Rot</A
522></DT
523><DT
524>A.14. <A
525HREF="#AEN1160"
526>llAxisAngle2Rot</A
527></DT
528><DT
529>A.15. <A
530HREF="#AEN1173"
531>llBase64ToString</A
532></DT
533><DT
534>A.16. <A
535HREF="#AEN1182"
536>llBreakAllLinks</A
537></DT
538><DT
539>A.17. <A
540HREF="#AEN1191"
541>llBreakLink</A
542></DT
543><DT
544>A.18. <A
545HREF="#AEN1202"
546>llCSV2List</A
547></DT
548><DT
549>A.19. <A
550HREF="#AEN1212"
551>llCeil</A
552></DT
553><DT
554>A.20. <A
555HREF="#AEN1222"
556>llCloseRemoteDataChannel</A
557></DT
558><DT
559>A.21. <A
560HREF="#AEN1231"
561>llCloud</A
562></DT
563><DT
564>A.22. <A
565HREF="#AEN1241"
566>llCollisionFilter</A
567></DT
568><DT
569>A.23. <A
570HREF="#AEN1260"
571>llCollisionSound</A
572></DT
573><DT
574>A.24. <A
575HREF="#AEN1272"
576>llCollisionSprite</A
577></DT
578><DT
579>A.25. <A
580HREF="#AEN1282"
581>llCos</A
582></DT
583><DT
584>A.26. <A
585HREF="#AEN1292"
586>llCreateLink</A
587></DT
588><DT
589>A.27. <A
590HREF="#AEN1306"
591>llDeleteSubList</A
592></DT
593><DT
594>A.28. <A
595HREF="#AEN1326"
596>llDeleteSubString</A
597></DT
598><DT
599>A.29. <A
600HREF="#AEN1345"
601>llDetachFromAvatar</A
602></DT
603><DT
604>A.30. <A
605HREF="#lib_lldetected"
606>llDetectedGrab</A
607></DT
608><DT
609>A.31. <A
610HREF="#AEN1365"
611>llDetectedGroup</A
612></DT
613><DT
614>A.32. <A
615HREF="#AEN1375"
616>llDetectedKey</A
617></DT
618><DT
619>A.33. <A
620HREF="#AEN1386"
621>llDetectedLinkNumber</A
622></DT
623><DT
624>A.34. <A
625HREF="#AEN1395"
626>llDetectedName</A
627></DT
628><DT
629>A.35. <A
630HREF="#AEN1406"
631>llDetectedOwner</A
632></DT
633><DT
634>A.36. <A
635HREF="#AEN1417"
636>llDetectedPos</A
637></DT
638><DT
639>A.37. <A
640HREF="#AEN1428"
641>llDetectedRot</A
642></DT
643><DT
644>A.38. <A
645HREF="#AEN1439"
646>llDetectedType</A
647></DT
648><DT
649>A.39. <A
650HREF="#AEN1453"
651>llDetectedVel</A
652></DT
653><DT
654>A.40. <A
655HREF="#AEN1464"
656>llDialog</A
657></DT
658><DT
659>A.41. <A
660HREF="#AEN1481"
661>llDie</A
662></DT
663><DT
664>A.42. <A
665HREF="#AEN1489"
666>llDumpList2String</A
667></DT
668><DT
669>A.43. <A
670HREF="#AEN1500"
671>llEscapeURL</A
672></DT
673><DT
674>A.44. <A
675HREF="#AEN1510"
676>llEdgeOfWorld</A
677></DT
678><DT
679>A.45. <A
680HREF="#AEN1523"
681>llEjectFromLand</A
682></DT
683><DT
684>A.46. <A
685HREF="#AEN1533"
686>llEmail</A
687></DT
688><DT
689>A.47. <A
690HREF="#AEN1549"
691>llEuler2Rot</A
692></DT
693><DT
694>A.48. <A
695HREF="#AEN1559"
696>llFabs</A
697></DT
698><DT
699>A.49. <A
700HREF="#AEN1569"
701>llFloor</A
702></DT
703><DT
704>A.50. <A
705HREF="#AEN1579"
706>llFrand</A
707></DT
708><DT
709>A.51. <A
710HREF="#AEN1589"
711>llGetAccel</A
712></DT
713><DT
714>A.52. <A
715HREF="#AEN1597"
716>llGetAttached</A
717></DT
718><DT
719>A.53. <A
720HREF="#AEN1605"
721>llGetAgentInfo</A
722></DT
723><DT
724>A.54. <A
725HREF="#AEN1616"
726>llGetAgentSize</A
727></DT
728><DT
729>A.55. <A
730HREF="#AEN1626"
731>llGetAlpha</A
732></DT
733><DT
734>A.56. <A
735HREF="#AEN1638"
736>llGetAndResetTime</A
737></DT
738><DT
739>A.57. <A
740HREF="#AEN1648"
741>llGetAnimation</A
742></DT
743><DT
744>A.58. <A
745HREF="#AEN1658"
746>llGetAnimationList</A
747></DT
748><DT
749>A.59. <A
750HREF="#AEN1668"
751>llGetBoundingBox</A
752></DT
753><DT
754>A.60. <A
755HREF="#AEN1678"
756>llGetCenterOfMass</A
757></DT
758><DT
759>A.61. <A
760HREF="#AEN1686"
761>llGetColor</A
762></DT
763><DT
764>A.62. <A
765HREF="#AEN1698"
766>llGetCreator</A
767></DT
768><DT
769>A.63. <A
770HREF="#AEN1706"
771>llGetDate</A
772></DT
773><DT
774>A.64. <A
775HREF="#AEN1714"
776>llGetEnergy</A
777></DT
778><DT
779>A.65. <A
780HREF="#AEN1722"
781>llGetForce</A
782></DT
783><DT
784>A.66. <A
785HREF="#AEN1730"
786>llGetFreeMemory</A
787></DT
788><DT
789>A.67. <A
790HREF="#AEN1738"
791>llGetGeometricCenter</A
792></DT
793><DT
794>A.68. <A
795HREF="#AEN1746"
796>llGetGMTclock</A
797></DT
798><DT
799>A.69. <A
800HREF="#AEN1754"
801>llGetInventoryCreator</A
802></DT
803><DT
804>A.70. <A
805HREF="#AEN1764"
806>llGetInventoryKey</A
807></DT
808><DT
809>A.71. <A
810HREF="#AEN1774"
811>llGetInventoryName</A
812></DT
813><DT
814>A.72. <A
815HREF="#AEN1789"
816>llGetInventoryNumber</A
817></DT
818><DT
819>A.73. <A
820HREF="#AEN1801"
821>llGetInventoryPermMask</A
822></DT
823><DT
824>A.74. <A
825HREF="#AEN1816"
826>llGetInventoryType</A
827></DT
828><DT
829>A.75. <A
830HREF="#AEN1828"
831>llGetKey</A
832></DT
833><DT
834>A.76. <A
835HREF="#AEN1836"
836>llGetLandOwnerAt</A
837></DT
838><DT
839>A.77. <A
840HREF="#AEN1847"
841>llGetLinkKey</A
842></DT
843><DT
844>A.78. <A
845HREF="#AEN1857"
846>llGetLinkName</A
847></DT
848><DT
849>A.79. <A
850HREF="#AEN1867"
851>llGetLinkNumber</A
852></DT
853><DT
854>A.80. <A
855HREF="#AEN1875"
856>llGetListEntryType</A
857></DT
858><DT
859>A.81. <A
860HREF="#AEN1889"
861>llGetListLength</A
862></DT
863><DT
864>A.82. <A
865HREF="#AEN1899"
866>llGetLocalPos</A
867></DT
868><DT
869>A.83. <A
870HREF="#AEN1907"
871>llGetLocalRot</A
872></DT
873><DT
874>A.84. <A
875HREF="#AEN1915"
876>llGetMass</A
877></DT
878><DT
879>A.85. <A
880HREF="#AEN1923"
881>llGetObjectMass</A
882></DT
883><DT
884>A.86. <A
885HREF="#AEN1933"
886>llGetNextEmail</A
887></DT
888><DT
889>A.87. <A
890HREF="#AEN1946"
891>llGetNotecardLine</A
892></DT
893><DT
894>A.88. <A
895HREF="#AEN1964"
896>llGetNumberOfNotecardLines</A
897></DT
898><DT
899>A.89. <A
900HREF="#AEN1977"
901>llGetNumberOfPrims</A
902></DT
903><DT
904>A.90. <A
905HREF="#AEN1985"
906>llGetNumberOfSides</A
907></DT
908><DT
909>A.91. <A
910HREF="#AEN1993"
911>llGetObjectDesc</A
912></DT
913><DT
914>A.92. <A
915HREF="#AEN2001"
916>llGetObjectName</A
917></DT
918><DT
919>A.93. <A
920HREF="#AEN2009"
921>llGetObjectPermMask</A
922></DT
923><DT
924>A.94. <A
925HREF="#AEN2022"
926>llGetOmega</A
927></DT
928><DT
929>A.95. <A
930HREF="#AEN2030"
931>llGetOwner</A
932></DT
933><DT
934>A.96. <A
935HREF="#AEN2038"
936>llGetOwnerKey</A
937></DT
938><DT
939>A.97. <A
940HREF="#AEN2048"
941>llGetPermissions</A
942></DT
943><DT
944>A.98. <A
945HREF="#AEN2058"
946>llGetPermissionsKey</A
947></DT
948><DT
949>A.99. <A
950HREF="#AEN2067"
951>llGetPos</A
952></DT
953><DT
954>A.100. <A
955HREF="#AEN2075"
956>llGetPrimitiveParams</A
957></DT
958><DT
959>A.101. <A
960HREF="#AEN2092"
961>llGetRegionCorner</A
962></DT
963><DT
964>A.102. <A
965HREF="#AEN2100"
966>llGetRegionFPS</A
967></DT
968><DT
969>A.103. <A
970HREF="#AEN2108"
971>llGetRegionName</A
972></DT
973><DT
974>A.104. <A
975HREF="#AEN2116"
976>llGetRegionTimeDilation</A
977></DT
978><DT
979>A.105. <A
980HREF="#AEN2124"
981>llGetRootPosition</A
982></DT
983><DT
984>A.106. <A
985HREF="#AEN2132"
986>llGetRootRotation</A
987></DT
988><DT
989>A.107. <A
990HREF="#AEN2140"
991>llGetRot</A
992></DT
993><DT
994>A.108. <A
995HREF="#AEN2148"
996>llGetScale</A
997></DT
998><DT
999>A.109. <A
1000HREF="#AEN2156"
1001>llGetScriptName</A
1002></DT
1003><DT
1004>A.110. <A
1005HREF="#AEN2164"
1006>llGetStartParameter</A
1007></DT
1008><DT
1009>A.111. <A
1010HREF="#AEN2174"
1011>llGetScriptState</A
1012></DT
1013><DT
1014>A.112. <A
1015HREF="#AEN2184"
1016>llGetStatus</A
1017></DT
1018><DT
1019>A.113. <A
1020HREF="#AEN2195"
1021>llGetSubString</A
1022></DT
1023><DT
1024>A.114. <A
1025HREF="#AEN2214"
1026>llGetSunDirection</A
1027></DT
1028><DT
1029>A.115. <A
1030HREF="#AEN2222"
1031>llGetTexture</A
1032></DT
1033><DT
1034>A.116. <A
1035HREF="#AEN2232"
1036>llGetTextureOffset</A
1037></DT
1038><DT
1039>A.117. <A
1040HREF="#AEN2242"
1041>llGetTextureRot</A
1042></DT
1043><DT
1044>A.118. <A
1045HREF="#AEN2252"
1046>llGetTextureScale</A
1047></DT
1048><DT
1049>A.119. <A
1050HREF="#AEN2262"
1051>llGetTime</A
1052></DT
1053><DT
1054>A.120. <A
1055HREF="#AEN2273"
1056>llGetTimeOfDay</A
1057></DT
1058><DT
1059>A.121. <A
1060HREF="#AEN2281"
1061>llGetTimestamp</A
1062></DT
1063><DT
1064>A.122. <A
1065HREF="#AEN2289"
1066>llGetTorque</A
1067></DT
1068><DT
1069>A.123. <A
1070HREF="#AEN2297"
1071>llGetVel</A
1072></DT
1073><DT
1074>A.124. <A
1075HREF="#AEN2306"
1076>llGetWallclock</A
1077></DT
1078><DT
1079>A.125. <A
1080HREF="#AEN2314"
1081>llGiveInventory</A
1082></DT
1083><DT
1084>A.126. <A
1085HREF="#AEN2326"
1086>llGiveInventoryList</A
1087></DT
1088><DT
1089>A.127. <A
1090HREF="#AEN2342"
1091>llGiveMoney</A
1092></DT
1093><DT
1094>A.128. <A
1095HREF="#AEN2356"
1096>llGround</A
1097></DT
1098><DT
1099>A.129. <A
1100HREF="#AEN2366"
1101>llGroundContour</A
1102></DT
1103><DT
1104>A.130. <A
1105HREF="#AEN2376"
1106>llGroundNormal</A
1107></DT
1108><DT
1109>A.131. <A
1110HREF="#AEN2386"
1111>llGroundRepel</A
1112></DT
1113><DT
1114>A.132. <A
1115HREF="#AEN2405"
1116>llGroundSlope</A
1117></DT
1118><DT
1119>A.133. <A
1120HREF="#AEN2415"
1121>llInsertString</A
1122></DT
1123><DT
1124>A.134. <A
1125HREF="#AEN2431"
1126>llInstantMessage</A
1127></DT
1128><DT
1129>A.135. <A
1130HREF="#AEN2444"
1131>llKey2Name</A
1132></DT
1133><DT
1134>A.136. <A
1135HREF="#AEN2454"
1136>llList2CSV</A
1137></DT
1138><DT
1139>A.137. <A
1140HREF="#AEN2464"
1141>llList2Float</A
1142></DT
1143><DT
1144>A.138. <A
1145HREF="#AEN2477"
1146>llList2Integer</A
1147></DT
1148><DT
1149>A.139. <A
1150HREF="#AEN2490"
1151>llList2Key</A
1152></DT
1153><DT
1154>A.140. <A
1155HREF="#AEN2503"
1156>llList2List</A
1157></DT
1158><DT
1159>A.141. <A
1160HREF="#AEN2526"
1161>llList2ListStrided</A
1162></DT
1163><DT
1164>A.142. <A
1165HREF="#AEN2544"
1166>llList2Rot</A
1167></DT
1168><DT
1169>A.143. <A
1170HREF="#AEN2557"
1171>llList2String</A
1172></DT
1173><DT
1174>A.144. <A
1175HREF="#AEN2570"
1176>llList2Vector</A
1177></DT
1178><DT
1179>A.145. <A
1180HREF="#AEN2583"
1181>llListFindList</A
1182></DT
1183><DT
1184>A.146. <A
1185HREF="#AEN2598"
1186>llListInsertList</A
1187></DT
1188><DT
1189>A.147. <A
1190HREF="#AEN2614"
1191>llListRandomize</A
1192></DT
1193><DT
1194>A.148. <A
1195HREF="#AEN2629"
1196>llListReplaceList</A
1197></DT
1198><DT
1199>A.149. <A
1200HREF="#AEN2648"
1201>llListSort</A
1202></DT
1203><DT
1204>A.150. <A
1205HREF="#AEN2665"
1206>llListen</A
1207></DT
1208><DT
1209>A.151. <A
1210HREF="#AEN2686"
1211>llListenControl</A
1212></DT
1213><DT
1214>A.152. <A
1215HREF="#AEN2701"
1216>llListenRemove</A
1217></DT
1218><DT
1219>A.153. <A
1220HREF="#AEN2712"
1221>llLoadURL</A
1222></DT
1223><DT
1224>A.154. <A
1225HREF="#AEN2731"
1226>llLog</A
1227></DT
1228><DT
1229>A.155. <A
1230HREF="#AEN2742"
1231>llLog10</A
1232></DT
1233><DT
1234>A.156. <A
1235HREF="#AEN2753"
1236>llLookAt</A
1237></DT
1238><DT
1239>A.157. <A
1240HREF="#AEN2773"
1241>llLoopSound</A
1242></DT
1243><DT
1244>A.158. <A
1245HREF="#AEN2790"
1246>llLoopSoundMaster</A
1247></DT
1248><DT
1249>A.159. <A
1250HREF="#AEN2802"
1251>llLoopSoundSlave</A
1252></DT
1253><DT
1254>A.160. <A
1255HREF="#AEN2814"
1256>llMakeExplosion</A
1257></DT
1258><DT
1259>A.161. <A
1260HREF="#AEN2836"
1261>llMakeFire</A
1262></DT
1263><DT
1264>A.162. <A
1265HREF="#AEN2858"
1266>llMakeFountain</A
1267></DT
1268><DT
1269>A.163. <A
1270HREF="#AEN2880"
1271>llMakeSmoke</A
1272></DT
1273><DT
1274>A.164. <A
1275HREF="#AEN2902"
1276>llMD5String</A
1277></DT
1278><DT
1279>A.165. <A
1280HREF="#AEN2919"
1281>llMessageLinked</A
1282></DT
1283><DT
1284>A.166. <A
1285HREF="#AEN2940"
1286>llMinEventDelay</A
1287></DT
1288><DT
1289>A.167. <A
1290HREF="#AEN2949"
1291>llModifyLand</A
1292></DT
1293><DT
1294>A.168. <A
1295HREF="#AEN2963"
1296>llModPow</A
1297></DT
1298><DT
1299>A.169. <A
1300HREF="#AEN2980"
1301>llMoveToTarget</A
1302></DT
1303><DT
1304>A.170. <A
1305HREF="#AEN2995"
1306>llOffsetTexture</A
1307></DT
1308><DT
1309>A.171. <A
1310HREF="#AEN3011"
1311>llOpenRemoteDataChannel</A
1312></DT
1313><DT
1314>A.172. <A
1315HREF="#AEN3019"
1316>llOverMyLand</A
1317></DT
1318><DT
1319>A.173. <A
1320HREF="#AEN3031"
1321>llParcelMediaCommandList</A
1322></DT
1323><DT
1324>A.174. <A
1325HREF="#AEN3091"
1326>llParcelMediaQuery</A
1327></DT
1328><DT
1329>A.175. <A
1330HREF="#AEN3105"
1331>llParseString2List</A
1332></DT
1333><DT
1334>A.176. <A
1335HREF="#AEN3127"
1336>llParseStringKeepNulls</A
1337></DT
1338><DT
1339>A.177. <A
1340HREF="#AEN3149"
1341>llParticleSystem</A
1342></DT
1343><DT
1344>A.178. <A
1345HREF="#AEN3162"
1346>llPassCollisions</A
1347></DT
1348><DT
1349>A.179. <A
1350HREF="#AEN3173"
1351>llPassTouches</A
1352></DT
1353><DT
1354>A.180. <A
1355HREF="#AEN3184"
1356>llPlaySound</A
1357></DT
1358><DT
1359>A.181. <A
1360HREF="#AEN3198"
1361>llPlaySoundSlave</A
1362></DT
1363><DT
1364>A.182. <A
1365HREF="#AEN3210"
1366>llPointAt</A
1367></DT
1368><DT
1369>A.183. <A
1370HREF="#AEN3220"
1371>llPow</A
1372></DT
1373><DT
1374>A.184. <A
1375HREF="#AEN3233"
1376>llPreloadSound</A
1377></DT
1378><DT
1379>A.185. <A
1380HREF="#AEN3243"
1381>llPushObject</A
1382></DT
1383><DT
1384>A.186. <A
1385HREF="#AEN3261"
1386>llReleaseControls</A
1387></DT
1388><DT
1389>A.187. <A
1390HREF="#AEN3271"
1391>llRemoteDataReply</A
1392></DT
1393><DT
1394>A.188. <A
1395HREF="#AEN3284"
1396>llRemoteDataSetRegion</A
1397></DT
1398><DT
1399>A.189. <A
1400HREF="#AEN3292"
1401>llRemoteLoadScript</A
1402></DT
1403><DT
1404>A.190. <A
1405HREF="#AEN3300"
1406>llRemoteLoadScriptPin</A
1407></DT
1408><DT
1409>A.191. <A
1410HREF="#AEN3325"
1411>llRemoveInventory</A
1412></DT
1413><DT
1414>A.192. <A
1415HREF="#AEN3335"
1416>llRemoveVehicleFlags</A
1417></DT
1418><DT
1419>A.193. <A
1420HREF="#AEN3346"
1421>llRequestAgentData</A
1422></DT
1423><DT
1424>A.194. <A
1425HREF="#AEN3363"
1426>llRequestInventoryData</A
1427></DT
1428><DT
1429>A.195. <A
1430HREF="#AEN3375"
1431>llRequestPermissions</A
1432></DT
1433><DT
1434>A.196. <A
1435HREF="#AEN3391"
1436>llRequestSimulatorData</A
1437></DT
1438><DT
1439>A.197. <A
1440HREF="#AEN3408"
1441>llResetScript</A
1442></DT
1443><DT
1444>A.198. <A
1445HREF="#AEN3416"
1446>llResetOtherScript</A
1447></DT
1448><DT
1449>A.199. <A
1450HREF="#AEN3426"
1451>llResetTime</A
1452></DT
1453><DT
1454>A.200. <A
1455HREF="#AEN3434"
1456>llRezAtRoot</A
1457></DT
1458><DT
1459>A.201. <A
1460HREF="#AEN3461"
1461>llRezObject</A
1462></DT
1463><DT
1464>A.202. <A
1465HREF="#AEN3486"
1466>llRot2Angle</A
1467></DT
1468><DT
1469>A.203. <A
1470HREF="#AEN3496"
1471>llRot2Axis</A
1472></DT
1473><DT
1474>A.204. <A
1475HREF="#AEN3506"
1476>llRot2Euler</A
1477></DT
1478><DT
1479>A.205. <A
1480HREF="#AEN3516"
1481>llRot2Fwd</A
1482></DT
1483><DT
1484>A.206. <A
1485HREF="#AEN3526"
1486>llRot2Left</A
1487></DT
1488><DT
1489>A.207. <A
1490HREF="#AEN3536"
1491>llRot2Up</A
1492></DT
1493><DT
1494>A.208. <A
1495HREF="#AEN3546"
1496>llRotBetween</A
1497></DT
1498><DT
1499>A.209. <A
1500HREF="#AEN3559"
1501>llRotLookAt</A
1502></DT
1503><DT
1504>A.210. <A
1505HREF="#AEN3579"
1506>llRotTarget</A
1507></DT
1508><DT
1509>A.211. <A
1510HREF="#AEN3593"
1511>llRotTargetRemove</A
1512></DT
1513><DT
1514>A.212. <A
1515HREF="#AEN3603"
1516>llRotateTexture</A
1517></DT
1518><DT
1519>A.213. <A
1520HREF="#AEN3618"
1521>llRound</A
1522></DT
1523><DT
1524>A.214. <A
1525HREF="#AEN3628"
1526>llSameGroup</A
1527></DT
1528><DT
1529>A.215. <A
1530HREF="#AEN3640"
1531>llSay</A
1532></DT
1533><DT
1534>A.216. <A
1535HREF="#AEN3654"
1536>llScaleTexture</A
1537></DT
1538><DT
1539>A.217. <A
1540HREF="#AEN3671"
1541>llScriptDanger</A
1542></DT
1543><DT
1544>A.218. <A
1545HREF="#AEN3680"
1546>llSendRemoteData</A
1547></DT
1548><DT
1549>A.219. <A
1550HREF="#AEN3693"
1551>llSensor</A
1552></DT
1553><DT
1554>A.220. <A
1555HREF="#AEN3720"
1556>llSensorRemove</A
1557></DT
1558><DT
1559>A.221. <A
1560HREF="#AEN3728"
1561>llSensorRepeat</A
1562></DT
1563><DT
1564>A.222. <A
1565HREF="#AEN3758"
1566>llSetAlpha</A
1567></DT
1568><DT
1569>A.223. <A
1570HREF="#AEN3773"
1571>llSetBuoyancy</A
1572></DT
1573><DT
1574>A.224. <A
1575HREF="#AEN3782"
1576>llSetCameraAtOffset</A
1577></DT
1578><DT
1579>A.225. <A
1580HREF="#AEN3791"
1581>llSetClickAction</A
1582></DT
1583><DT
1584>A.226. <A
1585HREF="#AEN3800"
1586>llForceMouselook</A
1587></DT
1588><DT
1589>A.227. <A
1590HREF="#AEN3809"
1591>llSetCameraEyeOffset</A
1592></DT
1593><DT
1594>A.228. <A
1595HREF="#AEN3818"
1596>llSetColor</A
1597></DT
1598><DT
1599>A.229. <A
1600HREF="#AEN3832"
1601>llSetDamage</A
1602></DT
1603><DT
1604>A.230. <A
1605HREF="#AEN3841"
1606>llSetForce</A
1607></DT
1608><DT
1609>A.231. <A
1610HREF="#AEN3855"
1611>llSetForceAndTorque</A
1612></DT
1613><DT
1614>A.232. <A
1615HREF="#AEN3872"
1616>llSetHoverHeight</A
1617></DT
1618><DT
1619>A.233. <A
1620HREF="#AEN3887"
1621>llSetLinkAlpha</A
1622></DT
1623><DT
1624>A.234. <A
1625HREF="#AEN3906"
1626>llSetLinkColor</A
1627></DT
1628><DT
1629>A.235. <A
1630HREF="#AEN3925"
1631>llSetLinkPrimitiveParams</A
1632></DT
1633><DT
1634>A.236. <A
1635HREF="#AEN3941"
1636>llSetLinkTexture</A
1637></DT
1638><DT
1639>A.237. <A
1640HREF="#AEN3960"
1641>llSetLocalRot</A
1642></DT
1643><DT
1644>A.238. <A
1645HREF="#AEN3969"
1646>llSetObjectDesc</A
1647></DT
1648><DT
1649>A.239. <A
1650HREF="#AEN3979"
1651>llSetObjectName</A
1652></DT
1653><DT
1654>A.240. <A
1655HREF="#AEN3989"
1656>llSetParcelMusicURL</A
1657></DT
1658><DT
1659>A.241. <A
1660HREF="#AEN3999"
1661>llSetPayPrice</A
1662></DT
1663><DT
1664>A.242. <A
1665HREF="#AEN4011"
1666>llSetPos</A
1667></DT
1668><DT
1669>A.243. <A
1670HREF="#AEN4020"
1671>llSetPrimitiveParams</A
1672></DT
1673><DT
1674>A.244. <A
1675HREF="#AEN4034"
1676>llSetRemoteScriptAccessPin</A
1677></DT
1678><DT
1679>A.245. <A
1680HREF="#AEN4043"
1681>llSetRot</A
1682></DT
1683><DT
1684>A.246. <A
1685HREF="#AEN4052"
1686>llSetScale</A
1687></DT
1688><DT
1689>A.247. <A
1690HREF="#AEN4061"
1691>llSetScriptState</A
1692></DT
1693><DT
1694>A.248. <A
1695HREF="#AEN4072"
1696>llSetSitText</A
1697></DT
1698><DT
1699>A.249. <A
1700HREF="#AEN4082"
1701>llSetSoundQueueing</A
1702></DT
1703><DT
1704>A.250. <A
1705HREF="#AEN4095"
1706>llSetStatus</A
1707></DT
1708><DT
1709>A.251. <A
1710HREF="#AEN4110"
1711>llSetText</A
1712></DT
1713><DT
1714>A.252. <A
1715HREF="#AEN4126"
1716>llSetTexture</A
1717></DT
1718><DT
1719>A.253. <A
1720HREF="#AEN4140"
1721>llSetTextureAnim</A
1722></DT
1723><DT
1724>A.254. <A
1725HREF="#AEN4188"
1726>llSetTimerEvent</A
1727></DT
1728><DT
1729>A.255. <A
1730HREF="#AEN4200"
1731>llSetTorque</A
1732></DT
1733><DT
1734>A.256. <A
1735HREF="#AEN4214"
1736>llSetTouchText</A
1737></DT
1738><DT
1739>A.257. <A
1740HREF="#AEN4224"
1741>llSetVehicleFlags</A
1742></DT
1743><DT
1744>A.258. <A
1745HREF="#AEN4235"
1746>llSetVehicleFloatParam</A
1747></DT
1748><DT
1749>A.259. <A
1750HREF="#AEN4249"
1751>llSetVehicleType</A
1752></DT
1753><DT
1754>A.260. <A
1755HREF="#AEN4260"
1756>llSetVehicleRotationParam</A
1757></DT
1758><DT
1759>A.261. <A
1760HREF="#AEN4274"
1761>llSetVehicleVectorParam</A
1762></DT
1763><DT
1764>A.262. <A
1765HREF="#AEN4288"
1766>llShout</A
1767></DT
1768><DT
1769>A.263. <A
1770HREF="#AEN4302"
1771>llSin</A
1772></DT
1773><DT
1774>A.264. <A
1775HREF="#AEN4312"
1776>llSitTarget</A
1777></DT
1778><DT
1779>A.265. <A
1780HREF="#AEN4325"
1781>llSleep</A
1782></DT
1783><DT
1784>A.266. <A
1785HREF="#AEN4335"
1786>llSqrt</A
1787></DT
1788><DT
1789>A.267. <A
1790HREF="#AEN4346"
1791>llStartAnimation</A
1792></DT
1793><DT
1794>A.268. <A
1795HREF="#AEN4578"
1796>llStopAnimation</A
1797></DT
1798><DT
1799>A.269. <A
1800HREF="#AEN4588"
1801>llStopHover</A
1802></DT
1803><DT
1804>A.270. <A
1805HREF="#AEN4596"
1806>llStopLookAt</A
1807></DT
1808><DT
1809>A.271. <A
1810HREF="#AEN4604"
1811>llStopMoveToTarget</A
1812></DT
1813><DT
1814>A.272. <A
1815HREF="#AEN4612"
1816>llStopPointAt</A
1817></DT
1818><DT
1819>A.273. <A
1820HREF="#AEN4620"
1821>llStopSound</A
1822></DT
1823><DT
1824>A.274. <A
1825HREF="#AEN4631"
1826>llStringLength</A
1827></DT
1828><DT
1829>A.275. <A
1830HREF="#AEN4641"
1831>llSubStringIndex</A
1832></DT
1833><DT
1834>A.276. <A
1835HREF="#AEN4652"
1836>llStringToBase64</A
1837></DT
1838><DT
1839>A.277. <A
1840HREF="#AEN4661"
1841>llTakeControls</A
1842></DT
1843><DT
1844>A.278. <A
1845HREF="#AEN4678"
1846>llTan</A
1847></DT
1848><DT
1849>A.279. <A
1850HREF="#AEN4688"
1851>llTarget</A
1852></DT
1853><DT
1854>A.280. <A
1855HREF="#AEN4701"
1856>llTargetOmega</A
1857></DT
1858><DT
1859>A.281. <A
1860HREF="#AEN4718"
1861>llTargetRemove</A
1862></DT
1863><DT
1864>A.282. <A
1865HREF="#AEN4728"
1866>llTeleportAgentHome</A
1867></DT
1868><DT
1869>A.283. <A
1870HREF="#AEN4737"
1871>llToLower</A
1872></DT
1873><DT
1874>A.284. <A
1875HREF="#AEN4746"
1876>llToUpper</A
1877></DT
1878><DT
1879>A.285. <A
1880HREF="#AEN4756"
1881>llTriggerSound</A
1882></DT
1883><DT
1884>A.286. <A
1885HREF="#AEN4770"
1886>llTriggerSoundLimited</A
1887></DT
1888><DT
1889>A.287. <A
1890HREF="#AEN4790"
1891>llUnescapeURL</A
1892></DT
1893><DT
1894>A.288. <A
1895HREF="#AEN4800"
1896>llUnSit</A
1897></DT
1898><DT
1899>A.289. <A
1900HREF="#AEN4810"
1901>llVecDist</A
1902></DT
1903><DT
1904>A.290. <A
1905HREF="#AEN4823"
1906>llVecMag</A
1907></DT
1908><DT
1909>A.291. <A
1910HREF="#AEN4833"
1911>llVecNorm</A
1912></DT
1913><DT
1914>A.292. <A
1915HREF="#AEN4843"
1916>llVolumeDetect</A
1917></DT
1918><DT
1919>A.293. <A
1920HREF="#AEN4852"
1921>llWater</A
1922></DT
1923><DT
1924>A.294. <A
1925HREF="#AEN4862"
1926>llWhisper</A
1927></DT
1928><DT
1929>A.295. <A
1930HREF="#AEN4876"
1931>llWind</A
1932></DT
1933><DT
1934>A.296. <A
1935HREF="#AEN4886"
1936>llXorBase64Strings</A
1937></DT
1938></DL
1939></DD
1940><DT
1941>B. <A
1942HREF="#AEN4899"
1943>Events</A
1944></DT
1945><DD
1946><DL
1947><DT
1948>B.1. <A
1949HREF="#AEN4902"
1950>at_rot_target</A
1951></DT
1952><DT
1953>B.2. <A
1954HREF="#AEN4916"
1955>at_target</A
1956></DT
1957><DT
1958>B.3. <A
1959HREF="#AEN4930"
1960>attach</A
1961></DT
1962><DT
1963>B.4. <A
1964HREF="#AEN4940"
1965>changed</A
1966></DT
1967><DT
1968>B.5. <A
1969HREF="#AEN4951"
1970>collision</A
1971></DT
1972><DT
1973>B.6. <A
1974HREF="#AEN4961"
1975>collision_end</A
1976></DT
1977><DT
1978>B.7. <A
1979HREF="#AEN4971"
1980>collision_start</A
1981></DT
1982><DT
1983>B.8. <A
1984HREF="#AEN4981"
1985>control</A
1986></DT
1987><DT
1988>B.9. <A
1989HREF="#AEN4997"
1990>dataserver</A
1991></DT
1992><DT
1993>B.10. <A
1994HREF="#AEN5012"
1995>email</A
1996></DT
1997><DT
1998>B.11. <A
1999HREF="#AEN5030"
2000>land_collision</A
2001></DT
2002><DT
2003>B.12. <A
2004HREF="#AEN5039"
2005>land_collision_end</A
2006></DT
2007><DT
2008>B.13. <A
2009HREF="#AEN5048"
2010>land_collision_start</A
2011></DT
2012><DT
2013>B.14. <A
2014HREF="#AEN5057"
2015>link_message</A
2016></DT
2017><DT
2018>B.15. <A
2019HREF="#AEN5073"
2020>listen</A
2021></DT
2022><DT
2023>B.16. <A
2024HREF="#AEN5092"
2025>money</A
2026></DT
2027><DT
2028>B.17. <A
2029HREF="#AEN5105"
2030>moving_end</A
2031></DT
2032><DT
2033>B.18. <A
2034HREF="#AEN5113"
2035>moving_start</A
2036></DT
2037><DT
2038>B.19. <A
2039HREF="#AEN5121"
2040>no_sensor</A
2041></DT
2042><DT
2043>B.20. <A
2044HREF="#AEN5130"
2045>not_at_rot_target</A
2046></DT
2047><DT
2048>B.21. <A
2049HREF="#AEN5139"
2050>not_at_target</A
2051></DT
2052><DT
2053>B.22. <A
2054HREF="#AEN5148"
2055>object_rez</A
2056></DT
2057><DT
2058>B.23. <A
2059HREF="#AEN5159"
2060>on_rez</A
2061></DT
2062><DT
2063>B.24. <A
2064HREF="#AEN5171"
2065>run_time_permissions</A
2066></DT
2067><DT
2068>B.25. <A
2069HREF="#AEN5183"
2070>sensor</A
2071></DT
2072><DT
2073>B.26. <A
2074HREF="#AEN5195"
2075>state_entry</A
2076></DT
2077><DT
2078>B.27. <A
2079HREF="#AEN5203"
2080>state_exit</A
2081></DT
2082><DT
2083>B.28. <A
2084HREF="#AEN5211"
2085>timer</A
2086></DT
2087><DT
2088>B.29. <A
2089HREF="#AEN5220"
2090>touch</A
2091></DT
2092><DT
2093>B.30. <A
2094HREF="#AEN5231"
2095>touch_end</A
2096></DT
2097><DT
2098>B.31. <A
2099HREF="#AEN5242"
2100>touch_start</A
2101></DT
2102><DT
2103>B.32. <A
2104HREF="#AEN5253"
2105>remote_data</A
2106></DT
2107></DL
2108></DD
2109><DT
2110>C. <A
2111HREF="#AEN5292"
2112>Constants</A
2113></DT
2114><DD
2115><DL
2116><DT
2117>C.1. <A
2118HREF="#AEN5295"
2119>Boolean Constants</A
2120></DT
2121><DT
2122>C.2. <A
2123HREF="#AEN5304"
2124>Status Constants</A
2125></DT
2126><DT
2127>C.3. <A
2128HREF="#AEN5338"
2129>Object Type Constants</A
2130></DT
2131><DT
2132>C.4. <A
2133HREF="#AEN5360"
2134>Permission Constants</A
2135></DT
2136><DT
2137>C.5. <A
2138HREF="#AEN5411"
2139>Inventory Constants</A
2140></DT
2141><DT
2142>C.6. <A
2143HREF="#AEN5434"
2144>Pay Price Constants</A
2145></DT
2146><DT
2147>C.7. <A
2148HREF="#AEN5448"
2149>Attachment Constants</A
2150></DT
2151><DT
2152>C.8. <A
2153HREF="#AEN5574"
2154>Land Constants</A
2155></DT
2156><DT
2157>C.9. <A
2158HREF="#AEN5616"
2159>Link Constants</A
2160></DT
2161><DT
2162>C.10. <A
2163HREF="#AEN5643"
2164>Control Constants</A
2165></DT
2166><DT
2167>C.11. <A
2168HREF="#AEN5690"
2169>Change Constants</A
2170></DT
2171><DT
2172>C.12. <A
2173HREF="#AEN5733"
2174>Type Constants</A
2175></DT
2176><DT
2177>C.13. <A
2178HREF="#AEN5767"
2179>Agent Info Constants</A
2180></DT
2181><DT
2182>C.14. <A
2183HREF="#AEN5817"
2184>Texture Animation
2185 Constants</A
2186></DT
2187><DT
2188>C.15. <A
2189HREF="#AEN5851"
2190>Particle System Constants</A
2191></DT
2192><DT
2193>C.16. <A
2194HREF="#AEN6005"
2195>Agent Data Constants</A
2196></DT
2197><DT
2198>C.17. <A
2199HREF="#AEN6041"
2200>Float Constants</A
2201></DT
2202><DT
2203>C.18. <A
2204HREF="#AEN6070"
2205>Key Constant</A
2206></DT
2207><DT
2208>C.19. <A
2209HREF="#AEN6073"
2210>Miscellaneous Integer Constants</A
2211></DT
2212><DT
2213>C.20. <A
2214HREF="#AEN6076"
2215>Miscellaneous String
2216 Constants</A
2217></DT
2218><DT
2219>C.21. <A
2220HREF="#AEN6080"
2221>Vector Constant</A
2222></DT
2223><DT
2224>C.22. <A
2225HREF="#AEN6083"
2226>Rotation Constant</A
2227></DT
2228><DT
2229>C.23. <A
2230HREF="#AEN6086"
2231>Simulator Data Constants</A
2232></DT
2233><DT
2234>C.24. <A
2235HREF="#AEN6112"
2236>Vehicle Parameters</A
2237></DT
2238><DT
2239>C.25. <A
2240HREF="#AEN6231"
2241>Vehicle Flags</A
2242></DT
2243><DT
2244>C.26. <A
2245HREF="#AEN6288"
2246>Vehicle Types</A
2247></DT
2248><DT
2249>C.27. <A
2250HREF="#AEN6323"
2251>Primitive Constants</A
2252></DT
2253><DT
2254>C.28. <A
2255HREF="#AEN6409"
2256>XML-RPC Constants</A
2257></DT
2258><DT
2259>C.29. <A
2260HREF="#AEN6412"
2261>Permission Mask Constants</A
2262></DT
2263><DT
2264>C.30. <A
2265HREF="#AEN6459"
2266>Parcel Media Constants</A
2267></DT
2268><DT
2269>C.31. <A
2270HREF="#AEN6521"
2271>Click Action Constants</A
2272></DT
2273></DL
2274></DD
2275></DL
2276></DIV
2277><DIV
2278CLASS="LOT"
2279><DL
2280CLASS="LOT"
2281><DT
2282><B
2283>List of Tables</B
2284></DT
2285><DT
2286>3-1. <A
2287HREF="#AEN148"
2288>Binary Arithmetic Operators</A
2289></DT
2290><DT
2291>3-2. <A
2292HREF="#AEN188"
2293>Boolean Operators</A
2294></DT
2295><DT
2296>3-3. <A
2297HREF="#AEN220"
2298>Bitwise Operators</A
2299></DT
2300><DT
2301>3-4. <A
2302HREF="#AEN258"
2303>Vector Arithmetic Operators</A
2304></DT
2305><DT
2306>3-5. <A
2307HREF="#AEN282"
2308>Rotation Arithmetic Operators</A
2309></DT
2310><DT
2311>6-1. <A
2312HREF="#AEN456"
2313>Trigonometry Functions</A
2314></DT
2315><DT
2316>6-2. <A
2317HREF="#AEN505"
2318>Vector Functions</A
2319></DT
2320><DT
2321>6-3. <A
2322HREF="#AEN521"
2323>Rotation Functions</A
2324></DT
2325><DT
2326>7-1. <A
2327HREF="#AEN565"
2328>String Functions</A
2329></DT
2330><DT
2331>8-1. <A
2332HREF="#AEN609"
2333>List Functions</A
2334></DT
2335><DT
2336>9-1. <A
2337HREF="#AEN674"
2338>In World Functions</A
2339></DT
2340><DT
2341>9-2. <A
2342HREF="#AEN699"
2343>Messaging Functions</A
2344></DT
2345><DT
2346>10-1. <A
2347HREF="#AEN719"
2348>Inventory Functions</A
2349></DT
2350></DL
2351></DIV
2352><DIV
2353CLASS="chapter"
2354><HR><H1
2355><A
2356NAME="AEN27"
2357></A
2358>Chapter 1. Introduction</H1
2359><P
2360>The Linden Scripting Language (LSL) is a simple, powerful
2361 language used to attach behaviors to the objects found in Second
2362 Life. It follows the familiar syntax of a c/Java style language,
2363 with an implicit state machine for every script.</P
2364><P
2365>Multiple scripts may also be attached to the same object,
2366 allowing a style of small, single-function scripts to evolve. This
2367 leads to scripts that perform specific functions ("hover", "follow",
2368 etc.) and allows them to be combined to form new behaviors.</P
2369><P
2370>The text of the script is compiled into an executable byte
2371 code, much like Java. This byte code is then run within a virtual
2372 machine on the simulator. Each script receives a time slice of the
2373 total simulator time allocated to scripts, so a simulator with many
2374 scripts would allow each individual script less time rather than
2375 degrading its own performance. In addition, each script executes
2376 within its own chunk of memory, preventing scripts from writing into
2377 protected simulator memory or into other scripts, making it much
2378 harder for scripts to crash the simulator.</P
2379><P
2380>This tutorial introduces the reader to the basic features of
2381 LSL, how to edit and apply your scripts, and a complete reference
2382 for standard linden constants, events, and library functions.</P
2383></DIV
2384><DIV
2385CLASS="chapter"
2386><HR><H1
2387><A
2388NAME="AEN33"
2389></A
2390>Chapter 2. Getting Started</H1
2391><P
2392>You're probably wondering what you can do with LSL, and how
2393 quickly you can do it. We'll start with some simple examples, dissect
2394 them, and introduce you the script development process while
2395 we're at it.</P
2396><DIV
2397CLASS="section"
2398><HR><H2
2399CLASS="section"
2400><A
2401NAME="AEN36"
2402>2.1. Hello Avatar</A
2403></H2
2404><P
2405>Continuing a long tradition of getting started by looking at
2406 a script that says "Hello", we'll do just that. Though obviously
2407 not a particularly useful example on it's own, this example will
2408 introduce us to:</P
2409><P
2410></P
2411><UL
2412><LI
2413><P
2414>Creating a basic script</P
2415></LI
2416><LI
2417><P
2418>Script states</P
2419></LI
2420><LI
2421><P
2422>Calling functions</P
2423></LI
2424><LI
2425><P
2426>Script events</P
2427></LI
2428><LI
2429><P
2430>Applying a script to an object</P
2431></LI
2432></UL
2433><DIV
2434CLASS="section"
2435><HR><H3
2436CLASS="section"
2437><A
2438NAME="AEN50"
2439>2.1.1. Creating the Script</A
2440></H3
2441><P
2442>Start by opening your inventory and selecting 'Create|New
2443 Script' from the inventory pull down menu. This will create an
2444 empty script called 'New Script' in your 'Scripts'
2445 folder. Double click on the text or icon of the script to open
2446 the script in the built in editor. When you open the script, the
2447 viewer will automatically insert a basic skeleton for lsl. It
2448 should look like:</P
2449><P
2450><PRE
2451CLASS="programlisting"
2452>&#13;default
2453{
2454 state_entry()
2455 {
2456 llSay(0, "Hello, Avatar!");
2457 }
2458
2459 touch_start(integer total_number)
2460 {
2461 llSay(0, "Touched.");
2462 }
2463}
2464 </PRE
2465></P
2466><P
2467>A casual inspection of this script reveals that this script
2468 probably says 'Hello, Avatar!' when it enters some state, and it
2469 says 'Touched.' when it is touched. But since this is also
2470 probably the first time you have seen a script we'll dissect this
2471 short listing, explaining each segment individually.</P
2472></DIV
2473><DIV
2474CLASS="section"
2475><HR><H3
2476CLASS="section"
2477><A
2478NAME="AEN56"
2479>2.1.2. Default State</A
2480></H3
2481><P
2482><DIV
2483CLASS="informalexample"
2484><P
2485></P
2486><A
2487NAME="AEN59"
2488></A
2489><PRE
2490CLASS="programlisting"
2491>&#13;default
2492{
2493...
2494}
2495 </PRE
2496><P
2497></P
2498></DIV
2499></P
2500><P
2501>All LSL scripts have a simple implicit state machine with
2502 one or more states. All scripts must have a default state, so
2503 if there is only one state, it will be the 'default'
2504 state. When a script is first started or reset, it will start
2505 out in the default state.</P
2506><P
2507>The default state is declared by placing the default at
2508 the root level of the document, and marking the beginning with
2509 an open brace '{' and ending with a close brace '}'. Because of
2510 it's privileged status, you do not declare that it is fact a
2511 state like you normally would with other states.</P
2512><P
2513>Every time you enter a state, the script engine will
2514 automatically call the state_entry() event and execute the code
2515 found there. On state exit, the script engine will automatically
2516 call the state_exit() event before calling the next state's
2517 state_entry handler. In our example, we call the
2518 <A
2519HREF="#AEN3640"
2520>llSay()</A
2521>
2522 function in state_entry() and do not bother to define a
2523 state_exit() handler. the state entry and exit handlers are a
2524 convenient place to initialize state data and clean up state
2525 specific data such as listen event callback.</P
2526><P
2527>You can read more about the default state, and how to
2528 create and utilize other states in the <A
2529HREF="#AEN427"
2530>states chapter</A
2531>.</P
2532></DIV
2533><DIV
2534CLASS="section"
2535><HR><H3
2536CLASS="section"
2537><A
2538NAME="AEN67"
2539>2.1.3. Functions</A
2540></H3
2541><P
2542>The language comes with well over 200 <A
2543HREF="#AEN999"
2544>built in functions</A
2545> which allow scripts and
2546 objects to interact with their environment. All of the built in
2547 functions start with 'll'.</P
2548><P
2549>The example calls the <A
2550HREF="#AEN3640"
2551>llSay()</A
2552>
2553 function twice, which is used to emit text on the specified channel.
2554 </P
2555><DIV
2556CLASS="funcsynopsis"
2557><P
2558></P
2559><A
2560NAME="AEN73"
2561></A
2562><P
2563><CODE
2564><CODE
2565CLASS="FUNCDEF"
2566>llSay</CODE
2567>(
2568 integer channel
2569 string text
2570 );</CODE
2571></P
2572><P
2573></P
2574></DIV
2575><P
2576>Say text on channel. Channel 0 is the public chat channel
2577 that all avatars see as chat text. Channels 1 to 2,147,483,648
2578 are private channels that aren't sent to avatars but other
2579 scripts can listen for.</P
2580><P
2581>You can define your own functions as long as the name does
2582 not conflict with a reserved word, built in constant, or built
2583 in function.</P
2584></DIV
2585><DIV
2586CLASS="section"
2587><HR><H3
2588CLASS="section"
2589><A
2590NAME="AEN82"
2591>2.1.4. Touch Event</A
2592></H3
2593><P
2594><DIV
2595CLASS="informalexample"
2596><P
2597></P
2598><A
2599NAME="AEN85"
2600></A
2601><PRE
2602CLASS="programlisting"
2603>&#13;touch_start(integer total_number)
2604{
2605 llSay(0, "Touched.");
2606}
2607 </PRE
2608><P
2609></P
2610></DIV
2611></P
2612><P
2613>There are many <A
2614HREF="#AEN4899"
2615>events</A
2616> that can
2617 be detected in your scripts by declaring a handler. The
2618 <A
2619HREF="#AEN5242"
2620> touch_start()</A
2621>
2622 event is raised when a
2623 user touches the object through the user interface.</P
2624></DIV
2625><DIV
2626CLASS="section"
2627><HR><H3
2628CLASS="section"
2629><A
2630NAME="AEN90"
2631>2.1.5. Try it Out</A
2632></H3
2633><P
2634>Now that we have seen the default script, and examined it
2635 in some detail, it is time to see the script in action. Save
2636 the script by clicking on <SPAN
2637CLASS="guibutton"
2638>Save</SPAN
2639>. During
2640 the save process, the editor will save the text of the script
2641 and compile the script into bytecode and then save that. When
2642 you see message 'Compile successful!' in the preview window, you
2643 know the compile and save is done.</P
2644><P
2645>To test the script you will have to apply it to an object
2646 in the world. Create a new object in the world by
2647 <SPAN
2648CLASS="mousebutton"
2649>context clicking</SPAN
2650> in the main world
2651 view and selecting <SPAN
2652CLASS="guimenu"
2653>Create</SPAN
2654>. When the wand
2655 appears, you can create a simple primitive by
2656 <SPAN
2657CLASS="mousebutton"
2658>clicking</SPAN
2659> in the world. Once the
2660 object appears, you can drag your newly created script onto the
2661 object to start the script.</P
2662><P
2663>Soon after dragging the script onto the object, you will
2664 see the message <SAMP
2665CLASS="computeroutput"
2666>Object: Hello
2667 Avatar!</SAMP
2668></P
2669><P
2670>Make sure the touch event is working by
2671 <SPAN
2672CLASS="mousebutton"
2673>clicking</SPAN
2674> on the object. You should
2675 see the message <SAMP
2676CLASS="computeroutput"
2677>Touched printed into the chat
2678 history.</SAMP
2679></P
2680></DIV
2681></DIV
2682><DIV
2683CLASS="section"
2684><HR><H2
2685CLASS="section"
2686><A
2687NAME="AEN103"
2688>2.2. Using The Built-In Editor</A
2689></H2
2690><P
2691>The built in editor comes with most of the typical features
2692 you would expect from a basic text editor. Highlight text with the
2693 mouse, or by holding down the shift key while using the arrow
2694 keys. You can cut, copy, paste, and delete your selection using
2695 the 'Edit' pull down menu or by pressing the usual shortcut
2696 key.</P
2697></DIV
2698><DIV
2699CLASS="section"
2700><HR><H2
2701CLASS="section"
2702><A
2703NAME="AEN106"
2704>2.3. Using Alternative Editors</A
2705></H2
2706><P
2707>Since the built-in editor supports pasting text from the
2708 clipboard, you can employ a different editor to edit your scripts,
2709 copying them into Second Life when you're ready to save them.</P
2710></DIV
2711></DIV
2712><DIV
2713CLASS="chapter"
2714><HR><H1
2715><A
2716NAME="AEN109"
2717></A
2718>Chapter 3. Basics</H1
2719><P
2720>Now that we have seen a very simple script in action, we need
2721 to look at the our toolchest for writing scripts. The next set of
2722 tools we will consider are the basic building blocks for programming
2723 a script, and will be used in every non-trivial script you write.</P
2724><DIV
2725CLASS="section"
2726><HR><H2
2727CLASS="section"
2728><A
2729NAME="AEN112"
2730>3.1. Comments</A
2731></H2
2732><P
2733>Commenting your scripts is a good idea, and will help when
2734 you update and modify the script, or when you adapt parts of it
2735 into other scripts. Unless the meaning is obvious, you should add
2736 comments:</P
2737><P
2738><P
2739></P
2740><UL
2741><LI
2742><P
2743>at the start of the script to explain the
2744 purpose of the script</P
2745></LI
2746><LI
2747><P
2748>before every global variable to describe what
2749 it holds</P
2750></LI
2751><LI
2752><P
2753>before every global function to describe what
2754 it does</P
2755></LI
2756><LI
2757><P
2758>sprinkled through your script wherever the code
2759 solves a problem that took you more than a few minutes to
2760 figure out.</P
2761></LI
2762></UL
2763></P
2764><P
2765>LSL uses Java/C++ style single line comments.</P
2766><P
2767><DIV
2768CLASS="informalexample"
2769><P
2770></P
2771><A
2772NAME="AEN127"
2773></A
2774><PRE
2775CLASS="programlisting"
2776>&#13;// This script toggles a the rotation of an object
2777
2778// g_is_rotating stores the current state of the rotation. TRUE is
2779// rotating, FALSE otherwise.
2780integer g_is_rotating = FALSE;
2781default
2782{
2783 // toggle state during the touch handler
2784 touch(integer num)
2785 {
2786 if(g_is_rotating)
2787 {
2788 // turn off rotation
2789 llTargetOmega(&#60;0,0,1&#62;, 0, 0);
2790 g_is_rotating = FALSE;
2791 }
2792 else
2793 {
2794 // rotate around the positive z axis - up.
2795 llTargetOmega(&#60;0,0,1&#62;, 4, 1);
2796 g_is_rotating = TRUE;
2797 }
2798 }
2799}
2800 </PRE
2801><P
2802></P
2803></DIV
2804></P
2805></DIV
2806><DIV
2807CLASS="section"
2808><HR><H2
2809CLASS="section"
2810><A
2811NAME="AEN129"
2812>3.2. Arithmetic Operations</A
2813></H2
2814><P
2815>Most of the common arithmetic operations are supported in
2816 lsl, and follow the C/Java syntax.</P
2817><DIV
2818CLASS="section"
2819><HR><H3
2820CLASS="section"
2821><A
2822NAME="AEN132"
2823>3.2.1. Assignment</A
2824></H3
2825><P
2826>The most common arithmetic operation is assignment,
2827 denoted with the '=' sign. Loosely translated, it means, take
2828 what you find on the right hand side of the equal sign and
2829 assign it to the left hand side. Any expression that evaluates
2830 to a basic type can be used as the right hand side of an
2831 assignment, but the left hand side must be a normal
2832 variable.</P
2833><P
2834>All basic types support assignment '=', equality '==' and
2835 inequality '!=' operators.</P
2836><P
2837><DIV
2838CLASS="informalexample"
2839><P
2840></P
2841><A
2842NAME="AEN137"
2843></A
2844><PRE
2845CLASS="programlisting"
2846>&#13;// variables to hold a information about the target
2847key g_target;
2848vector g_target_postion;
2849float g_target_distance;
2850
2851// function that demonstrates assignment
2852set_globals(key target, vector pos)
2853{
2854 g_target = target;
2855 g_target_position = pos;
2856
2857 // assignment from the return value of a function
2858 vector my_pos = llGetPos();
2859 g_target_distance = llVecDist(g_target_position, my_pos);
2860}
2861 </PRE
2862><P
2863></P
2864></DIV
2865></P
2866></DIV
2867><DIV
2868CLASS="section"
2869><HR><H3
2870CLASS="section"
2871><A
2872NAME="AEN139"
2873>3.2.2. Hexadecimal Entry</A
2874></H3
2875><P
2876>Integers may be entered in hex form (e.g. 0xffff). For example:</P
2877><P
2878><DIV
2879CLASS="informalexample"
2880><P
2881></P
2882><A
2883NAME="AEN143"
2884></A
2885><PRE
2886CLASS="programlisting"
2887>&#13;integer Mask = 0xff; // Equivalent to integer Mask = 255;
2888integer Bit = 0x0100 // Equivalent to integer Mask = 256;
2889 </PRE
2890><P
2891></P
2892></DIV
2893></P
2894></DIV
2895><DIV
2896CLASS="section"
2897><HR><H3
2898CLASS="section"
2899><A
2900NAME="AEN145"
2901>3.2.3. Binary Arithmetic Operators</A
2902></H3
2903><P
2904>Binary arithmetic operators behave like a function call
2905 that accepts two parameters of the same type, and then return
2906 that type; however, the syntax is slightly different.</P
2907><DIV
2908CLASS="table"
2909><A
2910NAME="AEN148"
2911></A
2912><P
2913><B
2914>Table 3-1. Binary Arithmetic Operators</B
2915></P
2916><TABLE
2917BORDER="1"
2918CLASS="CALSTABLE"
2919><COL><COL><THEAD
2920><TR
2921><TH
2922>Operator</TH
2923><TH
2924>Meaning</TH
2925></TR
2926></THEAD
2927><TBODY
2928><TR
2929><TD
2930>+</TD
2931><TD
2932>Addition</TD
2933></TR
2934><TR
2935><TD
2936>-</TD
2937><TD
2938>Subtraction</TD
2939></TR
2940><TR
2941><TD
2942>*</TD
2943><TD
2944>Multiplication</TD
2945></TR
2946><TR
2947><TD
2948>/</TD
2949><TD
2950>Division</TD
2951></TR
2952><TR
2953><TD
2954>%</TD
2955><TD
2956>Modulo (remainder)</TD
2957></TR
2958><TR
2959><TD
2960>^</TD
2961><TD
2962>Exclusive OR</TD
2963></TR
2964><TR
2965><TD
2966>&#60;&#60;</TD
2967><TD
2968>Shift Left</TD
2969></TR
2970><TR
2971><TD
2972>&#62;&#62;</TD
2973><TD
2974>Shift Right</TD
2975></TR
2976></TBODY
2977></TABLE
2978></DIV
2979><P
2980>Where noted, each type may have a special interpretation
2981 of a binary arithmetic operator. See the <A
2982HREF="#AEN237"
2983>lsl types</A
2984> section for more
2985 details.</P
2986><P
2987><DIV
2988CLASS="informalexample"
2989><P
2990></P
2991><A
2992NAME="AEN183"
2993></A
2994><PRE
2995CLASS="programlisting"
2996>&#13; </PRE
2997><P
2998></P
2999></DIV
3000></P
3001></DIV
3002><DIV
3003CLASS="section"
3004><HR><H3
3005CLASS="section"
3006><A
3007NAME="AEN185"
3008>3.2.4. Boolean Operators</A
3009></H3
3010><P
3011></P
3012><DIV
3013CLASS="table"
3014><A
3015NAME="AEN188"
3016></A
3017><P
3018><B
3019>Table 3-2. Boolean Operators</B
3020></P
3021><TABLE
3022BORDER="1"
3023CLASS="CALSTABLE"
3024><COL><COL><THEAD
3025><TR
3026><TH
3027>Operator</TH
3028><TH
3029>Meaning</TH
3030></TR
3031></THEAD
3032><TBODY
3033><TR
3034><TD
3035>&#60;</TD
3036><TD
3037>Operator returns TRUE if the left hand side is less
3038 than the right hand side.</TD
3039></TR
3040><TR
3041><TD
3042>&#62;</TD
3043><TD
3044>Operator returns TRUE if the left hand side is greater
3045 than the right hand side.</TD
3046></TR
3047><TR
3048><TD
3049>&#60;=</TD
3050><TD
3051>Operator returns TRUE if the left hand side is less
3052 than or equal to the right hand side.</TD
3053></TR
3054><TR
3055><TD
3056>&#62;=</TD
3057><TD
3058>Operator returns TRUE if the left hand side is greater
3059 than or equal to the right hand side.</TD
3060></TR
3061><TR
3062><TD
3063>&#38;&#38;</TD
3064><TD
3065>Operator returns TRUE if the left hand side and right
3066 hand side are both true.</TD
3067></TR
3068><TR
3069><TD
3070>||</TD
3071><TD
3072>Operator returns TRUE if either the left hand or right
3073 hand side are true.</TD
3074></TR
3075><TR
3076><TD
3077>!</TD
3078><TD
3079>Unary operator returns the logical negation of the
3080 expression to the right.</TD
3081></TR
3082></TBODY
3083></TABLE
3084></DIV
3085></DIV
3086><DIV
3087CLASS="section"
3088><HR><H3
3089CLASS="section"
3090><A
3091NAME="AEN217"
3092>3.2.5. Bitwise Operators</A
3093></H3
3094><P
3095></P
3096><DIV
3097CLASS="table"
3098><A
3099NAME="AEN220"
3100></A
3101><P
3102><B
3103>Table 3-3. Bitwise Operators</B
3104></P
3105><TABLE
3106BORDER="1"
3107CLASS="CALSTABLE"
3108><COL><COL><THEAD
3109><TR
3110><TH
3111>Operator</TH
3112><TH
3113>Meaning</TH
3114></TR
3115></THEAD
3116><TBODY
3117><TR
3118><TD
3119>&#38;</TD
3120><TD
3121>Returns the bitwise and of the left and right hand
3122 side.</TD
3123></TR
3124><TR
3125><TD
3126>|</TD
3127><TD
3128>Returns the bitwise or of the left and right hand
3129 side.</TD
3130></TR
3131><TR
3132><TD
3133>~</TD
3134><TD
3135>Unary operator returns the bitwise complement of the
3136 expression to the right.</TD
3137></TR
3138></TBODY
3139></TABLE
3140></DIV
3141></DIV
3142></DIV
3143><DIV
3144CLASS="section"
3145><HR><H2
3146CLASS="section"
3147><A
3148NAME="AEN237"
3149>3.3. Types</A
3150></H2
3151><P
3152>Variables, return values, and parameters have type
3153 information. LSL provides a small set of basic types that are used
3154 throughout the language.</P
3155><P
3156></P
3157><DIV
3158CLASS="variablelist"
3159><P
3160><B
3161>LSL Types</B
3162></P
3163><DL
3164><DT
3165>integer</DT
3166><DD
3167><P
3168>A signed, 32-bit integer value with valid range from
3169 -2147483648 to 2147483647.</P
3170></DD
3171><DT
3172>float</DT
3173><DD
3174><P
3175>An IEEE 32-bit floating point value with
3176 values ranging from 1.175494351E-38 to
3177 3.402823466E+38.</P
3178></DD
3179><DT
3180>key</DT
3181><DD
3182><P
3183>A unique identifier that can be used to
3184 reference objects and agents in Second Life.</P
3185></DD
3186><DT
3187>vector</DT
3188><DD
3189><P
3190>3 floats that are used together as a single
3191 item. A vector can be used to represent a 3 dimensional
3192 position, direction, velocity, force, impulse, or a
3193 color. Each component can be accessed via '.x', '.y', and
3194 '.z'.</P
3195><DIV
3196CLASS="table"
3197><A
3198NAME="AEN258"
3199></A
3200><P
3201><B
3202>Table 3-4. Vector Arithmetic Operators</B
3203></P
3204><TABLE
3205BORDER="1"
3206CLASS="CALSTABLE"
3207><COL><COL><THEAD
3208><TR
3209><TH
3210>Operator</TH
3211><TH
3212>Meaning</TH
3213></TR
3214></THEAD
3215><TBODY
3216><TR
3217><TD
3218>+</TD
3219><TD
3220>Add two vectors together</TD
3221></TR
3222><TR
3223><TD
3224>-</TD
3225><TD
3226>Subtract one vector from another</TD
3227></TR
3228><TR
3229><TD
3230>*</TD
3231><TD
3232>Vector dot product</TD
3233></TR
3234><TR
3235><TD
3236>%</TD
3237><TD
3238>Vector cross product</TD
3239></TR
3240></TBODY
3241></TABLE
3242></DIV
3243></DD
3244><DT
3245>rotation</DT
3246><DD
3247><P
3248>4 floats that are used together as a single
3249 item to represent a rotation. This data is interpreted as a
3250 quaternion. Each component can be accessed via '.x', '.y',
3251 '.z', and '.s'.</P
3252><DIV
3253CLASS="table"
3254><A
3255NAME="AEN282"
3256></A
3257><P
3258><B
3259>Table 3-5. Rotation Arithmetic Operators</B
3260></P
3261><TABLE
3262BORDER="1"
3263CLASS="CALSTABLE"
3264><COL><COL><THEAD
3265><TR
3266><TH
3267>Operator</TH
3268><TH
3269>Meaning</TH
3270></TR
3271></THEAD
3272><TBODY
3273><TR
3274><TD
3275>+</TD
3276><TD
3277>Add two rotations together</TD
3278></TR
3279><TR
3280><TD
3281>-</TD
3282><TD
3283>Subtract one rotation from another</TD
3284></TR
3285><TR
3286><TD
3287>*</TD
3288><TD
3289>Rotate the first rotation by the second</TD
3290></TR
3291><TR
3292><TD
3293>/</TD
3294><TD
3295>Rotate the first rotation by the inverse of the second</TD
3296></TR
3297></TBODY
3298></TABLE
3299></DIV
3300></DD
3301><DT
3302>list</DT
3303><DD
3304><P
3305>A heterogeneous list of the other data types. Lists are
3306 created via comma separated values of the other data types
3307 enclosed by '[' and ']'.</P
3308><P
3309><DIV
3310CLASS="informalexample"
3311><P
3312></P
3313><A
3314NAME="AEN307"
3315></A
3316><PRE
3317CLASS="programlisting"
3318>&#13;string StringVar = "Hello, Carbon Unit";
3319list MyList = [ 1234, ZERO_ROTATION, StringVar ];
3320 </PRE
3321><P
3322></P
3323></DIV
3324>
3325 Yields the list: <SAMP
3326CLASS="computeroutput"
3327>[ 1234, &#60;0,0,0,1&#62;, "Hello,
3328 Carbon Unit" ]</SAMP
3329>
3330 </P
3331><P
3332>Lists can be combined with other lists. For example:
3333 <DIV
3334CLASS="informalexample"
3335><P
3336></P
3337><A
3338NAME="AEN311"
3339></A
3340><PRE
3341CLASS="programlisting"
3342>&#13;MyList = 3.14159 + MyList;
3343 </PRE
3344><P
3345></P
3346></DIV
3347>
3348 Yields the list: <SAMP
3349CLASS="computeroutput"
3350>[ 3.14159, 1234, &#60;0,0,0,1&#62;,
3351 "Hello, Carbon Unit" ]</SAMP
3352>
3353 And similarly,
3354 <DIV
3355CLASS="informalexample"
3356><P
3357></P
3358><A
3359NAME="AEN314"
3360></A
3361><PRE
3362CLASS="programlisting"
3363>&#13;MyList = MyList + MyList;
3364 </PRE
3365><P
3366></P
3367></DIV
3368>
3369 Yields: <SAMP
3370CLASS="computeroutput"
3371>[ 3.14159, 1234, &#60;0,0,0,1&#62;, "Hello,
3372 Carbon Unit", 3.14159, 1234, &#60;0,0,0,1&#62;, "Hello, Carbon Unit"
3373 ]</SAMP
3374>
3375 </P
3376><P
3377>Library functions exist used to copy data from lists,
3378 sort lists, copy/remove sublists.</P
3379></DD
3380></DL
3381></DIV
3382><DIV
3383CLASS="section"
3384><HR><H3
3385CLASS="section"
3386><A
3387NAME="AEN318"
3388>3.3.1. Type Conversion</A
3389></H3
3390><P
3391>Type conversion can either occur implicitly or explicitly.
3392 Explicit type casts are accomplished using C syntax:
3393 <DIV
3394CLASS="informalexample"
3395><P
3396></P
3397><A
3398NAME="AEN321"
3399></A
3400><PRE
3401CLASS="programlisting"
3402>&#13;float foo_float = 1.0;
3403integer foo_int = (integer)foo_float;
3404 </PRE
3405><P
3406></P
3407></DIV
3408>
3409 </P
3410><DIV
3411CLASS="section"
3412><HR><H4
3413CLASS="section"
3414><A
3415NAME="AEN323"
3416>3.3.1.1. Implicit Casting</A
3417></H4
3418><P
3419>LSL only supports two implicit type casts: integer to
3420 float and string to key. Thus, any place you see a float
3421 specified you can supply an integer, and any place you see a
3422 key specified, you can supply a string.</P
3423></DIV
3424><DIV
3425CLASS="section"
3426><HR><H4
3427CLASS="section"
3428><A
3429NAME="AEN326"
3430>3.3.1.2. Explicit Casting</A
3431></H4
3432><P
3433>LSL supports the following explicit casts:
3434 <P
3435></P
3436><UL
3437><LI
3438STYLE="list-style-type: opencircle"
3439><P
3440>Integer to String</P
3441></LI
3442><LI
3443STYLE="list-style-type: opencircle"
3444><P
3445>Float to Integer</P
3446></LI
3447><LI
3448STYLE="list-style-type: opencircle"
3449><P
3450>Float to String</P
3451></LI
3452><LI
3453STYLE="list-style-type: opencircle"
3454><P
3455>Vector to String</P
3456></LI
3457><LI
3458STYLE="list-style-type: opencircle"
3459><P
3460>Rotation to String</P
3461></LI
3462><LI
3463STYLE="list-style-type: opencircle"
3464><P
3465>Integer to List</P
3466></LI
3467><LI
3468STYLE="list-style-type: opencircle"
3469><P
3470>Float to List</P
3471></LI
3472><LI
3473STYLE="list-style-type: opencircle"
3474><P
3475>Key to List</P
3476></LI
3477><LI
3478STYLE="list-style-type: opencircle"
3479><P
3480>String to List</P
3481></LI
3482><LI
3483STYLE="list-style-type: opencircle"
3484><P
3485>Vector to List</P
3486></LI
3487><LI
3488STYLE="list-style-type: opencircle"
3489><P
3490>Rotation to List</P
3491></LI
3492><LI
3493STYLE="list-style-type: opencircle"
3494><P
3495>String to Integer</P
3496></LI
3497><LI
3498STYLE="list-style-type: opencircle"
3499><P
3500>String to Float</P
3501></LI
3502><LI
3503STYLE="list-style-type: opencircle"
3504><P
3505>String to Vector</P
3506></LI
3507><LI
3508STYLE="list-style-type: opencircle"
3509><P
3510>String to Rotation</P
3511></LI
3512></UL
3513>
3514 </P
3515></DIV
3516></DIV
3517></DIV
3518><DIV
3519CLASS="section"
3520><HR><H2
3521CLASS="section"
3522><A
3523NAME="AEN360"
3524>3.4. Global Functions</A
3525></H2
3526><P
3527>Global functions are also declared much like Java/C, with
3528 the exception that no 'void' return value exists. Instead, if no
3529 return value is needed, just don't specify one:
3530
3531 <DIV
3532CLASS="informalexample"
3533><P
3534></P
3535><A
3536NAME="AEN363"
3537></A
3538><PRE
3539CLASS="programlisting"
3540>&#13;make_physical_and_spin(vector torque)
3541{
3542 // double the torque
3543 vector double_torque = 2.0*torque;
3544 llSetStatus(STATUS_PHYSICS, TRUE);
3545 llApplyTorque(double_torque);
3546}
3547 </PRE
3548><P
3549></P
3550></DIV
3551></P
3552></DIV
3553><DIV
3554CLASS="section"
3555><HR><H2
3556CLASS="section"
3557><A
3558NAME="AEN365"
3559>3.5. Global Variables</A
3560></H2
3561><P
3562>Global variables and functions are accessible from anywhere
3563 in the file. Global variables are declared much like Java or C,
3564 although only one declaration may be made per line:
3565 <DIV
3566CLASS="informalexample"
3567><P
3568></P
3569><A
3570NAME="AEN368"
3571></A
3572><PRE
3573CLASS="programlisting"
3574>&#13;vector gStartPosition;
3575 </PRE
3576><P
3577></P
3578></DIV
3579></P
3580><P
3581>Global variables may also be initialized if desired,
3582 although uninitialized global and local variables are initialized
3583 to legal zero values:
3584 <DIV
3585CLASS="informalexample"
3586><P
3587></P
3588><A
3589NAME="AEN371"
3590></A
3591><PRE
3592CLASS="programlisting"
3593>&#13;vector gStartPosition = &#60;10.0,10.0,10.0&#62;
3594 </PRE
3595><P
3596></P
3597></DIV
3598></P
3599></DIV
3600><DIV
3601CLASS="section"
3602><HR><H2
3603CLASS="section"
3604><A
3605NAME="AEN373"
3606>3.6. Local Variables</A
3607></H2
3608><P
3609>Local variables are scoped below their declaration within
3610 the block of code they are declared in and may be declared within
3611 any block of code. Thus the following code is legal and will work
3612 like C:
3613 <DIV
3614CLASS="informalexample"
3615><P
3616></P
3617><A
3618NAME="AEN376"
3619></A
3620><PRE
3621CLASS="programlisting"
3622>&#13;integer test_function()
3623{
3624 // Test vector that we can use anywhere in the function
3625 vector test = &#60;1,2,3&#62;;
3626 integer j;
3627 for (j = 0; j &#60; 10; j++)
3628 {
3629 // This vector is a different variable than the one declared above
3630 // This IS NOT good coding practice
3631 vector test = &#60;j, j, j&#62;;
3632 }
3633 // this test fails
3634 if (test == &#60;9,9,9&#62;)
3635 {
3636 // never reached
3637 }
3638}
3639 </PRE
3640><P
3641></P
3642></DIV
3643></P
3644></DIV
3645></DIV
3646><DIV
3647CLASS="chapter"
3648><HR><H1
3649><A
3650NAME="AEN378"
3651></A
3652>Chapter 4. Flow Control</H1
3653><P
3654>LSL comes with a complete complement of constructs meant to
3655 deal with conditional processing, looping, as well as simply jumping
3656 to a different point in the script.</P
3657><DIV
3658CLASS="section"
3659><HR><H2
3660CLASS="section"
3661><A
3662NAME="AEN381"
3663>4.1. Conditional Statements</A
3664></H2
3665><P
3666>The 'if' statement operates and has the
3667 same syntax as the Java/C version.</P
3668><P
3669><DIV
3670CLASS="informalexample"
3671><P
3672></P
3673><A
3674NAME="AEN385"
3675></A
3676><PRE
3677CLASS="programlisting"
3678>&#13;check_message(string message)
3679{
3680 if(message == "open")
3681 {
3682 open();
3683 }
3684 else if(message == "close")
3685 {
3686 close();
3687 }
3688 else
3689 {
3690 llSay(0, "Unknown command: " + message);
3691 }
3692}
3693 </PRE
3694><P
3695></P
3696></DIV
3697></P
3698><P
3699>The statements between the open and close curly brace are
3700 performed if the conditional inside the parentheses evaluates to a
3701 non-zero integer. Once a conditional is determined to be true
3702 (non-zero), no further processing of 'else' conditionals will be
3703 considered. The <A
3704HREF="#AEN6070"
3705>NULL_KEY</A
3706> constant
3707 is counted as FALSE by conditional expressions.</P
3708><P
3709>There can be zero or more 'else if' statements, and an
3710 optional final 'else' to handle the case when none of the if
3711 statements evaluate to a non-zero integer.</P
3712><P
3713>The usual set of integer arithmetic and comparison operators
3714 are available.</P
3715><P
3716><DIV
3717CLASS="informalexample"
3718><P
3719></P
3720><A
3721NAME="AEN392"
3722></A
3723><PRE
3724CLASS="programlisting"
3725>&#13;// a function that accepts some information about its environment and
3726// determines the 'best' next step. This kind of code might be
3727// part of a simple box meant to move close to an agent and attach to
3728// them once near. This code sample relies on the standard linden
3729// library functions as well as two other methods not defined here.
3730assess_next_step(integer perm, integer attached, integer balance, float dist)
3731{
3732 string msg;
3733 if(!attached)
3734 {
3735 if((perm &#38; PERMISSION_ATTACH) &#38;&#38; (dist &#60; 10.0))
3736 {
3737 attach();
3738 }
3739 else if((dist &#62; 10.0) || ((dist &#62; 20.0) &#38;&#38; (balance &#62; 1000)))
3740 {
3741 move_closer();
3742 }
3743 else
3744 {
3745 llRequestPermissions(llGetOwner(), PERMISSION_ATTACH);
3746 }
3747 }
3748}
3749 </PRE
3750><P
3751></P
3752></DIV
3753></P
3754></DIV
3755><DIV
3756CLASS="section"
3757><HR><H2
3758CLASS="section"
3759><A
3760NAME="AEN394"
3761>4.2. Loop Constructs</A
3762></H2
3763><P
3764>Loops are a basic building block of most useful programming
3765 languages, and LSL offers the same loop constructs as found in
3766 Java or C.</P
3767><DIV
3768CLASS="section"
3769><HR><H3
3770CLASS="section"
3771><A
3772NAME="AEN397"
3773>4.2.1. for loop</A
3774></H3
3775><P
3776>A for loop is most useful for when you know how many times
3777 you need to iterate over an operation. Just like a Java or C for
3778 loop, the parentheses have three parts, the initializer, the
3779 continuation condition, and the increment. The loop continues
3780 while the middle term evaluates to true, and the increment step
3781 is performed at the end of every loop.</P
3782><P
3783><DIV
3784CLASS="informalexample"
3785><P
3786></P
3787><A
3788NAME="AEN401"
3789></A
3790><PRE
3791CLASS="programlisting"
3792>&#13;// move a non-physical block smoothly upward (positive z) the total
3793// distance specified divided into steps discrete moves.
3794move_up(float distance, integer steps)
3795{
3796 float step_distance = distance / (float)steps;
3797 vector offset = &#60;0.0, 0.0, step_distance&#62;;
3798 vector base_pos = llGetPos();
3799 integer i;
3800 for(i = 0; i &#60;= steps; ++i)
3801 {
3802 llSetPos(base_pos + i * offset);
3803 llSleep(0.1);
3804 }
3805}
3806 </PRE
3807><P
3808></P
3809></DIV
3810></P
3811></DIV
3812><DIV
3813CLASS="section"
3814><HR><H3
3815CLASS="section"
3816><A
3817NAME="AEN403"
3818>4.2.2. do-while loop</A
3819></H3
3820><P
3821>The do-while loop construct is most useful when you are
3822 sure that you want to perform an operation at least once, but
3823 you are not sure how many times you want to loop. The syntax is
3824 the same as you would find in a Java or C program. A simple
3825 English translation would be 'do the code inside the curly braces
3826 and continue doing it if the statement after the while is
3827 true.</P
3828><P
3829><DIV
3830CLASS="informalexample"
3831><P
3832></P
3833><A
3834NAME="AEN407"
3835></A
3836><PRE
3837CLASS="programlisting"
3838>&#13;// output the name of all inventory items attached to this object
3839talk_about_inventory(integer type)
3840{
3841 string name;
3842 integer i = 0;
3843 integer continue = TRUE;
3844 do
3845 {
3846 name = llGetInventoryName(type, i);
3847 if(llStringLength(name) &#62; 0)
3848 {
3849 llSay(0, "Inventory " + (string)i + ": " + name);
3850 }
3851 else
3852 {
3853 llSay(0, "No more inventory items");
3854 continue = FALSE;
3855 }
3856 i++;
3857 } while(continue);
3858}
3859 </PRE
3860><P
3861></P
3862></DIV
3863></P
3864></DIV
3865><DIV
3866CLASS="section"
3867><HR><H3
3868CLASS="section"
3869><A
3870NAME="AEN409"
3871>4.2.3. while loop</A
3872></H3
3873><P
3874>The while loop behaves similarly to the do-while loop,
3875 except it allows you to exit the loop without doing a single
3876 iteration inside.</P
3877><P
3878><DIV
3879CLASS="informalexample"
3880><P
3881></P
3882><A
3883NAME="AEN413"
3884></A
3885><PRE
3886CLASS="programlisting"
3887>&#13;mention_inventory_type(integer type)
3888{
3889 integer i = llGetInventoryNumber(type);
3890 while(i--)
3891 {
3892 llSay(0, "item: " + llGetInventory(i));
3893 }
3894}
3895 </PRE
3896><P
3897></P
3898></DIV
3899></P
3900></DIV
3901></DIV
3902><DIV
3903CLASS="section"
3904><HR><H2
3905CLASS="section"
3906><A
3907NAME="AEN415"
3908>4.3. Jumps</A
3909></H2
3910><P
3911>A jump is used to move the running script to a new point
3912 inside of a function or event handler. You cannot jump into other
3913 functions or event handlers. Usually, you will want to use a jump
3914 for in situations where the if..else statements would become too
3915 cumbersome. For example, you may want to check several
3916 preconditions, and exit if any of them are not met.</P
3917><P
3918><DIV
3919CLASS="informalexample"
3920><P
3921></P
3922><A
3923NAME="AEN419"
3924></A
3925><PRE
3926CLASS="programlisting"
3927>&#13;attach_if_ready(vector target_pos)
3928{
3929 // make sure we have permission
3930 integer perm = llGetPerm();
3931 if(!(perm &#38; PERMISSION_ATTACH))
3932 {
3933 jump early_exit;
3934 }
3935
3936 // make sure we're 10 or less meters away
3937 vector pos = llGetPos()
3938 float dist = llVecDist(pos, target_pos);
3939 if(dist &#62; 10.0)
3940 {
3941 jump early_exit;
3942 }
3943
3944 // make sure we're roughly pointed toward the target.
3945 // the calculation of max_cos_theta could be precomputed
3946 // as a constant, but is manually computed here to
3947 // illustrate the math.
3948 float max_cos_theta = llCos(PI / 4.0);
3949 vector toward_target = llVecNorm(target_pos - pos);
3950 rotation rot = llGetRot();
3951 vector fwd = llRot2Fwd(rot);
3952 float cos_theta = toward_target * fwd;
3953 if(cos_theta &#62; max_cos_theta)
3954 {
3955 jump early_exit;
3956 }
3957
3958 // at this point, we've done all the checks.
3959 attach();
3960
3961 @early_exit;
3962}
3963 </PRE
3964><P
3965></P
3966></DIV
3967></P
3968></DIV
3969><DIV
3970CLASS="section"
3971><HR><H2
3972CLASS="section"
3973><A
3974NAME="AEN421"
3975>4.4. State Change</A
3976></H2
3977><P
3978>State change allow you to move through the lsl virtual
3979 machine's flexible state machine by transitioning your script to
3980 and from user defined states and the default state. You can define
3981 your own script state by placing the keyword 'state' before its
3982 name and enclosing the event handlers with open and close curly
3983 braces ('{' and '}'.) You can invoke the transition to a new state
3984 by calling it with the syntax: 'state &#60;statename&#62;'.</P
3985><P
3986><DIV
3987CLASS="informalexample"
3988><P
3989></P
3990><A
3991NAME="AEN425"
3992></A
3993><PRE
3994CLASS="programlisting"
3995>&#13;default
3996{
3997 state_entry()
3998 {
3999 llSay(0, "I am in the default state");
4000 llSetTimer(1.0);
4001 }
4002
4003 timer()
4004 {
4005 state SpinState;
4006 }
4007}
4008
4009state SpinState
4010{
4011 state_entry()
4012 {
4013 llSay(0, "I am in SpinState!");
4014 llTargetOmega(&#60;0,0,1&#62;, 4, 1.0);
4015 llSetTimer(2.0);
4016 }
4017
4018 timer()
4019 {
4020 state default;
4021 }
4022
4023 state_exit()
4024 {
4025 llTargetOmega(&#60;0,0,1&#62;, 0, 0.0);
4026 }
4027}
4028 </PRE
4029><P
4030></P
4031></DIV
4032></P
4033></DIV
4034></DIV
4035><DIV
4036CLASS="chapter"
4037><HR><H1
4038><A
4039NAME="AEN427"
4040></A
4041>Chapter 5. States</H1
4042><P
4043>All scripts must have a 'default' state, which is the first
4044 state entered when the script starts. States contain event handlers
4045 that are triggered by the LSL virtual machine. All states must
4046 supply at least one event handler - it's not really a state without
4047 one.</P
4048><P
4049>When state changes, all callback settings are retained and all
4050 pending events are cleared.</P
4051><DIV
4052CLASS="section"
4053><HR><H2
4054CLASS="section"
4055><A
4056NAME="AEN431"
4057>5.1. state_entry()</A
4058></H2
4059><P
4060>The <A
4061HREF="#AEN5195"
4062>state_entry</A
4063>
4064 event occurs whenever a new state is
4065 entered, including program start, and is always the first event
4066 handled. No data is passed to this event handler.</P
4067><P
4068>You will usually want to set callbacks for things such as
4069 timers and sensor in the state_entry() callback of the state to
4070 put your object into a useful condition for that state.</P
4071><P
4072>Warning: It is a common mistake to assume that the state_entry()
4073 callback is called when you rez an object out of your
4074 inventory. When you derez an object into your inventory the
4075 current state of the script is saved, so there will not be a
4076 call to state_entry() during the rez. If you need to provide
4077 startup code every time an object is created, you should create
4078 a global function and call it from both state_entry() and the
4079 on_rez() callbacks.</P
4080><P
4081><DIV
4082CLASS="informalexample"
4083><P
4084></P
4085><A
4086NAME="AEN438"
4087></A
4088><PRE
4089CLASS="programlisting"
4090>&#13;// global initialization function.
4091init()
4092{
4093 // Set up a listen callback for whoever owns this object.
4094 key owner = llGetOwner();
4095 llListen(0, "", owner, "");
4096}
4097
4098default
4099{
4100 state_entry()
4101 {
4102 init();
4103 }
4104
4105 on_rez(integer start_param)
4106 {
4107 init();
4108 }
4109
4110 listen(integer channel, string name, key id, string message)
4111 {
4112 llSay(0, "Hi " + name + "! You own me.");
4113 }
4114}
4115 </PRE
4116><P
4117></P
4118></DIV
4119></P
4120></DIV
4121><DIV
4122CLASS="section"
4123><HR><H2
4124CLASS="section"
4125><A
4126NAME="AEN440"
4127>5.2. state_exit()</A
4128></H2
4129><P
4130>You will want to provide a <A
4131HREF="#AEN5203"
4132>&#13; state_exit()</A
4133> if you need to clean
4134 up any events that you have requested in the current state, but do
4135 not expect in the next state.</P
4136><P
4137><DIV
4138CLASS="informalexample"
4139><P
4140></P
4141><A
4142NAME="AEN445"
4143></A
4144><PRE
4145CLASS="programlisting"
4146>&#13;default
4147{
4148 state_entry()
4149 {
4150 state TimerState;
4151 }
4152}
4153
4154state TimerState
4155{
4156 state_entry()
4157 {
4158 // set a timer event for 5 seconds in the future.
4159 llSetTimerEvent(5.0);
4160 }
4161
4162 timer()
4163 {
4164 llSay(0, "timer");
4165 state ListenState;
4166 }
4167
4168 state_exit()
4169 {
4170 // turn off future timer events.
4171 llSetTimerEvent(0.0);
4172 }
4173}
4174
4175integer g_listen_control;
4176
4177state ListenState
4178{
4179 state_entry()
4180 {
4181 // listen for anything on the public channel
4182 g_listen_control = llListen(0, "", NULL_KEY, "");
4183 }
4184
4185 listen(integer channel, string name, key id, string message)
4186 {
4187 llSay(0, "listen");
4188 state TimerState;
4189 }
4190
4191 state_exit()
4192 {
4193 // turn off the listener
4194 llListenRemove(g_listen_control);
4195 }
4196}
4197 </PRE
4198><P
4199></P
4200></DIV
4201></P
4202><P
4203>The <A
4204HREF="#AEN5203"
4205>state_exit()</A
4206>
4207 handler is not called when an object is
4208 being deleted - all callbacks, handlers, sounds, etc, will be
4209 cleaned up automatically for you.</P
4210></DIV
4211><DIV
4212CLASS="section"
4213><HR><H2
4214CLASS="section"
4215><A
4216NAME="AEN449"
4217>5.3. States vs. Global variables</A
4218></H2
4219><P
4220>A state and a set of global variables can serve the same
4221 purpose, and each can be expressed in terms of the other. In
4222 general, you should prefer the use of states over global variables
4223 since states allow you to immediately assume script state without
4224 making comparisons. The less comparisons a script makes, the more
4225 regular code statements it can run.</P
4226></DIV
4227></DIV
4228><DIV
4229CLASS="chapter"
4230><HR><H1
4231><A
4232NAME="AEN452"
4233></A
4234>Chapter 6. Math</H1
4235><DIV
4236CLASS="section"
4237><H2
4238CLASS="section"
4239><A
4240NAME="AEN454"
4241>6.1. Tables of Functions</A
4242></H2
4243><DIV
4244CLASS="table"
4245><A
4246NAME="AEN456"
4247></A
4248><P
4249><B
4250>Table 6-1. Trigonometry Functions</B
4251></P
4252><TABLE
4253BORDER="1"
4254CLASS="CALSTABLE"
4255><COL><THEAD
4256><TR
4257><TH
4258>Function</TH
4259></TR
4260></THEAD
4261><TBODY
4262><TR
4263><TD
4264><A
4265HREF="#AEN1002"
4266>llAbs</A
4267></TD
4268></TR
4269><TR
4270><TD
4271><A
4272HREF="#AEN1012"
4273>llAcos</A
4274></TD
4275></TR
4276><TR
4277><TD
4278><A
4279HREF="#AEN1096"
4280>llAsin</A
4281></TD
4282></TR
4283><TR
4284><TD
4285><A
4286HREF="#AEN1106"
4287>llAtan2</A
4288></TD
4289></TR
4290><TR
4291><TD
4292><A
4293HREF="#AEN1212"
4294>llCeil</A
4295></TD
4296></TR
4297><TR
4298><TD
4299><A
4300HREF="#AEN1282"
4301>llCos</A
4302></TD
4303></TR
4304><TR
4305><TD
4306><A
4307HREF="#AEN1559"
4308>llFabs</A
4309></TD
4310></TR
4311><TR
4312><TD
4313><A
4314HREF="#AEN1569"
4315>llFloor</A
4316></TD
4317></TR
4318><TR
4319><TD
4320><A
4321HREF="#AEN1579"
4322>llFrand</A
4323></TD
4324></TR
4325><TR
4326><TD
4327><A
4328HREF="#AEN3220"
4329>llPow</A
4330></TD
4331></TR
4332><TR
4333><TD
4334><A
4335HREF="#AEN3618"
4336>llRound</A
4337></TD
4338></TR
4339><TR
4340><TD
4341><A
4342HREF="#AEN4302"
4343>llSin</A
4344></TD
4345></TR
4346><TR
4347><TD
4348><A
4349HREF="#AEN4335"
4350>llSqrt</A
4351></TD
4352></TR
4353><TR
4354><TD
4355><A
4356HREF="#AEN4678"
4357>llTan</A
4358></TD
4359></TR
4360></TBODY
4361></TABLE
4362></DIV
4363><DIV
4364CLASS="table"
4365><A
4366NAME="AEN505"
4367></A
4368><P
4369><B
4370>Table 6-2. Vector Functions</B
4371></P
4372><TABLE
4373BORDER="1"
4374CLASS="CALSTABLE"
4375><COL><THEAD
4376><TR
4377><TH
4378>Function</TH
4379></TR
4380></THEAD
4381><TBODY
4382><TR
4383><TD
4384><A
4385HREF="#AEN4810"
4386>llVecDist</A
4387></TD
4388></TR
4389><TR
4390><TD
4391><A
4392HREF="#AEN4823"
4393>llVecMag</A
4394></TD
4395></TR
4396><TR
4397><TD
4398><A
4399HREF="#AEN4833"
4400>llVecNorm</A
4401></TD
4402></TR
4403></TBODY
4404></TABLE
4405></DIV
4406><DIV
4407CLASS="table"
4408><A
4409NAME="AEN521"
4410></A
4411><P
4412><B
4413>Table 6-3. Rotation Functions</B
4414></P
4415><TABLE
4416BORDER="1"
4417CLASS="CALSTABLE"
4418><COL><THEAD
4419><TR
4420><TH
4421>Function</TH
4422></TR
4423></THEAD
4424><TBODY
4425><TR
4426><TD
4427><A
4428HREF="#AEN1057"
4429>llAngleBetween</A
4430></TD
4431></TR
4432><TR
4433><TD
4434><A
4435HREF="#AEN1144"
4436>llAxes2Rot</A
4437></TD
4438></TR
4439><TR
4440><TD
4441><A
4442HREF="#AEN1160"
4443>llAxisAngle2Rot</A
4444></TD
4445></TR
4446><TR
4447><TD
4448><A
4449HREF="#AEN1549"
4450>llEuler2Rot</A
4451></TD
4452></TR
4453><TR
4454><TD
4455><A
4456HREF="#AEN3486"
4457>llRot2Angle</A
4458></TD
4459></TR
4460><TR
4461><TD
4462><A
4463HREF="#AEN3496"
4464>llRot2Axis</A
4465></TD
4466></TR
4467><TR
4468><TD
4469><A
4470HREF="#AEN3506"
4471>llRot2Euler</A
4472></TD
4473></TR
4474><TR
4475><TD
4476><A
4477HREF="#AEN3516"
4478>llRot2Fwd</A
4479></TD
4480></TR
4481><TR
4482><TD
4483><A
4484HREF="#AEN3526"
4485>llRot2Left</A
4486></TD
4487></TR
4488><TR
4489><TD
4490><A
4491HREF="#AEN3536"
4492>llRot2Up</A
4493></TD
4494></TR
4495><TR
4496><TD
4497><A
4498HREF="#AEN3546"
4499>llRotBetween</A
4500></TD
4501></TR
4502></TBODY
4503></TABLE
4504></DIV
4505></DIV
4506></DIV
4507><DIV
4508CLASS="chapter"
4509><HR><H1
4510><A
4511NAME="AEN561"
4512></A
4513>Chapter 7. Strings</H1
4514><DIV
4515CLASS="section"
4516><H2
4517CLASS="section"
4518><A
4519NAME="AEN563"
4520>7.1. Tables of Functions</A
4521></H2
4522><DIV
4523CLASS="table"
4524><A
4525NAME="AEN565"
4526></A
4527><P
4528><B
4529>Table 7-1. String Functions</B
4530></P
4531><TABLE
4532BORDER="1"
4533CLASS="CALSTABLE"
4534><COL><THEAD
4535><TR
4536><TH
4537>Function</TH
4538></TR
4539></THEAD
4540><TBODY
4541><TR
4542><TD
4543><A
4544HREF="#AEN1173"
4545>llBase64ToString</A
4546></TD
4547></TR
4548><TR
4549><TD
4550><A
4551HREF="#AEN1326"
4552>llDeleteSubString</A
4553></TD
4554></TR
4555><TR
4556><TD
4557><A
4558HREF="#AEN2195"
4559>llGetSubString</A
4560></TD
4561></TR
4562><TR
4563><TD
4564><A
4565HREF="#AEN2415"
4566>llInsertString</A
4567></TD
4568></TR
4569><TR
4570><TD
4571><A
4572HREF="#AEN2902"
4573>llMD5String</A
4574></TD
4575></TR
4576><TR
4577><TD
4578><A
4579HREF="#AEN4631"
4580>llStringLength</A
4581></TD
4582></TR
4583><TR
4584><TD
4585><A
4586HREF="#AEN4641"
4587>llSubStringIndex</A
4588></TD
4589></TR
4590><TR
4591><TD
4592><A
4593HREF="#AEN4652"
4594>llStringToBase64</A
4595></TD
4596></TR
4597><TR
4598><TD
4599><A
4600HREF="#AEN4737"
4601>llToLower</A
4602></TD
4603></TR
4604><TR
4605><TD
4606><A
4607HREF="#AEN4746"
4608>llToUpper</A
4609></TD
4610></TR
4611><TR
4612><TD
4613><A
4614HREF="#AEN4886"
4615>llXorBase64Strings</A
4616></TD
4617></TR
4618></TBODY
4619></TABLE
4620></DIV
4621></DIV
4622></DIV
4623><DIV
4624CLASS="chapter"
4625><HR><H1
4626><A
4627NAME="AEN605"
4628></A
4629>Chapter 8. Lists</H1
4630><DIV
4631CLASS="section"
4632><H2
4633CLASS="section"
4634><A
4635NAME="AEN607"
4636>8.1. Tables of Functions</A
4637></H2
4638><DIV
4639CLASS="table"
4640><A
4641NAME="AEN609"
4642></A
4643><P
4644><B
4645>Table 8-1. List Functions</B
4646></P
4647><TABLE
4648BORDER="1"
4649CLASS="CALSTABLE"
4650><COL><THEAD
4651><TR
4652><TH
4653>Function</TH
4654></TR
4655></THEAD
4656><TBODY
4657><TR
4658><TD
4659><A
4660HREF="#AEN1202"
4661>llCSV2List</A
4662></TD
4663></TR
4664><TR
4665><TD
4666><A
4667HREF="#AEN1306"
4668>llDeleteSubList</A
4669></TD
4670></TR
4671><TR
4672><TD
4673><A
4674HREF="#AEN1875"
4675>llGetListEntryType</A
4676></TD
4677></TR
4678><TR
4679><TD
4680><A
4681HREF="#AEN1889"
4682>llGetListLength</A
4683></TD
4684></TR
4685><TR
4686><TD
4687><A
4688HREF="#AEN2454"
4689>llList2CSV</A
4690></TD
4691></TR
4692><TR
4693><TD
4694><A
4695HREF="#AEN2464"
4696>llList2Float</A
4697></TD
4698></TR
4699><TR
4700><TD
4701><A
4702HREF="#AEN2477"
4703>llList2Integer</A
4704></TD
4705></TR
4706><TR
4707><TD
4708><A
4709HREF="#AEN2490"
4710>llList2Key</A
4711></TD
4712></TR
4713><TR
4714><TD
4715><A
4716HREF="#AEN2503"
4717>llList2List</A
4718></TD
4719></TR
4720><TR
4721><TD
4722><A
4723HREF="#AEN2526"
4724>llList2ListStrided</A
4725></TD
4726></TR
4727><TR
4728><TD
4729><A
4730HREF="#AEN2544"
4731>llList2Rot</A
4732></TD
4733></TR
4734><TR
4735><TD
4736><A
4737HREF="#AEN2557"
4738>llList2String</A
4739></TD
4740></TR
4741><TR
4742><TD
4743><A
4744HREF="#AEN2570"
4745>llList2Vector</A
4746></TD
4747></TR
4748><TR
4749><TD
4750><A
4751HREF="#AEN2583"
4752>llListFindList</A
4753></TD
4754></TR
4755><TR
4756><TD
4757><A
4758HREF="#AEN2598"
4759>llListInsertList</A
4760></TD
4761></TR
4762><TR
4763><TD
4764><A
4765HREF="#AEN2614"
4766>llListRandomize</A
4767></TD
4768></TR
4769><TR
4770><TD
4771><A
4772HREF="#AEN2648"
4773>llListSort</A
4774></TD
4775></TR
4776><TR
4777><TD
4778><A
4779HREF="#AEN3105"
4780>llParseString2List</A
4781></TD
4782></TR
4783></TBODY
4784></TABLE
4785></DIV
4786></DIV
4787></DIV
4788><DIV
4789CLASS="chapter"
4790><HR><H1
4791><A
4792NAME="AEN670"
4793></A
4794>Chapter 9. Communication</H1
4795><DIV
4796CLASS="section"
4797><H2
4798CLASS="section"
4799><A
4800NAME="AEN672"
4801>9.1. Tables of Functions</A
4802></H2
4803><DIV
4804CLASS="table"
4805><A
4806NAME="AEN674"
4807></A
4808><P
4809><B
4810>Table 9-1. In World Functions</B
4811></P
4812><TABLE
4813BORDER="1"
4814CLASS="CALSTABLE"
4815><COL><THEAD
4816><TR
4817><TH
4818>Function</TH
4819></TR
4820></THEAD
4821><TBODY
4822><TR
4823><TD
4824><A
4825HREF="#AEN2665"
4826>llListen</A
4827></TD
4828></TR
4829><TR
4830><TD
4831><A
4832HREF="#AEN2686"
4833>llListenControl</A
4834></TD
4835></TR
4836><TR
4837><TD
4838><A
4839HREF="#AEN2701"
4840>llListenRemove</A
4841></TD
4842></TR
4843><TR
4844><TD
4845><A
4846HREF="#AEN3640"
4847>llSay</A
4848></TD
4849></TR
4850><TR
4851><TD
4852><A
4853HREF="#AEN4288"
4854>llShout</A
4855></TD
4856></TR
4857><TR
4858><TD
4859><A
4860HREF="#AEN4862"
4861>llWhisper</A
4862></TD
4863></TR
4864></TBODY
4865></TABLE
4866></DIV
4867><DIV
4868CLASS="table"
4869><A
4870NAME="AEN699"
4871></A
4872><P
4873><B
4874>Table 9-2. Messaging Functions</B
4875></P
4876><TABLE
4877BORDER="1"
4878CLASS="CALSTABLE"
4879><COL><THEAD
4880><TR
4881><TH
4882>Function</TH
4883></TR
4884></THEAD
4885><TBODY
4886><TR
4887><TD
4888><A
4889HREF="#AEN1533"
4890>llEmail</A
4891></TD
4892></TR
4893><TR
4894><TD
4895><A
4896HREF="#AEN1933"
4897>llGetNextEmail</A
4898></TD
4899></TR
4900><TR
4901><TD
4902><A
4903HREF="#AEN2431"
4904>llInstantMessage</A
4905></TD
4906></TR
4907></TBODY
4908></TABLE
4909></DIV
4910></DIV
4911></DIV
4912><DIV
4913CLASS="chapter"
4914><HR><H1
4915><A
4916NAME="AEN715"
4917></A
4918>Chapter 10. Inventory</H1
4919><DIV
4920CLASS="section"
4921><H2
4922CLASS="section"
4923><A
4924NAME="AEN717"
4925>10.1. Tables of Functions</A
4926></H2
4927><DIV
4928CLASS="table"
4929><A
4930NAME="AEN719"
4931></A
4932><P
4933><B
4934>Table 10-1. Inventory Functions</B
4935></P
4936><TABLE
4937BORDER="1"
4938CLASS="CALSTABLE"
4939><COL><THEAD
4940><TR
4941><TH
4942>Function</TH
4943></TR
4944></THEAD
4945><TBODY
4946><TR
4947><TD
4948><A
4949HREF="#AEN1047"
4950>llAllowInventoryDrop</A
4951></TD
4952></TR
4953><TR
4954><TD
4955><A
4956HREF="#AEN1754"
4957>llGetInventoryCreator</A
4958></TD
4959></TR
4960><TR
4961><TD
4962><A
4963HREF="#AEN1764"
4964>llGetInventoryKey</A
4965></TD
4966></TR
4967><TR
4968><TD
4969><A
4970HREF="#AEN1774"
4971>llGetInventoryName</A
4972></TD
4973></TR
4974><TR
4975><TD
4976><A
4977HREF="#AEN1816"
4978>llGetInventoryType</A
4979></TD
4980></TR
4981><TR
4982><TD
4983><A
4984HREF="#AEN1789"
4985>llGetInventoryNumber</A
4986></TD
4987></TR
4988><TR
4989><TD
4990><A
4991HREF="#AEN1801"
4992>llGetInventoryPermMask</A
4993></TD
4994></TR
4995><TR
4996><TD
4997><A
4998HREF="#AEN1946"
4999>llGetNotecardLine</A
5000></TD
5001></TR
5002><TR
5003><TD
5004><A
5005HREF="#AEN2314"
5006>llGiveInventory</A
5007></TD
5008></TR
5009><TR
5010><TD
5011><A
5012HREF="#AEN2326"
5013>llGiveInventoryList</A
5014></TD
5015></TR
5016><TR
5017><TD
5018><A
5019HREF="#AEN3325"
5020>llRemoveInventory</A
5021></TD
5022></TR
5023><TR
5024><TD
5025><A
5026HREF="#AEN3363"
5027>llRequestInventoryData</A
5028></TD
5029></TR
5030><TR
5031><TD
5032><A
5033HREF="#AEN3461"
5034>llRezObject</A
5035></TD
5036></TR
5037><TR
5038><TD
5039><A
5040HREF="#AEN3434"
5041>llRezAtRoot</A
5042></TD
5043></TR
5044></TBODY
5045></TABLE
5046></DIV
5047></DIV
5048></DIV
5049><DIV
5050CLASS="chapter"
5051><HR><H1
5052><A
5053NAME="AEN768"
5054></A
5055>Chapter 11. Vehicles</H1
5056><P
5057>Custom Vehicles can be constructed and controlled using the LSL.
5058 This chapter will cover the basics of how vehicles work, the
5059 terms used when describing vehicles, and a more thorough examination
5060 of the api available.</P
5061><P
5062>There are several ways to make scripted objects move
5063 themselves around. One way is to turn the object into a
5064 "vehicle". This feature is versatile enough to make things
5065 that slide, hover, fly, and float. Some of the behaviors that can be
5066 enabled are:</P
5067><P
5068><P
5069></P
5070><UL
5071><LI
5072STYLE="list-style-type: opencircle"
5073><P
5074>deflection of linear and angular velocity to
5075 preferred axis of motion</P
5076></LI
5077><LI
5078STYLE="list-style-type: opencircle"
5079><P
5080>&#13; <A
5081HREF="#AEN956"
5082>asymmetric linear
5083 and angular friction</A
5084></P
5085></LI
5086><LI
5087STYLE="list-style-type: opencircle"
5088><P
5089>&#13; <A
5090HREF="#AEN979"
5091>hovering</A
5092> over terrain/water or
5093 at a global height</P
5094></LI
5095><LI
5096STYLE="list-style-type: opencircle"
5097><P
5098>&#13; <A
5099HREF="#AEN949"
5100>banking</A
5101> on turns
5102 </P
5103></LI
5104><LI
5105STYLE="list-style-type: opencircle"
5106><P
5107>&#13; <A
5108HREF="#AEN866"
5109>linear</A
5110> and
5111 <A
5112HREF="#AEN898"
5113>angular</A
5114> motor for
5115 <A
5116HREF="#AEN853"
5117>push and turning</A
5118>
5119 </P
5120></LI
5121></UL
5122></P
5123><DIV
5124CLASS="section"
5125><HR><H2
5126CLASS="section"
5127><A
5128NAME="AEN790"
5129>11.1. Overview</A
5130></H2
5131><P
5132>Each scripted object can have one vehicle behavior that is
5133 configurable through the <A
5134HREF="#AEN4249"
5135>llSetVehicleType</A
5136>, <A
5137HREF="#AEN4235"
5138>llSetVehicleFloatParam</A
5139>,
5140 <A
5141HREF="#AEN4274"
5142>llSetVehicleVectorParam</A
5143>,
5144 <A
5145HREF="#AEN4260"
5146>llSetVehicleRotationParam</A
5147>,
5148 <A
5149HREF="#AEN4224"
5150>llSetVehicleFlags</A
5151>,
5152 and <A
5153HREF="#AEN3335"
5154>llRemoveVehicleFlags</A
5155>
5156 library calls.</P
5157><P
5158>These script calls are described in more detail below, but
5159 the important thing to notice here is that the vehicle behavior
5160 has several parameters that can be adjusted to change how the
5161 vehicle handles. Depending on the values chosen the vehicle can
5162 veer like a boat in water, or ride like a sled on rails.</P
5163><P
5164>Setting the vehicle flags allow you to make exceptions to
5165 some default behaviors. Some of these flags only have an effect
5166 when certain behaviors are enabled. For example, the
5167 VEHICLE_FLAG_HOVER_WATER_ONLY will make the vehicle ignore the
5168 height of the terrain, however it only makes a difference if the
5169 vehicle is hovering.</P
5170></DIV
5171><DIV
5172CLASS="section"
5173><HR><H2
5174CLASS="section"
5175><A
5176NAME="AEN801"
5177>11.2. Warnings</A
5178></H2
5179><P
5180>Vehicles are a work in progress and will
5181 likely experience changes in future versions of Second Life.
5182 Some of the details of vehicle behavior may be changed
5183 as necessary to ensure stability
5184 and user safety. In particular, many of the limits and defaults
5185 described in the appendices will probably change and should not be
5186 relied upon in the long term.</P
5187><P
5188>It is not recommended that you mix vehicle behavior with
5189 some of the other script calls that provide impulse and forces to
5190 the object, especially <A
5191HREF="#AEN3773"
5192>llSetBuoyancy</A
5193>, <A
5194HREF="#AEN3841"
5195>llSetForce</A
5196>, <A
5197HREF="#AEN4200"
5198>llSetTorque</A
5199>, and <A
5200HREF="#AEN3872"
5201>llSetHoverHeight</A
5202>.</P
5203><P
5204>While the following methods probably don't cause any
5205 instabilities, their behavior may conflict with vehicles and cause
5206 undesired and/or inconsistent results, so use <A
5207HREF="#AEN2753"
5208>llLookAt</A
5209>, <A
5210HREF="#AEN3559"
5211>llRotLookAt</A
5212>, <A
5213HREF="#AEN2980"
5214>llMoveToTarget</A
5215>, and <A
5216HREF="#AEN4701"
5217>llTargetOmega</A
5218> at your own
5219 risk.</P
5220><P
5221>If you think you have found a bug relating to how vehicle's
5222 work, one way to submit the problem is to give a copy of the
5223 vehicle and script to Andrew Linden with comments or a notecard
5224 describing the problem. Please name all submissions "Bugged
5225 Vehicle XX" where XX are your Second Life initials. The
5226 vehicle and script will be examined at the earliest
5227 convenience.</P
5228></DIV
5229><DIV
5230CLASS="section"
5231><HR><H2
5232CLASS="section"
5233><A
5234NAME="AEN815"
5235>11.3. Definitions</A
5236></H2
5237><P
5238>&#13; The terms "roll", "pitch", and
5239 "yaw" are often used to describe the modes of rotations
5240 that can happen to a airplane or boat. They correspond to
5241 rotations about the local x-, y-, and z-axis respectively.</P
5242><P
5243><DIV
5244CLASS="informalexample"
5245><P
5246></P
5247><A
5248NAME="AEN819"
5249></A
5250><PRE
5251CLASS="programlisting"
5252>&#13; z-axis .
5253 yaw-axis /|\
5254 | __. y-axis
5255 ._ ___| /| pitch-axis
5256 _||\ \\ |\. /
5257 \|| \_______\_|__\_/_______
5258 | _ _ o o o o o o o |\_ ______\ x-axis
5259 // ./_______,----,__________) / roll-axis
5260 /_,/ // ./
5261 /__,/
5262 </PRE
5263><P
5264></P
5265></DIV
5266></P
5267><P
5268>&#13; The right-hand-rule, often introduced in beginning physics
5269 courses, is used to define the direction of positive rotation
5270 about any axis. As an example of how to use the right hand rule,
5271 consider a positive rotation about the roll axis. To help
5272 visualize how such a rotation would move the airplane, place your
5273 right thumb parallel to the plane's roll-axis such that the thumb
5274 points in the positive x-direction, then curl the four fingers
5275 into a fist. Your fingers will be pointing in the direction that
5276 the plane will spin.</P
5277><P
5278><DIV
5279CLASS="informalexample"
5280><P
5281></P
5282><A
5283NAME="AEN823"
5284></A
5285><PRE
5286CLASS="programlisting"
5287>&#13; .-.--.--.--. __
5288 / / / / _ \ / \
5289 (-(- (- (- ( | _________|______\ axis of
5290 \.\._\._\._) | | / rotation
5291 | \:__,---. \|/
5292 | | + positive
5293 \ .,_.___.' rotation
5294 \_ ^ `.__,/
5295 | /
5296 | |
5297 </PRE
5298><P
5299></P
5300></DIV
5301></P
5302><P
5303>&#13; Many of the parameters that control a vehicle's behavior are
5304 of the form: VEHICLE_BEHAVIOR_TIMESCALE. A behavior's
5305 "timescale" can usually be understood as the time for
5306 the behavior to push, twist, or otherwise affect the vehicle such
5307 that the difference between what it is doing, and what it is
5308 supposed to be doing, has been reduced to 1/e of what it was,
5309 where "e" is the natural exponent (approximately
5310 2.718281828). In other words, it is the timescale for exponential
5311 decay toward full compliance to the desired behavior. When you
5312 want the vehicle to be very responsive use a short timescale of
5313 one second or less, and if you want to disable a behavior then set
5314 the timescale to a very large number like 300 (5 minutes) or
5315 more. Note, for stability reasons, there is usually a limit to how
5316 small a timescale is allowed to be, and is usually on the order of
5317 a tenth of a second. Setting a timescale to zero is safe and is
5318 always equivalent to setting it to its minimum. Any feature with a
5319 timescale can be effectively disabled by setting the timescale so
5320 large that it would take them all day to have any
5321 effect.</P
5322></DIV
5323><DIV
5324CLASS="section"
5325><HR><H2
5326CLASS="section"
5327><A
5328NAME="AEN826"
5329>11.4. Setting the Vehicle Type</A
5330></H2
5331><P
5332>Before any vehicle parameters can be set the vehicle
5333 behavior must first be enabled. It is enabled by calling <A
5334HREF="#AEN4249"
5335>llSetVehicleType</A
5336> with any
5337 VEHICLE_TYPE_*, except VEHICLE_TYPE_NONE which will disable the
5338 vehicle. See the <A
5339HREF="#AEN6288"
5340>vehicle type
5341 constants</A
5342> section for currently available types. More types
5343 will be available soon.</P
5344><P
5345>Setting the vehicle type is necessary for enabling the
5346 vehicle behavior and sets all of the parameters to its default
5347 values. For each vehicle type listed we provide the corresponding
5348 equivalent code in long format. Is is
5349 <SPAN
5350CLASS="emphasis"
5351><I
5352CLASS="emphasis"
5353>important</I
5354></SPAN
5355> to realize that the defaults are
5356 <SPAN
5357CLASS="emphasis"
5358><I
5359CLASS="emphasis"
5360>not</I
5361></SPAN
5362> the optimal settings for any of these
5363 vehicle types and that they will definitely be changed in the
5364 future. Do not rely on these values to be constant until
5365 specified.</P
5366><P
5367>Should you want to make a unique or experimental vehicle you
5368 will still have to enable the vehicle behavior with one of the
5369 default types first, after which you will be able to change any of
5370 the parameters or flags within the allowed ranges.</P
5371><P
5372>Setting the vehicle type does not automatically take
5373 controls or otherwise move the object. However should you enable
5374 the vehicle behavior while the object is free to move and parked
5375 on a hill then it may start to slide away.</P
5376><P
5377>We're looking for new and better default vehicle types. If
5378 you think you've found a set of parameters that make a better car,
5379 boat, or any other default type of vehicle then you may submit
5380 your proposed list of settings to Andrew Linden via a script or
5381 notecard.</P
5382></DIV
5383><DIV
5384CLASS="section"
5385><HR><H2
5386CLASS="section"
5387><A
5388NAME="AEN837"
5389>11.5. Linear and Angular Deflection</A
5390></H2
5391><P
5392>A common feature of real vehicles is their tendency to move
5393 along "preferred axes of motion". That is, due to
5394 their wheels, wings, shape, or method of propulsion they tend to
5395 push or redirect themselves along axes that are static in the
5396 vehicle's local frame. This general feature defines a
5397 class of vehicles and included in this category a common
5398 dart is a "vehicle": it
5399 has fins in the back such that if it were to tumble in the air it
5400 would eventually align itself to move point-forward -- we'll call
5401 this alignment effect <SPAN
5402CLASS="emphasis"
5403><I
5404CLASS="emphasis"
5405>angular
5406 deflection</I
5407></SPAN
5408>.</P
5409><P
5410>A wheeled craft exhibits a
5411 different effect: when a
5412 skateboard is pushed in some direction it will tend to redirect
5413 the resultant motion along that which it is free to roll -- we'll
5414 call this effect <SPAN
5415CLASS="emphasis"
5416><I
5417CLASS="emphasis"
5418>&#13; linear deflection</I
5419></SPAN
5420>.</P
5421><P
5422>So a typical Second Life vehicle is an object that
5423 exhibits linear and/or angular deflection along the
5424 "preferential axes of motion". The default
5425 preferential axes of motion are the local x- (at), y- (left), and
5426 z- (up) axes of the <SPAN
5427CLASS="emphasis"
5428><I
5429CLASS="emphasis"
5430>local frame</I
5431></SPAN
5432> of the
5433 vehicle's root primitive. The deflection behaviors relate to the
5434 x-axis (at): linear deflection will tend to rotate its velocity
5435 until it points along it's positive local x-axis while the
5436 angular deflection will tend to reorient the vehicle such that
5437 it's x-axis points in the direction that it is moving. The other
5438 axes are relevant to vehicle behaviors that are described later,
5439 such as the
5440 <A
5441HREF="#AEN938"
5442>vertical attractor</A
5443>
5444 which tries to keep a vehicle's
5445 local z-axis pointed toward the world z-axis (up). The vehicle
5446 axes can be rotated relative to the object's actual local axes by
5447 using the
5448 <A
5449HREF="#AEN990"
5450>VEHICLE_REFERENCE_FRAME</A
5451>
5452 parameter, however that is an
5453 advanced feature and is covered in detail in a later section of
5454 these documents.</P
5455><P
5456>Depending on the vehicle it might be desirable to have lots
5457 of linear and/or angular deflection or not. The speed of the
5458 deflections are controlled by setting the relevant parameters
5459 using the <A
5460HREF="#AEN4235"
5461>llSetVehicleFloatParam</A
5462>
5463 script call. Each variety of deflection has a
5464 "timescale" parameter that determines how quickly a
5465 full deflection happens. Basically the timescale it the time
5466 coefficient for exponential decay toward full deflection. So, a
5467 vehicle that deflects quickly should have a small timescale. For
5468 instance, a typical dart might have a angular deflection
5469 timescale of a couple of seconds but a linear deflection of
5470 several seconds; it will tend to reorient itself before it
5471 changes direction. To set the deflection timescales of a dart
5472 you might use the lines below:</P
5473><P
5474><DIV
5475CLASS="informalexample"
5476><P
5477></P
5478><A
5479NAME="AEN850"
5480></A
5481><PRE
5482CLASS="programlisting"
5483>&#13;llSetVehicleFloatParam(VEHICLE_ANGULAR_DEFLECTION_TIMESCALE, 2.0);
5484llSetVehicleFloatParam(VEHICLE_LINEAR_DEFLECTION_TIMESCALE, 6.0);
5485 </PRE
5486><P
5487></P
5488></DIV
5489></P
5490><P
5491> Each variety of deflection has an "efficiency"
5492 parameter that is a slider between 0.0 and 1.0. Unlike the other
5493 efficiency parameters of other vehicle behaviors, the deflection
5494 efficiencies do not slide between "bouncy" and
5495 "damped", but instead slide from "no deflection
5496 whatsoever" (0.0) to "maximum deflection" (1.0).
5497 That is, they behave much like the deflection timescales, however
5498 they are normalized to the range between 0.0 and 1.0.</P
5499></DIV
5500><DIV
5501CLASS="section"
5502><HR><H2
5503CLASS="section"
5504><A
5505NAME="AEN853"
5506>11.6. Moving and Steering the Vehicle</A
5507></H2
5508><P
5509>Once enabled, a vehicle can be pushed and rotated by
5510 external forces and/or from script calls such as
5511 <A
5512HREF="#AEN1070"
5513>llApplyImpulse</A
5514>,
5515 however linear and angular motors have been built in
5516 to make motion smoother and easier to control.
5517 Their directions can be set using the
5518 <A
5519HREF="#AEN4274"
5520>llSetVehicleVectorParam</A
5521>
5522 call. For example, to make the vehicle try to move at 5
5523 meters/second along its local x-axis (the default look-at
5524 direction) you would put the following line in your script:</P
5525><P
5526><DIV
5527CLASS="informalexample"
5528><P
5529></P
5530><A
5531NAME="AEN859"
5532></A
5533><PRE
5534CLASS="programlisting"
5535>&#13;llSetVehicleVectorParam(VEHICLE_LINEAR_MOTOR_DIRECTION, &#60;5, 0, 0&#62;);
5536 </PRE
5537><P
5538></P
5539></DIV
5540></P
5541><P
5542>The motor strength is not the full story, since you can also
5543 control how fast the motor engages (VEHICLE_LINEAR_MOTOR_TIMESCALE)
5544 and there is a parameter that causes the motor's effectiveness to
5545 decay over time (VEHICLE_LINEAR_MOTOR_DECAY_TIMESCALE).</P
5546><P
5547>Steering the vehicle involves setting the
5548 VEHICLE_ANGULAR_MOTOR_DIRECTION and related parameters.
5549 It is also possible to set some flags that allow the angular
5550 motor slave to your camera view when in mouselook.</P
5551><P
5552>For more details about the vehicle motors
5553 read the sections on the <A
5554HREF="#AEN866"
5555>linear
5556 </A
5557> and <A
5558HREF="#AEN898"
5559>angular</A
5560>
5561 motors below.</P
5562></DIV
5563><DIV
5564CLASS="section"
5565><HR><H2
5566CLASS="section"
5567><A
5568NAME="AEN866"
5569>11.7. The Linear Motor</A
5570></H2
5571><P
5572>The parameters that control the linear motor are:</P
5573><P
5574><P
5575></P
5576><UL
5577><LI
5578STYLE="list-style-type: opencircle"
5579><P
5580>&#13; VEHICLE_LINEAR_MOTOR_DIRECTION</P
5581><P
5582>A vector.
5583 It is the velocity (meters/sec) that the vehicle will
5584 try to attain. It points in the vehicle's local frame, and has a
5585 maximum length of 40.</P
5586></LI
5587><LI
5588STYLE="list-style-type: opencircle"
5589><P
5590>&#13; VEHICLE_LINEAR_MOTOR_OFFSET</P
5591><P
5592>A vector.
5593 It is the offset point from the vehicle's center of mass at which
5594 the linear motor's impulse is applied. This allows the linear motor
5595 to also cause rotational torque. It is in the vehicle's local
5596 frame and its maximum length is 100 meters! No need to worry
5597 about stability -- if the vehicle starts to spin too fast
5598 (greater than about 4*PI radians per second) then angular
5599 velocity damping will kick in. The reason the offset is allowed
5600 to be so large is so that it can compete with the other vehicle
5601 behaviors such as <A
5602HREF="#vehicle_angular_deflection"
5603>angular deflection</A
5604>
5605 and the <A
5606HREF="#AEN938"
5607>vertical
5608 attractor</A
5609>. Some of the other vehicle behaviors may
5610 drastically reduce the effective torque from the linear motor
5611 offset, in which case a longer leverage arm may help.</P
5612></LI
5613><LI
5614STYLE="list-style-type: opencircle"
5615><P
5616>&#13; VEHICLE_LINEAR_MOTOR_TIMESCALE</P
5617><P
5618>A float. Determines how long it takes for the motor to
5619 push the vehicle to full speed. Its minimum value is approximately
5620 0.06 seconds.</P
5621></LI
5622><LI
5623STYLE="list-style-type: opencircle"
5624><P
5625>&#13; VEHICLE_LINEAR_MOTOR_DECAY_TIMESCALE</P
5626><P
5627>A float. The effectiveness of the motor will exponentially
5628 decay over this timescale, but the effectiveness will be reset
5629 whenever the motor's value is explicitly set. The maximum value
5630 of this decay timescale is 120 seconds,
5631 and this timescale is always in effect.</P
5632></LI
5633></UL
5634></P
5635><P
5636>The flags that affect the linear motor are:</P
5637><P
5638><P
5639></P
5640><UL
5641><LI
5642STYLE="list-style-type: opencircle"
5643><P
5644>VEHICLE_FLAG_LIMIT_MOTOR_UP</P
5645><P
5646>Useful for "ground vehicles".
5647 Setting this flag will clamp the z-component of the linear
5648 motor (in world frame) to prevent it from defeating gravity.</P
5649></LI
5650></UL
5651></P
5652><P
5653>Setting the motor speed is not enough to enable all
5654 interesting vehicles. For example, some will want a car that
5655 immediately gets up to the speed they want, while others will want
5656 a boat that slowly climbs up to its maximum velocity. To control
5657 this effect the VEHICLE_LINEAR_MOTOR_TIMESCALE parameter can be
5658 used. Basically the "timescale" of a motor is the
5659 time constant for the vehicle to exponentially accelerate toward
5660 its full speed.</P
5661><P
5662>What would happen if you were to accidentally set the
5663 vehicle's linear velocity to maximum possible speed and then let
5664 go? It would run away and never stop, right? Not necessarily: an
5665 automatic "motor decay" has been built in such that all
5666 motors will gradually decrease their effectiveness after being
5667 set.</P
5668><P
5669>Each time the linear motor's vector is set its
5670 "grip"
5671 immediately starts to decay exponentially with a timescale
5672 determined by the VEHICLE_LINEAR_MOTOR_DECAY_TIMESCALE, such
5673 that after enough time the motor ceases to have any effect.
5674 This decay timescale serves two purposes. First, since it
5675 <SPAN
5676CLASS="emphasis"
5677><I
5678CLASS="emphasis"
5679>cannot</I
5680></SPAN
5681> be set longer than 120 seconds,
5682 and is <SPAN
5683CLASS="emphasis"
5684><I
5685CLASS="emphasis"
5686>always</I
5687></SPAN
5688> enabled it
5689 guarantees that a vehicle will not push itself about forever
5690 in the absence
5691 of active control (from keyboard commands or some logic loop in
5692 the script). Second, it can be used to push some vehicles around
5693 using a simple impulse model. That is, rather than setting the
5694 motor "on" or "off" depending on whether
5695 a particular key is pressed "down" or "up"
5696 the decay timescale can be set short and the motor can be set
5697 "on" whenever the key transitions from "up"
5698 to "down" and allowed to automatically decay.</P
5699><P
5700> Since the motor's effectiveness is reset whenever the
5701 motor's vector is set, then setting it to a vector of length zero
5702 is different from allowing it to decay completely. The first case
5703 will cause the vehicle to try to reach zero velocity, while the
5704 second will leave the motor impotent.</P
5705><P
5706>The two motor timescales have very similar names, but have
5707 different effects, so try not to get them confused.
5708 VEHICLE_LINEAR_MOTOR_TIMESCALE is the time for motor to
5709 "win", and VEHICLE_LINEAR_MOTOR_DECAY_TIMESCALE is the
5710 time for the motor's "effectiveness" to decay toward
5711 zero. If you set one when you think you are changing the other
5712 you will have frustrating results. Also, if the motor's decay
5713 timescale is shorter than the regular timescale, then the
5714 effective magnitude of the motor vector will be
5715 diminished.</P
5716></DIV
5717><DIV
5718CLASS="section"
5719><HR><H2
5720CLASS="section"
5721><A
5722NAME="AEN898"
5723>11.8. The Angular Motor</A
5724></H2
5725><P
5726>The parameters that control the angular motor are:</P
5727><P
5728><P
5729></P
5730><UL
5731><LI
5732STYLE="list-style-type: opencircle"
5733><P
5734>&#13; VEHICLE_ANGULAR_MOTOR_DIRECTION</P
5735><P
5736>A vector. It is the angular velocity (radians/sec)
5737 that the vehicle will try to rotate. It points in the vehicle's
5738 local frame, and has a maximum value of 4*PI (two revolutions
5739 per second).</P
5740></LI
5741><LI
5742STYLE="list-style-type: opencircle"
5743><P
5744>&#13; VEHICLE_ANGULAR_MOTOR_TIMESCALE</P
5745><P
5746>A float. Determines how long it takes for the motor to
5747 spin the vehicle to full speed. Its minimum value is approximately
5748 0.06 seconds.</P
5749></LI
5750><LI
5751STYLE="list-style-type: opencircle"
5752><P
5753>&#13; VEHICLE_ANGULAR_MOTOR_DECAY_TIMESCALE</P
5754><P
5755>A float. The effectiveness of the motor will exponentially
5756 decay over this timescale, but the effectiveness will be reset
5757 whenever the motor's value is explicitly set. The maximum value
5758 of this decay timescale is 120 seconds,
5759 and this timescale is always in effect.</P
5760></LI
5761></UL
5762></P
5763><P
5764>Like the linear motor the angular motor can be set explicitly,
5765 and has magnitude/direction, a timescale, and a decay timescale. </P
5766><P
5767>When it comes to actually steering a vehicle there are
5768 several ways to do it. One way would be for the script to grab
5769 keyboard input and to explicitly turn the motor on/off based on
5770 which keys are pressed. When steering this way you probably
5771 don't want it to turn very far or for very long. One way to do
5772 it using the angular motor would be to leave the decay timescale
5773 long, enable a significant amount of angular friction (to
5774 quickly slow the vehicle down when the motor is turned off) then
5775 set the angular motor to a large vector on a key press, and set
5776 it to zero when the key is released. That has the effect of
5777 making the vehicle unresponsive to external collisions, due to
5778 the angular friction.</P
5779><P
5780>Another way to do it is to set the
5781 VEHICLE_ANGULAR_MOTOR_DECAY_TIMESCALE to a short value and push
5782 the vehicle about with a more impulsive method that sets the
5783 motor fast on a key press down (and optionally setting the motor
5784 to zero on a key up) relying on the automatic exponential decay
5785 of the motor's effectiveness rather than a constant angular
5786 friction.</P
5787><P
5788>Finally, it may be possible to discard the angular motor
5789 entirely and use the VEHICLE_LINEAR_MOTOR_OFFSET. Whenever the
5790 offset has a component that is perpendicular to the direction
5791 of the linear motor the vehicle will rotate as it travels.
5792 Note, with the incorrect values for offset and strength the
5793 linear motor effect can easily cause the vehicle to tumble
5794 and spin uncontrollably, so experiement with small offsets
5795 first!.</P
5796><P
5797>Setting the angular motor to zero magnitude is different
5798 from allowing it to decay. When the motor completely decays
5799 it no longer affects the motion of the vehicle, however setting
5800 it to zero will reset the "grip" of the vehicle and
5801 will make the vehicle try to achieve zero angular velocity.
5802 </P
5803><P
5804>Many real vehicles bank (roll about their
5805 forward axis) to effect a turn, such as motorcycles and airplanes.
5806 To make it easier to build banking vehicles there is
5807 <A
5808HREF="#AEN949"
5809>banking behavior</A
5810>
5811 available which can be controlled by setting other parameters and is
5812 described in more detail here.</P
5813><P
5814>It is also possible to make a
5815 <A
5816HREF="#AEN921"
5817>vehicle turn in response
5818 to changing the camera view</A
5819>
5820 (right now this only works in mouselook).</P
5821></DIV
5822><DIV
5823CLASS="section"
5824><HR><H2
5825CLASS="section"
5826><A
5827NAME="AEN921"
5828>11.9. Using the Camera to Steer</A
5829></H2
5830><P
5831>The vehicle can be instructed to rotate its forward axis
5832 to point in the same direction as the camera view. This
5833 is achieved by setting some flags that change how the
5834 VEHICLE_ANGULAR_MOTOR_DIRECTION is interpreted. When used properly
5835 this feature has the advantage of being able to provide simple
5836 and stable steering that is resilient to bad render frame rates
5837 on the client. </P
5838><P
5839>The flags that affect the angular motor are:</P
5840><P
5841><P
5842></P
5843><UL
5844><LI
5845STYLE="list-style-type: opencircle"
5846><P
5847>&#13; VEHICLE_FLAG_MOUSELOOK_STEER</P
5848><P
5849>Steer the vehicle using the mouse. Use this flag to make
5850 the angular motor try to make the vehicle
5851 turn such that its local x-axis points in the same direction as
5852 the client-side camera.</P
5853></LI
5854><LI
5855STYLE="list-style-type: opencircle"
5856><P
5857>&#13; VEHICLE_FLAG_MOUSELOOK_BANK</P
5858><P
5859>Same as above, but relies on banking. It remaps left-right
5860 motions of the client camera (also known as "yaw") to rotations about
5861 the vehicle's local x-axis (also known as "roll"). </P
5862></LI
5863><LI
5864STYLE="list-style-type: opencircle"
5865><P
5866>&#13; VEHICLE_FLAG_CAMERA_DECOUPLED</P
5867><P
5868>Makes mouselook camera rotate independently of the vehicle.
5869 By default the client mouselook camera will rotate about
5870 with the vehicle, however when this flag is set the camera
5871 direction is independent of the vehicle's rotation.</P
5872></LI
5873></UL
5874></P
5875><P
5876>When using the VEHICLE_FLAG_MOUSELOOK_STEER (or
5877 VEHICLE_FLAG_MOUSELOOK_BANK) the meaning of the
5878 VEHICLE_ANGULAR_MOTOR_DIRECTION parameter subtly changes. Instead
5879 of representing the "angular velocity" of the motor
5880 the components of the parameter scale the "measured angular
5881 velocity" (as determined by the rotation between
5882 the client's camera view direction and the forward-axis of the vehicle)
5883 to compute the "final angular velocity". That is,
5884 suppose you set the angular motor to &#60;0, 0, 5&#62;, then moved the
5885 camera view to be PI/4 radians to the left of the vehicle's forward axis,
5886 and down PI/8 toward the ground.
5887 The measured angular velocity would be &#60;0, -PI/8, PI/4&#62;
5888 radians/second, but the final velocity would be &#60;0, 0, 5*PI/4&#62;...
5889 the vehicle will turn left, but will not dip its nose down.
5890 Thus, by setting a component of the VEHICLE_ANGULAR_MOTOR_DIRECTION
5891 to zero, one can negate the pitch or yaw response of the motor,
5892 or even scale one to be much more responsive than the other.
5893 </P
5894><P
5895>The VEHICLE_ANGULAR_MOTOR_TIMESCALE still has an effect when
5896 using mouselook control, and scales the global responsiveness of the
5897 angular motor. The VEHICLE_ANGULAR_MOTOR_DECAY_TIMESCALE, on the other
5898 hand, is ignored when using mouselook controls.</P
5899></DIV
5900><DIV
5901CLASS="section"
5902><HR><H2
5903CLASS="section"
5904><A
5905NAME="AEN938"
5906>11.10. The Vertical Attractor</A
5907></H2
5908><P
5909>Some vehicles, like boats, should always keep their up-side
5910 up. This can be done by enabling the "vertical
5911 attractor" behavior that springs the vehicle's local z-axis
5912 to the world z-axis (a.k.a. "up"). To take advantage of
5913 this feature you would set the VEHICLE_VERTICAL_ATTRACTION_TIMESCALE
5914 to control the period of the spring frequency, and then set the
5915 VEHICLE_VERTICAL_ATTRACTION_EFFICIENCY to control the damping. An
5916 efficiency of 0.0 will cause the spring to wobble around its
5917 equilibrium, while an efficiency of 1.0 will cause the spring to
5918 reach it's equilibrium with exponential decay.</P
5919><P
5920><DIV
5921CLASS="informalexample"
5922><P
5923></P
5924><A
5925NAME="AEN942"
5926></A
5927><PRE
5928CLASS="programlisting"
5929>&#13;llSetVehicleVectorParam(VEHICLE_VERTICAL_ATTRACTION_TIMESCALE, 4.0);
5930llSetVehicleVectorParam(VEHICLE_VERTICAL_ATTRACTION_EFFICIENCY, 0.5);
5931 </PRE
5932><P
5933></P
5934></DIV
5935></P
5936><P
5937>The vertical attractor is disabled by setting its timescale
5938 to anything larger than 300 seconds.</P
5939><P
5940>Note that by default the vertical attractor will prevent the
5941 vehicle from diving and climbing. So, if you wanted to make a
5942 airplane you would probably want to unlock the attractor around the
5943 pitch axis by setting the VEHICLE_FLAG_LIMIT_ROLL_ONLY bit:</P
5944><P
5945><DIV
5946CLASS="informalexample"
5947><P
5948></P
5949><A
5950NAME="AEN947"
5951></A
5952><PRE
5953CLASS="programlisting"
5954>&#13;llSetVehicleFlags(VEHICLE_FLAG_LIMIT_ROLL_ONLY);
5955 </PRE
5956><P
5957></P
5958></DIV
5959></P
5960></DIV
5961><DIV
5962CLASS="section"
5963><HR><H2
5964CLASS="section"
5965><A
5966NAME="AEN949"
5967>11.11. Banking</A
5968></H2
5969><P
5970>The <A
5971HREF="#AEN938"
5972>&#13; vertical attractor</A
5973> feature must be enabled in order for
5974 the banking behavior to function. The way banking works is this: a
5975 rotation around the vehicle's roll-axis will produce a angular
5976 velocity around the yaw-axis, causing the vehicle to turn. The
5977 magnitude of the yaw effect will be proportional to the
5978 VEHICLE_BANKING_EFFICIENCY, the angle of the roll rotation, and
5979 sometimes the vehicle's velocity along it's preferred axis of
5980 motion.</P
5981><P
5982>The VEHICLE_BANKING_EFFICIENCY can vary between -1 and +1. When
5983 it's positive then any positive rotation (by the right-hand rule)
5984 about the roll-axis will effect a (negative) torque around the
5985 yaw-axis, making it turn to the right -- that is the vehicle will
5986 lean into the turn, which is how real airplanes and motorcycle's
5987 work. Negating the banking coefficient will make it so that the
5988 vehicle leans to the outside of the turn (not very
5989 "physical" but might allow interesting vehicles so why
5990 not?).</P
5991><P
5992>The VEHICLE_BANKING_MIX is a fake (i.e. non-physical)
5993 parameter that is useful for making banking vehicles do what you
5994 want rather than what the laws of physics allow. For example,
5995 consider a real motorcycle... it must be moving forward in order
5996 for it to turn while banking, however video-game motorcycles are
5997 often configured to turn in place when at a dead stop -- because
5998 they're often easier to control that way using the limited
5999 interface of the keyboard or game controller. The
6000 VEHICLE_BANKING_MIX enables combinations of both realistic and
6001 non-realistic banking by functioning as a slider between a banking
6002 that is correspondingly totally static (0.0) and totally dynamic
6003 (1.0). By "static" we mean that the banking effect
6004 depends only on the vehicle's rotation about it's roll-axis
6005 compared to "dynamic" where the banking is also
6006 proportional to it's velocity along it's roll-axis. Finding the
6007 best value of the "mixture" will probably require trial
6008 and error.</P
6009><P
6010>The time it takes for the
6011 banking behavior to defeat a
6012 pre-existing angular velocity about the world z-axis is determined
6013 by the VEHICLE_BANKING_TIMESCALE. So if you want the vehicle to
6014 bank quickly then give it a banking timescale of about a second or
6015 less, otherwise you can make a sluggish vehicle by giving it a
6016 timescale of several seconds.</P
6017></DIV
6018><DIV
6019CLASS="section"
6020><HR><H2
6021CLASS="section"
6022><A
6023NAME="AEN956"
6024>11.12. Friction Timescales</A
6025></H2
6026><P
6027>&#13; VEHICLE_LINEAR_FRICTION_TIMESCALE is a vector parameter that
6028 defines the timescales for the vehicle to come to a complete stop
6029 along the three local axes of the
6030 <A
6031HREF="#AEN990"
6032>vehicle's reference frame</A
6033>.
6034 The timescale along each axis is independent of the others.
6035 For example, a sliding ground car would probably have very little
6036 friction along its x- and z-axes (so it can easily slide forward
6037 and fall down) while there would usually significant friction
6038 along its y-axis:</P
6039><P
6040><DIV
6041CLASS="informalexample"
6042><P
6043></P
6044><A
6045NAME="AEN961"
6046></A
6047><PRE
6048CLASS="programlisting"
6049>&#13;llSetVehicleVectorParam(VEHICLE_LINEAR_FRICTION_TIMESCALE, &#60;1000, 1000, 3&#62;);
6050 </PRE
6051><P
6052></P
6053></DIV
6054></P
6055><P
6056>Remember that a longer timescale corresponds to a weaker
6057 friction, hence to effectively disable all linear friction you
6058 would set all of the timescales to large values.</P
6059><P
6060>Setting the linear friction as a scalar is allowed, and has
6061 the effect of setting all of the timescales to the same
6062 value. Both code snippets below are equivalent, and both make friction
6063 negligible:</P
6064><P
6065><DIV
6066CLASS="informalexample"
6067><P
6068></P
6069><A
6070NAME="AEN966"
6071></A
6072><PRE
6073CLASS="programlisting"
6074>&#13;// set all linear friction timescales to 1000
6075llSetVehicleVectorParam(VEHICLE_LINEAR_FRICTION_TIMESCALE, &#60;1000, 1000, 1000&#62;);
6076 </PRE
6077><P
6078></P
6079></DIV
6080></P
6081><P
6082><DIV
6083CLASS="informalexample"
6084><P
6085></P
6086><A
6087NAME="AEN969"
6088></A
6089><PRE
6090CLASS="programlisting"
6091>&#13;// same as above, but fewer characters
6092llSetVehicleFloatParam(VEHICLE_LINEAR_FRICTION_TIMESCALE, 1000);
6093 </PRE
6094><P
6095></P
6096></DIV
6097></P
6098><P
6099>&#13; VEHICLE_ANGULAR_FRICTION_TIMESCALE is also a vector
6100 parameter that defines the timescales for the vehicle to stop
6101 rotating about the x-, y-, and z-axes, and are set and disabled in
6102 the same way as the linear friction.</P
6103></DIV
6104><DIV
6105CLASS="section"
6106><HR><H2
6107CLASS="section"
6108><A
6109NAME="AEN972"
6110>11.13. Buoyancy</A
6111></H2
6112><P
6113>The vehicle has a built-in buoyancy feature that is
6114 independent of the <A
6115HREF="#AEN3773"
6116>llSetBuoyancy</A
6117> call. It
6118 is recommended that the two buoyancies do not mix! To make
6119 a vehicle buoyant, set the VEHICLE_BUOYANCY parameter to something
6120 between -1.0 (extra gravity) to 1.0 (full anti-gravity).
6121 </P
6122><P
6123>The buoyancy behavior is independent of hover, however
6124 in order for hover to work without a large offset of the
6125 VEHICLE_HOVER_HEIGHT, the VEHICLE_BUOYANCY should be set to 1.0.
6126 </P
6127><P
6128>It is not recommended that you mix vehicle buoyancy with
6129 the <A
6130HREF="#AEN3773"
6131>llSetBuoyancy</A
6132> script call.
6133 It would probably cause the object to fly up into space.</P
6134></DIV
6135><DIV
6136CLASS="section"
6137><HR><H2
6138CLASS="section"
6139><A
6140NAME="AEN979"
6141>11.14. Hover</A
6142></H2
6143><P
6144>The hover behavior is enabled by setting the
6145 VEHICLE_HOVER_TIMESCALE to a value less than 300 seconds; larger
6146 timescales totally disable it. Most vehicles will work
6147 best with short hover timescales of a few seconds or less.
6148 The shorter the timescale, the faster the vehicle will
6149 slave to is target height. Note, that if the values of
6150 VEHICLE_LINEAR_FRICTION_TIMESCALE may affect the speed of
6151 the hover.</P
6152><P
6153>Hover is independent of buoyancy, however the
6154 VEHICLE_BUOYANCY should be set to 1.0, otherwise the vehicle
6155 will not lift itself off of the ground until the
6156 VEHICLE_HOVER_HEIGHT is made large enough to counter the
6157 acceleration of gravity, and the vehicle will never float
6158 all the way to its target height. </P
6159><P
6160>The VEHICLE_HOVER_EFFICIENCY can be thought of as a slider
6161 between bouncy (0.0) and smoothed (1.0). When in the
6162 bouncy range the vehicle will tend to hover a little lower than
6163 its target height and the VEHICLE_HOVER_TIMESCALE will be
6164 approximately the oscillation period of the bounce (the real
6165 period will tend to be a little longer than the timescale).</P
6166><P
6167>For performance reasons, until improvements are made to the
6168 Second Life physics engine the vehicles can only hover over the
6169 terrain and water, so they will not be able to hover above
6170 objects made out of primitives, such as bridges and houses. By
6171 default the hover behavior will float over terrain and water,
6172 however this can be changed by setting some flags: </P
6173><P
6174>If you wanted to make a boat you should set the
6175 <A
6176HREF="#const_vehicle_flag_hover_water_only"
6177>&#13; VEHICLE_HOVER_WATER_ONLY </A
6178> flag, or if you wanted to drive a hover
6179 tank under water you would use the
6180 <A
6181HREF="#const_vehicle_flag_hover_terrain_only"
6182>&#13; VEHICLE_HOVER_TERRAIN_ONLY </A
6183> flag instead.
6184 Finally, if you wanted to make a submarine or a balloon you would use the
6185 <A
6186HREF="#const_vehicle_flag_hover_global_height"
6187>&#13; VEHICLE_FLAG_HOVER_GLOBAL_HEIGHT</A
6188>. Note that
6189 the flags are independent of each other and that setting two
6190 contradictory flags will have undefined behavior. The flags are
6191 set using the script call llSetVehicleFlags().</P
6192><P
6193>The VEHICLE_HOVER_HEIGHT determines
6194 how high the vehicle
6195 will hover over the terrain and/or water, or the global height,
6196 and has a maximum value of 100 meters. Note that for hovering
6197 purposes the "center" of the vehicle is its "center of mass"
6198 which is not always obvious to the untrained eye, and it
6199 changes when avatar's sit on the vehicle.</P
6200></DIV
6201><DIV
6202CLASS="section"
6203><HR><H2
6204CLASS="section"
6205><A
6206NAME="AEN990"
6207>11.15. Reference Frame</A
6208></H2
6209><P
6210>The vehicle relies on the x- (at), y- (left), and z- (up)
6211 axes in order to figure out which way it prefers to move and
6212 which end is up. By default these axes are identical to the
6213 local axes of the root primitive of the object, however this
6214 means that the vehicle's root primitive must, by default, be
6215 oriented to agree with the designed at, left, and up axes of the
6216 vehicle. But, what if the vehicle object was already pre-built
6217 with the root primitive in some non-trivial orientation
6218 relative to where the vehicle as a whole should move? This is
6219 where the VEHICLE_REFERENCE_FRAME parameter becomes useful; the
6220 vehicle's axes can be arbitrarily reoriented by setting this
6221 parameter. </P
6222><P
6223>As an example, suppose you had built a rocket out of a big
6224 cylinder, a cone for the nose, and some stretched cut boxes for
6225 the fins, then linked them all together with the cylinder as the
6226 root primitive. Ideally the rocket would move nose-first,
6227 however the cylinder's axis of symmetry is its local z-axis while
6228 the default "at-axis" of the vehicle, the axis it will
6229 want to deflect to forward under angular deflection, is the local
6230 x-axis and points out from the curved surface of the cylinder.
6231 The script code below will rotate the vehicle's axes such that
6232 the local z-axis becomes the "at-axis" and the local
6233 negative x-axis becomes the "up-axis":</P
6234><P
6235><DIV
6236CLASS="informalexample"
6237><P
6238></P
6239><A
6240NAME="AEN995"
6241></A
6242><PRE
6243CLASS="programlisting"
6244>&#13;// rotate the vehicle frame -PI/2 about the local y-axis (left-axis)
6245rotation rot = llEuler2Rot(0, PI/2, 0);
6246llSetVehicleRotationParam(VEHICLE_REFERENCE_FRAME, rot);
6247</PRE
6248><P
6249></P
6250></DIV
6251></P
6252><P
6253>Another example of how the reference frame parameter could
6254 be used is to consider flying craft that uses the vertical
6255 attractor for stability during flying but wants to use VTOL
6256 (vertical takeoff and landing). During flight the craft's dorsal
6257 axis should point up, but during landing its nose-axis should be
6258 up. To land the vehicle: while the
6259 <A
6260HREF="#AEN938"
6261>vertical attractor</A
6262>
6263 is in effect, rotate the existing VEHICLE_REFERENCE_FRAME by +PI/2
6264 about the left-axis, then the vehicle will pitch up such that
6265 it's nose points toward the sky. The vehicle could be allowed to
6266 fall to the landing pad under friction, or a decreasing hover
6267 effect. </P
6268></DIV
6269></DIV
6270><DIV
6271CLASS="appendix"
6272><HR><H1
6273><A
6274NAME="AEN999"
6275></A
6276>Appendix A. Linden Library Functions</H1
6277><P
6278>Complete listing of the Linden Library function calls
6279 available in lsl.</P
6280><DIV
6281CLASS="section"
6282><HR><H2
6283CLASS="section"
6284><A
6285NAME="AEN1002"
6286>A.1. llAbs</A
6287></H2
6288><DIV
6289CLASS="funcsynopsis"
6290><P
6291></P
6292><A
6293NAME="AEN1004"
6294></A
6295><P
6296><CODE
6297><CODE
6298CLASS="FUNCDEF"
6299>integer llAbs</CODE
6300>(integer val);</CODE
6301></P
6302><P
6303></P
6304></DIV
6305><P
6306>Returns the absolute value of
6307 <CODE
6308CLASS="parameter"
6309>val</CODE
6310>.</P
6311></DIV
6312><DIV
6313CLASS="section"
6314><HR><H2
6315CLASS="section"
6316><A
6317NAME="AEN1012"
6318>A.2. llAcos</A
6319></H2
6320><DIV
6321CLASS="funcsynopsis"
6322><P
6323></P
6324><A
6325NAME="AEN1014"
6326></A
6327><P
6328><CODE
6329><CODE
6330CLASS="FUNCDEF"
6331>float llAcos</CODE
6332>(float val);</CODE
6333></P
6334><P
6335></P
6336></DIV
6337><P
6338>Returns the arccosine in radians of
6339 <CODE
6340CLASS="parameter"
6341>val</CODE
6342>.</P
6343></DIV
6344><DIV
6345CLASS="section"
6346><HR><H2
6347CLASS="section"
6348><A
6349NAME="AEN1022"
6350>A.3. llAddToLandPassList</A
6351></H2
6352><DIV
6353CLASS="funcsynopsis"
6354><P
6355></P
6356><A
6357NAME="AEN1024"
6358></A
6359><P
6360><CODE
6361><CODE
6362CLASS="FUNCDEF"
6363>llAddToLandPassList</CODE
6364>(key avatar, float hours);</CODE
6365></P
6366><P
6367></P
6368></DIV
6369><P
6370>Add <CODE
6371CLASS="parameter"
6372>avatar</CODE
6373> to the land pass list for
6374 <CODE
6375CLASS="parameter"
6376>hours</CODE
6377>.</P
6378></DIV
6379><DIV
6380CLASS="section"
6381><HR><H2
6382CLASS="section"
6383><A
6384NAME="AEN1035"
6385>A.4. llAdjustSoundVolume</A
6386></H2
6387><DIV
6388CLASS="funcsynopsis"
6389><P
6390></P
6391><A
6392NAME="AEN1037"
6393></A
6394><P
6395><CODE
6396><CODE
6397CLASS="FUNCDEF"
6398>llAdjustSoundVolume</CODE
6399>(float volume);</CODE
6400></P
6401><P
6402></P
6403></DIV
6404><P
6405>Adjusts the volume of the currently playing attached sound
6406 started with <A
6407HREF="#AEN3184"
6408>llPlaySound</A
6409> or
6410 <A
6411HREF="#AEN2773"
6412>llLoopSound</A
6413>. This function
6414 Has no effect on sounds started with <A
6415HREF="#AEN4756"
6416>llTriggerSound</A
6417>.</P
6418></DIV
6419><DIV
6420CLASS="section"
6421><HR><H2
6422CLASS="section"
6423><A
6424NAME="AEN1047"
6425>A.5. llAllowInventoryDrop</A
6426></H2
6427><DIV
6428CLASS="funcsynopsis"
6429><P
6430></P
6431><A
6432NAME="AEN1049"
6433></A
6434><P
6435><CODE
6436><CODE
6437CLASS="FUNCDEF"
6438>llAllowInventoryDrop</CODE
6439>(integer add);</CODE
6440></P
6441><P
6442></P
6443></DIV
6444><P
6445>If <CODE
6446CLASS="parameter"
6447>add</CODE
6448> == TRUE, users that do no have
6449 object modify permissions can still drop inventory items onto
6450 object.</P
6451></DIV
6452><DIV
6453CLASS="section"
6454><HR><H2
6455CLASS="section"
6456><A
6457NAME="AEN1057"
6458>A.6. llAngleBetween</A
6459></H2
6460><DIV
6461CLASS="funcsynopsis"
6462><P
6463></P
6464><A
6465NAME="AEN1059"
6466></A
6467><P
6468><CODE
6469><CODE
6470CLASS="FUNCDEF"
6471>float llAngleBetween</CODE
6472>(rotation a, rotation b);</CODE
6473></P
6474><P
6475></P
6476></DIV
6477><P
6478>Returns the angle in radians between rotations
6479 <CODE
6480CLASS="parameter"
6481>a</CODE
6482> and <CODE
6483CLASS="parameter"
6484>b</CODE
6485>.</P
6486></DIV
6487><DIV
6488CLASS="section"
6489><HR><H2
6490CLASS="section"
6491><A
6492NAME="AEN1070"
6493>A.7. llApplyImpulse</A
6494></H2
6495><DIV
6496CLASS="funcsynopsis"
6497><P
6498></P
6499><A
6500NAME="AEN1072"
6501></A
6502><P
6503><CODE
6504><CODE
6505CLASS="FUNCDEF"
6506>llApplyImpulse</CODE
6507>(vector force, integer local);</CODE
6508></P
6509><P
6510></P
6511></DIV
6512><P
6513>Applies the <CODE
6514CLASS="parameter"
6515>impulse</CODE
6516> in local
6517 coordinates if <CODE
6518CLASS="parameter"
6519>local</CODE
6520> == TRUE. Otherwise the
6521 impulse is applied in global coordinates. This function only works
6522 on physical objects.</P
6523></DIV
6524><DIV
6525CLASS="section"
6526><HR><H2
6527CLASS="section"
6528><A
6529NAME="AEN1083"
6530>A.8. llApplyRotationalImpulse</A
6531></H2
6532><DIV
6533CLASS="funcsynopsis"
6534><P
6535></P
6536><A
6537NAME="AEN1085"
6538></A
6539><P
6540><CODE
6541><CODE
6542CLASS="FUNCDEF"
6543>llApplyRotationalImpulse</CODE
6544>(vector force, integer local);</CODE
6545></P
6546><P
6547></P
6548></DIV
6549><P
6550>Applies a rotational <CODE
6551CLASS="parameter"
6552>impulse</CODE
6553> force in
6554 local coordinates if <CODE
6555CLASS="parameter"
6556>local</CODE
6557> ==
6558 TRUE. Otherwise the impulse is applied in global coordinates. This
6559 function only works on physical objects.</P
6560></DIV
6561><DIV
6562CLASS="section"
6563><HR><H2
6564CLASS="section"
6565><A
6566NAME="AEN1096"
6567>A.9. llAsin</A
6568></H2
6569><DIV
6570CLASS="funcsynopsis"
6571><P
6572></P
6573><A
6574NAME="AEN1098"
6575></A
6576><P
6577><CODE
6578><CODE
6579CLASS="FUNCDEF"
6580>float llAsin</CODE
6581>(float val);</CODE
6582></P
6583><P
6584></P
6585></DIV
6586><P
6587>Returns the arcsine in radians of
6588 <CODE
6589CLASS="parameter"
6590>val</CODE
6591>.</P
6592></DIV
6593><DIV
6594CLASS="section"
6595><HR><H2
6596CLASS="section"
6597><A
6598NAME="AEN1106"
6599>A.10. llAtan2</A
6600></H2
6601><DIV
6602CLASS="funcsynopsis"
6603><P
6604></P
6605><A
6606NAME="AEN1108"
6607></A
6608><P
6609><CODE
6610><CODE
6611CLASS="FUNCDEF"
6612>float llAtan2</CODE
6613>(float y, float x);</CODE
6614></P
6615><P
6616></P
6617></DIV
6618><P
6619>returns the arctangent2 of <CODE
6620CLASS="parameter"
6621>y</CODE
6622>,
6623 <CODE
6624CLASS="parameter"
6625>x</CODE
6626></P
6627></DIV
6628><DIV
6629CLASS="section"
6630><HR><H2
6631CLASS="section"
6632><A
6633NAME="AEN1119"
6634>A.11. llAttachToAvatar</A
6635></H2
6636><DIV
6637CLASS="funcsynopsis"
6638><P
6639></P
6640><A
6641NAME="AEN1121"
6642></A
6643><P
6644><CODE
6645><CODE
6646CLASS="FUNCDEF"
6647>llAttachToAvatar</CODE
6648>(key avatar, integer attachment);</CODE
6649></P
6650><P
6651></P
6652></DIV
6653><P
6654>Attach to <CODE
6655CLASS="parameter"
6656>avatar</CODE
6657> at point <A
6658HREF="#AEN5448"
6659><CODE
6660CLASS="parameter"
6661>attachment</CODE
6662></A
6663>.
6664 Requires the <A
6665HREF="#const_permission_attach"
6666>PERMISSION_ATTACH</A
6667> runtime
6668 permission.</P
6669></DIV
6670><DIV
6671CLASS="section"
6672><HR><H2
6673CLASS="section"
6674><A
6675NAME="AEN1134"
6676>A.12. llAvatarOnSitTarget</A
6677></H2
6678><DIV
6679CLASS="funcsynopsis"
6680><P
6681></P
6682><A
6683NAME="AEN1136"
6684></A
6685><P
6686><CODE
6687><CODE
6688CLASS="FUNCDEF"
6689>key llAvatarOnSitTarget</CODE
6690>(void);</CODE
6691></P
6692><P
6693></P
6694></DIV
6695><P
6696>If an avatar is sitting on the sit target, return
6697 the avatar's key, <A
6698HREF="#AEN6070"
6699>NULL_KEY</A
6700> otherwise.
6701 This only will detect avatars sitting on sit targets defined with <A
6702HREF="#AEN4312"
6703>llSitTarget</A
6704>.</P
6705></DIV
6706><DIV
6707CLASS="section"
6708><HR><H2
6709CLASS="section"
6710><A
6711NAME="AEN1144"
6712>A.13. llAxes2Rot</A
6713></H2
6714><DIV
6715CLASS="funcsynopsis"
6716><P
6717></P
6718><A
6719NAME="AEN1146"
6720></A
6721><P
6722><CODE
6723><CODE
6724CLASS="FUNCDEF"
6725>rotation llAxes2Rot</CODE
6726>(vector fwd, vector left, vector up);</CODE
6727></P
6728><P
6729></P
6730></DIV
6731><P
6732>Returns the rotation represented by coordinate axes
6733 <CODE
6734CLASS="parameter"
6735>fwd</CODE
6736>, <CODE
6737CLASS="parameter"
6738>left</CODE
6739>, and
6740 <CODE
6741CLASS="parameter"
6742>up</CODE
6743>.</P
6744></DIV
6745><DIV
6746CLASS="section"
6747><HR><H2
6748CLASS="section"
6749><A
6750NAME="AEN1160"
6751>A.14. llAxisAngle2Rot</A
6752></H2
6753><DIV
6754CLASS="funcsynopsis"
6755><P
6756></P
6757><A
6758NAME="AEN1162"
6759></A
6760><P
6761><CODE
6762><CODE
6763CLASS="FUNCDEF"
6764>rotation llAxisAngle2Rot</CODE
6765>(vector axis, float angle);</CODE
6766></P
6767><P
6768></P
6769></DIV
6770><P
6771>Returns the rotation generated <CODE
6772CLASS="parameter"
6773>angle</CODE
6774>
6775 about <CODE
6776CLASS="parameter"
6777>axis</CODE
6778>.</P
6779></DIV
6780><DIV
6781CLASS="section"
6782><HR><H2
6783CLASS="section"
6784><A
6785NAME="AEN1173"
6786>A.15. llBase64ToString</A
6787></H2
6788><DIV
6789CLASS="funcsynopsis"
6790><P
6791></P
6792><A
6793NAME="AEN1175"
6794></A
6795><P
6796><CODE
6797><CODE
6798CLASS="FUNCDEF"
6799>string llBase64ToString</CODE
6800>(string str);</CODE
6801></P
6802><P
6803></P
6804></DIV
6805><P
6806>Converts a Base 64 string to a conventional string. If the
6807 conversion creates any unprintable characters, they are converted to
6808 spaces.</P
6809></DIV
6810><DIV
6811CLASS="section"
6812><HR><H2
6813CLASS="section"
6814><A
6815NAME="AEN1182"
6816>A.16. llBreakAllLinks</A
6817></H2
6818><DIV
6819CLASS="funcsynopsis"
6820><P
6821></P
6822><A
6823NAME="AEN1184"
6824></A
6825><P
6826><CODE
6827><CODE
6828CLASS="FUNCDEF"
6829>llBreakAllLinks</CODE
6830>(void);</CODE
6831></P
6832><P
6833></P
6834></DIV
6835><P
6836>Delinks all objects in the link set. Requires the permission
6837 <A
6838HREF="#const_permission_change_links"
6839>PERMISSION_CHANGE_LINKS</A
6840>
6841 be set.</P
6842></DIV
6843><DIV
6844CLASS="section"
6845><HR><H2
6846CLASS="section"
6847><A
6848NAME="AEN1191"
6849>A.17. llBreakLink</A
6850></H2
6851><DIV
6852CLASS="funcsynopsis"
6853><P
6854></P
6855><A
6856NAME="AEN1193"
6857></A
6858><P
6859><CODE
6860><CODE
6861CLASS="FUNCDEF"
6862>llBreakLink</CODE
6863>(integer linknum);</CODE
6864></P
6865><P
6866></P
6867></DIV
6868><P
6869>Delinks the object with the given
6870 <CODE
6871CLASS="parameter"
6872>link</CODE
6873> number. Requires permission <A
6874HREF="#const_permission_change_links"
6875>PERMISSION_CHANGE_LINKS</A
6876>
6877 be set.</P
6878></DIV
6879><DIV
6880CLASS="section"
6881><HR><H2
6882CLASS="section"
6883><A
6884NAME="AEN1202"
6885>A.18. llCSV2List</A
6886></H2
6887><DIV
6888CLASS="funcsynopsis"
6889><P
6890></P
6891><A
6892NAME="AEN1204"
6893></A
6894><P
6895><CODE
6896><CODE
6897CLASS="FUNCDEF"
6898>list llCSV2List</CODE
6899>(string src);</CODE
6900></P
6901><P
6902></P
6903></DIV
6904><P
6905>Create a list from a string of comma separated values
6906 specified in <CODE
6907CLASS="parameter"
6908>src</CODE
6909>.</P
6910></DIV
6911><DIV
6912CLASS="section"
6913><HR><H2
6914CLASS="section"
6915><A
6916NAME="AEN1212"
6917>A.19. llCeil</A
6918></H2
6919><DIV
6920CLASS="funcsynopsis"
6921><P
6922></P
6923><A
6924NAME="AEN1214"
6925></A
6926><P
6927><CODE
6928><CODE
6929CLASS="FUNCDEF"
6930>integer llCeil</CODE
6931>(float val);</CODE
6932></P
6933><P
6934></P
6935></DIV
6936><P
6937>Returns largest integer value &#62;=
6938 <CODE
6939CLASS="parameter"
6940>val</CODE
6941>.</P
6942></DIV
6943><DIV
6944CLASS="section"
6945><HR><H2
6946CLASS="section"
6947><A
6948NAME="AEN1222"
6949>A.20. llCloseRemoteDataChannel</A
6950></H2
6951><DIV
6952CLASS="funcsynopsis"
6953><P
6954></P
6955><A
6956NAME="AEN1224"
6957></A
6958><P
6959><CODE
6960><CODE
6961CLASS="FUNCDEF"
6962>llCloseRemoteDataChannel</CODE
6963>(key channel);</CODE
6964></P
6965><P
6966></P
6967></DIV
6968><P
6969>Closes XML-RPC channel.</P
6970></DIV
6971><DIV
6972CLASS="section"
6973><HR><H2
6974CLASS="section"
6975><A
6976NAME="AEN1231"
6977>A.21. llCloud</A
6978></H2
6979><DIV
6980CLASS="funcsynopsis"
6981><P
6982></P
6983><A
6984NAME="AEN1233"
6985></A
6986><P
6987><CODE
6988><CODE
6989CLASS="FUNCDEF"
6990>float llCloud</CODE
6991>(vector offset);</CODE
6992></P
6993><P
6994></P
6995></DIV
6996><P
6997>Returns the cloud density at the object position +
6998 <CODE
6999CLASS="parameter"
7000>offset</CODE
7001>.</P
7002></DIV
7003><DIV
7004CLASS="section"
7005><HR><H2
7006CLASS="section"
7007><A
7008NAME="AEN1241"
7009>A.22. llCollisionFilter</A
7010></H2
7011><DIV
7012CLASS="funcsynopsis"
7013><P
7014></P
7015><A
7016NAME="AEN1243"
7017></A
7018><P
7019><CODE
7020><CODE
7021CLASS="FUNCDEF"
7022>llCollisionFilter</CODE
7023>(string name, key id, integer accept);</CODE
7024></P
7025><P
7026></P
7027></DIV
7028><P
7029>If <CODE
7030CLASS="parameter"
7031>accept</CODE
7032> == TRUE, only accept
7033 collisions with objects <CODE
7034CLASS="parameter"
7035>name</CODE
7036> and
7037 <CODE
7038CLASS="parameter"
7039>id</CODE
7040>, otherwise with objects not
7041 <CODE
7042CLASS="parameter"
7043>name</CODE
7044> or <CODE
7045CLASS="parameter"
7046>id</CODE
7047>. Specify
7048 an empty string or <A
7049HREF="#AEN6070"
7050>NULL_KEY</A
7051> to
7052 not filter on the corresponding parameter.</P
7053></DIV
7054><DIV
7055CLASS="section"
7056><HR><H2
7057CLASS="section"
7058><A
7059NAME="AEN1260"
7060>A.23. llCollisionSound</A
7061></H2
7062><DIV
7063CLASS="funcsynopsis"
7064><P
7065></P
7066><A
7067NAME="AEN1262"
7068></A
7069><P
7070><CODE
7071><CODE
7072CLASS="FUNCDEF"
7073>llCollisionSound</CODE
7074>(string impact_sound, float impact_volume);</CODE
7075></P
7076><P
7077></P
7078></DIV
7079><P
7080>Suppress default collision sounds, replace default impact
7081 sounds with <CODE
7082CLASS="parameter"
7083>impact_sound</CODE
7084> found in the
7085 object inventory. Supply an empty string to suppress collision
7086 sounds.</P
7087></DIV
7088><DIV
7089CLASS="section"
7090><HR><H2
7091CLASS="section"
7092><A
7093NAME="AEN1272"
7094>A.24. llCollisionSprite</A
7095></H2
7096><DIV
7097CLASS="funcsynopsis"
7098><P
7099></P
7100><A
7101NAME="AEN1274"
7102></A
7103><P
7104><CODE
7105><CODE
7106CLASS="FUNCDEF"
7107>llCollisionSprite</CODE
7108>(string impact_sprite);</CODE
7109></P
7110><P
7111></P
7112></DIV
7113><P
7114>Suppress default collision sprites, replace default impact
7115 sprite with <CODE
7116CLASS="parameter"
7117>impact_sprite</CODE
7118> found in the
7119 object inventory. Supply an empty string to just suppress.</P
7120></DIV
7121><DIV
7122CLASS="section"
7123><HR><H2
7124CLASS="section"
7125><A
7126NAME="AEN1282"
7127>A.25. llCos</A
7128></H2
7129><DIV
7130CLASS="funcsynopsis"
7131><P
7132></P
7133><A
7134NAME="AEN1284"
7135></A
7136><P
7137><CODE
7138><CODE
7139CLASS="FUNCDEF"
7140>float llCos</CODE
7141>(float theta);</CODE
7142></P
7143><P
7144></P
7145></DIV
7146><P
7147>Returns the cosine of <CODE
7148CLASS="parameter"
7149>theta</CODE
7150>
7151 radians.</P
7152></DIV
7153><DIV
7154CLASS="section"
7155><HR><H2
7156CLASS="section"
7157><A
7158NAME="AEN1292"
7159>A.26. llCreateLink</A
7160></H2
7161><DIV
7162CLASS="funcsynopsis"
7163><P
7164></P
7165><A
7166NAME="AEN1294"
7167></A
7168><P
7169><CODE
7170><CODE
7171CLASS="FUNCDEF"
7172>llCreateLink</CODE
7173>(key target, integer parent);</CODE
7174></P
7175><P
7176></P
7177></DIV
7178><P
7179>Attempt to link object script is attached to and
7180 <CODE
7181CLASS="parameter"
7182>target</CODE
7183>. Requires permission <A
7184HREF="#const_permission_change_links"
7185>PERMISSION_CHANGE_LINKS</A
7186>
7187 be set. If <CODE
7188CLASS="parameter"
7189>parent</CODE
7190> == TRUE, object script is
7191 attached to is the root.</P
7192></DIV
7193><DIV
7194CLASS="section"
7195><HR><H2
7196CLASS="section"
7197><A
7198NAME="AEN1306"
7199>A.27. llDeleteSubList</A
7200></H2
7201><DIV
7202CLASS="funcsynopsis"
7203><P
7204></P
7205><A
7206NAME="AEN1308"
7207></A
7208><P
7209><CODE
7210><CODE
7211CLASS="FUNCDEF"
7212>list llDeleteSubList</CODE
7213>(list src, integer start, integer end);</CODE
7214></P
7215><P
7216></P
7217></DIV
7218><P
7219>Remove the slice from the list and return the remainder.
7220 The <CODE
7221CLASS="parameter"
7222>start</CODE
7223> and <CODE
7224CLASS="parameter"
7225>end</CODE
7226>
7227 are inclusive, so 0, length - 1 would delete the entire list and
7228 0,0 would delete the first list entry. Using negative numbers for
7229 <CODE
7230CLASS="parameter"
7231>start</CODE
7232> and/or <CODE
7233CLASS="parameter"
7234>end</CODE
7235>
7236 causes the index to count backwards from the length of the list,
7237 so 0,-1 would delete the entire list. If
7238 <CODE
7239CLASS="parameter"
7240>start</CODE
7241> is larger than
7242 <CODE
7243CLASS="parameter"
7244>end</CODE
7245> the list deleted is the exclusion of the
7246 entries, so 6,4 would delete the entire list except for the
7247 5<SUP
7248>th</SUP
7249> list entry.</P
7250></DIV
7251><DIV
7252CLASS="section"
7253><HR><H2
7254CLASS="section"
7255><A
7256NAME="AEN1326"
7257>A.28. llDeleteSubString</A
7258></H2
7259><DIV
7260CLASS="funcsynopsis"
7261><P
7262></P
7263><A
7264NAME="AEN1328"
7265></A
7266><P
7267><CODE
7268><CODE
7269CLASS="FUNCDEF"
7270>string llDeleteSubString</CODE
7271>(string src, integer start, integer end);</CODE
7272></P
7273><P
7274></P
7275></DIV
7276><P
7277>Removes the indicated substring and returns the result. The
7278 <CODE
7279CLASS="parameter"
7280>start</CODE
7281> and <CODE
7282CLASS="parameter"
7283>end</CODE
7284> are
7285 inclusive, so 0,length-1 would delete the entire string and 0,0
7286 would delete the first character. Using negative numbers for
7287 <CODE
7288CLASS="parameter"
7289>start</CODE
7290> and/or <CODE
7291CLASS="parameter"
7292>end</CODE
7293>
7294 causes the index to count backwards from the length of the string,
7295 so 0,-1 would delete the entire string. If
7296 <CODE
7297CLASS="parameter"
7298>start</CODE
7299> is larger than end the sub string is
7300 the exclusion of the entries, so 6,4 would delete the entire
7301 string except for the 5<SUP
7302>th</SUP
7303>
7304 character.</P
7305></DIV
7306><DIV
7307CLASS="section"
7308><HR><H2
7309CLASS="section"
7310><A
7311NAME="AEN1345"
7312>A.29. llDetachFromAvatar</A
7313></H2
7314><DIV
7315CLASS="funcsynopsis"
7316><P
7317></P
7318><A
7319NAME="AEN1347"
7320></A
7321><P
7322><CODE
7323><CODE
7324CLASS="FUNCDEF"
7325>llDetachFromAvatar</CODE
7326>(key avatar);</CODE
7327></P
7328><P
7329></P
7330></DIV
7331><P
7332>Drop off of <CODE
7333CLASS="parameter"
7334>avatar</CODE
7335>.</P
7336></DIV
7337><DIV
7338CLASS="section"
7339><HR><H2
7340CLASS="section"
7341><A
7342NAME="lib_lldetected"
7343>A.30. llDetectedGrab</A
7344></H2
7345><DIV
7346CLASS="funcsynopsis"
7347><P
7348></P
7349><A
7350NAME="AEN1357"
7351></A
7352><P
7353><CODE
7354><CODE
7355CLASS="FUNCDEF"
7356>vector llDetectedGrab</CODE
7357>(integer number);</CODE
7358></P
7359><P
7360></P
7361></DIV
7362><P
7363>Returns the grab offset of detected object
7364 <CODE
7365CLASS="parameter"
7366>number</CODE
7367>. Returns &#60;0,0,0&#62; if number is
7368 not valid sensed object.</P
7369></DIV
7370><DIV
7371CLASS="section"
7372><HR><H2
7373CLASS="section"
7374><A
7375NAME="AEN1365"
7376>A.31. llDetectedGroup</A
7377></H2
7378><DIV
7379CLASS="funcsynopsis"
7380><P
7381></P
7382><A
7383NAME="AEN1367"
7384></A
7385><P
7386><CODE
7387><CODE
7388CLASS="FUNCDEF"
7389>integer llDetectedGroup</CODE
7390>(integer number);</CODE
7391></P
7392><P
7393></P
7394></DIV
7395><P
7396>Returns TRUE if detected object
7397 <CODE
7398CLASS="parameter"
7399>number</CODE
7400> is part of same group as
7401 owner.</P
7402></DIV
7403><DIV
7404CLASS="section"
7405><HR><H2
7406CLASS="section"
7407><A
7408NAME="AEN1375"
7409>A.32. llDetectedKey</A
7410></H2
7411><DIV
7412CLASS="funcsynopsis"
7413><P
7414></P
7415><A
7416NAME="AEN1377"
7417></A
7418><P
7419><CODE
7420><CODE
7421CLASS="FUNCDEF"
7422>key llDetectedKey</CODE
7423>(integer number);</CODE
7424></P
7425><P
7426></P
7427></DIV
7428><P
7429>Returns the key of detected object
7430 <CODE
7431CLASS="parameter"
7432>number</CODE
7433>. Returns <A
7434HREF="#AEN6070"
7435>NULL_KEY</A
7436> if number is not valid sensed
7437 object.</P
7438></DIV
7439><DIV
7440CLASS="section"
7441><HR><H2
7442CLASS="section"
7443><A
7444NAME="AEN1386"
7445>A.33. llDetectedLinkNumber</A
7446></H2
7447><DIV
7448CLASS="funcsynopsis"
7449><P
7450></P
7451><A
7452NAME="AEN1388"
7453></A
7454><P
7455><CODE
7456><CODE
7457CLASS="FUNCDEF"
7458>integer llDetectedLinkNumber</CODE
7459>(integer number);</CODE
7460></P
7461><P
7462></P
7463></DIV
7464><P
7465>Returns the link position of the triggered event for
7466 touches. 0 for a non-linked object, 1 for the root of a linked
7467 object, 2 for the first child, etc.</P
7468></DIV
7469><DIV
7470CLASS="section"
7471><HR><H2
7472CLASS="section"
7473><A
7474NAME="AEN1395"
7475>A.34. llDetectedName</A
7476></H2
7477><DIV
7478CLASS="funcsynopsis"
7479><P
7480></P
7481><A
7482NAME="AEN1397"
7483></A
7484><P
7485><CODE
7486><CODE
7487CLASS="FUNCDEF"
7488>string llDetectedName</CODE
7489>(integer number);</CODE
7490></P
7491><P
7492></P
7493></DIV
7494><P
7495>Returns the name of detected object
7496 <CODE
7497CLASS="parameter"
7498>number</CODE
7499>. Returns empty string if
7500 <CODE
7501CLASS="parameter"
7502>number</CODE
7503> is not valid sensed object.</P
7504></DIV
7505><DIV
7506CLASS="section"
7507><HR><H2
7508CLASS="section"
7509><A
7510NAME="AEN1406"
7511>A.35. llDetectedOwner</A
7512></H2
7513><DIV
7514CLASS="funcsynopsis"
7515><P
7516></P
7517><A
7518NAME="AEN1408"
7519></A
7520><P
7521><CODE
7522><CODE
7523CLASS="FUNCDEF"
7524>key llDetectedOwner</CODE
7525>(integer number);</CODE
7526></P
7527><P
7528></P
7529></DIV
7530><P
7531>Returns the key of detected <CODE
7532CLASS="parameter"
7533>number</CODE
7534>
7535 object's owner. Returns invalid key if
7536 <CODE
7537CLASS="parameter"
7538>number</CODE
7539> is not valid sensed object.</P
7540></DIV
7541><DIV
7542CLASS="section"
7543><HR><H2
7544CLASS="section"
7545><A
7546NAME="AEN1417"
7547>A.36. llDetectedPos</A
7548></H2
7549><DIV
7550CLASS="funcsynopsis"
7551><P
7552></P
7553><A
7554NAME="AEN1419"
7555></A
7556><P
7557><CODE
7558><CODE
7559CLASS="FUNCDEF"
7560>vector llDetectedPos</CODE
7561>(integer number);</CODE
7562></P
7563><P
7564></P
7565></DIV
7566><P
7567>Returns the position of detected object
7568 <CODE
7569CLASS="parameter"
7570>number</CODE
7571>. Returns &#60;0,0,0&#62; if
7572 <CODE
7573CLASS="parameter"
7574>number</CODE
7575> is not valid sensed object.</P
7576></DIV
7577><DIV
7578CLASS="section"
7579><HR><H2
7580CLASS="section"
7581><A
7582NAME="AEN1428"
7583>A.37. llDetectedRot</A
7584></H2
7585><DIV
7586CLASS="funcsynopsis"
7587><P
7588></P
7589><A
7590NAME="AEN1430"
7591></A
7592><P
7593><CODE
7594><CODE
7595CLASS="FUNCDEF"
7596>rotation llDetectedRot</CODE
7597>(integer number);</CODE
7598></P
7599><P
7600></P
7601></DIV
7602><P
7603>Returns the rotation of detected object
7604 <CODE
7605CLASS="parameter"
7606>number</CODE
7607>. Returns &#60;0,0,0,1&#62; if
7608 <CODE
7609CLASS="parameter"
7610>number</CODE
7611> is not valid sensed object).</P
7612></DIV
7613><DIV
7614CLASS="section"
7615><HR><H2
7616CLASS="section"
7617><A
7618NAME="AEN1439"
7619>A.38. llDetectedType</A
7620></H2
7621><DIV
7622CLASS="funcsynopsis"
7623><P
7624></P
7625><A
7626NAME="AEN1441"
7627></A
7628><P
7629><CODE
7630><CODE
7631CLASS="FUNCDEF"
7632>integer llDetectedType</CODE
7633>(integer number);</CODE
7634></P
7635><P
7636></P
7637></DIV
7638><P
7639>Returns the type (AGENT, ACTIVE, PASSIVE, SCRIPTED) of
7640 detected object <CODE
7641CLASS="parameter"
7642>number</CODE
7643>. Returns 0 if
7644 <CODE
7645CLASS="parameter"
7646>number</CODE
7647> is not valid sensed object. Note
7648 that <CODE
7649CLASS="parameter"
7650>number</CODE
7651> is a bitfield, so comparisons
7652 need to be a bitwise and check. eg:
7653<DIV
7654CLASS="informalexample"
7655><P
7656></P
7657><A
7658NAME="AEN1451"
7659></A
7660><PRE
7661CLASS="programlisting"
7662>&#13;integer type = llDetectedType(0);
7663if (type &#38; AGENT)
7664{
7665 // ...do stuff with the agent
7666}
7667</PRE
7668><P
7669></P
7670></DIV
7671>
7672 </P
7673></DIV
7674><DIV
7675CLASS="section"
7676><HR><H2
7677CLASS="section"
7678><A
7679NAME="AEN1453"
7680>A.39. llDetectedVel</A
7681></H2
7682><DIV
7683CLASS="funcsynopsis"
7684><P
7685></P
7686><A
7687NAME="AEN1455"
7688></A
7689><P
7690><CODE
7691><CODE
7692CLASS="FUNCDEF"
7693>vector llDetectedVel</CODE
7694>(integer number);</CODE
7695></P
7696><P
7697></P
7698></DIV
7699><P
7700>Returns the velocity of detected object
7701 <CODE
7702CLASS="parameter"
7703>number</CODE
7704>. Returns &#60;0,0,0&#62; if
7705 <CODE
7706CLASS="parameter"
7707>number</CODE
7708> is not valid sensed object.</P
7709></DIV
7710><DIV
7711CLASS="section"
7712><HR><H2
7713CLASS="section"
7714><A
7715NAME="AEN1464"
7716>A.40. llDialog</A
7717></H2
7718><DIV
7719CLASS="funcsynopsis"
7720><P
7721></P
7722><A
7723NAME="AEN1466"
7724></A
7725><P
7726><CODE
7727><CODE
7728CLASS="FUNCDEF"
7729>llDialog</CODE
7730>(key avatar, string message, list buttons, integer channel);</CODE
7731></P
7732><P
7733></P
7734></DIV
7735><P
7736>Opens a "notify box" in the top-right corner of the given avatar's screen displaying the message. Up to twelve buttons can be specified in a list of strings. When the player clicks a button, the name of the button is chatted on the specified channel. Channels work just like llSay(), so channel 0 can be heard by everyone. The chat originates at the object's position, not the avatar's position. e.g.
7737<DIV
7738CLASS="informalexample"
7739><P
7740></P
7741><A
7742NAME="AEN1479"
7743></A
7744><PRE
7745CLASS="programlisting"
7746>&#13;LLDialog(who, "Are you a boy or a girl?", [ "Boy", "Girl" ], 4913);
7747LLDialog(who, "This shows only an OK button.", [], 192);
7748llDialog(who, "This chats so you can hear it.", ["Hooray"], 0);
7749</PRE
7750><P
7751></P
7752></DIV
7753>
7754 </P
7755></DIV
7756><DIV
7757CLASS="section"
7758><HR><H2
7759CLASS="section"
7760><A
7761NAME="AEN1481"
7762>A.41. llDie</A
7763></H2
7764><DIV
7765CLASS="funcsynopsis"
7766><P
7767></P
7768><A
7769NAME="AEN1483"
7770></A
7771><P
7772><CODE
7773><CODE
7774CLASS="FUNCDEF"
7775>llDie</CODE
7776>(void);</CODE
7777></P
7778><P
7779></P
7780></DIV
7781><P
7782>Delete the object which holds the script.</P
7783></DIV
7784><DIV
7785CLASS="section"
7786><HR><H2
7787CLASS="section"
7788><A
7789NAME="AEN1489"
7790>A.42. llDumpList2String</A
7791></H2
7792><DIV
7793CLASS="funcsynopsis"
7794><P
7795></P
7796><A
7797NAME="AEN1491"
7798></A
7799><P
7800><CODE
7801><CODE
7802CLASS="FUNCDEF"
7803>string llDumpList2String</CODE
7804>(list src, string separator);</CODE
7805></P
7806><P
7807></P
7808></DIV
7809><P
7810>Write the list out in a single string using separator between values.</P
7811></DIV
7812><DIV
7813CLASS="section"
7814><HR><H2
7815CLASS="section"
7816><A
7817NAME="AEN1500"
7818>A.43. llEscapeURL</A
7819></H2
7820><DIV
7821CLASS="funcsynopsis"
7822><P
7823></P
7824><A
7825NAME="AEN1502"
7826></A
7827><P
7828><CODE
7829><CODE
7830CLASS="FUNCDEF"
7831>string llEscapeURL</CODE
7832>(string url);</CODE
7833></P
7834><P
7835></P
7836></DIV
7837><P
7838>Returns the string that is the URL escaped version of <CODE
7839CLASS="parameter"
7840>url</CODE
7841>,
7842 replacing spaces with %20 etc.</P
7843></DIV
7844><DIV
7845CLASS="section"
7846><HR><H2
7847CLASS="section"
7848><A
7849NAME="AEN1510"
7850>A.44. llEdgeOfWorld</A
7851></H2
7852><DIV
7853CLASS="funcsynopsis"
7854><P
7855></P
7856><A
7857NAME="AEN1512"
7858></A
7859><P
7860><CODE
7861><CODE
7862CLASS="FUNCDEF"
7863>integer llEdgeOfWorld</CODE
7864>(vector pos, vector dir);</CODE
7865></P
7866><P
7867></P
7868></DIV
7869><P
7870>Returns TRUE if the line along <CODE
7871CLASS="parameter"
7872>dir</CODE
7873>
7874 from <CODE
7875CLASS="parameter"
7876>pos</CODE
7877> hits the edge of the world in the
7878 current simulator and returns FALSE if that edge crosses into
7879 another simulator.</P
7880></DIV
7881><DIV
7882CLASS="section"
7883><HR><H2
7884CLASS="section"
7885><A
7886NAME="AEN1523"
7887>A.45. llEjectFromLand</A
7888></H2
7889><DIV
7890CLASS="funcsynopsis"
7891><P
7892></P
7893><A
7894NAME="AEN1525"
7895></A
7896><P
7897><CODE
7898><CODE
7899CLASS="FUNCDEF"
7900>llEjectFromLand</CODE
7901>(key pest);</CODE
7902></P
7903><P
7904></P
7905></DIV
7906><P
7907>Ejects <CODE
7908CLASS="parameter"
7909>pest</CODE
7910> from land that you
7911 own.</P
7912></DIV
7913><DIV
7914CLASS="section"
7915><HR><H2
7916CLASS="section"
7917><A
7918NAME="AEN1533"
7919>A.46. llEmail</A
7920></H2
7921><DIV
7922CLASS="funcsynopsis"
7923><P
7924></P
7925><A
7926NAME="AEN1535"
7927></A
7928><P
7929><CODE
7930><CODE
7931CLASS="FUNCDEF"
7932>llEmail</CODE
7933>(string address, string subject, string message);</CODE
7934></P
7935><P
7936></P
7937></DIV
7938><P
7939>Sends email to <CODE
7940CLASS="parameter"
7941>address</CODE
7942> with
7943 <CODE
7944CLASS="parameter"
7945>subject</CODE
7946> and
7947 <CODE
7948CLASS="parameter"
7949>message</CODE
7950>.</P
7951></DIV
7952><DIV
7953CLASS="section"
7954><HR><H2
7955CLASS="section"
7956><A
7957NAME="AEN1549"
7958>A.47. llEuler2Rot</A
7959></H2
7960><DIV
7961CLASS="funcsynopsis"
7962><P
7963></P
7964><A
7965NAME="AEN1551"
7966></A
7967><P
7968><CODE
7969><CODE
7970CLASS="FUNCDEF"
7971>rotation llEuler2Rot</CODE
7972>(vector vec);</CODE
7973></P
7974><P
7975></P
7976></DIV
7977><P
7978>Returns the rotation represented by Euler Angle
7979 <CODE
7980CLASS="parameter"
7981>vec</CODE
7982>.</P
7983></DIV
7984><DIV
7985CLASS="section"
7986><HR><H2
7987CLASS="section"
7988><A
7989NAME="AEN1559"
7990>A.48. llFabs</A
7991></H2
7992><DIV
7993CLASS="funcsynopsis"
7994><P
7995></P
7996><A
7997NAME="AEN1561"
7998></A
7999><P
8000><CODE
8001><CODE
8002CLASS="FUNCDEF"
8003>float llFabs</CODE
8004>(float val);</CODE
8005></P
8006><P
8007></P
8008></DIV
8009><P
8010>Returns the absolute value of
8011 <CODE
8012CLASS="parameter"
8013>val</CODE
8014>.</P
8015></DIV
8016><DIV
8017CLASS="section"
8018><HR><H2
8019CLASS="section"
8020><A
8021NAME="AEN1569"
8022>A.49. llFloor</A
8023></H2
8024><DIV
8025CLASS="funcsynopsis"
8026><P
8027></P
8028><A
8029NAME="AEN1571"
8030></A
8031><P
8032><CODE
8033><CODE
8034CLASS="FUNCDEF"
8035>integer llFloor</CODE
8036>(float val);</CODE
8037></P
8038><P
8039></P
8040></DIV
8041><P
8042>Returns largest integer value &#60;=
8043 <CODE
8044CLASS="parameter"
8045>val</CODE
8046>.</P
8047></DIV
8048><DIV
8049CLASS="section"
8050><HR><H2
8051CLASS="section"
8052><A
8053NAME="AEN1579"
8054>A.50. llFrand</A
8055></H2
8056><DIV
8057CLASS="funcsynopsis"
8058><P
8059></P
8060><A
8061NAME="AEN1581"
8062></A
8063><P
8064><CODE
8065><CODE
8066CLASS="FUNCDEF"
8067>float llFrand</CODE
8068>(float mag);</CODE
8069></P
8070><P
8071></P
8072></DIV
8073><P
8074>Returns a pseudo-random number between [0,
8075 <CODE
8076CLASS="parameter"
8077>mag</CODE
8078>).</P
8079></DIV
8080><DIV
8081CLASS="section"
8082><HR><H2
8083CLASS="section"
8084><A
8085NAME="AEN1589"
8086>A.51. llGetAccel</A
8087></H2
8088><DIV
8089CLASS="funcsynopsis"
8090><P
8091></P
8092><A
8093NAME="AEN1591"
8094></A
8095><P
8096><CODE
8097><CODE
8098CLASS="FUNCDEF"
8099>vector llGetAccel</CODE
8100>(void);</CODE
8101></P
8102><P
8103></P
8104></DIV
8105><P
8106>Gets the acceleration.</P
8107></DIV
8108><DIV
8109CLASS="section"
8110><HR><H2
8111CLASS="section"
8112><A
8113NAME="AEN1597"
8114>A.52. llGetAttached</A
8115></H2
8116><DIV
8117CLASS="funcsynopsis"
8118><P
8119></P
8120><A
8121NAME="AEN1599"
8122></A
8123><P
8124><CODE
8125><CODE
8126CLASS="FUNCDEF"
8127>integer llGetAttached</CODE
8128>(void);</CODE
8129></P
8130><P
8131></P
8132></DIV
8133><P
8134>Returns the object attachment point or 0 if not attached.</P
8135></DIV
8136><DIV
8137CLASS="section"
8138><HR><H2
8139CLASS="section"
8140><A
8141NAME="AEN1605"
8142>A.53. llGetAgentInfo</A
8143></H2
8144><DIV
8145CLASS="funcsynopsis"
8146><P
8147></P
8148><A
8149NAME="AEN1607"
8150></A
8151><P
8152><CODE
8153><CODE
8154CLASS="FUNCDEF"
8155>integer llGetAgentInfo</CODE
8156>(key id);</CODE
8157></P
8158><P
8159></P
8160></DIV
8161><P
8162>Returns information about the given agent
8163 <CODE
8164CLASS="parameter"
8165>id</CODE
8166>. Returns a bitfield of <A
8167HREF="#AEN5767"
8168>agent info constants</A
8169>.</P
8170></DIV
8171><DIV
8172CLASS="section"
8173><HR><H2
8174CLASS="section"
8175><A
8176NAME="AEN1616"
8177>A.54. llGetAgentSize</A
8178></H2
8179><DIV
8180CLASS="funcsynopsis"
8181><P
8182></P
8183><A
8184NAME="AEN1618"
8185></A
8186><P
8187><CODE
8188><CODE
8189CLASS="FUNCDEF"
8190>vector llGetAgentSize</CODE
8191>(key id);</CODE
8192></P
8193><P
8194></P
8195></DIV
8196><P
8197>If the agent <CODE
8198CLASS="parameter"
8199>id</CODE
8200> is in the same sim as
8201 the object, returns the size of the avatar.</P
8202></DIV
8203><DIV
8204CLASS="section"
8205><HR><H2
8206CLASS="section"
8207><A
8208NAME="AEN1626"
8209>A.55. llGetAlpha</A
8210></H2
8211><DIV
8212CLASS="funcsynopsis"
8213><P
8214></P
8215><A
8216NAME="AEN1628"
8217></A
8218><P
8219><CODE
8220><CODE
8221CLASS="FUNCDEF"
8222>float llGetAlpha</CODE
8223>(integer face);</CODE
8224></P
8225><P
8226></P
8227></DIV
8228><P
8229>Returns the alpha of the given
8230 <CODE
8231CLASS="parameter"
8232>face</CODE
8233>. If <CODE
8234CLASS="parameter"
8235>face</CODE
8236> is
8237 <A
8238HREF="#AEN6073"
8239>ALL_SIDES</A
8240> the value returned is
8241 the mean average of all faces.</P
8242></DIV
8243><DIV
8244CLASS="section"
8245><HR><H2
8246CLASS="section"
8247><A
8248NAME="AEN1638"
8249>A.56. llGetAndResetTime</A
8250></H2
8251><DIV
8252CLASS="funcsynopsis"
8253><P
8254></P
8255><A
8256NAME="AEN1640"
8257></A
8258><P
8259><CODE
8260><CODE
8261CLASS="FUNCDEF"
8262>float llGetAndResetTime</CODE
8263>(void);</CODE
8264></P
8265><P
8266></P
8267></DIV
8268><P
8269>Returns the seconds of elapsed time from an internal timer
8270 associated with the script. The timer is reset to zero during the
8271 call. The timer is also reset on rez, simulator restart, script
8272 reset, and in calls to <A
8273HREF="#AEN3426"
8274>llResetTime</A
8275>. Use <A
8276HREF="#AEN4188"
8277>llSetTimerEvent</A
8278> if you want a
8279 reliable timing mechanism.</P
8280></DIV
8281><DIV
8282CLASS="section"
8283><HR><H2
8284CLASS="section"
8285><A
8286NAME="AEN1648"
8287>A.57. llGetAnimation</A
8288></H2
8289><DIV
8290CLASS="funcsynopsis"
8291><P
8292></P
8293><A
8294NAME="AEN1650"
8295></A
8296><P
8297><CODE
8298><CODE
8299CLASS="FUNCDEF"
8300>string llGetAnimation</CODE
8301>(key id);</CODE
8302></P
8303><P
8304></P
8305></DIV
8306><P
8307>Returns the currently playing animation for avatar
8308 <CODE
8309CLASS="parameter"
8310>id</CODE
8311>.</P
8312></DIV
8313><DIV
8314CLASS="section"
8315><HR><H2
8316CLASS="section"
8317><A
8318NAME="AEN1658"
8319>A.58. llGetAnimationList</A
8320></H2
8321><DIV
8322CLASS="funcsynopsis"
8323><P
8324></P
8325><A
8326NAME="AEN1660"
8327></A
8328><P
8329><CODE
8330><CODE
8331CLASS="FUNCDEF"
8332>list llGetAnimationList</CODE
8333>(key id);</CODE
8334></P
8335><P
8336></P
8337></DIV
8338><P
8339>Returns a list of currently playing animations for avatar
8340 <CODE
8341CLASS="parameter"
8342>id</CODE
8343>.</P
8344></DIV
8345><DIV
8346CLASS="section"
8347><HR><H2
8348CLASS="section"
8349><A
8350NAME="AEN1668"
8351>A.59. llGetBoundingBox</A
8352></H2
8353><DIV
8354CLASS="funcsynopsis"
8355><P
8356></P
8357><A
8358NAME="AEN1670"
8359></A
8360><P
8361><CODE
8362><CODE
8363CLASS="FUNCDEF"
8364>list llGetBoundingBox</CODE
8365>(key object);</CODE
8366></P
8367><P
8368></P
8369></DIV
8370><P
8371>Returns the bounding box around <CODE
8372CLASS="parameter"
8373>object</CODE
8374> (including any linked prims)
8375 relative to the root prim. Returned value is a list of the form:
8376 [ (vector) min_corner, (vector) max_corner ]</P
8377></DIV
8378><DIV
8379CLASS="section"
8380><HR><H2
8381CLASS="section"
8382><A
8383NAME="AEN1678"
8384>A.60. llGetCenterOfMass</A
8385></H2
8386><DIV
8387CLASS="funcsynopsis"
8388><P
8389></P
8390><A
8391NAME="AEN1680"
8392></A
8393><P
8394><CODE
8395><CODE
8396CLASS="FUNCDEF"
8397>vector llGetCenterOfMass</CODE
8398>(void);</CODE
8399></P
8400><P
8401></P
8402></DIV
8403><P
8404>Returns the center of mass of the root object.</P
8405></DIV
8406><DIV
8407CLASS="section"
8408><HR><H2
8409CLASS="section"
8410><A
8411NAME="AEN1686"
8412>A.61. llGetColor</A
8413></H2
8414><DIV
8415CLASS="funcsynopsis"
8416><P
8417></P
8418><A
8419NAME="AEN1688"
8420></A
8421><P
8422><CODE
8423><CODE
8424CLASS="FUNCDEF"
8425>vector llGetColor</CODE
8426>(integer face);</CODE
8427></P
8428><P
8429></P
8430></DIV
8431><P
8432>Returns the color of <CODE
8433CLASS="parameter"
8434>face</CODE
8435> as a vector
8436 of red, green, and blue values between 0 and 1. If
8437 <CODE
8438CLASS="parameter"
8439>face</CODE
8440> is <A
8441HREF="#AEN6073"
8442>ALL_SIDES</A
8443> the color returned is the
8444 mean average of each channel.</P
8445></DIV
8446><DIV
8447CLASS="section"
8448><HR><H2
8449CLASS="section"
8450><A
8451NAME="AEN1698"
8452>A.62. llGetCreator</A
8453></H2
8454><DIV
8455CLASS="funcsynopsis"
8456><P
8457></P
8458><A
8459NAME="AEN1700"
8460></A
8461><P
8462><CODE
8463><CODE
8464CLASS="FUNCDEF"
8465>key llGetCreator</CODE
8466>(void);</CODE
8467></P
8468><P
8469></P
8470></DIV
8471><P
8472>Returns the creator of the object which has the script.</P
8473></DIV
8474><DIV
8475CLASS="section"
8476><HR><H2
8477CLASS="section"
8478><A
8479NAME="AEN1706"
8480>A.63. llGetDate</A
8481></H2
8482><DIV
8483CLASS="funcsynopsis"
8484><P
8485></P
8486><A
8487NAME="AEN1708"
8488></A
8489><P
8490><CODE
8491><CODE
8492CLASS="FUNCDEF"
8493>string llGetDate</CODE
8494>(void);</CODE
8495></P
8496><P
8497></P
8498></DIV
8499><P
8500>Returns the current UTC date as YYYY-MM-DD.</P
8501></DIV
8502><DIV
8503CLASS="section"
8504><HR><H2
8505CLASS="section"
8506><A
8507NAME="AEN1714"
8508>A.64. llGetEnergy</A
8509></H2
8510><DIV
8511CLASS="funcsynopsis"
8512><P
8513></P
8514><A
8515NAME="AEN1716"
8516></A
8517><P
8518><CODE
8519><CODE
8520CLASS="FUNCDEF"
8521>float llGetEnergy</CODE
8522>(void);</CODE
8523></P
8524><P
8525></P
8526></DIV
8527><P
8528>Returns how much energy is in the object as a percentage of
8529 maximum.</P
8530></DIV
8531><DIV
8532CLASS="section"
8533><HR><H2
8534CLASS="section"
8535><A
8536NAME="AEN1722"
8537>A.65. llGetForce</A
8538></H2
8539><DIV
8540CLASS="funcsynopsis"
8541><P
8542></P
8543><A
8544NAME="AEN1724"
8545></A
8546><P
8547><CODE
8548><CODE
8549CLASS="FUNCDEF"
8550>vector llGetForce</CODE
8551>(void);</CODE
8552></P
8553><P
8554></P
8555></DIV
8556><P
8557>Returns the current force if the script is physical.</P
8558></DIV
8559><DIV
8560CLASS="section"
8561><HR><H2
8562CLASS="section"
8563><A
8564NAME="AEN1730"
8565>A.66. llGetFreeMemory</A
8566></H2
8567><DIV
8568CLASS="funcsynopsis"
8569><P
8570></P
8571><A
8572NAME="AEN1732"
8573></A
8574><P
8575><CODE
8576><CODE
8577CLASS="FUNCDEF"
8578>integer llGetFreeMemory</CODE
8579>(void);</CODE
8580></P
8581><P
8582></P
8583></DIV
8584><P
8585>Returns the available heap space for the current script.</P
8586></DIV
8587><DIV
8588CLASS="section"
8589><HR><H2
8590CLASS="section"
8591><A
8592NAME="AEN1738"
8593>A.67. llGetGeometricCenter</A
8594></H2
8595><DIV
8596CLASS="funcsynopsis"
8597><P
8598></P
8599><A
8600NAME="AEN1740"
8601></A
8602><P
8603><CODE
8604><CODE
8605CLASS="FUNCDEF"
8606>vector llGetGeometricCenter</CODE
8607>(void);</CODE
8608></P
8609><P
8610></P
8611></DIV
8612><P
8613>Returns the geometric center of the linked set the script is attached to.</P
8614></DIV
8615><DIV
8616CLASS="section"
8617><HR><H2
8618CLASS="section"
8619><A
8620NAME="AEN1746"
8621>A.68. llGetGMTclock</A
8622></H2
8623><DIV
8624CLASS="funcsynopsis"
8625><P
8626></P
8627><A
8628NAME="AEN1748"
8629></A
8630><P
8631><CODE
8632><CODE
8633CLASS="FUNCDEF"
8634>float llGetGMTclock</CODE
8635>(void);</CODE
8636></P
8637><P
8638></P
8639></DIV
8640><P
8641>Returns the time in seconds since GMT midnight.</P
8642></DIV
8643><DIV
8644CLASS="section"
8645><HR><H2
8646CLASS="section"
8647><A
8648NAME="AEN1754"
8649>A.69. llGetInventoryCreator</A
8650></H2
8651><DIV
8652CLASS="funcsynopsis"
8653><P
8654></P
8655><A
8656NAME="AEN1756"
8657></A
8658><P
8659><CODE
8660><CODE
8661CLASS="FUNCDEF"
8662>key llGetInventoryCreator</CODE
8663>(string name);</CODE
8664></P
8665><P
8666></P
8667></DIV
8668><P
8669>Returns the key for the creator of the inventory
8670 <CODE
8671CLASS="parameter"
8672>name</CODE
8673>.</P
8674></DIV
8675><DIV
8676CLASS="section"
8677><HR><H2
8678CLASS="section"
8679><A
8680NAME="AEN1764"
8681>A.70. llGetInventoryKey</A
8682></H2
8683><DIV
8684CLASS="funcsynopsis"
8685><P
8686></P
8687><A
8688NAME="AEN1766"
8689></A
8690><P
8691><CODE
8692><CODE
8693CLASS="FUNCDEF"
8694>key llGetInventoryKey</CODE
8695>(string name);</CODE
8696></P
8697><P
8698></P
8699></DIV
8700><P
8701>Returns the key of the inventory
8702 <CODE
8703CLASS="parameter"
8704>name</CODE
8705>.</P
8706></DIV
8707><DIV
8708CLASS="section"
8709><HR><H2
8710CLASS="section"
8711><A
8712NAME="AEN1774"
8713>A.71. llGetInventoryName</A
8714></H2
8715><DIV
8716CLASS="funcsynopsis"
8717><P
8718></P
8719><A
8720NAME="AEN1776"
8721></A
8722><P
8723><CODE
8724><CODE
8725CLASS="FUNCDEF"
8726>string llGetInventoryName</CODE
8727>(integer type, integer number);</CODE
8728></P
8729><P
8730></P
8731></DIV
8732><P
8733>Get the name of the inventory item
8734 <CODE
8735CLASS="parameter"
8736>number</CODE
8737> of <CODE
8738CLASS="parameter"
8739>type</CODE
8740>. Use
8741 the <A
8742HREF="#AEN5411"
8743>inventory constants</A
8744> to
8745 specify the <CODE
8746CLASS="parameter"
8747>type</CODE
8748>.</P
8749></DIV
8750><DIV
8751CLASS="section"
8752><HR><H2
8753CLASS="section"
8754><A
8755NAME="AEN1789"
8756>A.72. llGetInventoryNumber</A
8757></H2
8758><DIV
8759CLASS="funcsynopsis"
8760><P
8761></P
8762><A
8763NAME="AEN1791"
8764></A
8765><P
8766><CODE
8767><CODE
8768CLASS="FUNCDEF"
8769>integer llGetInventoryNumber</CODE
8770>(integer type);</CODE
8771></P
8772><P
8773></P
8774></DIV
8775><P
8776>Get the number of items of <CODE
8777CLASS="parameter"
8778>type</CODE
8779> in
8780 the object inventory. Use the <A
8781HREF="#AEN5411"
8782>inventory constants</A
8783> to specify
8784 the <CODE
8785CLASS="parameter"
8786>type</CODE
8787>.</P
8788></DIV
8789><DIV
8790CLASS="section"
8791><HR><H2
8792CLASS="section"
8793><A
8794NAME="AEN1801"
8795>A.73. llGetInventoryPermMask</A
8796></H2
8797><DIV
8798CLASS="funcsynopsis"
8799><P
8800></P
8801><A
8802NAME="AEN1803"
8803></A
8804><P
8805><CODE
8806><CODE
8807CLASS="FUNCDEF"
8808>integer llGetInventoryPermMask</CODE
8809>(string item, integer mask);</CODE
8810></P
8811><P
8812></P
8813></DIV
8814><P
8815>Returns the requested permission <CODE
8816CLASS="parameter"
8817>mask</CODE
8818> for the
8819 specified inventory item. See <A
8820HREF="#AEN6412"
8821>Permission Mask Constants</A
8822>
8823 for more information. Example usage:
8824<DIV
8825CLASS="informalexample"
8826><P
8827></P
8828><A
8829NAME="AEN1814"
8830></A
8831><PRE
8832CLASS="programlisting"
8833>&#13;integer JeansPerms = llGetInventoryPermMask("Black Jeans", MASK_NEXT);
8834if (JeansPerms &#38; PERM_COPY)
8835{
8836 llSay(0, "The next owner may copy the 'Black Jeans'");
8837}
8838</PRE
8839><P
8840></P
8841></DIV
8842></P
8843></DIV
8844><DIV
8845CLASS="section"
8846><HR><H2
8847CLASS="section"
8848><A
8849NAME="AEN1816"
8850>A.74. llGetInventoryType</A
8851></H2
8852><DIV
8853CLASS="funcsynopsis"
8854><P
8855></P
8856><A
8857NAME="AEN1818"
8858></A
8859><P
8860><CODE
8861><CODE
8862CLASS="FUNCDEF"
8863>integer llGetInventoryType</CODE
8864>(string name);</CODE
8865></P
8866><P
8867></P
8868></DIV
8869><P
8870>Returns the type of the inventory
8871 <CODE
8872CLASS="parameter"
8873>name</CODE
8874>. INVENTORY_NONE is returned if no
8875 inventory matching <CODE
8876CLASS="parameter"
8877>name</CODE
8878> is found. Use the <A
8879HREF="#AEN5411"
8880>inventory constants</A
8881> to compare
8882 against the return value.</P
8883></DIV
8884><DIV
8885CLASS="section"
8886><HR><H2
8887CLASS="section"
8888><A
8889NAME="AEN1828"
8890>A.75. llGetKey</A
8891></H2
8892><DIV
8893CLASS="funcsynopsis"
8894><P
8895></P
8896><A
8897NAME="AEN1830"
8898></A
8899><P
8900><CODE
8901><CODE
8902CLASS="FUNCDEF"
8903>key llGetKey</CODE
8904>(void);</CODE
8905></P
8906><P
8907></P
8908></DIV
8909><P
8910>Get the key for the object which has this script.</P
8911></DIV
8912><DIV
8913CLASS="section"
8914><HR><H2
8915CLASS="section"
8916><A
8917NAME="AEN1836"
8918>A.76. llGetLandOwnerAt</A
8919></H2
8920><DIV
8921CLASS="funcsynopsis"
8922><P
8923></P
8924><A
8925NAME="AEN1838"
8926></A
8927><P
8928><CODE
8929><CODE
8930CLASS="FUNCDEF"
8931>key llGetLandOwnerAt</CODE
8932>(vector pos);</CODE
8933></P
8934><P
8935></P
8936></DIV
8937><P
8938>Returns the key of the land owner at
8939 <CODE
8940CLASS="parameter"
8941>pos</CODE
8942> or <A
8943HREF="#AEN6070"
8944>NULL_KEY</A
8945> if public.</P
8946></DIV
8947><DIV
8948CLASS="section"
8949><HR><H2
8950CLASS="section"
8951><A
8952NAME="AEN1847"
8953>A.77. llGetLinkKey</A
8954></H2
8955><DIV
8956CLASS="funcsynopsis"
8957><P
8958></P
8959><A
8960NAME="AEN1849"
8961></A
8962><P
8963><CODE
8964><CODE
8965CLASS="FUNCDEF"
8966>key llGetLinkKey</CODE
8967>(integer linknum);</CODE
8968></P
8969><P
8970></P
8971></DIV
8972><P
8973>Returns the key of <CODE
8974CLASS="parameter"
8975>linknum</CODE
8976> in the link
8977 set.</P
8978></DIV
8979><DIV
8980CLASS="section"
8981><HR><H2
8982CLASS="section"
8983><A
8984NAME="AEN1857"
8985>A.78. llGetLinkName</A
8986></H2
8987><DIV
8988CLASS="funcsynopsis"
8989><P
8990></P
8991><A
8992NAME="AEN1859"
8993></A
8994><P
8995><CODE
8996><CODE
8997CLASS="FUNCDEF"
8998>string llGetLinkName</CODE
8999>(integer linknum);</CODE
9000></P
9001><P
9002></P
9003></DIV
9004><P
9005>Returns the name of <CODE
9006CLASS="parameter"
9007>linknum</CODE
9008> in the
9009 link set.</P
9010></DIV
9011><DIV
9012CLASS="section"
9013><HR><H2
9014CLASS="section"
9015><A
9016NAME="AEN1867"
9017>A.79. llGetLinkNumber</A
9018></H2
9019><DIV
9020CLASS="funcsynopsis"
9021><P
9022></P
9023><A
9024NAME="AEN1869"
9025></A
9026><P
9027><CODE
9028><CODE
9029CLASS="FUNCDEF"
9030>integer llGetLinkNumber</CODE
9031>(void);</CODE
9032></P
9033><P
9034></P
9035></DIV
9036><P
9037>Returns what link number in a link set the for the object
9038 which has this script. 0 means no link, 1 the root, 2 for first
9039 child, etc.</P
9040></DIV
9041><DIV
9042CLASS="section"
9043><HR><H2
9044CLASS="section"
9045><A
9046NAME="AEN1875"
9047>A.80. llGetListEntryType</A
9048></H2
9049><DIV
9050CLASS="funcsynopsis"
9051><P
9052></P
9053><A
9054NAME="AEN1877"
9055></A
9056><P
9057><CODE
9058><CODE
9059CLASS="FUNCDEF"
9060>integer llGetListEntryType</CODE
9061>(list src, integer index);</CODE
9062></P
9063><P
9064></P
9065></DIV
9066><P
9067>Returns the <A
9068HREF="#AEN5733"
9069>type</A
9070> of the
9071 variable at <CODE
9072CLASS="parameter"
9073>index</CODE
9074> in
9075 <CODE
9076CLASS="parameter"
9077>src</CODE
9078>.</P
9079></DIV
9080><DIV
9081CLASS="section"
9082><HR><H2
9083CLASS="section"
9084><A
9085NAME="AEN1889"
9086>A.81. llGetListLength</A
9087></H2
9088><DIV
9089CLASS="funcsynopsis"
9090><P
9091></P
9092><A
9093NAME="AEN1891"
9094></A
9095><P
9096><CODE
9097><CODE
9098CLASS="FUNCDEF"
9099>integer llGetListLength</CODE
9100>(list src);</CODE
9101></P
9102><P
9103></P
9104></DIV
9105><P
9106>Returns the number of elements in
9107 <CODE
9108CLASS="parameter"
9109>src</CODE
9110>.</P
9111></DIV
9112><DIV
9113CLASS="section"
9114><HR><H2
9115CLASS="section"
9116><A
9117NAME="AEN1899"
9118>A.82. llGetLocalPos</A
9119></H2
9120><DIV
9121CLASS="funcsynopsis"
9122><P
9123></P
9124><A
9125NAME="AEN1901"
9126></A
9127><P
9128><CODE
9129><CODE
9130CLASS="FUNCDEF"
9131>vector llGetLocalPos</CODE
9132>(void);</CODE
9133></P
9134><P
9135></P
9136></DIV
9137><P
9138>Returns the local position of a child object relative to the
9139 root.</P
9140></DIV
9141><DIV
9142CLASS="section"
9143><HR><H2
9144CLASS="section"
9145><A
9146NAME="AEN1907"
9147>A.83. llGetLocalRot</A
9148></H2
9149><DIV
9150CLASS="funcsynopsis"
9151><P
9152></P
9153><A
9154NAME="AEN1909"
9155></A
9156><P
9157><CODE
9158><CODE
9159CLASS="FUNCDEF"
9160>rotation llGetLocalRot</CODE
9161>(void);</CODE
9162></P
9163><P
9164></P
9165></DIV
9166><P
9167>Returns the local rotation of a child object relative to the
9168 root.</P
9169></DIV
9170><DIV
9171CLASS="section"
9172><HR><H2
9173CLASS="section"
9174><A
9175NAME="AEN1915"
9176>A.84. llGetMass</A
9177></H2
9178><DIV
9179CLASS="funcsynopsis"
9180><P
9181></P
9182><A
9183NAME="AEN1917"
9184></A
9185><P
9186><CODE
9187><CODE
9188CLASS="FUNCDEF"
9189>float llGetMass</CODE
9190>(void);</CODE
9191></P
9192><P
9193></P
9194></DIV
9195><P
9196>Returns the mass of the object in Kilograms. Most materials
9197 in Second Life are less dense than their first life counterparts,
9198 so the returned mass may be less than you might expect.</P
9199></DIV
9200><DIV
9201CLASS="section"
9202><HR><H2
9203CLASS="section"
9204><A
9205NAME="AEN1923"
9206>A.85. llGetObjectMass</A
9207></H2
9208><DIV
9209CLASS="funcsynopsis"
9210><P
9211></P
9212><A
9213NAME="AEN1925"
9214></A
9215><P
9216><CODE
9217><CODE
9218CLASS="FUNCDEF"
9219>float llGetObjectMass</CODE
9220>(key id);</CODE
9221></P
9222><P
9223></P
9224></DIV
9225><P
9226>Returns the mass of the object specified by <CODE
9227CLASS="parameter"
9228>id</CODE
9229> in Kilograms. Most materials
9230 in Second Life are less dense than their first life counterparts,
9231 so the returned mass may be less than you might expect.</P
9232></DIV
9233><DIV
9234CLASS="section"
9235><HR><H2
9236CLASS="section"
9237><A
9238NAME="AEN1933"
9239>A.86. llGetNextEmail</A
9240></H2
9241><DIV
9242CLASS="funcsynopsis"
9243><P
9244></P
9245><A
9246NAME="AEN1935"
9247></A
9248><P
9249><CODE
9250><CODE
9251CLASS="FUNCDEF"
9252>llGetNextEmail</CODE
9253>(string address, string subject);</CODE
9254></P
9255><P
9256></P
9257></DIV
9258><P
9259>Get the next waiting email with appropriate
9260 <CODE
9261CLASS="parameter"
9262>address</CODE
9263> and/or
9264 <CODE
9265CLASS="parameter"
9266>subject</CODE
9267>. If the parameters are blank, they
9268 are not used for filtering.</P
9269></DIV
9270><DIV
9271CLASS="section"
9272><HR><H2
9273CLASS="section"
9274><A
9275NAME="AEN1946"
9276>A.87. llGetNotecardLine</A
9277></H2
9278><DIV
9279CLASS="funcsynopsis"
9280><P
9281></P
9282><A
9283NAME="AEN1948"
9284></A
9285><P
9286><CODE
9287><CODE
9288CLASS="FUNCDEF"
9289>key llGetNotecardLine</CODE
9290>(string name, integer line);</CODE
9291></P
9292><P
9293></P
9294></DIV
9295><P
9296>This function fetches line number
9297 <CODE
9298CLASS="parameter"
9299>line</CODE
9300> of notecard
9301 <CODE
9302CLASS="parameter"
9303>name</CODE
9304> and returns the data through the <A
9305HREF="#AEN4997"
9306>dataserver</A
9307> event. The line count
9308 starts at zero. If the requested line is past the end of the
9309 notecard the <A
9310HREF="#AEN4997"
9311>dataserver</A
9312>
9313 event will return the constant <A
9314HREF="#AEN6076"
9315>EOF</A
9316> string. The key returned by
9317 this function is a unique identifier which will be supplied to the
9318 <A
9319HREF="#AEN4997"
9320>dataserver</A
9321> event in the
9322 <CODE
9323CLASS="parameter"
9324>requested</CODE
9325> parameter.</P
9326></DIV
9327><DIV
9328CLASS="section"
9329><HR><H2
9330CLASS="section"
9331><A
9332NAME="AEN1964"
9333>A.88. llGetNumberOfNotecardLines</A
9334></H2
9335><DIV
9336CLASS="funcsynopsis"
9337><P
9338></P
9339><A
9340NAME="AEN1966"
9341></A
9342><P
9343><CODE
9344><CODE
9345CLASS="FUNCDEF"
9346>key llGetNumberOfNotecardLines</CODE
9347>(string name);</CODE
9348></P
9349><P
9350></P
9351></DIV
9352><P
9353>This function reads the number of lines in notecard <CODE
9354CLASS="parameter"
9355>name</CODE
9356>
9357 and returns this information through the <A
9358HREF="#AEN4997"
9359>dataserver</A
9360> event.
9361 The key returned by this function is a unique identifier which will be supplied to the
9362 <A
9363HREF="#AEN4997"
9364>dataserver</A
9365> event in the <CODE
9366CLASS="parameter"
9367>requested</CODE
9368>
9369 parameter. You will need to cast the returned string to an integer.</P
9370></DIV
9371><DIV
9372CLASS="section"
9373><HR><H2
9374CLASS="section"
9375><A
9376NAME="AEN1977"
9377>A.89. llGetNumberOfPrims</A
9378></H2
9379><DIV
9380CLASS="funcsynopsis"
9381><P
9382></P
9383><A
9384NAME="AEN1979"
9385></A
9386><P
9387><CODE
9388><CODE
9389CLASS="FUNCDEF"
9390>integer llGetNumberOfPrims</CODE
9391>(void);</CODE
9392></P
9393><P
9394></P
9395></DIV
9396><P
9397>Returns the number of prims in the linked set the script is attached to.</P
9398></DIV
9399><DIV
9400CLASS="section"
9401><HR><H2
9402CLASS="section"
9403><A
9404NAME="AEN1985"
9405>A.90. llGetNumberOfSides</A
9406></H2
9407><DIV
9408CLASS="funcsynopsis"
9409><P
9410></P
9411><A
9412NAME="AEN1987"
9413></A
9414><P
9415><CODE
9416><CODE
9417CLASS="FUNCDEF"
9418>key llGetNumberOfSides</CODE
9419>(void);</CODE
9420></P
9421><P
9422></P
9423></DIV
9424><P
9425>Returns the number of sides of the current which has the
9426 script.</P
9427></DIV
9428><DIV
9429CLASS="section"
9430><HR><H2
9431CLASS="section"
9432><A
9433NAME="AEN1993"
9434>A.91. llGetObjectDesc</A
9435></H2
9436><DIV
9437CLASS="funcsynopsis"
9438><P
9439></P
9440><A
9441NAME="AEN1995"
9442></A
9443><P
9444><CODE
9445><CODE
9446CLASS="FUNCDEF"
9447>string llGetObjectDesc</CODE
9448>(void);</CODE
9449></P
9450><P
9451></P
9452></DIV
9453><P
9454>Returns the description of the object which has the script.</P
9455></DIV
9456><DIV
9457CLASS="section"
9458><HR><H2
9459CLASS="section"
9460><A
9461NAME="AEN2001"
9462>A.92. llGetObjectName</A
9463></H2
9464><DIV
9465CLASS="funcsynopsis"
9466><P
9467></P
9468><A
9469NAME="AEN2003"
9470></A
9471><P
9472><CODE
9473><CODE
9474CLASS="FUNCDEF"
9475>string llGetObjectName</CODE
9476>(void);</CODE
9477></P
9478><P
9479></P
9480></DIV
9481><P
9482>Returns the name of the object which has the script.</P
9483></DIV
9484><DIV
9485CLASS="section"
9486><HR><H2
9487CLASS="section"
9488><A
9489NAME="AEN2009"
9490>A.93. llGetObjectPermMask</A
9491></H2
9492><DIV
9493CLASS="funcsynopsis"
9494><P
9495></P
9496><A
9497NAME="AEN2011"
9498></A
9499><P
9500><CODE
9501><CODE
9502CLASS="FUNCDEF"
9503>integer llGetObjectPermMask</CODE
9504>(integer mask);</CODE
9505></P
9506><P
9507></P
9508></DIV
9509><P
9510>Returns the requested permission <CODE
9511CLASS="parameter"
9512>mask</CODE
9513> for the root object the
9514 task is attached to. See <A
9515HREF="#AEN6412"
9516>Permission Mask Constants</A
9517>
9518 for more information. Example usage:
9519<DIV
9520CLASS="informalexample"
9521><P
9522></P
9523><A
9524NAME="AEN2020"
9525></A
9526><PRE
9527CLASS="programlisting"
9528>&#13;integer ObjectPerms = llGetObjectPermMask(MASK_NEXT);
9529if (ObjectPerms &#38; PERM_COPY)
9530{
9531 llSay(0, "The next owner may copy this item");
9532}
9533</PRE
9534><P
9535></P
9536></DIV
9537></P
9538></DIV
9539><DIV
9540CLASS="section"
9541><HR><H2
9542CLASS="section"
9543><A
9544NAME="AEN2022"
9545>A.94. llGetOmega</A
9546></H2
9547><DIV
9548CLASS="funcsynopsis"
9549><P
9550></P
9551><A
9552NAME="AEN2024"
9553></A
9554><P
9555><CODE
9556><CODE
9557CLASS="FUNCDEF"
9558>vector llGetOmega</CODE
9559>(void);</CODE
9560></P
9561><P
9562></P
9563></DIV
9564><P
9565>Returns the omega.</P
9566></DIV
9567><DIV
9568CLASS="section"
9569><HR><H2
9570CLASS="section"
9571><A
9572NAME="AEN2030"
9573>A.95. llGetOwner</A
9574></H2
9575><DIV
9576CLASS="funcsynopsis"
9577><P
9578></P
9579><A
9580NAME="AEN2032"
9581></A
9582><P
9583><CODE
9584><CODE
9585CLASS="FUNCDEF"
9586>key llGetOwner</CODE
9587>(void);</CODE
9588></P
9589><P
9590></P
9591></DIV
9592><P
9593>Returns the owner of the object.</P
9594></DIV
9595><DIV
9596CLASS="section"
9597><HR><H2
9598CLASS="section"
9599><A
9600NAME="AEN2038"
9601>A.96. llGetOwnerKey</A
9602></H2
9603><DIV
9604CLASS="funcsynopsis"
9605><P
9606></P
9607><A
9608NAME="AEN2040"
9609></A
9610><P
9611><CODE
9612><CODE
9613CLASS="FUNCDEF"
9614>key llGetOwnerKey</CODE
9615>(key id);</CODE
9616></P
9617><P
9618></P
9619></DIV
9620><P
9621>Returns the owner of object
9622 <CODE
9623CLASS="parameter"
9624>id</CODE
9625>.</P
9626></DIV
9627><DIV
9628CLASS="section"
9629><HR><H2
9630CLASS="section"
9631><A
9632NAME="AEN2048"
9633>A.97. llGetPermissions</A
9634></H2
9635><DIV
9636CLASS="funcsynopsis"
9637><P
9638></P
9639><A
9640NAME="AEN2050"
9641></A
9642><P
9643><CODE
9644><CODE
9645CLASS="FUNCDEF"
9646>integer llGetPermissions</CODE
9647>(void);</CODE
9648></P
9649><P
9650></P
9651></DIV
9652><P
9653>Returns what permissions have been enabled. eg:
9654<DIV
9655CLASS="informalexample"
9656><P
9657></P
9658><A
9659NAME="AEN2056"
9660></A
9661><PRE
9662CLASS="programlisting"
9663>&#13;integer perm = llGetPermissions();
9664if((perm &#38; PERMISSION_DEBIT) == PERMISSION_DEBIT)
9665{
9666 // code goes here
9667}
9668</PRE
9669><P
9670></P
9671></DIV
9672></P
9673></DIV
9674><DIV
9675CLASS="section"
9676><HR><H2
9677CLASS="section"
9678><A
9679NAME="AEN2058"
9680>A.98. llGetPermissionsKey</A
9681></H2
9682><DIV
9683CLASS="funcsynopsis"
9684><P
9685></P
9686><A
9687NAME="AEN2060"
9688></A
9689><P
9690><CODE
9691><CODE
9692CLASS="FUNCDEF"
9693>key llGetPermissionsKey</CODE
9694>(void);</CODE
9695></P
9696><P
9697></P
9698></DIV
9699><P
9700>Returns avatar that has enabled permissions. Returns <A
9701HREF="#AEN6070"
9702>NULL_KEY</A
9703> if not enabled.</P
9704></DIV
9705><DIV
9706CLASS="section"
9707><HR><H2
9708CLASS="section"
9709><A
9710NAME="AEN2067"
9711>A.99. llGetPos</A
9712></H2
9713><DIV
9714CLASS="funcsynopsis"
9715><P
9716></P
9717><A
9718NAME="AEN2069"
9719></A
9720><P
9721><CODE
9722><CODE
9723CLASS="FUNCDEF"
9724>vector llGetPos</CODE
9725>(void);</CODE
9726></P
9727><P
9728></P
9729></DIV
9730><P
9731>Returns the position.</P
9732></DIV
9733><DIV
9734CLASS="section"
9735><HR><H2
9736CLASS="section"
9737><A
9738NAME="AEN2075"
9739>A.100. llGetPrimitiveParams</A
9740></H2
9741><DIV
9742CLASS="funcsynopsis"
9743><P
9744></P
9745><A
9746NAME="AEN2077"
9747></A
9748><P
9749><CODE
9750><CODE
9751CLASS="FUNCDEF"
9752>list llGetPrimitiveParams</CODE
9753>(list parameters);</CODE
9754></P
9755><P
9756></P
9757></DIV
9758><P
9759>Get primitive parameters specified in <CODE
9760CLASS="parameter"
9761>parameters</CODE
9762>. The
9763 <CODE
9764CLASS="parameter"
9765>parameters</CODE
9766> are identical to the rules of <A
9767HREF="#AEN4020"
9768>llSetPrimitiveParams</A
9769>, and the returned list is ordered as such. Most requested parameters do not require a value to be associated, except for texture-related requests (PRIM_TEXTURE, PRIM_COLOR, and PRIM_BUMP_SHINY) which require a side number to be specified as well.
9770
9771 Valid parameters can be found in the <A
9772HREF="#AEN6323"
9773>Primitive Constants</A
9774>.
9775 Here is a simple example:
9776<DIV
9777CLASS="informalexample"
9778><P
9779></P
9780><A
9781NAME="AEN2088"
9782></A
9783><PRE
9784CLASS="programlisting"
9785>&#13;llGetPrimitiveParams([PRIM_TYPE, PRIM_MATERIAL, PRIM_COLOR, ALL_SIDES, PRIM_POSITION]);
9786</PRE
9787><P
9788></P
9789></DIV
9790>
9791 This would return a list similar to this:
9792<DIV
9793CLASS="informalexample"
9794><P
9795></P
9796><A
9797NAME="AEN2090"
9798></A
9799><PRE
9800CLASS="programlisting"
9801>&#13; [PRIM_TYPE_BOX, PRIM_HOLE_DEFAULT, &#60;0, 1, 0&#62;, 0.0, &#60;0, 0, 0&#62;, &#60;1, 1, 0&#62;, &#60;0, 0, 0&#62;, // PRIM_TYPE
9802 PRIM_MATERIAL_WOOD, // PRIM_MATERIAL
9803 0, &#60;1, 1, 1&#62;, 1.0, // PRIM_COLOR (ALL_SIDES specified, so all 6 sides returned)
9804 1, &#60;1, 0, 0&#62;, 0.5,
9805 2, &#60;0, 0, 1&#62;, 1.0,
9806 3, &#60;0, 1, 0&#62;, 1.0,
9807 4, &#60;0, 0, 0&#62;, 0.5,
9808 5, &#60;1, 1, 1&#62;, 1.0,
9809 &#60;37.341, 195.283, 31.239&#62;] // PRIM_POSITION
9810</PRE
9811><P
9812></P
9813></DIV
9814></P
9815></DIV
9816><DIV
9817CLASS="section"
9818><HR><H2
9819CLASS="section"
9820><A
9821NAME="AEN2092"
9822>A.101. llGetRegionCorner</A
9823></H2
9824><DIV
9825CLASS="funcsynopsis"
9826><P
9827></P
9828><A
9829NAME="AEN2094"
9830></A
9831><P
9832><CODE
9833><CODE
9834CLASS="FUNCDEF"
9835>llGetRegionCorner</CODE
9836>(void);</CODE
9837></P
9838><P
9839></P
9840></DIV
9841><P
9842>Returns a vector with the south west corner position of the
9843 current region.</P
9844></DIV
9845><DIV
9846CLASS="section"
9847><HR><H2
9848CLASS="section"
9849><A
9850NAME="AEN2100"
9851>A.102. llGetRegionFPS</A
9852></H2
9853><DIV
9854CLASS="funcsynopsis"
9855><P
9856></P
9857><A
9858NAME="AEN2102"
9859></A
9860><P
9861><CODE
9862><CODE
9863CLASS="FUNCDEF"
9864>llGetRegionFPS</CODE
9865>(void);</CODE
9866></P
9867><P
9868></P
9869></DIV
9870><P
9871>Returns the mean region frames per second.</P
9872></DIV
9873><DIV
9874CLASS="section"
9875><HR><H2
9876CLASS="section"
9877><A
9878NAME="AEN2108"
9879>A.103. llGetRegionName</A
9880></H2
9881><DIV
9882CLASS="funcsynopsis"
9883><P
9884></P
9885><A
9886NAME="AEN2110"
9887></A
9888><P
9889><CODE
9890><CODE
9891CLASS="FUNCDEF"
9892>string llGetRegionName</CODE
9893>(void);</CODE
9894></P
9895><P
9896></P
9897></DIV
9898><P
9899>Returns the current region name.</P
9900></DIV
9901><DIV
9902CLASS="section"
9903><HR><H2
9904CLASS="section"
9905><A
9906NAME="AEN2116"
9907>A.104. llGetRegionTimeDilation</A
9908></H2
9909><DIV
9910CLASS="funcsynopsis"
9911><P
9912></P
9913><A
9914NAME="AEN2118"
9915></A
9916><P
9917><CODE
9918><CODE
9919CLASS="FUNCDEF"
9920>float llGetRegionTimeDilation</CODE
9921>(void);</CODE
9922></P
9923><P
9924></P
9925></DIV
9926><P
9927>Returns the current time dilation as a float between 0 and 1.</P
9928></DIV
9929><DIV
9930CLASS="section"
9931><HR><H2
9932CLASS="section"
9933><A
9934NAME="AEN2124"
9935>A.105. llGetRootPosition</A
9936></H2
9937><DIV
9938CLASS="funcsynopsis"
9939><P
9940></P
9941><A
9942NAME="AEN2126"
9943></A
9944><P
9945><CODE
9946><CODE
9947CLASS="FUNCDEF"
9948>vector llGetRootPosition</CODE
9949>(void);</CODE
9950></P
9951><P
9952></P
9953></DIV
9954><P
9955>Returns the global position of the root object of the object the script is attached to.</P
9956></DIV
9957><DIV
9958CLASS="section"
9959><HR><H2
9960CLASS="section"
9961><A
9962NAME="AEN2132"
9963>A.106. llGetRootRotation</A
9964></H2
9965><DIV
9966CLASS="funcsynopsis"
9967><P
9968></P
9969><A
9970NAME="AEN2134"
9971></A
9972><P
9973><CODE
9974><CODE
9975CLASS="FUNCDEF"
9976>rotation llGetRootRotation</CODE
9977>(void);</CODE
9978></P
9979><P
9980></P
9981></DIV
9982><P
9983>Returns the global rotation of the root object of the object the script is attached to.</P
9984></DIV
9985><DIV
9986CLASS="section"
9987><HR><H2
9988CLASS="section"
9989><A
9990NAME="AEN2140"
9991>A.107. llGetRot</A
9992></H2
9993><DIV
9994CLASS="funcsynopsis"
9995><P
9996></P
9997><A
9998NAME="AEN2142"
9999></A
10000><P
10001><CODE
10002><CODE
10003CLASS="FUNCDEF"
10004>rotation llGetRot</CODE
10005>(void);</CODE
10006></P
10007><P
10008></P
10009></DIV
10010><P
10011>Returns the rotation.</P
10012></DIV
10013><DIV
10014CLASS="section"
10015><HR><H2
10016CLASS="section"
10017><A
10018NAME="AEN2148"
10019>A.108. llGetScale</A
10020></H2
10021><DIV
10022CLASS="funcsynopsis"
10023><P
10024></P
10025><A
10026NAME="AEN2150"
10027></A
10028><P
10029><CODE
10030><CODE
10031CLASS="FUNCDEF"
10032>vector llGetScale</CODE
10033>(void);</CODE
10034></P
10035><P
10036></P
10037></DIV
10038><P
10039>Returns the scale.</P
10040></DIV
10041><DIV
10042CLASS="section"
10043><HR><H2
10044CLASS="section"
10045><A
10046NAME="AEN2156"
10047>A.109. llGetScriptName</A
10048></H2
10049><DIV
10050CLASS="funcsynopsis"
10051><P
10052></P
10053><A
10054NAME="AEN2158"
10055></A
10056><P
10057><CODE
10058><CODE
10059CLASS="FUNCDEF"
10060>string llGetScriptName</CODE
10061>(void);</CODE
10062></P
10063><P
10064></P
10065></DIV
10066><P
10067>Returns the name of this script.</P
10068></DIV
10069><DIV
10070CLASS="section"
10071><HR><H2
10072CLASS="section"
10073><A
10074NAME="AEN2164"
10075>A.110. llGetStartParameter</A
10076></H2
10077><DIV
10078CLASS="funcsynopsis"
10079><P
10080></P
10081><A
10082NAME="AEN2166"
10083></A
10084><P
10085><CODE
10086><CODE
10087CLASS="FUNCDEF"
10088>integer llGetStartParameter</CODE
10089>(void);</CODE
10090></P
10091><P
10092></P
10093></DIV
10094><P
10095>Returns the start parameter passed to <A
10096HREF="#AEN3461"
10097>llRezObject</A
10098> or <A
10099HREF="#AEN3434"
10100>llRezAtRoot</A
10101>. If the object was
10102 created from agent inventory, this function returns 0.</P
10103></DIV
10104><DIV
10105CLASS="section"
10106><HR><H2
10107CLASS="section"
10108><A
10109NAME="AEN2174"
10110>A.111. llGetScriptState</A
10111></H2
10112><DIV
10113CLASS="funcsynopsis"
10114><P
10115></P
10116><A
10117NAME="AEN2176"
10118></A
10119><P
10120><CODE
10121><CODE
10122CLASS="FUNCDEF"
10123>integer llGetScriptState</CODE
10124>(string name);</CODE
10125></P
10126><P
10127></P
10128></DIV
10129><P
10130>Resets TRUE if script <CODE
10131CLASS="parameter"
10132>name</CODE
10133> is running</P
10134></DIV
10135><DIV
10136CLASS="section"
10137><HR><H2
10138CLASS="section"
10139><A
10140NAME="AEN2184"
10141>A.112. llGetStatus</A
10142></H2
10143><DIV
10144CLASS="funcsynopsis"
10145><P
10146></P
10147><A
10148NAME="AEN2186"
10149></A
10150><P
10151><CODE
10152><CODE
10153CLASS="FUNCDEF"
10154>integer llGetStatus</CODE
10155>(integer status);</CODE
10156></P
10157><P
10158></P
10159></DIV
10160><P
10161>Returns the value of <CODE
10162CLASS="parameter"
10163>status</CODE
10164>. The
10165 value will be one of the <A
10166HREF="#AEN5304"
10167>status
10168 constants</A
10169>.</P
10170></DIV
10171><DIV
10172CLASS="section"
10173><HR><H2
10174CLASS="section"
10175><A
10176NAME="AEN2195"
10177>A.113. llGetSubString</A
10178></H2
10179><DIV
10180CLASS="funcsynopsis"
10181><P
10182></P
10183><A
10184NAME="AEN2197"
10185></A
10186><P
10187><CODE
10188><CODE
10189CLASS="FUNCDEF"
10190>string llGetSubString</CODE
10191>(string src, integer start, integer end);</CODE
10192></P
10193><P
10194></P
10195></DIV
10196><P
10197>Returns the indicated substring from
10198 <CODE
10199CLASS="parameter"
10200>src</CODE
10201>. The <CODE
10202CLASS="parameter"
10203>start</CODE
10204> and
10205 <CODE
10206CLASS="parameter"
10207>end</CODE
10208> are inclusive, so 0,length-1 would
10209 capture the entire string and 0,0 would capture the first
10210 character. Using negative numbers for <CODE
10211CLASS="parameter"
10212>start</CODE
10213>
10214 and/or <CODE
10215CLASS="parameter"
10216>end</CODE
10217> causes the index to count
10218 backwards from the length of the string, so 0,-1 would capture the
10219 entire string. If start is larger than end the sub string is the
10220 exclusion of the entries, so 6,4 would give the entire string
10221 except for the 5<SUP
10222>th</SUP
10223> character.</P
10224></DIV
10225><DIV
10226CLASS="section"
10227><HR><H2
10228CLASS="section"
10229><A
10230NAME="AEN2214"
10231>A.114. llGetSunDirection</A
10232></H2
10233><DIV
10234CLASS="funcsynopsis"
10235><P
10236></P
10237><A
10238NAME="AEN2216"
10239></A
10240><P
10241><CODE
10242><CODE
10243CLASS="FUNCDEF"
10244>vector llGetSunDirection</CODE
10245>(void);</CODE
10246></P
10247><P
10248></P
10249></DIV
10250><P
10251>Returns the sun direction on the simulator.</P
10252></DIV
10253><DIV
10254CLASS="section"
10255><HR><H2
10256CLASS="section"
10257><A
10258NAME="AEN2222"
10259>A.115. llGetTexture</A
10260></H2
10261><DIV
10262CLASS="funcsynopsis"
10263><P
10264></P
10265><A
10266NAME="AEN2224"
10267></A
10268><P
10269><CODE
10270><CODE
10271CLASS="FUNCDEF"
10272>string llGetTexture</CODE
10273>(integer face);</CODE
10274></P
10275><P
10276></P
10277></DIV
10278><P
10279>Returns the texture of <CODE
10280CLASS="parameter"
10281>face</CODE
10282> if it is
10283 found in object inventory.</P
10284></DIV
10285><DIV
10286CLASS="section"
10287><HR><H2
10288CLASS="section"
10289><A
10290NAME="AEN2232"
10291>A.116. llGetTextureOffset</A
10292></H2
10293><DIV
10294CLASS="funcsynopsis"
10295><P
10296></P
10297><A
10298NAME="AEN2234"
10299></A
10300><P
10301><CODE
10302><CODE
10303CLASS="FUNCDEF"
10304>vector llGetTextureOffset</CODE
10305>(integer side);</CODE
10306></P
10307><P
10308></P
10309></DIV
10310><P
10311>Returns the texture offset of <CODE
10312CLASS="parameter"
10313>side</CODE
10314> in
10315 the x and y components of a vector.</P
10316></DIV
10317><DIV
10318CLASS="section"
10319><HR><H2
10320CLASS="section"
10321><A
10322NAME="AEN2242"
10323>A.117. llGetTextureRot</A
10324></H2
10325><DIV
10326CLASS="funcsynopsis"
10327><P
10328></P
10329><A
10330NAME="AEN2244"
10331></A
10332><P
10333><CODE
10334><CODE
10335CLASS="FUNCDEF"
10336>float llGetTextureRot</CODE
10337>(integer side);</CODE
10338></P
10339><P
10340></P
10341></DIV
10342><P
10343>Returns the texture rotation of
10344 <CODE
10345CLASS="parameter"
10346>side</CODE
10347>.</P
10348></DIV
10349><DIV
10350CLASS="section"
10351><HR><H2
10352CLASS="section"
10353><A
10354NAME="AEN2252"
10355>A.118. llGetTextureScale</A
10356></H2
10357><DIV
10358CLASS="funcsynopsis"
10359><P
10360></P
10361><A
10362NAME="AEN2254"
10363></A
10364><P
10365><CODE
10366><CODE
10367CLASS="FUNCDEF"
10368>vector llGetTextureScale</CODE
10369>(integer side);</CODE
10370></P
10371><P
10372></P
10373></DIV
10374><P
10375>Returns the texture scale of <CODE
10376CLASS="parameter"
10377>side</CODE
10378> in
10379 the x and y components of a vector.</P
10380></DIV
10381><DIV
10382CLASS="section"
10383><HR><H2
10384CLASS="section"
10385><A
10386NAME="AEN2262"
10387>A.119. llGetTime</A
10388></H2
10389><DIV
10390CLASS="funcsynopsis"
10391><P
10392></P
10393><A
10394NAME="AEN2264"
10395></A
10396><P
10397><CODE
10398><CODE
10399CLASS="FUNCDEF"
10400>float llGetTime</CODE
10401>(void);</CODE
10402></P
10403><P
10404></P
10405></DIV
10406><P
10407>Returns the seconds of elapsed time from an internal timer
10408 associated with the script. The timer is reset on rez, simulator
10409 restart, script reset, and in calls to <A
10410HREF="#AEN1638"
10411>llGetAndResetTime</A
10412> or <A
10413HREF="#AEN3426"
10414>llResetTime</A
10415>. Use <A
10416HREF="#AEN4188"
10417>llSetTimerEvent</A
10418> if you want a
10419 reliable timing mechanism.</P
10420></DIV
10421><DIV
10422CLASS="section"
10423><HR><H2
10424CLASS="section"
10425><A
10426NAME="AEN2273"
10427>A.120. llGetTimeOfDay</A
10428></H2
10429><DIV
10430CLASS="funcsynopsis"
10431><P
10432></P
10433><A
10434NAME="AEN2275"
10435></A
10436><P
10437><CODE
10438><CODE
10439CLASS="FUNCDEF"
10440>float llGetTimeOfDay</CODE
10441>(void);</CODE
10442></P
10443><P
10444></P
10445></DIV
10446><P
10447>Gets the time in seconds since midnight in Second Life.</P
10448></DIV
10449><DIV
10450CLASS="section"
10451><HR><H2
10452CLASS="section"
10453><A
10454NAME="AEN2281"
10455>A.121. llGetTimestamp</A
10456></H2
10457><DIV
10458CLASS="funcsynopsis"
10459><P
10460></P
10461><A
10462NAME="AEN2283"
10463></A
10464><P
10465><CODE
10466><CODE
10467CLASS="FUNCDEF"
10468>string llGetTimestamp</CODE
10469>(void);</CODE
10470></P
10471><P
10472></P
10473></DIV
10474><P
10475>Returns a timestamp in the format: YYYY-MM-DDThh:mm:ss.ff..fZ.</P
10476></DIV
10477><DIV
10478CLASS="section"
10479><HR><H2
10480CLASS="section"
10481><A
10482NAME="AEN2289"
10483>A.122. llGetTorque</A
10484></H2
10485><DIV
10486CLASS="funcsynopsis"
10487><P
10488></P
10489><A
10490NAME="AEN2291"
10491></A
10492><P
10493><CODE
10494><CODE
10495CLASS="FUNCDEF"
10496>vector llGetTorque</CODE
10497>(void);</CODE
10498></P
10499><P
10500></P
10501></DIV
10502><P
10503>Returns the torque if the script is physical.</P
10504></DIV
10505><DIV
10506CLASS="section"
10507><HR><H2
10508CLASS="section"
10509><A
10510NAME="AEN2297"
10511>A.123. llGetVel</A
10512></H2
10513><DIV
10514CLASS="funcsynopsis"
10515><P
10516></P
10517><A
10518NAME="AEN2299"
10519></A
10520><P
10521><CODE
10522><CODE
10523CLASS="FUNCDEF"
10524>vector llGetVel</CODE
10525>();</CODE
10526></P
10527><P
10528></P
10529></DIV
10530><P
10531>Returns the velocity.</P
10532></DIV
10533><DIV
10534CLASS="section"
10535><HR><H2
10536CLASS="section"
10537><A
10538NAME="AEN2306"
10539>A.124. llGetWallclock</A
10540></H2
10541><DIV
10542CLASS="funcsynopsis"
10543><P
10544></P
10545><A
10546NAME="AEN2308"
10547></A
10548><P
10549><CODE
10550><CODE
10551CLASS="FUNCDEF"
10552>float llGetWallclock</CODE
10553>(void);</CODE
10554></P
10555><P
10556></P
10557></DIV
10558><P
10559>Returns the time in seconds since simulator timezone
10560 midnight. Currently this is PST.</P
10561></DIV
10562><DIV
10563CLASS="section"
10564><HR><H2
10565CLASS="section"
10566><A
10567NAME="AEN2314"
10568>A.125. llGiveInventory</A
10569></H2
10570><DIV
10571CLASS="funcsynopsis"
10572><P
10573></P
10574><A
10575NAME="AEN2316"
10576></A
10577><P
10578><CODE
10579><CODE
10580CLASS="FUNCDEF"
10581>llGiveInventory</CODE
10582>(key destination, string inventory);</CODE
10583></P
10584><P
10585></P
10586></DIV
10587><P
10588>Give the named inventory item to the keyed avatar or object
10589 in the same simulator as the giver. If the recipient is an avatar,
10590 the avatar then follows the normal procedure of accepting or
10591 denying the offer. If the recipient is an object, the same
10592 permissions apply as if you were dragging inventory onto the
10593 object by hand, ie if <A
10594HREF="#AEN1047"
10595>llAllowInventoryDrop</A
10596> has
10597 been called with TRUE, any other object can pass objects to its
10598 inventory.</P
10599></DIV
10600><DIV
10601CLASS="section"
10602><HR><H2
10603CLASS="section"
10604><A
10605NAME="AEN2326"
10606>A.126. llGiveInventoryList</A
10607></H2
10608><DIV
10609CLASS="funcsynopsis"
10610><P
10611></P
10612><A
10613NAME="AEN2328"
10614></A
10615><P
10616><CODE
10617><CODE
10618CLASS="FUNCDEF"
10619>llGiveInventoryList</CODE
10620>(key destination, string category, list inventory);</CODE
10621></P
10622><P
10623></P
10624></DIV
10625><P
10626>Give the list of named inventory items to the keyed avatar
10627 or object in the same simulator as the giver. If the recipient is
10628 an avatar, the avatar then follows the normal procedure of
10629 accepting or denying the offer. The offered inventory is then
10630 placed in a folder named <CODE
10631CLASS="parameter"
10632>category</CODE
10633> in the
10634 recipients inventory. If the recipient is an object, the same
10635 permissions apply as if you were dragging inventory onto the
10636 object by hand, ie if <A
10637HREF="#AEN1047"
10638>llAllowInventoryDrop</A
10639> has
10640 been called with TRUE, any other object can pass objects to its
10641 inventory.If the recipient is an object, the
10642 <CODE
10643CLASS="parameter"
10644>category</CODE
10645> parameter is ignored.</P
10646></DIV
10647><DIV
10648CLASS="section"
10649><HR><H2
10650CLASS="section"
10651><A
10652NAME="AEN2342"
10653>A.127. llGiveMoney</A
10654></H2
10655><DIV
10656CLASS="funcsynopsis"
10657><P
10658></P
10659><A
10660NAME="AEN2344"
10661></A
10662><P
10663><CODE
10664><CODE
10665CLASS="FUNCDEF"
10666>llGiveMoney</CODE
10667>(key destination, integer amount);</CODE
10668></P
10669><P
10670></P
10671></DIV
10672><P
10673>Transfer <CODE
10674CLASS="parameter"
10675>amount</CODE
10676> from the script owner
10677 to <CODE
10678CLASS="parameter"
10679>destination</CODE
10680>. This call will fail if
10681 <A
10682HREF="#AEN5360"
10683>PERMISSION_DEBIT</A
10684> has not
10685 been set.</P
10686></DIV
10687><DIV
10688CLASS="section"
10689><HR><H2
10690CLASS="section"
10691><A
10692NAME="AEN2356"
10693>A.128. llGround</A
10694></H2
10695><DIV
10696CLASS="funcsynopsis"
10697><P
10698></P
10699><A
10700NAME="AEN2358"
10701></A
10702><P
10703><CODE
10704><CODE
10705CLASS="FUNCDEF"
10706>float llGround</CODE
10707>(vector offset);</CODE
10708></P
10709><P
10710></P
10711></DIV
10712><P
10713>Returns the ground height at the object position +
10714 <CODE
10715CLASS="parameter"
10716>offset</CODE
10717>.</P
10718></DIV
10719><DIV
10720CLASS="section"
10721><HR><H2
10722CLASS="section"
10723><A
10724NAME="AEN2366"
10725>A.129. llGroundContour</A
10726></H2
10727><DIV
10728CLASS="funcsynopsis"
10729><P
10730></P
10731><A
10732NAME="AEN2368"
10733></A
10734><P
10735><CODE
10736><CODE
10737CLASS="FUNCDEF"
10738>vector llGroundContour</CODE
10739>(vector offset);</CODE
10740></P
10741><P
10742></P
10743></DIV
10744><P
10745>Returns the ground contour at the object position +
10746 <CODE
10747CLASS="parameter"
10748>offset</CODE
10749>.</P
10750></DIV
10751><DIV
10752CLASS="section"
10753><HR><H2
10754CLASS="section"
10755><A
10756NAME="AEN2376"
10757>A.130. llGroundNormal</A
10758></H2
10759><DIV
10760CLASS="funcsynopsis"
10761><P
10762></P
10763><A
10764NAME="AEN2378"
10765></A
10766><P
10767><CODE
10768><CODE
10769CLASS="FUNCDEF"
10770>vector llGroundNormal</CODE
10771>(vector offset);</CODE
10772></P
10773><P
10774></P
10775></DIV
10776><P
10777>Returns the ground contour at the object position +
10778 <CODE
10779CLASS="parameter"
10780>offset</CODE
10781>.</P
10782></DIV
10783><DIV
10784CLASS="section"
10785><HR><H2
10786CLASS="section"
10787><A
10788NAME="AEN2386"
10789>A.131. llGroundRepel</A
10790></H2
10791><DIV
10792CLASS="funcsynopsis"
10793><P
10794></P
10795><A
10796NAME="AEN2388"
10797></A
10798><P
10799><CODE
10800><CODE
10801CLASS="FUNCDEF"
10802>llGroundRepel</CODE
10803>(float height, integer water, float tau);</CODE
10804></P
10805><P
10806></P
10807></DIV
10808><P
10809>Critically damps to <CODE
10810CLASS="parameter"
10811>height</CODE
10812> if within
10813 <CODE
10814CLASS="parameter"
10815>height</CODE
10816> * 0.5 of
10817 <CODE
10818CLASS="parameter"
10819>level</CODE
10820>. The <CODE
10821CLASS="parameter"
10822>height</CODE
10823>
10824 is above ground level if <CODE
10825CLASS="parameter"
10826>water</CODE
10827> is FALSE or
10828 above the higher of land and water if <CODE
10829CLASS="parameter"
10830>water</CODE
10831>
10832 is TRUE.</P
10833></DIV
10834><DIV
10835CLASS="section"
10836><HR><H2
10837CLASS="section"
10838><A
10839NAME="AEN2405"
10840>A.132. llGroundSlope</A
10841></H2
10842><DIV
10843CLASS="funcsynopsis"
10844><P
10845></P
10846><A
10847NAME="AEN2407"
10848></A
10849><P
10850><CODE
10851><CODE
10852CLASS="FUNCDEF"
10853>vector llGroundSlope</CODE
10854>(vector offset);</CODE
10855></P
10856><P
10857></P
10858></DIV
10859><P
10860>Returns the ground slope at the object position +
10861 <CODE
10862CLASS="parameter"
10863>offset</CODE
10864>.</P
10865></DIV
10866><DIV
10867CLASS="section"
10868><HR><H2
10869CLASS="section"
10870><A
10871NAME="AEN2415"
10872>A.133. llInsertString</A
10873></H2
10874><DIV
10875CLASS="funcsynopsis"
10876><P
10877></P
10878><A
10879NAME="AEN2417"
10880></A
10881><P
10882><CODE
10883><CODE
10884CLASS="FUNCDEF"
10885>string llInsertString</CODE
10886>(string dst, integer position, string src);</CODE
10887></P
10888><P
10889></P
10890></DIV
10891><P
10892>Inserts <CODE
10893CLASS="parameter"
10894>src</CODE
10895> into
10896 <CODE
10897CLASS="parameter"
10898>dst</CODE
10899> at <CODE
10900CLASS="parameter"
10901>position</CODE
10902> and
10903 returns the result.</P
10904></DIV
10905><DIV
10906CLASS="section"
10907><HR><H2
10908CLASS="section"
10909><A
10910NAME="AEN2431"
10911>A.134. llInstantMessage</A
10912></H2
10913><DIV
10914CLASS="funcsynopsis"
10915><P
10916></P
10917><A
10918NAME="AEN2433"
10919></A
10920><P
10921><CODE
10922><CODE
10923CLASS="FUNCDEF"
10924>llInstantMessage</CODE
10925>(key user, string message);</CODE
10926></P
10927><P
10928></P
10929></DIV
10930><P
10931>Send <CODE
10932CLASS="parameter"
10933>message</CODE
10934> to the
10935 <CODE
10936CLASS="parameter"
10937>user</CODE
10938> as an instant message.</P
10939></DIV
10940><DIV
10941CLASS="section"
10942><HR><H2
10943CLASS="section"
10944><A
10945NAME="AEN2444"
10946>A.135. llKey2Name</A
10947></H2
10948><DIV
10949CLASS="funcsynopsis"
10950><P
10951></P
10952><A
10953NAME="AEN2446"
10954></A
10955><P
10956><CODE
10957><CODE
10958CLASS="FUNCDEF"
10959>string llKey2Name</CODE
10960>(key id);</CODE
10961></P
10962><P
10963></P
10964></DIV
10965><P
10966>If object <CODE
10967CLASS="parameter"
10968>id</CODE
10969> is in the same
10970 simulator, return the name of the object.</P
10971></DIV
10972><DIV
10973CLASS="section"
10974><HR><H2
10975CLASS="section"
10976><A
10977NAME="AEN2454"
10978>A.136. llList2CSV</A
10979></H2
10980><DIV
10981CLASS="funcsynopsis"
10982><P
10983></P
10984><A
10985NAME="AEN2456"
10986></A
10987><P
10988><CODE
10989><CODE
10990CLASS="FUNCDEF"
10991>string llList2CSV</CODE
10992>(list src);</CODE
10993></P
10994><P
10995></P
10996></DIV
10997><P
10998>Create a string of comma separated values from
10999 <CODE
11000CLASS="parameter"
11001>list</CODE
11002>.</P
11003></DIV
11004><DIV
11005CLASS="section"
11006><HR><H2
11007CLASS="section"
11008><A
11009NAME="AEN2464"
11010>A.137. llList2Float</A
11011></H2
11012><DIV
11013CLASS="funcsynopsis"
11014><P
11015></P
11016><A
11017NAME="AEN2466"
11018></A
11019><P
11020><CODE
11021><CODE
11022CLASS="FUNCDEF"
11023>float llList2Float</CODE
11024>(list src, integer index);</CODE
11025></P
11026><P
11027></P
11028></DIV
11029><P
11030>Returns the float at <CODE
11031CLASS="parameter"
11032>index</CODE
11033> in the
11034 list <CODE
11035CLASS="parameter"
11036>src</CODE
11037>.</P
11038></DIV
11039><DIV
11040CLASS="section"
11041><HR><H2
11042CLASS="section"
11043><A
11044NAME="AEN2477"
11045>A.138. llList2Integer</A
11046></H2
11047><DIV
11048CLASS="funcsynopsis"
11049><P
11050></P
11051><A
11052NAME="AEN2479"
11053></A
11054><P
11055><CODE
11056><CODE
11057CLASS="FUNCDEF"
11058>integer llList2Integer</CODE
11059>(list src, integer index);</CODE
11060></P
11061><P
11062></P
11063></DIV
11064><P
11065>Returns the integer at <CODE
11066CLASS="parameter"
11067>index</CODE
11068> in the list
11069 <CODE
11070CLASS="parameter"
11071>src</CODE
11072>.</P
11073></DIV
11074><DIV
11075CLASS="section"
11076><HR><H2
11077CLASS="section"
11078><A
11079NAME="AEN2490"
11080>A.139. llList2Key</A
11081></H2
11082><DIV
11083CLASS="funcsynopsis"
11084><P
11085></P
11086><A
11087NAME="AEN2492"
11088></A
11089><P
11090><CODE
11091><CODE
11092CLASS="FUNCDEF"
11093>key llList2Key</CODE
11094>(list src, integer index);</CODE
11095></P
11096><P
11097></P
11098></DIV
11099><P
11100>Returns the key at <CODE
11101CLASS="parameter"
11102>index</CODE
11103> in the list
11104 <CODE
11105CLASS="parameter"
11106>src</CODE
11107>.</P
11108></DIV
11109><DIV
11110CLASS="section"
11111><HR><H2
11112CLASS="section"
11113><A
11114NAME="AEN2503"
11115>A.140. llList2List</A
11116></H2
11117><DIV
11118CLASS="funcsynopsis"
11119><P
11120></P
11121><A
11122NAME="AEN2505"
11123></A
11124><P
11125><CODE
11126><CODE
11127CLASS="FUNCDEF"
11128>list llList2List</CODE
11129>(list src, integer start, integer end);</CODE
11130></P
11131><P
11132></P
11133></DIV
11134><P
11135>Returns the slice of the list from
11136 <CODE
11137CLASS="parameter"
11138>start</CODE
11139> to <CODE
11140CLASS="parameter"
11141>end</CODE
11142> from
11143 the list <CODE
11144CLASS="parameter"
11145>src</CODE
11146> as a new list. The
11147 <CODE
11148CLASS="parameter"
11149>start</CODE
11150> and <CODE
11151CLASS="parameter"
11152>end</CODE
11153>
11154 parameters are inclusive, so 0,length-1 would copy the entire list
11155 and 0,0 would capture the first list entry. Using negative numbers
11156 for <CODE
11157CLASS="parameter"
11158>start</CODE
11159> and/or <CODE
11160CLASS="parameter"
11161>end</CODE
11162>
11163 causes the index to count backwards from the length of the list,
11164 so 0,-1 would capture the entire list. If
11165 <CODE
11166CLASS="parameter"
11167>start</CODE
11168> is larger than
11169 <CODE
11170CLASS="parameter"
11171>end</CODE
11172> the list returned is the exclusion of
11173 the entries, so 6,4 would give the entire list except for the
11174 5<SUP
11175>th</SUP
11176> entry.</P
11177></DIV
11178><DIV
11179CLASS="section"
11180><HR><H2
11181CLASS="section"
11182><A
11183NAME="AEN2526"
11184>A.141. llList2ListStrided</A
11185></H2
11186><DIV
11187CLASS="funcsynopsis"
11188><P
11189></P
11190><A
11191NAME="AEN2528"
11192></A
11193><P
11194><CODE
11195><CODE
11196CLASS="FUNCDEF"
11197>list llList2ListStrided</CODE
11198>(list src, integer start, integer end, integer stride);</CODE
11199></P
11200><P
11201></P
11202></DIV
11203><P
11204>Copy the strided slice of <CODE
11205CLASS="parameter"
11206>src</CODE
11207> from
11208 <CODE
11209CLASS="parameter"
11210>start</CODE
11211> to <CODE
11212CLASS="parameter"
11213>end</CODE
11214>.</P
11215></DIV
11216><DIV
11217CLASS="section"
11218><HR><H2
11219CLASS="section"
11220><A
11221NAME="AEN2544"
11222>A.142. llList2Rot</A
11223></H2
11224><DIV
11225CLASS="funcsynopsis"
11226><P
11227></P
11228><A
11229NAME="AEN2546"
11230></A
11231><P
11232><CODE
11233><CODE
11234CLASS="FUNCDEF"
11235>rotation llList2Rot</CODE
11236>(list src, integer index);</CODE
11237></P
11238><P
11239></P
11240></DIV
11241><P
11242>Returns the rotation at <CODE
11243CLASS="parameter"
11244>index</CODE
11245> in
11246 <CODE
11247CLASS="parameter"
11248>src</CODE
11249>.</P
11250></DIV
11251><DIV
11252CLASS="section"
11253><HR><H2
11254CLASS="section"
11255><A
11256NAME="AEN2557"
11257>A.143. llList2String</A
11258></H2
11259><DIV
11260CLASS="funcsynopsis"
11261><P
11262></P
11263><A
11264NAME="AEN2559"
11265></A
11266><P
11267><CODE
11268><CODE
11269CLASS="FUNCDEF"
11270>string llList2String</CODE
11271>(list src, integer index);</CODE
11272></P
11273><P
11274></P
11275></DIV
11276><P
11277>Returns the string at <CODE
11278CLASS="parameter"
11279>index</CODE
11280> in
11281 <CODE
11282CLASS="parameter"
11283>src</CODE
11284>.</P
11285></DIV
11286><DIV
11287CLASS="section"
11288><HR><H2
11289CLASS="section"
11290><A
11291NAME="AEN2570"
11292>A.144. llList2Vector</A
11293></H2
11294><DIV
11295CLASS="funcsynopsis"
11296><P
11297></P
11298><A
11299NAME="AEN2572"
11300></A
11301><P
11302><CODE
11303><CODE
11304CLASS="FUNCDEF"
11305>llList2Vector</CODE
11306>(list src, integer index);</CODE
11307></P
11308><P
11309></P
11310></DIV
11311><P
11312>Returns the string at <CODE
11313CLASS="parameter"
11314>index</CODE
11315> in
11316 <CODE
11317CLASS="parameter"
11318>src</CODE
11319>.</P
11320></DIV
11321><DIV
11322CLASS="section"
11323><HR><H2
11324CLASS="section"
11325><A
11326NAME="AEN2583"
11327>A.145. llListFindList</A
11328></H2
11329><DIV
11330CLASS="funcsynopsis"
11331><P
11332></P
11333><A
11334NAME="AEN2585"
11335></A
11336><P
11337><CODE
11338><CODE
11339CLASS="FUNCDEF"
11340>integer llListFindList</CODE
11341>(list src, list test);</CODE
11342></P
11343><P
11344></P
11345></DIV
11346><P
11347>Returns the position of the first instance of
11348 <CODE
11349CLASS="parameter"
11350>test</CODE
11351> in <CODE
11352CLASS="parameter"
11353>src</CODE
11354>. Returns
11355 -1 if <CODE
11356CLASS="parameter"
11357>test</CODE
11358> is not in
11359 <CODE
11360CLASS="parameter"
11361>src</CODE
11362>.</P
11363></DIV
11364><DIV
11365CLASS="section"
11366><HR><H2
11367CLASS="section"
11368><A
11369NAME="AEN2598"
11370>A.146. llListInsertList</A
11371></H2
11372><DIV
11373CLASS="funcsynopsis"
11374><P
11375></P
11376><A
11377NAME="AEN2600"
11378></A
11379><P
11380><CODE
11381><CODE
11382CLASS="FUNCDEF"
11383>list llListInsertList</CODE
11384>(list dest, list src, integer pos);</CODE
11385></P
11386><P
11387></P
11388></DIV
11389><P
11390>Returns the list created by inserting
11391 <CODE
11392CLASS="parameter"
11393>src</CODE
11394> into <CODE
11395CLASS="parameter"
11396>dest</CODE
11397> at
11398 <CODE
11399CLASS="parameter"
11400>pos</CODE
11401>.</P
11402></DIV
11403><DIV
11404CLASS="section"
11405><HR><H2
11406CLASS="section"
11407><A
11408NAME="AEN2614"
11409>A.147. llListRandomize</A
11410></H2
11411><DIV
11412CLASS="funcsynopsis"
11413><P
11414></P
11415><A
11416NAME="AEN2616"
11417></A
11418><P
11419><CODE
11420><CODE
11421CLASS="FUNCDEF"
11422>list llListRandomize</CODE
11423>(list src, integer stride);</CODE
11424></P
11425><P
11426></P
11427></DIV
11428><P
11429>Returns <CODE
11430CLASS="parameter"
11431>src</CODE
11432> randomized into blocks of
11433 size <CODE
11434CLASS="parameter"
11435>stride</CODE
11436>. If the length of
11437 <CODE
11438CLASS="parameter"
11439>src</CODE
11440> divided by
11441 <CODE
11442CLASS="parameter"
11443>stride</CODE
11444> is non-zero, this function does
11445 not randomize the list.</P
11446></DIV
11447><DIV
11448CLASS="section"
11449><HR><H2
11450CLASS="section"
11451><A
11452NAME="AEN2629"
11453>A.148. llListReplaceList</A
11454></H2
11455><DIV
11456CLASS="funcsynopsis"
11457><P
11458></P
11459><A
11460NAME="AEN2631"
11461></A
11462><P
11463><CODE
11464><CODE
11465CLASS="FUNCDEF"
11466>list llListReplaceList</CODE
11467>(list dest, list src, integer start, integer end);</CODE
11468></P
11469><P
11470></P
11471></DIV
11472><P
11473>Returns the list created by replacing the segment of <CODE
11474CLASS="parameter"
11475>dest</CODE
11476> from
11477 <CODE
11478CLASS="parameter"
11479>start</CODE
11480> to <CODE
11481CLASS="parameter"
11482>end</CODE
11483> with <CODE
11484CLASS="parameter"
11485>src</CODE
11486>.</P
11487></DIV
11488><DIV
11489CLASS="section"
11490><HR><H2
11491CLASS="section"
11492><A
11493NAME="AEN2648"
11494>A.149. llListSort</A
11495></H2
11496><DIV
11497CLASS="funcsynopsis"
11498><P
11499></P
11500><A
11501NAME="AEN2650"
11502></A
11503><P
11504><CODE
11505><CODE
11506CLASS="FUNCDEF"
11507>list llListSort</CODE
11508>(list src, integer stride, integer ascending);</CODE
11509></P
11510><P
11511></P
11512></DIV
11513><P
11514>Returns <CODE
11515CLASS="parameter"
11516>src</CODE
11517> sorted into blocks of
11518 <CODE
11519CLASS="parameter"
11520>stride</CODE
11521> in ascending order if
11522 <CODE
11523CLASS="parameter"
11524>ascending</CODE
11525> is <A
11526HREF="#AEN5295"
11527>TRUE</A
11528>. Note that sort only works in
11529 the head of each sort block is the same type.</P
11530></DIV
11531><DIV
11532CLASS="section"
11533><HR><H2
11534CLASS="section"
11535><A
11536NAME="AEN2665"
11537>A.150. llListen</A
11538></H2
11539><DIV
11540CLASS="funcsynopsis"
11541><P
11542></P
11543><A
11544NAME="AEN2667"
11545></A
11546><P
11547><CODE
11548><CODE
11549CLASS="FUNCDEF"
11550>integer llListen</CODE
11551>(integer channel, string name, key id, string msg);</CODE
11552></P
11553><P
11554></P
11555></DIV
11556><P
11557>Sets a listen event callback for <CODE
11558CLASS="parameter"
11559>msg</CODE
11560>
11561 on <CODE
11562CLASS="parameter"
11563>channel</CODE
11564> from <CODE
11565CLASS="parameter"
11566>name</CODE
11567>
11568 and returns an identifier that can be used to deactivate or remove
11569 the listen. The <CODE
11570CLASS="parameter"
11571>name</CODE
11572>,
11573 <CODE
11574CLASS="parameter"
11575>id</CODE
11576> and/or <CODE
11577CLASS="parameter"
11578>msg</CODE
11579>
11580 parameters can be blank to indicate not to filter on that
11581 argument. Channel 0 is the public chat channel that all avatars
11582 see as chat text. Channels 1 to 2,147,483,648 are hidden channels
11583 that are not sent to avatars.</P
11584></DIV
11585><DIV
11586CLASS="section"
11587><HR><H2
11588CLASS="section"
11589><A
11590NAME="AEN2686"
11591>A.151. llListenControl</A
11592></H2
11593><DIV
11594CLASS="funcsynopsis"
11595><P
11596></P
11597><A
11598NAME="AEN2688"
11599></A
11600><P
11601><CODE
11602><CODE
11603CLASS="FUNCDEF"
11604>llListenControl</CODE
11605>(integer number, integer active);</CODE
11606></P
11607><P
11608></P
11609></DIV
11610><P
11611>Make a listen event callback active or inactive. Pass in the
11612 value returned from <A
11613HREF="#AEN2665"
11614>llListen</A
11615>
11616 to the <CODE
11617CLASS="parameter"
11618>number</CODE
11619> parameter to specify which
11620 event you are controlling. Use <A
11621HREF="#AEN5295"
11622>boolean</A
11623> values to specify
11624 <CODE
11625CLASS="parameter"
11626>active</CODE
11627>.</P
11628></DIV
11629><DIV
11630CLASS="section"
11631><HR><H2
11632CLASS="section"
11633><A
11634NAME="AEN2701"
11635>A.152. llListenRemove</A
11636></H2
11637><DIV
11638CLASS="funcsynopsis"
11639><P
11640></P
11641><A
11642NAME="AEN2703"
11643></A
11644><P
11645><CODE
11646><CODE
11647CLASS="FUNCDEF"
11648>llListenRemove</CODE
11649>(integer number);</CODE
11650></P
11651><P
11652></P
11653></DIV
11654><P
11655>Removes a listen event callback. Pass in the value returned
11656 from <A
11657HREF="#AEN2665"
11658>llListen</A
11659> to the
11660 <CODE
11661CLASS="parameter"
11662>number</CODE
11663> parameter to specify which event you
11664 are removing.</P
11665></DIV
11666><DIV
11667CLASS="section"
11668><HR><H2
11669CLASS="section"
11670><A
11671NAME="AEN2712"
11672>A.153. llLoadURL</A
11673></H2
11674><DIV
11675CLASS="funcsynopsis"
11676><P
11677></P
11678><A
11679NAME="AEN2714"
11680></A
11681><P
11682><CODE
11683><CODE
11684CLASS="FUNCDEF"
11685>llLoadURL</CODE
11686>(key avatar_id, string message, string url);</CODE
11687></P
11688><P
11689></P
11690></DIV
11691><P
11692>Displays a dialog to user <CODE
11693CLASS="parameter"
11694>avatar_id</CODE
11695>
11696 with <CODE
11697CLASS="parameter"
11698>message</CODE
11699> offering to
11700 go to the web page at <CODE
11701CLASS="parameter"
11702>url</CODE
11703>. If the user clicks the
11704 "Go to page" button, their default web browser is launched and
11705 directed to <CODE
11706CLASS="parameter"
11707>url</CODE
11708>.</P
11709><P
11710>The <CODE
11711CLASS="parameter"
11712>url</CODE
11713> must begin with "http:" or
11714 "https:", other protocols are not currently supported.
11715 The dialog box shows the name of the object's
11716 owner so that abuse (e.g. spamming) can be easily reported.
11717 This function has a 10 second implicit sleep.</P
11718></DIV
11719><DIV
11720CLASS="section"
11721><HR><H2
11722CLASS="section"
11723><A
11724NAME="AEN2731"
11725>A.154. llLog</A
11726></H2
11727><DIV
11728CLASS="funcsynopsis"
11729><P
11730></P
11731><A
11732NAME="AEN2733"
11733></A
11734><P
11735><CODE
11736><CODE
11737CLASS="FUNCDEF"
11738>float llLog</CODE
11739>(float val);</CODE
11740></P
11741><P
11742></P
11743></DIV
11744><P
11745>Returns the natural logarithm (base e) of
11746 <CODE
11747CLASS="parameter"
11748>val</CODE
11749> if <CODE
11750CLASS="parameter"
11751>val</CODE
11752> &#62; 0,
11753 otherwise returns 0.</P
11754></DIV
11755><DIV
11756CLASS="section"
11757><HR><H2
11758CLASS="section"
11759><A
11760NAME="AEN2742"
11761>A.155. llLog10</A
11762></H2
11763><DIV
11764CLASS="funcsynopsis"
11765><P
11766></P
11767><A
11768NAME="AEN2744"
11769></A
11770><P
11771><CODE
11772><CODE
11773CLASS="FUNCDEF"
11774>float llLog10</CODE
11775>(float val);</CODE
11776></P
11777><P
11778></P
11779></DIV
11780><P
11781>Returns the base 10 log of <CODE
11782CLASS="parameter"
11783>val</CODE
11784> if
11785 <CODE
11786CLASS="parameter"
11787>val</CODE
11788> &#62; 0, otherwise returns 0.</P
11789></DIV
11790><DIV
11791CLASS="section"
11792><HR><H2
11793CLASS="section"
11794><A
11795NAME="AEN2753"
11796>A.156. llLookAt</A
11797></H2
11798><DIV
11799CLASS="funcsynopsis"
11800><P
11801></P
11802><A
11803NAME="AEN2755"
11804></A
11805><P
11806><CODE
11807><CODE
11808CLASS="FUNCDEF"
11809>llLookAt</CODE
11810>(vector target, float strength, float damping);</CODE
11811></P
11812><P
11813></P
11814></DIV
11815><P
11816>Cause object to point the forward axis toward
11817 <CODE
11818CLASS="parameter"
11819>target</CODE
11820>. Good
11821 <CODE
11822CLASS="parameter"
11823>strength</CODE
11824> values are around half the mass of
11825 the object and good <CODE
11826CLASS="parameter"
11827>damping</CODE
11828> values are less
11829 than 1/10<SUP
11830>th</SUP
11831> of the
11832 <CODE
11833CLASS="parameter"
11834>strength</CODE
11835>. Asymmetrical shapes require
11836 smaller <CODE
11837CLASS="parameter"
11838>damping</CODE
11839>. A
11840 <CODE
11841CLASS="parameter"
11842>strength</CODE
11843> of 0.0 cancels the look at.</P
11844></DIV
11845><DIV
11846CLASS="section"
11847><HR><H2
11848CLASS="section"
11849><A
11850NAME="AEN2773"
11851>A.157. llLoopSound</A
11852></H2
11853><DIV
11854CLASS="funcsynopsis"
11855><P
11856></P
11857><A
11858NAME="AEN2775"
11859></A
11860><P
11861><CODE
11862><CODE
11863CLASS="FUNCDEF"
11864>llLoopSound</CODE
11865>(string sound, float volume);</CODE
11866></P
11867><P
11868></P
11869></DIV
11870><P
11871>Similar to <A
11872HREF="#AEN3184"
11873>llPlaySound</A
11874>, this function plays
11875 a sound attached to an object, but will continuously loop that
11876 sound until <A
11877HREF="#AEN4620"
11878>llStopSound</A
11879> or
11880 <A
11881HREF="#AEN3184"
11882>llPlaySound</A
11883> is called. Only
11884 one sound may be attached to an object at a time. A second call to
11885 llLoopSound with the same key will not restart the sound, but the
11886 new volume will be used. This allows control over the volume of
11887 already playing sounds. Setting the <CODE
11888CLASS="parameter"
11889>volume</CODE
11890>
11891 to 0 is not the same as calling <A
11892HREF="#AEN4620"
11893>llStopSound</A
11894>; a sound with 0
11895 volume will continue to loop. To restart the sound from the
11896 beginning, call <A
11897HREF="#AEN4620"
11898>llStopSound</A
11899>
11900 before calling llLoopSound again.</P
11901></DIV
11902><DIV
11903CLASS="section"
11904><HR><H2
11905CLASS="section"
11906><A
11907NAME="AEN2790"
11908>A.158. llLoopSoundMaster</A
11909></H2
11910><DIV
11911CLASS="funcsynopsis"
11912><P
11913></P
11914><A
11915NAME="AEN2792"
11916></A
11917><P
11918><CODE
11919><CODE
11920CLASS="FUNCDEF"
11921>llLoopSoundMaster</CODE
11922>(string sound, float volume);</CODE
11923></P
11924><P
11925></P
11926></DIV
11927><P
11928>Behaviour is identical to <A
11929HREF="#AEN2773"
11930>llLoopSound</A
11931>, with the addition of
11932 marking the source as a "Sync Master", causing "Slave" sounds to
11933 sync to it. If there are multiple masters within a viewer's
11934 interest area, the most audible one (a function of both distance
11935 and volume) will win out as the master. The use of multiple
11936 masters within a small area is unlikely to produce the desired
11937 effect.</P
11938></DIV
11939><DIV
11940CLASS="section"
11941><HR><H2
11942CLASS="section"
11943><A
11944NAME="AEN2802"
11945>A.159. llLoopSoundSlave</A
11946></H2
11947><DIV
11948CLASS="funcsynopsis"
11949><P
11950></P
11951><A
11952NAME="AEN2804"
11953></A
11954><P
11955><CODE
11956><CODE
11957CLASS="FUNCDEF"
11958>llLoopSoundSlave</CODE
11959>(string sound, float volume);</CODE
11960></P
11961><P
11962></P
11963></DIV
11964><P
11965>Behaviour is identical to <A
11966HREF="#AEN2773"
11967>llLoopSound</A
11968>, unless there is a
11969 "Sync Master" present. If a Sync Master is already playing the
11970 Slave sound will begin playing from the same point the master is
11971 in its loop synchronizing the loop points of both sounds. If a
11972 Sync Master is started when the Slave is already playing, the
11973 Slave will skip to the correct position to sync with the
11974 Master.</P
11975></DIV
11976><DIV
11977CLASS="section"
11978><HR><H2
11979CLASS="section"
11980><A
11981NAME="AEN2814"
11982>A.160. llMakeExplosion</A
11983></H2
11984><DIV
11985CLASS="funcsynopsis"
11986><P
11987></P
11988><A
11989NAME="AEN2816"
11990></A
11991><P
11992><CODE
11993><CODE
11994CLASS="FUNCDEF"
11995>llMakeExplosion</CODE
11996>(integer particles, float scale, float velocity, float lifetime, float arc, string texture, vector offset);</CODE
11997></P
11998><P
11999></P
12000></DIV
12001><P
12002>Make a round explosion of particles using
12003 <CODE
12004CLASS="parameter"
12005>texture</CODE
12006> from the object's inventory.</P
12007></DIV
12008><DIV
12009CLASS="section"
12010><HR><H2
12011CLASS="section"
12012><A
12013NAME="AEN2836"
12014>A.161. llMakeFire</A
12015></H2
12016><DIV
12017CLASS="funcsynopsis"
12018><P
12019></P
12020><A
12021NAME="AEN2838"
12022></A
12023><P
12024><CODE
12025><CODE
12026CLASS="FUNCDEF"
12027>llMakeFire</CODE
12028>(integer particles, float scale, float velocity, float lifetime, float arc, string texture, vector offset);</CODE
12029></P
12030><P
12031></P
12032></DIV
12033><P
12034>Make fire particles using <CODE
12035CLASS="parameter"
12036>texture</CODE
12037>
12038 from the object's inventory.</P
12039></DIV
12040><DIV
12041CLASS="section"
12042><HR><H2
12043CLASS="section"
12044><A
12045NAME="AEN2858"
12046>A.162. llMakeFountain</A
12047></H2
12048><DIV
12049CLASS="funcsynopsis"
12050><P
12051></P
12052><A
12053NAME="AEN2860"
12054></A
12055><P
12056><CODE
12057><CODE
12058CLASS="FUNCDEF"
12059>llMakeFountain</CODE
12060>(integer particles, float scale, float velocity, float lifetime, float arc, string texture, vector offset);</CODE
12061></P
12062><P
12063></P
12064></DIV
12065><P
12066>Make a fountain of particles using
12067 <CODE
12068CLASS="parameter"
12069>texture</CODE
12070> from the object's inventory.</P
12071></DIV
12072><DIV
12073CLASS="section"
12074><HR><H2
12075CLASS="section"
12076><A
12077NAME="AEN2880"
12078>A.163. llMakeSmoke</A
12079></H2
12080><DIV
12081CLASS="funcsynopsis"
12082><P
12083></P
12084><A
12085NAME="AEN2882"
12086></A
12087><P
12088><CODE
12089><CODE
12090CLASS="FUNCDEF"
12091>llMakeSmoke</CODE
12092>(integer particles, float scale, float velocity, float lifetime, float arc, string texture, vector offset);</CODE
12093></P
12094><P
12095></P
12096></DIV
12097><P
12098>Make smoky particles using <CODE
12099CLASS="parameter"
12100>texture</CODE
12101>
12102 from the object's inventory.</P
12103></DIV
12104><DIV
12105CLASS="section"
12106><HR><H2
12107CLASS="section"
12108><A
12109NAME="AEN2902"
12110>A.164. llMD5String</A
12111></H2
12112><DIV
12113CLASS="funcsynopsis"
12114><P
12115></P
12116><A
12117NAME="AEN2904"
12118></A
12119><P
12120><CODE
12121><CODE
12122CLASS="FUNCDEF"
12123>string llMD5String</CODE
12124>(string str, integer nonce);</CODE
12125></P
12126><P
12127></P
12128></DIV
12129><P
12130>Performs a RSA Data Security, Inc. MD5 Message-Digest
12131 Algorithm on <CODE
12132CLASS="parameter"
12133>str</CODE
12134> with
12135 <CODE
12136CLASS="parameter"
12137>nonce</CODE
12138>. The function returns the digest as a
12139 32 character hex string. The digest is computed on the string in
12140 the following format:
12141<DIV
12142CLASS="informalexample"
12143><P
12144></P
12145><A
12146NAME="AEN2915"
12147></A
12148><PRE
12149CLASS="programlisting"
12150>&#13;<CODE
12151CLASS="parameter"
12152>str</CODE
12153> + ":" + (string)<CODE
12154CLASS="parameter"
12155>nonce</CODE
12156>
12157</PRE
12158><P
12159></P
12160></DIV
12161>
12162 </P
12163></DIV
12164><DIV
12165CLASS="section"
12166><HR><H2
12167CLASS="section"
12168><A
12169NAME="AEN2919"
12170>A.165. llMessageLinked</A
12171></H2
12172><DIV
12173CLASS="funcsynopsis"
12174><P
12175></P
12176><A
12177NAME="AEN2921"
12178></A
12179><P
12180><CODE
12181><CODE
12182CLASS="FUNCDEF"
12183>llMessageLinked</CODE
12184>(integer linknum, integer num, string str, key id);</CODE
12185></P
12186><P
12187></P
12188></DIV
12189><P
12190>Sends <CODE
12191CLASS="parameter"
12192>num</CODE
12193>,
12194 <CODE
12195CLASS="parameter"
12196>str</CODE
12197>, and <CODE
12198CLASS="parameter"
12199>id</CODE
12200> to
12201 members of the link set. The <CODE
12202CLASS="parameter"
12203>linknum</CODE
12204>
12205 parameter is either the linked number available through <A
12206HREF="#AEN1867"
12207>llGetLinkNumber</A
12208> or a <A
12209HREF="#AEN5616"
12210>link constant</A
12211>.</P
12212></DIV
12213><DIV
12214CLASS="section"
12215><HR><H2
12216CLASS="section"
12217><A
12218NAME="AEN2940"
12219>A.166. llMinEventDelay</A
12220></H2
12221><DIV
12222CLASS="funcsynopsis"
12223><P
12224></P
12225><A
12226NAME="AEN2942"
12227></A
12228><P
12229><CODE
12230><CODE
12231CLASS="FUNCDEF"
12232>llMinEventDelay</CODE
12233>(float delay);</CODE
12234></P
12235><P
12236></P
12237></DIV
12238><P
12239>Set the minimum time between events being handled.</P
12240></DIV
12241><DIV
12242CLASS="section"
12243><HR><H2
12244CLASS="section"
12245><A
12246NAME="AEN2949"
12247>A.167. llModifyLand</A
12248></H2
12249><DIV
12250CLASS="funcsynopsis"
12251><P
12252></P
12253><A
12254NAME="AEN2951"
12255></A
12256><P
12257><CODE
12258><CODE
12259CLASS="FUNCDEF"
12260>llModifyLand</CODE
12261>(integer action, integer size);</CODE
12262></P
12263><P
12264></P
12265></DIV
12266><P
12267>Modify land with <CODE
12268CLASS="parameter"
12269>action</CODE
12270> on
12271 <CODE
12272CLASS="parameter"
12273>size</CODE
12274> area. The parameters can be chosen
12275 from the <A
12276HREF="#AEN5574"
12277>land constants</A
12278>.</P
12279></DIV
12280><DIV
12281CLASS="section"
12282><HR><H2
12283CLASS="section"
12284><A
12285NAME="AEN2963"
12286>A.168. llModPow</A
12287></H2
12288><DIV
12289CLASS="funcsynopsis"
12290><P
12291></P
12292><A
12293NAME="AEN2965"
12294></A
12295><P
12296><CODE
12297><CODE
12298CLASS="FUNCDEF"
12299>integer llModPow</CODE
12300>(integer a, integer b, integer c);</CODE
12301></P
12302><P
12303></P
12304></DIV
12305><P
12306>Raise <CODE
12307CLASS="parameter"
12308>a</CODE
12309> to the <CODE
12310CLASS="parameter"
12311>b</CODE
12312> power, modulo <CODE
12313CLASS="parameter"
12314>c</CODE
12315>.
12316 <CODE
12317CLASS="parameter"
12318>b</CODE
12319> is capped at 0xFFFF (16 bits).</P
12320></DIV
12321><DIV
12322CLASS="section"
12323><HR><H2
12324CLASS="section"
12325><A
12326NAME="AEN2980"
12327>A.169. llMoveToTarget</A
12328></H2
12329><DIV
12330CLASS="funcsynopsis"
12331><P
12332></P
12333><A
12334NAME="AEN2982"
12335></A
12336><P
12337><CODE
12338><CODE
12339CLASS="FUNCDEF"
12340>llMoveToTarget</CODE
12341>(vector target, float tau);</CODE
12342></P
12343><P
12344></P
12345></DIV
12346><P
12347>Critically damp to position <CODE
12348CLASS="parameter"
12349>target</CODE
12350> in
12351 <CODE
12352CLASS="parameter"
12353>tau</CODE
12354> seconds if the script is physical. Good
12355 <CODE
12356CLASS="parameter"
12357>tau</CODE
12358> values are greater than 0.2. A
12359 <CODE
12360CLASS="parameter"
12361>tau</CODE
12362> of 0.0 stops the critical
12363 damping.</P
12364></DIV
12365><DIV
12366CLASS="section"
12367><HR><H2
12368CLASS="section"
12369><A
12370NAME="AEN2995"
12371>A.170. llOffsetTexture</A
12372></H2
12373><DIV
12374CLASS="funcsynopsis"
12375><P
12376></P
12377><A
12378NAME="AEN2997"
12379></A
12380><P
12381><CODE
12382><CODE
12383CLASS="FUNCDEF"
12384>llOffsetTexture</CODE
12385>(float offset_s, float offset_t, integer face);</CODE
12386></P
12387><P
12388></P
12389></DIV
12390><P
12391>Sets the texture s and t offsets of
12392 <CODE
12393CLASS="parameter"
12394>face</CODE
12395>. If <CODE
12396CLASS="parameter"
12397>face</CODE
12398> is
12399 <A
12400HREF="#AEN6073"
12401>ALL_SIDES</A
12402> this
12403 function sets the texture offsets for all faces.</P
12404></DIV
12405><DIV
12406CLASS="section"
12407><HR><H2
12408CLASS="section"
12409><A
12410NAME="AEN3011"
12411>A.171. llOpenRemoteDataChannel</A
12412></H2
12413><DIV
12414CLASS="funcsynopsis"
12415><P
12416></P
12417><A
12418NAME="AEN3013"
12419></A
12420><P
12421><CODE
12422><CODE
12423CLASS="FUNCDEF"
12424>llOpenRemoteDataChannel</CODE
12425>(void);</CODE
12426></P
12427><P
12428></P
12429></DIV
12430><P
12431>Creates a channel to listen for XML-RPC calls.
12432 Will trigger a remote_data event with type = REMOTE_DATA_CHANNEL and a channel id once it is available.</P
12433></DIV
12434><DIV
12435CLASS="section"
12436><HR><H2
12437CLASS="section"
12438><A
12439NAME="AEN3019"
12440>A.172. llOverMyLand</A
12441></H2
12442><DIV
12443CLASS="funcsynopsis"
12444><P
12445></P
12446><A
12447NAME="AEN3021"
12448></A
12449><P
12450><CODE
12451><CODE
12452CLASS="FUNCDEF"
12453>integer llOverMyLand</CODE
12454>(key id);</CODE
12455></P
12456><P
12457></P
12458></DIV
12459><P
12460>Returns <A
12461HREF="#AEN5295"
12462>TRUE</A
12463> if
12464 <CODE
12465CLASS="parameter"
12466>id</CODE
12467> is over land owned by the object owner,
12468 <A
12469HREF="#AEN5295"
12470>FALSE</A
12471> otherwise.</P
12472></DIV
12473><DIV
12474CLASS="section"
12475><HR><H2
12476CLASS="section"
12477><A
12478NAME="AEN3031"
12479>A.173. llParcelMediaCommandList</A
12480></H2
12481><DIV
12482CLASS="funcsynopsis"
12483><P
12484></P
12485><A
12486NAME="AEN3033"
12487></A
12488><P
12489><CODE
12490><CODE
12491CLASS="FUNCDEF"
12492>llParcelMediaCommandList</CODE
12493>(list command_list);</CODE
12494></P
12495><P
12496></P
12497></DIV
12498><P
12499>Controls the playback of movies and other multimedia resources on a land parcel.
12500 <CODE
12501CLASS="parameter"
12502>command</CODE
12503> can be one of
12504 <A
12505HREF="#AEN6459"
12506>PARCEL_MEDIA_COMMAND_STOP</A
12507>,
12508 <A
12509HREF="#AEN6459"
12510>PARCEL_MEDIA_COMMAND_PAUSE</A
12511>,
12512 <A
12513HREF="#AEN6459"
12514>PARCEL_MEDIA_COMMAND_PLAY</A
12515>,
12516 <A
12517HREF="#AEN6459"
12518>PARCEL_MEDIA_COMMAND_LOOP</A
12519>,
12520 <A
12521HREF="#AEN6459"
12522>PARCEL_MEDIA_COMMAND_TEXTURE</A
12523>,
12524 <A
12525HREF="#AEN6459"
12526>PARCEL_MEDIA_COMMAND_URL</A
12527>,
12528 <A
12529HREF="#AEN6459"
12530>PARCEL_MEDIA_COMMAND_TYPE</A
12531>,
12532 <A
12533HREF="#AEN6459"
12534>PARCEL_MEDIA_COMMAND_DESC</A
12535>,
12536 <A
12537HREF="#AEN6459"
12538>PARCEL_MEDIA_COMMAND_SIZE</A
12539>,
12540 <A
12541HREF="#AEN6459"
12542>PARCEL_MEDIA_COMMAND_TIME</A
12543>,
12544 <A
12545HREF="#AEN6459"
12546>PARCEL_MEDIA_COMMAND_AGENT</A
12547>,
12548 <A
12549HREF="#AEN6459"
12550>PARCEL_MEDIA_COMMAND_UNLOAD</A
12551>, or
12552 <A
12553HREF="#AEN6459"
12554>PARCEL_MEDIA_COMMAND_AUTO_ALIGN</A
12555>.
12556 </P
12557><P
12558>You are allowed one movie (or "media" resource) per land parcel.
12559 The movie will be played by replacing a texture on an object with the
12560 movie. Users will only see the movie when they are standing on your
12561 land parcel. Otherwise they will see the static texture.</P
12562><P
12563>Most of the QuickTime media formats are supported including:
12564 <P
12565></P
12566><UL
12567><LI
12568><P
12569>QuickTime movies (.mov)</P
12570></LI
12571><LI
12572><P
12573>Streamable stored QuickTime movies (.mov)</P
12574></LI
12575><LI
12576><P
12577>Real time QuickTime streams (rtsp://)</P
12578></LI
12579><LI
12580><P
12581>MPEG4 movies (.mp4, .mpeg4) (simple profile only)</P
12582></LI
12583><LI
12584><P
12585>QuickTime VR scenes and objects (.mov)</P
12586></LI
12587><LI
12588><P
12589>Flash movies (.swf) (only non-interative, version 5 and earlier</P
12590></LI
12591><LI
12592><P
12593>and many others from http://www.apple.com/quicktime/products/qt/specifications.html</P
12594></LI
12595></UL
12596>
12597 A good rule of thumb is if it plays in the QuickTime Media Player, it will play in Second Life.
12598 </P
12599><P
12600>You can set up a movie for playback as follows:
12601 <P
12602></P
12603><UL
12604><LI
12605><P
12606>First, select a texture from your inventory to be the static texture. It should not be a common texture -- a test pattern would be better than the default plywood.</P
12607></LI
12608><LI
12609><P
12610>Apply that texture to an object.</P
12611></LI
12612><LI
12613><P
12614>Right click on your land and select "About Land..."</P
12615></LI
12616><LI
12617><P
12618>Under "Options" use the GUI to select the static texture.</P
12619></LI
12620><LI
12621><P
12622>Enter the URL of your movie or media stream.</P
12623></LI
12624><LI
12625><P
12626>Create objects you want to click on for PLAY, STOP, PAUSE and LOOP (play forever)</P
12627></LI
12628><LI
12629><P
12630>Attach the following script (or similar) to each.</P
12631></LI
12632></UL
12633>
12634<DIV
12635CLASS="informalexample"
12636><P
12637></P
12638><A
12639NAME="AEN3087"
12640></A
12641><PRE
12642CLASS="programlisting"
12643>&#13;default
12644{
12645 touch_start ( integer total_number )
12646 {
12647 // This will play the current movie for all agents in the parcel.
12648 llParcelMediaCommandList( [PARCEL_MEDIA_COMMAND_LOOP] );
12649 }
12650}
12651</PRE
12652><P
12653></P
12654></DIV
12655>
12656Or a more advanced example:
12657<DIV
12658CLASS="informalexample"
12659><P
12660></P
12661><A
12662NAME="AEN3089"
12663></A
12664><PRE
12665CLASS="programlisting"
12666>&#13;float START_TIME = 30.0;
12667float RUN_LENGTH = 10.0;
12668
12669default
12670{
12671 state_entry()
12672 {
12673 llParcelMediaCommandList( [
12674 PARCEL_MEDIA_COMMAND_URL, "http://enter_your.url/here",
12675 PARCEL_MEDIA_COMMAND_TEXTURE, (key) llGetTexture(0) ] );
12676 }
12677
12678 touch_start(integer num_detected)
12679 {
12680 llParcelMediaCommandList( [
12681 PARCEL_MEDIA_COMMAND_AGENT, llDetectedKey(0),
12682 PARCEL_MEDIA_COMMAND_TIME, START_TIME,
12683 PARCEL_MEDIA_COMMAND_PLAY ] );
12684 list Info = llParcelMediaQuery([PARCEL_MEDIA_COMMAND_URL, PARCEL_MEDIA_COMMAND_TEXTURE]);
12685 llSay(0, "Playing '" + llList2String(Info, 0) + "' on texture '" + (string)llList2Key(Info, 1) + "' for agent " + llDetectedName(0));
12686 llSetTimerEvent(RUN_LENGTH);
12687 }
12688
12689 timer()
12690 {
12691 llParcelMediaCommandList( [ PARCEL_MEDIA_COMMAND_STOP ] );
12692 llSetTimerEvent(0.0);
12693 }
12694}
12695</PRE
12696><P
12697></P
12698></DIV
12699>
12700
12701
12702 </P
12703></DIV
12704><DIV
12705CLASS="section"
12706><HR><H2
12707CLASS="section"
12708><A
12709NAME="AEN3091"
12710>A.174. llParcelMediaQuery</A
12711></H2
12712><DIV
12713CLASS="funcsynopsis"
12714><P
12715></P
12716><A
12717NAME="AEN3093"
12718></A
12719><P
12720><CODE
12721><CODE
12722CLASS="FUNCDEF"
12723>list llParcelMediaQuery</CODE
12724>(list query_list);</CODE
12725></P
12726><P
12727></P
12728></DIV
12729><P
12730>Controls the playback of movies and other multimedia resources on a land parcel.
12731 <CODE
12732CLASS="parameter"
12733>command</CODE
12734> can be one of
12735 <A
12736HREF="#AEN6459"
12737>PARCEL_MEDIA_COMMAND_TEXTURE</A
12738> or
12739 <A
12740HREF="#AEN6459"
12741>PARCEL_MEDIA_COMMAND_URL</A
12742>.
12743 </P
12744><P
12745>This allows you to query the texture or url for media on the parcel.
12746 See <A
12747HREF="#AEN3031"
12748>llParcelMediaCommandList</A
12749> for an example
12750 of usage.</P
12751></DIV
12752><DIV
12753CLASS="section"
12754><HR><H2
12755CLASS="section"
12756><A
12757NAME="AEN3105"
12758>A.175. llParseString2List</A
12759></H2
12760><DIV
12761CLASS="funcsynopsis"
12762><P
12763></P
12764><A
12765NAME="AEN3107"
12766></A
12767><P
12768><CODE
12769><CODE
12770CLASS="FUNCDEF"
12771>list llParseString2List</CODE
12772>(string src, list separators, list spacers);</CODE
12773></P
12774><P
12775></P
12776></DIV
12777><P
12778>Breaks <CODE
12779CLASS="parameter"
12780>src</CODE
12781> into a list, discarding
12782 anything in <CODE
12783CLASS="parameter"
12784>separators</CODE
12785>, keeping any entry
12786 in <CODE
12787CLASS="parameter"
12788>spacers</CODE
12789>. The
12790 <CODE
12791CLASS="parameter"
12792>separators</CODE
12793> and
12794 <CODE
12795CLASS="parameter"
12796>spacers</CODE
12797> must be lists of strings with a
12798 maximum of 8 entries each. So, if you had made the call:
12799<DIV
12800CLASS="informalexample"
12801><P
12802></P
12803><A
12804NAME="AEN3123"
12805></A
12806><PRE
12807CLASS="programlisting"
12808>&#13;llParseString2List("Parsethisnow! I dare:you to.", ["this", "!", " "], [":"]);
12809</PRE
12810><P
12811></P
12812></DIV
12813>
12814 You would get the list:
12815<DIV
12816CLASS="informalexample"
12817><P
12818></P
12819><A
12820NAME="AEN3125"
12821></A
12822><PRE
12823CLASS="programlisting"
12824>&#13;["Parse", "now", "I", "dare", ":", "you", "to"]
12825</PRE
12826><P
12827></P
12828></DIV
12829></P
12830></DIV
12831><DIV
12832CLASS="section"
12833><HR><H2
12834CLASS="section"
12835><A
12836NAME="AEN3127"
12837>A.176. llParseStringKeepNulls</A
12838></H2
12839><DIV
12840CLASS="funcsynopsis"
12841><P
12842></P
12843><A
12844NAME="AEN3129"
12845></A
12846><P
12847><CODE
12848><CODE
12849CLASS="FUNCDEF"
12850>list llParseStringKeepNulls</CODE
12851>(string src, list separators, list spacers);</CODE
12852></P
12853><P
12854></P
12855></DIV
12856><P
12857>Breaks <CODE
12858CLASS="parameter"
12859>src</CODE
12860> into a list, discarding
12861 anything in <CODE
12862CLASS="parameter"
12863>separators</CODE
12864>, keeping any entry
12865 in <CODE
12866CLASS="parameter"
12867>spacers</CODE
12868>. Any resulting null values
12869 are kept. The <CODE
12870CLASS="parameter"
12871>separators</CODE
12872> and
12873 <CODE
12874CLASS="parameter"
12875>spacers</CODE
12876> must be lists of strings with a
12877 maximum of 8 entries each. So, if you had made the call:
12878<DIV
12879CLASS="informalexample"
12880><P
12881></P
12882><A
12883NAME="AEN3145"
12884></A
12885><PRE
12886CLASS="programlisting"
12887>&#13;llParseString2List("!Parsethisthisnow I dare::you to.", ["this", "!", " "], [":"]);
12888</PRE
12889><P
12890></P
12891></DIV
12892>
12893 You would get the list:
12894<DIV
12895CLASS="informalexample"
12896><P
12897></P
12898><A
12899NAME="AEN3147"
12900></A
12901><PRE
12902CLASS="programlisting"
12903>&#13;[NULL, "Parse", NULL, "now", "I", "dare", ":", NULL, ":", "you", "to"]
12904</PRE
12905><P
12906></P
12907></DIV
12908></P
12909></DIV
12910><DIV
12911CLASS="section"
12912><HR><H2
12913CLASS="section"
12914><A
12915NAME="AEN3149"
12916>A.177. llParticleSystem</A
12917></H2
12918><DIV
12919CLASS="funcsynopsis"
12920><P
12921></P
12922><A
12923NAME="AEN3151"
12924></A
12925><P
12926><CODE
12927><CODE
12928CLASS="FUNCDEF"
12929>llParticleSystem</CODE
12930>(list parameters);</CODE
12931></P
12932><P
12933></P
12934></DIV
12935><P
12936>Makes a particle system based on the parameter list. The
12937 <CODE
12938CLASS="parameter"
12939>parameters</CODE
12940> are specified as an ordered list
12941 of parameter and value. Valid parameters and their expected values
12942 can be found in the <A
12943HREF="#AEN5851"
12944>particle system
12945 constants</A
12946>. Here is a simple example:
12947<DIV
12948CLASS="informalexample"
12949><P
12950></P
12951><A
12952NAME="AEN3160"
12953></A
12954><PRE
12955CLASS="programlisting"
12956>&#13;llParticleSystem([PSYS_PART_FLAGS, PSYS_PART_WIND_MASK,
12957 PSYS_PART_START_COLOR, &#60;1,0,0&#62;,
12958 PSYS_SRC_PATTERN, PSYS_SRC_PATTERN_EXPLODE]);
12959</PRE
12960><P
12961></P
12962></DIV
12963></P
12964></DIV
12965><DIV
12966CLASS="section"
12967><HR><H2
12968CLASS="section"
12969><A
12970NAME="AEN3162"
12971>A.178. llPassCollisions</A
12972></H2
12973><DIV
12974CLASS="funcsynopsis"
12975><P
12976></P
12977><A
12978NAME="AEN3164"
12979></A
12980><P
12981><CODE
12982><CODE
12983CLASS="FUNCDEF"
12984>llPassCollisions</CODE
12985>(integer pass);</CODE
12986></P
12987><P
12988></P
12989></DIV
12990><P
12991>If <CODE
12992CLASS="parameter"
12993>pass</CODE
12994> is <A
12995HREF="#AEN5295"
12996>TRUE</A
12997>, land and object collisions
12998 are passed from children on to parents.</P
12999></DIV
13000><DIV
13001CLASS="section"
13002><HR><H2
13003CLASS="section"
13004><A
13005NAME="AEN3173"
13006>A.179. llPassTouches</A
13007></H2
13008><DIV
13009CLASS="funcsynopsis"
13010><P
13011></P
13012><A
13013NAME="AEN3175"
13014></A
13015><P
13016><CODE
13017><CODE
13018CLASS="FUNCDEF"
13019>llPassTouches</CODE
13020>(integer pass);</CODE
13021></P
13022><P
13023></P
13024></DIV
13025><P
13026>If <CODE
13027CLASS="parameter"
13028>pass</CODE
13029> is <A
13030HREF="#AEN5295"
13031>TRUE</A
13032>, touches are passed from
13033 children on to parents.</P
13034></DIV
13035><DIV
13036CLASS="section"
13037><HR><H2
13038CLASS="section"
13039><A
13040NAME="AEN3184"
13041>A.180. llPlaySound</A
13042></H2
13043><DIV
13044CLASS="funcsynopsis"
13045><P
13046></P
13047><A
13048NAME="AEN3186"
13049></A
13050><P
13051><CODE
13052><CODE
13053CLASS="FUNCDEF"
13054>llPlaySound</CODE
13055>(string sound, float volume);</CODE
13056></P
13057><P
13058></P
13059></DIV
13060><P
13061>Plays a sound once. The sound will be attached to an object
13062 and follow object movement. Only one sound may be attached to an
13063 object at a time, and attaching a new sound or calling <A
13064HREF="#AEN4620"
13065>llStopSound</A
13066> will stop the
13067 previously attached sound. A second call to llPlaySound with the
13068 same <CODE
13069CLASS="parameter"
13070>sound</CODE
13071> will not restart the sound, but
13072 the new volume will be used, which allows control over the volume
13073 of already playing sounds. To restart the sound from the
13074 beginning, call <A
13075HREF="#AEN4620"
13076>llStopSound</A
13077>
13078 before calling llPlaySound again.</P
13079></DIV
13080><DIV
13081CLASS="section"
13082><HR><H2
13083CLASS="section"
13084><A
13085NAME="AEN3198"
13086>A.181. llPlaySoundSlave</A
13087></H2
13088><DIV
13089CLASS="funcsynopsis"
13090><P
13091></P
13092><A
13093NAME="AEN3200"
13094></A
13095><P
13096><CODE
13097><CODE
13098CLASS="FUNCDEF"
13099>llPlaySoundSlave</CODE
13100>(string sound, float volume);</CODE
13101></P
13102><P
13103></P
13104></DIV
13105><P
13106>Behaviour is identical to llPlaySound, unless there is a
13107 "Sync Master" present. If a Sync Master is already
13108 playing the Slave sound will not be played until the Master hits
13109 its loop point and returns to the beginning. llPlaySoundSlave will
13110 play the sound exactly once; if it is desired to have the sound
13111 play every time the Master loops, either use <A
13112HREF="#AEN2802"
13113>llLoopSoundSlave</A
13114> with extra
13115 silence padded on the end of the sound or ensure that
13116 llPlaySoundSlave is called at least once per loop of the
13117 Master.</P
13118></DIV
13119><DIV
13120CLASS="section"
13121><HR><H2
13122CLASS="section"
13123><A
13124NAME="AEN3210"
13125>A.182. llPointAt</A
13126></H2
13127><DIV
13128CLASS="funcsynopsis"
13129><P
13130></P
13131><A
13132NAME="AEN3212"
13133></A
13134><P
13135><CODE
13136><CODE
13137CLASS="FUNCDEF"
13138>llPointAt</CODE
13139>(vector pos);</CODE
13140></P
13141><P
13142></P
13143></DIV
13144><P
13145>Make avatar that owns object point at
13146 <CODE
13147CLASS="parameter"
13148>pos</CODE
13149>.</P
13150></DIV
13151><DIV
13152CLASS="section"
13153><HR><H2
13154CLASS="section"
13155><A
13156NAME="AEN3220"
13157>A.183. llPow</A
13158></H2
13159><DIV
13160CLASS="funcsynopsis"
13161><P
13162></P
13163><A
13164NAME="AEN3222"
13165></A
13166><P
13167><CODE
13168><CODE
13169CLASS="FUNCDEF"
13170>llPow</CODE
13171>(float base, float exp);</CODE
13172></P
13173><P
13174></P
13175></DIV
13176><P
13177>Returns <CODE
13178CLASS="parameter"
13179>base</CODE
13180> raised to the
13181 <CODE
13182CLASS="parameter"
13183>exp</CODE
13184>.</P
13185></DIV
13186><DIV
13187CLASS="section"
13188><HR><H2
13189CLASS="section"
13190><A
13191NAME="AEN3233"
13192>A.184. llPreloadSound</A
13193></H2
13194><DIV
13195CLASS="funcsynopsis"
13196><P
13197></P
13198><A
13199NAME="AEN3235"
13200></A
13201><P
13202><CODE
13203><CODE
13204CLASS="FUNCDEF"
13205>llPreloadSound</CODE
13206>(string sound);</CODE
13207></P
13208><P
13209></P
13210></DIV
13211><P
13212>Preloads <CODE
13213CLASS="parameter"
13214>sound</CODE
13215> from object inventory
13216 on nearby viewers.</P
13217></DIV
13218><DIV
13219CLASS="section"
13220><HR><H2
13221CLASS="section"
13222><A
13223NAME="AEN3243"
13224>A.185. llPushObject</A
13225></H2
13226><DIV
13227CLASS="funcsynopsis"
13228><P
13229></P
13230><A
13231NAME="AEN3245"
13232></A
13233><P
13234><CODE
13235><CODE
13236CLASS="FUNCDEF"
13237>llPushObject</CODE
13238>(key id, vector impulse, vector angular_impulse, integer local);</CODE
13239></P
13240><P
13241></P
13242></DIV
13243><P
13244>Applies <CODE
13245CLASS="parameter"
13246>impulse</CODE
13247> and
13248 <CODE
13249CLASS="parameter"
13250>angular_impulse</CODE
13251> to object
13252 <CODE
13253CLASS="parameter"
13254>id</CODE
13255>.</P
13256></DIV
13257><DIV
13258CLASS="section"
13259><HR><H2
13260CLASS="section"
13261><A
13262NAME="AEN3261"
13263>A.186. llReleaseControls</A
13264></H2
13265><DIV
13266CLASS="funcsynopsis"
13267><P
13268></P
13269><A
13270NAME="AEN3263"
13271></A
13272><P
13273><CODE
13274><CODE
13275CLASS="FUNCDEF"
13276>llReleaseControls</CODE
13277>(key avatar);</CODE
13278></P
13279><P
13280></P
13281></DIV
13282><P
13283>Stop taking inputs from <CODE
13284CLASS="parameter"
13285>avatar</CODE
13286>.</P
13287></DIV
13288><DIV
13289CLASS="section"
13290><HR><H2
13291CLASS="section"
13292><A
13293NAME="AEN3271"
13294>A.187. llRemoteDataReply</A
13295></H2
13296><DIV
13297CLASS="funcsynopsis"
13298><P
13299></P
13300><A
13301NAME="AEN3273"
13302></A
13303><P
13304><CODE
13305><CODE
13306CLASS="FUNCDEF"
13307>llRemoteDataReply</CODE
13308>(key channel, key message_id, string sdata);</CODE
13309></P
13310><P
13311></P
13312></DIV
13313><P
13314>Send an XML-RPC reply to message_id on channel with payload of string sdata.</P
13315></DIV
13316><DIV
13317CLASS="section"
13318><HR><H2
13319CLASS="section"
13320><A
13321NAME="AEN3284"
13322>A.188. llRemoteDataSetRegion</A
13323></H2
13324><DIV
13325CLASS="funcsynopsis"
13326><P
13327></P
13328><A
13329NAME="AEN3286"
13330></A
13331><P
13332><CODE
13333><CODE
13334CLASS="FUNCDEF"
13335>llRemoteDataSetRegion</CODE
13336>(void);</CODE
13337></P
13338><P
13339></P
13340></DIV
13341><P
13342>If an object using remote data channels changes regions, you
13343 must call this function to reregister the remote data
13344 channels. You do not need to make this call if your object does
13345 not change regions or use remote data channels.</P
13346></DIV
13347><DIV
13348CLASS="section"
13349><HR><H2
13350CLASS="section"
13351><A
13352NAME="AEN3292"
13353>A.189. llRemoteLoadScript</A
13354></H2
13355><DIV
13356CLASS="funcsynopsis"
13357><P
13358></P
13359><A
13360NAME="AEN3294"
13361></A
13362><P
13363><CODE
13364><CODE
13365CLASS="FUNCDEF"
13366>llRemoteLoadScript</CODE
13367>(void);</CODE
13368></P
13369><P
13370></P
13371></DIV
13372><P
13373>Deprecated. Please use llRemoteLoadScriptPin instead.</P
13374></DIV
13375><DIV
13376CLASS="section"
13377><HR><H2
13378CLASS="section"
13379><A
13380NAME="AEN3300"
13381>A.190. llRemoteLoadScriptPin</A
13382></H2
13383><DIV
13384CLASS="funcsynopsis"
13385><P
13386></P
13387><A
13388NAME="AEN3302"
13389></A
13390><P
13391><CODE
13392><CODE
13393CLASS="FUNCDEF"
13394>llRemoteLoadScriptPin</CODE
13395>(key target, string name, integer pin, integer running, integer param);</CODE
13396></P
13397><P
13398></P
13399></DIV
13400><P
13401>If the owner of the object this script is attached can modify <CODE
13402CLASS="parameter"
13403>target</CODE
13404>, it has the correct <CODE
13405CLASS="parameter"
13406>pin</CODE
13407> and the objects are in the same region, copy script <CODE
13408CLASS="parameter"
13409>name</CODE
13410> onto <CODE
13411CLASS="parameter"
13412>target</CODE
13413>, if <CODE
13414CLASS="parameter"
13415>running</CODE
13416> == TRUE, start the script with <CODE
13417CLASS="parameter"
13418>param</CODE
13419>. If <CODE
13420CLASS="parameter"
13421>name</CODE
13422> already exists on <CODE
13423CLASS="parameter"
13424>target</CODE
13425>, it is replaced.</P
13426></DIV
13427><DIV
13428CLASS="section"
13429><HR><H2
13430CLASS="section"
13431><A
13432NAME="AEN3325"
13433>A.191. llRemoveInventory</A
13434></H2
13435><DIV
13436CLASS="funcsynopsis"
13437><P
13438></P
13439><A
13440NAME="AEN3327"
13441></A
13442><P
13443><CODE
13444><CODE
13445CLASS="FUNCDEF"
13446>llRemoveInventory</CODE
13447>(string inventory);</CODE
13448></P
13449><P
13450></P
13451></DIV
13452><P
13453>Remove the name <CODE
13454CLASS="parameter"
13455>inventory</CODE
13456> item from
13457 the object inventory.</P
13458></DIV
13459><DIV
13460CLASS="section"
13461><HR><H2
13462CLASS="section"
13463><A
13464NAME="AEN3335"
13465>A.192. llRemoveVehicleFlags</A
13466></H2
13467><DIV
13468CLASS="funcsynopsis"
13469><P
13470></P
13471><A
13472NAME="AEN3337"
13473></A
13474><P
13475><CODE
13476><CODE
13477CLASS="FUNCDEF"
13478>llRemoveVehicleFlags</CODE
13479>(integer flags);</CODE
13480></P
13481><P
13482></P
13483></DIV
13484><P
13485>Sets the vehicle <CODE
13486CLASS="parameter"
13487>flags</CODE
13488> to
13489 FALSE. Valid parameters can be found in the <A
13490HREF="#AEN6231"
13491>vehicle flags constants</A
13492>
13493 section.</P
13494></DIV
13495><DIV
13496CLASS="section"
13497><HR><H2
13498CLASS="section"
13499><A
13500NAME="AEN3346"
13501>A.193. llRequestAgentData</A
13502></H2
13503><DIV
13504CLASS="funcsynopsis"
13505><P
13506></P
13507><A
13508NAME="AEN3348"
13509></A
13510><P
13511><CODE
13512><CODE
13513CLASS="FUNCDEF"
13514>key llRequestAgentData</CODE
13515>(key id, integer data);</CODE
13516></P
13517><P
13518></P
13519></DIV
13520><P
13521>This function requests data about agent
13522 <CODE
13523CLASS="parameter"
13524>id</CODE
13525>. If and when the information is
13526 collected, the <A
13527HREF="#AEN4997"
13528>dataserver</A
13529>
13530 event is called with the returned key returned from this function
13531 passed in the <CODE
13532CLASS="parameter"
13533>requested</CODE
13534> parameter. See the
13535 <A
13536HREF="#AEN6005"
13537>agent data constants</A
13538> for
13539 details about valid values of <CODE
13540CLASS="parameter"
13541>data</CODE
13542> and what
13543 each will return in the <A
13544HREF="#AEN4997"
13545>dataserver</A
13546> event.</P
13547></DIV
13548><DIV
13549CLASS="section"
13550><HR><H2
13551CLASS="section"
13552><A
13553NAME="AEN3363"
13554>A.194. llRequestInventoryData</A
13555></H2
13556><DIV
13557CLASS="funcsynopsis"
13558><P
13559></P
13560><A
13561NAME="AEN3365"
13562></A
13563><P
13564><CODE
13565><CODE
13566CLASS="FUNCDEF"
13567>key llRequestInventoryData</CODE
13568>(string name);</CODE
13569></P
13570><P
13571></P
13572></DIV
13573><P
13574>Requests data from object inventory item
13575 <CODE
13576CLASS="parameter"
13577>name</CODE
13578>. When data is available the <A
13579HREF="#AEN4997"
13580>dataserver</A
13581> event will be raised
13582 with the key returned from this function in the
13583 <CODE
13584CLASS="parameter"
13585>requested</CODE
13586> parameter. The only request
13587 currently implemented is to request data from landmarks, where the
13588 data returned is in the form "&#60;float, float,
13589 float&#62;" which can be cast to a vector. This position is in
13590 region local coordinates of the region the script call is made
13591 (possible even resulting in negative values). So, to
13592 convert this value into a global position, just add the result of
13593 llGetRegionCorner.</P
13594></DIV
13595><DIV
13596CLASS="section"
13597><HR><H2
13598CLASS="section"
13599><A
13600NAME="AEN3375"
13601>A.195. llRequestPermissions</A
13602></H2
13603><DIV
13604CLASS="funcsynopsis"
13605><P
13606></P
13607><A
13608NAME="AEN3377"
13609></A
13610><P
13611><CODE
13612><CODE
13613CLASS="FUNCDEF"
13614>integer llRequestPermissions</CODE
13615>(key avatar, integer perm);</CODE
13616></P
13617><P
13618></P
13619></DIV
13620><P
13621>Ask <CODE
13622CLASS="parameter"
13623>avatar</CODE
13624> to allow the script to do
13625 <CODE
13626CLASS="parameter"
13627>perm</CODE
13628>. The <CODE
13629CLASS="parameter"
13630>perm</CODE
13631>
13632 parameter should be a <A
13633HREF="#AEN5360"
13634>permission
13635 constant</A
13636>. Multiple permissions can be requested
13637 simultaneously by or'ing the constants together. Many of the
13638 permissions requests can only go to object owner. This call will
13639 not stop script execution - if the specified avatar grants the
13640 requested permissions, the <A
13641HREF="#AEN5171"
13642>run_time_permissions</A
13643>
13644 event will be called.</P
13645></DIV
13646><DIV
13647CLASS="section"
13648><HR><H2
13649CLASS="section"
13650><A
13651NAME="AEN3391"
13652>A.196. llRequestSimulatorData</A
13653></H2
13654><DIV
13655CLASS="funcsynopsis"
13656><P
13657></P
13658><A
13659NAME="AEN3393"
13660></A
13661><P
13662><CODE
13663><CODE
13664CLASS="FUNCDEF"
13665>key llRequestSimulatorData</CODE
13666>(string sim_name, integer data);</CODE
13667></P
13668><P
13669></P
13670></DIV
13671><P
13672>This function requests data about simulator
13673 <CODE
13674CLASS="parameter"
13675>sim_name</CODE
13676>. When the information is
13677 collected, the <A
13678HREF="#AEN4997"
13679>dataserver</A
13680>
13681 event is called with the returned key returned from this function
13682 passed in the <CODE
13683CLASS="parameter"
13684>requested</CODE
13685> parameter. See the
13686 <A
13687HREF="#AEN6086"
13688>simulator data constants</A
13689> for
13690 details about valid values of <CODE
13691CLASS="parameter"
13692>data</CODE
13693> and what
13694 each will return in the <A
13695HREF="#AEN4997"
13696>dataserver</A
13697> event.</P
13698></DIV
13699><DIV
13700CLASS="section"
13701><HR><H2
13702CLASS="section"
13703><A
13704NAME="AEN3408"
13705>A.197. llResetScript</A
13706></H2
13707><DIV
13708CLASS="funcsynopsis"
13709><P
13710></P
13711><A
13712NAME="AEN3410"
13713></A
13714><P
13715><CODE
13716><CODE
13717CLASS="FUNCDEF"
13718>llResetScript</CODE
13719>(void);</CODE
13720></P
13721><P
13722></P
13723></DIV
13724><P
13725>Resets this script.</P
13726></DIV
13727><DIV
13728CLASS="section"
13729><HR><H2
13730CLASS="section"
13731><A
13732NAME="AEN3416"
13733>A.198. llResetOtherScript</A
13734></H2
13735><DIV
13736CLASS="funcsynopsis"
13737><P
13738></P
13739><A
13740NAME="AEN3418"
13741></A
13742><P
13743><CODE
13744><CODE
13745CLASS="FUNCDEF"
13746>llResetOtherScript</CODE
13747>(string name);</CODE
13748></P
13749><P
13750></P
13751></DIV
13752><P
13753>Resets the script <CODE
13754CLASS="parameter"
13755>name</CODE
13756>.</P
13757></DIV
13758><DIV
13759CLASS="section"
13760><HR><H2
13761CLASS="section"
13762><A
13763NAME="AEN3426"
13764>A.199. llResetTime</A
13765></H2
13766><DIV
13767CLASS="funcsynopsis"
13768><P
13769></P
13770><A
13771NAME="AEN3428"
13772></A
13773><P
13774><CODE
13775><CODE
13776CLASS="FUNCDEF"
13777>llResetTime</CODE
13778>(void);</CODE
13779></P
13780><P
13781></P
13782></DIV
13783><P
13784>Sets the internal script timer to zero.</P
13785></DIV
13786><DIV
13787CLASS="section"
13788><HR><H2
13789CLASS="section"
13790><A
13791NAME="AEN3434"
13792>A.200. llRezAtRoot</A
13793></H2
13794><DIV
13795CLASS="funcsynopsis"
13796><P
13797></P
13798><A
13799NAME="AEN3436"
13800></A
13801><P
13802><CODE
13803><CODE
13804CLASS="FUNCDEF"
13805>llRezAtRoot</CODE
13806>(string inventory, vector pos, vector vel, rotation rot, integer param);</CODE
13807></P
13808><P
13809></P
13810></DIV
13811><P
13812>Creates object's <CODE
13813CLASS="parameter"
13814>inventory</CODE
13815> object at
13816 position <CODE
13817CLASS="parameter"
13818>pos</CODE
13819> with velocity
13820 <CODE
13821CLASS="parameter"
13822>vel</CODE
13823> and rotation
13824 <CODE
13825CLASS="parameter"
13826>rot</CODE
13827>. The last selected root object's location
13828 in a multi-object selection will be placed at <CODE
13829CLASS="parameter"
13830>pos</CODE
13831>.
13832 All other objects in a selection will be created relative to the last
13833 selected root's position, taking <CODE
13834CLASS="parameter"
13835>rot</CODE
13836> into account.
13837 The <CODE
13838CLASS="parameter"
13839>param</CODE
13840> value
13841 will be available to the newly created object in the <A
13842HREF="#AEN5159"
13843>on_rez</A
13844> event or through the <A
13845HREF="#AEN2164"
13846>llGetStartParameter</A
13847>
13848 library function. The <CODE
13849CLASS="parameter"
13850>vel</CODE
13851> parameter is
13852 ignored if the rezzed object is not physical.</P
13853></DIV
13854><DIV
13855CLASS="section"
13856><HR><H2
13857CLASS="section"
13858><A
13859NAME="AEN3461"
13860>A.201. llRezObject</A
13861></H2
13862><DIV
13863CLASS="funcsynopsis"
13864><P
13865></P
13866><A
13867NAME="AEN3463"
13868></A
13869><P
13870><CODE
13871><CODE
13872CLASS="FUNCDEF"
13873>llRezObject</CODE
13874>(string inventory, vector pos, vector vel, rotation rot, integer param);</CODE
13875></P
13876><P
13877></P
13878></DIV
13879><P
13880>Creates object's <CODE
13881CLASS="parameter"
13882>inventory</CODE
13883> object at
13884 position <CODE
13885CLASS="parameter"
13886>pos</CODE
13887> with velocity
13888 <CODE
13889CLASS="parameter"
13890>vel</CODE
13891> and rotation
13892 <CODE
13893CLASS="parameter"
13894>rot</CODE
13895>. The <CODE
13896CLASS="parameter"
13897>param</CODE
13898> value
13899 will be available to the newly created object in the <A
13900HREF="#AEN5159"
13901>on_rez</A
13902> event or through the <A
13903HREF="#AEN2164"
13904>llGetStartParameter</A
13905>
13906 library function. The <CODE
13907CLASS="parameter"
13908>vel</CODE
13909> parameter is
13910 ignored if the rezzed object is not physical.</P
13911></DIV
13912><DIV
13913CLASS="section"
13914><HR><H2
13915CLASS="section"
13916><A
13917NAME="AEN3486"
13918>A.202. llRot2Angle</A
13919></H2
13920><DIV
13921CLASS="funcsynopsis"
13922><P
13923></P
13924><A
13925NAME="AEN3488"
13926></A
13927><P
13928><CODE
13929><CODE
13930CLASS="FUNCDEF"
13931>float llRot2Angle</CODE
13932>(rotation rot);</CODE
13933></P
13934><P
13935></P
13936></DIV
13937><P
13938>Returns the rotation angle represented by
13939 <CODE
13940CLASS="parameter"
13941>rot</CODE
13942>.</P
13943></DIV
13944><DIV
13945CLASS="section"
13946><HR><H2
13947CLASS="section"
13948><A
13949NAME="AEN3496"
13950>A.203. llRot2Axis</A
13951></H2
13952><DIV
13953CLASS="funcsynopsis"
13954><P
13955></P
13956><A
13957NAME="AEN3498"
13958></A
13959><P
13960><CODE
13961><CODE
13962CLASS="FUNCDEF"
13963>vector llRot2Axis</CODE
13964>(rotation rot);</CODE
13965></P
13966><P
13967></P
13968></DIV
13969><P
13970>Returns the rotation axis represented by
13971 <CODE
13972CLASS="parameter"
13973>rot</CODE
13974>.</P
13975></DIV
13976><DIV
13977CLASS="section"
13978><HR><H2
13979CLASS="section"
13980><A
13981NAME="AEN3506"
13982>A.204. llRot2Euler</A
13983></H2
13984><DIV
13985CLASS="funcsynopsis"
13986><P
13987></P
13988><A
13989NAME="AEN3508"
13990></A
13991><P
13992><CODE
13993><CODE
13994CLASS="FUNCDEF"
13995>vector llRot2Euler</CODE
13996>(rotation rot);</CODE
13997></P
13998><P
13999></P
14000></DIV
14001><P
14002>Returns the Euler Angle representation of
14003 <CODE
14004CLASS="parameter"
14005>rot</CODE
14006>.</P
14007></DIV
14008><DIV
14009CLASS="section"
14010><HR><H2
14011CLASS="section"
14012><A
14013NAME="AEN3516"
14014>A.205. llRot2Fwd</A
14015></H2
14016><DIV
14017CLASS="funcsynopsis"
14018><P
14019></P
14020><A
14021NAME="AEN3518"
14022></A
14023><P
14024><CODE
14025><CODE
14026CLASS="FUNCDEF"
14027>vector llRot2Fwd</CODE
14028>(rotation rot);</CODE
14029></P
14030><P
14031></P
14032></DIV
14033><P
14034>Returns the forward axis represented by
14035 <CODE
14036CLASS="parameter"
14037>rot</CODE
14038>.</P
14039></DIV
14040><DIV
14041CLASS="section"
14042><HR><H2
14043CLASS="section"
14044><A
14045NAME="AEN3526"
14046>A.206. llRot2Left</A
14047></H2
14048><DIV
14049CLASS="funcsynopsis"
14050><P
14051></P
14052><A
14053NAME="AEN3528"
14054></A
14055><P
14056><CODE
14057><CODE
14058CLASS="FUNCDEF"
14059>llRot2Left</CODE
14060>(rotation rot);</CODE
14061></P
14062><P
14063></P
14064></DIV
14065><P
14066>Returns the left axis represented by
14067 <CODE
14068CLASS="parameter"
14069>rot</CODE
14070>.</P
14071></DIV
14072><DIV
14073CLASS="section"
14074><HR><H2
14075CLASS="section"
14076><A
14077NAME="AEN3536"
14078>A.207. llRot2Up</A
14079></H2
14080><DIV
14081CLASS="funcsynopsis"
14082><P
14083></P
14084><A
14085NAME="AEN3538"
14086></A
14087><P
14088><CODE
14089><CODE
14090CLASS="FUNCDEF"
14091>llRot2Up</CODE
14092>(rotation rot);</CODE
14093></P
14094><P
14095></P
14096></DIV
14097><P
14098>Returns the up axis represented by
14099 <CODE
14100CLASS="parameter"
14101>rot</CODE
14102>.</P
14103></DIV
14104><DIV
14105CLASS="section"
14106><HR><H2
14107CLASS="section"
14108><A
14109NAME="AEN3546"
14110>A.208. llRotBetween</A
14111></H2
14112><DIV
14113CLASS="funcsynopsis"
14114><P
14115></P
14116><A
14117NAME="AEN3548"
14118></A
14119><P
14120><CODE
14121><CODE
14122CLASS="FUNCDEF"
14123>rotation llRotBetween</CODE
14124>(vector a, vector b);</CODE
14125></P
14126><P
14127></P
14128></DIV
14129><P
14130>Returns the rotation needed to rotate
14131 <CODE
14132CLASS="parameter"
14133>a</CODE
14134> to <CODE
14135CLASS="parameter"
14136>b</CODE
14137>.</P
14138></DIV
14139><DIV
14140CLASS="section"
14141><HR><H2
14142CLASS="section"
14143><A
14144NAME="AEN3559"
14145>A.209. llRotLookAt</A
14146></H2
14147><DIV
14148CLASS="funcsynopsis"
14149><P
14150></P
14151><A
14152NAME="AEN3561"
14153></A
14154><P
14155><CODE
14156><CODE
14157CLASS="FUNCDEF"
14158>llRotLookAt</CODE
14159>(rotation rot, float strength, float damping);</CODE
14160></P
14161><P
14162></P
14163></DIV
14164><P
14165>Cause object to rotate to <CODE
14166CLASS="parameter"
14167>rot</CODE
14168>. Good
14169 <CODE
14170CLASS="parameter"
14171>strength</CODE
14172> values are around half the mass of
14173 the object and good <CODE
14174CLASS="parameter"
14175>damping</CODE
14176> values are less
14177 than 1/10<SUP
14178>th</SUP
14179> of the
14180 <CODE
14181CLASS="parameter"
14182>strength</CODE
14183>. Asymmetrical shapes require
14184 smaller <CODE
14185CLASS="parameter"
14186>damping</CODE
14187>. A
14188 <CODE
14189CLASS="parameter"
14190>strength</CODE
14191> of 0.0 cancels the look at.</P
14192></DIV
14193><DIV
14194CLASS="section"
14195><HR><H2
14196CLASS="section"
14197><A
14198NAME="AEN3579"
14199>A.210. llRotTarget</A
14200></H2
14201><DIV
14202CLASS="funcsynopsis"
14203><P
14204></P
14205><A
14206NAME="AEN3581"
14207></A
14208><P
14209><CODE
14210><CODE
14211CLASS="FUNCDEF"
14212>integer llRotTarget</CODE
14213>(rotation rot, float error);</CODE
14214></P
14215><P
14216></P
14217></DIV
14218><P
14219>Set object rotation within <CODE
14220CLASS="parameter"
14221>error</CODE
14222> of
14223 <CODE
14224CLASS="parameter"
14225>rotation</CODE
14226> as a rotational target and return
14227 an integer number for the target. The number can be used in <A
14228HREF="#AEN3593"
14229>llRotTargetRemove</A
14230>.</P
14231></DIV
14232><DIV
14233CLASS="section"
14234><HR><H2
14235CLASS="section"
14236><A
14237NAME="AEN3593"
14238>A.211. llRotTargetRemove</A
14239></H2
14240><DIV
14241CLASS="funcsynopsis"
14242><P
14243></P
14244><A
14245NAME="AEN3595"
14246></A
14247><P
14248><CODE
14249><CODE
14250CLASS="FUNCDEF"
14251>llRotTargetRemove</CODE
14252>(integer number);</CODE
14253></P
14254><P
14255></P
14256></DIV
14257><P
14258>Remove rotational target
14259 <CODE
14260CLASS="parameter"
14261>number</CODE
14262>.</P
14263></DIV
14264><DIV
14265CLASS="section"
14266><HR><H2
14267CLASS="section"
14268><A
14269NAME="AEN3603"
14270>A.212. llRotateTexture</A
14271></H2
14272><DIV
14273CLASS="funcsynopsis"
14274><P
14275></P
14276><A
14277NAME="AEN3605"
14278></A
14279><P
14280><CODE
14281><CODE
14282CLASS="FUNCDEF"
14283>llRotateTexture</CODE
14284>(float radians, integer face);</CODE
14285></P
14286><P
14287></P
14288></DIV
14289><P
14290>Sets the texture rotation of <CODE
14291CLASS="parameter"
14292>face</CODE
14293> to
14294 <CODE
14295CLASS="parameter"
14296>radians</CODE
14297>. If <CODE
14298CLASS="parameter"
14299>face</CODE
14300>
14301 <A
14302HREF="#AEN6073"
14303>ALL_SIDES</A
14304>, rotate the
14305 texture of all faces.</P
14306></DIV
14307><DIV
14308CLASS="section"
14309><HR><H2
14310CLASS="section"
14311><A
14312NAME="AEN3618"
14313>A.213. llRound</A
14314></H2
14315><DIV
14316CLASS="funcsynopsis"
14317><P
14318></P
14319><A
14320NAME="AEN3620"
14321></A
14322><P
14323><CODE
14324><CODE
14325CLASS="FUNCDEF"
14326>integer llRound</CODE
14327>(float val);</CODE
14328></P
14329><P
14330></P
14331></DIV
14332><P
14333>returns <CODE
14334CLASS="parameter"
14335>val</CODE
14336> rounded to the nearest
14337 integer.</P
14338></DIV
14339><DIV
14340CLASS="section"
14341><HR><H2
14342CLASS="section"
14343><A
14344NAME="AEN3628"
14345>A.214. llSameGroup</A
14346></H2
14347><DIV
14348CLASS="funcsynopsis"
14349><P
14350></P
14351><A
14352NAME="AEN3630"
14353></A
14354><P
14355><CODE
14356><CODE
14357CLASS="FUNCDEF"
14358>integer llSameGroup</CODE
14359>(key id);</CODE
14360></P
14361><P
14362></P
14363></DIV
14364><P
14365>Returns <A
14366HREF="#AEN5295"
14367>TRUE</A
14368> if the
14369 object or agent <CODE
14370CLASS="parameter"
14371>id</CODE
14372> is in the same simulator
14373 and has the same active group as this object. Otherwise, returns
14374 <A
14375HREF="#AEN5295"
14376>FALSE</A
14377>.</P
14378></DIV
14379><DIV
14380CLASS="section"
14381><HR><H2
14382CLASS="section"
14383><A
14384NAME="AEN3640"
14385>A.215. llSay</A
14386></H2
14387><DIV
14388CLASS="funcsynopsis"
14389><P
14390></P
14391><A
14392NAME="AEN3642"
14393></A
14394><P
14395><CODE
14396><CODE
14397CLASS="FUNCDEF"
14398>llSay</CODE
14399>(integer channel, string text);</CODE
14400></P
14401><P
14402></P
14403></DIV
14404><P
14405>Say <CODE
14406CLASS="parameter"
14407>text</CODE
14408> on
14409 <CODE
14410CLASS="parameter"
14411>channel</CODE
14412>. Channel 0 is the public chat
14413 channel that all avatars see as chat text. Channels 1 to
14414 2,147,483,648 are private channels that are not sent to avatars
14415 but other scripts can listen for through the <A
14416HREF="#AEN2665"
14417>llListen</A
14418> api.</P
14419></DIV
14420><DIV
14421CLASS="section"
14422><HR><H2
14423CLASS="section"
14424><A
14425NAME="AEN3654"
14426>A.216. llScaleTexture</A
14427></H2
14428><DIV
14429CLASS="funcsynopsis"
14430><P
14431></P
14432><A
14433NAME="AEN3656"
14434></A
14435><P
14436><CODE
14437><CODE
14438CLASS="FUNCDEF"
14439>llScaleTexture</CODE
14440>(integer scale_s, integer scale_t, integer face);</CODE
14441></P
14442><P
14443></P
14444></DIV
14445><P
14446>Sets the texture s and t scales of
14447 <CODE
14448CLASS="parameter"
14449>face</CODE
14450> to <CODE
14451CLASS="parameter"
14452>scale_s</CODE
14453> and
14454 <CODE
14455CLASS="parameter"
14456>scale_t</CODE
14457> respectively. If face is <A
14458HREF="#AEN6073"
14459>ALL_SIDES</A
14460>, scale the texture
14461 to all faces.</P
14462></DIV
14463><DIV
14464CLASS="section"
14465><HR><H2
14466CLASS="section"
14467><A
14468NAME="AEN3671"
14469>A.217. llScriptDanger</A
14470></H2
14471><DIV
14472CLASS="funcsynopsis"
14473><P
14474></P
14475><A
14476NAME="AEN3673"
14477></A
14478><P
14479><CODE
14480><CODE
14481CLASS="FUNCDEF"
14482>integer llScriptDanger</CODE
14483>(vector pos);</CODE
14484></P
14485><P
14486></P
14487></DIV
14488><P
14489>Returns true if pos is over public land, land that doesn't allow everyone to edit and build, or land that doesn't allow outside scripts.</P
14490></DIV
14491><DIV
14492CLASS="section"
14493><HR><H2
14494CLASS="section"
14495><A
14496NAME="AEN3680"
14497>A.218. llSendRemoteData</A
14498></H2
14499><DIV
14500CLASS="funcsynopsis"
14501><P
14502></P
14503><A
14504NAME="AEN3682"
14505></A
14506><P
14507><CODE
14508><CODE
14509CLASS="FUNCDEF"
14510>key llSendRemoteData</CODE
14511>(string dest, integer idata, string sdata);</CODE
14512></P
14513><P
14514></P
14515></DIV
14516><P
14517>Send an XML-RPC request to dest through channel with payload
14518 of channel (in a string), integer idata and string sdata. An
14519 XML-RPC reply will trigger a remote_data event with type =
14520 REMOTE_DATA_REPLY. The call returns a message_id that can be used
14521 to identify XML-RPC replies.</P
14522></DIV
14523><DIV
14524CLASS="section"
14525><HR><H2
14526CLASS="section"
14527><A
14528NAME="AEN3693"
14529>A.219. llSensor</A
14530></H2
14531><DIV
14532CLASS="funcsynopsis"
14533><P
14534></P
14535><A
14536NAME="AEN3695"
14537></A
14538><P
14539><CODE
14540><CODE
14541CLASS="FUNCDEF"
14542>llSensor</CODE
14543>(string name, key id, integer type, float range, float arc);</CODE
14544></P
14545><P
14546></P
14547></DIV
14548><P
14549>Performs a single scan for <CODE
14550CLASS="parameter"
14551>name</CODE
14552> and
14553 <CODE
14554CLASS="parameter"
14555>id</CODE
14556> with <CODE
14557CLASS="parameter"
14558>type</CODE
14559> within
14560 <CODE
14561CLASS="parameter"
14562>range</CODE
14563> meters and <CODE
14564CLASS="parameter"
14565>arc</CODE
14566>
14567 radians of forward vector. Specifying a blank name or <A
14568HREF="#AEN6070"
14569>NULL_KEY</A
14570> id will not filter results for
14571 any particular name or id. A range of 0.0 does not perform a
14572 scan. Range is limited to 96.0. The <CODE
14573CLASS="parameter"
14574>type</CODE
14575> parameter should be an <A
14576HREF="#AEN5338"
14577>object type constant</A
14578> value. If anything is found
14579 during the scan, a <A
14580HREF="#AEN5183"
14581>sensor</A
14582> event is triggered. A maximum
14583 of 16 items are passed to this event. If nothing is found during the scan, a
14584 <A
14585HREF="#AEN5121"
14586>no sensor</A
14587> event is triggered instead.</P
14588></DIV
14589><DIV
14590CLASS="section"
14591><HR><H2
14592CLASS="section"
14593><A
14594NAME="AEN3720"
14595>A.220. llSensorRemove</A
14596></H2
14597><DIV
14598CLASS="funcsynopsis"
14599><P
14600></P
14601><A
14602NAME="AEN3722"
14603></A
14604><P
14605><CODE
14606><CODE
14607CLASS="FUNCDEF"
14608>llSensorRemove</CODE
14609>(void);</CODE
14610></P
14611><P
14612></P
14613></DIV
14614><P
14615>Removes the sensor.</P
14616></DIV
14617><DIV
14618CLASS="section"
14619><HR><H2
14620CLASS="section"
14621><A
14622NAME="AEN3728"
14623>A.221. llSensorRepeat</A
14624></H2
14625><DIV
14626CLASS="funcsynopsis"
14627><P
14628></P
14629><A
14630NAME="AEN3730"
14631></A
14632><P
14633><CODE
14634><CODE
14635CLASS="FUNCDEF"
14636>llSensorRepeat</CODE
14637>(string name, key id, integer type, float range, float arc, float rate);</CODE
14638></P
14639><P
14640></P
14641></DIV
14642><P
14643>Performs a single scan for <CODE
14644CLASS="parameter"
14645>name</CODE
14646> and
14647 <CODE
14648CLASS="parameter"
14649>id</CODE
14650> with <CODE
14651CLASS="parameter"
14652>type</CODE
14653> within
14654 <CODE
14655CLASS="parameter"
14656>range</CODE
14657> meters and <CODE
14658CLASS="parameter"
14659>arc</CODE
14660>
14661 radians of forward vector and repeats every
14662 <CODE
14663CLASS="parameter"
14664>rate</CODE
14665> seconds. Specifying a blank name or
14666 <A
14667HREF="#AEN6070"
14668>NULL_KEY</A
14669> id will not filter
14670 results for any particular name or id. A range of 0.0 cancels the
14671 scan. Range is limited to 96.0. The <CODE
14672CLASS="parameter"
14673>type</CODE
14674> parameter should be an <A
14675HREF="#AEN5338"
14676>object type constant</A
14677>
14678 value. If anything is found during the scan, a <A
14679HREF="#AEN5183"
14680>sensor</A
14681>
14682 event is triggered. A maximum of 16 items are passed to this event. If nothing is found
14683 during the scan, a <A
14684HREF="#AEN5121"
14685>no sensor</A
14686> event is triggered instead.</P
14687></DIV
14688><DIV
14689CLASS="section"
14690><HR><H2
14691CLASS="section"
14692><A
14693NAME="AEN3758"
14694>A.222. llSetAlpha</A
14695></H2
14696><DIV
14697CLASS="funcsynopsis"
14698><P
14699></P
14700><A
14701NAME="AEN3760"
14702></A
14703><P
14704><CODE
14705><CODE
14706CLASS="FUNCDEF"
14707>llSetAlpha</CODE
14708>(float alpha, integer face);</CODE
14709></P
14710><P
14711></P
14712></DIV
14713><P
14714>Sets the alpha value for <CODE
14715CLASS="parameter"
14716>face</CODE
14717>. If
14718 face is <A
14719HREF="#AEN6073"
14720>ALL_SIDES</A
14721>, set
14722 the alpha to all faces. The <CODE
14723CLASS="parameter"
14724>alpha</CODE
14725> value is
14726 interpreted as an opacity percentage - 1.0 is fully opaque, and
14727 0.2 is mostly transparent. This api will clamp
14728 <CODE
14729CLASS="parameter"
14730>alpha</CODE
14731> values less 0.1 to .1 and greater
14732 than 1.0 to 1.</P
14733></DIV
14734><DIV
14735CLASS="section"
14736><HR><H2
14737CLASS="section"
14738><A
14739NAME="AEN3773"
14740>A.223. llSetBuoyancy</A
14741></H2
14742><DIV
14743CLASS="funcsynopsis"
14744><P
14745></P
14746><A
14747NAME="AEN3775"
14748></A
14749><P
14750><CODE
14751><CODE
14752CLASS="FUNCDEF"
14753>llSetBuoyancy</CODE
14754>(float buoyancy);</CODE
14755></P
14756><P
14757></P
14758></DIV
14759><P
14760>Set the object buoyancy. A value of 0 is none, less than 1.0 sinks,
14761 1.0 floats, and greater than 1.0 rises.</P
14762></DIV
14763><DIV
14764CLASS="section"
14765><HR><H2
14766CLASS="section"
14767><A
14768NAME="AEN3782"
14769>A.224. llSetCameraAtOffset</A
14770></H2
14771><DIV
14772CLASS="funcsynopsis"
14773><P
14774></P
14775><A
14776NAME="AEN3784"
14777></A
14778><P
14779><CODE
14780><CODE
14781CLASS="FUNCDEF"
14782>llSetCameraAtOffset</CODE
14783>(vector offset);</CODE
14784></P
14785><P
14786></P
14787></DIV
14788><P
14789>Sets the camera at offset used in this object if an avatar
14790 sits on it.</P
14791></DIV
14792><DIV
14793CLASS="section"
14794><HR><H2
14795CLASS="section"
14796><A
14797NAME="AEN3791"
14798>A.225. llSetClickAction</A
14799></H2
14800><DIV
14801CLASS="funcsynopsis"
14802><P
14803></P
14804><A
14805NAME="AEN3793"
14806></A
14807><P
14808><CODE
14809><CODE
14810CLASS="FUNCDEF"
14811>llSetClickAction</CODE
14812>(integer action);</CODE
14813></P
14814><P
14815></P
14816></DIV
14817><P
14818>Sets which action is invoked when a resident clicks a prim.</P
14819></DIV
14820><DIV
14821CLASS="section"
14822><HR><H2
14823CLASS="section"
14824><A
14825NAME="AEN3800"
14826>A.226. llForceMouselook</A
14827></H2
14828><DIV
14829CLASS="funcsynopsis"
14830><P
14831></P
14832><A
14833NAME="AEN3802"
14834></A
14835><P
14836><CODE
14837><CODE
14838CLASS="FUNCDEF"
14839>llForceMouselook</CODE
14840>(integer mouselook);</CODE
14841></P
14842><P
14843></P
14844></DIV
14845><P
14846>Puts the camera into mouselook mode if an avatar
14847 sits on this object.</P
14848></DIV
14849><DIV
14850CLASS="section"
14851><HR><H2
14852CLASS="section"
14853><A
14854NAME="AEN3809"
14855>A.227. llSetCameraEyeOffset</A
14856></H2
14857><DIV
14858CLASS="funcsynopsis"
14859><P
14860></P
14861><A
14862NAME="AEN3811"
14863></A
14864><P
14865><CODE
14866><CODE
14867CLASS="FUNCDEF"
14868>llSetCameraEyeOffset</CODE
14869>(vector offset);</CODE
14870></P
14871><P
14872></P
14873></DIV
14874><P
14875>Sets the camera eye offset used in this object if an avatar
14876 sits on it.</P
14877></DIV
14878><DIV
14879CLASS="section"
14880><HR><H2
14881CLASS="section"
14882><A
14883NAME="AEN3818"
14884>A.228. llSetColor</A
14885></H2
14886><DIV
14887CLASS="funcsynopsis"
14888><P
14889></P
14890><A
14891NAME="AEN3820"
14892></A
14893><P
14894><CODE
14895><CODE
14896CLASS="FUNCDEF"
14897>llSetColor</CODE
14898>(vector color, integer face);</CODE
14899></P
14900><P
14901></P
14902></DIV
14903><P
14904>Sets the <CODE
14905CLASS="parameter"
14906>color</CODE
14907> of
14908 <CODE
14909CLASS="parameter"
14910>face</CODE
14911>. If face is <A
14912HREF="#AEN6073"
14913>ALL_SIDES</A
14914>, set the alpha to
14915 all faces.</P
14916></DIV
14917><DIV
14918CLASS="section"
14919><HR><H2
14920CLASS="section"
14921><A
14922NAME="AEN3832"
14923>A.229. llSetDamage</A
14924></H2
14925><DIV
14926CLASS="funcsynopsis"
14927><P
14928></P
14929><A
14930NAME="AEN3834"
14931></A
14932><P
14933><CODE
14934><CODE
14935CLASS="FUNCDEF"
14936>llSetDamage</CODE
14937>(float damage);</CODE
14938></P
14939><P
14940></P
14941></DIV
14942><P
14943>Sets the amount of damage that will be done to an object
14944 that this object hits. This object will be destroyed on damaging
14945 another object.</P
14946></DIV
14947><DIV
14948CLASS="section"
14949><HR><H2
14950CLASS="section"
14951><A
14952NAME="AEN3841"
14953>A.230. llSetForce</A
14954></H2
14955><DIV
14956CLASS="funcsynopsis"
14957><P
14958></P
14959><A
14960NAME="AEN3843"
14961></A
14962><P
14963><CODE
14964><CODE
14965CLASS="FUNCDEF"
14966>llSetForce</CODE
14967>(vector force, integer local);</CODE
14968></P
14969><P
14970></P
14971></DIV
14972><P
14973>If the object is physical, this function sets the
14974 <CODE
14975CLASS="parameter"
14976>force</CODE
14977>. The vector is in local coordinates if
14978 local is <A
14979HREF="#AEN5295"
14980>TRUE</A
14981>, global if
14982 <A
14983HREF="#AEN5295"
14984>FALSE</A
14985>.</P
14986></DIV
14987><DIV
14988CLASS="section"
14989><HR><H2
14990CLASS="section"
14991><A
14992NAME="AEN3855"
14993>A.231. llSetForceAndTorque</A
14994></H2
14995><DIV
14996CLASS="funcsynopsis"
14997><P
14998></P
14999><A
15000NAME="AEN3857"
15001></A
15002><P
15003><CODE
15004><CODE
15005CLASS="FUNCDEF"
15006>llSetForceAndTorque</CODE
15007>(vector force, vector torque, integer local);</CODE
15008></P
15009><P
15010></P
15011></DIV
15012><P
15013>If the object is physical, this function sets the
15014 <CODE
15015CLASS="parameter"
15016>force</CODE
15017> and
15018 <CODE
15019CLASS="parameter"
15020>torque</CODE
15021>. The vectors are in local coordinates
15022 if local is <A
15023HREF="#AEN5295"
15024>TRUE</A
15025>, global if
15026 <A
15027HREF="#AEN5295"
15028>FALSE</A
15029>.</P
15030></DIV
15031><DIV
15032CLASS="section"
15033><HR><H2
15034CLASS="section"
15035><A
15036NAME="AEN3872"
15037>A.232. llSetHoverHeight</A
15038></H2
15039><DIV
15040CLASS="funcsynopsis"
15041><P
15042></P
15043><A
15044NAME="AEN3874"
15045></A
15046><P
15047><CODE
15048><CODE
15049CLASS="FUNCDEF"
15050>llSetHoverHeight</CODE
15051>(float height, float water, float tau);</CODE
15052></P
15053><P
15054></P
15055></DIV
15056><P
15057>Critically damps to a height. The height is above ground and
15058 water if <CODE
15059CLASS="parameter"
15060>water</CODE
15061> is <A
15062HREF="#AEN5295"
15063>TRUE</A
15064>.</P
15065></DIV
15066><DIV
15067CLASS="section"
15068><HR><H2
15069CLASS="section"
15070><A
15071NAME="AEN3887"
15072>A.233. llSetLinkAlpha</A
15073></H2
15074><DIV
15075CLASS="funcsynopsis"
15076><P
15077></P
15078><A
15079NAME="AEN3889"
15080></A
15081><P
15082><CODE
15083><CODE
15084CLASS="FUNCDEF"
15085>llSetLinkAlpha</CODE
15086>(integer linknumber, float alpha, integer face);</CODE
15087></P
15088><P
15089></P
15090></DIV
15091><P
15092>Sets the <CODE
15093CLASS="parameter"
15094>alpha</CODE
15095> of a prim in the link set.
15096 The <CODE
15097CLASS="parameter"
15098>linknum</CODE
15099>
15100 parameter is either the linked number available through <A
15101HREF="#AEN1867"
15102>llGetLinkNumber</A
15103> or a <A
15104HREF="#AEN5616"
15105>link constant</A
15106>.
15107 If <CODE
15108CLASS="parameter"
15109>face</CODE
15110> is
15111 <A
15112HREF="#AEN6073"
15113>ALL_SIDES</A
15114>, set the alpha
15115 of all faces.</P
15116></DIV
15117><DIV
15118CLASS="section"
15119><HR><H2
15120CLASS="section"
15121><A
15122NAME="AEN3906"
15123>A.234. llSetLinkColor</A
15124></H2
15125><DIV
15126CLASS="funcsynopsis"
15127><P
15128></P
15129><A
15130NAME="AEN3908"
15131></A
15132><P
15133><CODE
15134><CODE
15135CLASS="FUNCDEF"
15136>llSetLinkColor</CODE
15137>(integer linknumber, vector color, integer face);</CODE
15138></P
15139><P
15140></P
15141></DIV
15142><P
15143>Sets the <CODE
15144CLASS="parameter"
15145>color</CODE
15146> of a prim in the link set.
15147 The <CODE
15148CLASS="parameter"
15149>linknum</CODE
15150>
15151 parameter is either the linked number available through <A
15152HREF="#AEN1867"
15153>llGetLinkNumber</A
15154> or a <A
15155HREF="#AEN5616"
15156>link constant</A
15157>.
15158 If <CODE
15159CLASS="parameter"
15160>face</CODE
15161> is
15162 <A
15163HREF="#AEN6073"
15164>ALL_SIDES</A
15165>, set the color
15166 of all faces.</P
15167></DIV
15168><DIV
15169CLASS="section"
15170><HR><H2
15171CLASS="section"
15172><A
15173NAME="AEN3925"
15174>A.235. llSetLinkPrimitiveParams</A
15175></H2
15176><DIV
15177CLASS="funcsynopsis"
15178><P
15179></P
15180><A
15181NAME="AEN3927"
15182></A
15183><P
15184><CODE
15185><CODE
15186CLASS="FUNCDEF"
15187>llSetLinkPrimitiveParams</CODE
15188>(integer linknumber, list rules);</CODE
15189></P
15190><P
15191></P
15192></DIV
15193><P
15194>Sets the primitive parameters of a prim in the link set.
15195 The <CODE
15196CLASS="parameter"
15197>linknum</CODE
15198>
15199 parameter is either the linked number available through <A
15200HREF="#AEN1867"
15201>llGetLinkNumber</A
15202> or a <A
15203HREF="#AEN5616"
15204>link constant</A
15205>.
15206 The <CODE
15207CLASS="parameter"
15208>rules</CODE
15209>
15210 list is identical to that of
15211 <A
15212HREF="#AEN4020"
15213>llSetPrimitiveParams</A
15214>.</P
15215></DIV
15216><DIV
15217CLASS="section"
15218><HR><H2
15219CLASS="section"
15220><A
15221NAME="AEN3941"
15222>A.236. llSetLinkTexture</A
15223></H2
15224><DIV
15225CLASS="funcsynopsis"
15226><P
15227></P
15228><A
15229NAME="AEN3943"
15230></A
15231><P
15232><CODE
15233><CODE
15234CLASS="FUNCDEF"
15235>llSetLinkTexture</CODE
15236>(integer linknumber, string texture, integer face);</CODE
15237></P
15238><P
15239></P
15240></DIV
15241><P
15242>Sets the <CODE
15243CLASS="parameter"
15244>texture</CODE
15245> of a prim in the link set.
15246 The <CODE
15247CLASS="parameter"
15248>linknum</CODE
15249>
15250 parameter is either the linked number available through <A
15251HREF="#AEN1867"
15252>llGetLinkNumber</A
15253> or a <A
15254HREF="#AEN5616"
15255>link constant</A
15256>.
15257 If <CODE
15258CLASS="parameter"
15259>face</CODE
15260> is
15261 <A
15262HREF="#AEN6073"
15263>ALL_SIDES</A
15264>, set the texture
15265 of all faces.</P
15266></DIV
15267><DIV
15268CLASS="section"
15269><HR><H2
15270CLASS="section"
15271><A
15272NAME="AEN3960"
15273>A.237. llSetLocalRot</A
15274></H2
15275><DIV
15276CLASS="funcsynopsis"
15277><P
15278></P
15279><A
15280NAME="AEN3962"
15281></A
15282><P
15283><CODE
15284><CODE
15285CLASS="FUNCDEF"
15286>llSetLocalRot</CODE
15287>(rotation rot);</CODE
15288></P
15289><P
15290></P
15291></DIV
15292><P
15293>If the object is not physical, this function sets the
15294 rotation of a child prim relative to the root prim, and the
15295 linked set is adjusted.</P
15296></DIV
15297><DIV
15298CLASS="section"
15299><HR><H2
15300CLASS="section"
15301><A
15302NAME="AEN3969"
15303>A.238. llSetObjectDesc</A
15304></H2
15305><DIV
15306CLASS="funcsynopsis"
15307><P
15308></P
15309><A
15310NAME="AEN3971"
15311></A
15312><P
15313><CODE
15314><CODE
15315CLASS="FUNCDEF"
15316>llSetObjectDesc</CODE
15317>(string description);</CODE
15318></P
15319><P
15320></P
15321></DIV
15322><P
15323>Sets the object description to <CODE
15324CLASS="parameter"
15325>description</CODE
15326>.</P
15327></DIV
15328><DIV
15329CLASS="section"
15330><HR><H2
15331CLASS="section"
15332><A
15333NAME="AEN3979"
15334>A.239. llSetObjectName</A
15335></H2
15336><DIV
15337CLASS="funcsynopsis"
15338><P
15339></P
15340><A
15341NAME="AEN3981"
15342></A
15343><P
15344><CODE
15345><CODE
15346CLASS="FUNCDEF"
15347>llSetObjectName</CODE
15348>(string name);</CODE
15349></P
15350><P
15351></P
15352></DIV
15353><P
15354>Sets the object name to <CODE
15355CLASS="parameter"
15356>name</CODE
15357>.</P
15358></DIV
15359><DIV
15360CLASS="section"
15361><HR><H2
15362CLASS="section"
15363><A
15364NAME="AEN3989"
15365>A.240. llSetParcelMusicURL</A
15366></H2
15367><DIV
15368CLASS="funcsynopsis"
15369><P
15370></P
15371><A
15372NAME="AEN3991"
15373></A
15374><P
15375><CODE
15376><CODE
15377CLASS="FUNCDEF"
15378>llSetParcelMusicURL</CODE
15379>(string url);</CODE
15380></P
15381><P
15382></P
15383></DIV
15384><P
15385>Sets the streaming audio URL for the parcel where the object
15386 is currently located. The <CODE
15387CLASS="parameter"
15388>url</CODE
15389> must be an
15390 http streaming source of mp3 or ogg data.</P
15391></DIV
15392><DIV
15393CLASS="section"
15394><HR><H2
15395CLASS="section"
15396><A
15397NAME="AEN3999"
15398>A.241. llSetPayPrice</A
15399></H2
15400><DIV
15401CLASS="funcsynopsis"
15402><P
15403></P
15404><A
15405NAME="AEN4001"
15406></A
15407><P
15408><CODE
15409><CODE
15410CLASS="FUNCDEF"
15411>llSetPayPrice</CODE
15412>(integer default_price, list quick_pay_buttons);</CODE
15413></P
15414><P
15415></P
15416></DIV
15417><P
15418>Sets the default pay price and optionally the quick pay buttons
15419 for the 'Pay' window when someone pays this object.
15420 See also <A
15421HREF="#AEN5434"
15422>Pay Button Constants</A
15423>. </P
15424></DIV
15425><DIV
15426CLASS="section"
15427><HR><H2
15428CLASS="section"
15429><A
15430NAME="AEN4011"
15431>A.242. llSetPos</A
15432></H2
15433><DIV
15434CLASS="funcsynopsis"
15435><P
15436></P
15437><A
15438NAME="AEN4013"
15439></A
15440><P
15441><CODE
15442><CODE
15443CLASS="FUNCDEF"
15444>llSetPos</CODE
15445>(vector pos);</CODE
15446></P
15447><P
15448></P
15449></DIV
15450><P
15451>If the object is not physical, this function sets the
15452 position in region coordinates. If the object is a child, the
15453 position is treated as root relative and the linked set is
15454 adjusted.</P
15455></DIV
15456><DIV
15457CLASS="section"
15458><HR><H2
15459CLASS="section"
15460><A
15461NAME="AEN4020"
15462>A.243. llSetPrimitiveParams</A
15463></H2
15464><DIV
15465CLASS="funcsynopsis"
15466><P
15467></P
15468><A
15469NAME="AEN4022"
15470></A
15471><P
15472><CODE
15473><CODE
15474CLASS="FUNCDEF"
15475>llSetPrimitiveParams</CODE
15476>(list rules);</CODE
15477></P
15478><P
15479></P
15480></DIV
15481><P
15482>Set primitive parameters based on <CODE
15483CLASS="parameter"
15484>rules</CODE
15485>. The
15486 <CODE
15487CLASS="parameter"
15488>rules</CODE
15489> are specified as an ordered list
15490 of parameter and value(s). Valid parameters and their expected values
15491 can be found in the <A
15492HREF="#AEN6323"
15493>Primitive Constants</A
15494>.
15495 Here is a simple example:
15496<DIV
15497CLASS="informalexample"
15498><P
15499></P
15500><A
15501NAME="AEN4032"
15502></A
15503><PRE
15504CLASS="programlisting"
15505>&#13;llSetPrimitiveParams([PRIM_TYPE, PRIM_TYPE_BOX, PRIM_HOLE_DEFAULT, &#60;0,1,0&#62;,
15506 0.5, &#60;-0.2, 0.2, 0&#62;, &#60;0.5,0.5,0&#62;,&#60;-0.5,0.5,0&#62;]);
15507</PRE
15508><P
15509></P
15510></DIV
15511></P
15512></DIV
15513><DIV
15514CLASS="section"
15515><HR><H2
15516CLASS="section"
15517><A
15518NAME="AEN4034"
15519>A.244. llSetRemoteScriptAccessPin</A
15520></H2
15521><DIV
15522CLASS="funcsynopsis"
15523><P
15524></P
15525><A
15526NAME="AEN4036"
15527></A
15528><P
15529><CODE
15530><CODE
15531CLASS="FUNCDEF"
15532>llSetRemoteScriptAccessPin</CODE
15533>(integer pin);</CODE
15534></P
15535><P
15536></P
15537></DIV
15538><P
15539>If pin is set to a non-zero number, the task will accept remote script
15540 loads via llRemoteLoadScriptPin if it passes in the correct pin.
15541 Otherwise, llRemoteLoadScriptPin is ignored.</P
15542></DIV
15543><DIV
15544CLASS="section"
15545><HR><H2
15546CLASS="section"
15547><A
15548NAME="AEN4043"
15549>A.245. llSetRot</A
15550></H2
15551><DIV
15552CLASS="funcsynopsis"
15553><P
15554></P
15555><A
15556NAME="AEN4045"
15557></A
15558><P
15559><CODE
15560><CODE
15561CLASS="FUNCDEF"
15562>llSetRot</CODE
15563>(rotation rot);</CODE
15564></P
15565><P
15566></P
15567></DIV
15568><P
15569>If the object is not physical, this function sets the
15570 rotation. If the object is a child, the position is treated as
15571 root relative and the linked set is adjusted.</P
15572></DIV
15573><DIV
15574CLASS="section"
15575><HR><H2
15576CLASS="section"
15577><A
15578NAME="AEN4052"
15579>A.246. llSetScale</A
15580></H2
15581><DIV
15582CLASS="funcsynopsis"
15583><P
15584></P
15585><A
15586NAME="AEN4054"
15587></A
15588><P
15589><CODE
15590><CODE
15591CLASS="FUNCDEF"
15592>llSetScale</CODE
15593>(vector scale);</CODE
15594></P
15595><P
15596></P
15597></DIV
15598><P
15599>Sets the object scale.</P
15600></DIV
15601><DIV
15602CLASS="section"
15603><HR><H2
15604CLASS="section"
15605><A
15606NAME="AEN4061"
15607>A.247. llSetScriptState</A
15608></H2
15609><DIV
15610CLASS="funcsynopsis"
15611><P
15612></P
15613><A
15614NAME="AEN4063"
15615></A
15616><P
15617><CODE
15618><CODE
15619CLASS="FUNCDEF"
15620>llSetScriptState</CODE
15621>(string name, integer run);</CODE
15622></P
15623><P
15624></P
15625></DIV
15626><P
15627>Control the state of a script on the object.</P
15628></DIV
15629><DIV
15630CLASS="section"
15631><HR><H2
15632CLASS="section"
15633><A
15634NAME="AEN4072"
15635>A.248. llSetSitText</A
15636></H2
15637><DIV
15638CLASS="funcsynopsis"
15639><P
15640></P
15641><A
15642NAME="AEN4074"
15643></A
15644><P
15645><CODE
15646><CODE
15647CLASS="FUNCDEF"
15648>llSetSitText</CODE
15649>(string text);</CODE
15650></P
15651><P
15652></P
15653></DIV
15654><P
15655>Displays <CODE
15656CLASS="parameter"
15657>text</CODE
15658> rather than 'sit' in
15659 viewer pie menu.</P
15660></DIV
15661><DIV
15662CLASS="section"
15663><HR><H2
15664CLASS="section"
15665><A
15666NAME="AEN4082"
15667>A.249. llSetSoundQueueing</A
15668></H2
15669><DIV
15670CLASS="funcsynopsis"
15671><P
15672></P
15673><A
15674NAME="AEN4084"
15675></A
15676><P
15677><CODE
15678><CODE
15679CLASS="FUNCDEF"
15680>llSetSoundQueueing</CODE
15681>(integer queue);</CODE
15682></P
15683><P
15684></P
15685></DIV
15686><P
15687>Sets whether successive calls to <A
15688HREF="#AEN3184"
15689>llPlaySound</A
15690>, <A
15691HREF="#AEN2773"
15692>llLoopSound</A
15693>, etc., (attached
15694 sounds) interrupt the playing sound. The default for objects is
15695 <A
15696HREF="#AEN5295"
15697>FALSE</A
15698>. Setting this value to
15699 <A
15700HREF="#AEN5295"
15701>TRUE</A
15702> will make the sound wait
15703 until the current playing sound reaches its end. The queue is one
15704 level deep.</P
15705></DIV
15706><DIV
15707CLASS="section"
15708><HR><H2
15709CLASS="section"
15710><A
15711NAME="AEN4095"
15712>A.250. llSetStatus</A
15713></H2
15714><DIV
15715CLASS="funcsynopsis"
15716><P
15717></P
15718><A
15719NAME="AEN4097"
15720></A
15721><P
15722><CODE
15723><CODE
15724CLASS="FUNCDEF"
15725>llSetStatus</CODE
15726>(integer status, integer value);</CODE
15727></P
15728><P
15729></P
15730></DIV
15731><P
15732>Sets the <CODE
15733CLASS="parameter"
15734>status</CODE
15735> to
15736 <CODE
15737CLASS="parameter"
15738>value</CODE
15739>. Use <A
15740HREF="#AEN5304"
15741>status constants</A
15742> for the values of
15743 <CODE
15744CLASS="parameter"
15745>status</CODE
15746>.</P
15747></DIV
15748><DIV
15749CLASS="section"
15750><HR><H2
15751CLASS="section"
15752><A
15753NAME="AEN4110"
15754>A.251. llSetText</A
15755></H2
15756><DIV
15757CLASS="funcsynopsis"
15758><P
15759></P
15760><A
15761NAME="AEN4112"
15762></A
15763><P
15764><CODE
15765><CODE
15766CLASS="FUNCDEF"
15767>llSetText</CODE
15768>(string text, vector color, float alpha);</CODE
15769></P
15770><P
15771></P
15772></DIV
15773><P
15774>Sets text that floats above object to
15775 <CODE
15776CLASS="parameter"
15777>text</CODE
15778>, using the specified
15779 <CODE
15780CLASS="parameter"
15781>color</CODE
15782> and
15783 <CODE
15784CLASS="parameter"
15785>alpha</CODE
15786>.</P
15787></DIV
15788><DIV
15789CLASS="section"
15790><HR><H2
15791CLASS="section"
15792><A
15793NAME="AEN4126"
15794>A.252. llSetTexture</A
15795></H2
15796><DIV
15797CLASS="funcsynopsis"
15798><P
15799></P
15800><A
15801NAME="AEN4128"
15802></A
15803><P
15804><CODE
15805><CODE
15806CLASS="FUNCDEF"
15807>llSetTexture</CODE
15808>(string texture, integer face);</CODE
15809></P
15810><P
15811></P
15812></DIV
15813><P
15814>Sets the <CODE
15815CLASS="parameter"
15816>texture</CODE
15817> from object
15818 inventory of <CODE
15819CLASS="parameter"
15820>face</CODE
15821>. If face is <A
15822HREF="#AEN6073"
15823>ALL_SIDES</A
15824>, set the texture to
15825 all faces.</P
15826></DIV
15827><DIV
15828CLASS="section"
15829><HR><H2
15830CLASS="section"
15831><A
15832NAME="AEN4140"
15833>A.253. llSetTextureAnim</A
15834></H2
15835><DIV
15836CLASS="funcsynopsis"
15837><P
15838></P
15839><A
15840NAME="AEN4142"
15841></A
15842><P
15843><CODE
15844><CODE
15845CLASS="FUNCDEF"
15846>llSetTextureAnim</CODE
15847>(integer mode, integer face, integer sizex, integer sizey, float start, float length, float rate);</CODE
15848></P
15849><P
15850></P
15851></DIV
15852><P
15853>Animates a texture by setting the texture scale and
15854 offset. The mode is a mask of <A
15855HREF="#AEN5817"
15856>texture animation
15857 constants</A
15858>. You can only have one texture animation on an
15859 object, calling llSetTextureAnim more than once on an object will
15860 reset it.</P
15861><P
15862>You can only do one traditional animation, <A
15863HREF="#AEN5817"
15864>ROTATE</A
15865> or <A
15866HREF="#AEN5817"
15867>SCALE</A
15868> at a time, you
15869 cannot combine masks. In the case of <A
15870HREF="#AEN5817"
15871>ROTATE</A
15872> or <A
15873HREF="#AEN5817"
15874>SCALE</A
15875>,
15876 <CODE
15877CLASS="parameter"
15878>sizex</CODE
15879> and <CODE
15880CLASS="parameter"
15881>sizey</CODE
15882> are
15883 ignored, and <CODE
15884CLASS="parameter"
15885>start</CODE
15886> and
15887 <CODE
15888CLASS="parameter"
15889>length</CODE
15890> are used as the start and length
15891 values of the animation. For rotation,
15892 <CODE
15893CLASS="parameter"
15894>start</CODE
15895> and <CODE
15896CLASS="parameter"
15897>length</CODE
15898> are
15899 in radians.</P
15900><P
15901>The <CODE
15902CLASS="parameter"
15903>face</CODE
15904> specified which face to
15905 animate. If <CODE
15906CLASS="parameter"
15907>face</CODE
15908> is <A
15909HREF="#AEN6073"
15910>ALL_SIDES</A
15911>, all textures on the
15912 object are animated. </P
15913><P
15914>The <CODE
15915CLASS="parameter"
15916>sizex</CODE
15917> and
15918 <CODE
15919CLASS="parameter"
15920>sizey</CODE
15921> describe the layout of the frames
15922 within the texture. <CODE
15923CLASS="parameter"
15924>sizex</CODE
15925> specifies how
15926 many horizontal frames and <CODE
15927CLASS="parameter"
15928>sizey</CODE
15929> is how
15930 many vertical frames.</P
15931><P
15932><CODE
15933CLASS="parameter"
15934>start</CODE
15935> is the frame number to begin
15936 the animation on. Frames are numbered from left to right, top to
15937 bottom, starting at 0.</P
15938><P
15939><CODE
15940CLASS="parameter"
15941>length</CODE
15942> is the number of frames to
15943 animate. 0 means to animate all frames after the start
15944 frame.</P
15945><P
15946><CODE
15947CLASS="parameter"
15948>rate</CODE
15949> is the frame rate to animate
15950 at. 1.0 means 1 frame per second, 10.0 means 10
15951 frames per second, etc.</P
15952></DIV
15953><DIV
15954CLASS="section"
15955><HR><H2
15956CLASS="section"
15957><A
15958NAME="AEN4188"
15959>A.254. llSetTimerEvent</A
15960></H2
15961><DIV
15962CLASS="funcsynopsis"
15963><P
15964></P
15965><A
15966NAME="AEN4190"
15967></A
15968><P
15969><CODE
15970><CODE
15971CLASS="FUNCDEF"
15972>llSetTimerEvent</CODE
15973>(float sec);</CODE
15974></P
15975><P
15976></P
15977></DIV
15978><P
15979>Sets the <A
15980HREF="#AEN5211"
15981>timer</A
15982> event to
15983 be triggered every <CODE
15984CLASS="parameter"
15985>sec</CODE
15986> seconds. Passing in
15987 0.0 stops further <A
15988HREF="#AEN5211"
15989>timer</A
15990>
15991 events.</P
15992></DIV
15993><DIV
15994CLASS="section"
15995><HR><H2
15996CLASS="section"
15997><A
15998NAME="AEN4200"
15999>A.255. llSetTorque</A
16000></H2
16001><DIV
16002CLASS="funcsynopsis"
16003><P
16004></P
16005><A
16006NAME="AEN4202"
16007></A
16008><P
16009><CODE
16010><CODE
16011CLASS="FUNCDEF"
16012>llSetTorque</CODE
16013>(vector torque, integer local);</CODE
16014></P
16015><P
16016></P
16017></DIV
16018><P
16019>If the object is physical, this function sets the
16020 <CODE
16021CLASS="parameter"
16022>torque</CODE
16023>. The vector is in local coordinates
16024 if local is <A
16025HREF="#AEN5295"
16026>TRUE</A
16027>, global if
16028 <A
16029HREF="#AEN5295"
16030>FALSE</A
16031>.</P
16032></DIV
16033><DIV
16034CLASS="section"
16035><HR><H2
16036CLASS="section"
16037><A
16038NAME="AEN4214"
16039>A.256. llSetTouchText</A
16040></H2
16041><DIV
16042CLASS="funcsynopsis"
16043><P
16044></P
16045><A
16046NAME="AEN4216"
16047></A
16048><P
16049><CODE
16050><CODE
16051CLASS="FUNCDEF"
16052>llSetTouchText</CODE
16053>(string text);</CODE
16054></P
16055><P
16056></P
16057></DIV
16058><P
16059>Displays <CODE
16060CLASS="parameter"
16061>text</CODE
16062> in viewer pie menu that
16063 acts as a touch.</P
16064></DIV
16065><DIV
16066CLASS="section"
16067><HR><H2
16068CLASS="section"
16069><A
16070NAME="AEN4224"
16071>A.257. llSetVehicleFlags</A
16072></H2
16073><DIV
16074CLASS="funcsynopsis"
16075><P
16076></P
16077><A
16078NAME="AEN4226"
16079></A
16080><P
16081><CODE
16082><CODE
16083CLASS="FUNCDEF"
16084>llSetVehicleFlags</CODE
16085>(integer flags);</CODE
16086></P
16087><P
16088></P
16089></DIV
16090><P
16091>Sets the vehicle <CODE
16092CLASS="parameter"
16093>flags</CODE
16094> to TRUE. Valid
16095 parameters can be found in the <A
16096HREF="#AEN6231"
16097>vehicle flags constants</A
16098>
16099 section.</P
16100></DIV
16101><DIV
16102CLASS="section"
16103><HR><H2
16104CLASS="section"
16105><A
16106NAME="AEN4235"
16107>A.258. llSetVehicleFloatParam</A
16108></H2
16109><DIV
16110CLASS="funcsynopsis"
16111><P
16112></P
16113><A
16114NAME="AEN4237"
16115></A
16116><P
16117><CODE
16118><CODE
16119CLASS="FUNCDEF"
16120>llSetVehicleFloatParam</CODE
16121>(integer param_name, float param_value);</CODE
16122></P
16123><P
16124></P
16125></DIV
16126><P
16127>Sets the vehicle floating point parameter
16128 <CODE
16129CLASS="parameter"
16130>param_name</CODE
16131> to
16132 <CODE
16133CLASS="parameter"
16134>param_value</CODE
16135>. Valid parameters and their
16136 expected values can be found in the <A
16137HREF="#AEN6112"
16138>vehicle parameter
16139 constants</A
16140> section.</P
16141></DIV
16142><DIV
16143CLASS="section"
16144><HR><H2
16145CLASS="section"
16146><A
16147NAME="AEN4249"
16148>A.259. llSetVehicleType</A
16149></H2
16150><DIV
16151CLASS="funcsynopsis"
16152><P
16153></P
16154><A
16155NAME="AEN4251"
16156></A
16157><P
16158><CODE
16159><CODE
16160CLASS="FUNCDEF"
16161>llSetVehicleType</CODE
16162>(integer type);</CODE
16163></P
16164><P
16165></P
16166></DIV
16167><P
16168>Activates the vehicle action and choose vehicle
16169 <CODE
16170CLASS="parameter"
16171>type</CODE
16172>. Valid types and an explanation of
16173 their characteristics can be found in the <A
16174HREF="#AEN6288"
16175>vehicle type constants</A
16176>
16177 section.</P
16178></DIV
16179><DIV
16180CLASS="section"
16181><HR><H2
16182CLASS="section"
16183><A
16184NAME="AEN4260"
16185>A.260. llSetVehicleRotationParam</A
16186></H2
16187><DIV
16188CLASS="funcsynopsis"
16189><P
16190></P
16191><A
16192NAME="AEN4262"
16193></A
16194><P
16195><CODE
16196><CODE
16197CLASS="FUNCDEF"
16198>llSetVehicleRotationParam</CODE
16199>(integer param_name, rotation param_value);</CODE
16200></P
16201><P
16202></P
16203></DIV
16204><P
16205>Sets the vehicle rotation parameter
16206 <CODE
16207CLASS="parameter"
16208>param_name</CODE
16209> to
16210 <CODE
16211CLASS="parameter"
16212>param_value</CODE
16213>. Valid parameters can be found
16214 in the <A
16215HREF="#AEN6112"
16216>vehicle parameter
16217 constants</A
16218> section.</P
16219></DIV
16220><DIV
16221CLASS="section"
16222><HR><H2
16223CLASS="section"
16224><A
16225NAME="AEN4274"
16226>A.261. llSetVehicleVectorParam</A
16227></H2
16228><DIV
16229CLASS="funcsynopsis"
16230><P
16231></P
16232><A
16233NAME="AEN4276"
16234></A
16235><P
16236><CODE
16237><CODE
16238CLASS="FUNCDEF"
16239>llSetVehicleVectorParam</CODE
16240>(integer param_name, vector param_value);</CODE
16241></P
16242><P
16243></P
16244></DIV
16245><P
16246>Sets the vehicle vector parameter
16247 <CODE
16248CLASS="parameter"
16249>param_name</CODE
16250> to
16251 <CODE
16252CLASS="parameter"
16253>param_value</CODE
16254>. Valid parameters can be found
16255 in the <A
16256HREF="#AEN6112"
16257>vehicle parameter
16258 constants</A
16259> section.</P
16260></DIV
16261><DIV
16262CLASS="section"
16263><HR><H2
16264CLASS="section"
16265><A
16266NAME="AEN4288"
16267>A.262. llShout</A
16268></H2
16269><DIV
16270CLASS="funcsynopsis"
16271><P
16272></P
16273><A
16274NAME="AEN4290"
16275></A
16276><P
16277><CODE
16278><CODE
16279CLASS="FUNCDEF"
16280>llShout</CODE
16281>(integer channel, string text);</CODE
16282></P
16283><P
16284></P
16285></DIV
16286><P
16287>Shout <CODE
16288CLASS="parameter"
16289>text</CODE
16290> on
16291 <CODE
16292CLASS="parameter"
16293>channel</CODE
16294>. Channel 0 is the public chat
16295 channel that all avatars see as chat text. Channels 1 to
16296 2,147,483,648 are private channels that are not sent to avatars
16297 but other scripts can listen for through the <A
16298HREF="#AEN2665"
16299>llListen</A
16300> api.</P
16301></DIV
16302><DIV
16303CLASS="section"
16304><HR><H2
16305CLASS="section"
16306><A
16307NAME="AEN4302"
16308>A.263. llSin</A
16309></H2
16310><DIV
16311CLASS="funcsynopsis"
16312><P
16313></P
16314><A
16315NAME="AEN4304"
16316></A
16317><P
16318><CODE
16319><CODE
16320CLASS="FUNCDEF"
16321>float llSin</CODE
16322>(float theta);</CODE
16323></P
16324><P
16325></P
16326></DIV
16327><P
16328>Returns the sine of <CODE
16329CLASS="parameter"
16330>theta</CODE
16331> in
16332 radians.</P
16333></DIV
16334><DIV
16335CLASS="section"
16336><HR><H2
16337CLASS="section"
16338><A
16339NAME="AEN4312"
16340>A.264. llSitTarget</A
16341></H2
16342><DIV
16343CLASS="funcsynopsis"
16344><P
16345></P
16346><A
16347NAME="AEN4314"
16348></A
16349><P
16350><CODE
16351><CODE
16352CLASS="FUNCDEF"
16353>llSitTarget</CODE
16354>(vector offset, rotation rot);</CODE
16355></P
16356><P
16357></P
16358></DIV
16359><P
16360>Set the sit location for this object. If
16361 <CODE
16362CLASS="parameter"
16363>offset</CODE
16364> == <A
16365HREF="#AEN6080"
16366>ZERO_VECTOR</A
16367>
16368 clear the sit target.</P
16369></DIV
16370><DIV
16371CLASS="section"
16372><HR><H2
16373CLASS="section"
16374><A
16375NAME="AEN4325"
16376>A.265. llSleep</A
16377></H2
16378><DIV
16379CLASS="funcsynopsis"
16380><P
16381></P
16382><A
16383NAME="AEN4327"
16384></A
16385><P
16386><CODE
16387><CODE
16388CLASS="FUNCDEF"
16389>llSleep</CODE
16390>(float sec);</CODE
16391></P
16392><P
16393></P
16394></DIV
16395><P
16396>Puts the script to sleep for <CODE
16397CLASS="parameter"
16398>sec</CODE
16399>
16400 seconds.</P
16401></DIV
16402><DIV
16403CLASS="section"
16404><HR><H2
16405CLASS="section"
16406><A
16407NAME="AEN4335"
16408>A.266. llSqrt</A
16409></H2
16410><DIV
16411CLASS="funcsynopsis"
16412><P
16413></P
16414><A
16415NAME="AEN4337"
16416></A
16417><P
16418><CODE
16419><CODE
16420CLASS="FUNCDEF"
16421>float llSqrt</CODE
16422>(float val);</CODE
16423></P
16424><P
16425></P
16426></DIV
16427><P
16428>Returns the square root of <CODE
16429CLASS="parameter"
16430>val</CODE
16431>. If
16432 <CODE
16433CLASS="parameter"
16434>val</CODE
16435> is less than 0.0, this function returns
16436 0.0 and raises a math runtime error.</P
16437></DIV
16438><DIV
16439CLASS="section"
16440><HR><H2
16441CLASS="section"
16442><A
16443NAME="AEN4346"
16444>A.267. llStartAnimation</A
16445></H2
16446><DIV
16447CLASS="funcsynopsis"
16448><P
16449></P
16450><A
16451NAME="AEN4348"
16452></A
16453><P
16454><CODE
16455><CODE
16456CLASS="FUNCDEF"
16457>llStartAnimation</CODE
16458>(string anim);</CODE
16459></P
16460><P
16461></P
16462></DIV
16463><P
16464>This function starts animation <CODE
16465CLASS="parameter"
16466>anim</CODE
16467>
16468 for the avatar that owns the object.</P
16469><P
16470></P
16471><DIV
16472CLASS="variablelist"
16473><P
16474><B
16475>Valid strings for <CODE
16476CLASS="parameter"
16477>anim</CODE
16478></B
16479></P
16480><DL
16481><DT
16482>hold_R_bazooka, hold_R_handgun, hold_R_rifle</DT
16483><DD
16484><P
16485>Holds the appropriately shaped weapon in the
16486 right hand. Automatically switches to the aims (below) when
16487 user enters mouse look</P
16488></DD
16489><DT
16490>aim_R_bazooka, aim_R_handgun, aim_R_rifle</DT
16491><DD
16492><P
16493>Aims the appropriately shaped weapon along the
16494 direction the avatar is looking.</P
16495></DD
16496><DT
16497>away</DT
16498><DD
16499><P
16500>Flops over in "away from keyboard"
16501 state.</P
16502></DD
16503><DT
16504>backflip</DT
16505><DD
16506><P
16507>Performs a backflip.</P
16508></DD
16509><DT
16510>bow</DT
16511><DD
16512><P
16513>Bows at waist.</P
16514></DD
16515><DT
16516>brush</DT
16517><DD
16518><P
16519>Brushes dirt from shirt.</P
16520></DD
16521><DT
16522>clap</DT
16523><DD
16524><P
16525>Applauds.</P
16526></DD
16527><DT
16528>courtbow</DT
16529><DD
16530><P
16531>Bows with a courtly flourish.</P
16532></DD
16533><DT
16534>crouch</DT
16535><DD
16536><P
16537>Crouches in place.</P
16538></DD
16539><DT
16540>crouchwalk</DT
16541><DD
16542><P
16543>Walks in place while crouching.</P
16544></DD
16545><DT
16546>dance1, dance2, dance3, dance4, dance5, dance6, dance7, dance8</DT
16547><DD
16548><P
16549>Various dance maneuvers.</P
16550></DD
16551><DT
16552>falldown</DT
16553><DD
16554><P
16555>Freefall falling animation.</P
16556></DD
16557><DT
16558>female_walk</DT
16559><DD
16560><P
16561>Walks with hip sway.</P
16562></DD
16563><DT
16564>fly</DT
16565><DD
16566><P
16567>Flies forward.</P
16568></DD
16569><DT
16570>flyslow</DT
16571><DD
16572><P
16573>Flies forward at a less aggressive
16574 angle.</P
16575></DD
16576><DT
16577>hello</DT
16578><DD
16579><P
16580>Waves.</P
16581></DD
16582><DT
16583>hold_throw_R</DT
16584><DD
16585><P
16586>Hold object in right hand, prepared to throw
16587 it.</P
16588></DD
16589><DT
16590>hover</DT
16591><DD
16592><P
16593>Hovers in place.</P
16594></DD
16595><DT
16596>hover_down</DT
16597><DD
16598><P
16599>Pretends to hover straight
16600 down.</P
16601></DD
16602><DT
16603>hover_up</DT
16604><DD
16605><P
16606>Pretends to hover straight
16607 up.</P
16608></DD
16609><DT
16610>jump</DT
16611><DD
16612><P
16613>Midair jump position.</P
16614></DD
16615><DT
16616>kick_roundhouse_R</DT
16617><DD
16618><P
16619>Roundhouse kick with right
16620 leg.</P
16621></DD
16622><DT
16623>land</DT
16624><DD
16625><P
16626>Lands after flying.</P
16627></DD
16628><DT
16629>prejump</DT
16630><DD
16631><P
16632>Prepares to jump.</P
16633></DD
16634><DT
16635>punch_L</DT
16636><DD
16637><P
16638>Punch with left hand.</P
16639></DD
16640><DT
16641>punch_R</DT
16642><DD
16643><P
16644>Punch with right hand.</P
16645></DD
16646><DT
16647>punch_onetwo</DT
16648><DD
16649><P
16650>Punch with one hand then the
16651 other.</P
16652></DD
16653><DT
16654>run</DT
16655><DD
16656><P
16657>Runs in place.</P
16658></DD
16659><DT
16660>salute</DT
16661><DD
16662><P
16663>Salutes with right hand.</P
16664></DD
16665><DT
16666>sit</DT
16667><DD
16668><P
16669>Sits on object at knee
16670 height.</P
16671></DD
16672><DT
16673>sit_ground</DT
16674><DD
16675><P
16676>Sits down on ground.</P
16677></DD
16678><DT
16679>slowwalk</DT
16680><DD
16681><P
16682>Walks in place slowly.</P
16683></DD
16684><DT
16685>smoke_idle</DT
16686><DD
16687><P
16688>Leans on imaginary prop while holding
16689 cigarette.</P
16690></DD
16691><DT
16692>smoke_inhale</DT
16693><DD
16694><P
16695>Leans on imaginary prop and smokes a
16696 cigarette.</P
16697></DD
16698><DT
16699>smoke_throw_down</DT
16700><DD
16701><P
16702>Leans on imaginary prop, throws down a
16703 cigarette, and stamps it out.</P
16704></DD
16705><DT
16706>snapshot</DT
16707><DD
16708><P
16709>Pantomimes taking a picture.</P
16710></DD
16711><DT
16712>soft_land</DT
16713><DD
16714><P
16715>Stumbles a bit as if
16716 landing.</P
16717></DD
16718><DT
16719>stand</DT
16720><DD
16721><P
16722>Stands in place.</P
16723></DD
16724><DT
16725>standup</DT
16726><DD
16727><P
16728>Falls on face and stands up.</P
16729></DD
16730><DT
16731>stride</DT
16732><DD
16733><P
16734>Legs extended as if stepping off of a
16735 ledge.</P
16736></DD
16737><DT
16738>sword_strike_R</DT
16739><DD
16740><P
16741>Strike with sword in right
16742 hand.</P
16743></DD
16744><DT
16745>talk</DT
16746><DD
16747><P
16748>Head moves as if talking.</P
16749></DD
16750><DT
16751>throw_R</DT
16752><DD
16753><P
16754>Throws object in right hand.</P
16755></DD
16756><DT
16757>tryon_shirt</DT
16758><DD
16759><P
16760>Turns around and models a new
16761 shirt.</P
16762></DD
16763><DT
16764>turnleft</DT
16765><DD
16766><P
16767>Pretends to turn left.</P
16768></DD
16769><DT
16770>turnright</DT
16771><DD
16772><P
16773>Pretends to turn right.</P
16774></DD
16775><DT
16776>type</DT
16777><DD
16778><P
16779>Makes typing motion.</P
16780></DD
16781><DT
16782>uphillwalk</DT
16783><DD
16784><P
16785>Walks uphill in place.</P
16786></DD
16787><DT
16788>walk</DT
16789><DD
16790><P
16791>Walks in place.</P
16792></DD
16793><DT
16794>whisper</DT
16795><DD
16796><P
16797>Whispers behind hand.</P
16798></DD
16799><DT
16800>whistle</DT
16801><DD
16802><P
16803>Whistles with hands in
16804 mouth.</P
16805></DD
16806><DT
16807>yell</DT
16808><DD
16809><P
16810>Shouts between cupped hands.</P
16811></DD
16812></DL
16813></DIV
16814></DIV
16815><DIV
16816CLASS="section"
16817><HR><H2
16818CLASS="section"
16819><A
16820NAME="AEN4578"
16821>A.268. llStopAnimation</A
16822></H2
16823><DIV
16824CLASS="funcsynopsis"
16825><P
16826></P
16827><A
16828NAME="AEN4580"
16829></A
16830><P
16831><CODE
16832><CODE
16833CLASS="FUNCDEF"
16834>llStopAnimation</CODE
16835>(string anim);</CODE
16836></P
16837><P
16838></P
16839></DIV
16840><P
16841>Stop animation <CODE
16842CLASS="parameter"
16843>anim</CODE
16844> for avatar that
16845 owns object.</P
16846></DIV
16847><DIV
16848CLASS="section"
16849><HR><H2
16850CLASS="section"
16851><A
16852NAME="AEN4588"
16853>A.269. llStopHover</A
16854></H2
16855><DIV
16856CLASS="funcsynopsis"
16857><P
16858></P
16859><A
16860NAME="AEN4590"
16861></A
16862><P
16863><CODE
16864><CODE
16865CLASS="FUNCDEF"
16866>llStopHover</CODE
16867>(void);</CODE
16868></P
16869><P
16870></P
16871></DIV
16872><P
16873>Stop hover to a height.</P
16874></DIV
16875><DIV
16876CLASS="section"
16877><HR><H2
16878CLASS="section"
16879><A
16880NAME="AEN4596"
16881>A.270. llStopLookAt</A
16882></H2
16883><DIV
16884CLASS="funcsynopsis"
16885><P
16886></P
16887><A
16888NAME="AEN4598"
16889></A
16890><P
16891><CODE
16892><CODE
16893CLASS="FUNCDEF"
16894>llStopLookAt</CODE
16895>(void);</CODE
16896></P
16897><P
16898></P
16899></DIV
16900><P
16901>Stop causing object to look at target.</P
16902></DIV
16903><DIV
16904CLASS="section"
16905><HR><H2
16906CLASS="section"
16907><A
16908NAME="AEN4604"
16909>A.271. llStopMoveToTarget</A
16910></H2
16911><DIV
16912CLASS="funcsynopsis"
16913><P
16914></P
16915><A
16916NAME="AEN4606"
16917></A
16918><P
16919><CODE
16920><CODE
16921CLASS="FUNCDEF"
16922>llStopMoveToTarget</CODE
16923>(void);</CODE
16924></P
16925><P
16926></P
16927></DIV
16928><P
16929>Stops critically damped motion.</P
16930></DIV
16931><DIV
16932CLASS="section"
16933><HR><H2
16934CLASS="section"
16935><A
16936NAME="AEN4612"
16937>A.272. llStopPointAt</A
16938></H2
16939><DIV
16940CLASS="funcsynopsis"
16941><P
16942></P
16943><A
16944NAME="AEN4614"
16945></A
16946><P
16947><CODE
16948><CODE
16949CLASS="FUNCDEF"
16950>llStopPointAt</CODE
16951>(void);</CODE
16952></P
16953><P
16954></P
16955></DIV
16956><P
16957>Stop avatar that owns object pointing.</P
16958></DIV
16959><DIV
16960CLASS="section"
16961><HR><H2
16962CLASS="section"
16963><A
16964NAME="AEN4620"
16965>A.273. llStopSound</A
16966></H2
16967><DIV
16968CLASS="funcsynopsis"
16969><P
16970></P
16971><A
16972NAME="AEN4622"
16973></A
16974><P
16975><CODE
16976><CODE
16977CLASS="FUNCDEF"
16978>llStopSound</CODE
16979>(void);</CODE
16980></P
16981><P
16982></P
16983></DIV
16984><P
16985>Stops a currently playing attached sound started with <A
16986HREF="#AEN3184"
16987>llPlaySound</A
16988> or <A
16989HREF="#AEN2773"
16990>llLoopSound</A
16991>. Has no effect on
16992 sounds started with <A
16993HREF="#AEN4756"
16994>llTriggerSound</A
16995>.</P
16996></DIV
16997><DIV
16998CLASS="section"
16999><HR><H2
17000CLASS="section"
17001><A
17002NAME="AEN4631"
17003>A.274. llStringLength</A
17004></H2
17005><DIV
17006CLASS="funcsynopsis"
17007><P
17008></P
17009><A
17010NAME="AEN4633"
17011></A
17012><P
17013><CODE
17014><CODE
17015CLASS="FUNCDEF"
17016>integer llStringLength</CODE
17017>(string src);</CODE
17018></P
17019><P
17020></P
17021></DIV
17022><P
17023>Returns the number of characters in
17024 <CODE
17025CLASS="parameter"
17026>src</CODE
17027>.</P
17028></DIV
17029><DIV
17030CLASS="section"
17031><HR><H2
17032CLASS="section"
17033><A
17034NAME="AEN4641"
17035>A.275. llSubStringIndex</A
17036></H2
17037><DIV
17038CLASS="funcsynopsis"
17039><P
17040></P
17041><A
17042NAME="AEN4643"
17043></A
17044><P
17045><CODE
17046><CODE
17047CLASS="FUNCDEF"
17048>integer llSubStringIndex</CODE
17049>(string source, string pattern);</CODE
17050></P
17051><P
17052></P
17053></DIV
17054><P
17055>Finds index in source where pattern first appears. Returns
17056 -1 if no match is found.</P
17057></DIV
17058><DIV
17059CLASS="section"
17060><HR><H2
17061CLASS="section"
17062><A
17063NAME="AEN4652"
17064>A.276. llStringToBase64</A
17065></H2
17066><DIV
17067CLASS="funcsynopsis"
17068><P
17069></P
17070><A
17071NAME="AEN4654"
17072></A
17073><P
17074><CODE
17075><CODE
17076CLASS="FUNCDEF"
17077>string llStringToBase64</CODE
17078>(string str);</CODE
17079></P
17080><P
17081></P
17082></DIV
17083><P
17084>Converts a string to the Base 64 representation of the string.</P
17085></DIV
17086><DIV
17087CLASS="section"
17088><HR><H2
17089CLASS="section"
17090><A
17091NAME="AEN4661"
17092>A.277. llTakeControls</A
17093></H2
17094><DIV
17095CLASS="funcsynopsis"
17096><P
17097></P
17098><A
17099NAME="AEN4663"
17100></A
17101><P
17102><CODE
17103><CODE
17104CLASS="FUNCDEF"
17105>llTakeControls</CODE
17106>(integer controls, integer accept, integer pass_on);</CODE
17107></P
17108><P
17109></P
17110></DIV
17111><P
17112>If (<CODE
17113CLASS="parameter"
17114>accept</CODE
17115> ==
17116 (<CODE
17117CLASS="parameter"
17118>controls</CODE
17119> &#38; input)), send input to
17120 object. If the boolean <CODE
17121CLASS="parameter"
17122>pass_on</CODE
17123> is <A
17124HREF="#AEN5295"
17125>TRUE</A
17126>, also send input to
17127 avatar.</P
17128></DIV
17129><DIV
17130CLASS="section"
17131><HR><H2
17132CLASS="section"
17133><A
17134NAME="AEN4678"
17135>A.278. llTan</A
17136></H2
17137><DIV
17138CLASS="funcsynopsis"
17139><P
17140></P
17141><A
17142NAME="AEN4680"
17143></A
17144><P
17145><CODE
17146><CODE
17147CLASS="FUNCDEF"
17148>float llTan</CODE
17149>(float theta);</CODE
17150></P
17151><P
17152></P
17153></DIV
17154><P
17155>Returns the tangent of <CODE
17156CLASS="parameter"
17157>theta</CODE
17158>
17159 radians.</P
17160></DIV
17161><DIV
17162CLASS="section"
17163><HR><H2
17164CLASS="section"
17165><A
17166NAME="AEN4688"
17167>A.279. llTarget</A
17168></H2
17169><DIV
17170CLASS="funcsynopsis"
17171><P
17172></P
17173><A
17174NAME="AEN4690"
17175></A
17176><P
17177><CODE
17178><CODE
17179CLASS="FUNCDEF"
17180>integer llTarget</CODE
17181>(vector position, float range);</CODE
17182></P
17183><P
17184></P
17185></DIV
17186><P
17187>Set object position within <CODE
17188CLASS="parameter"
17189>range</CODE
17190> of
17191 <CODE
17192CLASS="parameter"
17193>position</CODE
17194> as a target and returns an integer
17195 ID for the target.</P
17196></DIV
17197><DIV
17198CLASS="section"
17199><HR><H2
17200CLASS="section"
17201><A
17202NAME="AEN4701"
17203>A.280. llTargetOmega</A
17204></H2
17205><DIV
17206CLASS="funcsynopsis"
17207><P
17208></P
17209><A
17210NAME="AEN4703"
17211></A
17212><P
17213><CODE
17214><CODE
17215CLASS="FUNCDEF"
17216>llTargetOmega</CODE
17217>(vector axis, float spinrate, float gain);</CODE
17218></P
17219><P
17220></P
17221></DIV
17222><P
17223>Attempt to spin at <CODE
17224CLASS="parameter"
17225>spinrate</CODE
17226> with
17227 strength <CODE
17228CLASS="parameter"
17229>gain</CODE
17230> on
17231 <CODE
17232CLASS="parameter"
17233>axis</CODE
17234>. A <CODE
17235CLASS="parameter"
17236>spinrate</CODE
17237> of
17238 0.0 cancels the spin. This function works in object local
17239 coordinates for child objects and works in world coordinates for
17240 root objects.</P
17241></DIV
17242><DIV
17243CLASS="section"
17244><HR><H2
17245CLASS="section"
17246><A
17247NAME="AEN4718"
17248>A.281. llTargetRemove</A
17249></H2
17250><DIV
17251CLASS="funcsynopsis"
17252><P
17253></P
17254><A
17255NAME="AEN4720"
17256></A
17257><P
17258><CODE
17259><CODE
17260CLASS="FUNCDEF"
17261>llTargetRemove</CODE
17262>(integer tnumber);</CODE
17263></P
17264><P
17265></P
17266></DIV
17267><P
17268>Remove target number <CODE
17269CLASS="parameter"
17270>tnumber</CODE
17271>.</P
17272></DIV
17273><DIV
17274CLASS="section"
17275><HR><H2
17276CLASS="section"
17277><A
17278NAME="AEN4728"
17279>A.282. llTeleportAgentHome</A
17280></H2
17281><DIV
17282CLASS="funcsynopsis"
17283><P
17284></P
17285><A
17286NAME="AEN4730"
17287></A
17288><P
17289><CODE
17290><CODE
17291CLASS="FUNCDEF"
17292>llTeleportAgentHome</CODE
17293>(key id);</CODE
17294></P
17295><P
17296></P
17297></DIV
17298><P
17299>Teleport agent on the owner's land to agent's home
17300 location.</P
17301></DIV
17302><DIV
17303CLASS="section"
17304><HR><H2
17305CLASS="section"
17306><A
17307NAME="AEN4737"
17308>A.283. llToLower</A
17309></H2
17310><DIV
17311CLASS="funcsynopsis"
17312><P
17313></P
17314><A
17315NAME="AEN4739"
17316></A
17317><P
17318><CODE
17319><CODE
17320CLASS="FUNCDEF"
17321>llToLower</CODE
17322>();</CODE
17323></P
17324><P
17325></P
17326></DIV
17327><P
17328></P
17329></DIV
17330><DIV
17331CLASS="section"
17332><HR><H2
17333CLASS="section"
17334><A
17335NAME="AEN4746"
17336>A.284. llToUpper</A
17337></H2
17338><DIV
17339CLASS="funcsynopsis"
17340><P
17341></P
17342><A
17343NAME="AEN4748"
17344></A
17345><P
17346><CODE
17347><CODE
17348CLASS="FUNCDEF"
17349>string llToUpper</CODE
17350>(string src);</CODE
17351></P
17352><P
17353></P
17354></DIV
17355><P
17356>Returns <CODE
17357CLASS="parameter"
17358>src</CODE
17359> in all lower case.</P
17360></DIV
17361><DIV
17362CLASS="section"
17363><HR><H2
17364CLASS="section"
17365><A
17366NAME="AEN4756"
17367>A.285. llTriggerSound</A
17368></H2
17369><DIV
17370CLASS="funcsynopsis"
17371><P
17372></P
17373><A
17374NAME="AEN4758"
17375></A
17376><P
17377><CODE
17378><CODE
17379CLASS="FUNCDEF"
17380>llTriggerSound</CODE
17381>(string sound, float volume);</CODE
17382></P
17383><P
17384></P
17385></DIV
17386><P
17387>Plays a transient sound NOT attached to an object. The sound
17388 plays from a stationary position located at the center of the
17389 object at the time of the trigger. There is no limit to the number
17390 of triggered sounds which can be generated by an object, and
17391 calling <A
17392HREF="#AEN4756"
17393>llTriggerSound</A
17394>
17395 does not affect the attached sounds created by <A
17396HREF="#AEN3184"
17397>llPlaySound</A
17398> and <A
17399HREF="#AEN2773"
17400>llLoopSound</A
17401>. This is very useful
17402 for things like collision noises, explosions, etc. There is no
17403 way to stop or alter the volume of a sound triggered by
17404 this function.</P
17405></DIV
17406><DIV
17407CLASS="section"
17408><HR><H2
17409CLASS="section"
17410><A
17411NAME="AEN4770"
17412>A.286. llTriggerSoundLimited</A
17413></H2
17414><DIV
17415CLASS="funcsynopsis"
17416><P
17417></P
17418><A
17419NAME="AEN4772"
17420></A
17421><P
17422><CODE
17423><CODE
17424CLASS="FUNCDEF"
17425>llTriggerSoundLimited</CODE
17426>(string sound, float volume, vector tne, vector bsw);</CODE
17427></P
17428><P
17429></P
17430></DIV
17431><P
17432>Plays a transient sound NOT attached to an object with its
17433 audible range limited by the axis aligned bounding box define by
17434 <CODE
17435CLASS="parameter"
17436>tne</CODE
17437> (top-north-eash) and
17438 <CODE
17439CLASS="parameter"
17440>bsw</CODE
17441> (bottom-south-west). The sound plays
17442 from a stationary position located at the center of the object at
17443 the time of the trigger. There is no limit to the number of
17444 triggered sounds which can be generated by an object, and calling
17445 <A
17446HREF="#AEN4756"
17447>llTriggerSound</A
17448> does not
17449 affect the attached sounds created by <A
17450HREF="#AEN3184"
17451>llPlaySound</A
17452> and <A
17453HREF="#AEN2773"
17454>llLoopSound</A
17455>. This is very useful
17456 for things like collision noises, explosions, etc. There is no way
17457 to stop or alter the volume of a sound triggered by this
17458 function.</P
17459></DIV
17460><DIV
17461CLASS="section"
17462><HR><H2
17463CLASS="section"
17464><A
17465NAME="AEN4790"
17466>A.287. llUnescapeURL</A
17467></H2
17468><DIV
17469CLASS="funcsynopsis"
17470><P
17471></P
17472><A
17473NAME="AEN4792"
17474></A
17475><P
17476><CODE
17477><CODE
17478CLASS="FUNCDEF"
17479>string llUnescapeURL</CODE
17480>(string url);</CODE
17481></P
17482><P
17483></P
17484></DIV
17485><P
17486>Returns the string that is the URL unescaped version of <CODE
17487CLASS="parameter"
17488>url</CODE
17489>,
17490 replacing %20 with spaces etc.</P
17491></DIV
17492><DIV
17493CLASS="section"
17494><HR><H2
17495CLASS="section"
17496><A
17497NAME="AEN4800"
17498>A.288. llUnSit</A
17499></H2
17500><DIV
17501CLASS="funcsynopsis"
17502><P
17503></P
17504><A
17505NAME="AEN4802"
17506></A
17507><P
17508><CODE
17509><CODE
17510CLASS="FUNCDEF"
17511>llUnSit</CODE
17512>(key id);</CODE
17513></P
17514><P
17515></P
17516></DIV
17517><P
17518>If agent identified by <CODE
17519CLASS="parameter"
17520>id</CODE
17521> is sitting
17522 on the object the script is attached to or is over land owned by
17523 the objects owner, the agent is forced to stand up.</P
17524></DIV
17525><DIV
17526CLASS="section"
17527><HR><H2
17528CLASS="section"
17529><A
17530NAME="AEN4810"
17531>A.289. llVecDist</A
17532></H2
17533><DIV
17534CLASS="funcsynopsis"
17535><P
17536></P
17537><A
17538NAME="AEN4812"
17539></A
17540><P
17541><CODE
17542><CODE
17543CLASS="FUNCDEF"
17544>float llVecDist</CODE
17545>(vector a, vector b);</CODE
17546></P
17547><P
17548></P
17549></DIV
17550><P
17551>Returns the distance from <CODE
17552CLASS="parameter"
17553>a</CODE
17554> to
17555 <CODE
17556CLASS="parameter"
17557>b</CODE
17558></P
17559></DIV
17560><DIV
17561CLASS="section"
17562><HR><H2
17563CLASS="section"
17564><A
17565NAME="AEN4823"
17566>A.290. llVecMag</A
17567></H2
17568><DIV
17569CLASS="funcsynopsis"
17570><P
17571></P
17572><A
17573NAME="AEN4825"
17574></A
17575><P
17576><CODE
17577><CODE
17578CLASS="FUNCDEF"
17579>float llVecMag</CODE
17580>(vector vec);</CODE
17581></P
17582><P
17583></P
17584></DIV
17585><P
17586>Returns the magnitude of <CODE
17587CLASS="parameter"
17588>vec</CODE
17589>.</P
17590></DIV
17591><DIV
17592CLASS="section"
17593><HR><H2
17594CLASS="section"
17595><A
17596NAME="AEN4833"
17597>A.291. llVecNorm</A
17598></H2
17599><DIV
17600CLASS="funcsynopsis"
17601><P
17602></P
17603><A
17604NAME="AEN4835"
17605></A
17606><P
17607><CODE
17608><CODE
17609CLASS="FUNCDEF"
17610>vector llVecNorm</CODE
17611>(vector vec);</CODE
17612></P
17613><P
17614></P
17615></DIV
17616><P
17617>Returns normalized <CODE
17618CLASS="parameter"
17619>vec</CODE
17620>.</P
17621></DIV
17622><DIV
17623CLASS="section"
17624><HR><H2
17625CLASS="section"
17626><A
17627NAME="AEN4843"
17628>A.292. llVolumeDetect</A
17629></H2
17630><DIV
17631CLASS="funcsynopsis"
17632><P
17633></P
17634><A
17635NAME="AEN4845"
17636></A
17637><P
17638><CODE
17639><CODE
17640CLASS="FUNCDEF"
17641>llVolumeDetect</CODE
17642>(integer detect);</CODE
17643></P
17644><P
17645></P
17646></DIV
17647><P
17648>When detect = TRUE, this makes the entire link set the script is attached to phantom but if another object interpenetrates it, it will get a collision_start event. When an object stops interpenetrating, a collision_end event is generated. While the other is interpenetrating, collision events are NOT generated. The script must be applied to the root object of the link set to get the collision events. Collision filters work normally.</P
17649></DIV
17650><DIV
17651CLASS="section"
17652><HR><H2
17653CLASS="section"
17654><A
17655NAME="AEN4852"
17656>A.293. llWater</A
17657></H2
17658><DIV
17659CLASS="funcsynopsis"
17660><P
17661></P
17662><A
17663NAME="AEN4854"
17664></A
17665><P
17666><CODE
17667><CODE
17668CLASS="FUNCDEF"
17669>float llWater</CODE
17670>(vector offset);</CODE
17671></P
17672><P
17673></P
17674></DIV
17675><P
17676>Returns the water height at the object position +
17677 <CODE
17678CLASS="parameter"
17679>offset</CODE
17680>.</P
17681></DIV
17682><DIV
17683CLASS="section"
17684><HR><H2
17685CLASS="section"
17686><A
17687NAME="AEN4862"
17688>A.294. llWhisper</A
17689></H2
17690><DIV
17691CLASS="funcsynopsis"
17692><P
17693></P
17694><A
17695NAME="AEN4864"
17696></A
17697><P
17698><CODE
17699><CODE
17700CLASS="FUNCDEF"
17701>llWhisper</CODE
17702>(integer channel, string text);</CODE
17703></P
17704><P
17705></P
17706></DIV
17707><P
17708>Whisper <CODE
17709CLASS="parameter"
17710>text</CODE
17711> on
17712 <CODE
17713CLASS="parameter"
17714>channel</CODE
17715>. Channel 0 is the public chat
17716 channel that all avatars see as chat text. Channels 1 to
17717 2,147,483,648 are private channels that are not sent to avatars
17718 but other scripts can listen for through the <A
17719HREF="#AEN2665"
17720>llListen</A
17721> api.</P
17722></DIV
17723><DIV
17724CLASS="section"
17725><HR><H2
17726CLASS="section"
17727><A
17728NAME="AEN4876"
17729>A.295. llWind</A
17730></H2
17731><DIV
17732CLASS="funcsynopsis"
17733><P
17734></P
17735><A
17736NAME="AEN4878"
17737></A
17738><P
17739><CODE
17740><CODE
17741CLASS="FUNCDEF"
17742>vector llWind</CODE
17743>(vector offset);</CODE
17744></P
17745><P
17746></P
17747></DIV
17748><P
17749>Returns the wind velocity below the object position +
17750 <CODE
17751CLASS="parameter"
17752>offset</CODE
17753>.</P
17754></DIV
17755><DIV
17756CLASS="section"
17757><HR><H2
17758CLASS="section"
17759><A
17760NAME="AEN4886"
17761>A.296. llXorBase64Strings</A
17762></H2
17763><DIV
17764CLASS="funcsynopsis"
17765><P
17766></P
17767><A
17768NAME="AEN4888"
17769></A
17770><P
17771><CODE
17772><CODE
17773CLASS="FUNCDEF"
17774>string llXorBase64Strings</CODE
17775>(string s1, string s2);</CODE
17776></P
17777><P
17778></P
17779></DIV
17780><P
17781>Performs an exclusive or on two Base 64 strings and returns
17782 a Base 64 string. The <CODE
17783CLASS="parameter"
17784>s2</CODE
17785> parameter repeats if
17786 it is shorter than <CODE
17787CLASS="parameter"
17788>s1</CODE
17789>.</P
17790></DIV
17791></DIV
17792><DIV
17793CLASS="appendix"
17794><HR><H1
17795><A
17796NAME="AEN4899"
17797></A
17798>Appendix B. Events</H1
17799><P
17800>Every state must have at least one handler. You can choose to
17801 handle an event by defining one of the reserved event
17802 handlers named here.</P
17803><DIV
17804CLASS="section"
17805><HR><H2
17806CLASS="section"
17807><A
17808NAME="AEN4902"
17809>B.1. at_rot_target</A
17810></H2
17811><DIV
17812CLASS="funcsynopsis"
17813><P
17814></P
17815><A
17816NAME="AEN4904"
17817></A
17818><P
17819><CODE
17820><CODE
17821CLASS="FUNCDEF"
17822>at_rot_target</CODE
17823>(integer number, rotation target_rotation, rotation our_rotation);</CODE
17824></P
17825><P
17826></P
17827></DIV
17828><P
17829>This event is triggered when a script comes within a defined
17830 angle of a target rotation. The range is set by a call to <A
17831HREF="#AEN3579"
17832>llRotTarget</A
17833>.</P
17834></DIV
17835><DIV
17836CLASS="section"
17837><HR><H2
17838CLASS="section"
17839><A
17840NAME="AEN4916"
17841>B.2. at_target</A
17842></H2
17843><DIV
17844CLASS="funcsynopsis"
17845><P
17846></P
17847><A
17848NAME="AEN4918"
17849></A
17850><P
17851><CODE
17852><CODE
17853CLASS="FUNCDEF"
17854>not_at_target</CODE
17855>(integer number, vector target_position, vector our_position);</CODE
17856></P
17857><P
17858></P
17859></DIV
17860><P
17861>This event is triggered when a script comes within a defined
17862 range from a target position. The range and position are set by a
17863 call to <A
17864HREF="#AEN4688"
17865>llTarget</A
17866>.</P
17867></DIV
17868><DIV
17869CLASS="section"
17870><HR><H2
17871CLASS="section"
17872><A
17873NAME="AEN4930"
17874>B.3. attach</A
17875></H2
17876><DIV
17877CLASS="funcsynopsis"
17878><P
17879></P
17880><A
17881NAME="AEN4932"
17882></A
17883><P
17884><CODE
17885><CODE
17886CLASS="FUNCDEF"
17887>attach</CODE
17888>(key attached);</CODE
17889></P
17890><P
17891></P
17892></DIV
17893><P
17894>This event is triggered whenever a object with this script
17895 is attached or detached from an avatar. If it is attached,
17896 attached is the key of the avatar it is attached to, otherwise
17897 attached is <A
17898HREF="#AEN6070"
17899>NULL_KEY</A
17900>.</P
17901></DIV
17902><DIV
17903CLASS="section"
17904><HR><H2
17905CLASS="section"
17906><A
17907NAME="AEN4940"
17908>B.4. changed</A
17909></H2
17910><DIV
17911CLASS="funcsynopsis"
17912><P
17913></P
17914><A
17915NAME="AEN4942"
17916></A
17917><P
17918><CODE
17919><CODE
17920CLASS="FUNCDEF"
17921>changed</CODE
17922>(integer changed);</CODE
17923></P
17924><P
17925></P
17926></DIV
17927><P
17928>Triggered when various events change the object. The
17929 <CODE
17930CLASS="parameter"
17931>changed</CODE
17932> will be a bitfield of <A
17933HREF="#AEN5690"
17934>change constants</A
17935>.</P
17936></DIV
17937><DIV
17938CLASS="section"
17939><HR><H2
17940CLASS="section"
17941><A
17942NAME="AEN4951"
17943>B.5. collision</A
17944></H2
17945><DIV
17946CLASS="funcsynopsis"
17947><P
17948></P
17949><A
17950NAME="AEN4953"
17951></A
17952><P
17953><CODE
17954><CODE
17955CLASS="FUNCDEF"
17956>collision</CODE
17957>(integer total_number);</CODE
17958></P
17959><P
17960></P
17961></DIV
17962><P
17963>This event is raised while another object is colliding with
17964 the object the script is attached to. The number of detected
17965 objects is passed to the script. Information on those objects may
17966 be gathered via the <A
17967HREF="#lib_lldetected"
17968>llDetected*</A
17969> library
17970 functions. (Collisions are also generated if a user walks into an
17971 object.)</P
17972></DIV
17973><DIV
17974CLASS="section"
17975><HR><H2
17976CLASS="section"
17977><A
17978NAME="AEN4961"
17979>B.6. collision_end</A
17980></H2
17981><DIV
17982CLASS="funcsynopsis"
17983><P
17984></P
17985><A
17986NAME="AEN4963"
17987></A
17988><P
17989><CODE
17990><CODE
17991CLASS="FUNCDEF"
17992>collision_end</CODE
17993>(integer total_number);</CODE
17994></P
17995><P
17996></P
17997></DIV
17998><P
17999>This event is raised when another object stops colliding
18000 with the object the script is attached to. The number of detected
18001 objects is passed to the script. Information on those objects may
18002 be gathered via the <A
18003HREF="#lib_lldetected"
18004>llDetected*</A
18005> library
18006 functions. (Collisions are also generated if a user walks into an
18007 object.)</P
18008></DIV
18009><DIV
18010CLASS="section"
18011><HR><H2
18012CLASS="section"
18013><A
18014NAME="AEN4971"
18015>B.7. collision_start</A
18016></H2
18017><DIV
18018CLASS="funcsynopsis"
18019><P
18020></P
18021><A
18022NAME="AEN4973"
18023></A
18024><P
18025><CODE
18026><CODE
18027CLASS="FUNCDEF"
18028>collision_start</CODE
18029>(integer total_number);</CODE
18030></P
18031><P
18032></P
18033></DIV
18034><P
18035>This event is raised when another object begins to collide
18036 with the object the script is attached to. The number of detected
18037 objects is passed to the script. Information on those objects may
18038 be gathered via the <A
18039HREF="#lib_lldetected"
18040>llDetected*</A
18041> library
18042 functions. (Collisions are also generated if a user walks into an
18043 object.)</P
18044></DIV
18045><DIV
18046CLASS="section"
18047><HR><H2
18048CLASS="section"
18049><A
18050NAME="AEN4981"
18051>B.8. control</A
18052></H2
18053><DIV
18054CLASS="funcsynopsis"
18055><P
18056></P
18057><A
18058NAME="AEN4983"
18059></A
18060><P
18061><CODE
18062><CODE
18063CLASS="FUNCDEF"
18064>control</CODE
18065>(key name, integer levels, integer edges);</CODE
18066></P
18067><P
18068></P
18069></DIV
18070><P
18071>Once a script has the ability to grab control inputs from
18072 the avatar, this event will be used to pass the commands into the
18073 script. The <CODE
18074CLASS="parameter"
18075>levels</CODE
18076> and
18077 <CODE
18078CLASS="parameter"
18079>edges</CODE
18080> are bitfields of <A
18081HREF="#AEN5643"
18082>control constants</A
18083>.</P
18084></DIV
18085><DIV
18086CLASS="section"
18087><HR><H2
18088CLASS="section"
18089><A
18090NAME="AEN4997"
18091>B.9. dataserver</A
18092></H2
18093><DIV
18094CLASS="funcsynopsis"
18095><P
18096></P
18097><A
18098NAME="AEN4999"
18099></A
18100><P
18101><CODE
18102><CODE
18103CLASS="FUNCDEF"
18104>dataserver</CODE
18105>(key requested, string data);</CODE
18106></P
18107><P
18108></P
18109></DIV
18110><P
18111>This event is triggered when the requested data is returned
18112 to the script. Data may be requested by the <A
18113HREF="#AEN3346"
18114>llRequestAgentData</A
18115>, the <A
18116HREF="#AEN3391"
18117>llRequestSimulatorData</A
18118>, the
18119 <A
18120HREF="#AEN3363"
18121>llRequestInventoryData</A
18122>,
18123 and the <A
18124HREF="#AEN1946"
18125>llGetNotecardLine</A
18126> function
18127 calls.</P
18128></DIV
18129><DIV
18130CLASS="section"
18131><HR><H2
18132CLASS="section"
18133><A
18134NAME="AEN5012"
18135>B.10. email</A
18136></H2
18137><DIV
18138CLASS="funcsynopsis"
18139><P
18140></P
18141><A
18142NAME="AEN5014"
18143></A
18144><P
18145><CODE
18146><CODE
18147CLASS="FUNCDEF"
18148>email</CODE
18149>(string time, string address, string subject, string body, integer remaining);</CODE
18150></P
18151><P
18152></P
18153></DIV
18154><P
18155>This event is triggered when an email sent to this script
18156 arrives. The <CODE
18157CLASS="parameter"
18158>remaining</CODE
18159> tells how many more
18160 emails are known as still pending.</P
18161></DIV
18162><DIV
18163CLASS="section"
18164><HR><H2
18165CLASS="section"
18166><A
18167NAME="AEN5030"
18168>B.11. land_collision</A
18169></H2
18170><DIV
18171CLASS="funcsynopsis"
18172><P
18173></P
18174><A
18175NAME="AEN5032"
18176></A
18177><P
18178><CODE
18179><CODE
18180CLASS="FUNCDEF"
18181>land_collision</CODE
18182>(vector position);</CODE
18183></P
18184><P
18185></P
18186></DIV
18187><P
18188>This event is raised when the object the script is attached
18189 to is colliding with the ground.</P
18190></DIV
18191><DIV
18192CLASS="section"
18193><HR><H2
18194CLASS="section"
18195><A
18196NAME="AEN5039"
18197>B.12. land_collision_end</A
18198></H2
18199><DIV
18200CLASS="funcsynopsis"
18201><P
18202></P
18203><A
18204NAME="AEN5041"
18205></A
18206><P
18207><CODE
18208><CODE
18209CLASS="FUNCDEF"
18210>land_collision_end</CODE
18211>(vector position);</CODE
18212></P
18213><P
18214></P
18215></DIV
18216><P
18217>This event is raised when the object the script is attached
18218 to stops colliding with the ground.</P
18219></DIV
18220><DIV
18221CLASS="section"
18222><HR><H2
18223CLASS="section"
18224><A
18225NAME="AEN5048"
18226>B.13. land_collision_start</A
18227></H2
18228><DIV
18229CLASS="funcsynopsis"
18230><P
18231></P
18232><A
18233NAME="AEN5050"
18234></A
18235><P
18236><CODE
18237><CODE
18238CLASS="FUNCDEF"
18239>land_collision_start</CODE
18240>(vector position);</CODE
18241></P
18242><P
18243></P
18244></DIV
18245><P
18246>This event is raised when the object the script is attached
18247 to begins to collide with the ground.</P
18248></DIV
18249><DIV
18250CLASS="section"
18251><HR><H2
18252CLASS="section"
18253><A
18254NAME="AEN5057"
18255>B.14. link_message</A
18256></H2
18257><DIV
18258CLASS="funcsynopsis"
18259><P
18260></P
18261><A
18262NAME="AEN5059"
18263></A
18264><P
18265><CODE
18266><CODE
18267CLASS="FUNCDEF"
18268>link_message</CODE
18269>(integer sender_number, integer number, string message, key id);</CODE
18270></P
18271><P
18272></P
18273></DIV
18274><P
18275>Triggered when object receives a link message via <A
18276HREF="#AEN2919"
18277>llMessageLinked</A
18278> library
18279 function call.</P
18280></DIV
18281><DIV
18282CLASS="section"
18283><HR><H2
18284CLASS="section"
18285><A
18286NAME="AEN5073"
18287>B.15. listen</A
18288></H2
18289><DIV
18290CLASS="funcsynopsis"
18291><P
18292></P
18293><A
18294NAME="AEN5075"
18295></A
18296><P
18297><CODE
18298><CODE
18299CLASS="FUNCDEF"
18300>listen</CODE
18301>(integer channel, string name, key id, string message);</CODE
18302></P
18303><P
18304></P
18305></DIV
18306><P
18307>This event is raised whenever a chat message matching the
18308 constraints passed in the <A
18309HREF="#AEN2665"
18310>llListen</A
18311>
18312 command is heard. The <CODE
18313CLASS="parameter"
18314>name</CODE
18315> and
18316 <CODE
18317CLASS="parameter"
18318>id</CODE
18319> of the speaker as well as the
18320 <CODE
18321CLASS="parameter"
18322>message</CODE
18323> are passed in as parameters.
18324 Channel 0 is the public chat channel that all avatars see as chat
18325 text. Channels 1 through 2,147,483,648 are private channels that
18326 are not sent to avatars but other scripts can listen on those
18327 channels.</P
18328></DIV
18329><DIV
18330CLASS="section"
18331><HR><H2
18332CLASS="section"
18333><A
18334NAME="AEN5092"
18335>B.16. money</A
18336></H2
18337><DIV
18338CLASS="funcsynopsis"
18339><P
18340></P
18341><A
18342NAME="AEN5094"
18343></A
18344><P
18345><CODE
18346><CODE
18347CLASS="FUNCDEF"
18348>money</CODE
18349>(key giver, integer amount);</CODE
18350></P
18351><P
18352></P
18353></DIV
18354><P
18355>This event is triggered when user
18356 <CODE
18357CLASS="parameter"
18358>giver</CODE
18359> has given an
18360 <CODE
18361CLASS="parameter"
18362>amount</CODE
18363> of Linden dollars to the
18364 object.</P
18365></DIV
18366><DIV
18367CLASS="section"
18368><HR><H2
18369CLASS="section"
18370><A
18371NAME="AEN5105"
18372>B.17. moving_end</A
18373></H2
18374><DIV
18375CLASS="funcsynopsis"
18376><P
18377></P
18378><A
18379NAME="AEN5107"
18380></A
18381><P
18382><CODE
18383><CODE
18384CLASS="FUNCDEF"
18385>moving_end</CODE
18386>(void);</CODE
18387></P
18388><P
18389></P
18390></DIV
18391><P
18392>Triggered whenever a object with this script stops
18393 moving.</P
18394></DIV
18395><DIV
18396CLASS="section"
18397><HR><H2
18398CLASS="section"
18399><A
18400NAME="AEN5113"
18401>B.18. moving_start</A
18402></H2
18403><DIV
18404CLASS="funcsynopsis"
18405><P
18406></P
18407><A
18408NAME="AEN5115"
18409></A
18410><P
18411><CODE
18412><CODE
18413CLASS="FUNCDEF"
18414>moving_start</CODE
18415>(void);</CODE
18416></P
18417><P
18418></P
18419></DIV
18420><P
18421>Triggered whenever a object with this script starts
18422 moving.</P
18423></DIV
18424><DIV
18425CLASS="section"
18426><HR><H2
18427CLASS="section"
18428><A
18429NAME="AEN5121"
18430>B.19. no_sensor</A
18431></H2
18432><DIV
18433CLASS="funcsynopsis"
18434><P
18435></P
18436><A
18437NAME="AEN5123"
18438></A
18439><P
18440><CODE
18441><CODE
18442CLASS="FUNCDEF"
18443>no_sensor</CODE
18444>(void);</CODE
18445></P
18446><P
18447></P
18448></DIV
18449><P
18450>This event is raised when sensors are active (via the <A
18451HREF="#AEN3693"
18452>llSensor</A
18453> library call) but are not
18454 sensing anything.</P
18455></DIV
18456><DIV
18457CLASS="section"
18458><HR><H2
18459CLASS="section"
18460><A
18461NAME="AEN5130"
18462>B.20. not_at_rot_target</A
18463></H2
18464><DIV
18465CLASS="funcsynopsis"
18466><P
18467></P
18468><A
18469NAME="AEN5132"
18470></A
18471><P
18472><CODE
18473><CODE
18474CLASS="FUNCDEF"
18475>not_at_rot_target</CODE
18476>(void);</CODE
18477></P
18478><P
18479></P
18480></DIV
18481><P
18482>When a target is set via the <A
18483HREF="#AEN3579"
18484>llRotTarget</A
18485> library call, but the
18486 script is outside the specified angle this event is raised.</P
18487></DIV
18488><DIV
18489CLASS="section"
18490><HR><H2
18491CLASS="section"
18492><A
18493NAME="AEN5139"
18494>B.21. not_at_target</A
18495></H2
18496><DIV
18497CLASS="funcsynopsis"
18498><P
18499></P
18500><A
18501NAME="AEN5141"
18502></A
18503><P
18504><CODE
18505><CODE
18506CLASS="FUNCDEF"
18507>not_at_target</CODE
18508>(void);</CODE
18509></P
18510><P
18511></P
18512></DIV
18513><P
18514>When a target is set via the <A
18515HREF="#AEN4688"
18516>llTarget</A
18517> library call, but the
18518 script is outside the specified range this event is raised.</P
18519></DIV
18520><DIV
18521CLASS="section"
18522><HR><H2
18523CLASS="section"
18524><A
18525NAME="AEN5148"
18526>B.22. object_rez</A
18527></H2
18528><DIV
18529CLASS="funcsynopsis"
18530><P
18531></P
18532><A
18533NAME="AEN5150"
18534></A
18535><P
18536><CODE
18537><CODE
18538CLASS="FUNCDEF"
18539>object_rez</CODE
18540>(key id);</CODE
18541></P
18542><P
18543></P
18544></DIV
18545><P
18546>Triggered when object rezzes another object from its
18547 inventory via the <A
18548HREF="#AEN3461"
18549>llRezObject</A
18550> api. The
18551 <CODE
18552CLASS="parameter"
18553>id</CODE
18554> is the globally unique key for the
18555 object.</P
18556></DIV
18557><DIV
18558CLASS="section"
18559><HR><H2
18560CLASS="section"
18561><A
18562NAME="AEN5159"
18563>B.23. on_rez</A
18564></H2
18565><DIV
18566CLASS="funcsynopsis"
18567><P
18568></P
18569><A
18570NAME="AEN5161"
18571></A
18572><P
18573><CODE
18574><CODE
18575CLASS="FUNCDEF"
18576>on_rez</CODE
18577>(integer start_param);</CODE
18578></P
18579><P
18580></P
18581></DIV
18582><P
18583>Triggered whenever a object is rezzed from inventory or by
18584 another object. The <CODE
18585CLASS="parameter"
18586>start_param</CODE
18587> is the
18588 parameter passed in from the call to <A
18589HREF="#AEN3461"
18590>llRezObject</A
18591> or <A
18592HREF="#AEN3434"
18593>llRezAtRoot</A
18594>.</P
18595></DIV
18596><DIV
18597CLASS="section"
18598><HR><H2
18599CLASS="section"
18600><A
18601NAME="AEN5171"
18602>B.24. run_time_permissions</A
18603></H2
18604><DIV
18605CLASS="funcsynopsis"
18606><P
18607></P
18608><A
18609NAME="AEN5173"
18610></A
18611><P
18612><CODE
18613><CODE
18614CLASS="FUNCDEF"
18615>run_time_permissions</CODE
18616>(integer permissions);</CODE
18617></P
18618><P
18619></P
18620></DIV
18621><P
18622>Scripts need permission from either the owner or the avatar
18623 they wish to act on before they perform certain functions, such as
18624 debiting money from their owner's account, triggering an animation
18625 on an avatar, or capturing control inputs. The <A
18626HREF="#AEN3375"
18627>llRequestPermissions</A
18628>
18629 library function is used to request these permissions and the
18630 various <A
18631HREF="#AEN5360"
18632>permissions integer
18633 constants</A
18634> can be supplied. The integer returned to this
18635 event handler contains the current set of permissions flags, so if
18636 <CODE
18637CLASS="parameter"
18638>permissions</CODE
18639> equal 0 then no permissions are
18640 set.</P
18641></DIV
18642><DIV
18643CLASS="section"
18644><HR><H2
18645CLASS="section"
18646><A
18647NAME="AEN5183"
18648>B.25. sensor</A
18649></H2
18650><DIV
18651CLASS="funcsynopsis"
18652><P
18653></P
18654><A
18655NAME="AEN5185"
18656></A
18657><P
18658><CODE
18659><CODE
18660CLASS="FUNCDEF"
18661>sensor</CODE
18662>(integer total_number);</CODE
18663></P
18664><P
18665></P
18666></DIV
18667><P
18668>This event is raised whenever objects matching the
18669 constraints of the <A
18670HREF="#AEN3693"
18671>llSensor</A
18672>
18673 command are detected. The number of detected objects is passed to
18674 the script in the <CODE
18675CLASS="parameter"
18676>total_number</CODE
18677>
18678 parameter. A maximum of 16 objects are passed to this event.
18679 Information on those objects may be gathered via the
18680 <A
18681HREF="#lib_lldetected"
18682>llDetected*</A
18683> library
18684 functions.</P
18685></DIV
18686><DIV
18687CLASS="section"
18688><HR><H2
18689CLASS="section"
18690><A
18691NAME="AEN5195"
18692>B.26. state_entry</A
18693></H2
18694><DIV
18695CLASS="funcsynopsis"
18696><P
18697></P
18698><A
18699NAME="AEN5197"
18700></A
18701><P
18702><CODE
18703><CODE
18704CLASS="FUNCDEF"
18705>state_entry</CODE
18706>(void);</CODE
18707></P
18708><P
18709></P
18710></DIV
18711><P
18712>The state_entry event occurs whenever a new state is
18713 entered, including program start, and is always the first event
18714 handled.</P
18715></DIV
18716><DIV
18717CLASS="section"
18718><HR><H2
18719CLASS="section"
18720><A
18721NAME="AEN5203"
18722>B.27. state_exit</A
18723></H2
18724><DIV
18725CLASS="funcsynopsis"
18726><P
18727></P
18728><A
18729NAME="AEN5205"
18730></A
18731><P
18732><CODE
18733><CODE
18734CLASS="FUNCDEF"
18735>state_exit</CODE
18736>(void);</CODE
18737></P
18738><P
18739></P
18740></DIV
18741><P
18742>The state_exit event occurs whenever the state command is
18743 used to transition to another state. It is handled before the new
18744 state's state_entry event.</P
18745></DIV
18746><DIV
18747CLASS="section"
18748><HR><H2
18749CLASS="section"
18750><A
18751NAME="AEN5211"
18752>B.28. timer</A
18753></H2
18754><DIV
18755CLASS="funcsynopsis"
18756><P
18757></P
18758><A
18759NAME="AEN5213"
18760></A
18761><P
18762><CODE
18763><CODE
18764CLASS="FUNCDEF"
18765>timer</CODE
18766>(void);</CODE
18767></P
18768><P
18769></P
18770></DIV
18771><P
18772>This event is raised at regular intervals set by the <A
18773HREF="#AEN4188"
18774>llSetTimerEvent</A
18775> library
18776 function.</P
18777></DIV
18778><DIV
18779CLASS="section"
18780><HR><H2
18781CLASS="section"
18782><A
18783NAME="AEN5220"
18784>B.29. touch</A
18785></H2
18786><DIV
18787CLASS="funcsynopsis"
18788><P
18789></P
18790><A
18791NAME="AEN5222"
18792></A
18793><P
18794><CODE
18795><CODE
18796CLASS="FUNCDEF"
18797>touch</CODE
18798>(integer total_number);</CODE
18799></P
18800><P
18801></P
18802></DIV
18803><P
18804>This event is raised while a user is touching the object the
18805 script is attached to. The number of touching objects is passed to
18806 the script in the <CODE
18807CLASS="parameter"
18808>total_number</CODE
18809>
18810 parameter. Information on those objects may be gathered via the
18811 <A
18812HREF="#lib_lldetected"
18813>llDetected*</A
18814> library
18815 functions.</P
18816></DIV
18817><DIV
18818CLASS="section"
18819><HR><H2
18820CLASS="section"
18821><A
18822NAME="AEN5231"
18823>B.30. touch_end</A
18824></H2
18825><DIV
18826CLASS="funcsynopsis"
18827><P
18828></P
18829><A
18830NAME="AEN5233"
18831></A
18832><P
18833><CODE
18834><CODE
18835CLASS="FUNCDEF"
18836>touch_end</CODE
18837>(integer total_number);</CODE
18838></P
18839><P
18840></P
18841></DIV
18842><P
18843>This event is raised when a user stops touching the object
18844 the script is attached to. The number of touching objects is
18845 passed to the script in the <CODE
18846CLASS="parameter"
18847>total_number</CODE
18848>
18849 parameter. Information on those objects may be gathered via the
18850 <A
18851HREF="#lib_lldetected"
18852>llDetected*</A
18853> library
18854 functions.</P
18855></DIV
18856><DIV
18857CLASS="section"
18858><HR><H2
18859CLASS="section"
18860><A
18861NAME="AEN5242"
18862>B.31. touch_start</A
18863></H2
18864><DIV
18865CLASS="funcsynopsis"
18866><P
18867></P
18868><A
18869NAME="AEN5244"
18870></A
18871><P
18872><CODE
18873><CODE
18874CLASS="FUNCDEF"
18875>touch_start</CODE
18876>(integer total_number);</CODE
18877></P
18878><P
18879></P
18880></DIV
18881><P
18882>This event is raised when a user first touches the object
18883 the script is attached to. The number of touching objects is
18884 passed to the script in the <CODE
18885CLASS="parameter"
18886>total_number</CODE
18887>
18888 parameter. Information on those objects may be gathered via the
18889 <A
18890HREF="#lib_lldetected"
18891>llDetected*</A
18892> library
18893 functions.</P
18894></DIV
18895><DIV
18896CLASS="section"
18897><HR><H2
18898CLASS="section"
18899><A
18900NAME="AEN5253"
18901>B.32. remote_data</A
18902></H2
18903><DIV
18904CLASS="funcsynopsis"
18905><P
18906></P
18907><A
18908NAME="AEN5255"
18909></A
18910><P
18911><CODE
18912><CODE
18913CLASS="FUNCDEF"
18914>remote_data</CODE
18915>(integer type, key channel, key message_id, string sender, integer ival, string sval);</CODE
18916></P
18917><P
18918></P
18919></DIV
18920><P
18921>This event is raised when a user creates an XML-RPC
18922 channel via <A
18923HREF="#AEN3011"
18924>llOpenRemoteDataChannel</A
18925>,
18926 a remote XML-RPC server replies to a <A
18927HREF="#AEN3680"
18928>llSendRemoteData</A
18929>,
18930 or a remote XML-RPC client sends in an XML-RPC request. In the open case,
18931 <CODE
18932CLASS="parameter"
18933>type</CODE
18934> = REMOTE_DATA_CHANNEL, <CODE
18935CLASS="parameter"
18936>channel</CODE
18937> = NULL_KEY,
18938 <CODE
18939CLASS="parameter"
18940>message_id</CODE
18941> = NULL_KEY, <CODE
18942CLASS="parameter"
18943>sender</CODE
18944> is an empty string,
18945 <CODE
18946CLASS="parameter"
18947>ival</CODE
18948> = 0, and <CODE
18949CLASS="parameter"
18950>sval</CODE
18951> is an empty string. In the reply case,
18952 <CODE
18953CLASS="parameter"
18954>type</CODE
18955> = REMOTE_DATA_REPLY, <CODE
18956CLASS="parameter"
18957>channel</CODE
18958> is set to the channel that the request was sent on,
18959 <CODE
18960CLASS="parameter"
18961>message_id</CODE
18962> is set to the id of the message, <CODE
18963CLASS="parameter"
18964>sender</CODE
18965> is an empty string,
18966 <CODE
18967CLASS="parameter"
18968>ival</CODE
18969> = 0, and <CODE
18970CLASS="parameter"
18971>sval</CODE
18972> is a string. In the remote request case,
18973 <CODE
18974CLASS="parameter"
18975>type</CODE
18976> = REMOTE_DATA_REQUEST, <CODE
18977CLASS="parameter"
18978>channel</CODE
18979> is set to the channel that sent the message,
18980 <CODE
18981CLASS="parameter"
18982>message_id</CODE
18983> is set to the id of the message, <CODE
18984CLASS="parameter"
18985>sender</CODE
18986> is set by the sender,
18987 <CODE
18988CLASS="parameter"
18989>ival</CODE
18990> is an integer, and <CODE
18991CLASS="parameter"
18992>sval</CODE
18993> is a string.
18994 parameter.</P
18995></DIV
18996></DIV
18997><DIV
18998CLASS="appendix"
18999><HR><H1
19000><A
19001NAME="AEN5292"
19002></A
19003>Appendix C. Constants</H1
19004><P
19005>To ease scripting, many useful constants are defined by
19006 LSL.</P
19007><DIV
19008CLASS="section"
19009><HR><H2
19010CLASS="section"
19011><A
19012NAME="AEN5295"
19013>C.1. Boolean Constants</A
19014></H2
19015><P
19016>The boolean constants represent the values for TRUE and
19017 FALSE. LSL represents booleans as integer values 1 and 0
19018 respectively. Since there is no boolean type these constants act
19019 as a scripting aid usually employed for testing variables which
19020 conceptually represent boolean values.</P
19021><P
19022><P
19023></P
19024><UL
19025><LI
19026><P
19027>TRUE</P
19028></LI
19029><LI
19030><P
19031>FALSE</P
19032></LI
19033></UL
19034></P
19035></DIV
19036><DIV
19037CLASS="section"
19038><HR><H2
19039CLASS="section"
19040><A
19041NAME="AEN5304"
19042>C.2. Status Constants</A
19043></H2
19044><P
19045>The status constants are used in the <A
19046HREF="#AEN4095"
19047>llSetStatus</A
19048> and <A
19049HREF="#AEN2184"
19050>llGetStatus</A
19051> library calls. These
19052 constants can be bitwise or'ed together when calling the library
19053 functions to set the same value to more than one status
19054 flag</P
19055><P
19056></P
19057><DIV
19058CLASS="variablelist"
19059><P
19060><B
19061>Status Constants</B
19062></P
19063><DL
19064><DT
19065>STATUS_PHYSICS</DT
19066><DD
19067><P
19068>Controls whether the object moves
19069 physically. This controls the same flag that the ui checkbox
19070 for 'Physical' controls. The default is FALSE.</P
19071></DD
19072><DT
19073>STATUS_PHANTOM</DT
19074><DD
19075><P
19076>Controls whether the object collides or
19077 not. Setting the value to TRUE makes the object non-colliding
19078 with all objects. It is a good idea to use this for most
19079 objects that move or rotate, but are non-physical. It is also
19080 useful for simulating volumetric lighting. The default is
19081 FALSE.</P
19082></DD
19083><DT
19084>STATUS_ROTATE_X, STATUS_ROTATE_Y, STATUS_ROTATE_Z</DT
19085><DD
19086><P
19087>Controls whether the object can physically rotate
19088 around the specific axis or not. This flag has no meaning
19089 for non-physical objects. Set the value to FALSE
19090 to disable rotation around that axis. The default is TRUE
19091 for a physical object.</P
19092><P
19093>A useful example to think about when visualizing the
19094 effect is a 'sit-and-spin' device. They spin around the Z
19095 axis (up) but not around the X or Y axis.</P
19096></DD
19097><DT
19098>STATUS_BLOCK_GRAB</DT
19099><DD
19100><P
19101>Controls whether the object can be grabbed. A
19102 grab is the default action when in third person, and is
19103 available as the 'hand' tool in build mode. This is useful for
19104 physical objects that you don't want other people to be able
19105 to trivially disturb. The default if FALSE</P
19106></DD
19107><DT
19108>STATUS_SANDBOX</DT
19109><DD
19110><P
19111>Controls whether the object can cross region
19112 boundaries and move more than 20 meters from its creation
19113 point. The default if FALSE.</P
19114></DD
19115><DT
19116>STATUS_DIE_AT_EDGE</DT
19117><DD
19118><P
19119>Controls whether the object is returned to the
19120 owner's inventory if it wanders off the edge of the world. It
19121 is useful to set this status TRUE for things like bullets or
19122 rockets. The default is TRUE</P
19123></DD
19124></DL
19125></DIV
19126></DIV
19127><DIV
19128CLASS="section"
19129><HR><H2
19130CLASS="section"
19131><A
19132NAME="AEN5338"
19133>C.3. Object Type Constants</A
19134></H2
19135><P
19136>These constants can be combined using the binary '|'
19137 operator and are used in the <A
19138HREF="#AEN3693"
19139>llSensor</A
19140> and related calls.</P
19141><P
19142></P
19143><DIV
19144CLASS="variablelist"
19145><P
19146><B
19147>Object Type Constants</B
19148></P
19149><DL
19150><DT
19151>AGENT</DT
19152><DD
19153><P
19154>Objects in world that are agents.</P
19155></DD
19156><DT
19157>ACTIVE</DT
19158><DD
19159><P
19160>Objects in world that are running a script or
19161 currently physically moving.</P
19162></DD
19163><DT
19164>PASSIVE</DT
19165><DD
19166><P
19167>Static in-world objects.</P
19168></DD
19169><DT
19170>SCRIPTED</DT
19171><DD
19172><P
19173>Scripted in-world objects.</P
19174></DD
19175></DL
19176></DIV
19177></DIV
19178><DIV
19179CLASS="section"
19180><HR><H2
19181CLASS="section"
19182><A
19183NAME="AEN5360"
19184>C.4. Permission Constants</A
19185></H2
19186><P
19187>The permission constants are used for passing values to
19188 <A
19189HREF="#AEN3375"
19190>llRequestPermissions</A
19191>,
19192 determining the value of <A
19193HREF="#AEN2048"
19194>llGetPermissions</A
19195>, and
19196 explicitly passed to the <A
19197HREF="#AEN5171"
19198>run_time_permissions</A
19199>
19200 event. For many of the basic library functions to work, a
19201 specific permission must be enabled. The permission constants can
19202 be or'ed together to be used in conjunction.</P
19203><P
19204></P
19205><DIV
19206CLASS="variablelist"
19207><P
19208><B
19209>Permission Constants</B
19210></P
19211><DL
19212><DT
19213>PERMISSION_DEBIT</DT
19214><DD
19215><P
19216>If this permission is enabled, the object can
19217 successfully call <A
19218HREF="#AEN2342"
19219>llGiveMoney</A
19220> to debit the
19221 owner's account.</P
19222></DD
19223><DT
19224>PERMISSION_TAKE_CONTROLS</DT
19225><DD
19226><P
19227>If this permission enabled, the object can
19228 successfully call the <A
19229HREF="#AEN4661"
19230>llTakeControls</A
19231> library
19232 call.</P
19233></DD
19234><DT
19235>PERMISSION_REMAP_CONTROLS</DT
19236><DD
19237><P
19238>(not yet implemented)</P
19239></DD
19240><DT
19241>PERMISSION_TRIGGER_ANIMATION</DT
19242><DD
19243><P
19244>If this permission is enabled, the object can
19245 successfully call <A
19246HREF="#AEN4346"
19247>llStartAnimation</A
19248> for the
19249 avatar that owns this object.</P
19250></DD
19251><DT
19252><A
19253NAME="const_permission_attach"
19254></A
19255>PERMISSION_ATTACH</DT
19256><DD
19257><P
19258>If this permission is enabled, the object can
19259 successfully call <A
19260HREF="#AEN1119"
19261>llAttachToAvatar</A
19262> to attach
19263 to the given avatar.</P
19264></DD
19265><DT
19266>PERMISSION_RELEASE_OWNERSHIP</DT
19267><DD
19268><P
19269>(not yet implemented)</P
19270></DD
19271><DT
19272><A
19273NAME="const_permission_change_links"
19274></A
19275>PERMISSION_CHANGE_LINKS</DT
19276><DD
19277><P
19278>If this permission is enabled, the object can
19279 successfully call <A
19280HREF="#AEN1292"
19281>llCreateLink</A
19282>, <A
19283HREF="#AEN1191"
19284>llBreakLink</A
19285>, and <A
19286HREF="#AEN1182"
19287>llBreakAllLinks</A
19288> to change
19289 links to other objects.</P
19290></DD
19291><DT
19292>PERMISSION_CHANGE_JOINTS</DT
19293><DD
19294><P
19295>(not yet implemented)</P
19296></DD
19297><DT
19298>PERMISSION_CHANGE_PERMISSIONS</DT
19299><DD
19300><P
19301>(not yet implemented)</P
19302></DD
19303></DL
19304></DIV
19305></DIV
19306><DIV
19307CLASS="section"
19308><HR><H2
19309CLASS="section"
19310><A
19311NAME="AEN5411"
19312>C.5. Inventory Constants</A
19313></H2
19314><P
19315>These constants can be used to refer to a specific inventory
19316 type in calls to <A
19317HREF="#AEN1789"
19318>llGetInventoryNumber</A
19319> and
19320 <A
19321HREF="#AEN1774"
19322>llGetInventoryName</A
19323>. They
19324 are also returned by <A
19325HREF="#AEN1816"
19326>llGetInventoryType</A
19327>.
19328 </P
19329><P
19330></P
19331><DIV
19332CLASS="variablelist"
19333><P
19334><B
19335>Inventory Constants</B
19336></P
19337><DL
19338><DT
19339>INVENTORY_TEXTURE, INVENTORY_SOUND, INVENTORY_OBJECT, INVENTORY_SCRIPT, INVENTORY_LANDMARK, INVENTORY_CLOTHING, INVENTORY_NOTECARD, INVENTORY_BODYPART, INVENTORY_ANIMATION, INVENTORY_GESTURE, INVENTORY_ALL, INVENTORY_NONE</DT
19340><DD
19341><P
19342>Each constant refers to the named type of
19343 inventory.</P
19344></DD
19345></DL
19346></DIV
19347></DIV
19348><DIV
19349CLASS="section"
19350><HR><H2
19351CLASS="section"
19352><A
19353NAME="AEN5434"
19354>C.6. Pay Price Constants</A
19355></H2
19356><P
19357>These constants can be used in <A
19358HREF="#AEN1789"
19359>llSetPayPrice</A
19360></P
19361><P
19362></P
19363><DIV
19364CLASS="variablelist"
19365><P
19366><B
19367>Pay Price Constants</B
19368></P
19369><DL
19370><DT
19371>PAY_HIDE</DT
19372><DD
19373><P
19374>Do not show this quick pay button.</P
19375></DD
19376><DT
19377>PAY_DEFAULT</DT
19378><DD
19379><P
19380>Use the default value for this quick pay button.</P
19381></DD
19382></DL
19383></DIV
19384></DIV
19385><DIV
19386CLASS="section"
19387><HR><H2
19388CLASS="section"
19389><A
19390NAME="AEN5448"
19391>C.7. Attachment Constants</A
19392></H2
19393><P
19394>These constants are used to refer to attachment points in
19395 calls to <A
19396HREF="#AEN1119"
19397>llAttachToAvatar</A
19398>.</P
19399><P
19400></P
19401><DIV
19402CLASS="variablelist"
19403><P
19404><B
19405>Attachment Constants</B
19406></P
19407><DL
19408><DT
19409>ATTACH_CHEST</DT
19410><DD
19411><P
19412>Attach to the avatar chest.</P
19413></DD
19414><DT
19415>ATTACH_HEAD</DT
19416><DD
19417><P
19418>Attach to the avatar head.</P
19419></DD
19420><DT
19421>ATTACH_LSHOULDER</DT
19422><DD
19423><P
19424>Attach to the avatar left shoulder.</P
19425></DD
19426><DT
19427>ATTACH_RSHOULDER</DT
19428><DD
19429><P
19430>Attach to the avatar right shoulder.</P
19431></DD
19432><DT
19433>ATTACH_LHAND</DT
19434><DD
19435><P
19436>Attach to the avatar left hand.</P
19437></DD
19438><DT
19439>ATTACH_RHAND</DT
19440><DD
19441><P
19442>Attach to the avatar right hand.</P
19443></DD
19444><DT
19445>ATTACH_LFOOT</DT
19446><DD
19447><P
19448>Attach to the avatar left foot.</P
19449></DD
19450><DT
19451>ATTACH_RFOOT</DT
19452><DD
19453><P
19454>Attach to the avatar right foot.</P
19455></DD
19456><DT
19457>ATTACH_BACK</DT
19458><DD
19459><P
19460>Attach to the avatar back.</P
19461></DD
19462><DT
19463>ATTACH_PELVIS</DT
19464><DD
19465><P
19466>Attach to the avatar pelvis.</P
19467></DD
19468><DT
19469>ATTACH_MOUTH</DT
19470><DD
19471><P
19472>Attach to the avatar mouth.</P
19473></DD
19474><DT
19475>ATTACH_CHIN</DT
19476><DD
19477><P
19478>Attach to the avatar chin.</P
19479></DD
19480><DT
19481>ATTACH_LEAR</DT
19482><DD
19483><P
19484>Attach to the avatar left ear.</P
19485></DD
19486><DT
19487>ATTACH_REAR</DT
19488><DD
19489><P
19490>Attach to the avatar right ear.</P
19491></DD
19492><DT
19493>ATTACH_LEYE</DT
19494><DD
19495><P
19496>Attach to the avatar left eye.</P
19497></DD
19498><DT
19499>ATTACH_REYE</DT
19500><DD
19501><P
19502>Attach to the avatar right eye.</P
19503></DD
19504><DT
19505>ATTACH_NOSE</DT
19506><DD
19507><P
19508>Attach to the avatar nose.</P
19509></DD
19510><DT
19511>ATTACH_RUARM</DT
19512><DD
19513><P
19514>Attach to the avatar right upper arm.</P
19515></DD
19516><DT
19517>ATTACH_RLARM</DT
19518><DD
19519><P
19520>Attach to the avatar right lower arm.</P
19521></DD
19522><DT
19523>ATTACH_LUARM</DT
19524><DD
19525><P
19526>Attach to the avatar left upper arm.</P
19527></DD
19528><DT
19529>ATTACH_LLARM</DT
19530><DD
19531><P
19532>Attach to the avatar left lower arm.</P
19533></DD
19534><DT
19535>ATTACH_RHIP</DT
19536><DD
19537><P
19538>Attach to the avatar right hip.</P
19539></DD
19540><DT
19541>ATTACH_RULEG</DT
19542><DD
19543><P
19544>Attach to the avatar right upper leg.</P
19545></DD
19546><DT
19547>ATTACH_RLLEG</DT
19548><DD
19549><P
19550>Attach to the avatar right lower leg.</P
19551></DD
19552><DT
19553>ATTACH_LHIP</DT
19554><DD
19555><P
19556>Attach to the avatar left hip.</P
19557></DD
19558><DT
19559>ATTACH_LULEG</DT
19560><DD
19561><P
19562>Attach to the avatar lower upper leg.</P
19563></DD
19564><DT
19565>ATTACH_LLLEG</DT
19566><DD
19567><P
19568>Attach to the avatar lower left leg.</P
19569></DD
19570><DT
19571>ATTACH_BELLY</DT
19572><DD
19573><P
19574>Attach to the avatar belly.</P
19575></DD
19576><DT
19577>ATTACH_RPEC</DT
19578><DD
19579><P
19580>Attach to the avatar right pectoral.</P
19581></DD
19582><DT
19583>ATTACH_LPEC</DT
19584><DD
19585><P
19586>Attach to the avatar left pectoral.</P
19587></DD
19588></DL
19589></DIV
19590></DIV
19591><DIV
19592CLASS="section"
19593><HR><H2
19594CLASS="section"
19595><A
19596NAME="AEN5574"
19597>C.8. Land Constants</A
19598></H2
19599><P
19600>These constants are only used in calls to <A
19601HREF="#AEN2949"
19602>llModifyLand</A
19603>. The constants
19604 are equivalent to the similarly labelled user interface elements
19605 for editing land in the viewer.</P
19606><P
19607></P
19608><DIV
19609CLASS="variablelist"
19610><P
19611><B
19612>Land Constants</B
19613></P
19614><DL
19615><DT
19616>LAND_LEVEL</DT
19617><DD
19618><P
19619>Action to make the land flat and level.</P
19620></DD
19621><DT
19622>LAND_RAISE</DT
19623><DD
19624><P
19625>Action to raise the land.</P
19626></DD
19627><DT
19628>LAND_LOWER</DT
19629><DD
19630><P
19631>Action to lower the land.</P
19632></DD
19633><DT
19634>LAND_SMOOTH</DT
19635><DD
19636><P
19637>Action to smooth the land.</P
19638></DD
19639><DT
19640>LAND_NOISE</DT
19641><DD
19642><P
19643>Action to push the land toward a pseudo-random
19644 heightfield.</P
19645></DD
19646><DT
19647>LAND_REVERT</DT
19648><DD
19649><P
19650>Action to push the land toward the original
19651 shape from when it was first terraformed.</P
19652></DD
19653><DT
19654>LAND_SMALL_BRUSH</DT
19655><DD
19656><P
19657>Use a small brush size.</P
19658></DD
19659><DT
19660>LAND_MEDIUM_BRUSH</DT
19661><DD
19662><P
19663>Use a medium brush size.</P
19664></DD
19665><DT
19666>LAND_LARGE_BRUSH</DT
19667><DD
19668><P
19669>Use a large brush size.</P
19670></DD
19671></DL
19672></DIV
19673></DIV
19674><DIV
19675CLASS="section"
19676><HR><H2
19677CLASS="section"
19678><A
19679NAME="AEN5616"
19680>C.9. Link Constants</A
19681></H2
19682><P
19683>These constants are used in calls to <A
19684HREF="#AEN3906"
19685>llSetLinkColor</A
19686> and <A
19687HREF="#AEN2919"
19688>llMessageLinked</A
19689>.</P
19690><P
19691></P
19692><DIV
19693CLASS="variablelist"
19694><P
19695><B
19696>Link Constants</B
19697></P
19698><DL
19699><DT
19700>LINK_SET</DT
19701><DD
19702><P
19703>This targets every object in the linked
19704 set.</P
19705></DD
19706><DT
19707>LINK_ROOT</DT
19708><DD
19709><P
19710>This targets the root of the linked
19711 set.</P
19712></DD
19713><DT
19714>LINK_ALL_OTHERS</DT
19715><DD
19716><P
19717>This targets every object in the linked set
19718 except the object with the script.</P
19719></DD
19720><DT
19721>LINK_ALL_CHILDREN</DT
19722><DD
19723><P
19724>This targets every object except the root in
19725 the linked set.</P
19726></DD
19727><DT
19728>LINK_THIS</DT
19729><DD
19730><P
19731>This targets the object making the call only.
19732 </P
19733></DD
19734></DL
19735></DIV
19736></DIV
19737><DIV
19738CLASS="section"
19739><HR><H2
19740CLASS="section"
19741><A
19742NAME="AEN5643"
19743>C.10. Control Constants</A
19744></H2
19745><P
19746>These constants are used in <A
19747HREF="#AEN4661"
19748>llTakeControls</A
19749> as well as the
19750 <A
19751HREF="#AEN4981"
19752>control</A
19753> event handler.</P
19754><P
19755></P
19756><DIV
19757CLASS="variablelist"
19758><P
19759><B
19760>Control Constants</B
19761></P
19762><DL
19763><DT
19764>CONTROL_FWD</DT
19765><DD
19766><P
19767>Test for the avatar move forward
19768 control.</P
19769></DD
19770><DT
19771>CONTROL_BACK</DT
19772><DD
19773><P
19774>Test for the avatar move back
19775 control.</P
19776></DD
19777><DT
19778>CONTROL_LEFT</DT
19779><DD
19780><P
19781>Test for the avatar move left
19782 control.</P
19783></DD
19784><DT
19785>CONTROL_RIGHT</DT
19786><DD
19787><P
19788>Test for the avatar move right
19789 control.</P
19790></DD
19791><DT
19792>CONTROL_ROT_LEFT</DT
19793><DD
19794><P
19795>Test for the avatar rotate left
19796 control.</P
19797></DD
19798><DT
19799>CONTROL_ROT_RIGHT</DT
19800><DD
19801><P
19802>Test for the avatar rotate right
19803 control.</P
19804></DD
19805><DT
19806>CONTROL_UP</DT
19807><DD
19808><P
19809>Test for the avatar move up
19810 control.</P
19811></DD
19812><DT
19813>CONTROL_DOWN</DT
19814><DD
19815><P
19816>Test for the avatar move down
19817 control.</P
19818></DD
19819><DT
19820>CONTROL_LBUTTON</DT
19821><DD
19822><P
19823>Test for the avatar left button
19824 control.</P
19825></DD
19826><DT
19827>CONTROL_ML_BUTTON</DT
19828><DD
19829><P
19830>Test for the avatar left button control while
19831 in mouse look.</P
19832></DD
19833></DL
19834></DIV
19835></DIV
19836><DIV
19837CLASS="section"
19838><HR><H2
19839CLASS="section"
19840><A
19841NAME="AEN5690"
19842>C.11. Change Constants</A
19843></H2
19844><P
19845>These constants are used in the <A
19846HREF="#AEN4940"
19847>changed</A
19848> event handler.</P
19849><P
19850></P
19851><DIV
19852CLASS="variablelist"
19853><P
19854><B
19855>Change Constants</B
19856></P
19857><DL
19858><DT
19859>CHANGED_INVENTORY</DT
19860><DD
19861><P
19862>The object inventory has changed.</P
19863></DD
19864><DT
19865>CHANGED_ALLOWED_DROP</DT
19866><DD
19867><P
19868>The object inventory has changed because an item
19869 was added through the <A
19870HREF="#AEN1047"
19871>llAllowInventoryDrop</A
19872>
19873 interface.</P
19874></DD
19875><DT
19876>CHANGED_COLOR</DT
19877><DD
19878><P
19879>The object color has changed.</P
19880></DD
19881><DT
19882>CHANGED_SHAPE</DT
19883><DD
19884><P
19885>The object shape has changed, eg, a box to a
19886 cylinder</P
19887></DD
19888><DT
19889>CHANGED_SCALE</DT
19890><DD
19891><P
19892>The object scale has changed.</P
19893></DD
19894><DT
19895>CHANGED_TEXTURE</DT
19896><DD
19897><P
19898>The texture offset, scale rotation, or simply
19899 the object texture has changed.</P
19900></DD
19901><DT
19902>CHANGED_LINK</DT
19903><DD
19904><P
19905>The object has linked or its links were
19906 broken.</P
19907></DD
19908><DT
19909>CHANGED_REGION</DT
19910><DD
19911><P
19912>The object has changed regions.</P
19913></DD
19914><DT
19915>CHANGED_TELEPORT</DT
19916><DD
19917><P
19918>The object has been teleported.</P
19919></DD
19920></DL
19921></DIV
19922></DIV
19923><DIV
19924CLASS="section"
19925><HR><H2
19926CLASS="section"
19927><A
19928NAME="AEN5733"
19929>C.12. Type Constants</A
19930></H2
19931><P
19932>These constants are used to determine the variable type
19933 stored in a heterogeneous list. The value returned from <A
19934HREF="#AEN1875"
19935>llGetListEntryType</A
19936> can be
19937 used for comparison against these constants.</P
19938><P
19939></P
19940><DIV
19941CLASS="variablelist"
19942><P
19943><B
19944>Type Constants</B
19945></P
19946><DL
19947><DT
19948>TYPE_INTEGER</DT
19949><DD
19950><P
19951>The list entry is an integer.</P
19952></DD
19953><DT
19954>TYPE_FLOAT</DT
19955><DD
19956><P
19957>The list entry is a float.</P
19958></DD
19959><DT
19960>TYPE_STRING</DT
19961><DD
19962><P
19963>The list entry is a string.</P
19964></DD
19965><DT
19966>TYPE_KEY</DT
19967><DD
19968><P
19969>The list entry is a key.</P
19970></DD
19971><DT
19972>TYPE_VECTOR</DT
19973><DD
19974><P
19975>The list entry is a vector.</P
19976></DD
19977><DT
19978>TYPE_ROTATION</DT
19979><DD
19980><P
19981>The list entry is a rotation.</P
19982></DD
19983><DT
19984>TYPE_INVALID</DT
19985><DD
19986><P
19987>The list entry is invalid.</P
19988></DD
19989></DL
19990></DIV
19991></DIV
19992><DIV
19993CLASS="section"
19994><HR><H2
19995CLASS="section"
19996><A
19997NAME="AEN5767"
19998>C.13. Agent Info Constants</A
19999></H2
20000><P
20001>Each of these constants represents a bit in the integer
20002 returned from the <A
20003HREF="#AEN1605"
20004>llGetAgentInfo</A
20005> function and can
20006 be used in an expression to determine the specified information
20007 about an agent.</P
20008><P
20009></P
20010><DIV
20011CLASS="variablelist"
20012><P
20013><B
20014>Agent Info Constants</B
20015></P
20016><DL
20017><DT
20018>AGENT_FLYING</DT
20019><DD
20020><P
20021>The agent is flying.</P
20022></DD
20023><DT
20024>AGENT_ATTACHMENTS</DT
20025><DD
20026><P
20027>The agent has attachments.</P
20028></DD
20029><DT
20030>AGENT_SCRIPTED</DT
20031><DD
20032><P
20033>The agent has scripted attachments.</P
20034></DD
20035><DT
20036>AGENT_SITTING</DT
20037><DD
20038><P
20039>The agent is sitting.</P
20040></DD
20041><DT
20042>AGENT_ON_OBJECT</DT
20043><DD
20044><P
20045>The agent is sitting on an object.</P
20046></DD
20047><DT
20048>AGENT_WALKING</DT
20049><DD
20050><P
20051>The agent is walking.</P
20052></DD
20053><DT
20054>AGENT_IN_AIR</DT
20055><DD
20056><P
20057>The agent is in the air.</P
20058></DD
20059><DT
20060>AGENT_MOUSELOOK</DT
20061><DD
20062><P
20063>The agent is in mouselook.</P
20064></DD
20065><DT
20066>AGENT_AWAY</DT
20067><DD
20068><P
20069>The agent is away (AFK).</P
20070></DD
20071><DT
20072>AGENT_TYPING</DT
20073><DD
20074><P
20075>The agent is typing.</P
20076></DD
20077><DT
20078>AGENT_CROUCHING</DT
20079><DD
20080><P
20081>The agent is crouching.</P
20082></DD
20083></DL
20084></DIV
20085></DIV
20086><DIV
20087CLASS="section"
20088><HR><H2
20089CLASS="section"
20090><A
20091NAME="AEN5817"
20092>C.14. Texture Animation
20093 Constants</A
20094></H2
20095><P
20096>These constants are used in the <A
20097HREF="#AEN4140"
20098>llSetTextureAnim</A
20099> api to
20100 control the animation mode.</P
20101><P
20102></P
20103><DIV
20104CLASS="variablelist"
20105><P
20106><B
20107>Texture Animation Constants</B
20108></P
20109><DL
20110><DT
20111>ANIM_ON</DT
20112><DD
20113><P
20114>Texture animation is on.</P
20115></DD
20116><DT
20117>LOOP</DT
20118><DD
20119><P
20120>Loop the texture animation.</P
20121></DD
20122><DT
20123>REVERSE</DT
20124><DD
20125><P
20126>Play animation in reverse direction.</P
20127></DD
20128><DT
20129>PING_PONG</DT
20130><DD
20131><P
20132>play animation going forwards, then
20133 backwards.</P
20134></DD
20135><DT
20136>SMOOTH</DT
20137><DD
20138><P
20139>slide in the X direction, instead of playing
20140 separate frames.</P
20141></DD
20142><DT
20143>ROTATE</DT
20144><DD
20145><P
20146>Animate texture rotation.</P
20147></DD
20148><DT
20149>SCALE</DT
20150><DD
20151><P
20152>Animate the texture scale.</P
20153></DD
20154></DL
20155></DIV
20156></DIV
20157><DIV
20158CLASS="section"
20159><HR><H2
20160CLASS="section"
20161><A
20162NAME="AEN5851"
20163>C.15. Particle System Constants</A
20164></H2
20165><P
20166>These constants are used in calls to the <A
20167HREF="#AEN3149"
20168>llParticleSystem</A
20169> api to
20170 specify parameters.</P
20171><P
20172></P
20173><DIV
20174CLASS="variablelist"
20175><P
20176><B
20177>Particle System Parameters</B
20178></P
20179><DL
20180><DT
20181>PSYS_PART_FLAGS</DT
20182><DD
20183><P
20184>Each particle that is emitted by the particle system
20185 is simulated based on the following flags. To use multiple
20186 flags, bitwise or (|) them together.</P
20187><P
20188></P
20189><DIV
20190CLASS="variablelist"
20191><P
20192><B
20193>PSYS_PART_FLAGS Values</B
20194></P
20195><DL
20196><DT
20197>PSYS_PART_INTERP_COLOR_MASK</DT
20198><DD
20199><P
20200>Interpolate both the color and alpha
20201 from the start value to the end
20202 value.</P
20203></DD
20204><DT
20205>PSYS_PART_INTERP_SCALE_MASK</DT
20206><DD
20207><P
20208>Interpolate the particle scale from
20209 the start value to the end value.</P
20210></DD
20211><DT
20212>PSYS_PART_WIND_MASK</DT
20213><DD
20214><P
20215>Particles have their velocity damped
20216 towards the wind velocity.</P
20217></DD
20218><DT
20219>PSYS_PART_BOUNCE_MASK</DT
20220><DD
20221><P
20222>Particles bounce off of a plane at the
20223 object's Z height.</P
20224></DD
20225><DT
20226>PSYS_PART_FOLLOW_SRC_MASK</DT
20227><DD
20228><P
20229>The particle position is relative to
20230 the source object's position.</P
20231></DD
20232><DT
20233>PSYS_PART_FOLLOW_VELOCITY_MASK</DT
20234><DD
20235><P
20236>The particle orientation is rotated so
20237 the vertical axis faces towards the particle
20238 velocity.</P
20239></DD
20240><DT
20241>PSYS_PART_TARGET_POS_MASK</DT
20242><DD
20243><P
20244>The particle heads towards the
20245 location of the target object as defined by
20246 PSYS_SRC_TARGET_KEY.</P
20247></DD
20248><DT
20249>PSYS_PART_EMISSIVE_MASK</DT
20250><DD
20251><P
20252>The particle glows.</P
20253></DD
20254><DT
20255>PSYS_PART_RANDOM_ACCEL_MASK</DT
20256><DD
20257><P
20258>(not implemented)</P
20259></DD
20260><DT
20261>PSYS_PART_RANDOM_VEL_MASK</DT
20262><DD
20263><P
20264>(not implemented)</P
20265></DD
20266><DT
20267>PSYS_PART_TRAIL_MASK</DT
20268><DD
20269><P
20270>(not implemented)</P
20271></DD
20272></DL
20273></DIV
20274></DD
20275><DT
20276>PSYS_SRC_PATTERN</DT
20277><DD
20278><P
20279>The pattern which is used to generate particles. Use
20280 one of the following values:</P
20281><P
20282></P
20283><DIV
20284CLASS="variablelist"
20285><P
20286><B
20287>PSYS_SRC_PATTERN Values</B
20288></P
20289><DL
20290><DT
20291>PSYS_SRC_PATTERN_DROP</DT
20292><DD
20293><P
20294>Drop particles at the source
20295 position.</P
20296></DD
20297><DT
20298>PSYS_SRC_PATTERN_EXPLODE</DT
20299><DD
20300><P
20301>Shoot particles out in all directions,
20302 using the burst parameters.</P
20303></DD
20304><DT
20305>PSYS_SRC_PATTERN_ANGLE</DT
20306><DD
20307><P
20308>Shoot particles across a 2 dimensional
20309 area defined by the arc created from
20310 PSYS_SRC_OUTERANGLE. There will be an open area
20311 defined by PSYS_SRC_INNERANGLE within the larger
20312 arc.</P
20313></DD
20314><DT
20315>PSYS_SRC_PATTERN_ANGLE_CONE</DT
20316><DD
20317><P
20318>Shoot particles out in a 3 dimensional
20319 cone with an outer arc of PSYS_SRC_OUTERANGLE and an
20320 inner open area defined by
20321 PSYS_SRC_INNERANGLE.</P
20322></DD
20323></DL
20324></DIV
20325></DD
20326><DT
20327>PSYS_PART_START_COLOR</DT
20328><DD
20329><P
20330>a vector &#60;r,g,b&#62; which determines the starting
20331 color of the object.</P
20332></DD
20333><DT
20334>PSYS_PART_START_ALPHA</DT
20335><DD
20336><P
20337>a float which determines the starting alpha of
20338 the object.</P
20339></DD
20340><DT
20341>PSYS_PART_END_COLOR</DT
20342><DD
20343><P
20344>a vector &#60;r, g, b&#62; which determines the ending
20345 color of the object.</P
20346></DD
20347><DT
20348>PSYS_PART_END_ALPHA</DT
20349><DD
20350><P
20351>a float which determines the ending alpha of
20352 the object.</P
20353></DD
20354><DT
20355>PSYS_PART_START_SCALE</DT
20356><DD
20357><P
20358>a vector &#60;sx, sy, z&#62;, which is the starting
20359 size of the particle billboard in meters (z is
20360 ignored).</P
20361></DD
20362><DT
20363>PSYS_PART_END_SCALE</DT
20364><DD
20365><P
20366>a vector &#60;sx, sy, z&#62;, which is the ending size
20367 of the particle billboard in meters (z is
20368 ignored).</P
20369></DD
20370><DT
20371>PSYS_PART_MAX_AGE</DT
20372><DD
20373><P
20374>age in seconds of a particle at which it
20375 dies.</P
20376></DD
20377><DT
20378>PSYS_SRC_ACCEL</DT
20379><DD
20380><P
20381>a vector &#60;x, y, z&#62; which is the acceleration
20382 to apply on particles.</P
20383></DD
20384><DT
20385>PSYS_SRC_TEXTURE</DT
20386><DD
20387><P
20388>an asset name for the texture to use for the
20389 particles.</P
20390></DD
20391><DT
20392>PSYS_SRC_BURST_RATE</DT
20393><DD
20394><P
20395>how often to release a particle burst (float
20396 seconds).</P
20397></DD
20398><DT
20399>PSYS_SRC_INNERANGLE</DT
20400><DD
20401><P
20402>specifies the inner angle of the arc created
20403 by the PSYS_SRC_PATTERN_ANGLE or
20404 PSYS_SRC_PATTERN_ANGLE_CONE source pattern. The area
20405 specified will not have particles in it..</P
20406></DD
20407><DT
20408>PSYS_SRC_OUTERANGLE</DT
20409><DD
20410><P
20411>specifies the outer angle of the arc created
20412 by the PSYS_SRC_PATTERN_ANGLE or
20413 PSYS_SRC_PATTERN_ANGLE_CONE source pattern. The area
20414 between the outer and inner angle will be filled with
20415 particles..</P
20416></DD
20417><DT
20418>PSYS_SRC_BURST_PART_COUNT</DT
20419><DD
20420><P
20421>how many particles to release in a
20422 burst.</P
20423></DD
20424><DT
20425>PSYS_SRC_BURST_RADIUS</DT
20426><DD
20427><P
20428>what distance from the center of the object to
20429 create the particles.</P
20430></DD
20431><DT
20432>PSYS_SRC_BURST_SPEED_MIN</DT
20433><DD
20434><P
20435>minimum speed that a particle should be
20436 moving.</P
20437></DD
20438><DT
20439>PSYS_SRC_BURST_SPEED_MAX</DT
20440><DD
20441><P
20442>maximum speed that a particle should be
20443 moving.</P
20444></DD
20445><DT
20446>PSYS_SRC_MAX_AGE</DT
20447><DD
20448><P
20449>how long this particle system should last, 0.0
20450 means forever.</P
20451></DD
20452><DT
20453>PSYS_SRC_TARGET_KEY</DT
20454><DD
20455><P
20456>the key of a target object to move towards if
20457 PSYS_PART_TARGET_POS_MASK is enabled.</P
20458></DD
20459><DT
20460>PSYS_SRC_OMEGA</DT
20461><DD
20462><P
20463>Sets the angular velocity to rotate the axis
20464 that SRC_PATTERN_ANGLE and SRC_PATTERN_ANGLE_CONE
20465 use..</P
20466></DD
20467></DL
20468></DIV
20469></DIV
20470><DIV
20471CLASS="section"
20472><HR><H2
20473CLASS="section"
20474><A
20475NAME="AEN6005"
20476>C.16. Agent Data Constants</A
20477></H2
20478><P
20479>These constants are used in calls to the <A
20480HREF="#AEN3346"
20481>llRequestAgentData</A
20482> api to
20483 collect information about an agent which will be provided in the
20484 <A
20485HREF="#AEN4997"
20486>dataserver event</A
20487>.</P
20488><P
20489></P
20490><DIV
20491CLASS="variablelist"
20492><P
20493><B
20494>Agent Data Constants</B
20495></P
20496><DL
20497><DT
20498>DATA_ONLINE</DT
20499><DD
20500><P
20501>"1" for online "0" for
20502 offline.</P
20503></DD
20504><DT
20505>DATA_NAME</DT
20506><DD
20507><P
20508>The name of the agent.</P
20509></DD
20510><DT
20511>DATA_BORN</DT
20512><DD
20513><P
20514>The date the agent was born returned in ISO
20515 8601 format of YYYY-MM-DD.</P
20516></DD
20517><DT
20518>DATA_RATING</DT
20519><DD
20520><P
20521>Returns the agent ratings as a comma separated
20522 string of six integers. They are:
20523 <P
20524></P
20525><OL
20526TYPE="1"
20527><LI
20528><P
20529>Positive rated behavior</P
20530></LI
20531><LI
20532><P
20533>Negative rated behavior</P
20534></LI
20535><LI
20536><P
20537>Positive rated appearance</P
20538></LI
20539><LI
20540><P
20541>Negative rated appearance</P
20542></LI
20543><LI
20544><P
20545>Positive rated building</P
20546></LI
20547><LI
20548><P
20549>Negative rated building</P
20550></LI
20551></OL
20552>
20553 </P
20554></DD
20555></DL
20556></DIV
20557></DIV
20558><DIV
20559CLASS="section"
20560><HR><H2
20561CLASS="section"
20562><A
20563NAME="AEN6041"
20564>C.17. Float Constants</A
20565></H2
20566><P
20567>LSL provides a small collection of floating point constants
20568 for use in float arithmetic. These constants are usually employed
20569 while performing trigonometric calculations, but are sometimes
20570 useful for other applications such as specifying arc radians to
20571 sensor or particle system functions.</P
20572><P
20573></P
20574><DIV
20575CLASS="variablelist"
20576><P
20577><B
20578>Float Constants</B
20579></P
20580><DL
20581><DT
20582>PI</DT
20583><DD
20584><P
20585>3.14159265 - The radians of a
20586 hemicircle.</P
20587></DD
20588><DT
20589>TWO_PI</DT
20590><DD
20591><P
20592>6.28318530 - The radians of a
20593 circle.</P
20594></DD
20595><DT
20596>PI_BY_TWO</DT
20597><DD
20598><P
20599>1.57079633 - The radians of a quarter
20600 circle.</P
20601></DD
20602><DT
20603>DEG_TO_RAD</DT
20604><DD
20605><P
20606>0.01745329 - Number of radians per degree.
20607 You can use this to convert degrees to radians by multiplying
20608 the degrees by this number.</P
20609></DD
20610><DT
20611>RAD_TO_DEG</DT
20612><DD
20613><P
20614>57.2957795 - Number of degrees per radian. You
20615 can use this number to convert radians to degrees by
20616 multiplying the radians by this number.</P
20617></DD
20618><DT
20619>SQRT2</DT
20620><DD
20621><P
20622>1.41421356 - The square root of 2.</P
20623></DD
20624></DL
20625></DIV
20626></DIV
20627><DIV
20628CLASS="section"
20629><HR><H2
20630CLASS="section"
20631><A
20632NAME="AEN6070"
20633>C.18. Key Constant</A
20634></H2
20635><P
20636>There is only one key constant which acts as an invalid
20637 key: NULL_KEY.</P
20638></DIV
20639><DIV
20640CLASS="section"
20641><HR><H2
20642CLASS="section"
20643><A
20644NAME="AEN6073"
20645>C.19. Miscellaneous Integer Constants</A
20646></H2
20647><P
20648>There is one uncategorized integer constant which is used in
20649 some of the texturing and coloring api: ALL_SIDES</P
20650></DIV
20651><DIV
20652CLASS="section"
20653><HR><H2
20654CLASS="section"
20655><A
20656NAME="AEN6076"
20657>C.20. Miscellaneous String
20658 Constants</A
20659></H2
20660><P
20661>There is one uncategorized string constant
20662 which is used in the <A
20663HREF="#AEN4997"
20664>dataserver</A
20665> event:
20666 EOF</P
20667></DIV
20668><DIV
20669CLASS="section"
20670><HR><H2
20671CLASS="section"
20672><A
20673NAME="AEN6080"
20674>C.21. Vector Constant</A
20675></H2
20676><P
20677>There is only one vector constant which acts as a zero
20678 vector: ZERO_VECTOR = &#60;0,0,0&#62;.</P
20679></DIV
20680><DIV
20681CLASS="section"
20682><HR><H2
20683CLASS="section"
20684><A
20685NAME="AEN6083"
20686>C.22. Rotation Constant</A
20687></H2
20688><P
20689>There is only one rotation constant which acts as a zero
20690 rotation: ZERO_ROTATION = &#60;0,0,0,1&#62;.</P
20691></DIV
20692><DIV
20693CLASS="section"
20694><HR><H2
20695CLASS="section"
20696><A
20697NAME="AEN6086"
20698>C.23. Simulator Data Constants</A
20699></H2
20700><P
20701>These constants are used in calls to the <A
20702HREF="#AEN3391"
20703>llRequestSimulatorData</A
20704> api to
20705 collect information about a simulator which will be provided in the
20706 <A
20707HREF="#AEN4997"
20708>dataserver event</A
20709>.</P
20710><P
20711></P
20712><DIV
20713CLASS="variablelist"
20714><P
20715><B
20716>Simulator Data Constants</B
20717></P
20718><DL
20719><DT
20720>DATA_SIM_POS</DT
20721><DD
20722><P
20723>The global position of the simulator. Cast the
20724 value to a vector.</P
20725></DD
20726><DT
20727>DATA_SIM_STATUS</DT
20728><DD
20729><P
20730>The status of the simulator. Currently, this may be one of the following:
20731 <P
20732></P
20733><UL
20734><LI
20735STYLE="list-style-type: opencircle"
20736><P
20737>up</P
20738></LI
20739><LI
20740STYLE="list-style-type: opencircle"
20741><P
20742>down</P
20743></LI
20744><LI
20745STYLE="list-style-type: opencircle"
20746><P
20747>stopping</P
20748></LI
20749><LI
20750STYLE="list-style-type: opencircle"
20751><P
20752>starting</P
20753></LI
20754><LI
20755STYLE="list-style-type: opencircle"
20756><P
20757>crashed</P
20758></LI
20759></UL
20760>
20761 </P
20762></DD
20763></DL
20764></DIV
20765></DIV
20766><DIV
20767CLASS="section"
20768><HR><H2
20769CLASS="section"
20770><A
20771NAME="AEN6112"
20772>C.24. Vehicle Parameters</A
20773></H2
20774><P
20775></P
20776><DIV
20777CLASS="variablelist"
20778><P
20779><B
20780>Parameters</B
20781></P
20782><DL
20783><DT
20784><A
20785HREF="#AEN956"
20786>VEHICLE_LINEAR_FRICTION_TIMESCALE</A
20787></DT
20788><DD
20789><P
20790>A vector of timescales for exponential decay of the
20791 vehicle's linear velocity along its preferred axes of motion (at, left,
20792 up). Range = [0.07, inf) seconds for each element of the vector.
20793 </P
20794></DD
20795><DT
20796><A
20797HREF="#AEN956"
20798>VEHICLE_ANGULAR_FRICTION_TIMESCALE</A
20799></DT
20800><DD
20801><P
20802>A vector of timescales for exponential decay of the
20803 vehicle's angular velocity about its preferred axes of motion (at,
20804 left, up). Range = [0.07, inf) seconds for each element of the vector.
20805 </P
20806></DD
20807><DT
20808><A
20809HREF="#AEN866"
20810>VEHICLE_LINEAR_MOTOR_DIRECTION</A
20811></DT
20812><DD
20813><P
20814>The direction and magnitude (in preferred frame) of the
20815 vehicle's linear motor. The vehicle will accelerate (or decelerate if
20816 necessary) to match its velocity to its motor. Range of magnitude =
20817 [0, 30] meters/second.
20818 </P
20819></DD
20820><DT
20821><A
20822HREF="#AEN866"
20823>VEHICLE_LINEAR_MOTOR_OFFSET</A
20824></DT
20825><DD
20826><P
20827>The offset point from the vehicle's center of mass at which
20828 the linear motor's impulse is applied. This allows the linear motor
20829 to also cause rotational torque. Range of magnitude = [0, 100]
20830 meters.</P
20831></DD
20832><DT
20833><A
20834HREF="#AEN866"
20835>VEHICLE_LINEAR_MOTOR_TIMESCALE</A
20836></DT
20837><DD
20838><P
20839>The timescale for exponential approach to full
20840 linear motor velocity.</P
20841></DD
20842><DT
20843><A
20844HREF="#AEN866"
20845>VEHICLE_LINEAR_MOTOR_DECAY_TIMESCALE</A
20846></DT
20847><DD
20848><P
20849>The timescale for exponential decay of the linear
20850 motor's magnitude.</P
20851></DD
20852><DT
20853><A
20854HREF="#AEN898"
20855>VEHICLE_ANGULAR_MOTOR_DIRECTION</A
20856></DT
20857><DD
20858><P
20859>The direction and magnitude (in preferred frame)
20860 of the vehicle's angular motor.The vehicle will accelerate (or
20861 decelerate if necessary) to match its velocity to its
20862 motor.</P
20863></DD
20864><DT
20865><A
20866HREF="#AEN898"
20867>VEHICLE_ANGULAR_MOTOR_TIMESCALE</A
20868></DT
20869><DD
20870><P
20871>The timescale for exponential approach to full
20872 angular motor velocity.</P
20873></DD
20874><DT
20875><A
20876HREF="#AEN898"
20877>VEHICLE_ANGULAR_MOTOR_DECAY_TIMESCALE</A
20878></DT
20879><DD
20880><P
20881>The timescale for exponential decay of the angular
20882 motor's magnitude.</P
20883></DD
20884><DT
20885><A
20886HREF="#AEN979"
20887>VEHICLE_HOVER_HEIGHT</A
20888></DT
20889><DD
20890><P
20891>The height (above the terrain or water, or global)
20892 at which the vehicle will try to hover.</P
20893></DD
20894><DT
20895><A
20896HREF="#AEN979"
20897>VEHICLE_HOVER_EFFICIENCY</A
20898></DT
20899><DD
20900><P
20901>A slider between minimum (0.0 = bouncy) and
20902 maximum (1.0 = fast as possible) damped motion of the hover
20903 behavior.</P
20904></DD
20905><DT
20906><A
20907HREF="#AEN979"
20908>VEHICLE_HOVER_TIMESCALE</A
20909></DT
20910><DD
20911><P
20912>The period of bounce (or timescale of exponential
20913 approach, depending on the hover efficiency) for the vehicle to
20914 hover to the proper height.</P
20915></DD
20916><DT
20917><A
20918HREF="#AEN972"
20919>VEHICLE_BUOYANCY</A
20920></DT
20921><DD
20922><P
20923>A slider between minimum (0.0) and maximum
20924 anti-gravity (1.0).</P
20925></DD
20926><DT
20927><A
20928HREF="#vehicle_linear_deflection"
20929>VEHICLE_LINEAR_DEFLECTION_EFFICIENCY</A
20930></DT
20931><DD
20932><P
20933>A slider between minimum (0.0) and maximum (1.0)
20934 deflection of linear velocity. That is, it's a simple scalar for
20935 modulating the strength of linear deflection.</P
20936></DD
20937><DT
20938><A
20939HREF="#vehicle_linear_deflection"
20940>VEHICLE_LINEAR_DEFLECTION_TIMESCALE</A
20941></DT
20942><DD
20943><P
20944>The timescale for exponential success of linear
20945 deflection. It is another way to specify how much time
20946 it takes for the vehicle's linear velocity to be redirected to
20947 it's preferred axis of motion.</P
20948></DD
20949><DT
20950><A
20951HREF="#vehicle_angular_deflection"
20952>VEHICLE_ANGULAR_DEFLECTION_EFFICIENCY</A
20953></DT
20954><DD
20955><P
20956>A slider between minimum (0.0) and maximum (1.0)
20957 deflection of angular orientation. That is, it's a simple scalar
20958 for modulating the strength of angular deflection such that the
20959 vehicle's preferred axis of motion points toward it's real
20960 velocity.</P
20961></DD
20962><DT
20963><A
20964HREF="#vehicle_angular_deflection"
20965>VEHICLE_ANGULAR_DEFLECTION_TIMESCALE</A
20966></DT
20967><DD
20968><P
20969>The timescale for exponential success of angular
20970 deflection. It's another way to specify the strength
20971 of the vehicle's tendency to reorient itself so that it's
20972 preferred axis of motion agrees with it's true
20973 velocity.</P
20974></DD
20975><DT
20976><A
20977HREF="#AEN938"
20978>VEHICLE_VERTICAL_ATTRACTION_EFFICIENCY</A
20979></DT
20980><DD
20981><P
20982>A slider between minimum (0.0 = wobbly) and
20983 maximum (1.0 = firm as possible) stability of the vehicle to keep
20984 itself upright.</P
20985></DD
20986><DT
20987><A
20988HREF="#AEN938"
20989>VEHICLE_VERTICAL_ATTRACTION_TIMESCALE</A
20990></DT
20991><DD
20992><P
20993>The period of wobble, or timescale for exponential
20994 approach, of the vehicle to rotate such that it's preferred
20995 "up" axis is oriented along the world's "up"
20996 axis.</P
20997></DD
20998><DT
20999><A
21000HREF="#AEN949"
21001>VEHICLE_BANKING_EFFICIENCY</A
21002></DT
21003><DD
21004><P
21005>A slider between anti (-1.0), none (0.0), and
21006 maximum (1.0) banking strength.</P
21007></DD
21008><DT
21009><A
21010HREF="#AEN949"
21011>VEHICLE_BANKING_MIX</A
21012></DT
21013><DD
21014><P
21015>A slider between static (0.0) and dynamic (1.0)
21016 banking. "Static" means the banking scales only with the
21017 angle of roll, whereas "dynamic" is a term that also
21018 scales with the vehicle's linear speed.</P
21019></DD
21020><DT
21021><A
21022HREF="#AEN949"
21023>VEHICLE_BANKING_TIMESCALE</A
21024></DT
21025><DD
21026><P
21027>The timescale for banking to exponentially
21028 approach it's maximum effect. This is another way to scale the
21029 strength of the banking effect, however it affects the term that
21030 is proportional to the difference between what the banking
21031 behavior is trying to do, and what the vehicle is actually
21032 doing.</P
21033></DD
21034><DT
21035><A
21036HREF="#AEN990"
21037>VEHICLE_REFERENCE_FRAME</A
21038></DT
21039><DD
21040><P
21041>A rotation of the vehicle's preferred axes of
21042 motion and orientation (at, left, up) with respect to the
21043 vehicle's local frame (x, y, z).</P
21044></DD
21045></DL
21046></DIV
21047></DIV
21048><DIV
21049CLASS="section"
21050><HR><H2
21051CLASS="section"
21052><A
21053NAME="AEN6231"
21054>C.25. Vehicle Flags</A
21055></H2
21056><P
21057></P
21058><DIV
21059CLASS="variablelist"
21060><P
21061><B
21062>Flags</B
21063></P
21064><DL
21065><DT
21066><A
21067NAME="const_vehicle_flag_no_deflection_up"
21068></A
21069>VEHICLE_FLAG_NO_DEFLECTION_UP</DT
21070><DD
21071><P
21072>This flag prevents
21073 <A
21074HREF="#vehicle_linear_deflection"
21075>linear deflection</A
21076>
21077 parallel to world z-axis. This is useful for preventing ground
21078 vehicles with large linear deflection, like bumper cars, from climbing
21079 their linear deflection into the sky.</P
21080></DD
21081><DT
21082><A
21083NAME="const_vehicle_flag_limit_roll_only"
21084></A
21085>VEHICLE_FLAG_LIMIT_ROLL_ONLY</DT
21086><DD
21087><P
21088>For vehicles with
21089 <A
21090HREF="#AEN938"
21091>vertical attractor</A
21092>
21093 that want to be able to climb/dive, for instance, airplanes that want
21094 to use the <A
21095HREF="#AEN949"
21096>banking</A
21097>
21098 feature.</P
21099></DD
21100><DT
21101><A
21102NAME="const_vehicle_flag_hover_water_only"
21103></A
21104>VEHICLE_FLAG_HOVER_WATER_ONLY</DT
21105><DD
21106><P
21107>Ignore terrain height when
21108 <A
21109HREF="#AEN979"
21110>hovering</A
21111>.</P
21112></DD
21113><DT
21114><A
21115NAME="const_vehicle_flag_hover_terrain_only"
21116></A
21117>VEHICLE_FLAG_HOVER_TERRAIN_ONLY</DT
21118><DD
21119><P
21120>Ignore water height when
21121 <A
21122HREF="#AEN979"
21123>hovering</A
21124>.</P
21125></DD
21126><DT
21127><A
21128NAME="const_vehicle_flag_hover_global_height"
21129></A
21130>VEHICLE_FLAG_HOVER_GLOBAL_HEIGHT</DT
21131><DD
21132><P
21133><A
21134HREF="#AEN979"
21135>Hover</A
21136> at
21137 global height instead of height above ground or water.</P
21138></DD
21139><DT
21140><A
21141NAME="const_vehicle_flag_hover_up_only"
21142></A
21143>VEHICLE_FLAG_HOVER_UP_ONLY</DT
21144><DD
21145><P
21146><A
21147HREF="#AEN979"
21148>Hover</A
21149> doesn't
21150 push down. Use this flag for hovering
21151 vehicles that should be able to jump above their
21152 <A
21153HREF="#vehicle_hover_height"
21154>hover height</A
21155>.
21156 </P
21157></DD
21158><DT
21159>VEHICLE_FLAG_LIMIT_MOTOR_UP</DT
21160><DD
21161><P
21162>Prevents ground vehicles from motoring into the
21163 sky. This flag has a subtle effect when used with conjunction
21164 with <A
21165HREF="#AEN949"
21166>banking</A
21167>: the strength
21168 of the banking will decay when the vehicle no longer experiences
21169 collisions. The decay timescale is the same as
21170 <A
21171HREF="#vehicle_banking_timescale"
21172>VEHICLE_BANKING_TIMESCALE
21173 </A
21174>. This is to help prevent ground vehicles from steering
21175 when they are in mid jump.
21176 </P
21177></DD
21178><DT
21179><A
21180NAME="const_vehicle_flag_mouselook_steer"
21181></A
21182>VEHICLE_FLAG_MOUSELOOK_STEER</DT
21183><DD
21184><P
21185>Steer the vehicle using the mouse. Use this
21186 flag to make the angular motor try to make the vehicle
21187 turn such that its <A
21188HREF="#vehicle_roll_pitch_yaw"
21189>local
21190 x-axis</A
21191> points in the same direction as
21192 the client-side camera.</P
21193></DD
21194><DT
21195><A
21196NAME="const_vehicle_flag_mouselook_bank"
21197></A
21198>VEHICLE_FLAG_MOUSELOOK_BANK</DT
21199><DD
21200><P
21201>Same as above, but relies on
21202 <A
21203HREF="#AEN949"
21204>banking</A
21205>. It remaps
21206 left-right motions of the client camera (also known as "yaw") to
21207 rotations about the vehicle's <A
21208HREF="#vehicle_roll_pitch_yaw"
21209>&#13; local x-axis</A
21210>.
21211 </P
21212></DD
21213><DT
21214><A
21215NAME="const_vehicle_flag_camera_decoupled"
21216></A
21217>VEHICLE_FLAG_CAMERA_DECOUPLED</DT
21218><DD
21219><P
21220>Makes mouselook camera rotate independently of
21221 the vehicle. By default the client mouselook camera will rotate
21222 about with the vehicle, however when this flag is set the camera
21223 direction is independent of the vehicle's rotation.
21224 </P
21225></DD
21226></DL
21227></DIV
21228></DIV
21229><DIV
21230CLASS="section"
21231><HR><H2
21232CLASS="section"
21233><A
21234NAME="AEN6288"
21235>C.26. Vehicle Types</A
21236></H2
21237><P
21238></P
21239><DIV
21240CLASS="variablelist"
21241><P
21242><B
21243>Types</B
21244></P
21245><DL
21246><DT
21247>VEHICLE_TYPE_SLED</DT
21248><DD
21249><P
21250>Simple vehicle that bumps along the ground, and likes to move along
21251 it's local x-axis.</P
21252><DIV
21253CLASS="informalexample"
21254><P
21255></P
21256><A
21257NAME="AEN6296"
21258></A
21259><PRE
21260CLASS="programlisting"
21261>&#13;// most friction for left-right, least for up-down
21262llSetVehicleVectorParam( VEHICLE_LINEAR_FRICTION_TIMESCALE, &#60;30, 1, 1000&#62; );
21263
21264// no angular friction
21265llSetVehicleVectorParam( VEHICLE_ANGULAR_FRICTION_TIMESCALE, &#60;1000, 1000, 1000&#62; );
21266
21267// no linear motor
21268llSetVehicleVectorParam( VEHICLE_LINEAR_MOTOR_DIRECTION, &#60;0, 0, 0&#62; );
21269llSetVehicleFloatParam( VEHICLE_LINEAR_MOTOR_TIMESCALE, 1000 );
21270llSetVehicleFloatParam( VEHICLE_LINEAR_MOTOR_DECAY_TIMESCALE, 120 );
21271
21272// no angular motor
21273llSetVehicleVectorParam( VEHICLE_ANGULAR_MOTOR_DIRECTION, &#60;0, 0, 0&#62; );
21274llSetVehicleFloatParam( VEHICLE_ANGULAR_MOTOR_TIMESCALE, 1000 );
21275llSetVehicleFloatParam( VEHICLE_ANGULAR_MOTOR_DECAY_TIMESCALE, 120 );
21276
21277// no hover (but with timescale of 10 sec if enabled)
21278llSetVehicleFloatParam( VEHICLE_HOVER_HEIGHT, 0 );
21279llSetVehicleFloatParam( VEHICLE_HOVER_EFFICIENCY, 10 );
21280llSetVehicleFloatParam( VEHICLE_HOVER_TIMESCALE, 10 );
21281llSetVehicleFloatParam( VEHICLE_BUOYANCY, 0 );
21282
21283// maximum linear deflection with timescale of 1 second
21284llSetVehicleFloatParam( VEHICLE_LINEAR_DEFLECTION_EFFICIENCY, 1 );
21285llSetVehicleFloatParam( VEHICLE_LINEAR_DEFLECTION_TIMESCALE, 1 );
21286
21287// no angular deflection
21288llSetVehicleFloatParam( VEHICLE_ANGULAR_DEFLECTION_EFFICIENCY, 0 );
21289llSetVehicleFloatParam( VEHICLE_ANGULAR_DEFLECTION_TIMESCALE, 10 );
21290
21291// no vertical attractor (doesn't mind flipping over)
21292llSetVehicleFloatParam( VEHICLE_VERTICAL_ATTRACTION_EFFICIENCY, 1 );
21293llSetVehicleFloatParam( VEHICLE_VERTICAL_ATTRACTION_TIMESCALE, 1000 );
21294
21295// no banking
21296llSetVehicleFloatParam( VEHICLE_BANKING_EFFICIENCY, 0 );
21297llSetVehicleFloatParam( VEHICLE_BANKING_MIX, 1 );
21298llSetVehicleFloatParam( VEHICLE_BANKING_TIMESCALE, 10 );
21299
21300// default rotation of local frame
21301llSetVehicleRotationParam( VEHICLE_REFERENCE_FRAME, &#60;0, 0, 0, 1&#62; );
21302
21303// remove these flags
21304llRemoveVehicleFlags( VEHICLE_FLAG_HOVER_WATER_ONLY
21305 | VEHICLE_FLAG_HOVER_TERRAIN_ONLY
21306 | VEHICLE_FLAG_HOVER_GLOBAL_HEIGHT
21307 | VEHICLE_FLAG_HOVER_UP_ONLY );
21308
21309// set these flags (the limit_roll flag will have no effect
21310// until banking is enabled, if ever)
21311llSetVehicleFlags( VEHICLE_FLAG_NO_DEFLECTION_UP
21312 | VEHICLE_FLAG_LIMIT_ROLL_ONLY
21313 | VEHICLE_FLAG_LIMIT_MOTOR_UP );
21314 </PRE
21315><P
21316></P
21317></DIV
21318></DD
21319><DT
21320>VEHICLE_TYPE_CAR</DT
21321><DD
21322><P
21323>Another vehicle that bounces along the ground but
21324 needs the motors to be driven from external controls or <A
21325HREF="#AEN5211"
21326>timer</A
21327> events.</P
21328><DIV
21329CLASS="informalexample"
21330><P
21331></P
21332><A
21333NAME="AEN6303"
21334></A
21335><PRE
21336CLASS="programlisting"
21337>&#13;// most friction for left-right, least for up-down
21338llSetVehicleVectorParam( VEHICLE_LINEAR_FRICTION_TIMESCALE, &#60;100, 2, 1000&#62; );
21339
21340// no angular friction
21341llSetVehicleVectorParam( VEHICLE_ANGULAR_FRICTION_TIMESCALE, &#60;1000, 1000, 1000&#62; );
21342
21343// linear motor wins after about a second, decays after about a minute
21344llSetVehicleVectorParam( VEHICLE_LINEAR_MOTOR_DIRECTION, &#60;0, 0, 0&#62; );
21345llSetVehicleFloatParam( VEHICLE_LINEAR_MOTOR_TIMESCALE, 1 );
21346llSetVehicleFloatParam( VEHICLE_LINEAR_MOTOR_DECAY_TIMESCALE, 60 );
21347
21348// angular motor wins after a second, decays in less time than that
21349llSetVehicleVectorParam( VEHICLE_ANGULAR_MOTOR_DIRECTION, &#60;0, 0, 0&#62; );
21350llSetVehicleFloatParam( VEHICLE_ANGULAR_MOTOR_TIMESCALE, 1 );
21351llSetVehicleFloatParam( VEHICLE_ANGULAR_MOTOR_DECAY_TIMESCALE, 0.8 );
21352
21353// no hover
21354llSetVehicleFloatParam( VEHICLE_HOVER_HEIGHT, 0 );
21355llSetVehicleFloatParam( VEHICLE_HOVER_EFFICIENCY, 0 );
21356llSetVehicleFloatParam( VEHICLE_HOVER_TIMESCALE, 1000 );
21357llSetVehicleFloatParam( VEHICLE_BUOYANCY, 0 );
21358
21359// maximum linear deflection with timescale of 2 seconds
21360llSetVehicleFloatParam( VEHICLE_LINEAR_DEFLECTION_EFFICIENCY, 1 );
21361llSetVehicleFloatParam( VEHICLE_LINEAR_DEFLECTION_TIMESCALE, 2 );
21362
21363// no angular deflection
21364llSetVehicleFloatParam( VEHICLE_ANGULAR_DEFLECTION_EFFICIENCY, 0 );
21365llSetVehicleFloatParam( VEHICLE_ANGULAR_DEFLECTION_TIMESCALE, 10 );
21366
21367// critically damped vertical attractor
21368llSetVehicleFloatParam( VEHICLE_VERTICAL_ATTRACTION_EFFICIENCY, 1 );
21369llSetVehicleFloatParam( VEHICLE_VERTICAL_ATTRACTION_TIMESCALE, 10 );
21370
21371// weak negative critically damped banking
21372llSetVehicleFloatParam( VEHICLE_BANKING_EFFICIENCY, -0.2 );
21373llSetVehicleFloatParam( VEHICLE_BANKING_MIX, 1 );
21374llSetVehicleFloatParam( VEHICLE_BANKING_TIMESCALE, 1 );
21375
21376// default rotation of local frame
21377llSetVehicleRotationParam( VEHICLE_REFERENCE_FRAME, &#60;0, 0, 0, 1&#62; );
21378
21379// remove these flags
21380llRemoveVehicleFlags( VEHICLE_FLAG_HOVER_WATER_ONLY
21381 | VEHICLE_FLAG_HOVER_TERRAIN_ONLY
21382 | VEHICLE_FLAG_HOVER_GLOBAL_HEIGHT);
21383
21384// set these flags
21385llSetVehicleFlags( VEHICLE_FLAG_NO_DEFLECTION_UP
21386 | VEHICLE_FLAG_LIMIT_ROLL_ONLY
21387 | VEHICLE_FLAG_HOVER_UP_ONLY
21388 | VEHICLE_FLAG_LIMIT_MOTOR_UP );
21389 </PRE
21390><P
21391></P
21392></DIV
21393></DD
21394><DT
21395>VEHICLE_TYPE_BOAT</DT
21396><DD
21397><P
21398>Hovers over water with lots of friction and some angular deflection.</P
21399><DIV
21400CLASS="informalexample"
21401><P
21402></P
21403><A
21404NAME="AEN6309"
21405></A
21406><PRE
21407CLASS="programlisting"
21408>&#13;// least for forward-back, most friction for up-down
21409llSetVehicleVectorParam( VEHICLE_LINEAR_FRICTION_TIMESCALE, &#60;10, 3, 2&#62; );
21410
21411// uniform angular friction (setting it as a scalar rather than a vector)
21412llSetVehicleFloatParam( VEHICLE_ANGULAR_FRICTION_TIMESCALE, 10 );
21413
21414// linear motor wins after about five seconds, decays after about a minute
21415llSetVehicleVectorParam( VEHICLE_LINEAR_MOTOR_DIRECTION, &#60;0, 0, 0&#62; );
21416llSetVehicleFloatParam( VEHICLE_LINEAR_MOTOR_TIMESCALE, 5 );
21417llSetVehicleFloatParam( VEHICLE_LINEAR_MOTOR_DECAY_TIMESCALE, 60 );
21418
21419// angular motor wins after four seconds, decays in same amount of time
21420llSetVehicleVectorParam( VEHICLE_ANGULAR_MOTOR_DIRECTION, &#60;0, 0, 0&#62; );
21421llSetVehicleFloatParam( VEHICLE_ANGULAR_MOTOR_TIMESCALE, 4 );
21422llSetVehicleFloatParam( VEHICLE_ANGULAR_MOTOR_DECAY_TIMESCALE, 4 );
21423
21424// hover
21425llSetVehicleFloatParam( VEHICLE_HOVER_HEIGHT, 0 );
21426llSetVehicleFloatParam( VEHICLE_HOVER_EFFICIENCY, 0.5 );
21427llSetVehicleFloatParam( VEHICLE_HOVER_TIMESCALE, 2.0 );
21428llSetVehicleFloatParam( VEHICLE_BUOYANCY, 1 );
21429
21430// halfway linear deflection with timescale of 3 seconds
21431llSetVehicleFloatParam( VEHICLE_LINEAR_DEFLECTION_EFFICIENCY, 0.5 );
21432llSetVehicleFloatParam( VEHICLE_LINEAR_DEFLECTION_TIMESCALE, 3 );
21433
21434// angular deflection
21435llSetVehicleFloatParam( VEHICLE_ANGULAR_DEFLECTION_EFFICIENCY, 0.5 );
21436llSetVehicleFloatParam( VEHICLE_ANGULAR_DEFLECTION_TIMESCALE, 5 );
21437
21438// somewhat bouncy vertical attractor
21439llSetVehicleFloatParam( VEHICLE_VERTICAL_ATTRACTION_EFFICIENCY, 0.5 );
21440llSetVehicleFloatParam( VEHICLE_VERTICAL_ATTRACTION_TIMESCALE, 5 );
21441
21442// weak negative damped banking
21443llSetVehicleFloatParam( VEHICLE_BANKING_EFFICIENCY, -0.3 );
21444llSetVehicleFloatParam( VEHICLE_BANKING_MIX, 0.8 );
21445llSetVehicleFloatParam( VEHICLE_BANKING_TIMESCALE, 1 );
21446
21447// default rotation of local frame
21448llSetVehicleRotationParam( VEHICLE_REFERENCE_FRAME, &#60;0, 0, 0, 1&#62; );
21449
21450// remove these flags
21451llRemoveVehicleFlags( VEHICLE_FLAG_HOVER_TERRAIN_ONLY
21452 | VEHICLE_FLAG_LIMIT_ROLL_ONLY
21453 | VEHICLE_FLAG_HOVER_GLOBAL_HEIGHT);
21454
21455// set these flags
21456llSetVehicleFlags( VEHICLE_FLAG_NO_DEFLECTION_UP
21457 | VEHICLE_FLAG_HOVER_WATER_ONLY
21458 | VEHICLE_FLAG_HOVER_UP_ONLY
21459 | VEHICLE_FLAG_LIMIT_MOTOR_UP );
21460 </PRE
21461><P
21462></P
21463></DIV
21464></DD
21465><DT
21466>VEHICLE_TYPE_AIRPLANE</DT
21467><DD
21468><P
21469>Uses linear deflection for lift, no hover, and banking to turn.</P
21470><DIV
21471CLASS="informalexample"
21472><P
21473></P
21474><A
21475NAME="AEN6315"
21476></A
21477><PRE
21478CLASS="programlisting"
21479>&#13;// very little friction along forward-back axis
21480llSetVehicleVectorParam( VEHICLE_LINEAR_FRICTION_TIMESCALE, &#60;200, 10, 5&#62; );
21481
21482// uniform angular friction
21483llSetVehicleFloatParam( VEHICLE_ANGULAR_FRICTION_TIMESCALE, 20 );
21484
21485// linear motor
21486llSetVehicleVectorParam( VEHICLE_LINEAR_MOTOR_DIRECTION, &#60;0, 0, 0&#62; );
21487llSetVehicleFloatParam( VEHICLE_LINEAR_MOTOR_TIMESCALE, 2 );
21488llSetVehicleFloatParam( VEHICLE_LINEAR_MOTOR_DECAY_TIMESCALE, 60 );
21489
21490// angular motor
21491llSetVehicleVectorParam( VEHICLE_ANGULAR_MOTOR_DIRECTION, &#60;0, 0, 0&#62; );
21492llSetVehicleFloatParam( VEHICLE_ANGULAR_MOTOR_TIMESCALE, 4 );
21493llSetVehicleFloatParam( VEHICLE_ANGULAR_MOTOR_DECAY_TIMESCALE, 8 );
21494
21495// no hover
21496llSetVehicleFloatParam( VEHICLE_HOVER_HEIGHT, 0 );
21497llSetVehicleFloatParam( VEHICLE_HOVER_EFFICIENCY, 0.5 );
21498llSetVehicleFloatParam( VEHICLE_HOVER_TIMESCALE, 1000 );
21499llSetVehicleFloatParam( VEHICLE_BUOYANCY, 0 );
21500
21501// linear deflection
21502llSetVehicleFloatParam( VEHICLE_LINEAR_DEFLECTION_EFFICIENCY, 0.5 );
21503llSetVehicleFloatParam( VEHICLE_LINEAR_DEFLECTION_TIMESCALE, 0.5 );
21504
21505// angular deflection
21506llSetVehicleFloatParam( VEHICLE_ANGULAR_DEFLECTION_EFFICIENCY, 1.0 );
21507llSetVehicleFloatParam( VEHICLE_ANGULAR_DEFLECTION_TIMESCALE, 2.0 );
21508
21509// vertical attractor
21510llSetVehicleFloatParam( VEHICLE_VERTICAL_ATTRACTION_EFFICIENCY, 0.9 );
21511llSetVehicleFloatParam( VEHICLE_VERTICAL_ATTRACTION_TIMESCALE, 2 );
21512
21513// banking
21514llSetVehicleFloatParam( VEHICLE_BANKING_EFFICIENCY, 1 );
21515llSetVehicleFloatParam( VEHICLE_BANKING_MIX, 0.7 );
21516llSetVehicleFloatParam( VEHICLE_BANKING_TIMESCALE, 2 );
21517
21518// default rotation of local frame
21519llSetVehicleRotationParam( VEHICLE_REFERENCE_FRAME, &#60;0, 0, 0, 1&#62; );
21520
21521// remove these flags
21522llRemoveVehicleFlags( VEHICLE_FLAG_NO_DEFLECTION_UP
21523 | VEHICLE_FLAG_HOVER_WATER_ONLY
21524 | VEHICLE_FLAG_HOVER_TERRAIN_ONLY
21525 | VEHICLE_FLAG_HOVER_GLOBAL_HEIGHT
21526 | VEHICLE_FLAG_HOVER_UP_ONLY
21527 | VEHICLE_FLAG_LIMIT_MOTOR_UP );
21528
21529// set these flags
21530llSetVehicleFlags( VEHICLE_FLAG_LIMIT_ROLL_ONLY );
21531 </PRE
21532><P
21533></P
21534></DIV
21535></DD
21536><DT
21537>VEHICLE_TYPE_BALLOON</DT
21538><DD
21539><P
21540>Hover, and friction, but no deflection.</P
21541><DIV
21542CLASS="informalexample"
21543><P
21544></P
21545><A
21546NAME="AEN6321"
21547></A
21548><PRE
21549CLASS="programlisting"
21550>&#13;// uniform linear friction
21551llSetVehicleFloatParam( VEHICLE_LINEAR_FRICTION_TIMESCALE, 5 );
21552
21553// uniform angular friction
21554llSetVehicleFloatParam( VEHICLE_ANGULAR_FRICTION_TIMESCALE, 10 );
21555
21556// linear motor
21557llSetVehicleVectorParam( VEHICLE_LINEAR_MOTOR_DIRECTION, &#60;0, 0, 0&#62; );
21558llSetVehicleFloatParam( VEHICLE_LINEAR_MOTOR_TIMESCALE, 5 );
21559llSetVehicleFloatParam( VEHICLE_LINEAR_MOTOR_DECAY_TIMESCALE, 60 );
21560
21561// angular motor
21562llSetVehicleVectorParam( VEHICLE_ANGULAR_MOTOR_DIRECTION, &#60;0, 0, 0&#62; );
21563llSetVehicleFloatParam( VEHICLE_ANGULAR_MOTOR_TIMESCALE, 6 );
21564llSetVehicleFloatParam( VEHICLE_ANGULAR_MOTOR_DECAY_TIMESCALE, 10 );
21565
21566// hover
21567llSetVehicleFloatParam( VEHICLE_HOVER_HEIGHT, 5 );
21568llSetVehicleFloatParam( VEHICLE_HOVER_EFFICIENCY, 0.8 );
21569llSetVehicleFloatParam( VEHICLE_HOVER_TIMESCALE, 10 );
21570llSetVehicleFloatParam( VEHICLE_BUOYANCY, 1 );
21571
21572// no linear deflection
21573llSetVehicleFloatParam( VEHICLE_LINEAR_DEFLECTION_EFFICIENCY, 0 );
21574llSetVehicleFloatParam( VEHICLE_LINEAR_DEFLECTION_TIMESCALE, 5 );
21575
21576// no angular deflection
21577llSetVehicleFloatParam( VEHICLE_ANGULAR_DEFLECTION_EFFICIENCY, 0 );
21578llSetVehicleFloatParam( VEHICLE_ANGULAR_DEFLECTION_TIMESCALE, 5 );
21579
21580// no vertical attractor
21581llSetVehicleFloatParam( VEHICLE_VERTICAL_ATTRACTION_EFFICIENCY, 1 );
21582llSetVehicleFloatParam( VEHICLE_VERTICAL_ATTRACTION_TIMESCALE, 1000 );
21583
21584// no banking
21585llSetVehicleFloatParam( VEHICLE_BANKING_EFFICIENCY, 0 );
21586llSetVehicleFloatParam( VEHICLE_BANKING_MIX, 0.7 );
21587llSetVehicleFloatParam( VEHICLE_BANKING_TIMESCALE, 5 );
21588
21589// default rotation of local frame
21590llSetVehicleRotationParam( VEHICLE_REFERENCE_FRAME, &#60;0, 0, 0, 1&#62; );
21591
21592// remove all flags
21593llRemoveVehicleFlags( VEHICLE_FLAG_NO_DEFLECTION_UP
21594 | VEHICLE_FLAG_HOVER_WATER_ONLY
21595 | VEHICLE_FLAG_LIMIT_ROLL_ONLY
21596 | VEHICLE_FLAG_HOVER_TERRAIN_ONLY
21597 | VEHICLE_FLAG_HOVER_GLOBAL_HEIGHT
21598 | VEHICLE_FLAG_HOVER_UP_ONLY
21599 | VEHICLE_FLAG_LIMIT_MOTOR_UP );
21600 </PRE
21601><P
21602></P
21603></DIV
21604></DD
21605></DL
21606></DIV
21607></DIV
21608><DIV
21609CLASS="section"
21610><HR><H2
21611CLASS="section"
21612><A
21613NAME="AEN6323"
21614>C.27. Primitive Constants</A
21615></H2
21616><P
21617>These constants are used in calls to the <A
21618HREF="#AEN4020"
21619>llSetPrimitiveParams</A
21620> and <A
21621HREF="#AEN2075"
21622>llGetPrimitiveParams</A
21623> api to
21624 specify parameters.</P
21625><P
21626></P
21627><DIV
21628CLASS="variablelist"
21629><P
21630><B
21631>Primitive Parameters</B
21632></P
21633><DL
21634><DT
21635>PRIM_TYPE</DT
21636><DD
21637><P
21638>This allows the various primitive shape parameters to be controlled. PRIM_TYPE must be followed by
21639 appropriate arguments based on which type is selected.</P
21640><P
21641></P
21642><DIV
21643CLASS="variablelist"
21644><P
21645><B
21646>PRIM_TYPE Values</B
21647></P
21648><DL
21649><DT
21650>PRIM_TYPE_BOX</DT
21651><DD
21652><P
21653>Sets the primitive to a box, followed by integer hole shape, vector cut, float hollow, vector twist, vector top size, and vector top shear.</P
21654></DD
21655><DT
21656>PRIM_TYPE_CYLINDER</DT
21657><DD
21658><P
21659>Sets the primitive to a cylinder, followed by integer hole shape, vector cut, float hollow, vector twist, vector top size, and vector top shear.</P
21660></DD
21661><DT
21662>PRIM_TYPE_PRISM</DT
21663><DD
21664><P
21665>Sets the primitive to a prism, followed by integer hole shape, vector cut, float hollow, vector twist, vector top size, and vector top shear.</P
21666></DD
21667><DT
21668>PRIM_TYPE_SPHERE</DT
21669><DD
21670><P
21671>Sets the primitive to a sphere, followed by integer hole shape, vector cut, float hollow, vector twist, and vector dimple.</P
21672></DD
21673><DT
21674>PRIM_TYPE_TORUS</DT
21675><DD
21676><P
21677>Sets the primitive to a torus, followed by integer hole shape, vector cut, float hollow, vector twist, vector hole size, vector top shear, vector advanced cut, vector taper, float revolutions, float radius offset, and float skew.</P
21678></DD
21679><DT
21680>PRIM_TYPE_TUBE</DT
21681><DD
21682><P
21683>Sets the primitive to a tube, followed by integer hole shape, vector cut, float hollow, vector twist, vector hole size, vector top shear, vector advanced cut, vector taper, float revolutions, float radius offset, and float skew.</P
21684></DD
21685><DT
21686>PRIM_TYPE_RING</DT
21687><DD
21688><P
21689>Sets the primitive to a ring, followed by integer hole shape, vector cut, float hollow, vector twist, vector hole size, vector top shear, vector advanced cut, vector taper, float revolutions, float radius offset, and float skew.</P
21690></DD
21691></DL
21692></DIV
21693><P
21694>Choose hole shape from one of PRIM_HOLE_DEFAULT, PRIM_HOLE_CIRCLE, PRIM_HOLE_SQUARE, or PRIM_HOLE_TRIANGLE.</P
21695></DD
21696><DT
21697>PRIM_MATERIAL</DT
21698><DD
21699><P
21700>Choose material from one of PRIM_MATERIAL_STONE, PRIM_MATERIAL_METAL, PRIM_MATERIAL_GLASS,
21701 PRIM_MATERIAL_WOOD, PRIM_MATERIAL_FLESH, PRIM_MATERIAL_PLASTIC, PRIM_MATERIAL_RUBBER, or PRIM_MATERIAL_LIGHT.</P
21702></DD
21703><DT
21704>PRIM_PHYSICS</DT
21705><DD
21706><P
21707>Set physics to TRUE or FALSE.</P
21708></DD
21709><DT
21710>PRIM_TEMP_ON_REZ</DT
21711><DD
21712><P
21713>Set temporary on rez to TRUE or FALSE.</P
21714></DD
21715><DT
21716>PRIM_PHANTOM</DT
21717><DD
21718><P
21719>Set phantom to TRUE or FALSE.</P
21720></DD
21721><DT
21722>PRIM_POSITION</DT
21723><DD
21724><P
21725>Sets the position with a vector.</P
21726></DD
21727><DT
21728>PRIM_SIZE</DT
21729><DD
21730><P
21731>Sets the size with a vector.</P
21732></DD
21733><DT
21734>PRIM_ROTATION</DT
21735><DD
21736><P
21737>Sets the rotation with a rotation.</P
21738></DD
21739><DT
21740>PRIM_TEXTURE</DT
21741><DD
21742><P
21743>Followed by an integer face, key id, vector repeats, vector offsets, and float rotation in radians.</P
21744></DD
21745><DT
21746>PRIM_COLOR</DT
21747><DD
21748><P
21749>Followed by an integer face, vector color, and float alpha.</P
21750></DD
21751><DT
21752>PRIM_BUMP_SHINY</DT
21753><DD
21754><P
21755>Followed by an integer face, one of PRIM_SHINY_NONE, PRIM_SHINY_LOW, PRIM_SHINY_MEDIUM, or PRIM_SHINY_HIGH,
21756 and one of PRIM_BUMP_NONE, PRIM_BUMP_BRIGHT, PRIM_BUMP_DARK, PRIM_BUMP_WOOD, PRIM_BUMP_BARK,
21757 PRIM_BUMP_BRICKS, PRIM_BUMP_CHECKER, PRIM_BUMP_CONCRETE, PRIM_BUMP_TILE, PRIM_BUMP_STONE, PRIM_BUMP_DISKS,
21758 PRIM_BUMP_GRAVEL, PRIM_BUMP_BLOBS, PRIM_BUMP_SIDING, PRIM_BUMP_LARGETILE, PRIM_BUMP_STUCCO, PRIM_BUMP_SUCTION,
21759 or PRIM_BUMP_WEAVE.</P
21760></DD
21761><DT
21762>PRIM_GLOW</DT
21763><DD
21764><P
21765>Followed by an integer face and a float glow value (in range 0.0 to 1.0).</P
21766></DD
21767></DL
21768></DIV
21769></DIV
21770><DIV
21771CLASS="section"
21772><HR><H2
21773CLASS="section"
21774><A
21775NAME="AEN6409"
21776>C.28. XML-RPC Constants</A
21777></H2
21778><P
21779>These constants are passed to the remote_data event: REMOTE_DATA_CHANNEL, REMOTE_DATA_REQUEST, and REMOTE_DATA_REPLY.</P
21780></DIV
21781><DIV
21782CLASS="section"
21783><HR><H2
21784CLASS="section"
21785><A
21786NAME="AEN6412"
21787>C.29. Permission Mask Constants</A
21788></H2
21789><P
21790>These MASK_* constants are used as arguments to <A
21791HREF="#AEN2009"
21792>llGetObjectPermMask</A
21793> and <A
21794HREF="#AEN1801"
21795>llGetInventoryPermMask</A
21796>. These functions return combinations of PERM_* constants.</P
21797><P
21798></P
21799><DIV
21800CLASS="variablelist"
21801><P
21802><B
21803>Mask and Permission Constants</B
21804></P
21805><DL
21806><DT
21807>MASK_BASE</DT
21808><DD
21809><P
21810>Specifies base permissions. These permissions are identical to owner permissions except in the case that the object is locked. When an object is locked, owner permissions are stripped of move/modify rights (thus, the 'locking'). On unlock, owner permissions revert back to base permissions.</P
21811></DD
21812><DT
21813>MASK_OWNER</DT
21814><DD
21815><P
21816>Specifies owner permissions. These are never more permissive than base permissions.</P
21817></DD
21818><DT
21819>MASK_GROUP</DT
21820><DD
21821><P
21822>Specifies group permissions. These are never more permissive than owner permissions.</P
21823></DD
21824><DT
21825>MASK_EVERYONE</DT
21826><DD
21827><P
21828>Specifies everyone permissions. These are never more permissive than owner permissions.</P
21829></DD
21830><DT
21831>MASK_NEXT</DT
21832><DD
21833><P
21834>Specifies next owner permissions. These are never more permissive than base permissions.</P
21835></DD
21836><DT
21837>PERM_MOVE</DT
21838><DD
21839><P
21840>Set if movement is allowed.</P
21841></DD
21842><DT
21843>PERM_MODIFY</DT
21844><DD
21845><P
21846>Set if modification is allowed.</P
21847></DD
21848><DT
21849>PERM_COPY</DT
21850><DD
21851><P
21852>Set if copying is allowed.</P
21853></DD
21854><DT
21855>PERM_TRANSFER</DT
21856><DD
21857><P
21858>Set if transfers are allowed.</P
21859></DD
21860><DT
21861>PERM_ALL</DT
21862><DD
21863><P
21864>This is returned if all other PERM_* are set.</P
21865></DD
21866></DL
21867></DIV
21868></DIV
21869><DIV
21870CLASS="section"
21871><HR><H2
21872CLASS="section"
21873><A
21874NAME="AEN6459"
21875>C.30. Parcel Media Constants</A
21876></H2
21877><P
21878>These constants are passed to the <A
21879HREF="#AEN3031"
21880>llParcelMediaCommand</A
21881> to control playback of movies and other multimedia within a land parcel.</P
21882><P
21883></P
21884><DIV
21885CLASS="variablelist"
21886><P
21887><B
21888>Parcel Media Constants</B
21889></P
21890><DL
21891><DT
21892>PARCEL_MEDIA_COMMAND_STOP</DT
21893><DD
21894><P
21895>Stop the media stream and go back to the first frame.</P
21896></DD
21897><DT
21898>PARCEL_MEDIA_COMMAND_PAUSE</DT
21899><DD
21900><P
21901>Pause the media stream (stop playing but stay on current frame).</P
21902></DD
21903><DT
21904>PARCEL_MEDIA_COMMAND_PLAY</DT
21905><DD
21906><P
21907>Start the media stream playing from the current frame and stop when the end is reached.</P
21908></DD
21909><DT
21910>PARCEL_MEDIA_COMMAND_LOOP_SET</DT
21911><DD
21912><P
21913>Used to get or set the parcel's media looping variable.
21914 </P
21915></DD
21916><DT
21917>PARCEL_MEDIA_COMMAND_TEXTURE</DT
21918><DD
21919><P
21920>Use this to get or set the parcel's media texture.
21921 </P
21922></DD
21923><DT
21924>PARCEL_MEDIA_COMMAND_URL</DT
21925><DD
21926><P
21927>Used to get or set the parcel's media url.
21928 </P
21929></DD
21930><DT
21931>PARCEL_MEDIA_COMMAND_TYPE</DT
21932><DD
21933><P
21934>Used to get or set the parcel's media mimetype.
21935 </P
21936></DD
21937><DT
21938>PARCEL_MEDIA_COMMAND_DESC</DT
21939><DD
21940><P
21941>Used to get or set the parcel's media description.
21942 </P
21943></DD
21944><DT
21945>PARCEL_MEDIA_COMMAND_SIZE</DT
21946><DD
21947><P
21948>Used to get or set the parcel's media pixel size.
21949 </P
21950></DD
21951><DT
21952>PARCEL_MEDIA_COMMAND_TIME</DT
21953><DD
21954><P
21955>Move a media stream to a specific time.
21956 </P
21957></DD
21958><DT
21959>PARCEL_MEDIA_COMMAND_AGENT</DT
21960><DD
21961><P
21962>Applies the media command to the specified agent only.
21963 </P
21964></DD
21965><DT
21966>PARCEL_MEDIA_COMMAND_UNLOAD</DT
21967><DD
21968><P
21969>Completely unloads the movie and restores the original texture.
21970 </P
21971></DD
21972><DT
21973>PARCEL_MEDIA_COMMAND_AUTO_ALIGN</DT
21974><DD
21975><P
21976>Sets the parcel option 'Auto scale content'.
21977 </P
21978></DD
21979><DT
21980>PARCEL_MEDIA_COMMAND_LOOP</DT
21981><DD
21982><P
21983>This command has been depricated in favor of the PARCEL_MEDIA_COMMAND_LOOP_SET above.
21984 </P
21985></DD
21986></DL
21987></DIV
21988></DIV
21989><DIV
21990CLASS="section"
21991><HR><H2
21992CLASS="section"
21993><A
21994NAME="AEN6521"
21995>C.31. Click Action Constants</A
21996></H2
21997><P
21998>These constants are passed to <A
21999HREF="#AEN3791"
22000>llSetClickAction</A
22001> to define default behavior when a resident clicks upon a prim.</P
22002><P
22003></P
22004><DIV
22005CLASS="variablelist"
22006><P
22007><B
22008>Click Action Constants</B
22009></P
22010><DL
22011><DT
22012>CLICK_ACTION_NONE</DT
22013><DD
22014><P
22015>Disables the click action for this prim.</P
22016></DD
22017><DT
22018>CLICK_ACTION_TOUCH</DT
22019><DD
22020><P
22021>Sets the click-action behavior of this prim to touch.</P
22022></DD
22023><DT
22024>CLICK_ACTION_SIT</DT
22025><DD
22026><P
22027>Sets the click-action behavior of this prim to sit.</P
22028></DD
22029><DT
22030>CLICK_ACTION_BUY</DT
22031><DD
22032><P
22033>Sets the click-action behavior of this prim to buy.</P
22034></DD
22035><DT
22036>CLICK_ACTION_PAY</DT
22037><DD
22038><P
22039>Sets the click-action behavior of this prim to pay.</P
22040></DD
22041><DT
22042>CLICK_ACTION_OPEN</DT
22043><DD
22044><P
22045>Sets the click-action behavior of this prim to open.</P
22046></DD
22047><DT
22048>CLICK_ACTION_PLAY</DT
22049><DD
22050><P
22051>Sets the click-action behavior of this prim to play.</P
22052></DD
22053><DT
22054>CLICK_ACTION_OPEN_MEDIA</DT
22055><DD
22056><P
22057>Sets the click-action behavior of this prim to open-media.</P
22058></DD
22059><DT
22060>CLICK_ACTION_SIT</DT
22061><DD
22062><P
22063>Sets the click-action behavior of this prim to sit.</P
22064></DD
22065><DT
22066>CLICK_ACTION_SIT</DT
22067><DD
22068><P
22069>Sets the click-action behavior of this prim to sit.</P
22070></DD
22071></DL
22072></DIV
22073></DIV
22074></DIV
22075></DIV
22076></BODY
22077></HTML
22078> \ No newline at end of file
diff --git a/linden/indra/newview/pipeline.cpp b/linden/indra/newview/pipeline.cpp
index f232fdf..81f1a90 100644
--- a/linden/indra/newview/pipeline.cpp
+++ b/linden/indra/newview/pipeline.cpp
@@ -330,8 +330,15 @@ void LLPipeline::init()
330 mRenderDebugFeatureMask = 0xffffffff; // All debugging features on 330 mRenderDebugFeatureMask = 0xffffffff; // All debugging features on
331 mRenderDebugMask = 0; // All debug starts off 331 mRenderDebugMask = 0; // All debug starts off
332 332
333 // Don't turn on ground when this is set
334 // Mac Books with intel 950s need this
335 if(!gSavedSettings.getBOOL("RenderGround"))
336 {
337 toggleRenderType(RENDER_TYPE_GROUND);
338 }
339
333 mOldRenderDebugMask = mRenderDebugMask; 340 mOldRenderDebugMask = mRenderDebugMask;
334 341
335 mBackfaceCull = TRUE; 342 mBackfaceCull = TRUE;
336 343
337 stop_glerror(); 344 stop_glerror();
@@ -454,7 +461,7 @@ void LLPipeline::resizeScreenTexture()
454 } 461 }
455 462
456 mScreen.release(); 463 mScreen.release();
457 mScreen.allocate(resX, resY, GL_RGBA, TRUE, GL_TEXTURE_RECTANGLE_ARB); 464 mScreen.allocate(resX, resY, GL_RGBA, TRUE, LLTexUnit::TT_RECT_TEXTURE);
458 465
459 llinfos << "RESIZED SCREEN TEXTURE: " << resX << "x" << resY << llendl; 466 llinfos << "RESIZED SCREEN TEXTURE: " << resX << "x" << resY << llendl;
460 } 467 }
@@ -556,7 +563,7 @@ void LLPipeline::createGLBuffers()
556 563
557 for (U32 j = 0; j < 3; j++) 564 for (U32 j = 0; j < 3; j++)
558 { 565 {
559 glBindTexture(GL_TEXTURE_CUBE_MAP_ARB, mBlurCubeTexture[j]); 566 gGL.getTexUnit(0)->bindManual(LLTexUnit::TT_CUBE_MAP, mBlurCubeTexture[j]);
560 glTexParameteri(GL_TEXTURE_CUBE_MAP_ARB, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 567 glTexParameteri(GL_TEXTURE_CUBE_MAP_ARB, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
561 glTexParameteri(GL_TEXTURE_CUBE_MAP_ARB, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 568 glTexParameteri(GL_TEXTURE_CUBE_MAP_ARB, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
562 glTexParameteri(GL_TEXTURE_CUBE_MAP_ARB, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 569 glTexParameteri(GL_TEXTURE_CUBE_MAP_ARB, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
@@ -583,10 +590,11 @@ void LLPipeline::createGLBuffers()
583 mGlow[i].allocate(512,glow_res,GL_RGBA,FALSE); 590 mGlow[i].allocate(512,glow_res,GL_RGBA,FALSE);
584 } 591 }
585 592
593
586 GLuint resX = gViewerWindow->getWindowDisplayWidth(); 594 GLuint resX = gViewerWindow->getWindowDisplayWidth();
587 GLuint resY = gViewerWindow->getWindowDisplayHeight(); 595 GLuint resY = gViewerWindow->getWindowDisplayHeight();
588 596
589 mScreen.allocate(resX, resY, GL_RGBA, TRUE, GL_TEXTURE_RECTANGLE_ARB); 597 mScreen.allocate(resX, resY, GL_RGBA, TRUE, LLTexUnit::TT_RECT_TEXTURE);
590 } 598 }
591} 599}
592 600
@@ -1212,7 +1220,7 @@ void LLPipeline::updateCull(LLCamera& camera, LLCullResult& result, S32 water_cl
1212 LLVertexBuffer::unbind(); 1220 LLVertexBuffer::unbind();
1213 LLGLDisable blend(GL_BLEND); 1221 LLGLDisable blend(GL_BLEND);
1214 LLGLDisable test(GL_ALPHA_TEST); 1222 LLGLDisable test(GL_ALPHA_TEST);
1215 LLViewerImage::unbindTexture(0, GL_TEXTURE_2D); 1223 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
1216 1224
1217 gGL.setColorMask(false, false); 1225 gGL.setColorMask(false, false);
1218 LLGLDepthTest depth(GL_TRUE, GL_FALSE); 1226 LLGLDepthTest depth(GL_TRUE, GL_FALSE);
@@ -1357,7 +1365,7 @@ void LLPipeline::doOcclusion(LLCamera& camera)
1357 } 1365 }
1358 LLGLDisable blend(GL_BLEND); 1366 LLGLDisable blend(GL_BLEND);
1359 LLGLDisable test(GL_ALPHA_TEST); 1367 LLGLDisable test(GL_ALPHA_TEST);
1360 LLViewerImage::unbindTexture(0, GL_TEXTURE_2D); 1368 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
1361 LLGLDepthTest depth(GL_TRUE, GL_FALSE); 1369 LLGLDepthTest depth(GL_TRUE, GL_FALSE);
1362 1370
1363 if (LLPipeline::sUseOcclusion > 1) 1371 if (LLPipeline::sUseOcclusion > 1)
@@ -2368,7 +2376,7 @@ void LLPipeline::renderGeom(LLCamera& camera, BOOL forceVBOUpdate)
2368 sUnderWaterRender = FALSE; 2376 sUnderWaterRender = FALSE;
2369 } 2377 }
2370 2378
2371 LLViewerImage::sDefaultImagep->bind(0); 2379 gGL.getTexUnit(0)->bind(LLViewerImage::sDefaultImagep);
2372 LLViewerImage::sDefaultImagep->setClamp(FALSE, FALSE); 2380 LLViewerImage::sDefaultImagep->setClamp(FALSE, FALSE);
2373 2381
2374 ////////////////////////////////////////////// 2382 //////////////////////////////////////////////
@@ -2604,11 +2612,11 @@ void LLPipeline::renderDebug()
2604 // Debug composition layers 2612 // Debug composition layers
2605 F32 x, y; 2613 F32 x, y;
2606 2614
2607 LLGLSNoTexture gls_no_texture; 2615 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
2608 2616
2609 if (gAgent.getRegion()) 2617 if (gAgent.getRegion())
2610 { 2618 {
2611 gGL.begin(LLVertexBuffer::POINTS); 2619 gGL.begin(LLRender::POINTS);
2612 // Draw the composition layer for the region that I'm in. 2620 // Draw the composition layer for the region that I'm in.
2613 for (x = 0; x <= 260; x++) 2621 for (x = 0; x <= 260; x++)
2614 { 2622 {
@@ -2654,6 +2662,7 @@ void LLPipeline::renderForSelect(std::set<LLViewerObject*>& objects, BOOL render
2654 2662
2655 LLGLSDefault gls_default; 2663 LLGLSDefault gls_default;
2656 LLGLSObjectSelect gls_object_select; 2664 LLGLSObjectSelect gls_object_select;
2665 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
2657 LLGLDepthTest gls_depth(GL_TRUE,GL_TRUE); 2666 LLGLDepthTest gls_depth(GL_TRUE,GL_TRUE);
2658 disableLights(); 2667 disableLights();
2659 2668
@@ -2665,6 +2674,18 @@ void LLPipeline::renderForSelect(std::set<LLViewerObject*>& objects, BOOL render
2665 LLGLState::checkClientArrays(); 2674 LLGLState::checkClientArrays();
2666 U32 last_type = 0; 2675 U32 last_type = 0;
2667 2676
2677 // If we don't do this, we crash something on changing graphics settings
2678 // from Medium -> Low, because we unload all the shaders and the
2679 // draw pools aren't aware. I don't know if this has to be a separate
2680 // loop before actual rendering. JC
2681 for (pool_set_t::iterator iter = mPools.begin(); iter != mPools.end(); ++iter)
2682 {
2683 LLDrawPool *poolp = *iter;
2684 if (poolp->isFacePool() && hasRenderType(poolp->getType()))
2685 {
2686 poolp->prerender();
2687 }
2688 }
2668 for (pool_set_t::iterator iter = mPools.begin(); iter != mPools.end(); ++iter) 2689 for (pool_set_t::iterator iter = mPools.begin(); iter != mPools.end(); ++iter)
2669 { 2690 {
2670 LLDrawPool *poolp = *iter; 2691 LLDrawPool *poolp = *iter;
@@ -3089,7 +3110,7 @@ void LLPipeline::setupAvatarLights(BOOL for_edit)
3089 camera_rot.invert(); 3110 camera_rot.invert();
3090 LLVector4 light_pos = light_pos_cam * camera_rot; 3111 LLVector4 light_pos = light_pos_cam * camera_rot;
3091 3112
3092 light_pos.normVec(); 3113 light_pos.normalize();
3093 3114
3094 mHWLightColors[1] = diffuse; 3115 mHWLightColors[1] = diffuse;
3095 glLightfv(GL_LIGHT1, GL_DIFFUSE, diffuse.mV); 3116 glLightfv(GL_LIGHT1, GL_DIFFUSE, diffuse.mV);
@@ -3107,7 +3128,7 @@ void LLPipeline::setupAvatarLights(BOOL for_edit)
3107 LLVector3 opposite_pos = -1.f * mSunDir; 3128 LLVector3 opposite_pos = -1.f * mSunDir;
3108 LLVector3 orthog_light_pos = mSunDir % LLVector3::z_axis; 3129 LLVector3 orthog_light_pos = mSunDir % LLVector3::z_axis;
3109 LLVector4 backlight_pos = LLVector4(lerp(opposite_pos, orthog_light_pos, 0.3f), 0.0f); 3130 LLVector4 backlight_pos = LLVector4(lerp(opposite_pos, orthog_light_pos, 0.3f), 0.0f);
3110 backlight_pos.normVec(); 3131 backlight_pos.normalize();
3111 3132
3112 LLColor4 light_diffuse = mSunDiffuse; 3133 LLColor4 light_diffuse = mSunDiffuse;
3113 LLColor4 backlight_diffuse(1.f - light_diffuse.mV[VRED], 1.f - light_diffuse.mV[VGREEN], 1.f - light_diffuse.mV[VBLUE], 1.f); 3134 LLColor4 backlight_diffuse(1.f - light_diffuse.mV[VRED], 1.f - light_diffuse.mV[VGREEN], 1.f - light_diffuse.mV[VBLUE], 1.f);
@@ -3446,7 +3467,7 @@ void LLPipeline::setupHWLights(LLDrawPool* pool)
3446 atten = x / (light_radius); // % of brightness at radius 3467 atten = x / (light_radius); // % of brightness at radius
3447 quad = 0.0f; 3468 quad = 0.0f;
3448 } 3469 }
3449 //mHWLightColors[cur_light] = light_color; 3470 mHWLightColors[2] = light_color;
3450 S32 gllight = GL_LIGHT2; 3471 S32 gllight = GL_LIGHT2;
3451 glLightfv(gllight, GL_POSITION, light_pos_gl.mV); 3472 glLightfv(gllight, GL_POSITION, light_pos_gl.mV);
3452 glLightfv(gllight, GL_DIFFUSE, light_color.mV); 3473 glLightfv(gllight, GL_DIFFUSE, light_color.mV);
@@ -3987,6 +4008,7 @@ BOOL LLPipeline::getRenderHighlights(void*)
3987} 4008}
3988 4009
3989LLViewerObject* LLPipeline::lineSegmentIntersectInWorld(const LLVector3& start, const LLVector3& end, 4010LLViewerObject* LLPipeline::lineSegmentIntersectInWorld(const LLVector3& start, const LLVector3& end,
4011 BOOL pick_transparent,
3990 S32* face_hit, 4012 S32* face_hit,
3991 LLVector3* intersection, // return the intersection point 4013 LLVector3* intersection, // return the intersection point
3992 LLVector2* tex_coord, // return the texture coordinates of the intersection point 4014 LLVector2* tex_coord, // return the texture coordinates of the intersection point
@@ -3996,6 +4018,10 @@ LLViewerObject* LLPipeline::lineSegmentIntersectInWorld(const LLVector3& start,
3996{ 4018{
3997 LLDrawable* drawable = NULL; 4019 LLDrawable* drawable = NULL;
3998 4020
4021 LLVector3 local_end = end;
4022
4023 LLVector3 position;
4024
3999 for (LLWorld::region_list_t::iterator iter = LLWorld::getInstance()->getRegionList().begin(); 4025 for (LLWorld::region_list_t::iterator iter = LLWorld::getInstance()->getRegionList().begin();
4000 iter != LLWorld::getInstance()->getRegionList().end(); ++iter) 4026 iter != LLWorld::getInstance()->getRegionList().end(); ++iter)
4001 { 4027 {
@@ -4003,24 +4029,49 @@ LLViewerObject* LLPipeline::lineSegmentIntersectInWorld(const LLVector3& start,
4003 4029
4004 for (U32 j = 0; j < LLViewerRegion::NUM_PARTITIONS; j++) 4030 for (U32 j = 0; j < LLViewerRegion::NUM_PARTITIONS; j++)
4005 { 4031 {
4006 if ((j == LLViewerRegion::PARTITION_VOLUME) || (j == LLViewerRegion::PARTITION_BRIDGE)) // only check these partitions for now 4032 if ((j == LLViewerRegion::PARTITION_VOLUME) ||
4033 (j == LLViewerRegion::PARTITION_BRIDGE) ||
4034 (j == LLViewerRegion::PARTITION_TERRAIN) ||
4035 (j == LLViewerRegion::PARTITION_TREE) ||
4036 (j == LLViewerRegion::PARTITION_GRASS)) // only check these partitions for now
4007 { 4037 {
4008 LLSpatialPartition* part = region->getSpatialPartition(j); 4038 LLSpatialPartition* part = region->getSpatialPartition(j);
4009 if (part) 4039 if (part && hasRenderType(part->mDrawableType))
4010 { 4040 {
4011 LLDrawable* hit = part->lineSegmentIntersect(start, end, face_hit, intersection, tex_coord, normal, bi_normal); 4041 LLDrawable* hit = part->lineSegmentIntersect(start, local_end, pick_transparent, face_hit, &position, tex_coord, normal, bi_normal);
4012 if (hit) 4042 if (hit)
4013 { 4043 {
4014 drawable = hit; 4044 drawable = hit;
4045 local_end = position;
4015 } 4046 }
4016 } 4047 }
4017 } 4048 }
4018 } 4049 }
4019 } 4050 }
4051
4052 //check all avatar nametags (silly, isn't it?)
4053 for (std::vector< LLCharacter* >::iterator iter = LLCharacter::sInstances.begin();
4054 iter != LLCharacter::sInstances.end();
4055 ++iter)
4056 {
4057 LLVOAvatar* av = (LLVOAvatar*) *iter;
4058 if (av->mNameText.notNull() && av->mNameText->lineSegmentIntersect(start, local_end, position))
4059 {
4060 drawable = av->mDrawable;
4061 local_end = position;
4062 }
4063 }
4064
4065 if (intersection)
4066 {
4067 *intersection = position;
4068 }
4069
4020 return drawable ? drawable->getVObj().get() : NULL; 4070 return drawable ? drawable->getVObj().get() : NULL;
4021} 4071}
4022 4072
4023LLViewerObject* LLPipeline::lineSegmentIntersectInHUD(const LLVector3& start, const LLVector3& end, 4073LLViewerObject* LLPipeline::lineSegmentIntersectInHUD(const LLVector3& start, const LLVector3& end,
4074 BOOL pick_transparent,
4024 S32* face_hit, 4075 S32* face_hit,
4025 LLVector3* intersection, // return the intersection point 4076 LLVector3* intersection, // return the intersection point
4026 LLVector2* tex_coord, // return the texture coordinates of the intersection point 4077 LLVector2* tex_coord, // return the texture coordinates of the intersection point
@@ -4035,15 +4086,27 @@ LLViewerObject* LLPipeline::lineSegmentIntersectInHUD(const LLVector3& start, co
4035 { 4086 {
4036 LLViewerRegion* region = *iter; 4087 LLViewerRegion* region = *iter;
4037 4088
4089 BOOL toggle = FALSE;
4090 if (!hasRenderType(LLPipeline::RENDER_TYPE_HUD))
4091 {
4092 toggleRenderType(LLPipeline::RENDER_TYPE_HUD);
4093 toggle = TRUE;
4094 }
4095
4038 LLSpatialPartition* part = region->getSpatialPartition(LLViewerRegion::PARTITION_HUD); 4096 LLSpatialPartition* part = region->getSpatialPartition(LLViewerRegion::PARTITION_HUD);
4039 if (part) 4097 if (part)
4040 { 4098 {
4041 LLDrawable* hit = part->lineSegmentIntersect(start, end, face_hit, intersection, tex_coord, normal, bi_normal); 4099 LLDrawable* hit = part->lineSegmentIntersect(start, end, pick_transparent, face_hit, intersection, tex_coord, normal, bi_normal);
4042 if (hit) 4100 if (hit)
4043 { 4101 {
4044 drawable = hit; 4102 drawable = hit;
4045 } 4103 }
4046 } 4104 }
4105
4106 if (toggle)
4107 {
4108 toggleRenderType(LLPipeline::RENDER_TYPE_HUD);
4109 }
4047 } 4110 }
4048 return drawable ? drawable->getVObj().get() : NULL; 4111 return drawable ? drawable->getVObj().get() : NULL;
4049} 4112}
@@ -4197,7 +4260,8 @@ void LLPipeline::generateReflectionMap(LLCubeMap* cube_map, LLCamera& cube_cam)
4197 4260
4198 LLPipeline::sReflectionRender = TRUE; 4261 LLPipeline::sReflectionRender = TRUE;
4199 4262
4200 cube_map->bind(); 4263 gGL.getTexUnit(cube_map->getStage())->bind(cube_map);
4264 gGL.getTexUnit(0)->activate();
4201 GLint width; 4265 GLint width;
4202 glGetTexLevelParameteriv(GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB, 0, GL_TEXTURE_WIDTH, &width); 4266 glGetTexLevelParameteriv(GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB, 0, GL_TEXTURE_WIDTH, &width);
4203 if (width != res) 4267 if (width != res)
@@ -4209,8 +4273,10 @@ void LLPipeline::generateReflectionMap(LLCubeMap* cube_map, LLCamera& cube_cam)
4209 glTexImage2D(gl_cube_face[i], 0, GL_RGBA, res, res, 0, GL_RGBA, GL_FLOAT, NULL); 4273 glTexImage2D(gl_cube_face[i], 0, GL_RGBA, res, res, 0, GL_RGBA, GL_FLOAT, NULL);
4210 } 4274 }
4211 } 4275 }
4212 glBindTexture(GL_TEXTURE_CUBE_MAP_ARB, 0); 4276 gGL.getTexUnit(cube_map->getStage())->unbind(LLTexUnit::TT_CUBE_MAP);
4213 cube_map->disable(); 4277 gGL.getTexUnit(cube_map->getStage())->disable();
4278 gGL.getTexUnit(0)->activate();
4279 gGL.getTexUnit(0)->enable(LLTexUnit::TT_TEXTURE);
4214 4280
4215 BOOL toggle_ui = gPipeline.hasRenderDebugFeatureMask(LLPipeline::RENDER_DEBUG_FEATURE_UI); 4281 BOOL toggle_ui = gPipeline.hasRenderDebugFeatureMask(LLPipeline::RENDER_DEBUG_FEATURE_UI);
4216 if (toggle_ui) 4282 if (toggle_ui)
@@ -4254,7 +4320,7 @@ void LLPipeline::generateReflectionMap(LLCubeMap* cube_map, LLCamera& cube_cam)
4254 gPipeline.calcNearbyLights(cube_cam); 4320 gPipeline.calcNearbyLights(cube_cam);
4255 4321
4256 stop_glerror(); 4322 stop_glerror();
4257 LLViewerImage::unbindTexture(0, GL_TEXTURE_2D); 4323 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
4258 glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, mCubeFrameBuffer); 4324 glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, mCubeFrameBuffer);
4259 glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, 4325 glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT,
4260 GL_RENDERBUFFER_EXT, mCubeDepth); 4326 GL_RENDERBUFFER_EXT, mCubeDepth);
@@ -4410,7 +4476,8 @@ void LLPipeline::blurReflectionMap(LLCubeMap* cube_in, LLCubeMap* cube_out)
4410 glPushMatrix(); 4476 glPushMatrix();
4411 4477
4412 cube_out->enableTexture(0); 4478 cube_out->enableTexture(0);
4413 cube_out->bind(); 4479 gGL.getTexUnit(cube_out->getStage())->bind(cube_out);
4480 gGL.getTexUnit(0)->activate();
4414 GLint width; 4481 GLint width;
4415 glGetTexLevelParameteriv(GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB, 0, GL_TEXTURE_WIDTH, &width); 4482 glGetTexLevelParameteriv(GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB, 0, GL_TEXTURE_WIDTH, &width);
4416 if (width != res) 4483 if (width != res)
@@ -4422,8 +4489,8 @@ void LLPipeline::blurReflectionMap(LLCubeMap* cube_in, LLCubeMap* cube_out)
4422 glTexImage2D(gl_cube_face[i], 0, GL_RGBA, res, res, 0, GL_RGBA, GL_FLOAT, NULL); 4489 glTexImage2D(gl_cube_face[i], 0, GL_RGBA, res, res, 0, GL_RGBA, GL_FLOAT, NULL);
4423 } 4490 }
4424 } 4491 }
4425 glBindTexture(GL_TEXTURE_CUBE_MAP_ARB, 0); 4492 gGL.getTexUnit(cube_out->getStage())->unbind(LLTexUnit::TT_CUBE_MAP);
4426 4493 gGL.getTexUnit(0)->activate();
4427 glViewport(0, 0, res, res); 4494 glViewport(0, 0, res, res);
4428 LLGLEnable blend(GL_BLEND); 4495 LLGLEnable blend(GL_BLEND);
4429 4496
@@ -4451,16 +4518,17 @@ void LLPipeline::blurReflectionMap(LLCubeMap* cube_in, LLCubeMap* cube_out)
4451 4518
4452 if (j == 0) 4519 if (j == 0)
4453 { 4520 {
4454 cube_in->bind(); 4521 gGL.getTexUnit(cube_in->getStage())->bind(cube_in);
4455 } 4522 }
4456 else 4523 else
4457 { 4524 {
4458 glBindTexture(GL_TEXTURE_CUBE_MAP_ARB, mBlurCubeTexture[j-1]); 4525 gGL.getTexUnit(cube_in->getStage())->bindManual(LLTexUnit::TT_CUBE_MAP, mBlurCubeTexture[j-1]);
4459 } 4526 }
4527 gGL.getTexUnit(0)->activate();
4460 4528
4461 stop_glerror(); 4529 stop_glerror();
4462 4530
4463 LLViewerImage::unbindTexture(0, GL_TEXTURE_2D); 4531 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
4464 glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, mBlurCubeBuffer[j]); 4532 glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, mBlurCubeBuffer[j]);
4465 stop_glerror(); 4533 stop_glerror();
4466 4534
@@ -4489,7 +4557,7 @@ void LLPipeline::blurReflectionMap(LLCubeMap* cube_in, LLCubeMap* cube_out)
4489 4557
4490 stop_glerror(); 4558 stop_glerror();
4491 4559
4492 glBindTexture(GL_TEXTURE_CUBE_MAP_ARB, 0); 4560 gGL.getTexUnit(cube_in->getStage())->unbind(LLTexUnit::TT_CUBE_MAP);
4493 4561
4494 glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); 4562 glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
4495 gGL.setColorMask(true, false); 4563 gGL.setColorMask(true, false);
@@ -4498,7 +4566,8 @@ void LLPipeline::blurReflectionMap(LLCubeMap* cube_in, LLCubeMap* cube_out)
4498 glMatrixMode(GL_MODELVIEW); 4566 glMatrixMode(GL_MODELVIEW);
4499 glPopMatrix(); 4567 glPopMatrix();
4500 4568
4501 cube_in->disableTexture(); 4569 gGL.getTexUnit(cube_in->getStage())->disable();
4570 gGL.getTexUnit(0)->enable(LLTexUnit::TT_TEXTURE);
4502 gViewerWindow->setupViewport(); 4571 gViewerWindow->setupViewport();
4503 gGL.setSceneBlendType(LLRender::BT_ALPHA); 4572 gGL.setSceneBlendType(LLRender::BT_ALPHA);
4504 4573
@@ -4566,7 +4635,7 @@ void LLPipeline::renderBloom(BOOL for_snapshot)
4566 4635
4567 if (for_snapshot) 4636 if (for_snapshot)
4568 { 4637 {
4569 mGlow[1].bindTexture(); 4638 gGL.getTexUnit(0)->bind(&mGlow[1]);
4570 { 4639 {
4571 //LLGLEnable stencil(GL_STENCIL_TEST); 4640 //LLGLEnable stencil(GL_STENCIL_TEST);
4572 //glStencilFunc(GL_NOTEQUAL, 255, 0xFFFFFFFF); 4641 //glStencilFunc(GL_NOTEQUAL, 255, 0xFFFFFFFF);
@@ -4575,7 +4644,7 @@ void LLPipeline::renderBloom(BOOL for_snapshot)
4575 LLGLEnable blend(GL_BLEND); 4644 LLGLEnable blend(GL_BLEND);
4576 gGL.setSceneBlendType(LLRender::BT_ADD); 4645 gGL.setSceneBlendType(LLRender::BT_ADD);
4577 tc2.setVec(1,1); 4646 tc2.setVec(1,1);
4578 gGL.begin(LLVertexBuffer::TRIANGLE_STRIP); 4647 gGL.begin(LLRender::TRIANGLE_STRIP);
4579 gGL.color4f(1,1,1,1); 4648 gGL.color4f(1,1,1,1);
4580 gGL.texCoord2f(tc1.mV[0], tc1.mV[1]); 4649 gGL.texCoord2f(tc1.mV[0], tc1.mV[1]);
4581 gGL.vertex2f(-1,-1); 4650 gGL.vertex2f(-1,-1);
@@ -4625,15 +4694,15 @@ void LLPipeline::renderBloom(BOOL for_snapshot)
4625 LLGLEnable test(GL_ALPHA_TEST); 4694 LLGLEnable test(GL_ALPHA_TEST);
4626 gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT); 4695 gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT);
4627 gGL.setSceneBlendType(LLRender::BT_ADD_WITH_ALPHA); 4696 gGL.setSceneBlendType(LLRender::BT_ADD_WITH_ALPHA);
4628 LLViewerImage::unbindTexture(0, GL_TEXTURE_2D);
4629 4697
4630 glDisable(GL_TEXTURE_2D); 4698 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
4631 glEnable(GL_TEXTURE_RECTANGLE_ARB); 4699 gGL.getTexUnit(0)->disable();
4632 mScreen.bindTexture(); 4700 gGL.getTexUnit(0)->enable(LLTexUnit::TT_RECT_TEXTURE);
4701 gGL.getTexUnit(0)->bind(&mScreen);
4633 4702
4634 gGL.color4f(1,1,1,1); 4703 gGL.color4f(1,1,1,1);
4635 gPipeline.enableLightsFullbright(LLColor4(1,1,1,1)); 4704 gPipeline.enableLightsFullbright(LLColor4(1,1,1,1));
4636 gGL.begin(LLVertexBuffer::TRIANGLE_STRIP); 4705 gGL.begin(LLRender::TRIANGLE_STRIP);
4637 gGL.texCoord2f(tc1.mV[0], tc1.mV[1]); 4706 gGL.texCoord2f(tc1.mV[0], tc1.mV[1]);
4638 gGL.vertex2f(-1,-1); 4707 gGL.vertex2f(-1,-1);
4639 4708
@@ -4647,8 +4716,7 @@ void LLPipeline::renderBloom(BOOL for_snapshot)
4647 gGL.vertex2f(1,1); 4716 gGL.vertex2f(1,1);
4648 gGL.end(); 4717 gGL.end();
4649 4718
4650 glEnable(GL_TEXTURE_2D); 4719 gGL.getTexUnit(0)->enable(LLTexUnit::TT_TEXTURE);
4651 glDisable(GL_TEXTURE_RECTANGLE_ARB);
4652 4720
4653 mGlow[2].flush(); 4721 mGlow[2].flush();
4654 } 4722 }
@@ -4678,7 +4746,7 @@ void LLPipeline::renderBloom(BOOL for_snapshot)
4678 4746
4679 for (S32 i = 0; i < kernel; i++) 4747 for (S32 i = 0; i < kernel; i++)
4680 { 4748 {
4681 LLViewerImage::unbindTexture(0, GL_TEXTURE_2D); 4749 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
4682 { 4750 {
4683 LLFastTimer ftm(LLFastTimer::FTM_RENDER_BLOOM_FBO); 4751 LLFastTimer ftm(LLFastTimer::FTM_RENDER_BLOOM_FBO);
4684 mGlow[i%2].bindTarget(); 4752 mGlow[i%2].bindTarget();
@@ -4687,11 +4755,11 @@ void LLPipeline::renderBloom(BOOL for_snapshot)
4687 4755
4688 if (i == 0) 4756 if (i == 0)
4689 { 4757 {
4690 mGlow[2].bindTexture(); 4758 gGL.getTexUnit(0)->bind(&mGlow[2]);
4691 } 4759 }
4692 else 4760 else
4693 { 4761 {
4694 mGlow[(i-1)%2].bindTexture(); 4762 gGL.getTexUnit(0)->bind(&mGlow[(i-1)%2]);
4695 } 4763 }
4696 4764
4697 if (i%2 == 0) 4765 if (i%2 == 0)
@@ -4703,7 +4771,7 @@ void LLPipeline::renderBloom(BOOL for_snapshot)
4703 gGlowProgram.uniform2f("glowDelta", 0, delta); 4771 gGlowProgram.uniform2f("glowDelta", 0, delta);
4704 } 4772 }
4705 4773
4706 gGL.begin(LLVertexBuffer::TRIANGLE_STRIP); 4774 gGL.begin(LLRender::TRIANGLE_STRIP);
4707 gGL.texCoord2f(tc1.mV[0], tc1.mV[1]); 4775 gGL.texCoord2f(tc1.mV[0], tc1.mV[1]);
4708 gGL.vertex2f(-1,-1); 4776 gGL.vertex2f(-1,-1);
4709 4777
@@ -4768,8 +4836,8 @@ void LLPipeline::renderBloom(BOOL for_snapshot)
4768 LLGLEnable blend(GL_BLEND); 4836 LLGLEnable blend(GL_BLEND);
4769 gGL.blendFunc(GL_ONE, GL_ONE); 4837 gGL.blendFunc(GL_ONE, GL_ONE);
4770 4838
4771 glDisable(GL_TEXTURE_2D); 4839 gGL.getTexUnit(0)->disable();
4772 glEnable(GL_TEXTURE_RECTANGLE_ARB); 4840 gGL.getTexUnit(0)->enable(LLTexUnit::TT_RECT_TEXTURE);
4773 mScreen.bindTexture(); 4841 mScreen.bindTexture();
4774 4842
4775 gGL.begin(LLVertexBuffer::TRIANGLE_STRIP); 4843 gGL.begin(LLVertexBuffer::TRIANGLE_STRIP);
@@ -4789,8 +4857,7 @@ void LLPipeline::renderBloom(BOOL for_snapshot)
4789 4857
4790 gGL.flush(); 4858 gGL.flush();
4791 4859
4792 glEnable(GL_TEXTURE_2D); 4860 gGL.getTexUnit(0)->enable(LLTexUnit::TT_TEXTURE);
4793 glDisable(GL_TEXTURE_RECTANGLE_ARB);
4794 4861
4795 gGL.blendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 4862 gGL.blendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
4796 }*/ 4863 }*/
@@ -4835,12 +4902,12 @@ void LLPipeline::renderBloom(BOOL for_snapshot)
4835 4902
4836 //tex unit 0 4903 //tex unit 0
4837 gGL.getTexUnit(0)->setTextureColorBlend(LLTexUnit::TBO_REPLACE, LLTexUnit::TBS_TEX_COLOR); 4904 gGL.getTexUnit(0)->setTextureColorBlend(LLTexUnit::TBO_REPLACE, LLTexUnit::TBS_TEX_COLOR);
4838 4905
4839 mGlow[1].bindTexture(); 4906 gGL.getTexUnit(0)->bind(&mGlow[1]);
4840 glEnableClientState(GL_TEXTURE_COORD_ARRAY); 4907 glEnableClientState(GL_TEXTURE_COORD_ARRAY);
4841 glTexCoordPointer(2, GL_FLOAT, 0, uv0); 4908 glTexCoordPointer(2, GL_FLOAT, 0, uv0);
4842 gGL.getTexUnit(1)->activate(); 4909 gGL.getTexUnit(1)->activate();
4843 glEnable(GL_TEXTURE_RECTANGLE_ARB); 4910 gGL.getTexUnit(1)->enable(LLTexUnit::TT_RECT_TEXTURE);
4844 4911
4845 //tex unit 1 4912 //tex unit 1
4846 gGL.getTexUnit(1)->setTextureColorBlend(LLTexUnit::TBO_ADD, LLTexUnit::TBS_TEX_COLOR, LLTexUnit::TBS_PREV_COLOR); 4913 gGL.getTexUnit(1)->setTextureColorBlend(LLTexUnit::TBO_ADD, LLTexUnit::TBS_TEX_COLOR, LLTexUnit::TBS_PREV_COLOR);
@@ -4851,14 +4918,16 @@ void LLPipeline::renderBloom(BOOL for_snapshot)
4851 4918
4852 glVertexPointer(2, GL_FLOAT, 0, v); 4919 glVertexPointer(2, GL_FLOAT, 0, v);
4853 4920
4854 mScreen.bindTexture(); 4921 gGL.getTexUnit(1)->bind(&mScreen);
4922 gGL.getTexUnit(1)->activate();
4855 4923
4856 LLGLEnable multisample(GL_MULTISAMPLE_ARB); 4924 LLGLEnable multisample(GL_MULTISAMPLE_ARB);
4857 glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); 4925 glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
4858 4926
4859 glDisable(GL_TEXTURE_RECTANGLE_ARB); 4927 gGL.getTexUnit(1)->disable();
4860 glDisableClientState(GL_TEXTURE_COORD_ARRAY); 4928 glDisableClientState(GL_TEXTURE_COORD_ARRAY);
4861 gGL.getTexUnit(1)->setTextureBlendType(LLTexUnit::TB_MULT); 4929 gGL.getTexUnit(1)->setTextureBlendType(LLTexUnit::TB_MULT);
4930
4862 glClientActiveTextureARB(GL_TEXTURE0_ARB); 4931 glClientActiveTextureARB(GL_TEXTURE0_ARB);
4863 gGL.getTexUnit(0)->activate(); 4932 gGL.getTexUnit(0)->activate();
4864 glDisableClientState(GL_TEXTURE_COORD_ARRAY); 4933 glDisableClientState(GL_TEXTURE_COORD_ARRAY);
@@ -4936,7 +5005,7 @@ void LLPipeline::generateWaterReflection(LLCamera& camera_in)
4936 5005
4937 if (!LLViewerCamera::getInstance()->cameraUnderWater()) 5006 if (!LLViewerCamera::getInstance()->cameraUnderWater())
4938 { //generate planar reflection map 5007 { //generate planar reflection map
4939 LLViewerImage::unbindTexture(0, GL_TEXTURE_2D); 5008 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
4940 glClearColor(0,0,0,0); 5009 glClearColor(0,0,0,0);
4941 gGL.setColorMask(true, true); 5010 gGL.setColorMask(true, true);
4942 mWaterRef.bindTarget(); 5011 mWaterRef.bindTarget();
@@ -5041,7 +5110,7 @@ void LLPipeline::generateWaterReflection(LLCamera& camera_in)
5041 } 5110 }
5042 LLViewerCamera::updateFrustumPlanes(camera); 5111 LLViewerCamera::updateFrustumPlanes(camera);
5043 5112
5044 LLViewerImage::unbindTexture(0, GL_TEXTURE_2D); 5113 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
5045 LLColor4& col = LLDrawPoolWater::sWaterFogColor; 5114 LLColor4& col = LLDrawPoolWater::sWaterFogColor;
5046 glClearColor(col.mV[0], col.mV[1], col.mV[2], 0.f); 5115 glClearColor(col.mV[0], col.mV[1], col.mV[2], 0.f);
5047 gGL.setColorMask(true, true); 5116 gGL.setColorMask(true, true);
@@ -5173,11 +5242,11 @@ void LLPipeline::generateImpostor(LLVOAvatar* avatar)
5173 5242
5174 LLVector3 left = camera.getLeftAxis(); 5243 LLVector3 left = camera.getLeftAxis();
5175 left *= left; 5244 left *= left;
5176 left.normVec(); 5245 left.normalize();
5177 5246
5178 LLVector3 up = camera.getUpAxis(); 5247 LLVector3 up = camera.getUpAxis();
5179 up *= up; 5248 up *= up;
5180 up.normVec(); 5249 up.normalize();
5181 5250
5182 tdim.mV[0] = fabsf(half_height * left); 5251 tdim.mV[0] = fabsf(half_height * left);
5183 tdim.mV[1] = fabsf(half_height * up); 5252 tdim.mV[1] = fabsf(half_height * up);
@@ -5218,10 +5287,10 @@ void LLPipeline::generateImpostor(LLVOAvatar* avatar)
5218 resY != avatar->mImpostor.getHeight()) 5287 resY != avatar->mImpostor.getHeight())
5219 { 5288 {
5220 avatar->mImpostor.allocate(resX,resY,GL_RGBA,TRUE); 5289 avatar->mImpostor.allocate(resX,resY,GL_RGBA,TRUE);
5221 avatar->mImpostor.bindTexture(); 5290 gGL.getTexUnit(0)->bind(&avatar->mImpostor);
5222 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 5291 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
5223 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 5292 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
5224 LLImageGL::unbindTexture(0, GL_TEXTURE_2D); 5293 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
5225 } 5294 }
5226 5295
5227 { 5296 {
@@ -5258,13 +5327,13 @@ void LLPipeline::generateImpostor(LLVOAvatar* avatar)
5258 } 5327 }
5259 5328
5260 gGL.setSceneBlendType(LLRender::BT_ADD); 5329 gGL.setSceneBlendType(LLRender::BT_ADD);
5261 LLImageGL::unbindTexture(0, GL_TEXTURE_2D); 5330 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
5262 5331
5263 LLGLDepthTest depth(GL_FALSE, GL_FALSE); 5332 LLGLDepthTest depth(GL_FALSE, GL_FALSE);
5264 5333
5265 gGL.color4f(1,1,1,1); 5334 gGL.color4f(1,1,1,1);
5266 gGL.color4ub(64,64,64,255); 5335 gGL.color4ub(64,64,64,255);
5267 gGL.begin(LLVertexBuffer::QUADS); 5336 gGL.begin(LLRender::QUADS);
5268 gGL.vertex3fv((pos+left-up).mV); 5337 gGL.vertex3fv((pos+left-up).mV);
5269 gGL.vertex3fv((pos-left-up).mV); 5338 gGL.vertex3fv((pos-left-up).mV);
5270 gGL.vertex3fv((pos-left+up).mV); 5339 gGL.vertex3fv((pos-left+up).mV);
diff --git a/linden/indra/newview/pipeline.h b/linden/indra/newview/pipeline.h
index 5f94e37..c795283 100644
--- a/linden/indra/newview/pipeline.h
+++ b/linden/indra/newview/pipeline.h
@@ -131,6 +131,7 @@ public:
131 131
132 //get the object between start and end that's closest to start. 132 //get the object between start and end that's closest to start.
133 LLViewerObject* lineSegmentIntersectInWorld(const LLVector3& start, const LLVector3& end, 133 LLViewerObject* lineSegmentIntersectInWorld(const LLVector3& start, const LLVector3& end,
134 BOOL pick_transparent,
134 S32* face_hit, // return the face hit 135 S32* face_hit, // return the face hit
135 LLVector3* intersection = NULL, // return the intersection point 136 LLVector3* intersection = NULL, // return the intersection point
136 LLVector2* tex_coord = NULL, // return the texture coordinates of the intersection point 137 LLVector2* tex_coord = NULL, // return the texture coordinates of the intersection point
@@ -138,6 +139,7 @@ public:
138 LLVector3* bi_normal = NULL // return the surface bi-normal at the intersection point 139 LLVector3* bi_normal = NULL // return the surface bi-normal at the intersection point
139 ); 140 );
140 LLViewerObject* lineSegmentIntersectInHUD(const LLVector3& start, const LLVector3& end, 141 LLViewerObject* lineSegmentIntersectInHUD(const LLVector3& start, const LLVector3& end,
142 BOOL pick_transparent,
141 S32* face_hit, // return the face hit 143 S32* face_hit, // return the face hit
142 LLVector3* intersection = NULL, // return the intersection point 144 LLVector3* intersection = NULL, // return the intersection point
143 LLVector2* tex_coord = NULL, // return the texture coordinates of the intersection point 145 LLVector2* tex_coord = NULL, // return the texture coordinates of the intersection point
@@ -317,7 +319,6 @@ public:
317// RENDER_DEBUG_FEATURE_HW_LIGHTING = 0x0010, 319// RENDER_DEBUG_FEATURE_HW_LIGHTING = 0x0010,
318 RENDER_DEBUG_FEATURE_FLEXIBLE = 0x0010, 320 RENDER_DEBUG_FEATURE_FLEXIBLE = 0x0010,
319 RENDER_DEBUG_FEATURE_FOG = 0x0020, 321 RENDER_DEBUG_FEATURE_FOG = 0x0020,
320 RENDER_DEBUG_FEATURE_PALETTE = 0x0040,
321 RENDER_DEBUG_FEATURE_FR_INFO = 0x0080, 322 RENDER_DEBUG_FEATURE_FR_INFO = 0x0080,
322 RENDER_DEBUG_FEATURE_FOOT_SHADOWS = 0x0100, 323 RENDER_DEBUG_FEATURE_FOOT_SHADOWS = 0x0100,
323 }; 324 };
diff --git a/linden/indra/newview/res/viewerRes.rc b/linden/indra/newview/res/viewerRes.rc
index a39bb9f..8df0c57 100644
--- a/linden/indra/newview/res/viewerRes.rc
+++ b/linden/indra/newview/res/viewerRes.rc
@@ -231,8 +231,8 @@ TOOLMEDIAOPEN CURSOR "toolmediaopen.cur"
231// 231//
232 232
233VS_VERSION_INFO VERSIONINFO 233VS_VERSION_INFO VERSIONINFO
234 FILEVERSION 1,20,9,87416 234 FILEVERSION 1,20,15,97417
235 PRODUCTVERSION 1,20,9,87416 235 PRODUCTVERSION 1,20,15,97417
236 FILEFLAGSMASK 0x3fL 236 FILEFLAGSMASK 0x3fL
237#ifdef _DEBUG 237#ifdef _DEBUG
238 FILEFLAGS 0x1L 238 FILEFLAGS 0x1L
@@ -249,12 +249,12 @@ BEGIN
249 BEGIN 249 BEGIN
250 VALUE "CompanyName", "Linden Lab" 250 VALUE "CompanyName", "Linden Lab"
251 VALUE "FileDescription", "Second Life" 251 VALUE "FileDescription", "Second Life"
252 VALUE "FileVersion", "1.20.9.87416" 252 VALUE "FileVersion", "1.20.15.97417"
253 VALUE "InternalName", "Second Life" 253 VALUE "InternalName", "Second Life"
254 VALUE "LegalCopyright", "Copyright © 2001-2008, Linden Research, Inc." 254 VALUE "LegalCopyright", "Copyright © 2001-2008, Linden Research, Inc."
255 VALUE "OriginalFilename", "SecondLife.exe" 255 VALUE "OriginalFilename", "SecondLife.exe"
256 VALUE "ProductName", "Second Life" 256 VALUE "ProductName", "Second Life"
257 VALUE "ProductVersion", "1.20.9.87416" 257 VALUE "ProductVersion", "1.20.15.97417"
258 END 258 END
259 END 259 END
260 BLOCK "VarFileInfo" 260 BLOCK "VarFileInfo"
diff --git a/linden/indra/newview/secondlife setup build dazzle.bat b/linden/indra/newview/secondlife setup build dazzle.bat
deleted file mode 100644
index f09f657..0000000
--- a/linden/indra/newview/secondlife setup build dazzle.bat
+++ /dev/null
@@ -1,4 +0,0 @@
1@rem Invoke the script which preps then runs the installer.
2@rem This batch file is customized per grid.
3
4@"secondlife setup build.bat" --channel="Second Life First Look Dazzle"
diff --git a/linden/indra/newview/skins/default/xui/de/alerts.xml b/linden/indra/newview/skins/default/xui/de/alerts.xml
index ab72b30..57a5a4b 100644
--- a/linden/indra/newview/skins/default/xui/de/alerts.xml
+++ b/linden/indra/newview/skins/default/xui/de/alerts.xml
@@ -735,13 +735,8 @@ Sie benötigen ein Benutzerkonto, um [SECOND_LIFE] betreten zu können. Möchten
735 </alert> 735 </alert>
736 <alert name="AddClassified"> 736 <alert name="AddClassified">
737 <message name="message"> 737 <message name="message">
738 Anzeigen erscheinen für eine Woche unter &apos;Anzeigen&apos; 738 Anzeigen erscheinen für eine Woche unter &apos;Anzeigen&apos; im Suchverzeichnis. Füllen Sie Ihre Anzeige aus und klicken Sie auf &apos;Veröffentlichen...&apos;, um sie zum Verzeichnis hinzuzufügen.
739im Suchverzeichnis. 739Sie werden gebeten, einen Preis zu bezahlen, wenn Sie auf &apos;Veröffentlichen&apos; klicken. Wenn Sie mehr bezahlen oder ein Benutzer nach Ihren Suchbegriffen sucht, erscheint Ihre Anzeige weiter oben in der Liste.
740Füllen Sie Ihre Anzeige aus und klicken Sie auf &apos;Veröffentlichen...&apos;, um sie zum
741Verzeichnis hinzuzufügen.
742Sie werden gebeten, einen Preis zu bezahlen, wenn Sie auf &apos;Veröffentlichen&apos; klicken.
743Wenn Sie mehr bezahlen oder ein Benutzer nach Ihren Suchbegriffen sucht,
744erscheint Ihre Anzeige weiter oben in der Liste.
745 </message> 740 </message>
746 <option name="OK"> 741 <option name="OK">
747 OK 742 OK
@@ -881,8 +876,7 @@ Hinweis: Der Cache wird dabei gelöscht/geleert.
881 </alert> 876 </alert>
882 <alert name="GoToAuctionPage"> 877 <alert name="GoToAuctionPage">
883 <message name="message"> 878 <message name="message">
884 Zur [SECOND_LIFE]-Webseite, um Auktionen anzuzeigen oder 879 Zur [SECOND_LIFE]-Webseite, um Auktionen anzuzeigen oder ein Gebot abzugeben?
885ein Gebot abzugeben?
886 </message> 880 </message>
887 <option name="GotoPage"> 881 <option name="GotoPage">
888 OK 882 OK
diff --git a/linden/indra/newview/skins/default/xui/de/floater_inventory.xml b/linden/indra/newview/skins/default/xui/de/floater_inventory.xml
index d731d00..c8c6724 100644
--- a/linden/indra/newview/skins/default/xui/de/floater_inventory.xml
+++ b/linden/indra/newview/skins/default/xui/de/floater_inventory.xml
@@ -2,8 +2,8 @@
2<floater name="Inventory" title="Inventar"> 2<floater name="Inventory" title="Inventar">
3 <search_editor label="Suchanfrage hier eintippen" name="inventory search editor" /> 3 <search_editor label="Suchanfrage hier eintippen" name="inventory search editor" />
4 <tab_container name="inventory filter tabs"> 4 <tab_container name="inventory filter tabs">
5 <inventory_panel label="All Items" name="All Items" /> 5 <inventory_panel label="Alle Objekte" name="All Items" />
6 <inventory_panel label="Recent Items" name="Recent Items" /> 6 <inventory_panel label="Letzte Objekte" name="Recent Items" />
7 </tab_container> 7 </tab_container>
8 <menu_bar name="Inventory Menu"> 8 <menu_bar name="Inventory Menu">
9 <menu label="Datei" name="File"> 9 <menu label="Datei" name="File">
diff --git a/linden/indra/newview/skins/default/xui/de/floater_inventory_item_properties.xml b/linden/indra/newview/skins/default/xui/de/floater_inventory_item_properties.xml
index 1477cdb..2b63a90 100644
--- a/linden/indra/newview/skins/default/xui/de/floater_inventory_item_properties.xml
+++ b/linden/indra/newview/skins/default/xui/de/floater_inventory_item_properties.xml
@@ -49,17 +49,17 @@
49 </text> 49 </text>
50 <check_box label="Mit Gruppe teilen" name="CheckShareWithGroup" /> 50 <check_box label="Mit Gruppe teilen" name="CheckShareWithGroup" />
51 <check_box label="Kopieren allen erlauben" name="CheckEveryoneCopy" /> 51 <check_box label="Kopieren allen erlauben" name="CheckEveryoneCopy" />
52 <text name="NextOwnerLabel"> 52 <text name="NextOwnerLabel" width="150">
53 Nächster Eigentümer kann: 53 Nächster Eigentümer kann:
54 </text> 54 </text>
55 <check_box label="Bearbeiten" name="CheckNextOwnerModify" /> 55 <check_box label="Bearbeiten" name="CheckNextOwnerModify" />
56 <check_box label="Kopieren" name="CheckNextOwnerCopy" /> 56 <check_box label="Kopieren" name="CheckNextOwnerCopy" left_delta="85" />
57 <check_box label="Verkaufen/Weggeben" name="CheckNextOwnerTransfer" /> 57 <check_box label="Verkaufen/Weggeben" name="CheckNextOwnerTransfer" />
58 <text name="SaleLabel"> 58 <text name="SaleLabel">
59 Objekt markieren: 59 Objekt markieren:
60 </text> 60 </text>
61 <check_box label="Zum Verkauf" name="CheckPurchase" /> 61 <check_box label="Zum Verkauf" name="CheckPurchase" />
62 <radio_group name="RadioSaleType"> 62 <radio_group name="RadioSaleType" left_delta="85" width="245" >
63 <radio_item name="radio"> 63 <radio_item name="radio">
64 Original 64 Original
65 </radio_item> 65 </radio_item>
diff --git a/linden/indra/newview/skins/default/xui/de/floater_lsl_guide.xml b/linden/indra/newview/skins/default/xui/de/floater_lsl_guide.xml
index 9fb400d..3f4a623 100644
--- a/linden/indra/newview/skins/default/xui/de/floater_lsl_guide.xml
+++ b/linden/indra/newview/skins/default/xui/de/floater_lsl_guide.xml
@@ -3,5 +3,5 @@
3 <check_box label="Cursor folgen" name="lock_check" /> 3 <check_box label="Cursor folgen" name="lock_check" />
4 <combo_box label="Sperren" name="history_combo" /> 4 <combo_box label="Sperren" name="history_combo" />
5 <button label="Zurück" name="back_btn" /> 5 <button label="Zurück" name="back_btn" />
6 <button label="Weiterleiten" name="fwd_btn" /> 6 <button label="Weiterleiten" name="fwd_btn" width="82" />
7</floater> 7</floater>
diff --git a/linden/indra/newview/skins/default/xui/de/floater_preview_gesture.xml b/linden/indra/newview/skins/default/xui/de/floater_preview_gesture.xml
index 72b8bd8..7b6a693 100644
--- a/linden/indra/newview/skins/default/xui/de/floater_preview_gesture.xml
+++ b/linden/indra/newview/skins/default/xui/de/floater_preview_gesture.xml
@@ -30,12 +30,14 @@
30 <text name="steps_label"> 30 <text name="steps_label">
31 Schritte: 31 Schritte:
32 </text> 32 </text>
33 <!-- Revert translations as interim fix to VWR-9985 while the code is not properly internationalized
33 <scroll_list name="library_list"> 34 <scroll_list name="library_list">
34 Animation 35 Animation
35Ton 36Ton
36Chat 37Chat
37Warten 38Warten
38 </scroll_list> 39 </scroll_list>
40 -->
39 <button label="Hinzufügen &gt;&gt;" name="add_btn"/> 41 <button label="Hinzufügen &gt;&gt;" name="add_btn"/>
40 <button label="Nach oben" name="up_btn"/> 42 <button label="Nach oben" name="up_btn"/>
41 <button label="Nach unten" name="down_btn"/> 43 <button label="Nach unten" name="down_btn"/>
diff --git a/linden/indra/newview/skins/default/xui/de/floater_snapshot.xml b/linden/indra/newview/skins/default/xui/de/floater_snapshot.xml
index f2de8103..c7a366a 100644
--- a/linden/indra/newview/skins/default/xui/de/floater_snapshot.xml
+++ b/linden/indra/newview/skins/default/xui/de/floater_snapshot.xml
@@ -112,10 +112,10 @@
112 <spinner label="Höhe" name="snapshot_height"/> 112 <spinner label="Höhe" name="snapshot_height"/>
113 <check_box label="Seitenverhältnis beibehalten" name="keep_aspect_check"/> 113 <check_box label="Seitenverhältnis beibehalten" name="keep_aspect_check"/>
114 <slider label="Bildqualität" name="image_quality_slider"/> 114 <slider label="Bildqualität" name="image_quality_slider"/>
115 <text name="layer_type_label"> 115 <text name="layer_type_label" width="63">
116 Aufnehmen: 116 Aufnehmen:
117 </text> 117 </text>
118 <combo_box label="Bildlayer" name="layer_types"> 118 <combo_box label="Bildlayer" name="layer_types" width="132" left="73">
119 <combo_item name="Colors"> 119 <combo_item name="Colors">
120 Farben 120 Farben
121 </combo_item> 121 </combo_item>
diff --git a/linden/indra/newview/skins/default/xui/de/floater_tools.xml b/linden/indra/newview/skins/default/xui/de/floater_tools.xml
index 03401ce..a04851c 100644
--- a/linden/indra/newview/skins/default/xui/de/floater_tools.xml
+++ b/linden/indra/newview/skins/default/xui/de/floater_tools.xml
@@ -168,9 +168,9 @@
168 <text name="label click action"> 168 <text name="label click action">
169 Bei Linksklicken: 169 Bei Linksklicken:
170 </text> 170 </text>
171 <combo_box name="clickaction"> 171 <combo_box name="clickaction" width="178">
172 <combo_item name="Touch/grab(default)"> 172 <combo_item name="Touch/grab(default)">
173 Berühren/greifen (Standard) 173 Berühren/Greifen (Standard)
174 </combo_item> 174 </combo_item>
175 <combo_item name="Sitonobject"> 175 <combo_item name="Sitonobject">
176 Auf Objekt sitzen 176 Auf Objekt sitzen
@@ -590,13 +590,13 @@
590 <text name="label_area"> 590 <text name="label_area">
591 Fläche: [AREA] m2 591 Fläche: [AREA] m2
592 </text> 592 </text>
593 <button label="Land kaufen..." label_selected="Land kaufen..." name="button buy land" /> 593 <button label="Land kaufen..." label_selected="Land kaufen..." name="button buy land" width="110" />
594 <button label="Land aufgeben..." label_selected="Land aufgeben..." 594 <button label="Land aufgeben..." label_selected="Land aufgeben..." width="110"
595 name="button abandon land" /> 595 name="button abandon land" />
596 <button label="Unterteilen..." label_selected="Unterteilen..." 596 <button label="Unterteilen..." label_selected="Unterteilen..." width="110"
597 name="button subdivide land" /> 597 name="button subdivide land" />
598 <button label="Zusammenlegen" label_selected="Zusammenlegen" name="button join land" /> 598 <button label="Zusammenlegen" label_selected="Zusammenlegen" name="button join land" width="110" />
599 <button label="Info zu Land..." label_selected="Info zu Land..." 599 <button label="Info zu Land..." label_selected="Info zu Land..." width="110"
600 name="button about land" /> 600 name="button about land" />
601 </panel> 601 </panel>
602 <text name="status_rotate"> 602 <text name="status_rotate">
@@ -606,7 +606,7 @@
606 Klicken und ziehen, um die ausgewählte Seite zu dehnen 606 Klicken und ziehen, um die ausgewählte Seite zu dehnen
607 </text> 607 </text>
608 <text name="status_move"> 608 <text name="status_move">
609 Maus verschiebt, Shift-Taste und Maus kopiert 609 Maus verschiebt, Umschalt-Taste und Maus kopiert
610 </text> 610 </text>
611 <text name="status_modifyland"> 611 <text name="status_modifyland">
612 Klicken und halten, um das Land zu bearbeiten 612 Klicken und halten, um das Land zu bearbeiten
@@ -615,10 +615,10 @@
615 Klicken und ziehen, um die Ansicht zu ändern 615 Klicken und ziehen, um die Ansicht zu ändern
616 </text> 616 </text>
617 <text name="status_grab"> 617 <text name="status_grab">
618 Objekt new positionierern 618 Objekt neu positionieren
619 </text> 619 </text>
620 <text name="status_place"> 620 <text name="status_place">
621 Mausklick erstellt, Shift-Mausklick wählt aus 621 Mausklick erstellt, Umschalt-Mausklick wählt aus
622 </text> 622 </text>
623 <text name="status_selectland"> 623 <text name="status_selectland">
624 Klicken und ziehen, um Land auszuwählen 624 Klicken und ziehen, um Land auszuwählen
diff --git a/linden/indra/newview/skins/default/xui/de/panel_avatar_classified.xml b/linden/indra/newview/skins/default/xui/de/panel_avatar_classified.xml
index 237fe27..b8bd700 100644
--- a/linden/indra/newview/skins/default/xui/de/panel_avatar_classified.xml
+++ b/linden/indra/newview/skins/default/xui/de/panel_avatar_classified.xml
@@ -10,7 +10,7 @@
10 <combo_box label="" name="classified_category_combo" /> 10 <combo_box label="" name="classified_category_combo" />
11 <check_box label="Ab 18" name="classified_mature_check"> 11 <check_box label="Ab 18" name="classified_mature_check">
12 <combo_item name="select_mature"> 12 <combo_item name="select_mature">
13 - Jugendfreigabe wählen - 13 - Jugendfreigabe -
14 </combo_item> 14 </combo_item>
15 <combo_item name="mature"> 15 <combo_item name="mature">
16 Ab-18-Inhalt 16 Ab-18-Inhalt
diff --git a/linden/indra/newview/skins/default/xui/de/panel_group_general.xml b/linden/indra/newview/skins/default/xui/de/panel_group_general.xml
index 0a32de2..d232bfa 100644
--- a/linden/indra/newview/skins/default/xui/de/panel_group_general.xml
+++ b/linden/indra/newview/skins/default/xui/de/panel_group_general.xml
@@ -38,9 +38,9 @@ Bewegen Sie die Maus über die Optionen, um weitere Informationen anzuzeigen.
38 (Eigentümer werden fettgedruckt angezeigt) 38 (Eigentümer werden fettgedruckt angezeigt)
39 </text> 39 </text>
40 <name_list name="visible_members"> 40 <name_list name="visible_members">
41 <column label="Member Name" name="name" /> 41 <column label="Mitgliedsname" name="name" relwidth="0.40" />
42 <column label="Title" name="title" /> 42 <column label="Titel" name="title" relwidth="0.25" />
43 <column label="Last Login" name="online" /> 43 <column label="Letzte Anmeldung" name="online" relwidth="0.35" />
44 </name_list> 44 </name_list>
45 <text name="incomplete_member_data_str"> 45 <text name="incomplete_member_data_str">
46 Mitgliedsdaten werden abgerufen 46 Mitgliedsdaten werden abgerufen
@@ -83,8 +83,6 @@ Falls in den nächsten 48 Stunden niemand sonst dieser Gruppe beitritt, wird sie
83 <text name="active_title_label"> 83 <text name="active_title_label">
84 Mein aktiver Titel 84 Mein aktiver Titel
85 </text> 85 </text>
86 <combo_box name="active_title"
87 tool_tip="Sets the title that appears in your avatar&apos;s name tag when this group is active." />
88 </panel> 86 </panel>
89 <check_box label="Gruppenmitteilungen erhalten" name="receive_notices" 87 <check_box label="Gruppenmitteilungen erhalten" name="receive_notices"
90 tool_tip="Festlegen, ob Sie von dieser Gruppe Mitteilungen erhalten können. Deaktivieren Sie diese Option, wenn Sie von der Gruppe Spam erhalten." 88 tool_tip="Festlegen, ob Sie von dieser Gruppe Mitteilungen erhalten können. Deaktivieren Sie diese Option, wenn Sie von der Gruppe Spam erhalten."
diff --git a/linden/indra/newview/skins/default/xui/de/panel_group_land_money.xml b/linden/indra/newview/skins/default/xui/de/panel_group_land_money.xml
index cf11e3c..77a9816 100644
--- a/linden/indra/newview/skins/default/xui/de/panel_group_land_money.xml
+++ b/linden/indra/newview/skins/default/xui/de/panel_group_land_money.xml
@@ -1,11 +1,7 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 1<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
2<panel label="Land und L$" name="land_money_tab"> 2<panel label="Land und L$" name="land_money_tab">
3 <text name="help_text"> 3 <text name="help_text">
4 Es werden Parzellen in Gruppenbesitz und 4 Es werden Parzellen in Gruppenbesitz und Beitragsdetails angezeigt. Solange der Wert für &apos;Insgesamt verwendetes Land&apos; unter oder gleich dem Wert für &apos;Gesamtbeitrag&apos; ist, wird eine Warnung angezeigt. Die Registerkarten &apos;Planung&apos;, &apos;Details&apos; und &apos;Verkäufe&apos; enthalten Informationen über die Gruppenfinanzen.
5Beitragsdetails angezeigt. Solange der Wert für &apos;Insgesamt
6verwendet Land&apos; unter oder gleich dem Wert für
7&apos;Gesamtbeitrag&apos; ist, wird eine Warnung angezeigt. Die Registerkarten &apos;Planung&apos;, &apos;Details&apos; und &apos;Verkäufe&apos;
8enthalten Informationen über die Gruppenfinanzen.
9 </text> 5 </text>
10 <button label="?" name="help_button" /> 6 <button label="?" name="help_button" />
11 <text name="cant_view_group_land_text"> 7 <text name="cant_view_group_land_text">
@@ -21,9 +17,9 @@ enthalten Informationen über die Gruppenfinanzen.
21 Land in Gruppenbesitz 17 Land in Gruppenbesitz
22 </text> 18 </text>
23 <scroll_list name="group_parcel_list"> 19 <scroll_list name="group_parcel_list">
24 <column label="Parcel Name" name="name" /> 20 <column label="Parzellenname" name="name" />
25 <column label="Region" name="location" /> 21 <column label="Region" name="location" />
26 <column label="Area" name="area" /> 22 <column label="Gebiet" name="area" />
27 <column label="" name="hidden" /> 23 <column label="" name="hidden" />
28 </scroll_list> 24 </scroll_list>
29 <button label="Auf Karte" label_selected="Auf Karte" name="map_button" /> 25 <button label="Auf Karte" label_selected="Auf Karte" name="map_button" />
@@ -55,10 +51,11 @@ enthalten Informationen über die Gruppenfinanzen.
55 Ihr Landbeitrag kann nicht festgelegt werden. 51 Ihr Landbeitrag kann nicht festgelegt werden.
56 </string> 52 </string>
57 <text name="your_contribution_max_value"> 53 <text name="your_contribution_max_value">
58 Quadratmeter (max. [AMOUNT]) 54 qm (max. [AMOUNT])
59 </text> 55 </text>
60 <text name="group_over_limit_text"> 56 <text name="group_over_limit_text">
61 Die Gruppenmitglieder müssen mehr Landnutzungsrechte spenden, damit das verwendete Land gehalten werden kann. 57 Die Gruppenmitglieder müssen mehr Landnutzungsrechte spenden, damit
58das verwendete Land gehalten werden kann.
62 </text> 59 </text>
63 <text name="group_money_heading"> 60 <text name="group_money_heading">
64 Gruppen-L$ 61 Gruppen-L$
diff --git a/linden/indra/newview/skins/default/xui/de/panel_group_notices.xml b/linden/indra/newview/skins/default/xui/de/panel_group_notices.xml
index 56a384b..53f5813 100644
--- a/linden/indra/newview/skins/default/xui/de/panel_group_notices.xml
+++ b/linden/indra/newview/skins/default/xui/de/panel_group_notices.xml
@@ -22,9 +22,9 @@ Eine Mitteilungsliste speichert maximal 200 Mitteilungen pro Gruppe täglich.
22 </text> 22 </text>
23 <scroll_list name="notice_list"> 23 <scroll_list name="notice_list">
24 <column label="" name="icon" /> 24 <column label="" name="icon" />
25 <column label="Subject" name="subject" /> 25 <column label="Thema" name="subject" />
26 <column label="From" name="from" /> 26 <column label="Von" name="from" />
27 <column label="Date" name="date" /> 27 <column label="Datum" name="date" />
28 </scroll_list> 28 </scroll_list>
29 <text name="notice_list_none_found"> 29 <text name="notice_list_none_found">
30 Nicht gefunden. 30 Nicht gefunden.
diff --git a/linden/indra/newview/skins/default/xui/de/panel_group_roles.xml b/linden/indra/newview/skins/default/xui/de/panel_group_roles.xml
index 9a478f1..204759f 100644
--- a/linden/indra/newview/skins/default/xui/de/panel_group_roles.xml
+++ b/linden/indra/newview/skins/default/xui/de/panel_group_roles.xml
@@ -46,13 +46,13 @@ Mitglieder diese Fähigkeit haben.
46 </text> 46 </text>
47 </panel> 47 </panel>
48 <tab_container name="roles_tab_container"> 48 <tab_container name="roles_tab_container">
49 <panel label="Mitglieder" name="members_sub_tab" tool_tip="Members"> 49 <panel label="Mitglieder" name="members_sub_tab" tool_tip="Mitglieder">
50 <button label="Suchen" name="search_button" /> 50 <button label="Suchen" name="search_button" />
51 <button label="Alle anzeigen" name="show_all_button" /> 51 <button label="Alle anzeigen" name="show_all_button" />
52 <name_list name="member_list"> 52 <name_list name="member_list">
53 <column label="Member Name" name="name" /> 53 <column label="Mitgliedsname" name="name" />
54 <column label="Donated Tier" name="donated" /> 54 <column name="donated" />
55 <column label="Last Login" name="online" /> 55 <column label="Letzte Anmeldung" name="online" />
56 </name_list> 56 </name_list>
57 <button label="Neue Person einladen..." name="member_invite" /> 57 <button label="Neue Person einladen..." name="member_invite" />
58 <button label="Aus Gruppe werfen" name="member_eject" /> 58 <button label="Aus Gruppe werfen" name="member_eject" />
@@ -66,9 +66,9 @@ um mehrere Mitglieder auszuwählen.
66 <button label="Suchen" name="search_button" /> 66 <button label="Suchen" name="search_button" />
67 <button label="Alle anzeigen" name="show_all_button" /> 67 <button label="Alle anzeigen" name="show_all_button" />
68 <scroll_list name="role_list"> 68 <scroll_list name="role_list">
69 <column label="Role Name" name="name" /> 69 <column name="name" />
70 <column label="Title" name="title" /> 70 <column label="Titel" name="title" />
71 <column label="Members" name="members" /> 71 <column label="Mitglieder" name="members" />
72 </scroll_list> 72 </scroll_list>
73 <button label="Neue Rolle erstellen..." name="role_create" /> 73 <button label="Neue Rolle erstellen..." name="role_create" />
74 <button label="Rolle löschen" name="role_delete" /> 74 <button label="Rolle löschen" name="role_delete" />
diff --git a/linden/indra/newview/skins/default/xui/de/panel_preferences_chat.xml b/linden/indra/newview/skins/default/xui/de/panel_preferences_chat.xml
index 88fbfd4..feeb528 100644
--- a/linden/indra/newview/skins/default/xui/de/panel_preferences_chat.xml
+++ b/linden/indra/newview/skins/default/xui/de/panel_preferences_chat.xml
@@ -3,7 +3,7 @@
3 <text length="1" name="text_box" type="string"> 3 <text length="1" name="text_box" type="string">
4 Chat-Schriftgröße: 4 Chat-Schriftgröße:
5 </text> 5 </text>
6 <radio_group name="chat font size"> 6 <radio_group name="chat_font_size">
7 <radio_item length="1" name="radio" type="string"> 7 <radio_item length="1" name="radio" type="string">
8 Klein 8 Klein
9 </radio_item> 9 </radio_item>
diff --git a/linden/indra/newview/skins/default/xui/de/panel_preferences_input.xml b/linden/indra/newview/skins/default/xui/de/panel_preferences_input.xml
index 5d57975..5bb83ad 100644
--- a/linden/indra/newview/skins/default/xui/de/panel_preferences_input.xml
+++ b/linden/indra/newview/skins/default/xui/de/panel_preferences_input.xml
@@ -6,11 +6,11 @@
6 <text length="1" name=" Mouse Sensitivity:" type="string"> 6 <text length="1" name=" Mouse Sensitivity:" type="string">
7 Mausempfindlichkeit: 7 Mausempfindlichkeit:
8 </text> 8 </text>
9 <check_box label="Maus umkehren" name="invert mouse"/> 9 <check_box label="Maus umkehren" name="invert_mouse"/>
10 <text length="1" name=" Auto Fly Options:" type="string"> 10 <text length="1" name=" Auto Fly Options:" type="string">
11 Auto-Flug-Optionen: 11 Auto-Flug-Optionen:
12 </text> 12 </text>
13 <check_box label="Zum Fliegen/Landen nach oben/unten halten" name="automatic fly"/> 13 <check_box label="Zum Fliegen/Landen nach oben/unten halten" name="automatic_fly"/>
14 <text length="1" name=" Camera Options:" type="string"> 14 <text length="1" name=" Camera Options:" type="string">
15 Kameraoptionen: 15 Kameraoptionen:
16 </text> 16 </text>
@@ -26,14 +26,14 @@
26 <text name="Camera Smoothing:"> 26 <text name="Camera Smoothing:">
27 Bewegungsglättung: 27 Bewegungsglättung:
28 </text> 28 </text>
29 <check_box label="Automatischer Kameraschwenk im Bearbeiten-Modus" name="edit camera movement" tool_tip="Automatische Kamerapositionierung bei Wechsel in und aus dem Bearbeitungsmodus verwenden"/> 29 <check_box label="Automatischer Kameraschwenk im Bearbeiten-Modus" name="edit_camera_movement" tool_tip="Automatische Kamerapositionierung bei Wechsel in und aus dem Bearbeitungsmodus verwenden"/>
30 <check_box label="Automatischer Kameraschwenk im Aussehen-Modus" name="appearance camera movement" tool_tip="Automatische Kamerapositionierung im Bearbeitenmodus verwenden"/> 30 <check_box label="Automatischer Kameraschwenk im Aussehen-Modus" name="appearance_camera_movement" tool_tip="Automatische Kamerapositionierung im Bearbeitenmodus verwenden"/>
31 <text name="text2"> 31 <text name="text2">
32 Avatar-Anzeigeoptionen: 32 Avatar-Anzeigeoptionen:
33 </text> 33 </text>
34 <check_box label="Avatar in Mouselook anzeigen" name="avfp"/> 34 <check_box label="Avatar in Mouselook anzeigen" name="first_person_avatar_visible"/>
35 <text name="text5"> 35 <text name="text5">
36 Joystick-Optionen: 36 Joystick-Optionen:
37 </text> 37 </text>
38 <button label="Joystick-Einrichtung" name="joystic_setup_button"/> 38 <button label="Joystick-Einrichtung" name="joystick_setup_button"/>
39</panel> 39</panel>
diff --git a/linden/indra/newview/skins/default/xui/de/strings.xml b/linden/indra/newview/skins/default/xui/de/strings.xml
index c644ece..56cc756 100644
--- a/linden/indra/newview/skins/default/xui/de/strings.xml
+++ b/linden/indra/newview/skins/default/xui/de/strings.xml
@@ -435,9 +435,9 @@
435 </string> 435 </string>
436 <!-- Chat --> 436 <!-- Chat -->
437 <string name="whisper"> 437 <string name="whisper">
438 Flüstert: 438 flüstert:
439 </string> 439 </string>
440 <string name="shout"> 440 <string name="shout">
441 Ruft: 441 ruft:
442 </string> 442 </string>
443</strings> 443</strings>
diff --git a/linden/indra/newview/skins/default/xui/en-us/alerts.xml b/linden/indra/newview/skins/default/xui/en-us/alerts.xml
index 20b04db..44b9141 100644
--- a/linden/indra/newview/skins/default/xui/en-us/alerts.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/alerts.xml
@@ -473,7 +473,7 @@ Do you wish to proceed?
473 <alert modal="true" name="JoinGroupCannotAfford"> 473 <alert modal="true" name="JoinGroupCannotAfford">
474 <message name="message"> 474 <message name="message">
475 Joining this group costs L$[COST]. 475 Joining this group costs L$[COST].
476You do not have a sufficient balance to join this group. 476You do not have enough L$ to join this group.
477 </message> 477 </message>
478 </alert> 478 </alert>
479 <alert modal="true" name="LandBuyPass"> 479 <alert modal="true" name="LandBuyPass">
@@ -725,21 +725,13 @@ The outfit folder contains no clothing, body parts, or attachments.
725 You can not wear that item because it has not yet loaded. Please try again in a minute. 725 You can not wear that item because it has not yet loaded. Please try again in a minute.
726 </message> 726 </message>
727 </alert> 727 </alert>
728 <alert modal="true" name="MustHaveAccountToLogInNoLinks">
729 <message name="message">
730 You must have an account to connect to [SECOND_LIFE].
731 </message>
732 <option name="OK">
733 Close
734 </option>
735 </alert>
736 <alert modal="true" name="MustHaveAccountToLogIn"> 728 <alert modal="true" name="MustHaveAccountToLogIn">
737 <message name="message"> 729 <message name="message">
738Oops! Something was left blank. 730Oops! Something was left blank.
739You need to enter both the First and Last name of your avatar. 731You need to enter both the First and Last name of your avatar.
740 732
741You need an account to enter [SECOND_LIFE]. Would you like to create one now? 733You need an account to enter [SECOND_LIFE]. Would you like to create one now?
742</message> 734 </message>
743 <option name="OK"> 735 <option name="OK">
744 Create a new account 736 Create a new account
745 </option> 737 </option>
@@ -1592,12 +1584,12 @@ Expected [VALIDS]
1592 </alert> 1584 </alert>
1593 <alert modal="true" name="InsufficientFundsToUploadFile"> 1585 <alert modal="true" name="InsufficientFundsToUploadFile">
1594 <message name="message"> 1586 <message name="message">
1595 Insufficient L$ to upload file: the price is L$[COST], your balance is L$[BALANCE] 1587 Not enough L$ to upload file: the price is L$[COST], your balance is L$[BALANCE]
1596 </message> 1588 </message>
1597 </alert> 1589 </alert>
1598 <alert modal="true" name="InsufficientFundsToFinishUpload"> 1590 <alert modal="true" name="InsufficientFundsToFinishUpload">
1599 <message name="message"> 1591 <message name="message">
1600 Insufficient L$ to finish uploading [FILE]: the price is L$[COST], your balance is L$[BALANCE] 1592 Not enough L$ to finish uploading [FILE]: the price is L$[COST], your balance is L$[BALANCE]
1601 </message> 1593 </message>
1602 </alert> 1594 </alert>
1603 <alert modal="true" name="CannotUploadReason"> 1595 <alert modal="true" name="CannotUploadReason">
@@ -2559,7 +2551,7 @@ You can change your mind later.
2559 </alert> 2551 </alert>
2560 <alert modal="true" name="NotEnoughCurrency"> 2552 <alert modal="true" name="NotEnoughCurrency">
2561 <message name="message"> 2553 <message name="message">
2562 [NAME] L$ [PRICE] You don&apos;t have enough currency to do that. 2554 [NAME] L$ [PRICE] You don&apos;t have enough L$ to do that.
2563 </message> 2555 </message>
2564 </alert> 2556 </alert>
2565 <alert modal="true" name="GrantedModifyRights"> 2557 <alert modal="true" name="GrantedModifyRights">
@@ -2986,6 +2978,20 @@ Download to your Applications folder?
2986 Cancel 2978 Cancel
2987 </option> 2979 </option>
2988 </alert> 2980 </alert>
2981 <alert modal="true" name="WebLaunchReleaseNotes">
2982 <message name="message">
2983 View the [SECOND_LIFE] Release Notes?
2984 </message>
2985 <ignore name="ignore">
2986 When launching web browser to view the Release Notes
2987 </ignore>
2988 <option name="Gotopage">
2989 OK
2990 </option>
2991 <option name="Cancel">
2992 Cancel
2993 </option>
2994 </alert>
2989 <alert modal="true" name="ReturnToOwner"> 2995 <alert modal="true" name="ReturnToOwner">
2990 <message name="message"> 2996 <message name="message">
2991 Are you sure you want to return the selected 2997 Are you sure you want to return the selected
@@ -4262,9 +4268,9 @@ http://secondlife.com/corporate/cs.php
4262 4268
4263All reported abuses of the Terms of Service and Community Standards 4269All reported abuses of the Terms of Service and Community Standards
4264are investigated and resolved. You can view the incident 4270are investigated and resolved. You can view the incident
4265resolution on the Police Blotter at: 4271resolution on the on the Incident Report at:
4266 4272
4267http://secondlife.com/community/blotter.php 4273http://secondlife.com/support/incidentreport.php
4268 </message> 4274 </message>
4269 </alert> 4275 </alert>
4270 <alert modal="true" name="HelpReportAbuseEmailEO"> 4276 <alert modal="true" name="HelpReportAbuseEmailEO">
@@ -4359,7 +4365,7 @@ Entering an accurate description helps us file and process bug reports.
4359 <alert modal="true" name="HelpReportAbuseContainsCopyright"> 4365 <alert modal="true" name="HelpReportAbuseContainsCopyright">
4360 <message name="message"> 4366 <message name="message">
4361 Dear Resident, 4367 Dear Resident,
4362 4368
4363You appear to be reporting intellectual property infringement. Please make sure you are reporting it correctly: 4369You appear to be reporting intellectual property infringement. Please make sure you are reporting it correctly:
4364 4370
4365(1) The Abuse Process. You may submit an abuse report if you believe a Resident is exploiting the Second Life permissions system, for example, by using CopyBot or similar copying tools, to infringe intellectual property rights. The Abuse Team investigates and issues appropriate disciplinary action for behavior that violates the Second Life Community Standards or Terms of Service. However, the Abuse Team does not handle and will not respond to requests to remove content from the Second Life world. 4371(1) The Abuse Process. You may submit an abuse report if you believe a Resident is exploiting the Second Life permissions system, for example, by using CopyBot or similar copying tools, to infringe intellectual property rights. The Abuse Team investigates and issues appropriate disciplinary action for behavior that violates the Second Life Community Standards or Terms of Service. However, the Abuse Team does not handle and will not respond to requests to remove content from the Second Life world.
@@ -4369,8 +4375,9 @@ You appear to be reporting intellectual property infringement. Please make sure
4369If you still wish to continue with the abuse process, please close this window and finish submitting your report. You may need to select the specific category 'CopyBot or Permissions Exploit'. 4375If you still wish to continue with the abuse process, please close this window and finish submitting your report. You may need to select the specific category 'CopyBot or Permissions Exploit'.
4370 4376
4371Thank you, 4377Thank you,
4372 4378
4373Linden Lab</message> 4379Linden Lab
4380 </message>
4374 </alert> 4381 </alert>
4375 <alert modal="true" name="FailedRequirementsCheck"> 4382 <alert modal="true" name="FailedRequirementsCheck">
4376 <message name="message"> 4383 <message name="message">
diff --git a/linden/indra/newview/skins/default/xui/en-us/floater_about.xml b/linden/indra/newview/skins/default/xui/en-us/floater_about.xml
index 91e0f00..f50d1ad 100644
--- a/linden/indra/newview/skins/default/xui/en-us/floater_about.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/floater_about.xml
@@ -14,6 +14,7 @@
14 3Dconnexion SDK Copyright (C) 1992-2007 3Dconnexion 14 3Dconnexion SDK Copyright (C) 1992-2007 3Dconnexion
15 APR Copyright (C) 2000-2004 The Apache Software Foundation 15 APR Copyright (C) 2000-2004 The Apache Software Foundation
16 cURL Copyright (C) 1996-2002, Daniel Stenberg, (daniel@haxx.se) 16 cURL Copyright (C) 1996-2002, Daniel Stenberg, (daniel@haxx.se)
17 DBus/dbus-glib Copyright (C) 2002, 2003 CodeFactory AB / Copyright (C) 2003, 2004 Red Hat, Inc.
17 expat Copyright (C) 1998, 1999, 2000 Thai Open Source Software Center Ltd. 18 expat Copyright (C) 1998, 1999, 2000 Thai Open Source Software Center Ltd.
18 FreeType Copyright (C) 1996-2002, The FreeType Project (www.freetype.org). 19 FreeType Copyright (C) 1996-2002, The FreeType Project (www.freetype.org).
19 GL Copyright (C) 1999-2004 Brian Paul. 20 GL Copyright (C) 1999-2004 Brian Paul.
diff --git a/linden/indra/newview/skins/default/xui/en-us/floater_about_land.xml b/linden/indra/newview/skins/default/xui/en-us/floater_about_land.xml
index fc1b747..0b4b37c 100644
--- a/linden/indra/newview/skins/default/xui/en-us/floater_about_land.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/floater_about_land.xml
@@ -481,13 +481,17 @@ Go to World menu > About Land or select another parcel to show its details.
481 </text> 481 </text>
482 <check_box bottom="-40" enabled="true" follows="left|top" font="SansSerifSmall" 482 <check_box bottom="-40" enabled="true" follows="left|top" font="SansSerifSmall"
483 height="16" initial_value="false" label="Edit Terrain" left="14" 483 height="16" initial_value="false" label="Edit Terrain" left="14"
484 mouse_opaque="true" name="edit land check" radio_style="false" width="268" /> 484 mouse_opaque="true" name="edit land check" radio_style="false"
485 tool_tip="If checked, anyone can terraform your land. It is best to leave this unchecked, as you can always edit your own land."
486 width="268" />
485 <check_box bottom="-60" enabled="true" follows="left|top" font="SansSerifSmall" 487 <check_box bottom="-60" enabled="true" follows="left|top" font="SansSerifSmall"
486 height="16" initial_value="false" label="Create Landmarks" left="14" 488 height="16" initial_value="false" label="Create Landmarks" left="14"
487 mouse_opaque="true" name="check landmark" radio_style="false" width="268" /> 489 mouse_opaque="true" name="check landmark" radio_style="false" width="268" />
488 <check_box bottom="-80" enabled="true" follows="left|top" font="SansSerifSmall" 490 <check_box bottom="-80" enabled="true" follows="left|top" font="SansSerifSmall"
489 height="16" initial_value="false" label="Fly" left="14" mouse_opaque="true" 491 height="16" initial_value="false" label="Fly" left="14" mouse_opaque="true"
490 name="check fly" radio_style="false" width="268" /> 492 name="check fly" radio_style="false"
493 tool_tip="If checked, Residents can fly on your land. If unchecked, they can only fly into and over your land."
494 width="268" />
491 <text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false" 495 <text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
492 bottom="-40" drop_shadow_visible="true" enabled="true" follows="left|top" 496 bottom="-40" drop_shadow_visible="true" enabled="true" follows="left|top"
493 font="SansSerifSmall" h_pad="0" halign="left" height="16" left="178" 497 font="SansSerifSmall" h_pad="0" halign="left" height="16" left="178"
@@ -538,11 +542,13 @@ Go to World menu > About Land or select another parcel to show its details.
538 </text> 542 </text>
539 <check_box bottom="-120" enabled="true" follows="left|top" font="SansSerifSmall" 543 <check_box bottom="-120" enabled="true" follows="left|top" font="SansSerifSmall"
540 height="16" initial_value="false" label="Safe (no damage)" left="14" 544 height="16" initial_value="false" label="Safe (no damage)" left="14"
541 mouse_opaque="true" name="check safe" radio_style="false" width="268" /> 545 mouse_opaque="true" name="check safe" radio_style="false"
546 tool_tip="If checked, sets the land to Safe, disabling damage combat. If cleared, damage combat is enabled."
547 width="268" />
542 <check_box bottom="-120" enabled="true" follows="left|top" font="SansSerifSmall" 548 <check_box bottom="-120" enabled="true" follows="left|top" font="SansSerifSmall"
543 height="16" initial_value="false" label="Restrict Pushing" left="178" 549 height="16" initial_value="false" label="No Pushing" left="178"
544 mouse_opaque="true" name="PushRestrictCheck" radio_style="false" 550 mouse_opaque="true" name="PushRestrictCheck" radio_style="false"
545 tool_tip="llPushObject will only work through parcel owner scripts or on scripts where the pushee is the script owner." 551 tool_tip="Prevents scripts from pushing. Checking this option may be useful for preventing disruptive behavior on your land."
546 width="119" /> 552 width="119" />
547 <check_box bottom="-140" enabled="true" follows="left|top" font="SansSerifSmall" 553 <check_box bottom="-140" enabled="true" follows="left|top" font="SansSerifSmall"
548 height="16" initial_value="false" 554 height="16" initial_value="false"
@@ -622,7 +628,7 @@ Go to World menu > About Land or select another parcel to show its details.
622 <button bottom="-303" enabled="true" follows="left|top" font="SansSerifSmall" 628 <button bottom="-303" enabled="true" follows="left|top" font="SansSerifSmall"
623 halign="center" height="16" label="Set" label_selected="Set" left="236" 629 halign="center" height="16" label="Set" label_selected="Set" left="236"
624 mouse_opaque="true" name="Set" scale_image="true" 630 mouse_opaque="true" name="Set" scale_image="true"
625 tool_tip="Set the landing point to your avatar&apos;s location. It must be inside this land parcel." 631 tool_tip="Sets the landing point where visitors arrive. Sets to your avatar&apos;s location inside this parcel."
626 width="50" /> 632 width="50" />
627 <button bottom="-303" enabled="true" follows="left|top" font="SansSerifSmall" 633 <button bottom="-303" enabled="true" follows="left|top" font="SansSerifSmall"
628 halign="center" height="16" label="Clear" label_selected="Clear" left="291" 634 halign="center" height="16" label="Clear" label_selected="Clear" left="291"
@@ -650,10 +656,10 @@ Go to World menu > About Land or select another parcel to show its details.
650 </combo_item> 656 </combo_item>
651 </combo_box> 657 </combo_box>
652 <string name="push_restrict_text"> 658 <string name="push_restrict_text">
653 Restrict Pushing 659 No Pushing
654 </string> 660 </string>
655 <string name="push_restrict_region_text"> 661 <string name="push_restrict_region_text">
656 Restrict Pushing (Region Override) 662 No Pushing (Region Override)
657 </string> 663 </string>
658 </panel> 664 </panel>
659 <panel border="true" bottom="-349" enabled="true" follows="left|top|right|bottom" 665 <panel border="true" bottom="-349" enabled="true" follows="left|top|right|bottom"
diff --git a/linden/indra/newview/skins/default/xui/en-us/floater_beacons.xml b/linden/indra/newview/skins/default/xui/en-us/floater_beacons.xml
new file mode 100644
index 0000000..0fb1aaf
--- /dev/null
+++ b/linden/indra/newview/skins/default/xui/en-us/floater_beacons.xml
@@ -0,0 +1,24 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
2<floater can_close="true" can_drag_on_left="false" can_minimize="true" can_resize="false"
3 width="250" height="225"
4 name="beacons" title="Beacons"
5 rect_control="FloaterBeaconsRect" control_name="BeaconAlwaysOn">
6 <panel bottom="10" follows="left|top|right|bottom" left="10" width="230" height="200" name="beacons_panel">
7 <check_box bottom_delta="-33" follows="left|top" left="0" name="touch_only" label="Scripted Objects with Touch Only" control_name="scripttouchbeacon" />
8 <check_box bottom_delta="-20" follows="left|top" left="0" name="scripted" label="Scripted Objects" control_name="scriptsbeacon" />
9 <check_box bottom_delta="-20" follows="left|top" left="0" name="physical" label="Physical Objects" control_name="physicalbeacon" />
10 <check_box bottom_delta="-20" follows="left|top" left="0" name="sounds" label="Sound Sources" control_name="soundsbeacon" />
11 <check_box bottom_delta="-20" follows="left|top" left="0" name="particles" label="Particle Sources" control_name="particlesbeacon" />
12 <check_box bottom_delta="-20" follows="left|top" left="0" name="highlights" label="Render Highlights" control_name="renderhighlights" />
13 <check_box bottom_delta="-20" follows="left|top" left="0" name="beacons" label="Render Beacons" control_name="renderbeacons" />
14 <text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
15 bottom_delta="-30" drop_shadow_visible="true" enabled="true" follows="left|top"
16 font="SansSerifSmall" h_pad="0" halign="left" height="12" left="5"
17 mouse_opaque="true" name="beacon_width_label" v_pad="0" width="128">
18 Beacon Width:
19 </text>
20 <slider bottom_delta="-20" can_edit_text="false" enabled="true" width="185" height="16" mouse_opaque="true"
21 decimal_digits="0" increment="1" initial_val="1" left="30" min_val="1.0" max_val="16.0"
22 name="beacon_width" show_text="true" value="1" control_name="DebugBeaconLineWidth"/>
23 </panel>
24</floater>
diff --git a/linden/indra/newview/skins/default/xui/en-us/floater_chat_history.xml b/linden/indra/newview/skins/default/xui/en-us/floater_chat_history.xml
index 6bd4424..4be65b6 100644
--- a/linden/indra/newview/skins/default/xui/en-us/floater_chat_history.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/floater_chat_history.xml
@@ -46,14 +46,16 @@
46 bottom="28" embedded_items="false" enabled="false" 46 bottom="28" embedded_items="false" enabled="false"
47 follows="left|top|right|bottom" font="SansSerif" height="74" left="5" 47 follows="left|top|right|bottom" font="SansSerif" height="74" left="5"
48 max_length="2147483647" mouse_opaque="true" name="Chat History Editor" 48 max_length="2147483647" mouse_opaque="true" name="Chat History Editor"
49 track_bottom="true"
49 text_color="ChatHistoryTextColor" 50 text_color="ChatHistoryTextColor"
50 text_readonly_color="ChatHistoryTextColor" width="299" word_wrap="true" /> 51 text_readonly_color="ChatHistoryTextColor" width="299" word_wrap="true" />
51 <text_editor type="string" length="1" bg_readonly_color="ChatHistoryBgColor" bg_writeable_color="ChatHistoryBgColor" 52 <text_editor type="string" length="1" bg_readonly_color="ChatHistoryBgColor" bg_writeable_color="ChatHistoryBgColor"
52 bottom="28" embedded_items="false" enabled="false" 53 bottom="28" embedded_items="false" enabled="false"
53 follows="left|top|right|bottom" font="SansSerif" height="74" left="5" 54 follows="left|top|right|bottom" font="SansSerif" height="74" left="5"
54 max_length="2147483647" mouse_opaque="true" 55 max_length="2147483647" mouse_opaque="true"
55 name="Chat History Editor with mute" text_color="ChatHistoryTextColor" 56 name="Chat History Editor with mute" text_color="ChatHistoryTextColor"
56 text_readonly_color="ChatHistoryTextColor" width="300" word_wrap="true" /> 57 track_bottom="true"
58 text_readonly_color="ChatHistoryTextColor" width="300" word_wrap="true"/>
57 <panel bottom="5" follows="left|right|bottom" left="5" name="chat_panel" right="-5" 59 <panel bottom="5" follows="left|right|bottom" left="5" name="chat_panel" right="-5"
58 tab_group="1" top="25"> 60 tab_group="1" top="25">
59 <string name="gesture_label">Gestures</string> 61 <string name="gesture_label">Gestures</string>
@@ -72,6 +74,9 @@
72 <flyout_button_item value="say" name="say_item"> 74 <flyout_button_item value="say" name="say_item">
73 Say 75 Say
74 </flyout_button_item> 76 </flyout_button_item>
77 <flyout_button_item value="whisper" name="whisper_item">
78 Whisper
79 </flyout_button_item>
75 </flyout_button> 80 </flyout_button>
76 </panel> 81 </panel>
77 </layout_panel> 82 </layout_panel>
diff --git a/linden/indra/newview/skins/default/xui/en-us/floater_instant_message.xml b/linden/indra/newview/skins/default/xui/en-us/floater_instant_message.xml
index cce06b5..37eb644 100644
--- a/linden/indra/newview/skins/default/xui/en-us/floater_instant_message.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/floater_instant_message.xml
@@ -56,6 +56,7 @@
56 follows="left|top|right|bottom" font="SansSerif" height="221" left="5" 56 follows="left|top|right|bottom" font="SansSerif" height="221" left="5"
57 max_length="2147483647" mouse_opaque="true" name="im_history" 57 max_length="2147483647" mouse_opaque="true" name="im_history"
58 text_color="ChatHistoryTextColor" 58 text_color="ChatHistoryTextColor"
59 track_bottom="true"
59 text_readonly_color="ChatHistoryTextColor" width="487" word_wrap="true" /> 60 text_readonly_color="ChatHistoryTextColor" width="487" word_wrap="true" />
60 <line_editor bevel_style="in" border_style="line" border_thickness="1" bottom="7" 61 <line_editor bevel_style="in" border_style="line" border_thickness="1" bottom="7"
61 follows="left|right|bottom" font="SansSerif" height="20" 62 follows="left|right|bottom" font="SansSerif" height="20"
diff --git a/linden/indra/newview/skins/default/xui/en-us/floater_instant_message_ad_hoc.xml b/linden/indra/newview/skins/default/xui/en-us/floater_instant_message_ad_hoc.xml
index eea285c..54e4cee 100644
--- a/linden/indra/newview/skins/default/xui/en-us/floater_instant_message_ad_hoc.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/floater_instant_message_ad_hoc.xml
@@ -48,6 +48,7 @@
48 bottom="-265" embedded_items="false" enabled="false" 48 bottom="-265" embedded_items="false" enabled="false"
49 follows="left|top|right|bottom" font="SansSerif" height="239" left="5" 49 follows="left|top|right|bottom" font="SansSerif" height="239" left="5"
50 max_length="2147483647" mouse_opaque="true" name="im_history" 50 max_length="2147483647" mouse_opaque="true" name="im_history"
51 track_bottom="true"
51 text_color="ChatHistoryTextColor" 52 text_color="ChatHistoryTextColor"
52 text_readonly_color="ChatHistoryTextColor" width="490" word_wrap="true" /> 53 text_readonly_color="ChatHistoryTextColor" width="490" word_wrap="true" />
53 <line_editor bevel_style="in" border_style="line" border_thickness="1" bottom="7" 54 <line_editor bevel_style="in" border_style="line" border_thickness="1" bottom="7"
diff --git a/linden/indra/newview/skins/default/xui/en-us/floater_instant_message_group.xml b/linden/indra/newview/skins/default/xui/en-us/floater_instant_message_group.xml
index be18c7e..45504e1 100644
--- a/linden/indra/newview/skins/default/xui/en-us/floater_instant_message_group.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/floater_instant_message_group.xml
@@ -64,6 +64,7 @@
64 follows="left|top|right|bottom" font="SansSerif" left="4" 64 follows="left|top|right|bottom" font="SansSerif" left="4"
65 max_length="2147483647" mouse_opaque="true" name="im_history" 65 max_length="2147483647" mouse_opaque="true" name="im_history"
66 text_color="ChatHistoryTextColor" 66 text_color="ChatHistoryTextColor"
67 track_bottom="true"
67 text_readonly_color="ChatHistoryTextColor" top="104" width="170" 68 text_readonly_color="ChatHistoryTextColor" top="104" width="170"
68 word_wrap="true" /> 69 word_wrap="true" />
69 <line_editor bevel_style="in" border_style="line" border_thickness="1" bottom="7" 70 <line_editor bevel_style="in" border_style="line" border_thickness="1" bottom="7"
diff --git a/linden/indra/newview/skins/default/xui/en-us/menu_pie_object.xml b/linden/indra/newview/skins/default/xui/en-us/menu_pie_object.xml
index c5a04ce..df9b2a0 100644
--- a/linden/indra/newview/skins/default/xui/en-us/menu_pie_object.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/menu_pie_object.xml
@@ -53,11 +53,11 @@
53 </menu_item_call> 53 </menu_item_call>
54 <menu_item_separator /> 54 <menu_item_separator />
55 <menu_item_separator /> 55 <menu_item_separator />
56 <menu_item_separator />
57 <menu_item_call enabled="false" label="Mute" mouse_opaque="true" name="Object Mute"> 56 <menu_item_call enabled="false" label="Mute" mouse_opaque="true" name="Object Mute">
58 <on_click function="Object.Mute" /> 57 <on_click function="Object.Mute" />
59 <on_enable function="Object.EnableMute" /> 58 <on_enable function="Object.EnableMute" />
60 </menu_item_call> 59 </menu_item_call>
60 <menu_item_separator />
61 <menu_item_call enabled="true" label="Inspect" mouse_opaque="true" name="Object Inspect"> 61 <menu_item_call enabled="true" label="Inspect" mouse_opaque="true" name="Object Inspect">
62 <on_click function="Object.Inspect" /> 62 <on_click function="Object.Inspect" />
63 <on_enable function="Object.EnableInspect" /> 63 <on_enable function="Object.EnableInspect" />
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 bbe9fbd..2728962 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
@@ -262,13 +262,11 @@
262 </menu_item_check> 262 </menu_item_check>
263 <menu_item_check bottom="-132" enabled="true" height="19" label="Local Chat" left="0" 263 <menu_item_check bottom="-132" enabled="true" height="19" label="Local Chat" left="0"
264 mouse_opaque="true" name="Chat History" shortcut="control|H" width="211"> 264 mouse_opaque="true" name="Chat History" shortcut="control|H" width="211">
265 <on_click function="ShowFloater" userdata="chat history" /> 265 <on_click function="View.Communicate"/>
266 <on_check function="FloaterVisible" userdata="chat history" />
267 </menu_item_check> 266 </menu_item_check>
268 <menu_item_check bottom="-151" enabled="true" height="19" label="Communicate" left="0" 267 <menu_item_check bottom="-151" enabled="true" height="19" label="Communicate" left="0"
269 mouse_opaque="true" name="Instant Message" shortcut="control|T" width="211"> 268 mouse_opaque="true" name="Instant Message" shortcut="control|T" width="211">
270 <on_click function="ShowFloater" userdata="im" /> 269 <on_click function="View.Communicate"/>
271 <on_check function="FloaterVisible" userdata="im" />
272 </menu_item_check> 270 </menu_item_check>
273 <menu_item_call bottom="-170" enabled="true" height="19" label="Inventory" left="0" 271 <menu_item_call bottom="-170" enabled="true" height="19" label="Inventory" left="0"
274 mouse_opaque="true" name="Inventory" shortcut="control|I" width="211"> 272 mouse_opaque="true" name="Inventory" shortcut="control|I" width="211">
@@ -356,87 +354,19 @@
356 <on_click function="View.HighlightTransparent" userdata="" /> 354 <on_click function="View.HighlightTransparent" userdata="" />
357 <on_check function="View.CheckHighlightTransparent" /> 355 <on_check function="View.CheckHighlightTransparent" />
358 </menu_item_check> 356 </menu_item_check>
359 <menu_item_check bottom="-384" enabled="true" height="19" label="Beacons Always On" left="0" 357 <menu_item_check bottom="-384" enabled="true" height="19" label="Beacons" left="0"
360 mouse_opaque="true" name="Beacons Always On" 358 mouse_opaque="true" name="beacons" width="211" shortcut="control|alt|shift|N">
361 width="211"> 359 <on_click function="ShowFloater" userdata="beacons" />
362 <on_click function="ToggleControl" userdata="BeaconAlwaysOn" /> 360 <on_check function="FloaterVisible" userdata="beacons" />
363 <on_check control="BeaconAlwaysOn" /> 361 </menu_item_check>
364 </menu_item_check> 362 <menu_item_check bottom="-384" enabled="true" height="19" label="Hide Particles" left="0"
365 <menu bottom="-554" create_jump_keys="true" drop_shadow="true" enabled="true" 363 mouse_opaque="true" name="Hide Particles" width="129" shortcut="control|alt|shift|=">
366 height="117" label="Beacons" left="0" mouse_opaque="false" name="Beacons" 364 <on_click function="View.ToggleRenderType" userdata="hideparticles" />
367 opaque="true" tear_off="true" width="129"> 365 <on_check function="View.CheckRenderType" userdata="hideparticles" />
368 <menu_item_check bottom="-29" enabled="true" height="19" 366 </menu_item_check>
369 label="Scripted Objects with Touch Only" left="0" mouse_opaque="true" 367 <menu_item_check bottom="-441" enabled="true" height="19" label="Show HUD Attachments" left="0"
370 name="Scripted Objects With Touch Only" width="129"> 368 mouse_opaque="true" name="Show HUD Attachments" shortcut="alt|shift|H"
371 <on_click function="View.ToggleBeacon" userdata="scripttouchbeacon" /> 369 width="211">
372 <on_check function="View.CheckBeaconEnabled" userdata="scripttouchbeacon" />
373 </menu_item_check>
374 <menu_item_check bottom="-48" enabled="true" height="19" label="Scripted Objects" left="0"
375 mouse_opaque="true" name="Scripted Objects" width="129">
376 <on_click function="View.ToggleBeacon" userdata="scriptsbeacon" />
377 <on_check function="View.CheckBeaconEnabled" userdata="scriptsbeacon" />
378 </menu_item_check>
379 <menu_item_check bottom="-67" enabled="true" height="19" label="Physical Objects" left="0"
380 mouse_opaque="true" name="Physical Objects" width="129">
381 <on_click function="View.ToggleBeacon" userdata="physicalbeacon" />
382 <on_check function="View.CheckBeaconEnabled" userdata="physicalbeacon" />
383 </menu_item_check>
384 <menu_item_check bottom="-86" enabled="true" height="19" label="Sound Sources" left="0"
385 mouse_opaque="true" name="Sound Sources" width="129">
386 <on_click function="View.ToggleBeacon" userdata="soundsbeacon" />
387 <on_check function="View.CheckBeaconEnabled" userdata="soundsbeacon" />
388 </menu_item_check>
389 <menu_item_check bottom="-105" enabled="true" height="19" label="Particle Sources" left="0"
390 mouse_opaque="true" name="Particle Sources" width="129">
391 <on_click function="View.ToggleBeacon" userdata="particlesbeacon" />
392 <on_check function="View.CheckBeaconEnabled" userdata="particlesbeacon" />
393 </menu_item_check>
394 <menu_item_separator bottom="-113" enabled="true" height="8" label="-----------" left="0"
395 mouse_opaque="true" name="separator" width="129" />
396 <menu_item_check bottom="-121" enabled="true" height="19" label="Render Highlights" left="0"
397 mouse_opaque="true" name="Render Highlights" width="129">
398 <on_click function="View.ToggleBeacon" userdata="renderhighlights" />
399 <on_check function="View.CheckBeaconEnabled" userdata="renderhighlights" />
400 </menu_item_check>
401 <menu_item_check bottom="-140" enabled="true" height="19" label="Render Beacons" left="0"
402 mouse_opaque="true" name="Render Beacons" width="129">
403 <on_click function="View.ToggleBeacon" userdata="renderbeacons" />
404 <on_check function="View.CheckBeaconEnabled" userdata="renderbeacons" />
405 </menu_item_check>
406 <menu_item_separator bottom="-159" enabled="true" height="8" label="-----------" left="0"
407 mouse_opaque="true" name="separator2" width="129" />
408 <menu_item_check bottom="-167" enabled="true" height="19" label="Hide Particles" left="0"
409 mouse_opaque="true" name="Hide Particles" width="129">
410 <on_click function="View.ToggleRenderType" userdata="hideparticles" />
411 <on_check function="View.CheckRenderType" userdata="hideparticles" />
412 </menu_item_check>
413 <menu_item_separator bottom="-186" enabled="true" height="8" label="-----------" left="0"
414 mouse_opaque="true" name="separator3" width="129" />
415 <menu bottom="-205" color="0 0 0 1" create_jump_keys="true" drop_shadow="true"
416 enabled="true" height="117" label="Beacon Width" left="0"
417 mouse_opaque="false" name="Beacon Width" opaque="true" tear_off="true"
418 width="129">
419 <menu_item_call bottom="-19" enabled="true" height="19" label="1" left="0" mouse_opaque="true"
420 name="Beacon Width 1" width="188">
421 <on_click function="View.BeaconWidth" userdata="1" />
422 </menu_item_call>
423 <menu_item_call bottom="-19" enabled="true" height="19" label="4" left="0" mouse_opaque="true"
424 name="Beacon Width 4" width="188">
425 <on_click function="View.BeaconWidth" userdata="4" />
426 </menu_item_call>
427 <menu_item_call bottom="-19" enabled="true" height="19" label="16" left="0" mouse_opaque="true"
428 name="Beacon Width 16" width="188">
429 <on_click function="View.BeaconWidth" userdata="16" />
430 </menu_item_call>
431 <menu_item_call bottom="-19" enabled="true" height="19" label="32" left="0" mouse_opaque="true"
432 name="Beacon Width 32" width="188">
433 <on_click function="View.BeaconWidth" userdata="32" />
434 </menu_item_call>
435 </menu>
436 </menu>
437 <menu_item_check bottom="-441" enabled="true" height="19" label="Show HUD Attachments" left="0"
438 mouse_opaque="true" name="Show HUD Attachments" shortcut="alt|shift|H"
439 width="211">
440 <on_click function="View.ShowHUDAttachments" userdata="" /> 370 <on_click function="View.ShowHUDAttachments" userdata="" />
441 <on_check function="View.CheckHUDAttachments" /> 371 <on_check function="View.CheckHUDAttachments" />
442 </menu_item_check> 372 </menu_item_check>
@@ -792,10 +722,6 @@
792 </menu_item_call> 722 </menu_item_call>
793 <menu_item_separator bottom="-102" enabled="true" height="8" label="-----------" left="0" 723 <menu_item_separator bottom="-102" enabled="true" height="8" label="-----------" left="0"
794 mouse_opaque="true" name="separator2" width="166" /> 724 mouse_opaque="true" name="separator2" width="166" />
795 <menu_item_call bottom="-121" enabled="true" height="19" label="Scripting Guide..." left="0"
796 mouse_opaque="true" name="Scripting Guide..." width="166">
797 <on_click function="PromptShowFile" userdata="WebLaunchLSLGuide,lsl_guide.html" />
798 </menu_item_call>
799 <menu_item_call bottom="-140" enabled="true" height="19" label="Scripting Portal..." left="0" 725 <menu_item_call bottom="-140" enabled="true" height="19" label="Scripting Portal..." left="0"
800 mouse_opaque="true" name="Scripting Portal..." width="166"> 726 mouse_opaque="true" name="Scripting Portal..." width="166">
801 <on_click function="PromptShowURL" 727 <on_click function="PromptShowURL"
diff --git a/linden/indra/newview/skins/default/xui/en-us/notify.xml b/linden/indra/newview/skins/default/xui/en-us/notify.xml
index 6af19ee..63396af 100644
--- a/linden/indra/newview/skins/default/xui/en-us/notify.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/notify.xml
@@ -374,7 +374,7 @@ You cannot fly here.
374 </notify> 374 </notify>
375 <notify name="PushRestricted" tip="false" unique="true"> 375 <notify name="PushRestricted" tip="false" unique="true">
376 <message name="message"> 376 <message name="message">
377 This land is &apos;llPushObject Restricted&apos;. 377 This land is &apos;No Pushing&apos;.
378You cannot push others here unless you own the land. 378You cannot push others here unless you own the land.
379 </message> 379 </message>
380 </notify> 380 </notify>
diff --git a/linden/indra/newview/skins/default/xui/en-us/panel_chat_bar.xml b/linden/indra/newview/skins/default/xui/en-us/panel_chat_bar.xml
index 95604ff..ce6d35b 100644
--- a/linden/indra/newview/skins/default/xui/en-us/panel_chat_bar.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/panel_chat_bar.xml
@@ -17,15 +17,20 @@
17 <flyout_button bottom="-23" follows="right|bottom" height="20" label="Say" left_delta="110" 17 <flyout_button bottom="-23" follows="right|bottom" height="20" label="Say" left_delta="110"
18 list_position="above" mouse_opaque="true" name="Say" tool_tip="(Enter)" 18 list_position="above" mouse_opaque="true" name="Say" tool_tip="(Enter)"
19 width="80"> 19 width="80">
20 <flyout_button_item value="shout" name="shout_item">
21 Shout
22 </flyout_button_item>
20 <flyout_button_item value="say" name="say_item"> 23 <flyout_button_item value="say" name="say_item">
21 Say 24 Say
22 </flyout_button_item> 25 </flyout_button_item>
23 <flyout_button_item value="shout" name="shout_item"> 26 <flyout_button_item value="whisper" name="whisper_item">
24 Shout 27 Whisper
25 </flyout_button_item> 28 </flyout_button_item>
26 </flyout_button> 29 </flyout_button>
27 <combo_box allow_text_entry="false" bottom="-23" follows="right|bottom" height="20" 30 <combo_box allow_text_entry="false" bottom="-23" follows="right|bottom" height="20"
28 label="Gestures" left_delta="85" max_chars="20" name="Gesture" width="90"> 31 label="Gestures" left_delta="85" max_chars="20" name="Gesture" width="90">
32 <combo_item name="Gestures">
33 Gestures
34 </combo_item>
29 </combo_box> 35 </combo_box>
30 <string name="gesture_label">Gestures</string>
31</panel> 36</panel>
diff --git a/linden/indra/newview/skins/default/xui/en-us/panel_preferences_chat.xml b/linden/indra/newview/skins/default/xui/en-us/panel_preferences_chat.xml
index b2bb65f..24753d1 100644
--- a/linden/indra/newview/skins/default/xui/en-us/panel_preferences_chat.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/panel_preferences_chat.xml
@@ -8,9 +8,9 @@
8 mouse_opaque="false" name="text_box" v_pad="0" width="128"> 8 mouse_opaque="false" name="text_box" v_pad="0" width="128">
9 Chat Font Size: 9 Chat Font Size:
10 </text> 10 </text>
11 <radio_group bottom="-40" control_name="ChatFontSize" draw_border="true" enabled="true" 11 <radio_group bottom="-40" draw_border="true" enabled="true"
12 follows="left|top" height="30" left="148" mouse_opaque="true" 12 follows="left|top" height="30" left="148" mouse_opaque="true"
13 name="chat font size" width="331"> 13 name="chat_font_size" width="331">
14 <radio_item type="string" length="1" bottom="-24" enabled="true" height="16" left="0" mouse_opaque="true" 14 <radio_item type="string" length="1" bottom="-24" enabled="true" height="16" left="0" mouse_opaque="true"
15 name="radio" width="98"> 15 name="radio" width="98">
16 Small 16 Small
@@ -39,12 +39,12 @@
39 enabled="true" follows="left|top" height="56" label="Others" left_delta="48" 39 enabled="true" follows="left|top" height="56" label="Others" left_delta="48"
40 mouse_opaque="true" name="agent" width="44" /> 40 mouse_opaque="true" name="agent" width="44" />
41 <color_swatch border_color="0.45098 0.517647 0.607843 1" bottom="-108" 41 <color_swatch border_color="0.45098 0.517647 0.607843 1" bottom="-108"
42 can_apply_immediately="true" color="0.6 0.6 1 1" control_name="IMChatColor" 42 can_apply_immediately="true" color="0.6 0.6 1 1"
43 enabled="true" follows="left|top" height="56" label="IM" left_delta="48" 43 enabled="true" follows="left|top" height="56" label="IM" left_delta="48"
44 mouse_opaque="true" name="im" width="44" /> 44 mouse_opaque="true" name="im" width="44" />
45 <color_swatch border_color="0.45098 0.517647 0.607843 1" bottom="-108" 45 <color_swatch border_color="0.45098 0.517647 0.607843 1" bottom="-108"
46 can_apply_immediately="true" color="0.8 1 1 1" 46 can_apply_immediately="true" color="0.8 1 1 1"
47 control_name="SystemChatColor" enabled="true" follows="left|top" 47 enabled="true" follows="left|top"
48 height="56" label="System" left_delta="48" mouse_opaque="true" 48 height="56" label="System" left_delta="48" mouse_opaque="true"
49 name="system" width="44" /> 49 name="system" width="44" />
50 <color_swatch border_color="0.45098 0.517647 0.607843 1" bottom="-108" 50 <color_swatch border_color="0.45098 0.517647 0.607843 1" bottom="-108"
@@ -59,17 +59,17 @@
59 name="objects" width="44" /> 59 name="objects" width="44" />
60 <color_swatch border_color="0.45098 0.517647 0.607843 1" bottom="-165" 60 <color_swatch border_color="0.45098 0.517647 0.607843 1" bottom="-165"
61 can_apply_immediately="true" color="0.7 0.9 0.7 1" 61 can_apply_immediately="true" color="0.7 0.9 0.7 1"
62 control_name="llOwnerSayChatColor" enabled="true" follows="left|top" 62 enabled="true" follows="left|top"
63 height="56" label="Owner" left_delta="48" mouse_opaque="true" name="owner" 63 height="56" label="Owner" left_delta="48" mouse_opaque="true" name="owner"
64 width="44" /> 64 width="44" />
65 <color_swatch border_color="0.45098 0.517647 0.607843 1" bottom="-165" 65 <color_swatch border_color="0.45098 0.517647 0.607843 1" bottom="-165"
66 can_apply_immediately="true" color="0 0 0 1" 66 can_apply_immediately="true" color="0 0 0 1"
67 control_name="BackgroundChatColor" enabled="true" follows="left|top" 67 enabled="true" follows="left|top"
68 height="56" label="Bubble" left_delta="48" mouse_opaque="true" 68 height="56" label="Bubble" left_delta="48" mouse_opaque="true"
69 name="background" width="44" /> 69 name="background" width="44" />
70 <color_swatch border_color="0.45098 0.517647 0.607843 1" bottom="-165" 70 <color_swatch border_color="0.45098 0.517647 0.607843 1" bottom="-165"
71 can_apply_immediately="true" color="0.6 0.6 1 1" 71 can_apply_immediately="true" color="0.6 0.6 1 1"
72 control_name="HTMLLinkColor" enabled="true" follows="left|top" height="56" 72 enabled="true" follows="left|top" height="56"
73 label="URLs" left_delta="48" mouse_opaque="true" name="links" width="44" /> 73 label="URLs" left_delta="48" mouse_opaque="true" name="links" width="44" />
74 <text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false" 74 <text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
75 bottom="-185" drop_shadow_visible="true" enabled="true" follows="left|top" 75 bottom="-185" drop_shadow_visible="true" enabled="true" follows="left|top"
@@ -100,7 +100,7 @@
100 width="80"> 100 width="80">
101 (seconds) 101 (seconds)
102 </text> 102 </text>
103 <spinner bottom_delta="-6" control_name="ConsoleMaxLines" decimal_digits="0" 103 <spinner bottom_delta="-6" decimal_digits="0"
104 enabled="true" follows="left|top" height="16" increment="1" 104 enabled="true" follows="left|top" height="16" increment="1"
105 initial_val="10" left="340" max_val="50" min_val="1" mouse_opaque="true" 105 initial_val="10" left="340" max_val="50" min_val="1" mouse_opaque="true"
106 name="max_chat_count" width="60" /> 106 name="max_chat_count" width="60" />
@@ -127,20 +127,20 @@
127 mouse_opaque="false" name="text_box6" v_pad="0" width="135"> 127 mouse_opaque="false" name="text_box6" v_pad="0" width="135">
128 Chat Options: 128 Chat Options:
129 </text> 129 </text>
130 <check_box bottom_delta="-10" control_name="CloseChatOnReturn" enabled="true" 130 <check_box bottom_delta="-10" enabled="true"
131 follows="left|top" font="SansSerifSmall" height="16" initial_value="false" 131 follows="left|top" font="SansSerifSmall" height="16" initial_value="false"
132 label="Close chat bar after hitting return" left="148" mouse_opaque="true" 132 label="Close chat bar after hitting return" left="148" mouse_opaque="true"
133 name="close_chat_on_return_check" radio_style="false" width="237" /> 133 name="close_chat_on_return_check" radio_style="false" width="237" />
134 <check_box bottom_delta="-20" control_name="ArrowKeysMoveAvatar" enabled="true" 134 <check_box bottom_delta="-20" enabled="true"
135 follows="left|top" font="SansSerifSmall" height="16" initial_value="false" 135 follows="left|top" font="SansSerifSmall" height="16" initial_value="false"
136 label="Arrow keys always move avatar when chatting" left="148" 136 label="Arrow keys always move avatar when chatting" left="148"
137 mouse_opaque="true" name="arrow_keys_move_avatar_check" radio_style="false" 137 mouse_opaque="true" name="arrow_keys_move_avatar_check" radio_style="false"
138 width="237" /> 138 width="237" />
139 <check_box bottom_delta="-20" control_name="ChatShowTimestamps" enabled="true" 139 <check_box bottom_delta="-20" enabled="true"
140 follows="left|top" font="SansSerifSmall" height="16" initial_value="false" 140 follows="left|top" font="SansSerifSmall" height="16" initial_value="false"
141 label="Show timestamps in Local Chat" left="148" mouse_opaque="true" 141 label="Show timestamps in Local Chat" left="148" mouse_opaque="true"
142 name="show_timestamps_check" radio_style="false" width="237" /> 142 name="show_timestamps_check" radio_style="false" width="237" />
143 <check_box bottom_delta="-20" control_name="PlayTypingAnim" enabled="true" 143 <check_box bottom_delta="-20" enabled="true"
144 follows="left|top" font="SansSerifSmall" height="16" initial_value="true" 144 follows="left|top" font="SansSerifSmall" height="16" initial_value="true"
145 label="Play typing animation when chatting" left="148" mouse_opaque="true" 145 label="Play typing animation when chatting" left="148" mouse_opaque="true"
146 name="play_typing_animation" radio_style="false" width="237" /> 146 name="play_typing_animation" radio_style="false" width="237" />
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 67d3307..3648ce6 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,20 +2,21 @@
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 <combo_box allow_text_entry="true" bottom="-24" enabled="true" follows="left|bottom" 5 <radio_group bottom="-45" draw_border="false" follows="left|bottom" height="40" left="151"
6 height="16" left="155" max_chars="128" mouse_opaque="true" 6 name="default_start_location" width="220">
7 name="location_combobox" width="146"> 7 <radio_item bottom="-20" height="20" left="0" name="MyHome" width="50"
8 <combo_item name="MyHome" value="My Home"> 8 tool_tip="Log into my home location by default.">
9 My Home 9 My Home
10 </combo_item> 10 </radio_item>
11 <combo_item name="MyLastLocation" value="My Last Location"> 11 <radio_item bottom="-20" height="20" left="100" name="MyLastLocation" width="50"
12 My Last Location 12 tool_tip="Log into my last location by default.">
13 </combo_item> 13 My Last Location
14 </combo_box> 14 </radio_item>
15 <check_box bottom="-44" control_name="ShowStartLocation" enabled="true" follows="left|top" 15 </radio_group>
16 font="SansSerifSmall" height="16" initial_value="true" 16 <check_box bottom="-44" enabled="true" follows="left|top"
17 label="Show Start Location on Login Screen" left="151" mouse_opaque="true" 17 font="SansSerifSmall" height="16" initial_value="true"
18 name="show_location_checkbox" radio_style="false" width="256" /> 18 label="Show Start Location on Login Screen" left="151" mouse_opaque="true"
19 name="show_location_checkbox" radio_style="false" width="256" />
19 <combo_box bottom_delta="-25" follows="left|top" height="18" left="155" 20 <combo_box bottom_delta="-25" follows="left|top" height="18" left="155"
20 mouse_opaque="true" name="fade_out_combobox" width="146"> 21 mouse_opaque="true" name="fade_out_combobox" width="146">
21 <combo_item name="Never" value="Never"> 22 <combo_item name="Never" value="Never">
@@ -28,11 +29,11 @@
28 Always 29 Always
29 </combo_item> 30 </combo_item>
30 </combo_box> 31 </combo_box>
31 <check_box bottom_delta="-25" control_name="SmallAvatarNames" follows="left|top" 32 <check_box bottom_delta="-25" follows="left|top"
32 font="SansSerifSmall" height="16" initial_value="true" 33 font="SansSerifSmall" height="16" initial_value="true"
33 label="Small Avatar Names" left="151" name="small_avatar_names_checkbox" 34 label="Small Avatar Names" left="151" name="small_avatar_names_checkbox"
34 width="200" /> 35 width="200" />
35 <check_box bottom_delta="-18" control_name="RenderNameHideSelf" follows="left|top" 36 <check_box bottom_delta="-18" follows="left|top"
36 font="SansSerifSmall" height="16" initial_value="false" 37 font="SansSerifSmall" height="16" initial_value="false"
37 label="Hide My Name On My Screen" left="151" name="show_my_name_checkbox" 38 label="Hide My Name On My Screen" left="151" name="show_my_name_checkbox"
38 width="200" /> 39 width="200" />
@@ -41,16 +42,16 @@
41 width="394"> 42 width="394">
42 Group Titles: 43 Group Titles:
43 </text> 44 </text>
44 <check_box bottom_delta="0" control_name="RenderHideGroupTitleAll" follows="left|top" 45 <check_box bottom_delta="0" follows="left|top"
45 font="SansSerifSmall" height="16" initial_value="false" 46 font="SansSerifSmall" height="16" initial_value="false"
46 label="Hide All Group Titles" left="151" mouse_opaque="true" 47 label="Hide All Group Titles" left="151" mouse_opaque="true"
47 name="show_all_title_checkbox" radio_style="false" width="256" /> 48 name="show_all_title_checkbox" radio_style="false" width="256" />
48 <check_box bottom_delta="-18" control_name="RenderHideGroupTitle" follows="left|top" 49 <check_box bottom_delta="-18" follows="left|top"
49 font="SansSerifSmall" height="16" initial_value="false" 50 font="SansSerifSmall" height="16" initial_value="false"
50 label="Hide My Group Title" left="151" name="show_my_title_checkbox" 51 label="Hide My Group Title" left="151" name="show_my_title_checkbox"
51 radio_style="false" width="256" /> 52 radio_style="false" width="256" />
52 <color_swatch border_color="0.45098 0.517647 0.607843 1" bottom="-210" 53 <color_swatch border_color="0.45098 0.517647 0.607843 1" bottom="-210"
53 can_apply_immediately="false" color="1 1 1 1" control_name="EffectColor" 54 can_apply_immediately="false" color="1 1 1 1"
54 enabled="true" follows="left|top" height="48" label="" left="153" 55 enabled="true" follows="left|top" height="48" label="" left="153"
55 mouse_opaque="true" name="effect_color_swatch" 56 mouse_opaque="true" name="effect_color_swatch"
56 tool_tip="Click to open Color Picker" width="32" /> 57 tool_tip="Click to open Color Picker" width="32" />
@@ -60,34 +61,34 @@
60 mouse_opaque="true" name="UI Size:" v_pad="0" width="128"> 61 mouse_opaque="true" name="UI Size:" v_pad="0" width="128">
61 UI Size: 62 UI Size:
62 </text> 63 </text>
63 <slider bottom="-217" can_edit_text="true" control_name="UIScaleFactor" 64 <slider bottom="-217" can_edit_text="true"
64 decimal_digits="3" enabled="true" height="16" increment="0.025" 65 decimal_digits="3" enabled="true" height="16" increment="0.025"
65 initial_val="1" left="148" max_val="1.4" min_val="0.75" mouse_opaque="true" 66 initial_val="1" left="148" max_val="1.4" min_val="0.75" mouse_opaque="true"
66 name="UI Scale" show_text="true" value="1" width="256" /> 67 name="ui_scale_slider" show_text="true" value="1" width="256" />
67 <check_box bottom="-236" control_name="UIAutoScale" enabled="true" follows="left|top" 68 <check_box bottom="-236" enabled="true" follows="left|top"
68 font="SansSerifSmall" height="16" initial_value="false" 69 font="SansSerifSmall" height="16" initial_value="false"
69 label="Use resolution independent scale" left="151" mouse_opaque="true" 70 label="Use resolution independent scale" left="151" mouse_opaque="true"
70 name="ui_auto_scale" radio_style="false" width="256" /> 71 name="ui_auto_scale" radio_style="false" width="256" />
71 <spinner bottom="-260" control_name="AFKTimeout" decimal_digits="0" enabled="true" 72 <spinner bottom="-260" decimal_digits="0" enabled="true"
72 follows="left|top" height="16" increment="1" initial_val="300" 73 follows="left|top" height="16" increment="1" initial_val="300"
73 label="Away Timeout:" label_width="141" left="10" max_val="600" 74 label="Away Timeout:" label_width="141" left="10" max_val="600"
74 min_val="30" mouse_opaque="true" name="afk_timeout_spinner" width="202" /> 75 min_val="30" mouse_opaque="true" name="afk_timeout_spinner" width="202" />
75 <check_box bottom="-286" control_name="MiniMapRotate" enabled="true" follows="left|top" 76 <check_box bottom="-286" enabled="true" follows="left|top"
76 font="SansSerifSmall" height="16" initial_value="false" 77 font="SansSerifSmall" height="16" initial_value="false"
77 label="Rotate Mini-Map" left="151" mouse_opaque="true" 78 label="Rotate Mini-Map" left="151" mouse_opaque="true"
78 name="rotate_mini_map_checkbox" radio_style="false" width="256" /> 79 name="rotate_mini_map_checkbox" radio_style="false" width="256" />
79 <check_box bottom="-304" control_name="NotifyMoneyChange" enabled="true" 80 <check_box bottom="-304" enabled="true"
80 follows="left|top" font="SansSerifSmall" height="16" initial_value="false" 81 follows="left|top" font="SansSerifSmall" height="16" initial_value="false"
81 label="Notify when Linden dollars (L$) spent or received" left="151" 82 label="Notify when Linden dollars (L$) spent or received" left="151"
82 mouse_opaque="true" name="notify_money_change_checkbox" radio_style="false" 83 mouse_opaque="true" name="notify_money_change_checkbox" radio_style="false"
83 width="256" /> 84 width="256" />
84 <check_box bottom="-322" control_name="UseDefaultColorPicker" enabled="true" 85 <check_box bottom="-322" enabled="true"
85 follows="left|top" font="SansSerifSmall" height="16" initial_value="false" 86 follows="left|top" font="SansSerifSmall" height="16" initial_value="false"
86 label="Use default system color picker" left="151" mouse_opaque="true" 87 label="Use default system color picker" left="151" mouse_opaque="true"
87 name="use_system_color_picker_checkbox" radio_style="false" 88 name="use_system_color_picker_checkbox" radio_style="false"
88 tool_tip="Use the default system color picker instead of the one built into Second Life." 89 tool_tip="Use the default system color picker instead of the one built into Second Life."
89 width="256" /> 90 width="256" />
90 <check_box bottom="-340" control_name="ShowSearchBar" enabled="true" follows="left|top" 91 <check_box bottom="-340" enabled="true" follows="left|top"
91 font="SansSerifSmall" height="16" initial_value="false" 92 font="SansSerifSmall" height="16" initial_value="false"
92 label="Show search panel in overlay bar" left="151" mouse_opaque="true" 93 label="Show search panel in overlay bar" left="151" mouse_opaque="true"
93 name="show_search_panel" radio_style="false" 94 name="show_search_panel" radio_style="false"
@@ -151,7 +152,7 @@
151 Never send 152 Never send
152 </combo_item> 153 </combo_item>
153 </combo_box> 154 </combo_box>
154 <combo_box allow_text_entry="true" bottom="-382" control_name="Language" enabled="true" 155 <combo_box allow_text_entry="true" bottom="-382" enabled="true"
155 follows="left|bottom" height="16" left="153" max_chars="135" 156 follows="left|bottom" height="16" left="153" max_chars="135"
156 mouse_opaque="true" name="language_combobox" width="146"> 157 mouse_opaque="true" name="language_combobox" width="146">
157 <combo_item type="string" length="1" enabled="true" name="System Default Language" value="default"> 158 <combo_item type="string" length="1" enabled="true" name="System Default Language" value="default">
@@ -182,7 +183,7 @@
182 Español (Spanish) - Beta 183 Español (Spanish) - Beta
183 </combo_item> 184 </combo_item>
184 </combo_box> 185 </combo_box>
185 <check_box bottom="-400" control_name="LanguageIsPublic" enabled="true" 186 <check_box bottom="-400" enabled="true"
186 follows="left|top" font="SansSerifSmall" height="16" hidden="false" 187 follows="left|top" font="SansSerifSmall" height="16" hidden="false"
187 initial_value="false" label="Share language with objects" left="151" 188 initial_value="false" label="Share language with objects" left="151"
188 mouse_opaque="true" name="language_is_public" 189 mouse_opaque="true" name="language_is_public"
diff --git a/linden/indra/newview/skins/default/xui/en-us/panel_preferences_im.xml b/linden/indra/newview/skins/default/xui/en-us/panel_preferences_im.xml
index d3174af..add894b 100644
--- a/linden/indra/newview/skins/default/xui/en-us/panel_preferences_im.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/panel_preferences_im.xml
@@ -26,15 +26,15 @@
26 height="16" initial_value="false" label="Send IM to Email ([EMAIL])" 26 height="16" initial_value="false" label="Send IM to Email ([EMAIL])"
27 left="148" mouse_opaque="true" name="send_im_to_email" radio_style="false" 27 left="148" mouse_opaque="true" name="send_im_to_email" radio_style="false"
28 width="350" /> 28 width="350" />
29 <check_box bottom="-65" control_name="IMInChatHistory" enabled="true" follows="left|top" 29 <check_box bottom="-65" enabled="true" follows="left|top"
30 font="SansSerifSmall" height="16" initial_value="false" 30 font="SansSerifSmall" height="16" initial_value="false"
31 label="Include IM in Local Chat" left="148" mouse_opaque="true" 31 label="Include IM in Local Chat" left="148" mouse_opaque="true"
32 name="include_im_in_chat_history" radio_style="false" width="237" /> 32 name="include_im_in_chat_history" radio_style="false" width="237" />
33 <check_box bottom="-85" control_name="IMShowTimestamps" enabled="true" follows="left|top" 33 <check_box bottom="-85" enabled="true" follows="left|top"
34 font="SansSerifSmall" height="16" initial_value="false" 34 font="SansSerifSmall" height="16" initial_value="false"
35 label="Show timestamps in IM" left="148" mouse_opaque="true" 35 label="Show timestamps in IM" left="148" mouse_opaque="true"
36 name="show_timestamps_check" radio_style="false" width="237" /> 36 name="show_timestamps_check" radio_style="false" width="237" />
37 <check_box bottom="-105" control_name="ChatOnlineNotification" enabled="true" 37 <check_box bottom="-105" enabled="true"
38 follows="left|top" font="SansSerifSmall" height="16" 38 follows="left|top" font="SansSerifSmall" height="16"
39 initial_value="false" label="Show online Friend notifications" left="148" 39 initial_value="false" label="Show online Friend notifications" left="148"
40 mouse_opaque="true" name="friends_online_notify_checkbox" 40 mouse_opaque="true" name="friends_online_notify_checkbox"
@@ -54,33 +54,33 @@
54 mouse_opaque="false" name="text_box4" v_pad="0" width="128"> 54 mouse_opaque="false" name="text_box4" v_pad="0" width="128">
55 Logging Options: 55 Logging Options:
56 </text> 56 </text>
57 <check_box bottom="-225" control_name="LogInstantMessages" enabled="true" 57 <check_box bottom="-225" enabled="true"
58 follows="left|top" font="SansSerifSmall" height="16" 58 follows="left|top" font="SansSerifSmall" height="16"
59 initial_value="false" label="Save a log of IM on my computer" left="148" 59 initial_value="false" label="Save a log of IM on my computer" left="148"
60 mouse_opaque="true" name="log_instant_messages" radio_style="false" 60 mouse_opaque="true" name="log_instant_messages" radio_style="false"
61 width="237" /> 61 width="237" />
62 <check_box bottom="-245" control_name="IMLogTimestamp" enabled="true" 62 <check_box bottom="-245" enabled="true"
63 follows="left|top" font="SansSerifSmall" height="16" 63 follows="left|top" font="SansSerifSmall" height="16"
64 initial_value="false" label="Show timestamps in IM log" left="168" 64 initial_value="false" label="Show timestamps in IM log" left="168"
65 mouse_opaque="true" name="log_instant_messages_timestamp" radio_style="false" 65 mouse_opaque="true" name="log_instant_messages_timestamp" radio_style="false"
66 width="217" /> 66 width="217" />
67 <check_box bottom="-265" control_name="LogShowHistory" enabled="true" follows="left|top" 67 <check_box bottom="-265" enabled="true" follows="left|top"
68 font="SansSerifSmall" height="16" initial_value="false" 68 font="SansSerifSmall" height="16" initial_value="false"
69 label="Show the end of last IM conversation" left="168" mouse_opaque="true" 69 label="Show the end of last IM conversation" left="168" mouse_opaque="true"
70 name="log_show_history" radio_style="false" width="217" /> 70 name="log_show_history" radio_style="false" width="217" />
71 <check_box bottom="-285" control_name="LogChat" enabled="true" follows="left|top" 71 <check_box bottom="-285" enabled="true" follows="left|top"
72 font="SansSerifSmall" height="16" initial_value="false" label="Save a log of Local Chat on my computer" 72 font="SansSerifSmall" height="16" initial_value="false" label="Save a log of Local Chat on my computer"
73 left="148" mouse_opaque="true" name="log_chat" radio_style="false" 73 left="148" mouse_opaque="true" name="log_chat" radio_style="false"
74 width="237" /> 74 width="237" />
75 <check_box bottom="-305" control_name="LogChatTimestamp" enabled="true" follows="left|top" 75 <check_box bottom="-305" enabled="true" follows="left|top"
76 font="SansSerifSmall" height="16" initial_value="false" 76 font="SansSerifSmall" height="16" initial_value="false"
77 label="Show timestamps in Local Chat log" left="168" mouse_opaque="true" 77 label="Show timestamps in Local Chat log" left="168" mouse_opaque="true"
78 name="log_chat_timestamp" radio_style="false" width="217" /> 78 name="log_chat_timestamp" radio_style="false" width="217" />
79 <check_box bottom="-325" control_name="LogChatIM" enabled="true" follows="left|top" 79 <check_box bottom="-325" enabled="true" follows="left|top"
80 font="SansSerifSmall" height="16" initial_value="false" 80 font="SansSerifSmall" height="16" initial_value="false"
81 label="Show incoming IM in Local Chat log" left="168" mouse_opaque="true" 81 label="Show incoming IM in Local Chat log" left="168" mouse_opaque="true"
82 name="log_chat_IM" radio_style="false" width="217" /> 82 name="log_chat_IM" radio_style="false" width="217" />
83 <check_box bottom="-345" control_name="LogTimestampDate" enabled="true" follows="left|top" 83 <check_box bottom="-345" enabled="true" follows="left|top"
84 font="SansSerifSmall" height="16" initial_value="false" 84 font="SansSerifSmall" height="16" initial_value="false"
85 label="Include date with timestamps" left="148" mouse_opaque="true" 85 label="Include date with timestamps" left="148" mouse_opaque="true"
86 name="log_date_timestamp" radio_style="false" width="237" /> 86 name="log_date_timestamp" radio_style="false" width="237" />
diff --git a/linden/indra/newview/skins/default/xui/en-us/panel_preferences_input.xml b/linden/indra/newview/skins/default/xui/en-us/panel_preferences_input.xml
index 23e357f..a2114af 100644
--- a/linden/indra/newview/skins/default/xui/en-us/panel_preferences_input.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/panel_preferences_input.xml
@@ -14,21 +14,21 @@
14 mouse_opaque="true" name=" Mouse Sensitivity:" v_pad="0" width="128"> 14 mouse_opaque="true" name=" Mouse Sensitivity:" v_pad="0" width="128">
15 Mouse Sensitivity: 15 Mouse Sensitivity:
16 </text> 16 </text>
17 <slider_bar bottom="-26" control_name="MouseSensitivity" enabled="true" follows="left|top" 17 <slider_bar bottom="-26" enabled="true" follows="left|top"
18 height="16" increment="0.25" initial_val="2" left="276" max_val="15" 18 height="16" increment="0.25" initial_val="2" left="276" max_val="15"
19 min_val="0" mouse_opaque="true" name="Mouse Sensitivity" width="128" /> 19 min_val="0" mouse_opaque="true" name="mouse_sensitivity" width="128" />
20 <check_box bottom="-44" control_name="InvertMouse" enabled="true" follows="left|top" 20 <check_box bottom="-44" enabled="true" follows="left|top"
21 font="SansSerifSmall" height="16" label="Invert Mouse" left="148" 21 font="SansSerifSmall" height="16" label="Invert Mouse" left="148"
22 mouse_opaque="true" name="invert mouse" radio_style="false" width="128" /> 22 mouse_opaque="true" name="invert_mouse" radio_style="false" width="128" />
23 <text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false" 23 <text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
24 bottom="-74" drop_shadow_visible="true" enabled="true" follows="left|top" 24 bottom="-74" drop_shadow_visible="true" enabled="true" follows="left|top"
25 font="SansSerifSmall" h_pad="0" halign="left" height="10" left="10" 25 font="SansSerifSmall" h_pad="0" halign="left" height="10" left="10"
26 mouse_opaque="true" name=" Auto Fly Options:" v_pad="0" width="266"> 26 mouse_opaque="true" name=" Auto Fly Options:" v_pad="0" width="266">
27 Auto Fly Options: 27 Auto Fly Options:
28 </text> 28 </text>
29 <check_box bottom="-80" control_name="AutomaticFly" enabled="true" follows="left|top" 29 <check_box bottom="-80" enabled="true" follows="left|top"
30 font="SansSerifSmall" height="16" label="Fly/land on holding up/down" 30 font="SansSerifSmall" height="16" label="Fly/land on holding up/down"
31 left="148" mouse_opaque="true" name="automatic fly" radio_style="false" 31 left="148" mouse_opaque="true" name="automatic_fly" radio_style="false"
32 width="178" /> 32 width="178" />
33 <text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false" 33 <text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
34 bottom="-110" drop_shadow_visible="true" enabled="true" follows="left|top" 34 bottom="-110" drop_shadow_visible="true" enabled="true" follows="left|top"
@@ -42,10 +42,10 @@
42 mouse_opaque="true" name="Camera Follow Distance:" v_pad="0" width="128"> 42 mouse_opaque="true" name="Camera Follow Distance:" v_pad="0" width="128">
43 Camera Follow Distance: 43 Camera Follow Distance:
44 </text> 44 </text>
45 <slider bottom="-116" can_edit_text="true" control_name="DynamicCameraStrength" 45 <slider bottom="-116" can_edit_text="true"
46 decimal_digits="0" enabled="true" follows="left|top" height="16" 46 decimal_digits="0" enabled="true" follows="left|top" height="16"
47 increment="1" initial_val="2" left="276" max_val="10" min_val="0" 47 increment="1" initial_val="2" left="276" max_val="10" min_val="0"
48 mouse_opaque="true" name="DynamicCameraStrength" show_text="true" value="2" 48 mouse_opaque="true" name="dynamic_camera_strength" show_text="true" value="2"
49 width="128" /> 49 width="128" />
50 <text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false" 50 <text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
51 bottom="-134" drop_shadow_visible="true" enabled="true" follows="left|top" 51 bottom="-134" drop_shadow_visible="true" enabled="true" follows="left|top"
@@ -53,31 +53,31 @@
53 mouse_opaque="true" name="Camera Transition Time:" v_pad="0" width="128"> 53 mouse_opaque="true" name="Camera Transition Time:" v_pad="0" width="128">
54 Camera Transition Time: 54 Camera Transition Time:
55 </text> 55 </text>
56 <slider bottom="-140" can_edit_text="true" control_name="ZoomTime" decimal_digits="1" 56 <slider bottom="-140" can_edit_text="true" decimal_digits="1"
57 enabled="true" follows="left|top" height="16" increment="0.1" 57 enabled="true" follows="left|top" height="16" increment="0.1"
58 initial_val="0.4" left="276" max_val="4" min_val="0" mouse_opaque="true" 58 initial_val="0.4" left="276" max_val="4" min_val="0" mouse_opaque="true"
59 name="ZoomTime" show_text="true" value="2" width="128" /> 59 name="zoom_time" show_text="true" value="2" width="128" />
60 <text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false" 60 <text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
61 bottom="-158" drop_shadow_visible="true" enabled="true" follows="left|top" 61 bottom="-158" drop_shadow_visible="true" enabled="true" follows="left|top"
62 font="SansSerifSmall" h_pad="0" halign="left" height="10" left="148" 62 font="SansSerifSmall" h_pad="0" halign="left" height="10" left="148"
63 mouse_opaque="true" name="Camera Smoothing:" v_pad="0" width="128"> 63 mouse_opaque="true" name="Camera Smoothing:" v_pad="0" width="128">
64 Camera Smoothing: 64 Camera Smoothing:
65 </text> 65 </text>
66 <slider bottom="-164" can_edit_text="true" control_name="CameraPositionSmoothing" 66 <slider bottom="-164" can_edit_text="true"
67 decimal_digits="1" enabled="true" follows="left|top" height="16" 67 decimal_digits="1" enabled="true" follows="left|top" height="16"
68 increment="0.1" initial_val="1" left="276" max_val="9" min_val="0" 68 increment="0.1" initial_val="1" left="276" max_val="9" min_val="0"
69 mouse_opaque="true" name="CameraPositionSmoothing" show_text="true" value="2" 69 mouse_opaque="true" name="camera_position_smoothing" show_text="true" value="2"
70 width="128" /> 70 width="128" />
71 <check_box bottom="-188" control_name="EditCameraMovement" enabled="true" 71 <check_box bottom="-188" enabled="true"
72 follows="left|top" font="SansSerifSmall" height="16" initial_value="false" 72 follows="left|top" font="SansSerifSmall" height="16" initial_value="false"
73 label="Automatic Edit Camera Movement" left="148" mouse_opaque="true" 73 label="Automatic Edit Camera Movement" left="148" mouse_opaque="true"
74 name="edit camera movement" radio_style="false" 74 name="edit_camera_movement" radio_style="false"
75 tool_tip="Use automatic camera positioning when entering and exiting edit mode" 75 tool_tip="Use automatic camera positioning when entering and exiting edit mode"
76 width="201" /> 76 width="201" />
77 <check_box bottom="-206" control_name="AppearanceCameraMovement" enabled="true" 77 <check_box bottom="-206" enabled="true"
78 follows="left|top" font="SansSerifSmall" height="16" initial_value="false" 78 follows="left|top" font="SansSerifSmall" height="16" initial_value="false"
79 label="Automatic Appearance Camera Movement" left="148" mouse_opaque="true" 79 label="Automatic Appearance Camera Movement" left="148" mouse_opaque="true"
80 name="appearance camera movement" radio_style="false" 80 name="appearance_camera_movement" radio_style="false"
81 tool_tip="Use automatic camera positioning while in edit mode" width="242" /> 81 tool_tip="Use automatic camera positioning while in edit mode" width="242" />
82 <text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false" 82 <text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
83 bottom="-228" drop_shadow_visible="true" enabled="true" follows="left|top" 83 bottom="-228" drop_shadow_visible="true" enabled="true" follows="left|top"
@@ -85,9 +85,9 @@
85 mouse_opaque="true" name="text2" v_pad="0" width="128"> 85 mouse_opaque="true" name="text2" v_pad="0" width="128">
86 Avatar Display Options: 86 Avatar Display Options:
87 </text> 87 </text>
88 <check_box bottom="-232" control_name="FirstPersonAvatarVisible" enabled="true" 88 <check_box bottom="-232" enabled="true"
89 follows="left|top" font="SansSerifSmall" height="16" initial_value="false" 89 follows="left|top" font="SansSerifSmall" height="16" initial_value="false"
90 label="Show Avatar in Mouselook" left="148" mouse_opaque="true" name="avfp" 90 label="Show Avatar in Mouselook" left="148" mouse_opaque="true" name="first_person_avatar_visible"
91 radio_style="false" width="256" /> 91 radio_style="false" width="256" />
92 <text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false" 92 <text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
93 bottom="-264" drop_shadow_visible="true" enabled="true" follows="left|top" 93 bottom="-264" drop_shadow_visible="true" enabled="true" follows="left|top"
@@ -97,5 +97,5 @@
97 </text> 97 </text>
98 <button bottom_delta="-4" follows="left|top" font="SansSerif" height="20" 98 <button bottom_delta="-4" follows="left|top" font="SansSerif" height="20"
99 label="Joystick Setup" left="148" mouse_opaque="true" 99 label="Joystick Setup" left="148" mouse_opaque="true"
100 name="joystic_setup_button" width="155" /> 100 name="joystick_setup_button" width="155" />
101</panel> 101</panel>
diff --git a/linden/indra/newview/skins/default/xui/en-us/panel_preferences_network.xml b/linden/indra/newview/skins/default/xui/en-us/panel_preferences_network.xml
index a0f0936..48da432 100644
--- a/linden/indra/newview/skins/default/xui/en-us/panel_preferences_network.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/panel_preferences_network.xml
@@ -8,7 +8,7 @@
8 mouse_opaque="false" name="text_box" v_pad="0" width="200"> 8 mouse_opaque="false" name="text_box" v_pad="0" width="200">
9 Maximum Bandwidth: 9 Maximum Bandwidth:
10 </text> 10 </text>
11 <slider bottom_delta="-25" can_edit_text="true" control_name="ThrottleBandwidthKBPS" 11 <slider bottom_delta="-25" can_edit_text="true"
12 decimal_digits="0" enabled="true" follows="left|top" height="15" 12 decimal_digits="0" enabled="true" follows="left|top" height="15"
13 increment="10" initial_val="50" left_delta="0" max_val="1500" min_val="50" 13 increment="10" initial_val="50" left_delta="0" max_val="1500" min_val="50"
14 mouse_opaque="true" name="max_bandwidth" show_text="true" value="500" 14 mouse_opaque="true" name="max_bandwidth" show_text="true" value="500"
@@ -27,7 +27,7 @@
27 v_pad="0" width="200"> 27 v_pad="0" width="200">
28 Disk Cache Size: 28 Disk Cache Size:
29 </text> 29 </text>
30 <slider bottom_delta="-25" can_edit_text="true" control_name="CacheSize" 30 <slider bottom_delta="-25" can_edit_text="true"
31 decimal_digits="0" enabled="true" follows="left|top" height="15" 31 decimal_digits="0" enabled="true" follows="left|top" height="15"
32 increment="10" initial_val="50" left_delta="0" max_val="1000" min_val="10" 32 increment="10" initial_val="50" left_delta="0" max_val="1000" min_val="10"
33 mouse_opaque="true" name="cache_size" show_text="true" width="180" /> 33 mouse_opaque="true" name="cache_size" show_text="true" width="180" />
@@ -61,12 +61,12 @@
61 font="SansSerif" halign="center" height="22" label="Reset" 61 font="SansSerif" halign="center" height="22" label="Reset"
62 label_selected="Set" left_delta="103" mouse_opaque="true" 62 label_selected="Set" left_delta="103" mouse_opaque="true"
63 name="reset_cache" scale_image="true" width="100" /> 63 name="reset_cache" scale_image="true" width="100" />
64 <check_box bottom="-173" bottom_delta="-35" control_name="ConnectionPortEnabled" 64 <check_box bottom="-173" bottom_delta="-35"
65 enabled="true" follows="left|top" font="SansSerifSmall" height="16" 65 enabled="true" follows="left|top" font="SansSerifSmall" height="16"
66 initial_value="false" label="Custom Port Connection" left="12" 66 initial_value="false" label="Custom Port Connection" left="12"
67 mouse_opaque="true" name="connection_port_enabled" radio_style="false" 67 mouse_opaque="true" name="connection_port_enabled" radio_style="false"
68 width="256" /> 68 width="256" />
69 <spinner bottom="-193" bottom_delta="-20" control_name="ConnectionPort" 69 <spinner bottom="-193" bottom_delta="-20"
70 decimal_digits="0" enabled="true" follows="left|top" height="16" 70 decimal_digits="0" enabled="true" follows="left|top" height="16"
71 increment="1" initial_val="13000" label="Port Number:" label_width="75" 71 increment="1" initial_val="13000" label="Port Number:" label_width="75"
72 left_delta="20" max_val="13050" min_val="13000" mouse_opaque="true" 72 left_delta="20" max_val="13050" min_val="13000" mouse_opaque="true"
diff --git a/linden/indra/newview/skins/default/xui/en-us/panel_preferences_popups.xml b/linden/indra/newview/skins/default/xui/en-us/panel_preferences_popups.xml
index 11d15f4..65734d6 100644
--- a/linden/indra/newview/skins/default/xui/en-us/panel_preferences_popups.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/panel_preferences_popups.xml
@@ -27,11 +27,11 @@
27 width="270"> 27 width="270">
28 Offers of notecards, textures and landmarks: 28 Offers of notecards, textures and landmarks:
29 </text> 29 </text>
30 <check_box bottom_delta="-25" control_name="AutoAcceptNewInventory" enabled="true" 30 <check_box bottom_delta="-25" enabled="true"
31 follows="left|top" font="SansSerifSmall" height="16" initial_value="false" 31 follows="left|top" font="SansSerifSmall" height="16" initial_value="false"
32 label="Automatically accept" left="40" mouse_opaque="true" 32 label="Automatically accept" left="40" mouse_opaque="true"
33 name="accept_new_inventory" radio_style="false" width="270" /> 33 name="accept_new_inventory" radio_style="false" width="270" />
34 <check_box bottom_delta="-20" control_name="ShowNewInventory" enabled="true" 34 <check_box bottom_delta="-20" enabled="true"
35 follows="left|top" font="SansSerifSmall" height="16" initial_value="true" 35 follows="left|top" font="SansSerifSmall" height="16" initial_value="true"
36 label="Automatically view after accepting" left="40" mouse_opaque="true" 36 label="Automatically view after accepting" left="40" mouse_opaque="true"
37 name="show_new_inventory" radio_style="false" width="270" /> 37 name="show_new_inventory" radio_style="false" width="270" />
diff --git a/linden/indra/newview/skins/default/xui/en-us/panel_preferences_voice.xml b/linden/indra/newview/skins/default/xui/en-us/panel_preferences_voice.xml
index 2d36853..4b9ec5c 100644
--- a/linden/indra/newview/skins/default/xui/en-us/panel_preferences_voice.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/panel_preferences_voice.xml
@@ -9,7 +9,7 @@
9 name="voice_unavailable" tab_stop="false" width="450" word_wrap="true"> 9 name="voice_unavailable" tab_stop="false" width="450" word_wrap="true">
10 Voice Chat Is Not Available 10 Voice Chat Is Not Available
11 </text_editor> 11 </text_editor>
12 <check_box bottom_delta="0" control_name="EnableVoiceChat" enabled="true" 12 <check_box bottom_delta="0" enabled="true"
13 follows="left|top" font="SansSerifSmall" height="16" initial_value="false" 13 follows="left|top" font="SansSerifSmall" height="16" initial_value="false"
14 label="Enable voice chat" left="8" mouse_opaque="true" 14 label="Enable voice chat" left="8" mouse_opaque="true"
15 name="enable_voice_check" radio_style="false" width="200" /> 15 name="enable_voice_check" radio_style="false" width="200" />
@@ -36,7 +36,7 @@
36 name="voice_chat_description" tab_stop="false" width="450" word_wrap="true"> 36 name="voice_chat_description" tab_stop="false" width="450" word_wrap="true">
37 Push-to-Talk mode lets you control when your voice is transmitted. When in toggle mode, press and release the push-to-talk trigger to switch your microphone on and off. When not in toggle mode, the microphone is active only when the trigger is held down. 37 Push-to-Talk mode lets you control when your voice is transmitted. When in toggle mode, press and release the push-to-talk trigger to switch your microphone on and off. When not in toggle mode, the microphone is active only when the trigger is held down.
38 </text_editor> 38 </text_editor>
39 <check_box bottom_delta="-20" control_name="PushToTalkToggle" enabled="true" 39 <check_box bottom_delta="-20" enabled="true"
40 follows="left|top" font="SansSerifSmall" height="16" initial_value="false" 40 follows="left|top" font="SansSerifSmall" height="16" initial_value="false"
41 label="Use Push-to-Talk in toggle mode" left_delta="0" mouse_opaque="true" 41 label="Use Push-to-Talk in toggle mode" left_delta="0" mouse_opaque="true"
42 name="push_to_talk_toggle_check" radio_style="false" width="200" /> 42 name="push_to_talk_toggle_check" radio_style="false" width="200" />
@@ -48,7 +48,7 @@
48 Push-to-Talk trigger: 48 Push-to-Talk trigger:
49 </text> 49 </text>
50 <line_editor border_drop_shadow_visible="false" border_visible="false" bottom_delta="-20" 50 <line_editor border_drop_shadow_visible="false" border_visible="false" bottom_delta="-20"
51 control_name="PushToTalkButton" drop_shadow_visible="true" enabled="false" 51 drop_shadow_visible="true" enabled="false"
52 follows="top|left" font="SansSerifSmall" halign="right" height="19" 52 follows="top|left" font="SansSerifSmall" halign="right" height="19"
53 left_delta="0" max_length="254" mouse_opaque="false" name="modifier_combo" 53 left_delta="0" max_length="254" mouse_opaque="false" name="modifier_combo"
54 width="280" /> 54 width="280" />
@@ -63,7 +63,7 @@
63 left="28" name="privacy_heading" width="445"> 63 left="28" name="privacy_heading" width="445">
64 Privacy Options 64 Privacy Options
65 </text> 65 </text>
66 <check_box bottom_delta="-20" control_name="VoiceCallsFriendsOnly" enabled="true" 66 <check_box bottom_delta="-20" enabled="true"
67 follows="left|top" font="SansSerifSmall" height="16" initial_value="false" 67 follows="left|top" font="SansSerifSmall" height="16" initial_value="false"
68 label="Only accept voice calls from people on My Friends list" 68 label="Only accept voice calls from people on My Friends list"
69 left_delta="20" mouse_opaque="true" name="voice_call_friends_only_check" 69 left_delta="20" mouse_opaque="true" name="voice_call_friends_only_check"
@@ -76,6 +76,6 @@
76 font="SansSerifSmall" height="35" hide_border="true" hide_scrollbar="true" 76 font="SansSerifSmall" height="35" hide_border="true" hide_scrollbar="true"
77 left="28" max_length="65535" mouse_opaque="true" 77 left="28" max_length="65535" mouse_opaque="true"
78 name="device_settings_text" tab_stop="false" width="450" word_wrap="true"> 78 name="device_settings_text" tab_stop="false" width="450" word_wrap="true">
79 NOTE: Running the Device Settings will temporarily disconnect you from Voice Chat. 79 NOTE: Running the Device Settings will temporarily disconnect you from Voice Chat, and changes you make will be immediately applied.
80 </text_editor> 80 </text_editor>
81</panel> 81</panel>
diff --git a/linden/indra/newview/skins/default/xui/en-us/panel_preferences_web.xml b/linden/indra/newview/skins/default/xui/en-us/panel_preferences_web.xml
index b708bf3..ed13e8f 100644
--- a/linden/indra/newview/skins/default/xui/en-us/panel_preferences_web.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/panel_preferences_web.xml
@@ -30,8 +30,8 @@
30 width="128"> 30 width="128">
31 Cookies: 31 Cookies:
32 </text> 32 </text>
33 <check_box bottom_delta="-7" control_name="CookiesEnabled" enabled="true" 33 <check_box bottom_delta="-7" enabled="true" follows="left|top"
34 follows="left|top" font="SansSerifSmall" height="16" initial_value="false" 34 font="SansSerifSmall" height="16" initial_value="false"
35 label="Accept cookies from sites" left="140" mouse_opaque="true" 35 label="Accept cookies from sites" left="140" mouse_opaque="true"
36 name="cookies_enabled" radio_style="false" width="256" /> 36 name="cookies_enabled" radio_style="false" width="256" />
37 <text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false" 37 <text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
@@ -41,7 +41,7 @@
41 width="128"> 41 width="128">
42 Web Proxy: 42 Web Proxy:
43 </text> 43 </text>
44 <check_box bottom_delta="-7" control_name="BrowserProxyEnabled" enabled="true" 44 <check_box bottom_delta="-7" enabled="true"
45 follows="left|top" font="SansSerifSmall" height="16" initial_value="false" 45 follows="left|top" font="SansSerifSmall" height="16" initial_value="false"
46 label="Enable Web Proxy" left="140" mouse_opaque="true" 46 label="Enable Web Proxy" left="140" mouse_opaque="true"
47 name="web_proxy_enabled" radio_style="false" width="256" /> 47 name="web_proxy_enabled" radio_style="false" width="256" />
@@ -56,7 +56,7 @@
56 height="20" left="217" name="web_proxy_editor" 56 height="20" left="217" name="web_proxy_editor"
57 tool_tip="The name or IP address of the proxy you would like to use" 57 tool_tip="The name or IP address of the proxy you would like to use"
58 width="200" /> 58 width="200" />
59 <spinner bottom_delta="-25" control_name="BrowserProxyPort" decimal_digits="0" 59 <spinner bottom_delta="-25" decimal_digits="0"
60 enabled="true" follows="left|top" height="16" increment="1" 60 enabled="true" follows="left|top" height="16" increment="1"
61 initial_val="80" label="Port Number:" label_width="75" left="140" 61 initial_val="80" label="Port Number:" label_width="75" left="140"
62 max_val="12000" min_val="10" mouse_opaque="true" name="web_proxy_port" 62 max_val="12000" min_val="10" mouse_opaque="true" name="web_proxy_port"
diff --git a/linden/indra/newview/skins/default/xui/en-us/panel_status_bar.xml b/linden/indra/newview/skins/default/xui/en-us/panel_status_bar.xml
index 614f1f9..63d2ca3 100644
--- a/linden/indra/newview/skins/default/xui/en-us/panel_status_bar.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/panel_status_bar.xml
@@ -75,7 +75,7 @@
75 halign="center" height="18" image_selected="status_no_push.tga" 75 halign="center" height="18" image_selected="status_no_push.tga"
76 image_unselected="status_no_push.tga" label="" label_selected="" left="521" 76 image_unselected="status_no_push.tga" label="" label_selected="" left="521"
77 mouse_opaque="true" name="restrictpush" scale_image="false" 77 mouse_opaque="true" name="restrictpush" scale_image="false"
78 tool_tip="llPushObject restricted" visible="false" width="24" /> 78 tool_tip="No Pushing" visible="false" width="24" />
79 <button bottom="-22" enabled="true" follows="right|bottom" font="SansSerif" 79 <button bottom="-22" enabled="true" follows="right|bottom" font="SansSerif"
80 halign="center" height="18" image_selected="status_no_voice.tga" 80 halign="center" height="18" image_selected="status_no_voice.tga"
81 image_unselected="status_no_voice.tga" label="" label_selected="" 81 image_unselected="status_no_voice.tga" label="" label_selected=""
diff --git a/linden/indra/newview/skins/default/xui/es/alerts.xml b/linden/indra/newview/skins/default/xui/es/alerts.xml
index 5579436..f60881b 100644
--- a/linden/indra/newview/skins/default/xui/es/alerts.xml
+++ b/linden/indra/newview/skins/default/xui/es/alerts.xml
@@ -1643,7 +1643,7 @@ Intente seleccionar una área menor.
1643 Este local puede reproducir música en streaming. 1643 Este local puede reproducir música en streaming.
1644 1644
1645Música requiere una conexión con internet 1645Música requiere una conexión con internet
1646de 768 Kbps o más rápida. 1646de 768 kbps o más rápida.
1647 1647
1648¿Reproducir música cuando disponible? 1648¿Reproducir música cuando disponible?
1649 </message> 1649 </message>
@@ -1658,7 +1658,7 @@ de 768 Kbps o más rápida.
1658 <message name="message"> 1658 <message name="message">
1659 Este local puede reproducir vídeo en streaming. 1659 Este local puede reproducir vídeo en streaming.
1660Vídeo en streaming requiere una conexión con internet 1660Vídeo en streaming requiere una conexión con internet
1661de 768 Kbps o más rápida. 1661de 768 kbps o más rápida.
1662 1662
1663¿Reproducir vídeo en streaming cuando disponible? 1663¿Reproducir vídeo en streaming cuando disponible?
1664 1664
@@ -3978,31 +3978,6 @@ para ver los detalles de la transacción?
3978 Cancelar 3978 Cancelar
3979 </option> 3979 </option>
3980 </alert> 3980 </alert>
3981 <alert name="HelpReportAbuse">
3982 <message name="message">
3983 Use this tool to report violations of the Terms of Service and Community Standards. See:
3984http://secondlife.com/corporate/tos.php
3985http://secondlife.com/corporate/cs.php
3986
3987All reported abuses of the Terms of Service and Community Standards
3988are investigated and resolved. You will receive an email informing you
3989of the resolution when it occurs.
3990You can also view the incident resolution on the Police Blotter at:
3991
3992http://secondlife.com/community/blotter.php
3993 </message>
3994 </alert>
3995 <alert name="HelpReportBug">
3996 <message name="message">
3997 Use this tool to report technical features that do not perform
3998as described or expected. All bug reports are investigated and
3999resolved. No email response will be sent, you may reply to the
4000auto-response email to add more details to your report.
4001If you are having a technical difficulty, please contact Support at:
4002
4003http://secondlife.com/community/support.php
4004 </message>
4005 </alert>
4006 <alert name="HelpReportAbuseSelectCategory"> 3981 <alert name="HelpReportAbuseSelectCategory">
4007 <message name="message"> 3982 <message name="message">
4008 Por favor, seleccione una categoría para este relato de abuso. 3983 Por favor, seleccione una categoría para este relato de abuso.
diff --git a/linden/indra/newview/skins/default/xui/es/floater_about_land.xml b/linden/indra/newview/skins/default/xui/es/floater_about_land.xml
index 1411093..ce401c1 100644
--- a/linden/indra/newview/skins/default/xui/es/floater_about_land.xml
+++ b/linden/indra/newview/skins/default/xui/es/floater_about_land.xml
@@ -132,54 +132,33 @@
132 <text type="string" length="1" name="Simulator primitive usage:"> 132 <text type="string" length="1" name="Simulator primitive usage:">
133 Simulador de primitiva usado: 133 Simulador de primitiva usado:
134 </text> 134 </text>
135 <text type="string" length="1" name="0 out of 0 available">
136 0 de 14055 (14055 disponible)
137 </text>
138 <text type="string" length="1" name="Primitives parcel supports:"> 135 <text type="string" length="1" name="Primitives parcel supports:">
139 Primitivas en la parcela soportan: 136 Primitivas en la parcela soportan:
140 </text> 137 </text>
141 <text type="string" length="1" name="object_contrib_text">
142 926
143 </text>
144 <text type="string" length="1" name="Primitives on parcel:"> 138 <text type="string" length="1" name="Primitives on parcel:">
145 Primitivas en la parcela: 139 Primitivas en la parcela:
146 </text> 140 </text>
147 <text type="string" length="1" name="total_objects_text">
148 0
149 </text>
150 <text type="string" length="1" name="Owned by parcel owner:"> 141 <text type="string" length="1" name="Owned by parcel owner:">
151 Pertenecientes al propietario de la parcela: 142 Pertenecientes al propietario de la parcela:
152 </text> 143 </text>
153 <text type="string" length="1" name="owner_objects_text">
154 0
155 </text>
156 <button label="Mostrar" label_selected="Mostrar" name="ShowOwner" /> 144 <button label="Mostrar" label_selected="Mostrar" name="ShowOwner" />
157 <button label="Retornar..." label_selected="Retornar..." name="ReturnOwner..." 145 <button label="Retornar..." label_selected="Retornar..." name="ReturnOwner..."
158 tool_tip="Devolver objetos para sus propietarios." /> 146 tool_tip="Devolver objetos para sus propietarios." />
159 <text type="string" length="1" name="Set to group:"> 147 <text type="string" length="1" name="Set to group:">
160 Definido para el grupo: 148 Definido para el grupo:
161 </text> 149 </text>
162 <text type="string" length="1" name="group_objects_text">
163 0
164 </text>
165 <button label="Mostrar" label_selected="Mostrar" name="ShowGroup" /> 150 <button label="Mostrar" label_selected="Mostrar" name="ShowGroup" />
166 <button label="Retornar..." label_selected="Retornar..." name="ReturnGroup..." 151 <button label="Retornar..." label_selected="Retornar..." name="ReturnGroup..."
167 tool_tip="Devolver objetos para sus propietarios." /> 152 tool_tip="Devolver objetos para sus propietarios." />
168 <text type="string" length="1" name="Owned by others:"> 153 <text type="string" length="1" name="Owned by others:">
169 Pertenecientes a otros: 154 Pertenecientes a otros:
170 </text> 155 </text>
171 <text type="string" length="1" name="other_objects_text">
172 0
173 </text>
174 <button label="Mostrar" label_selected="Mostrar" name="ShowOther" /> 156 <button label="Mostrar" label_selected="Mostrar" name="ShowOther" />
175 <button label="Retornar..." label_selected="Retornar..." name="ReturnOther..." 157 <button label="Retornar..." label_selected="Retornar..." name="ReturnOther..."
176 tool_tip="Devolver objetos para sus propietarios." /> 158 tool_tip="Devolver objetos para sus propietarios." />
177 <text type="string" length="1" name="Selected / sat upon:"> 159 <text type="string" length="1" name="Selected / sat upon:">
178 Seleccionado / puesto en: 160 Seleccionado / puesto en:
179 </text> 161 </text>
180 <text type="string" length="1" name="selected_objects_text">
181 0
182 </text>
183 <text type="string" length="1" name="Autoreturn other resident&amp;apos;s objects (minutes, 0 for off):"> 162 <text type="string" length="1" name="Autoreturn other resident&amp;apos;s objects (minutes, 0 for off):">
184 Autoretornar objetos de otros residentes (minutos, 0 para desligar): 163 Autoretornar objetos de otros residentes (minutos, 0 para desligar):
185 </text> 164 </text>
diff --git a/linden/indra/newview/skins/default/xui/fr/alerts.xml b/linden/indra/newview/skins/default/xui/fr/alerts.xml
index ea9fab3..1fd3bba 100644
--- a/linden/indra/newview/skins/default/xui/fr/alerts.xml
+++ b/linden/indra/newview/skins/default/xui/fr/alerts.xml
@@ -1,4 +1,4 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 1<?xml version="1.0" encoding="utf-8" standalone="yes"?>
2<alerts> 2<alerts>
3 <global name="skipnexttime"> 3 <global name="skipnexttime">
4 Ne plus afficher 4 Ne plus afficher
@@ -8,7 +8,7 @@
8 </global> 8 </global>
9 <alert name="MissingAlert"> 9 <alert name="MissingAlert">
10 <message name="message"> 10 <message name="message">
11 [ALERT_NAME] est absent de alerts.xml! 11 [ALERT_NAME] n&apos;est pas dans le fichier alerts.xml.
12 </message> 12 </message>
13 <option name="OK"> 13 <option name="OK">
14 OK 14 OK
@@ -16,7 +16,7 @@
16 </alert> 16 </alert>
17 <alert name="FloaterNotFound"> 17 <alert name="FloaterNotFound">
18 <message name="message"> 18 <message name="message">
19 Erreur de floater : Impossible de trouver les contrôles suivants : 19 Erreur floater : impossible de trouver les contrôles suivants :
20 20
21[CONTROLS] 21[CONTROLS]
22 </message> 22 </message>
@@ -55,10 +55,10 @@
55 </alert> 55 </alert>
56 <alert name="ConnectTimeout"> 56 <alert name="ConnectTimeout">
57 <message name="message"> 57 <message name="message">
58 Connexion impossible à [SECOND_LIFE] 58 Connexion à [SECOND_LIFE] impossible.
59Le service est peut-être interrompu. 59le service est peut-être interrompu.
60Veuillez réessayer d&apos;ici quelques minutes, ou cliquez sur Aide 60
61pour des conseils et un lien vers la page web d&apos;état du service. 61Veuillez réessayer dans quelques minutes, ou cliquez sur Aide pour obtenir des conseils et un lien vers la page web d&apos;état du service.
62 </message> 62 </message>
63 <option name="OK"> 63 <option name="OK">
64 OK 64 OK
@@ -83,28 +83,28 @@ pour des conseils et un lien vers la page web d&apos;état du service.
83 </alert> 83 </alert>
84 <alert name="CompileQueueSaveText"> 84 <alert name="CompileQueueSaveText">
85 <message name="message"> 85 <message name="message">
86 Problème lors de l&apos;upload du texte pour un script : [REASON]. Veuillez réessayer ultérieurement. 86 Une erreur est survenue lors du chargement du texte pour un script, suite au problème suivant : [REASON]. Veuillez réessayer ultérieurement.
87 </message> 87 </message>
88 </alert> 88 </alert>
89 <alert name="CompileQueueSaveBytecode"> 89 <alert name="CompileQueueSaveBytecode">
90 <message name="message"> 90 <message name="message">
91 Problème lors de l&apos;upload du script compilé : [REASON]. Veuillez réessayer ultérieurement. 91 Une erreur est survenue lors du chargement du script compilé, suite au problème suivant : [REASON]. Veuillez réessayer ultérieurement.
92 </message> 92 </message>
93 </alert> 93 </alert>
94 <alert name="WriteAnimationFail"> 94 <alert name="WriteAnimationFail">
95 <message name="message"> 95 <message name="message">
96 Echec d&apos;écriture des données d&apos;animation. 96 Une erreur est survenue lors de l&apos;écriture des données d&apos;animation. Veuillez réessayer ultérieurement.
97 </message> 97 </message>
98 </alert> 98 </alert>
99 <alert name="UploadAuctionSnapshotFail"> 99 <alert name="UploadAuctionSnapshotFail">
100 <message name="message"> 100 <message name="message">
101 Problème lors de l&apos;upload d&apos;un instantané d&apos;enchères : [REASON] 101 Un problème est survenu lors du chargement du script compilé, suite au problème suivant : [REASON]
102 </message> 102 </message>
103 </alert> 103 </alert>
104 <alert name="UnableToViewContentsMoreThanOne"> 104 <alert name="UnableToViewContentsMoreThanOne">
105 <message name="message"> 105 <message name="message">
106 Impossible d&apos;afficher le contenu de plus d&apos;un objet à la fois. 106 Impossible d&apos;afficher les contenus de plus d&apos;un objet à la fois.
107Veuillez sélectionner un seul objet et réessayez. 107Veuillez ne sélectionner qu&apos;un seul objet.
108 </message> 108 </message>
109 </alert> 109 </alert>
110 <alert name="MustSupplyVoteProposal"> 110 <alert name="MustSupplyVoteProposal">
@@ -120,14 +120,14 @@ Entrez une brève description des objectifs du groupe.
120 </alert> 120 </alert>
121 <alert name="CharacterSnapshotSaved"> 121 <alert name="CharacterSnapshotSaved">
122 <message name="message"> 122 <message name="message">
123 Un instantané de votre personnage a été sauvegardé. 123 Une photo de votre personnage a été sauvegardée.
124 124
125Visitez l&apos;exposition Webpage Studio pour le visualiser. 125Visitez l&apos;exposition Webpage Studio pour la voir.
126 </message> 126 </message>
127 </alert> 127 </alert>
128 <alert name="SaveClothingBodyChanges"> 128 <alert name="SaveClothingBodyChanges">
129 <message name="message"> 129 <message name="message">
130 Enregistrer toutes les modifications des vêtements/parties du corps ? 130 Enregistrer tous les changements dans les habits/parties du corps ?
131 </message> 131 </message>
132 <option name="SaveAll"> 132 <option name="SaveAll">
133 Tout enregistrer 133 Tout enregistrer
@@ -216,10 +216,10 @@ Souhaitez-vous accorder des droits d&apos;édition aux résidents selectionnésÂ
216[WANT_APPLY_MESSAGE] 216[WANT_APPLY_MESSAGE]
217 </message> 217 </message>
218 <option name="ApplyChanges"> 218 <option name="ApplyChanges">
219 Appliquer modifications 219 Appliquer les changements
220 </option> 220 </option>
221 <option name="IgnoreChanges"> 221 <option name="IgnoreChanges">
222 Ignorer modifications 222 Ignorer les changements
223 </option> 223 </option>
224 <option name="Cancel"> 224 <option name="Cancel">
225 Annuler 225 Annuler
@@ -249,7 +249,7 @@ Vous n&apos;avez pas assez d&apos;argent pour créer ce groupe.
249 </alert> 249 </alert>
250 <alert name="GroupNameTooShort"> 250 <alert name="GroupNameTooShort">
251 <message name="message"> 251 <message name="message">
252 Les noms de groupes doivent comporter quatre lettres minimum. 252 Les noms de groupes doivent comporter 4 lettres minimum.
253 </message> 253 </message>
254 </alert> 254 </alert>
255 <alert name="GroupNameUsesReservedWord"> 255 <alert name="GroupNameUsesReservedWord">
@@ -260,7 +260,7 @@ choisir un autre nom.
260 </alert> 260 </alert>
261 <alert name="MustSpecifyGroupNoticeSubject"> 261 <alert name="MustSpecifyGroupNoticeSubject">
262 <message name="message"> 262 <message name="message">
263 Vous devez préciser le sujet afin d&apos;envoyer une notification au groupe. 263 Pour envoyer une notification au groupe, vous devez indiquer un sujet.
264 </message> 264 </message>
265 <option name="OK"> 265 <option name="OK">
266 OK 266 OK
@@ -274,10 +274,10 @@ Entrez une brève description des objectifs du groupe.
274 </alert> 274 </alert>
275 <alert name="AddGroupOwnerWarning"> 275 <alert name="AddGroupOwnerWarning">
276 <message name="message"> 276 <message name="message">
277 Vous vous apprêtez à ajouter des membres du groupe au rôle de [ROLE_NAME]. 277 Vous êtes sur le point d&apos;ajouter des membres du groupe dans le rôle de [ROLE_NAME].
278Les membres ne peuvent pas être déchus de ce rôle. 278Les membres ne peuvent pas être destitués de ce rôle.
279Ils devront quitter le rôle par eux-mêmes. 279Ils doivent donner eux-mêmes leur démission.
280Etes-vous sûr(e) de vouloir poursuivre? 280Êtes-vous certain de vouloir continuer ?
281 </message> 281 </message>
282 <ignore name="ignore"> 282 <ignore name="ignore">
283 Lorsque vous donnez à des membres du groupe le rôle de « propriétaire » 283 Lorsque vous donnez à des membres du groupe le rôle de « propriétaire »
@@ -291,13 +291,11 @@ Etes-vous sûr(e) de vouloir poursuivre?
291 </alert> 291 </alert>
292 <alert name="AssignDangerousActionWarning"> 292 <alert name="AssignDangerousActionWarning">
293 <message name="message"> 293 <message name="message">
294 Vous vous apprêtez à ajouter la Faculté &apos;[ACTION_NAME]&apos; au 294 Vous êtes sur le point d&apos;ajouter le pouvoir « [ACTION_NAME] » au rôle « [ROLE_NAME] ».
295Rôle &apos;[ROLE_NAME]&apos;. 295 *Avertissement*
296 296 Tout membre disposant de ce pouvoir peut s&apos;affecter lui-même, ainsi que tout autre membre, à des rôles disposant de pouvoirs plus importants, et accéder potentiellement à des pouvoirs proches de ceux d&apos;un propriétaire. Assurez-vous de bien comprendre ce que vous faites avant d&apos;attribuer ce pouvoir.
297 *AVERTISSEMENT*
298Tout membre disposant de cette Faculté peut s&apos;affecter lui-même --ainsi que tout autre Membre-- à des Rôles disposant de pouvoirs plus grands, et accéder potentiellement à des pouvoirs proches de ceux d&apos;un propriétaire. Assurez-vous de savoir ce que vous faites avant d&apos;attribuer cette Faculté.
299 297
300Ajouter cette Faculté à &apos;[ROLE_NAME]&apos;? 298Ajouter ce pouvoir à « [ROLE_NAME] » ?
301 </message> 299 </message>
302 <option name="Yes"> 300 <option name="Yes">
303 Oui 301 Oui
@@ -308,13 +306,13 @@ Ajouter cette Faculté à &apos;[ROLE_NAME]&apos;?
308 </alert> 306 </alert>
309 <alert name="AssignDangerousAbilityWarning"> 307 <alert name="AssignDangerousAbilityWarning">
310 <message name="message"> 308 <message name="message">
311 Vous vous apprêtez à ajouter la Faculté &apos;[ACTION_NAME]&apos; au 309 Vous êtes sur le point d&apos;ajouter le pouvoir « [ACTION_NAME] » au
312Rôle &apos;[ROLE_NAME]&apos;. 310rôle « [ROLE_NAME] ».
313 311
314 *AVERTISSEMENT* 312 *Avertissement*
315Tout membre disposant de cette Faculté peut s&apos;attribuer --ainsi qu&apos;à tout autre Membre-- toutes Facultés, et accéder à des pouvoirs proches de ceux d&apos;un propriétaire. 313 Tout membre dans un rôle avec ce pouvoir peut s&apos;attribuer à lui-même, ainsi qu&apos;à tout autre membre, Tous les pouvoirs, et accéder potentiellement à des pouvoirs proches de ceux d&apos;un propriétaire.
316 314
317Ajouter cette Faculté à &apos;[ROLE_NAME]&apos;? 315Ajouter ce pouvoir à « [ROLE_NAME] » ?
318 </message> 316 </message>
319 <option name="Yes"> 317 <option name="Yes">
320 Oui 318 Oui
@@ -326,19 +324,18 @@ Ajouter cette Faculté à &apos;[ROLE_NAME]&apos;?
326 <alert name="ClickPublishHelpGroup"> 324 <alert name="ClickPublishHelpGroup">
327 <message name="message"> 325 <message name="message">
328 L&apos;option &quot;Publier sur le Web&quot; nous permet de publier 326 L&apos;option &quot;Publier sur le Web&quot; nous permet de publier
329le nom du groupe, son insigne, sa charte, ses titres, et ses fondateurs sur le 327le nom du groupe, son logo, sa charte, ses titres, et ses fondateurs sur le
330site [SECOND_LIFE]. Il est de votre responsabilité d&apos;indiquer si 328site [SECOND_LIFE]. Il est de votre responsabilité d&apos;indiquer si
331tout ou partie du contenu ci-dessus est considéré comme Adulte au regard 329tout ou partie du contenu ci-dessus est considéré comme Adulte selon les règles de base de la Communauté.
332des règles de base de la Communauté.
333 </message> 330 </message>
334 </alert> 331 </alert>
335 <alert name="ClickPublishHelpLand"> 332 <alert name="ClickPublishHelpLand">
336 <message name="message"> 333 <message name="message">
337 L&apos;option &quot;Publier sur le Web&quot; nous permet de publier 334 Sélectionner l&apos;option Publier dans la recherche
338le nom, la description, l&apos;instantané et la localisation de cette parcelle 335En cochant cette case, votre parcelle apparaîtra :
339sur le site [SECOND_LIFE]. Il est de votre responsabilité d&apos;indiquer si 336- dans les résultats de recherche ;
340tout ou partie du contenu ci-dessus est considéré comme Adulte au regard 337- dans les objets publics ;
341des règles de base de la Communauté. 338- dans la recherche web.
342 </message> 339 </message>
343 </alert> 340 </alert>
344 <alert name="ClickPublishHelpLandDisabled"> 341 <alert name="ClickPublishHelpLandDisabled">
@@ -348,22 +345,23 @@ des règles de base de la Communauté.
348 </alert> 345 </alert>
349 <alert name="ClickPublishHelpPostcard"> 346 <alert name="ClickPublishHelpPostcard">
350 <message name="message"> 347 <message name="message">
351 L&apos;option &quot;Publier sur le Web&quot; nous permet de publier 348 L&apos;option Publier sur le Web nous permet de publier
352le nom du photographe dans [SECOND_LIFE], le sujet, le lieu, le message et 349le nom du photographe dans [SECOND_LIFE], le sujet, le lieu, le message et
353l&apos;instantané sur le site [SECOND_LIFE]. Il est de votre responsabilité d&apos;indiquer si 350la photo sur le site [SECOND_LIFE]. Vous devez indiquer indiquer si
354tout ou partie du contenu des instantanés ci-dessus est considéré comme Adulte au regard 351les photos ci-dessus contiennent du contenu pour Adultes, conformément aux
355des règles de base de la Communauté. 352règles de base de la Communauté.
356 </message> 353 </message>
357 </alert> 354 </alert>
358 <alert name="ClickPublishHelpAvatar"> 355 <alert name="ClickPublishHelpAvatar">
359 <message name="message"> 356 <message name="message">
360 L&apos;option &quot;Publier sur le Web&quot; nous permet de publier 357 Si vous sélectionnez Afficher dans la recherche :
361votre nom, image, et texte &apos;A propos&apos; sur le site [SECOND_LIFE]. 358- votre profil apparaîtra dans les résultats de recherche ;
359- un lien vers votre profil apparaîtra dans les pages de groupe publiques.
362 </message> 360 </message>
363 </alert> 361 </alert>
364 <alert name="ClickPartnerHelpAvatar"> 362 <alert name="ClickPartnerHelpAvatar">
365 <message name="message"> 363 <message name="message">
366 Vous pouvez proposer à un autre résident de dissoudre un partenariat existant par le biais du site de [SECOND_LIFE]. 364 Vous pouvez proposer à un autre résident de devenir votre partenaire ou dissoudre un partenariat existant à partir du site de [SECOND_LIFE].
367 365
368Aller sur le site de Second Life pour avoir plus d&apos;informations sur les partenariats ? 366Aller sur le site de Second Life pour avoir plus d&apos;informations sur les partenariats ?
369 </message> 367 </message>
@@ -374,16 +372,27 @@ Aller sur le site de Second Life pour avoir plus d&apos;informations sur les par
374 Annuler 372 Annuler
375 </option> 373 </option>
376 </alert> 374 </alert>
375 <alert name="ClickWebProfileHelpAvatar">
376 <message name="message">
377 Si ce résident a défini une URL de profil web, vous pouvez :
378 * cliquer sur Charger pour charger la page avec le navigateur web incorporé ;
379 * cliquer sur Charger &gt; Dans un navigateur externe, pour afficher la page dans un navigateur externe.
380 Pour retourner au profil web du résident, cliquez sur Charger &gt; URL du domicile.
381
382Lorsque vous êtes dans votre propre profil, vous pouvez définir n&apos;importe quelle URL comme profil web. Pour cela, saisissez l&apos;URL et cliquez sur OK.
383Les autres résidents peuvent visiter l&apos;URL que vous avez définie en regardant votre profil.
384 </message>
385 </alert>
377 <alert name="ReputationMinGreaterThanMax"> 386 <alert name="ReputationMinGreaterThanMax">
378 <message name="message"> 387 <message name="message">
379 La réputation minimum est supérieure au maximum. 388 La réputation minimum est supérieure au maximum.
380Abaissez le minimum ou augmentez le maximum. 389Veuillez aissez le minimum ou augmentez le maximum.
381 </message> 390 </message>
382 </alert> 391 </alert>
383 <alert name="MoneyMinGreaterThanMax"> 392 <alert name="MoneyMinGreaterThanMax">
384 <message name="message"> 393 <message name="message">
385 Le minimum est supérieur au maximum. 394 Le minimum est supérieur au maximum.
386Veuillez abaisser le minimum ou augmenter le maximum. 395Veuillez baisser le minimum ou augmenter le maximum.
387 </message> 396 </message>
388 </alert> 397 </alert>
389 <alert name="OfficerTitleTooLong"> 398 <alert name="OfficerTitleTooLong">
@@ -429,11 +438,11 @@ Souhaitez-vous continuer ?
429 </alert> 438 </alert>
430 <alert name="JoinGroupCanAfford"> 439 <alert name="JoinGroupCanAfford">
431 <message name="message"> 440 <message name="message">
432 L&apos;inscription à ce groupe coûte L$[COST]. 441 Rejoindre ce groupe coûte [COST] L$.
433Souhaitez-vous continuer ? 442Voulez-vous continuer ?
434 </message> 443 </message>
435 <option name="Join"> 444 <option name="Join">
436 Fusionner 445 Rejoindre
437 </option> 446 </option>
438 <option name="Cancel"> 447 <option name="Cancel">
439 Annuler 448 Annuler
@@ -441,14 +450,13 @@ Souhaitez-vous continuer ?
441 </alert> 450 </alert>
442 <alert name="JoinGroupCannotAfford"> 451 <alert name="JoinGroupCannotAfford">
443 <message name="message"> 452 <message name="message">
444 L&apos;inscription à ce groupe coûte L$[COST]. 453 Rejoindre ce groupe coûte [COST] L$.
445Vous ne disposez pas d&apos;un solde suffisant pour vous inscrire à ce groupe. 454Votre solde est insuffisant.
446 </message> 455 </message>
447 </alert> 456 </alert>
448 <alert name="LandBuyPass"> 457 <alert name="LandBuyPass">
449 <message name="message"> 458 <message name="message">
450 Pour L$[COST], vous pouvez accéder à ce terrain (&apos;[PARCEL_NAME]&apos;) 459 Pour [COST] L$ vous pouvez pénétrer sur ce terrain ([PARCEL_NAME]) et y rester [TIME] heures. Acheter un pass ?
451pour [TIME] heure(s). Acheter un laissez-passer ?
452 </message> 460 </message>
453 <option name="OK"> 461 <option name="OK">
454 OK 462 OK
@@ -466,19 +474,17 @@ si vous êtes sûr(e) de vouloir démarrer des enchères.
466 </alert> 474 </alert>
467 <alert name="SalePriceRestriction"> 475 <alert name="SalePriceRestriction">
468 <message name="message"> 476 <message name="message">
469 Le prix de vente doit être &gt; L$0 si vous vendez à tout le monde. 477 Pour rendre l&apos;annonce disponible à tous, le prix de vente doit être supérieur à 0 L$.
470Veuillez choisir une personne pour lui vendre à L$0. 478Si le prix de vente est de 0 L$, vous devez choisir un acheteur spécifique.
471 </message> 479 </message>
472 </alert> 480 </alert>
473 <alert name="ConfirmLandSaleChange"> 481 <alert name="ConfirmLandSaleChange">
474 <message name="message"> 482 <message name="message">
475 Le terrain sélectionné d&apos;une surface de [LAND_SIZE] m2 est mis en vente. 483 Le terrain sélectionné, de [LAND_SIZE] m², est mis en vente.
476Votre prix de vente sera de L$[SALE_PRICE], pour une acquisition par [NAME]. 484Votre prix de vente sera de [SALE_PRICE] L$ et la vente sera disponible à [NAME].
477
478Voulez-vous poursuivre les modifications ?
479 </message> 485 </message>
480 <option name="Continue"> 486 <option name="Continue">
481 Continuer 487 OK
482 </option> 488 </option>
483 <option name="Cancel"> 489 <option name="Cancel">
484 Annuler 490 Annuler
@@ -486,12 +492,12 @@ Voulez-vous poursuivre les modifications ?
486 </alert> 492 </alert>
487 <alert name="ConfirmLandSaleToAnyoneChange"> 493 <alert name="ConfirmLandSaleToAnyoneChange">
488 <message name="message"> 494 <message name="message">
489 Attention : En cliquant sur Vendre à n&apos;importe qui, vous rendez votre 495 Attention : en cliquant sur Vendre à n&apos;importe qui, vous rendez votre
490terrain disponible à toute la communauté de Second Life, même aux personnes qui ne sont pas dans 496terrain disponible à toute la communauté de Second Life, même aux personnes qui ne sont pas dans
491cette région. 497cette région.
492 498
493Le terrain sélectionné, de [LAND_SIZE] m², est mis en vente. 499Le terrain sélectionné, de [LAND_SIZE] m², est mis en vente.
494Votre prix de vente sera de [SALE_PRICE] $L et la vente sera disponible à [NAME]. 500Votre prix de vente sera de [SALE_PRICE] L$ et la vente sera disponible à [NAME].
495 </message> 501 </message>
496 <option name="Continue"> 502 <option name="Continue">
497 OK 503 OK
@@ -502,17 +508,14 @@ Votre prix de vente sera de [SALE_PRICE] $L et la vente sera disponible à [NAME
502 </alert> 508 </alert>
503 <alert name="ReturnObjectsDeededToGroup"> 509 <alert name="ReturnObjectsDeededToGroup">
504 <message name="message"> 510 <message name="message">
505 Etes-vous sûr(e) de vouloir renvoyer tous les objets partagés 511 Êtes-vous certain de vouloir renvoyer tous les objets partagés par le groupe [NAME] sur cette parcelle dans l&apos;inventaire du propriétaire précédent ?
506avec le groupe &apos;[NAME]&apos; sur cette parcelle de terrain
507vers l&apos;inventaire de leurs propriétaires précédents?
508 512
509*AVERTISSEMENT* Ceci supprimera les objets non-cessibles 513*Avertissement* Tous les objets non transférables cédés au groupe seront supprimés !
510transférés au groupe !
511 514
512Objets : [N] 515Objets : [N]
513 </message> 516 </message>
514 <option name="Return"> 517 <option name="Return">
515 Retourner 518 OK
516 </option> 519 </option>
517 <option name="Cancel"> 520 <option name="Cancel">
518 Annuler 521 Annuler
@@ -520,14 +523,12 @@ Objets : [N]
520 </alert> 523 </alert>
521 <alert name="ReturnObjectsOwnedByUser"> 524 <alert name="ReturnObjectsOwnedByUser">
522 <message name="message"> 525 <message name="message">
523 Etes-vous sûr(e) de vouloir renvoyer tous les objets appartenant 526 Etes-vous certain de vouloir renvoyer tous les objets que [NAME] possède sur cette parcelle dans son inventaire ?
524au résident &apos;[NAME]&apos; sur cette parcelle de terrain
525vers son inventaire ?
526 527
527Objets : [N] 528Objets : [N]
528 </message> 529 </message>
529 <option name="Return"> 530 <option name="Return">
530 Retourner 531 OK
531 </option> 532 </option>
532 <option name="Cancel"> 533 <option name="Cancel">
533 Annuler 534 Annuler
@@ -535,14 +536,12 @@ Objets : [N]
535 </alert> 536 </alert>
536 <alert name="ReturnObjectsOwnedBySelf"> 537 <alert name="ReturnObjectsOwnedBySelf">
537 <message name="message"> 538 <message name="message">
538 Etes-vous sûr(e) de vouloir renvoyer tous les objets 539 Êtes-vous certain de vouloir renvoyer tous les objets que vous possédez sur cette parcelle dans votre inventaire ?
539vous appartenant sur cette parcelle de terrain
540vers votre inventaire ?
541 540
542Objets : [N] 541Objets : [N]
543 </message> 542 </message>
544 <option name="Return"> 543 <option name="Return">
545 Retourner 544 OK
546 </option> 545 </option>
547 <option name="Cancel"> 546 <option name="Cancel">
548 Annuler 547 Annuler
@@ -550,17 +549,15 @@ Objets : [N]
550 </alert> 549 </alert>
551 <alert name="ReturnObjectsNotOwnedBySelf"> 550 <alert name="ReturnObjectsNotOwnedBySelf">
552 <message name="message"> 551 <message name="message">
553 Etes-vous sûr(e) de vouloir renvoyer tous les objets ne vous appartenant PAS 552 Êtes-vous certain de vouloir renvoyer tous les objets que vous ne possédez pas sur cette parcelle dans l&apos;inventaire de leur propriétaire ?
554sur cette parcelle de terrain vers l&apos;inventaire de leur propriétaire ? 553Les objets transférables cédés à un groupe seront renvoyés aux propriétaires précédents.
555Les objets cessibles transférés à des groupes seront
556renvoyés à leurs propriétaires précédents.
557 554
558*AVERTISSEMENT* Ceci supprimera les objets non-cessibles transférés au groupe ! 555*Avertissement* Tous les objets non transférables cédés au groupe seront supprimés !
559 556
560Objets : [N] 557Objets : [N]
561 </message> 558 </message>
562 <option name="Return"> 559 <option name="Return">
563 Retourner 560 OK
564 </option> 561 </option>
565 <option name="Cancel"> 562 <option name="Cancel">
566 Annuler 563 Annuler
@@ -568,33 +565,37 @@ Objets : [N]
568 </alert> 565 </alert>
569 <alert name="ReturnObjectsNotOwnedByUser"> 566 <alert name="ReturnObjectsNotOwnedByUser">
570 <message name="message"> 567 <message name="message">
571 Etes-vous sûr(e) de vouloir renvoyer tous les objets n&apos;appartenant PAS 568 Êtes-vous certain de vouloir renvoyer tous les objets que [NAME] ne possède pas sur cette parcelle dans l&apos;inventaire de leur propriétaire ?
572à [NAME] sur cette parcelle de terrain vers l&apos;inventaire de leur propriétaire ? 569Les objets transférables cédés à un groupe seront renvoyés aux propriétaires précédents.
573Les objets cessibles transférés à des groupes seront
574renvoyés à leurs propriétaires précédents.
575 570
576*AVERTISSEMENT* Ceci supprimera les objets non-cessibles transférés au groupe ! 571*Avertissement* Tous les objets non transférables cédés au groupe seront supprimés !
577 572
578Objets : [N] 573Objets : [N]
579 </message> 574 </message>
580 <option name="Return"> 575 <option name="Return">
581 Retourner 576 OK
582 </option> 577 </option>
583 <option name="Cancel"> 578 <option name="Cancel">
584 Annuler 579 Annuler
585 </option> 580 </option>
586 </alert> 581 </alert>
587 <alert name="ReturnAllTopObjects"> 582 <alert name="ReturnAllTopObjects">
583 <message name="message">
584 Êtes-vous certain de vouloir renvoyer tous les objets de la liste dans l&apos;inventaire de leur propriétaire ?
585 </message>
588 <option name="Return"> 586 <option name="Return">
589 Retourner 587 OK
590 </option> 588 </option>
591 <option name="Cancel"> 589 <option name="Cancel">
592 Annuler 590 Annuler
593 </option> 591 </option>
594 </alert> 592 </alert>
595 <alert name="DisableAllTopObjects"> 593 <alert name="DisableAllTopObjects">
594 <message name="message">
595 Êtes-vous certain de vouloir désactiver tous les objets dans cette région ?
596 </message>
596 <option name="Disable"> 597 <option name="Disable">
597 Désactiver 598 OK
598 </option> 599 </option>
599 <option name="Cancel"> 600 <option name="Cancel">
600 Annuler 601 Annuler
@@ -602,14 +603,12 @@ Objets : [N]
602 </alert> 603 </alert>
603 <alert name="ReturnObjectsNotOwnedByGroup"> 604 <alert name="ReturnObjectsNotOwnedByGroup">
604 <message name="message"> 605 <message name="message">
605 Renvoyer les objets sur cette parcelle de terrain 606 Renvoyer les objets de cette parcelle qui ne sont pas partagés avec le groupe [NAME] à leur propriétaire ?
606qui ne sont PAS partagés avec le groupe [NAME]
607à leurs propriétaires ?
608 607
609Objets : [N] 608Objets : [N]
610 </message> 609 </message>
611 <option name="Return"> 610 <option name="Return">
612 Retourner 611 OK
613 </option> 612 </option>
614 <option name="Cancel"> 613 <option name="Cancel">
615 Annuler 614 Annuler
@@ -617,25 +616,24 @@ Objets : [N]
617 </alert> 616 </alert>
618 <alert name="UnableToDisableOutsideScripts"> 617 <alert name="UnableToDisableOutsideScripts">
619 <message name="message"> 618 <message name="message">
620 Impossible de désactiver les scripts extérieurs. 619 Impossible de désactiver les scripts.
621La région entière autorise les dégâts (not safe). 620Les dégâts sont autorisés dans toute la région.
622Les scripts doivent être autorisés pour faire fonctionner les armes à feu. 621Pour que les armes fonctionnent, les scripts doivent être autorisés.
623 </message> 622 </message>
624 </alert> 623 </alert>
625 <alert name="MustBeInParcel"> 624 <alert name="MustBeInParcel">
626 <message name="message"> 625 <message name="message">
627 Vous devez vous trouver à l&apos;intérieur de la parcelle de terrain 626 Pour définir le point d&apos;atterrissage, vous devez vous trouver à l&apos;intérieur de la parcelle.
628pour définir le point d&apos;atterrissage.
629 </message> 627 </message>
630 </alert> 628 </alert>
631 <alert name="PromptRecipientEmail"> 629 <alert name="PromptRecipientEmail">
632 <message name="message"> 630 <message name="message">
633 Veuillez saisir l&apos;adresse mail du destinataire. 631 Veuillez saisir l&apos;adresse e-mail du destinataire.
634 </message> 632 </message>
635 </alert> 633 </alert>
636 <alert name="PromptSelfEmail"> 634 <alert name="PromptSelfEmail">
637 <message name="message"> 635 <message name="message">
638 Veuillez saisir votre adresse mail. 636 Veuillez saisir votre adresse e-mail.
639 </message> 637 </message>
640 </alert> 638 </alert>
641 <alert name="PromptMissingSubjMsg"> 639 <alert name="PromptMissingSubjMsg">
@@ -651,78 +649,73 @@ pour définir le point d&apos;atterrissage.
651 </alert> 649 </alert>
652 <alert name="ErrorProcessingSnapshot"> 650 <alert name="ErrorProcessingSnapshot">
653 <message name="message"> 651 <message name="message">
654 Erreur dans le traitement des données de l&apos;instantané 652 Erreur dans le traitement des données de la photo
655 </message> 653 </message>
656 </alert> 654 </alert>
657 <alert name="ErrorEncodingSnapshot"> 655 <alert name="ErrorEncodingSnapshot">
658 <message name="message"> 656 <message name="message">
659 Erreur d&apos;encodage de l&apos;instantané ! 657 Erreur d&apos;encodage de la photo.
660 </message> 658 </message>
661 </alert> 659 </alert>
662 <alert name="ErrorUploadingPostcard"> 660 <alert name="ErrorUploadingPostcard">
663 <message name="message"> 661 <message name="message">
664 Problème lors de l&apos;upload d&apos;une carte postale : [REASON] 662 Une erreur est survenue lors du chargement du script compilé, suite au problème suivant : [REASON]
665 </message> 663 </message>
666 </alert> 664 </alert>
667 <alert name="ErrorUploadingReportScreenshot"> 665 <alert name="ErrorUploadingReportScreenshot">
668 <message name="message"> 666 <message name="message">
669 Problème lors de l&apos;envoi d&apos;une capture d&apos;écran : [REASON] 667 Une erreur est survenue lors du chargement de la capture d&apos;écran destinée au rapport, suite au problème suivant : [REASON]
670 </message> 668 </message>
671 </alert> 669 </alert>
672 <alert name="MustAgreeToLogIn"> 670 <alert name="MustAgreeToLogIn">
673 <message name="message"> 671 <message name="message">
674 Vous devez accepter les Conditions Générales d&apos;Utilisation pour continuer à vous connecter à [SECOND_LIFE]. 672 Pour vous connecter à [SECOND_LIFE], vous devez accepter les Conditions d&apos;utilisation.
675 </message> 673 </message>
676 </alert> 674 </alert>
677 <alert name="CouldNotPutOnOutfit"> 675 <alert name="CouldNotPutOnOutfit">
678 <message name="message"> 676 <message name="message">
679 Impossible de revêtir la tenue. 677 Impossible de mettre cet ensemble.
680Le dossier Tenues ne contient ni vêtements, ni éléments corporels, ni attachements. 678Ce dossier ne contient pas d&apos;habits, de parties du corps ni de pièces jointes.
681 </message> 679 </message>
682 </alert> 680 </alert>
683 <alert name="CannotWearTrash"> 681 <alert name="CannotWearTrash">
684 <message name="message"> 682 <message name="message">
685 Impossible de porter des vêtements ou parties du corps se trouvant dans la corbeille. 683 Vous ne pouvez pas porter d&apos;habits ni de parties du corps se trouvant dans la corbeille.
686 </message> 684 </message>
687 </alert> 685 </alert>
688 <alert name="CannotWearInfoNotComplete"> 686 <alert name="CannotWearInfoNotComplete">
689 <message name="message"> 687 <message name="message">
690 Impossible de porter cet élément car ses informations ne sont pas encore disponibles. 688 Vous ne pouvez pas porter cet article car il n&apos;a pas encore été chargé. Veuillez réessayer dans une minute.
691Veuillez réessayer dans une minute.
692 </message> 689 </message>
693 </alert> 690 </alert>
694 <alert name="MustHaveAccountToLogInNoLinks"> 691 <alert name="MustHaveAccountToLogInNoLinks">
695 <message name="message"> 692 <message name="message">
696 Vous devez disposer d&apos;un compte pour vous connecter à [SECOND_LIFE]. 693 Pour vous connecter sur [SECOND_LIFE], vous devez avoir un compte.
697 </message> 694 </message>
698 <option name="OK"> 695 <option name="OK">
699 OK 696 Fermer
700 </option> 697 </option>
701 </alert> 698 </alert>
702 <alert name="MustHaveAccountToLogIn"> 699 <alert name="MustHaveAccountToLogIn">
703 <message name="message"> 700 <message name="message">
704 Vous devez disposer d&apos;un compte pour vous connecter à [SECOND_LIFE]. 701 Oups! Vous avez oublié de fournir certaines informations.
705 702Vous devez saisir le nom et le prénom de votre avatar.
706Vous rendre sur www.secondlife.com pour créer un nouveau compte ? 703
704Pour entrer dans [SECOND_LIFE], vous devez avoir un compte. Voulez-vous en créer un maintenant ?
707 </message> 705 </message>
708 <option name="OK"> 706 <option name="OK">
709 OK 707 Créer un compte
710 </option> 708 </option>
711 <option name="Cancel"> 709 <option name="Cancel">
712 Annuler 710 Réessayer
713 </option> 711 </option>
714 </alert> 712 </alert>
715 <alert name="AddClassified"> 713 <alert name="AddClassified">
716 <message name="message"> 714 <message name="message">
717 Les petites annonces sont publiées dans la section &apos;Annonces&apos; 715 Les petites annonces sont publiées dans la section Petites annonces sous Recherche, pour une durée d&apos;une semaine.
718du module de recherche, pour une durée d&apos;une semaine. 716Rédigez votre annonce, puis cliquez sur Publier...pour l&apos;ajouter à la liste des annonces.
719 717Au moment de cliquer sur Publier, vous serez invité à payer des frais.
720Rédigez votre annonce, puis cliquez sur &apos;Publier...&apos; pour 718Plus vous payez cher, plus votre annonce est visible dans la liste ainsi que dans les résultats de recherche de mots-clés.
721l&apos;ajouter à la liste des annonces.
722
723Vous devrez payer des frais d&apos;insertion au moment de cliquer sur &apos;Publier&apos;.
724Plus vous payez, plus votre annonce apparaîtra en haut de liste.
725Ceci est également valable pour les résultats de recherche de mots-clé.
726 </message> 719 </message>
727 <option name="OK"> 720 <option name="OK">
728 OK 721 OK
@@ -736,11 +729,11 @@ Ceci est également valable pour les résultats de recherche de mots-clé.
736 </alert> 729 </alert>
737 <alert name="DeleteClassified"> 730 <alert name="DeleteClassified">
738 <message name="message"> 731 <message name="message">
739 Supprimer l&apos;annonce &apos;[NAME]&apos;? 732 Supprimer l&apos;annonce [NAME] ?
740Les frais d&apos;insertion sont non remboursables. 733Une fois payés, les frais ne sont pas remboursables.
741 </message> 734 </message>
742 <option name="Delete"> 735 <option name="Delete">
743 Supprimer 736 OK
744 </option> 737 </option>
745 <option name="Cancel"> 738 <option name="Cancel">
746 Annuler 739 Annuler
@@ -762,10 +755,10 @@ Les frais d&apos;insertion sont non remboursables.
762 </alert> 755 </alert>
763 <alert name="DeleteAvatarPick"> 756 <alert name="DeleteAvatarPick">
764 <message name="message"> 757 <message name="message">
765 Supprimer [PICK] des lieux favoris ? 758 Supprimer le favori [PICK] ?
766 </message> 759 </message>
767 <option name="Delete"> 760 <option name="Delete">
768 Supprimer 761 OK
769 </option> 762 </option>
770 <option name="Cancel"> 763 <option name="Cancel">
771 Annuler 764 Annuler
@@ -788,10 +781,10 @@ Veuillez appliquer vos modifications et quitter
788 </alert> 781 </alert>
789 <alert name="PromptGoToEventsPage"> 782 <alert name="PromptGoToEventsPage">
790 <message name="message"> 783 <message name="message">
791 Aller sur la page des événements [SECOND_LIFE] ? 784 Aller à la page web de [SECOND_LIFE] réservée aux événements ?
792 </message> 785 </message>
793 <option name="GotoPage"> 786 <option name="GotoPage">
794 Aller à la Page 787 OK
795 </option> 788 </option>
796 <option name="Cancel"> 789 <option name="Cancel">
797 Annuler 790 Annuler
@@ -809,17 +802,17 @@ Veuillez appliquer vos modifications et quitter
809 </alert> 802 </alert>
810 <alert name="SelectProposalToView"> 803 <alert name="SelectProposalToView">
811 <message name="message"> 804 <message name="message">
812 Veuillez choisir une proposition à afficher. 805 Veuillez sélectionner une proposition.
813 </message> 806 </message>
814 </alert> 807 </alert>
815 <alert name="SelectHistoryItemToView"> 808 <alert name="SelectHistoryItemToView">
816 <message name="message"> 809 <message name="message">
817 Veuillez choisir un elément de l&apos;historique à afficher. 810 Veuillez sélectionner un historique.
818 </message> 811 </message>
819 </alert> 812 </alert>
820 <alert name="ResetShowNextTimeDialogs"> 813 <alert name="ResetShowNextTimeDialogs">
821 <message name="message"> 814 <message name="message">
822 Réinitialiser tous les dialogues &apos;Afficher la prochaine fois&apos; ? 815 Souhaitez-vous réactiver tous les pop-ups que vous aviez désactivés ?
823 </message> 816 </message>
824 <option name="OK"> 817 <option name="OK">
825 OK 818 OK
@@ -841,7 +834,7 @@ Veuillez appliquer vos modifications et quitter
841 </alert> 834 </alert>
842 <alert name="CacheWillClear"> 835 <alert name="CacheWillClear">
843 <message name="message"> 836 <message name="message">
844 Le cache sera vidé au redémarrage de [SECOND_LIFE]. 837 Le cache sera vidé après le redémarrage de [SECOND_LIFE].
845 </message> 838 </message>
846 </alert> 839 </alert>
847 <alert name="CacheWillBeMoved"> 840 <alert name="CacheWillBeMoved">
@@ -862,11 +855,10 @@ Remarque : cela videra le cache.
862 </alert> 855 </alert>
863 <alert name="GoToAuctionPage"> 856 <alert name="GoToAuctionPage">
864 <message name="message"> 857 <message name="message">
865 Aller sur la page [SECOND_LIFE] pour afficher le détail des enchères 858 Aller à la page web de [SECOND_LIFE] pour voir le détail des enchères ou enchérir ?
866ou enchérir ?
867 </message> 859 </message>
868 <option name="GotoPage"> 860 <option name="GotoPage">
869 Aller à la Page 861 OK
870 </option> 862 </option>
871 <option name="Cancel"> 863 <option name="Cancel">
872 Annuler 864 Annuler
@@ -874,7 +866,7 @@ ou enchérir ?
874 </alert> 866 </alert>
875 <alert name="SaveChanges"> 867 <alert name="SaveChanges">
876 <message name="message"> 868 <message name="message">
877 Enregistrer les modifications ? 869 Enregistrer les changements ?
878 </message> 870 </message>
879 <option name="Save"> 871 <option name="Save">
880 Enregistrer 872 Enregistrer
@@ -888,76 +880,76 @@ ou enchérir ?
888 </alert> 880 </alert>
889 <alert name="GestureSaveFailedTooManySteps"> 881 <alert name="GestureSaveFailedTooManySteps">
890 <message name="message"> 882 <message name="message">
891 Echec de la sauvegarde du geste. 883 L&apos;enregistrement du geste a échoué.
892Ce geste comporte trop d&apos;étapes. 884Il y a trop d&apos;étapes dans ce geste.
893Essayer de retirer quelques étapes, puis enregistrez à nouveau. 885Essayez d&apos;en supprimer quelques-unes.
894 </message> 886 </message>
895 </alert> 887 </alert>
896 <alert name="GestureSaveFailedTryAgain"> 888 <alert name="GestureSaveFailedTryAgain">
897 <message name="message"> 889 <message name="message">
898 Echec de la sauvegarde du geste. Veuillez réessayer dans une minute. 890 L&apos;enregistrement du geste a échoué. Veuillez réessayer dans une minute.
899 </message> 891 </message>
900 </alert> 892 </alert>
901 <alert name="GestureSaveFailedObjectNotFound"> 893 <alert name="GestureSaveFailedObjectNotFound">
902 <message name="message"> 894 <message name="message">
903 Impossible d&apos;enregistrer le geste car l&apos;objet ou son inventaire associé est introuvable. 895 Le geste n&apos;a pas pu être enregistré car l&apos;objet ou l&apos;inventaire de l&apos;objet associé n&apos;a pas été trouvé.
904L&apos;objet est peut-être hors de portée ou a été supprimé. 896L&apos;objet est peut-être inaccessible ou a peut-être été supprimé.
905 </message> 897 </message>
906 </alert> 898 </alert>
907 <alert name="GestureSaveFailedReason"> 899 <alert name="GestureSaveFailedReason">
908 <message name="message"> 900 <message name="message">
909 Problème lors de la sauvegarde d&apos;un geste : [REASON]. Veuillez réessayer de sauvegarder le geste ultérieurement. 901 Une erreur est survenue lors de l&apos;enregistrement du geste, suite au problème suivant : [REASON]. Essayez d&apos;enregistrer votre geste ultérieurement.
910 </message> 902 </message>
911 </alert> 903 </alert>
912 <alert name="SaveNotecardFailObjectNotFound"> 904 <alert name="SaveNotecardFailObjectNotFound">
913 <message name="message"> 905 <message name="message">
914 Impossible d&apos;enregistrer la note car l&apos;objet ou son inventaire associé est introuvable. 906 La note n&apos;a pas pu être enregistrée car l&apos;objet ou l&apos;inventaire de l&apos;objet associé n&apos;a pas été trouvé.
915L&apos;objet est peut-être hors de portée ou a été supprimé. 907L&apos;objet est peut-être inaccessible ou a peut-être été supprimé.
916 </message> 908 </message>
917 </alert> 909 </alert>
918 <alert name="SaveNotecardFailReason"> 910 <alert name="SaveNotecardFailReason">
919 <message name="message"> 911 <message name="message">
920 Problème lors de la sauvegarde d&apos;une note : [REASON]. Veuillez réessayer de sauvegarder la note ultérieurement. 912 Une erreur est survenue lors de l&apos;enregistrement de la note, suite au problème suivant : [REASON]. Essayez d&apos;enregistrer votre note ultérieurement.
921 </message> 913 </message>
922 </alert> 914 </alert>
923 <alert name="ScriptCannotUndo"> 915 <alert name="ScriptCannotUndo">
924 <message name="message"> 916 <message name="message">
925 Impossible d&apos;annuler toutes les modifications dans votre version du script. 917 Impossible d&apos;annuler tous les changements dans votre version du script.
926Voulez-vous charger la dernière version enregistrée sur le serveur ? 918Souhaitez-vous charger la dernière version enregistrée sur le serveur ?
927(Attention : cette opération est définitive.) 919(**Attention** Cette opération est irréversible.)
928 </message> 920 </message>
929 <option name="Yes"> 921 <option name="Yes">
930 Oui 922 OK
931 </option> 923 </option>
932 <option name="No"> 924 <option name="No">
933 Non 925 Annuler
934 </option> 926 </option>
935 </alert> 927 </alert>
936 <alert name="SaveScriptFailReason"> 928 <alert name="SaveScriptFailReason">
937 <message name="message"> 929 <message name="message">
938 Problème lors de la sauvegarde d&apos;un script : [REASON]. Veuillez réessayer de sauvegarder le script ultérieurement. 930 Une erreur est survenue lors de l&apos;enregistrement du script, suite au problème suivant : [REASON]. Essayez d&apos;enregistrer votre script ultérieurement.
939 </message> 931 </message>
940 </alert> 932 </alert>
941 <alert name="SaveScriptFailObjectNotFound"> 933 <alert name="SaveScriptFailObjectNotFound">
942 <message name="message"> 934 <message name="message">
943 Impossible d&apos;enregistrer le script car l&apos;objet associé est introuvable. 935 Impossible d&apos;enregistrer le script car l&apos;objet qui le contient est introuvable.
944L&apos;objet est peut-être hors de portée ou a été supprimé. 936L&apos;objet est peut-être inaccessible ou a peut-être été supprimé.
945 </message> 937 </message>
946 </alert> 938 </alert>
947 <alert name="SaveBytecodeFailReason"> 939 <alert name="SaveBytecodeFailReason">
948 <message name="message"> 940 <message name="message">
949 Problème lors de la sauvegarde d&apos;un script compilé : [REASON]. Veuillez réessayer de sauvegarder le script ultérieurement. 941 Une erreur est survenue lors de l&apos;enregistrement du script compilé, suite au problème suivant : [REASON]. Essayez d&apos;enregistrer votre script ultérieurement.
950 </message> 942 </message>
951 </alert> 943 </alert>
952 <alert name="CouldNotStartStopScript"> 944 <alert name="CouldNotStartStopScript">
953 <message name="message"> 945 <message name="message">
954 Impossible de démarrer ou d&apos;arrêter le script car l&apos;objet associé est introuvable. 946 Impossible de lancer ou d&apos;arrêter le script car l&apos;objet qui le contient est introuvable.
955L&apos;objet est peut-être hors de portée ou a été supprimé. 947L&apos;objet est peut-être inaccessible ou a peut-être été supprimé.
956 </message> 948 </message>
957 </alert> 949 </alert>
958 <alert name="CannotDownloadFile"> 950 <alert name="CannotDownloadFile">
959 <message name="message"> 951 <message name="message">
960 Téléchargement du fichier impossible 952 Impossible de télécharger le fichier
961 </message> 953 </message>
962 </alert> 954 </alert>
963 <alert name="CannotWriteEncode"> 955 <alert name="CannotWriteEncode">
@@ -967,7 +959,7 @@ L&apos;objet est peut-être hors de portée ou a été supprimé.
967 </alert> 959 </alert>
968 <alert name="CannotWriteFile"> 960 <alert name="CannotWriteFile">
969 <message name="message"> 961 <message name="message">
970 Ecriture du fichier [[FILE]] impossible 962 Impossible d&apos;écrire le fichier [[FILE]]
971 </message> 963 </message>
972 </alert> 964 </alert>
973 <alert name="CannotLoadWearable"> 965 <alert name="CannotLoadWearable">
@@ -989,7 +981,7 @@ Etes-vous sûr(e) de vouloir supprimer ces eléments ?
989 </alert> 981 </alert>
990 <alert name="DisplaySettingsSafe"> 982 <alert name="DisplaySettingsSafe">
991 <message name="message"> 983 <message name="message">
992 Les paramètres d&apos;affichage ont été définis ont été définis aux valeurs du mode sans échec 984 Les paramètres d&apos;affichage ont été définis sur sécurisé
993car vous avez activé le mode sans échec. 985car vous avez activé le mode sans échec.
994 </message> 986 </message>
995 </alert> 987 </alert>
@@ -1027,7 +1019,7 @@ Voulez-vous visiter [_URL] pour plus d&apos;informations ?
1027 </alert> 1019 </alert>
1028 <alert name="UnsupportedCPU"> 1020 <alert name="UnsupportedCPU">
1029 <message name="message"> 1021 <message name="message">
1030 - Votre CPU ne remplit pas les conditions minimum requises. 1022 - Votre processeur ne remplit pas les conditions minimum requises.
1031 </message> 1023 </message>
1032 </alert> 1024 </alert>
1033 <alert name="UnsupportedCPUAmount"> 1025 <alert name="UnsupportedCPUAmount">
@@ -1125,7 +1117,7 @@ afin de signaler le problème.
1125 </alert> 1117 </alert>
1126 <alert name="CannotConnectVerificationError"> 1118 <alert name="CannotConnectVerificationError">
1127 <message name="message"> 1119 <message name="message">
1128 Connexion impossible à [SECOND_LIFE]. 1120 Connexion à [SECOND_LIFE] impossible.
1129Le serveur d&apos;identification a rencontré une erreur de connexion SSL. 1121Le serveur d&apos;identification a rencontré une erreur de connexion SSL.
1130Si vous continuez à recevoir ce message d&apos;erreur, veuillez vous rendre 1122Si vous continuez à recevoir ce message d&apos;erreur, veuillez vous rendre
1131à la rubrique Support de SecondLife.com pour 1123à la rubrique Support de SecondLife.com pour
@@ -1134,20 +1126,20 @@ signaler ce problème.
1134 </alert> 1126 </alert>
1135 <alert name="CannotConnectUnknownErrorWindows"> 1127 <alert name="CannotConnectUnknownErrorWindows">
1136 <message name="message"> 1128 <message name="message">
1137 Connexion impossible à [SECOND_LIFE]. 1129 Connexion à [SECOND_LIFE] impossible.
1138Malgré nos efforts, une erreur inattendue s&apos;est produite. 1130Malgré nos efforts, une erreur inattendue s&apos;est produite.
1139Veuillez vous rendre à la rubrique Support du site SecondLife.com 1131Veuillez vous rendre à la rubrique Support du site SecondLife.com
1140pour signaler ce problème. Si possible, joignez votre fichier SecondLife.log 1132pour signaler ce problème. Si possible, joignez votre fichier SecondLife.log
1141qui se trouve à l&apos;emplacement suivant : C:\Documents and Settings\(nom)\Application Data\SecondLife\logs 1133qui se trouve à l&apos;emplacement suivant : C:\Documents and Settings\(nom)\Application Data\SecondLife\logs
1142Merci. 1134Merci.
1143 </message> 1135 </message>
1144 </alert> 1136 </alert>
1145 <alert name="CannotConnectUnknownErrorDarwin"> 1137 <alert name="CannotConnectUnknownErrorDarwin">
1146 <message name="message"> 1138 <message name="message">
1147 Connexion impossible à [SECOND_LIFE]. 1139 Connexion à [SECOND_LIFE] impossible.
1148Malgré nos efforts, une erreur inattendue s&apos;est produite. 1140Malgré nos efforts, une erreur inattendue s&apos;est produite.
1149Veuillez vous rendre à la rubrique Support du site SecondLife.com 1141Veuillez vous rendre à la rubrique Support du site SecondLife.com
1150pour signaler ce problème. Si possible, joignez votre fichier SecondLife.log 1142pour signaler ce problème. Si possible, joignez votre fichier SecondLife.log
1151qui se trouve à l&apos;emplacement suivant : ~/Library/Application Support/SecondLife/logs 1143qui se trouve à l&apos;emplacement suivant : ~/Library/Application Support/SecondLife/logs
1152Merci. 1144Merci.
1153 </message> 1145 </message>
@@ -1155,7 +1147,7 @@ Merci.
1155 <alert name="CannotResolveLoginToken"> 1147 <alert name="CannotResolveLoginToken">
1156 <message name="message"> 1148 <message name="message">
1157 Un problème est survenu lors de la résolution 1149 Un problème est survenu lors de la résolution
1158de votre identification. Veuillez réessayer 1150de votre authentification. Veuillez réessayer
1159de vous connecter. Si vous continuez à recevoir ce message d&apos;erreur, 1151de vous connecter. Si vous continuez à recevoir ce message d&apos;erreur,
1160veuillez vous rendre à la rubrique Support du site SecondLife.com. 1152veuillez vous rendre à la rubrique Support du site SecondLife.com.
1161 </message> 1153 </message>
@@ -1177,7 +1169,7 @@ pour des conseils et un lien vers la page web d&apos;état du service.
1177 </alert> 1169 </alert>
1178 <alert name="CannotConnectNoReplyFromLogin"> 1170 <alert name="CannotConnectNoReplyFromLogin">
1179 <message name="message"> 1171 <message name="message">
1180 Connexion impossible. Pas de réponse de la base de données d&apos;identification. 1172 Connexion impossible. Pas de réponse du sim.
1181 1173
1182Veuillez réessayer d&apos;ici quelques minutes, ou cliquez sur Aide 1174Veuillez réessayer d&apos;ici quelques minutes, ou cliquez sur Aide
1183pour des conseils et un lien vers la page web d&apos;état du service. 1175pour des conseils et un lien vers la page web d&apos;état du service.
@@ -1191,7 +1183,7 @@ pour des conseils et un lien vers la page web d&apos;état du service.
1191 </alert> 1183 </alert>
1192 <alert name="CannotConnectLoginTimeout"> 1184 <alert name="CannotConnectLoginTimeout">
1193 <message name="message"> 1185 <message name="message">
1194 Temps d&apos;attente de connexion à votre localisation dépassé. Veuillez réessayer. 1186 Temps d&apos;attente de connexion à votre emplacement dépassé. Veuillez réessayer.
1195 </message> 1187 </message>
1196 </alert> 1188 </alert>
1197 <alert name="FirstRunDialog"> 1189 <alert name="FirstRunDialog">
@@ -1226,7 +1218,7 @@ Veuillez vérifier votre connexion.
1226 </alert> 1218 </alert>
1227 <alert name="WelcomeToSecondLife"> 1219 <alert name="WelcomeToSecondLife">
1228 <message name="message"> 1220 <message name="message">
1229 Welcome to [SECOND_LIFE] ! 1221 Bienvenue sur [SECOND_LIFE] !
1230 1222
1231Utilisez les touches de direction pour vous déplacer. 1223Utilisez les touches de direction pour vous déplacer.
1232 1224
@@ -1257,17 +1249,12 @@ Veuillez choisir le sexe de votre personnage.
1257 </alert> 1249 </alert>
1258 <alert name="RegionNoTerraforming"> 1250 <alert name="RegionNoTerraforming">
1259 <message name="message"> 1251 <message name="message">
1260 La région [REGION] n&apos;autorise pas le terraforming. 1252 Le terraformage est interdit dans la région [REGION].
1261Vous devrez acquérir du terrain dans une autre partie du monde
1262pour le terraformer.
1263 </message> 1253 </message>
1264 </alert> 1254 </alert>
1265 <alert name="CannotCopyWarning"> 1255 <alert name="CannotCopyWarning">
1266 <message name="message"> 1256 <message name="message">
1267 Vous n&apos;êtes pas autorisé(e) à copier 1257 Vous n&apos;êtes pas autorisé à copier cet objet et il disparaîtra de votre inventaire si vous le donnez. Souhaitez-vous vraiment offrir cet objet ?
1268cet élément. Il disparaîtra de votre
1269inventaire si vous le donnez. Voulez-vous
1270vraiment offrir cet élément?
1271 </message> 1258 </message>
1272 <option name="Yes"> 1259 <option name="Yes">
1273 Oui 1260 Oui
@@ -1278,7 +1265,7 @@ vraiment offrir cet élément?
1278 </alert> 1265 </alert>
1279 <alert name="CannotGiveItem"> 1266 <alert name="CannotGiveItem">
1280 <message name="message"> 1267 <message name="message">
1281 Impossible d&apos;offrir l&apos;élément d&apos;inventaire. 1268 Impossible de donner l&apos;objet de l&apos;inventaire.
1282 </message> 1269 </message>
1283 </alert> 1270 </alert>
1284 <alert name="TransactionCancelled"> 1271 <alert name="TransactionCancelled">
@@ -1288,20 +1275,18 @@ vraiment offrir cet élément?
1288 </alert> 1275 </alert>
1289 <alert name="TooManyItems"> 1276 <alert name="TooManyItems">
1290 <message name="message"> 1277 <message name="message">
1291 Impossible d&apos;offrir autant d&apos;éléments en un seul transfert d&apos;inventaire. 1278 Impossible de donner plus de 42 objets au cours d&apos;un seul transfert d&apos;inventaire.
1292 </message> 1279 </message>
1293 </alert> 1280 </alert>
1294 <alert name="NoItems"> 1281 <alert name="NoItems">
1295 <message name="message"> 1282 <message name="message">
1296 Aucun élément cessible. 1283 Vous n&apos;êtes pas autorisé à transférer les objets sélectionnés.
1297 </message> 1284 </message>
1298 </alert> 1285 </alert>
1299 <alert name="CannotCopyCountItems"> 1286 <alert name="CannotCopyCountItems">
1300 <message name="message"> 1287 <message name="message">
1301 Vous n&apos;êtes pas autorisé(e) à copier [COUNT] des 1288 Vous n&apos;êtes pas autorisé à copier [COUNT] des objets sélectionnés. Ces objets disparaîtront de votre inventaire.
1302éléments sélectionnés. Ces éléments disparaîtront 1289Souhaitez-vous vraiment donner ces objets ?
1303de votre inventaire.
1304Souhaitez-vous réellement donner ces éléments ?
1305 </message> 1290 </message>
1306 <option name="Yes"> 1291 <option name="Yes">
1307 Oui 1292 Oui
@@ -1312,20 +1297,19 @@ Souhaitez-vous réellement donner ces éléments ?
1312 </alert> 1297 </alert>
1313 <alert name="CannotGiveCategory"> 1298 <alert name="CannotGiveCategory">
1314 <message name="message"> 1299 <message name="message">
1315 Impossible d&apos;offrir la catégorie d&apos;inventaire. 1300 Vous n&apos;êtes pas autorisé à transférer le dossier sélectionné.
1316 </message> 1301 </message>
1317 </alert> 1302 </alert>
1318 <alert name="FreezeAvatar"> 1303 <alert name="FreezeAvatar">
1319 <message name="message"> 1304 <message name="message">
1320 Bloquer cet avatar? 1305 Geler cet avatar ?
1321Il ou elle sera momentanément incapable de bouger, 1306Il ou elle ne pourra temporairement plus bouger, chatter, ou interagir dans le Monde.
1322chatter, ou interagir avec le monde.
1323 </message> 1307 </message>
1324 <option name="Freeze"> 1308 <option name="Freeze">
1325 Figer 1309 Geler
1326 </option> 1310 </option>
1327 <option name="Unfreeze"> 1311 <option name="Unfreeze">
1328 Débloquer 1312 Dégeler
1329 </option> 1313 </option>
1330 <option name="Cancel"> 1314 <option name="Cancel">
1331 Annuler 1315 Annuler
@@ -1348,13 +1332,13 @@ Il ou elle ne pourra temporairement plus bouger, chatter, ou interagir dans le M
1348 </alert> 1332 </alert>
1349 <alert name="EjectAvatar"> 1333 <alert name="EjectAvatar">
1350 <message name="message"> 1334 <message name="message">
1351 Ejecter cet avatar de votre terrain ? 1335 Expulser cet avatar de votre terrain ?
1352 </message> 1336 </message>
1353 <option name="Eject"> 1337 <option name="Eject">
1354 Ejecter 1338 Expulser
1355 </option> 1339 </option>
1356 <option name="EjectandBan"> 1340 <option name="EjectandBan">
1357 Ejecter et bannir 1341 Expulser et bannir
1358 </option> 1342 </option>
1359 <option name="Cancel"> 1343 <option name="Cancel">
1360 Annuler 1344 Annuler
@@ -1368,7 +1352,7 @@ Il ou elle ne pourra temporairement plus bouger, chatter, ou interagir dans le M
1368 Expulser 1352 Expulser
1369 </option> 1353 </option>
1370 <option name="EjectandBan"> 1354 <option name="EjectandBan">
1371 Expulser et interdire 1355 Expulser et bannir
1372 </option> 1356 </option>
1373 <option name="Cancel"> 1357 <option name="Cancel">
1374 Annuler 1358 Annuler
@@ -1376,19 +1360,18 @@ Il ou elle ne pourra temporairement plus bouger, chatter, ou interagir dans le M
1376 </alert> 1360 </alert>
1377 <alert name="InvalidUUID"> 1361 <alert name="InvalidUUID">
1378 <message name="message"> 1362 <message name="message">
1379 uuid invalide 1363 UUID invalide
1380 </message> 1364 </message>
1381 </alert> 1365 </alert>
1382 <alert name="AcquireErrorTooManyObjects"> 1366 <alert name="AcquireErrorTooManyObjects">
1383 <message name="message"> 1367 <message name="message">
1384 ERREUR D&apos;ACQUISITION : trop d&apos;objets sélectionnés. 1368 Erreur d&apos;acquisition : trop d&apos;objets sélectionnés.
1385 </message> 1369 </message>
1386 </alert> 1370 </alert>
1387 <alert name="AcquireErrorObjectSpan"> 1371 <alert name="AcquireErrorObjectSpan">
1388 <message name="message"> 1372 <message name="message">
1389 ERREUR D&apos;ACQUISITION : les objets sont répartis sur plus d&apos;une région. 1373 Erreur d&apos;acquisition : les objets sont répartis dans plus d&apos;une région.
1390Veuillez déplacer tous les objets à acquérir dans la 1374Veuillez mettre tous les objets que vous souhaitez acquérir dans la même région.
1391même région.
1392 </message> 1375 </message>
1393 </alert> 1376 </alert>
1394 <alert name="TakeLockedOrNotOwnedBy"> 1377 <alert name="TakeLockedOrNotOwnedBy">
@@ -1411,12 +1394,11 @@ Etes-vous sûr(e) de vouloir prendre ces eléments ?
1411 <alert name="PromptGoToCurrencyPage"> 1394 <alert name="PromptGoToCurrencyPage">
1412 <message name="message"> 1395 <message name="message">
1413 [EXTRA] 1396 [EXTRA]
1414 1397
1415 1398Aller sur [URL] pour obtenir des informations sur l&apos;achat de devises ?
1416Aller à [URL] pour en savoir plus sur l&apos;achat de devises ?
1417 </message> 1399 </message>
1418 <option name="GotoPage"> 1400 <option name="GotoPage">
1419 Aller à la Page 1401 OK
1420 </option> 1402 </option>
1421 <option name="Cancel"> 1403 <option name="Cancel">
1422 Annuler 1404 Annuler
@@ -1426,38 +1408,38 @@ Aller à [URL] pour en savoir plus sur l&apos;achat de devises ?
1426 <message name="message"> 1408 <message name="message">
1427 Impossible de lier ces [COUNT] objets. 1409 Impossible de lier ces [COUNT] objets.
1428Vous pouvez lier un maximum de [MAX] objets. 1410Vous pouvez lier un maximum de [MAX] objets.
1429Veuillez sélectionner moins d&apos;objets.
1430 </message> 1411 </message>
1431 </alert> 1412 </alert>
1432 <alert name="CannotLinkIncompleteSet"> 1413 <alert name="CannotLinkIncompleteSet">
1433 <message name="message"> 1414 <message name="message">
1434 Vous ne pouvez lier que des séries complètes d&apos;objets, et devez 1415 Vous ne pouvez lier que des ensembles d&apos;objets complets et vous devez choisir un minimum de deux objets.
1435sélectionner plus d&apos;un objet.
1436 </message> 1416 </message>
1437 </alert> 1417 </alert>
1438 <alert name="CannotLinkModify"> 1418 <alert name="CannotLinkModify">
1439 <message name="message"> 1419 <message name="message">
1440 Liaison impossible car vous ne disposez pas des autorisations de modification 1420 Impossible de lier car vous n&apos;avez pas la permission de modifier tous les objets.
1441pour tous les objets. Assurez-vous qu&apos;ils soient tous déverrouillés, et 1421
1442qu&apos;ils vous appartiennent tous. 1422Assurez-vous que vous êtes le propriétaire de tous les objets et qu&apos;aucun d&apos;eux n&apos;est verrouillé.
1443 </message> 1423 </message>
1444 </alert> 1424 </alert>
1445 <alert name="CannotLinkDifferentOwners"> 1425 <alert name="CannotLinkDifferentOwners">
1446 <message name="message"> 1426 <message name="message">
1447 Liaison impossible car tous les objets n&apos;ont pas le même 1427 Impossible de lier car les objets n&apos;ont pas tous le même propriétaire.
1448propriétaire. Veuillez vous assurer que tous les objets sélectionnés vous appartiennent. 1428
1429Assurez-vous que vous êtes le propriétaire de tous les objets sélectionnés.
1449 </message> 1430 </message>
1450 </alert> 1431 </alert>
1451 <alert name="NoFileExtension"> 1432 <alert name="NoFileExtension">
1452 <message name="message"> 1433 <message name="message">
1453 Le fichier &apos;[FILE]&apos; n&apos;a pas d&apos;extension. 1434 Pas d&apos;extension pour le fichier suivant : &apos;[FILE]&apos;
1454Veuillez vous assurer que le fichier a une extension valide. 1435
1436Assurez-vous que le fichier a l&apos;extension correcte.
1455 </message> 1437 </message>
1456 </alert> 1438 </alert>
1457 <alert name="InvalidFileExtension"> 1439 <alert name="InvalidFileExtension">
1458 <message name="message"> 1440 <message name="message">
1459 Extension de fichier invalide : [EXTENSION] 1441 Extension de fichier [EXTENSION] invalide
1460Requise : [VALIDS] 1442[VALIDS] attendu
1461 </message> 1443 </message>
1462 <option name="OK"> 1444 <option name="OK">
1463 OK 1445 OK
@@ -1465,87 +1447,87 @@ Requise : [VALIDS]
1465 </alert> 1447 </alert>
1466 <alert name="CannotUploadSoundFile"> 1448 <alert name="CannotUploadSoundFile">
1467 <message name="message"> 1449 <message name="message">
1468 Impossible de lire le fichier son uploadé : 1450 Impossible de lire le fichier son chargé :
1469[FILE] 1451[FILE]
1470 </message> 1452 </message>
1471 </alert> 1453 </alert>
1472 <alert name="SoundFileNotRIFF"> 1454 <alert name="SoundFileNotRIFF">
1473 <message name="message"> 1455 <message name="message">
1474 Le fichier n&apos;est pas un fichier de type RIFF WAVE : 1456 Il semble que le fichier ne soit pas un fichier RIFF WAVE :
1475[FILE] 1457[FILE]
1476 </message> 1458 </message>
1477 </alert> 1459 </alert>
1478 <alert name="SoundFileNotPCM"> 1460 <alert name="SoundFileNotPCM">
1479 <message name="message"> 1461 <message name="message">
1480 Le fichier n&apos;est pas un fichier audio de type PCM WAVE : 1462 Il semble que le fichier ne soit pas un fichier audio PCM WAVE :
1481[FILE] 1463[FILE]
1482 </message> 1464 </message>
1483 </alert> 1465 </alert>
1484 <alert name="SoundFileInvalidChannelCount"> 1466 <alert name="SoundFileInvalidChannelCount">
1485 <message name="message"> 1467 <message name="message">
1486 Le fichier a un nombre de canaux invalide (doit être mono ou stereo) : 1468 Le fichier contient un nombre de canaux invalide (doit être mono ou stéréo) :
1487[FILE] 1469[FILE]
1488 </message> 1470 </message>
1489 </alert> 1471 </alert>
1490 <alert name="SoundFileInvalidSampleRate"> 1472 <alert name="SoundFileInvalidSampleRate">
1491 <message name="message"> 1473 <message name="message">
1492 Le fichier a un taux d&apos;échantillonage non supporté (doit être en 44.1kHz) : 1474 Le fichier ne semble pas être pris en charge (doit être 44,1 k) :
1493[FILE] 1475[FILE]
1494 </message> 1476 </message>
1495 </alert> 1477 </alert>
1496 <alert name="SoundFileInvalidWordSize"> 1478 <alert name="SoundFileInvalidWordSize">
1497 <message name="message"> 1479 <message name="message">
1498 Le fichier a une longueur de mots non supportée (doit être en 8 ou 16-bit) : 1480 Le fichier ne semble pas être pris en charge (doit faire 8 ou 16 bit) :
1499[FILE] 1481[FILE]
1500 </message> 1482 </message>
1501 </alert> 1483 </alert>
1502 <alert name="SoundFileInvalidHeader"> 1484 <alert name="SoundFileInvalidHeader">
1503 <message name="message"> 1485 <message name="message">
1504 Segment &apos;données&apos; introuvable dans l&apos;en-tête WAV : 1486 Impossible de trouver les données dans l&apos;en-tête WAV :
1505[FILE] 1487[FILE]
1506 </message> 1488 </message>
1507 </alert> 1489 </alert>
1508 <alert name="SoundFileInvalidTooLong"> 1490 <alert name="SoundFileInvalidTooLong">
1509 <message name="message"> 1491 <message name="message">
1510 Le fichier audio est trop long (10 secondes max.) : 1492 Le fichier audio est trop long (10 secondes maximum) :
1511[FILE] 1493[FILE]
1512 </message> 1494 </message>
1513 </alert> 1495 </alert>
1514 <alert name="ProblemWithFile"> 1496 <alert name="ProblemWithFile">
1515 <message name="message"> 1497 <message name="message">
1516 Erreur du fichier [FILE]: 1498 Problème avec le fichier [FILE] :
1517 1499
1518[ERROR] 1500[ERROR]
1519 </message> 1501 </message>
1520 </alert> 1502 </alert>
1521 <alert name="CannotOpenTemporarySoundFile"> 1503 <alert name="CannotOpenTemporarySoundFile">
1522 <message name="message"> 1504 <message name="message">
1523 Impossible d&apos;ouvrir le fichier son compressé temporaire à écrire : [FILE] 1505 Impossible d&apos;ouvrir le fichier son compressé temporaire : [FILE]
1524 </message> 1506 </message>
1525 </alert> 1507 </alert>
1526 <alert name="UnknownVorbisEncodeFailure"> 1508 <alert name="UnknownVorbisEncodeFailure">
1527 <message name="message"> 1509 <message name="message">
1528 Erreur d&apos;encodage vorbis inconnue du fichier : [FILE] 1510 Échec d&apos;encodage Vorbis inconnu sur : [FILE]
1529 </message> 1511 </message>
1530 </alert> 1512 </alert>
1531 <alert name="CorruptResourceFile"> 1513 <alert name="CorruptResourceFile">
1532 <message name="message"> 1514 <message name="message">
1533 fichier ressource corrompu : [FILE] 1515 Fichier ressource corrompu : [FILE]
1534 </message> 1516 </message>
1535 </alert> 1517 </alert>
1536 <alert name="UnknownResourceFileVersion"> 1518 <alert name="UnknownResourceFileVersion">
1537 <message name="message"> 1519 <message name="message">
1538 version de fichier ressource linden inconnue : [FILE] 1520 Version de fichier ressource Linden inconnu : [FILE]
1539 </message> 1521 </message>
1540 </alert> 1522 </alert>
1541 <alert name="UnableToCreateOutputFile"> 1523 <alert name="UnableToCreateOutputFile">
1542 <message name="message"> 1524 <message name="message">
1543 Impossible de créer le fichier : [FILE] 1525 Impossible de créer le fichier de sortie : [FILE]
1544 </message> 1526 </message>
1545 </alert> 1527 </alert>
1546 <alert name="DoNotSupportBulkAnimationUpload"> 1528 <alert name="DoNotSupportBulkAnimationUpload">
1547 <message name="message"> 1529 <message name="message">
1548 L&apos;upload de fichiers d&apos;animation par lots n&apos;est pas encore possible. 1530 Actuellement, nous ne prenons pas en charge le chargement de lots de fichiers d&apos;animation.
1549 </message> 1531 </message>
1550 </alert> 1532 </alert>
1551 <alert name="CannotAccessOutputFile"> 1533 <alert name="CannotAccessOutputFile">
@@ -1560,55 +1542,52 @@ Requise : [VALIDS]
1560 </alert> 1542 </alert>
1561 <alert name="InsufficientFundsToFinishUpload"> 1543 <alert name="InsufficientFundsToFinishUpload">
1562 <message name="message"> 1544 <message name="message">
1563 Fonds insuffisants pour terminer l&apos;upload de [FILE] : il vous faut L$[COST], votre solde est de L$[BALANCE] 1545 Fonds insuffisants pour terminer le téléchargement de [FILE] : il vous faut L$[COST] et votre solde est de L$[BALANCE]
1564 </message> 1546 </message>
1565 </alert> 1547 </alert>
1566 <alert name="CannotUploadReason"> 1548 <alert name="CannotUploadReason">
1567 <message name="message"> 1549 <message name="message">
1568 Upload du fichier [FILE] impossible : [REASON] 1550 Impossible de charger [FILE] suite au problème suivant : [REASON]
1569Veuillez réessayer ultérieurement. 1551Veuillez réessayer ultérieurement.
1570 </message> 1552 </message>
1571 </alert> 1553 </alert>
1572 <alert name="CannotCreateLandmarkNotOwner"> 1554 <alert name="CannotCreateLandmarkNotOwner">
1573 <message name="message"> 1555 <message name="message">
1574 Vous ne pouvez créer un repère ici 1556 Vous ne pouvez pas créer de repère ici car le propriétaire du terrain ne l&apos;autorise pas.
1575car le propriétaire du terrain ne l&apos;autorise pas.
1576Essayez de vous déplacer de quelques mètres.
1577 </message> 1557 </message>
1578 </alert> 1558 </alert>
1579 <alert name="CannotRecompileSelectObjectsNoScripts"> 1559 <alert name="CannotRecompileSelectObjectsNoScripts">
1580 <message name="message"> 1560 <message name="message">
1581 Recompilation impossible. 1561 Impossible d&apos;effectuer les recompilations.
1582Sélectionnez des objets dont les scripts 1562Sélectionnez un objet avec un script.
1583sont valides.
1584 </message> 1563 </message>
1585 </alert> 1564 </alert>
1586 <alert name="CannotRecompileSelectObjectsNoPermission"> 1565 <alert name="CannotRecompileSelectObjectsNoPermission">
1587 <message name="message"> 1566 <message name="message">
1588 Recompilation impossible. 1567 Impossible d&apos;effectuer les recompilations.
1589Sélectionnez des objets dont vous êtes 1568
1590autorisé(e) à modifier les scripts. 1569Sélectionnez des objets qui ont des scripts et que vous pouvez modifier.
1591 </message> 1570 </message>
1592 </alert> 1571 </alert>
1593 <alert name="CannotResetSelectObjectsNoScripts"> 1572 <alert name="CannotResetSelectObjectsNoScripts">
1594 <message name="message"> 1573 <message name="message">
1595 Réinitialisation impossible. 1574 Impossible d&apos;effectuer la réinitialisation.
1596Sélectionnez des objets dont les scripts 1575
1597sont valides. 1576Veuillez sélectionner des objets avec des scripts.
1598 </message> 1577 </message>
1599 </alert> 1578 </alert>
1600 <alert name="CannotResetSelectObjectsNoPermission"> 1579 <alert name="CannotResetSelectObjectsNoPermission">
1601 <message name="message"> 1580 <message name="message">
1602 Réinitialisation impossible. 1581 Impossible d&apos;effectuer la réinitialisation.
1603Sélectionnez des objets dont vous êtes 1582
1604autorisé(e) à modifier les scripts. 1583Sélectionnez des objets qui ont des scripts et que vous pouvez modifier.
1605 </message> 1584 </message>
1606 </alert> 1585 </alert>
1607 <alert name="CannotSetRunningSelectObjectsNoScripts"> 1586 <alert name="CannotSetRunningSelectObjectsNoScripts">
1608 <message name="message"> 1587 <message name="message">
1609 Impossible de commander le démarrage de scripts. 1588 Impossible de définir les scripts sur « exécution ».
1610Sélectionnez des objets dont les scripts 1589
1611sont valides. 1590Veuillez sélectionner des objets avec des scripts.
1612 </message> 1591 </message>
1613 </alert> 1592 </alert>
1614 <alert name="CannotSetRunningSelectObjectsNoPermission"> 1593 <alert name="CannotSetRunningSelectObjectsNoPermission">
@@ -1620,9 +1599,9 @@ autorisé(e) à modifier les scripts.
1620 </alert> 1599 </alert>
1621 <alert name="CannotSetRunningNotSelectObjectsNoScripts"> 1600 <alert name="CannotSetRunningNotSelectObjectsNoScripts">
1622 <message name="message"> 1601 <message name="message">
1623 Impossible de commander l&apos;arrêt de scripts. 1602 Impossible de définir les scripts sur « non-exécution ».
1624Sélectionnez des objets dont les scripts 1603
1625sont valides. 1604Veuillez sélectionner des objets avec des scripts.
1626 </message> 1605 </message>
1627 </alert> 1606 </alert>
1628 <alert name="CannotSetRunningNotSelectObjectsNoPermission"> 1607 <alert name="CannotSetRunningNotSelectObjectsNoPermission">
@@ -1634,7 +1613,7 @@ autorisé(e) à modifier les scripts.
1634 </alert> 1613 </alert>
1635 <alert name="NoFrontmostFloater"> 1614 <alert name="NoFrontmostFloater">
1636 <message name="message"> 1615 <message name="message">
1637 No frontmost floater to save 1616 Aucun floater frontmost à sauvegarder.
1638 </message> 1617 </message>
1639 </alert> 1618 </alert>
1640 <alert name="SeachFilteredOnShortWords"> 1619 <alert name="SeachFilteredOnShortWords">
@@ -1656,7 +1635,7 @@ Recherche effectuée : [FINALQUERY]
1656 </alert> 1635 </alert>
1657 <alert name="ColladaExportFailedInvalidPermissions"> 1636 <alert name="ColladaExportFailedInvalidPermissions">
1658 <message name="message"> 1637 <message name="message">
1659 Erreur d&apos;export Collada : Autorisations non valables ou objet verrouillé ! 1638 Erreur d&apos;export Collada : autorisations non valables ou objet verrouillé !
1660 </message> 1639 </message>
1661 </alert> 1640 </alert>
1662 <alert name="ColladaExportFailedUnknownError"> 1641 <alert name="ColladaExportFailedUnknownError">
@@ -1681,30 +1660,27 @@ Recherche effectuée : [FINALQUERY]
1681 </alert> 1660 </alert>
1682 <alert name="CouldNotTeleportReason"> 1661 <alert name="CouldNotTeleportReason">
1683 <message name="message"> 1662 <message name="message">
1684 Téléportation impossible. 1663 Impossible de téléporter.
1685[REASON] 1664[REASON]
1686 </message> 1665 </message>
1687 </alert> 1666 </alert>
1688 <alert name="CannotSetLandOwnerNothingSelected"> 1667 <alert name="CannotSetLandOwnerNothingSelected">
1689 <message name="message"> 1668 <message name="message">
1690 Impossible de définir le propriétaire : 1669 Impossible de définir le propriétaire foncier :
1691Sélection vide. 1670aucune parcelle sélectionnée.
1692 </message> 1671 </message>
1693 </alert> 1672 </alert>
1694 <alert name="CannotSetLandOwnerMultipleRegions"> 1673 <alert name="CannotSetLandOwnerMultipleRegions">
1695 <message name="message"> 1674 <message name="message">
1696 Impossible de forcer la propriété du terrain car la sélection couvre plusieurs 1675 Impossible d&apos;imposer la propriété car la sélection couvre plusieurs régions. Veuillez sélectionner une zone plus petite et réessayer.
1697régions. Veuillez sélectionner une zone plus petite et réessayez.
1698 </message> 1676 </message>
1699 </alert> 1677 </alert>
1700 <alert name="ForceOwnerAuctionWarning"> 1678 <alert name="ForceOwnerAuctionWarning">
1701 <message name="message"> 1679 <message name="message">
1702 Cette parcelle a été mise aux enchères. Forcer la propriété 1680 Cette parcelle est mise aux enchères. Imposer la propriété annulerait les enchères, ce qui pourrait être gênant pour certains résidents si ces dernières ont commencé. Imposer la propriété ?
1703annulera les enchères, ce qui peut mécontenter certains résidents
1704si les enchères ont débuté. Forcer la propriété ?
1705 </message> 1681 </message>
1706 <option name="Force"> 1682 <option name="Force">
1707 Forcer 1683 OK
1708 </option> 1684 </option>
1709 <option name="Cancel"> 1685 <option name="Cancel">
1710 Annuler 1686 Annuler
@@ -1712,32 +1688,32 @@ si les enchères ont débuté. Forcer la propriété ?
1712 </alert> 1688 </alert>
1713 <alert name="CannotContentifyNothingSelected"> 1689 <alert name="CannotContentifyNothingSelected">
1714 <message name="message"> 1690 <message name="message">
1715 Ajout de contenu impossible : 1691 Problème :
1716Sélection vide. 1692Aucune parcelle sélectionnée.
1717 </message> 1693 </message>
1718 </alert> 1694 </alert>
1719 <alert name="CannotContentifyNoRegion"> 1695 <alert name="CannotContentifyNoRegion">
1720 <message name="message"> 1696 <message name="message">
1721 Ajout de contenu impossible : 1697 Problème :
1722Aucune région. 1698Aucune région sélectionnée.
1723 </message> 1699 </message>
1724 </alert> 1700 </alert>
1725 <alert name="CannotReleaseLandNothingSelected"> 1701 <alert name="CannotReleaseLandNothingSelected">
1726 <message name="message"> 1702 <message name="message">
1727 Impossible de céder le terrain : 1703 Impossible d&apos;abandonner le terrain :
1728Sélection vide. 1704aucune parcelle sélectionnée.
1729 </message> 1705 </message>
1730 </alert> 1706 </alert>
1731 <alert name="CannotReleaseLandNoRegion"> 1707 <alert name="CannotReleaseLandNoRegion">
1732 <message name="message"> 1708 <message name="message">
1733 Impossible de céder le terrain : 1709 Impossible d&apos;abandonner le terrain :
1734région introuvable. 1710la région est introuvable.
1735 </message> 1711 </message>
1736 </alert> 1712 </alert>
1737 <alert name="CannotBuyLandNothingSelected"> 1713 <alert name="CannotBuyLandNothingSelected">
1738 <message name="message"> 1714 <message name="message">
1739 Impossible d&apos;acheter le terrain : 1715 Impossible d&apos;acheter le terrain :
1740Sélection vide. 1716aucune parcelle sélectionnée.
1741 </message> 1717 </message>
1742 </alert> 1718 </alert>
1743 <alert name="CannotBuyLandNoRegion"> 1719 <alert name="CannotBuyLandNoRegion">
@@ -1753,28 +1729,29 @@ la région dans laquelle il est situé est introuvable.
1753 </alert> 1729 </alert>
1754 <alert name="CannotDeedLandNothingSelected"> 1730 <alert name="CannotDeedLandNothingSelected">
1755 <message name="message"> 1731 <message name="message">
1756 Transfert du terrain impossible : 1732 Cession du terrain impossible :
1757Sélection vide. 1733aucune parcelle sélectionnée.
1758 </message> 1734 </message>
1759 </alert> 1735 </alert>
1760 <alert name="CannotDeedLandNoGroup"> 1736 <alert name="CannotDeedLandNoGroup">
1761 <message name="message"> 1737 <message name="message">
1762 Transfert du terrain impossible : 1738 Cession du terrain impossible :
1763Aucun groupe. 1739aucun groupe sélectionné.
1764 </message> 1740 </message>
1765 </alert> 1741 </alert>
1766 <alert name="CannotDeedLandNoRegion"> 1742 <alert name="CannotDeedLandNoRegion">
1767 <message name="message"> 1743 <message name="message">
1768 Transfert du terrain impossible : 1744 Cession du terrain impossible :
1769La région contenant ce terrain est introuvable. 1745la région dans laquelle il est situé est introuvable.
1770Veuillez utiliser Aide -&gt; Signaler un bug pour envoyer un rapport. 1746Veuillez utiliser Aide &gt; Signaler des bugs pour signaler le problème.
1771 </message> 1747 </message>
1772 </alert> 1748 </alert>
1773 <alert name="CannotDeedLandMultipleSelected"> 1749 <alert name="CannotDeedLandMultipleSelected">
1774 <message name="message"> 1750 <message name="message">
1775 Transfert du terrain impossible : 1751 Cession du terrain impossible :
1776Plusieurs parcelles distinctes sélectionnées. 1752plusieurs parcelles sélectionnées.
1777Essayez de sélectionner une surface plus petite. 1753
1754Essayez de ne sélectionner qu&apos;une seule parcelle.
1778 </message> 1755 </message>
1779 </alert> 1756 </alert>
1780 <alert name="RegionNotFound"> 1757 <alert name="RegionNotFound">
@@ -1784,18 +1761,14 @@ Essayez de sélectionner une surface plus petite.
1784 </alert> 1761 </alert>
1785 <alert name="ParcelCanPlayMedia"> 1762 <alert name="ParcelCanPlayMedia">
1786 <message name="message"> 1763 <message name="message">
1787 Cet endroit peut diffuser un flux vidéo. 1764 Cette parcelle propose des flux de média.
1788 1765Pour jouer des flux de média, il faut avoir une connexion internet rapide.
1789Le flux vidéo requiert une connexion internet
1790d&apos;un débit de 768 kbps ou plus .
1791 1766
1792Lire le flux vidéo lorsque disponible ? 1767Jouer les flux de média lorsqu&apos;ils sont disponibles ?
1793 1768(Vous pourrez modifier cette option ultérieurement sous Préférences &gt; Audio et Vidéo.)
1794(Vous pouvez modifier cette option à tout moment dans
1795Préferences &gt; Audio &amp; Vidéo.)
1796 </message> 1769 </message>
1797 <option name="PlayMedia"> 1770 <option name="PlayMedia">
1798 Lire le media 1771 Jouer le média
1799 </option> 1772 </option>
1800 <option name="Disable"> 1773 <option name="Disable">
1801 Désactiver 1774 Désactiver
@@ -1803,69 +1776,72 @@ Préferences &gt; Audio &amp; Vidéo.)
1803 </alert> 1776 </alert>
1804 <alert name="CannotDeedLandWaitingForServer"> 1777 <alert name="CannotDeedLandWaitingForServer">
1805 <message name="message"> 1778 <message name="message">
1806 Transfert du terrain impossible : 1779 Cession du terrain impossible :
1807Données de propriété en attente du serveur. 1780rapport de propriété sur le point d&apos;être envoyé par le serveur.
1808Réessayez d&apos;ici quelques secondes. 1781
1782Merci de réessayer.
1809 </message> 1783 </message>
1810 </alert> 1784 </alert>
1811 <alert name="CannotDeedLandNoTransfer"> 1785 <alert name="CannotDeedLandNoTransfer">
1812 <message name="message"> 1786 <message name="message">
1813 Transfert du terrain impossible : 1787 Cession du terrain impossible :
1814La région [REGION] n&apos;autorise pas le transfert de terrain. 1788la cession de terrain est interdite dans la région [REGION].
1815 </message> 1789 </message>
1816 </alert> 1790 </alert>
1817 <alert name="CannotReleaseLandWatingForServer"> 1791 <alert name="CannotReleaseLandWatingForServer">
1818 <message name="message"> 1792 <message name="message">
1819 Impossible de céder le terrain : 1793 Impossible d&apos;abandonner le terrain :
1820En attente du serveur pour le calcul du coût. 1794mise à jour des informations sur la parcelle sur le point d&apos;être envoyée par le serveur.
1821Veuillez réessayer d&apos;ici quelques secondes. 1795
1796Veuillez réessayer dans quelques secondes.
1822 </message> 1797 </message>
1823 </alert> 1798 </alert>
1824 <alert name="CannotReleaseLandSelected"> 1799 <alert name="CannotReleaseLandSelected">
1825 <message name="message"> 1800 <message name="message">
1826 Impossible de céder le terrain : 1801 Impossible d&apos;abandonner le terrain :
1827plusieurs parcelles distinctes sélectionnées. 1802vous n&apos;êtes pas le propriétaire des parcelles sélectionnées.
1828Essayez de sélectionner une surface plus petite. 1803
1804Veuillez sélectionner une seule parcelle.
1829 </message> 1805 </message>
1830 </alert> 1806 </alert>
1831 <alert name="CannotReleaseLandDontOwn"> 1807 <alert name="CannotReleaseLandDontOwn">
1832 <message name="message"> 1808 <message name="message">
1833 Impossible de céder le terrain : 1809 Impossible d&apos;abandonner le terrain :
1834Vous n&apos;êtes pas autorisé(e) à libérer cette parcelle. 1810vous n&apos;avez pas la permission de libérer cette parcelle.
1835Les parcelles vous appartenant sont affichées en vert. 1811Les parcelles qui vous appartiennent sont en vert.
1836 </message> 1812 </message>
1837 </alert> 1813 </alert>
1838 <alert name="CannotReleaseLandRegionNotFound"> 1814 <alert name="CannotReleaseLandRegionNotFound">
1839 <message name="message"> 1815 <message name="message">
1840 Impossible de céder le terrain : 1816 Impossible d&apos;abandonner le terrain :
1841la région dans laquelle il est situé est introuvable. 1817la région dans laquelle il est situé est introuvable.
1842Utilisez Aide -&gt; Signaler un bug pour envoyer un rapport. 1818
1819Veuillez utiliser Aide &gt; Signaler un bug pour signaler le problème.
1843 </message> 1820 </message>
1844 </alert> 1821 </alert>
1845 <alert name="CannotReleaseLandNoTransfer"> 1822 <alert name="CannotReleaseLandNoTransfer">
1846 <message name="message"> 1823 <message name="message">
1847 Impossible de céder le terrain : 1824 Impossible d&apos;abandonner le terrain :
1848La région [REGION] n&apos;autorise pas la cession de terrain. 1825le transfert de terrain est interdit dans la région [REGION].
1849 </message> 1826 </message>
1850 </alert> 1827 </alert>
1851 <alert name="CannotReleaseLandPartialSelection"> 1828 <alert name="CannotReleaseLandPartialSelection">
1852 <message name="message"> 1829 <message name="message">
1853 Impossible de céder le terrain : 1830 Impossible d&apos;abandonner le terrain :
1854Vous devez sélectionner une parcelle entière pour la libérer. 1831vous devez sélectionner une parcelle entière pour la libérer.
1855Essayez de double-cliquer pour sélectionner une parcelle entière, ou 1832
1856divisez votre parcelle au préalable. 1833Sélectionnez toute la parcelle ou divisez-la d&apos;abord.
1857 </message> 1834 </message>
1858 </alert> 1835 </alert>
1859 <alert name="ReleaseLandWarning"> 1836 <alert name="ReleaseLandWarning">
1860 <message name="message"> 1837 <message name="message">
1861 Vous vous apprêtez à libérer [AREA] m2 de terrain. 1838 Vous vous apprêtez à libérer [AREA] m² de terrain.
1862Cette parcelle sera retirée de vos possessions de terrain, 1839Si vous libérez cette parcelle, elle sera supprimée de votre patrimoine, mais vous ne recevrez pas de L$.
1863mais ne vous rapportera aucun L$. 1840
1864 1841Libérer ce terrain ?
1865Libérer ce terrain ?
1866 </message> 1842 </message>
1867 <option name="Release"> 1843 <option name="Release">
1868 Relâcher 1844 OK
1869 </option> 1845 </option>
1870 <option name="Cancel"> 1846 <option name="Cancel">
1871 Annuler 1847 Annuler
@@ -1874,27 +1850,26 @@ Libérer ce terrain ?
1874 <alert name="CannotDivideLandNothingSelected"> 1850 <alert name="CannotDivideLandNothingSelected">
1875 <message name="message"> 1851 <message name="message">
1876 Division du terrain impossible : 1852 Division du terrain impossible :
1877Sélection vide. 1853
1854aucune parcelle sélectionnée.
1878 </message> 1855 </message>
1879 </alert> 1856 </alert>
1880 <alert name="CannotDivideLandPartialSelection"> 1857 <alert name="CannotDivideLandPartialSelection">
1881 <message name="message"> 1858 <message name="message">
1882 Division du terrain impossible : 1859 Division du terrain impossible :
1883Vous avez sélectionné une parcelle entière. 1860
1884Essayez de sélectionner une surface plus petite 1861vous devez sélectionner toute la parcelle.
1885en cliquant/glissant. 1862Essayez de sélectionner une partie de la parcelle.
1886 </message> 1863 </message>
1887 </alert> 1864 </alert>
1888 <alert name="LandDivideWarning"> 1865 <alert name="LandDivideWarning">
1889 <message name="message"> 1866 <message name="message">
1890 Diviser ce terrain séparera la parcelle en deux, 1867 Si vous divisez ce terrain, cette parcelle sera partagée en deux et chaque parcelle pourra avoir ses propres paramètres. Après cette opération, certains paramètres reviendront aux paramètres par défaut.
1891chaque parcelle pouvant disposer de réglages spécifiques. Certains réglages
1892seront réinitialisés à l&apos;issue de cette opération.
1893 1868
1894Diviser le terrain ? 1869Diviser le terrain ?
1895 </message> 1870 </message>
1896 <option name="Divide"> 1871 <option name="Divide">
1897 Diviser 1872 OK
1898 </option> 1873 </option>
1899 <option name="Cancel"> 1874 <option name="Cancel">
1900 Annuler 1875 Annuler
@@ -1903,51 +1878,50 @@ Diviser le terrain ?
1903 <alert name="CannotDivideLandNoRegion"> 1878 <alert name="CannotDivideLandNoRegion">
1904 <message name="message"> 1879 <message name="message">
1905 Division du terrain impossible : 1880 Division du terrain impossible :
1906La région dans laquelle il est situé est introuvable. 1881la région dans laquelle il est situé est introuvable.
1907Veuillez utiliser Aide -&gt; Signaler un bug pour envoyer un rapport. 1882
1883Veuillez utiliser Aide &gt; Signaler un bug pour signaler le problème.
1908 </message> 1884 </message>
1909 </alert> 1885 </alert>
1910 <alert name="CannotJoinLandNoRegion"> 1886 <alert name="CannotJoinLandNoRegion">
1911 <message name="message"> 1887 <message name="message">
1912 Impossible de fusionner le terrain : 1888 Impossible de fusionner le terrain :
1913La région dans laquelle il est situé est introuvable. 1889la région dans laquelle il est situé est introuvable.
1914Veuillez utiliser Aide -&gt; Signaler un bug pour envoyer un rapport. 1890
1891Veuillez utiliser Aide &gt; Signaler un bug pour signaler le problème.
1915 </message> 1892 </message>
1916 </alert> 1893 </alert>
1917 <alert name="CannotJoinLandNothingSelected"> 1894 <alert name="CannotJoinLandNothingSelected">
1918 <message name="message"> 1895 <message name="message">
1919 Impossible de fusionner le terrain : 1896 Impossible de fusionner le terrain :
1920Sélection vide. 1897aucune parcelle sélectionnée.
1921 </message> 1898 </message>
1922 </alert> 1899 </alert>
1923 <alert name="CannotJoinLandEntireParcelSelected"> 1900 <alert name="CannotJoinLandEntireParcelSelected">
1924 <message name="message"> 1901 <message name="message">
1925 Impossible de fusionner le terrain : 1902 Impossible de fusionner le terrain :
1926Vous avez sélectionné une parcelle entière. 1903vous avez sélectionné une seule parcelle.
1927Essayez de sélectionner une surface plus grande 1904
1928en cliquant/glissant. 1905Sélectionnez le terrain sur les deux parcelles.
1929 </message> 1906 </message>
1930 </alert> 1907 </alert>
1931 <alert name="CannotJoinLandSelection"> 1908 <alert name="CannotJoinLandSelection">
1932 <message name="message"> 1909 <message name="message">
1933 Impossible de fusionner le terrain : 1910 Impossible de fusionner le terrain :
1934Vous devez sélectionner plus d&apos;une parcelle. 1911vous devez sélectionner au moins deux parcelles.
1935Essayez de sélectionner une surface plus grande 1912
1936en cliquant/glissant. 1913Sélectionnez le terrain sur les deux parcelles.
1937 </message> 1914 </message>
1938 </alert> 1915 </alert>
1939 <alert name="JoinLandWarning"> 1916 <alert name="JoinLandWarning">
1940 <message name="message"> 1917 <message name="message">
1941 Fusionner ce terrain créera une grande parcelle 1918 En fusionnant ce terrain, vous créerez une grande parcelle composée de toutes les parcelles se trouvant dans le rectangle sélectionné.
1942à partir de toutes les parcelles présentes dans le rectangle de sélection. 1919Vous devrez réinitialiser le nom et les options de la nouvelle parcelle.
1943
1944Vous devrez réinitialiser le nom et les options
1945de la nouvelle parcelle.
1946 1920
1947Fusionner le terrain ? 1921Fusionner le terrain ?
1948 </message> 1922 </message>
1949 <option name="Join"> 1923 <option name="Join">
1950 Fusionner 1924 OK
1951 </option> 1925 </option>
1952 <option name="Cancel"> 1926 <option name="Cancel">
1953 Annuler 1927 Annuler
@@ -1966,7 +1940,7 @@ Fusionner le terrain ?
1966 </alert> 1940 </alert>
1967 <alert name="ConfirmLandmarkCopy"> 1941 <alert name="ConfirmLandmarkCopy">
1968 <message name="message"> 1942 <message name="message">
1969 Copier cet élément vers votre inventaire ? 1943 Copier ce repère dans votre inventaire ?
1970 </message> 1944 </message>
1971 <option name="Copy"> 1945 <option name="Copy">
1972 Copie 1946 Copie
@@ -1977,10 +1951,10 @@ Fusionner le terrain ?
1977 </alert> 1951 </alert>
1978 <alert name="ConfirmItemCopy"> 1952 <alert name="ConfirmItemCopy">
1979 <message name="message"> 1953 <message name="message">
1980 Copier cet élément vers votre inventaire ? 1954 Copier cet objet dans votre inventaire ?
1981 </message> 1955 </message>
1982 <option name="Copy"> 1956 <option name="Copy">
1983 Copie 1957 Copier
1984 </option> 1958 </option>
1985 <option name="Cancel"> 1959 <option name="Cancel">
1986 Annuler 1960 Annuler
@@ -1988,34 +1962,30 @@ Fusionner le terrain ?
1988 </alert> 1962 </alert>
1989 <alert name="ResolutionSwitchFail"> 1963 <alert name="ResolutionSwitchFail">
1990 <message name="message"> 1964 <message name="message">
1991 Impossible de changer la résolution en [RESX] par [RESY] 1965 Échec du changement de résolution (à [RESX], de [RESY])
1992 </message> 1966 </message>
1993 </alert> 1967 </alert>
1994 <alert name="ErrorUndefinedGrasses"> 1968 <alert name="ErrorUndefinedGrasses">
1995 <message name="message"> 1969 <message name="message">
1996 Erreur : Pelouses indéfinies : [SPECIES] 1970 Erreur : herbes non identifiées  : [SPECIES]
1997 </message> 1971 </message>
1998 </alert> 1972 </alert>
1999 <alert name="ErrorUndefinedTrees"> 1973 <alert name="ErrorUndefinedTrees">
2000 <message name="message"> 1974 <message name="message">
2001 Erreur : Arbres indéfinis : [SPECIES] 1975 Erreur : arbres non identifiés : [SPECIES]
2002 </message> 1976 </message>
2003 </alert> 1977 </alert>
2004 <alert name="CannotSaveWearableOutOfSpace"> 1978 <alert name="CannotSaveWearableOutOfSpace">
2005 <message name="message"> 1979 <message name="message">
2006 Impossible de sauvegarder le fichier endossable &apos;[NAME]&apos;. Vous devez 1980 Impossible de sauvegarder [NAME]. Pour pouvoir sauvegarder ce fichier, vous devez d&apos;abord libérer de la mémoire sur votre ordinateur.
2007libérer de l&apos;espace disque sur votre ordinateur et
2008sauvegarder le fichier à nouveau.
2009 </message> 1981 </message>
2010 </alert> 1982 </alert>
2011 <alert name="CannotSaveToAssetStore"> 1983 <alert name="CannotSaveToAssetStore">
2012 <message name="message"> 1984 <message name="message">
2013 Impossible de sauvegarder le fichier [NAME] dans la base de données centrale. 1985 Impossible de sauvegarder le fichier [NAME] dans la base de données centrale.
2014Cette erreur est généralement temporaire. Veuillez 1986Cette erreur est généralement temporaire. Veuillez éditer et sauvegarder l&apos;élément endossable à nouveau d&apos;ici quelques minutes.
2015éditer et sauvegarder l&apos;élément endossable à nouveau 1987
2016d&apos;ici quelques minutes. Si le problème persiste, veuillez 1988Si le problème persiste, veuillez cliquer sur Aide | Signaler un bug dans le menu déroulant en indiquant les détails de votre connexion.
2017cliquer sur &apos;Aide | Signaler un bug&apos; dans le menu déroulant
2018en indiquant les paramètres de votre réseau.
2019 </message> 1989 </message>
2020 </alert> 1990 </alert>
2021 <alert name="AppEarlyExit"> 1991 <alert name="AppEarlyExit">
@@ -2033,16 +2003,12 @@ www.secondlife.com/support.
2033 </alert> 2003 </alert>
2034 <alert name="YouHaveBeenLoggedOut"> 2004 <alert name="YouHaveBeenLoggedOut">
2035 <message name="message"> 2005 <message name="message">
2036 Vous avez été déconnecté(e) de [SECOND_LIFE]: 2006 Vous avez été déconnecté(e) de [SECOND_LIFE] :
2037 2007 [MESSAGE]
2038[MESSAGE] 2008Vous pouvez afficher vos messages instantanés et votre chat en cliquant sur Afficher IM et chat. Sinon, cliquez sur Quitter pour quitter immédiatement [SECOND_LIFE].
2039
2040Cliquez sur Continuer pour afficher les IM et le chat.
2041Vous ne pourrez pas effectuer d&apos;autres opérations.
2042Cliquez sur Quitter pour quitter [SECOND_LIFE] maintenant.
2043 </message> 2009 </message>
2044 <option name="Continue"> 2010 <option name="Continue">
2045 Continuer 2011 Afficher IM et chat
2046 </option> 2012 </option>
2047 <option name="Quit"> 2013 <option name="Quit">
2048 Quitter 2014 Quitter
@@ -2050,32 +2016,29 @@ Cliquez sur Quitter pour quitter [SECOND_LIFE] maintenant.
2050 </alert> 2016 </alert>
2051 <alert name="OnlyOfficerCanBuyLand"> 2017 <alert name="OnlyOfficerCanBuyLand">
2052 <message name="message"> 2018 <message name="message">
2053 Impossible d&apos;acheter le terrain pour le groupe : 2019 Impossible d&apos;acheter du terrain pour le groupe :
2054Vous n&apos;êtes pas autorisé(e) à acheter du terrain pour votre groupe actif. 2020Vous n&apos;avez pas la permission d&apos;acheter de terrain pour votre groupe.
2055Veuillez activer un autre groupe dans Edition -&gt; Groupes…
2056 </message> 2021 </message>
2057 </alert> 2022 </alert>
2058 <alert name="AddFriend" title="Ajouter comme ami(e)"> 2023 <alert name="AddFriend" title="Devenir amis">
2059 <message name="message"> 2024 <message name="message">
2060 Les amis peuvent se localiser sur la carte et 2025 Vous pouvez suivre les déplacements de vos amis sur la carte et voir lorsqu&apos;ils se connectent.
2061reçoivent des notifications de présence. 2026
2062 2027Proposer à [NAME] de devenir votre ami(e) ?
2063Proposer à [NAME] de devenir votre ami(e)?
2064 </message> 2028 </message>
2065 <option name="Offer"> 2029 <option name="Offer">
2066 Offrir 2030 OK
2067 </option> 2031 </option>
2068 <option name="Cancel"> 2032 <option name="Cancel">
2069 Annuler 2033 Annuler
2070 </option> 2034 </option>
2071 Voulez-vous être mon ami ? 2035 Voulez-vous être mon ami ?
2072 </alert> 2036 </alert>
2073 <alert name="AddFriendWithMessage" title="Ajouter comme ami"> 2037 <alert name="AddFriendWithMessage" title="Devenir amis">
2074 <message name="message"> 2038 <message name="message">
2075 Vous pouvez suivre les déplacements de vos 2039 Vous pouvez suivre les déplacements de vos amis sur la carte et voir lorsqu&apos;ils se connectent.
2076amis sur la carte et voir lorsqu&apos;ils se connectent.
2077 2040
2078Proposer à [NAME] de devenir votre ami ? 2041Proposer à [NAME] de devenir votre ami(e) ?
2079 </message> 2042 </message>
2080 <editline name="editline"> 2043 <editline name="editline">
2081 Voulez-vous être mon ami(e) ? 2044 Voulez-vous être mon ami(e) ?
@@ -2089,10 +2052,10 @@ Proposer à [NAME] de devenir votre ami ?
2089 </alert> 2052 </alert>
2090 <alert name="RemoveFromFriends"> 2053 <alert name="RemoveFromFriends">
2091 <message name="message"> 2054 <message name="message">
2092 Souhaitez-vous retirer [FIRST_NAME] [LAST_NAME] de votre liste d&apos;amis ? 2055 Voulez-vous supprimer [FIRST_NAME] [LAST_NAME] de votre liste d&apos;amis ?
2093 </message> 2056 </message>
2094 <option name="Remove"> 2057 <option name="Remove">
2095 Retirer 2058 OK
2096 </option> 2059 </option>
2097 <option name="Cancel"> 2060 <option name="Cancel">
2098 Annuler 2061 Annuler
@@ -2100,7 +2063,7 @@ Proposer à [NAME] de devenir votre ami ?
2100 </alert> 2063 </alert>
2101 <alert name="RemoveMultipleFromFriends"> 2064 <alert name="RemoveMultipleFromFriends">
2102 <message name="message"> 2065 <message name="message">
2103 Voulez-vous supprimer plusieurs personnes de votre liste d&apos;amis ? 2066 Voulez-vous supprimer plusieurs résidents de votre liste d&apos;amis ?
2104 </message> 2067 </message>
2105 <option name="Remove"> 2068 <option name="Remove">
2106 OK 2069 OK
@@ -2111,14 +2074,10 @@ Proposer à [NAME] de devenir votre ami ?
2111 </alert> 2074 </alert>
2112 <alert name="GodDeleteAllScriptedPublicObjectsByUser"> 2075 <alert name="GodDeleteAllScriptedPublicObjectsByUser">
2113 <message name="message"> 2076 <message name="message">
2114 Etes-vous sûr(e) de vouloir supprimer tous les objets scriptés appartenant à 2077 Êtes-vous certain de vouloir supprimer tous les objets scriptés appartenant à ** [AVATAR_NAME] ** sur tous les terrains des autres résidents dans ce sim ?
2115
2116** [AVATAR_NAME] **
2117
2118sur tous les autres terrains de ce sim?
2119 </message> 2078 </message>
2120 <option name="DELETE!!"> 2079 <option name="DELETE!!">
2121 SUPPRIMER !! 2080 OK
2122 </option> 2081 </option>
2123 <option name="Cancel"> 2082 <option name="Cancel">
2124 Annuler 2083 Annuler
@@ -2126,14 +2085,10 @@ sur tous les autres terrains de ce sim?
2126 </alert> 2085 </alert>
2127 <alert name="GodDeleteAllScriptedObjectsByUser"> 2086 <alert name="GodDeleteAllScriptedObjectsByUser">
2128 <message name="message"> 2087 <message name="message">
2129 Etes-vous sûr(e) de vouloir SUPPRIMER TOUS les objets scriptés appartenant à 2088 Êtes-vous certain de vouloir supprimer tous les objets scriptés appartenant à ** [AVATAR_NAME] ** sur tous les terrains de ce sim ?
2130
2131** [AVATAR_NAME] **
2132
2133sur L&apos;ENSEMBLE DU TERRAIN de ce sim ?
2134 </message> 2089 </message>
2135 <option name="!!DELETEALL!!"> 2090 <option name="!!DELETEALL!!">
2136 !!TOUT SUPPRIMER!! 2091 OK
2137 </option> 2092 </option>
2138 <option name="Cancel"> 2093 <option name="Cancel">
2139 Annuler 2094 Annuler
@@ -2141,15 +2096,10 @@ sur L&apos;ENSEMBLE DU TERRAIN de ce sim ?
2141 </alert> 2096 </alert>
2142 <alert name="GodDeleteAllObjectsByUser"> 2097 <alert name="GodDeleteAllObjectsByUser">
2143 <message name="message"> 2098 <message name="message">
2144 Etes-vous sûr(e) de vouloir SUPPRIMER TOUS les objets (scriptés ou non) 2099 Êtes-vous certain de vouloir supprimer tous les objets (scriptés ou pas) appartenant à ** [AVATAR_NAME] ** sur tous les terrains de ce sim ?
2145appartenant à
2146
2147** [AVATAR_NAME] **
2148
2149sur L&apos;ENSEMBLE DU TERRAIN de ce sim ?
2150 </message> 2100 </message>
2151 <option name="!!DELETEALL!!"> 2101 <option name="!!DELETEALL!!">
2152 !!TOUT SUPPRIMER!! 2102 OK
2153 </option> 2103 </option>
2154 <option name="Cancel"> 2104 <option name="Cancel">
2155 Annuler 2105 Annuler
@@ -2158,22 +2108,22 @@ sur L&apos;ENSEMBLE DU TERRAIN de ce sim ?
2158 <alert name="PublishGroupInfoToWeb"> 2108 <alert name="PublishGroupInfoToWeb">
2159 <message name="message"> 2109 <message name="message">
2160 L&apos;option &quot;Publier sur le Web&quot; nous permet de publier 2110 L&apos;option &quot;Publier sur le Web&quot; nous permet de publier
2161le nom du groupe, son insigne, sa charte, ses titres, et ses fondateurs sur le 2111le nom du groupe, son logo, sa charte, ses titres et ses fondateurs sur le
2162site [SECOND_LIFE]. Il est de votre responsabilité d&apos;indiquer si 2112site [SECOND_LIFE]. Il est de votre responsabilité d&apos;indiquer si
2163tout ou partie du contenu ci-dessus est considéré comme Adulte au regard 2113tout ou partie du contenu ci-dessus est considéré comme Adulte selon
2164des règles de base de la Communauté. 2114les règles de base de la Communauté.
2165 </message> 2115 </message>
2166 </alert> 2116 </alert>
2167 <alert name="BlankClassifiedName"> 2117 <alert name="BlankClassifiedName">
2168 <message name="message"> 2118 <message name="message">
2169 Vous devez remplir le champ &quot;nom&quot; de votre petite annonce. 2119 Vous devez choisir un nom pour votre petite annonce.
2170 </message> 2120 </message>
2171 </alert> 2121 </alert>
2172 <alert name="MinClassifiedPrice"> 2122 <alert name="MinClassifiedPrice">
2173 <message name="message"> 2123 <message name="message">
2174 Les frais d&apos;insertion minimum sont de L$[MIN_PRICE]. 2124 Le coût de l&apos;annonce doit être de [MIN_PRICE] L$ minimum.
2175 2125
2176Veuillez entrer une somme plus importante. 2126Veuillez saisir un montant plus élevé.
2177 </message> 2127 </message>
2178 </alert> 2128 </alert>
2179 <alert name="CantLoadVertexShaders"> 2129 <alert name="CantLoadVertexShaders">
@@ -2183,166 +2133,160 @@ Veuillez entrer une somme plus importante.
2183 </alert> 2133 </alert>
2184 <alert name="ConfirmObjectDeleteLock"> 2134 <alert name="ConfirmObjectDeleteLock">
2185 <message name="message"> 2135 <message name="message">
2186 Au moins un objet est verrouillé. 2136 Au moins un des objets que vous avez sélectionnés est verrouillé.
2187Vous pouvez toutefois supprimer la sélection en cours. 2137
2188Etes-vous sûr(e) de vouloir supprimer ces eléments ? 2138Êtes-vous certain de vouloir supprimer ces objets ?
2189 </message> 2139 </message>
2190 <option name="Yes"> 2140 <option name="Yes">
2191 Oui 2141 OK
2192 </option> 2142 </option>
2193 <option name="No"> 2143 <option name="No">
2194 Non 2144 Annuler
2195 </option> 2145 </option>
2196 </alert> 2146 </alert>
2197 <alert name="ConfirmObjectDeleteNoCopy"> 2147 <alert name="ConfirmObjectDeleteNoCopy">
2198 <message name="message"> 2148 <message name="message">
2199 Au moins un objet est verrouillé. 2149 Au moins un des objets que vous avez sélectionnés n&apos;est pas reproductible.
2200Vous pouvez toutefois supprimer la sélection en cours. 2150
2201Etes-vous sûr(e) de vouloir supprimer ces eléments ? 2151Êtes-vous certain de vouloir supprimer ces objets ?
2202 </message> 2152 </message>
2203 <option name="Yes"> 2153 <option name="Yes">
2204 Oui 2154 OK
2205 </option> 2155 </option>
2206 <option name="No"> 2156 <option name="No">
2207 Non 2157 Annuler
2208 </option> 2158 </option>
2209 </alert> 2159 </alert>
2210 <alert name="ConfirmObjectDeleteNoOwn"> 2160 <alert name="ConfirmObjectDeleteNoOwn">
2211 <message name="message"> 2161 <message name="message">
2212 Au moins un objet ne vous appartient pas. 2162 Au moins un des objets que vous avez sélectionnés ne vous appartient pas.
2213Vous pouvez toutefois supprimer la sélection. 2163
2214Etes-vous sûr(e) de vouloir supprimer ces eléments ? 2164Êtes-vous certain de vouloir supprimer ces objets ?
2215 </message> 2165 </message>
2216 <option name="Yes"> 2166 <option name="Yes">
2217 Oui 2167 OK
2218 </option> 2168 </option>
2219 <option name="No"> 2169 <option name="No">
2220 Non 2170 Annuler
2221 </option> 2171 </option>
2222 </alert> 2172 </alert>
2223 <alert name="ConfirmObjectDeleteLockNoCopy"> 2173 <alert name="ConfirmObjectDeleteLockNoCopy">
2224 <message name="message"> 2174 <message name="message">
2225 Au moins un objet est verrouillé. 2175 Au moins un des objets est verrouillé.
2226Au moins un objet est non copiable. 2176Au moins un des objets n&apos;est pas reproductible.
2227Vous pouvez toutefois supprimer la sélection en cours. 2177
2228Etes-vous sûr(e) de vouloir supprimer ces éléments ? 2178Êtes-vous certain de vouloir supprimer ces objets ?
2229 </message> 2179 </message>
2230 <option name="Yes"> 2180 <option name="Yes">
2231 Oui 2181 OK
2232 </option> 2182 </option>
2233 <option name="No"> 2183 <option name="No">
2234 Non 2184 Annuler
2235 </option> 2185 </option>
2236 </alert> 2186 </alert>
2237 <alert name="ConfirmObjectDeleteLockNoOwn"> 2187 <alert name="ConfirmObjectDeleteLockNoOwn">
2238 <message name="message"> 2188 <message name="message">
2239 Au moins un objet est verrouillé. 2189 Au moins un des objets est verrouillé.
2240Au moins un objet ne vous appartient pas. 2190Au moins un des objets ne vous appartient pas.
2241Vous pouvez toutefois supprimer la sélection en cours. 2191
2242Etes-vous sûr(e) de vouloir supprimer ces eléments ? 2192Êtes-vous certain de vouloir supprimer ces objets ?
2243 </message> 2193 </message>
2244 <option name="Yes"> 2194 <option name="Yes">
2245 Oui 2195 OK
2246 </option> 2196 </option>
2247 <option name="No"> 2197 <option name="No">
2248 Non 2198 Annuler
2249 </option> 2199 </option>
2250 </alert> 2200 </alert>
2251 <alert name="ConfirmObjectDeleteNoCopyNoOwn"> 2201 <alert name="ConfirmObjectDeleteNoCopyNoOwn">
2252 <message name="message"> 2202 <message name="message">
2253 Au moins un objet est non copiable. 2203 Au moins un des objets n&apos;est pas reproductible.
2254Au moins un objet ne vous appartient pas. 2204Au moins un des objets ne vous appartient pas.
2255Vous pouvez toutefois supprimer la sélection en cours. 2205
2256Etes-vous sûr(e) de vouloir supprimer ces eléments ? 2206Êtes-vous certain de vouloir supprimer ces objets ?
2257 </message> 2207 </message>
2258 <option name="Yes"> 2208 <option name="Yes">
2259 Oui 2209 OK
2260 </option> 2210 </option>
2261 <option name="No"> 2211 <option name="No">
2262 Non 2212 Annuler
2263 </option> 2213 </option>
2264 </alert> 2214 </alert>
2265 <alert name="ConfirmObjectDeleteLockNoCopyNoOwn"> 2215 <alert name="ConfirmObjectDeleteLockNoCopyNoOwn">
2266 <message name="message"> 2216 <message name="message">
2267 Au moins un objet est verrouillé. 2217 Au moins un des objets est verrouillé.
2268Au moins un objet est non copiable. 2218Au moins un des objets n&apos;est pas reproductible.
2269Au moins un objet ne vous appartient pas. 2219Au moins un des objets ne vous appartient pas.
2270Vous pouvez toutefois supprimer la sélection en cours. 2220
2271Etes-vous sûr(e) de vouloir supprimer ces éléments ? 2221Êtes-vous certain de vouloir supprimer ces objets ?
2272 </message> 2222 </message>
2273 <option name="Yes"> 2223 <option name="Yes">
2274 Oui 2224 OK
2275 </option> 2225 </option>
2276 <option name="No"> 2226 <option name="No">
2277 Non 2227 annuler
2278 </option> 2228 </option>
2279 </alert> 2229 </alert>
2280 <alert name="ConfirmObjectTakeLock"> 2230 <alert name="ConfirmObjectTakeLock">
2281 <message name="message"> 2231 <message name="message">
2282 Au moins un objet est verrouillé. 2232 Au moins un des objets est verrouillé.
2283Vous pouvez toutefois prendre la sélection en cours. 2233
2284Etes-vous sûr(e) de vouloir prendre ces éléments ? 2234Êtes-vous certain de vouloir prendre ces objets ?
2285 </message> 2235 </message>
2286 <option name="Yes"> 2236 <option name="Yes">
2287 Oui 2237 OK
2288 </option> 2238 </option>
2289 <option name="No"> 2239 <option name="No">
2290 Non 2240 Annuler
2291 </option> 2241 </option>
2292 </alert> 2242 </alert>
2293 <alert name="ConfirmObjectTakeNoOwn"> 2243 <alert name="ConfirmObjectTakeNoOwn">
2294 <message name="message"> 2244 <message name="message">
2295 Vous n&apos;êtes pas propriétaire de tous les objets que vous prenez. 2245 Vous n&apos;êtes pas le propriétaire de tous les objets que vous prenez.
2296Si vous continuez, de nouvelles autorisations de propriété 2246Si vous continuez, les permissions accordées au prochain propriétaire entreront en vigueur et vous risquez de ne plus pouvoir modifier ou copier les objets.
2297seront appliquées aux objets, pouvant restreindre votre 2247
2298capacité à les modifier ou les copier à l&apos;avenir. 2248Êtes-vous certain de vouloir prendre ces objets ?
2299Vous pouvez toutefois prendre la sélection en cours.
2300Etes-vous sûr(e) de vouloir prendre ces éléments?
2301 </message> 2249 </message>
2302 <option name="Yes"> 2250 <option name="Yes">
2303 Oui 2251 OK
2304 </option> 2252 </option>
2305 <option name="No"> 2253 <option name="No">
2306 Non 2254 Annuler
2307 </option> 2255 </option>
2308 </alert> 2256 </alert>
2309 <alert name="ConfirmObjectTakeLockNoOwn"> 2257 <alert name="ConfirmObjectTakeLockNoOwn">
2310 <message name="message"> 2258 <message name="message">
2311 Au moins un objet est verrouillé. 2259 Au moins un des objets est verrouillé.
2312Vous n&apos;êtes pas propriétaire de tous les objets sélectionnés. 2260Vous n&apos;êtes pas le propriétaire de tous les objets que vous prenez.
2313Si vous poursuivez, de nouvelles autorisations de propriété 2261Si vous continuez, les permissions accordées au prochain propriétaire entreront en vigueur et vous risquez de ne plus pouvoir modifier ou copier les objets.
2314seront appliquées aux objets, pouvant restreindre 2262Par contre, vous pouvez prendre les objets sélectionnés.
2315votre capacité à les modifier ou les copier à l&apos;avenir. 2263
2316Vous pouvez toutefois prendre la sélection. 2264Êtes-vous certain de vouloir prendre ces objets ?
2317Etes-vous sûr(e) de vouloir prendre ces eléments ?
2318 </message> 2265 </message>
2319 <option name="Yes"> 2266 <option name="Yes">
2320 Oui 2267 OK
2321 </option> 2268 </option>
2322 <option name="No"> 2269 <option name="No">
2323 Non 2270 Annuler
2324 </option> 2271 </option>
2325 </alert> 2272 </alert>
2326 <alert name="CantBuyLandAcrossMultipleRegions"> 2273 <alert name="CantBuyLandAcrossMultipleRegions">
2327 <message name="message"> 2274 <message name="message">
2328 Impossible d&apos;acheter le terrain car la sélection s&apos;étend sur plusieurs régions. 2275 Impossible d&apos;acheter le terrain car la sélection couvre plusieurs régions.
2329Veuillez sélectionner une surface plus petite et recommencez. 2276
2277Veuillez sélectionner une zone plus petite et réessayer.
2330 </message> 2278 </message>
2331 </alert> 2279 </alert>
2332 <alert name="DeedLandToGroup"> 2280 <alert name="DeedLandToGroup">
2333 <message name="message"> 2281 <message name="message">
2334 En transférant cette parcelle, le groupe devra 2282 Si vous cédez ce terrain, le groupe devra
2335posséder et maintenir des crédits terrain suffisants. 2283avoir les moyens de le prendre en charge.
2336 2284Le prix de la vente du terrain n&apos;est pas remboursé par le propriétaire. Si la parcelle que vous cédez se vend, le prix de la vente sera divisé en parts égales parmi les membres du groupe.
2337Le prix d&apos;achat du terrain n&apos;est pas remboursé 2285
2338au propriétaire. A la vente d&apos;une parcelle transférée, le prix 2286Céder ces [AREA] m² de terrain au groupe [GROUP_NAME] ?
2339de vente est divisé équitablement entre les membres du groupe.
2340
2341Transférer les [AREA] m2 de terrain au groupe
2342&apos;[GROUP_NAME]&apos; ?
2343 </message> 2287 </message>
2344 <option name="Deed"> 2288 <option name="Deed">
2345 Transférer 2289 OK
2346 </option> 2290 </option>
2347 <option name="Cancel"> 2291 <option name="Cancel">
2348 Annuler 2292 Annuler
@@ -2350,21 +2294,15 @@ Transférer les [AREA] m2 de terrain au groupe
2350 </alert> 2294 </alert>
2351 <alert name="DeedLandToGroupWithContribution"> 2295 <alert name="DeedLandToGroupWithContribution">
2352 <message name="message"> 2296 <message name="message">
2353 En transférant cette parcelle, le groupe devra 2297 Si vous cédez ce terrain, le groupe devra
2354posséder et maintenir des crédits terrain suffisants. 2298avoir les moyens de le prendre en charge.
2355 2299La cession incluera une contribution de terrain simultanée au groupe de [FIRST_NAME] [LAST_NAME].
2356Ce transfert incluera une contribution de terrain 2300Le prix de la vente du terrain n&apos;est pas remboursé par le propriétaire. Si la parcelle que vous cédez se vend, le prix de la vente sera divisé en parts égales parmi les membres du groupe.
2357simultanée au groupe de la part de &apos;[FIRST_NAME] [LAST_NAME]&apos;.
2358 2301
2359Le prix d&apos;achat du terrain n&apos;est pas remboursé 2302Céder ces [AREA] m² de terrain au groupe [GROUP_NAME] ?
2360au propriétaire. A la vente d&apos;une parcelle transférée, le prix
2361de vente est divisé équitablement entre les membres du groupe.
2362
2363Transférer les [AREA] m2 de terrain au groupe
2364&apos;[GROUP_NAME]&apos; ?
2365 </message> 2303 </message>
2366 <option name="Deed"> 2304 <option name="Deed">
2367 Transférer 2305 OK
2368 </option> 2306 </option>
2369 <option name="Cancel"> 2307 <option name="Cancel">
2370 Annuler 2308 Annuler
@@ -2372,14 +2310,12 @@ Transférer les [AREA] m2 de terrain au groupe
2372 </alert> 2310 </alert>
2373 <alert name="DisplaySetToSafe"> 2311 <alert name="DisplaySetToSafe">
2374 <message name="message"> 2312 <message name="message">
2375 Les paramètres d&apos;affichage ont été définis ont été définis aux valeurs du mode sans échec 2313 Les paramètres d&apos;affichage sont au niveau le plus sûr, comme vous l&apos;aviez indiqué.
2376car vous avez activé le mode sans échec.
2377 </message> 2314 </message>
2378 </alert> 2315 </alert>
2379 <alert name="DisplaySetToRecommended"> 2316 <alert name="DisplaySetToRecommended">
2380 <message name="message"> 2317 <message name="message">
2381 Les paramètres d&apos;affichage ont été définis aux valeurs recommandées 2318 Le niveau de sécurité de vos paramètres d&apos;affichage dépend de votre configuration système.
2382d&apos;après votre configuration matérielle.
2383 </message> 2319 </message>
2384 </alert> 2320 </alert>
2385 <alert name="UnableToConnect"> 2321 <alert name="UnableToConnect">
@@ -2412,7 +2348,7 @@ Connexion impossible à [IP_ADDRESS]
2412 </alert> 2348 </alert>
2413 <alert name="SystemMayBeDown"> 2349 <alert name="SystemMayBeDown">
2414 <message name="message"> 2350 <message name="message">
2415 Connexion impossible à [SECOND_LIFE] 2351 Connexion à [SECOND_LIFE] impossible
2416Le service est peut-être interrompu. 2352Le service est peut-être interrompu.
2417Veuillez réessayer d&apos;ici quelques minutes, ou cliquez sur Aide 2353Veuillez réessayer d&apos;ici quelques minutes, ou cliquez sur Aide
2418pour des conseils et un lien vers la page web d&apos;état du service. 2354pour des conseils et un lien vers la page web d&apos;état du service.
@@ -2429,11 +2365,16 @@ pour des conseils et un lien vers la page web d&apos;état du service.
2429 [ERROR_MESSAGE] 2365 [ERROR_MESSAGE]
2430 </message> 2366 </message>
2431 </alert> 2367 </alert>
2368 <alert name="AvatarMoved">
2369 <message name="message">
2370 L&apos;emplacement [TYPE] n&apos;est pas disponible actuellement. [HELP]
2371Vous avez été déplacé dans une région voisine.
2372 </message>
2373 </alert>
2432 <alert name="ClothingLoading"> 2374 <alert name="ClothingLoading">
2433 <message name="message"> 2375 <message name="message">
2434 Vos vêtements sont en cours de téléchargement. 2376 Vos habits sont toujours en train d&apos;être téléchargés.
2435Vous pouvez utiliser le monde normalement, les autres utilisateurs 2377Vous pouvez utiliser [SECOND_LIFE] sans problème, les autres résidents vous voient normalement.
2436vous verront correctement.
2437 </message> 2378 </message>
2438 <ignore name="ignore"> 2379 <ignore name="ignore">
2439 Lorsque les habits prennent longtemps à télécharger 2380 Lorsque les habits prennent longtemps à télécharger
@@ -2442,14 +2383,12 @@ vous verront correctement.
2442 <alert name="FirstRun"> 2383 <alert name="FirstRun">
2443 <message name="message"> 2384 <message name="message">
2444 L&apos;installation de [SECOND_LIFE] est terminée. 2385 L&apos;installation de [SECOND_LIFE] est terminée.
2445 2386
2446Si vous utilisez [SECOND_LIFE] pour la première fois, vous devez ouvrir un compte 2387S&apos;il s&apos;agit de la première fois que vous utilisez [SECOND_LIFE], vous devrez créer un compte avant de pouvoir vous connecter.
2447avant de pouvoir vous connecter. 2388Retourner sur www.secondlife.com pour créer un nouveau compte ?
2448
2449Retourner sur www.secondlife.com pour ouvrir un nouveau compte ?
2450 </message> 2389 </message>
2451 <option name="NewAccount..."> 2390 <option name="NewAccount...">
2452 Nouveau Compte... 2391 Nouveau compte...
2453 </option> 2392 </option>
2454 <option name="Continue"> 2393 <option name="Continue">
2455 Continuer 2394 Continuer
@@ -2464,11 +2403,9 @@ Veuillez vérifier votre connexion.
2464 </alert> 2403 </alert>
2465 <alert name="LoginPacketNeverReceived"> 2404 <alert name="LoginPacketNeverReceived">
2466 <message name="message"> 2405 <message name="message">
2467 Connexion impossible. Identification non reçue 2406 Vous avez des problèmes à vous connecter. Il peut s&apos;agir d&apos;un problème avec votre connexion internet ou les serveurs de Second Life.
2468par le serveur. 2407
2469 2408Nous vous conseillons de vérifier votre connexion Internet et de réessayer dans quelques minutes, de cliquer sur Aide, ou bien de cliquer sur Téléporter pour être téléporté vers votre domicile.
2470Veuillez réessayer d&apos;ici quelques minutes, ou cliquez sur Aide
2471pour des conseils et un lien vers la page web d&apos;état du service.
2472 </message> 2409 </message>
2473 <option name="OK"> 2410 <option name="OK">
2474 OK 2411 OK
@@ -2482,36 +2419,31 @@ pour des conseils et un lien vers la page web d&apos;état du service.
2482 </alert> 2419 </alert>
2483 <alert name="WelcomeNoClothes"> 2420 <alert name="WelcomeNoClothes">
2484 <message name="message"> 2421 <message name="message">
2485 Votre personnage apparaîtra d&apos;ici quelques instants. 2422 Votre personnage va apparaître dans un moment.
2486 2423
2487Utilisez les touches de direction pour marcher. 2424Pour marcher, utilisez les flèches de direction.
2488 2425Appuyez sur F1 pour obtenir de l&apos;aide ou en savoir plus sur [SECOND_LIFE].
2489Appuyez sur la touche F1 pour obtenir de l&apos;aide
2490ou en savoir plus sur [SECOND_LIFE].
2491 </message> 2426 </message>
2492 </alert> 2427 </alert>
2493 <alert name="WelcomeChooseSex"> 2428 <alert name="WelcomeChooseSex">
2494 <message name="message"> 2429 <message name="message">
2495 Votre personnage apparaîtra d&apos;ici quelques instants. 2430 Votre personnage va apparaître dans un moment.
2496 2431
2497Utilisez les touches de direction pour marcher. 2432Pour marcher, utilisez les flèches de direction.
2498 2433Appuyez sur F1 pour obtenir de l&apos;aide ou en savoir plus sur [SECOND_LIFE].
2499Appuyez sur la touche F1 pour obtenir de l&apos;aide 2434Choisissez un avatar homme ou femme.
2500ou en savoir plus sur [SECOND_LIFE]. 2435Vous pourrez revenir sur votre décision plus tard.
2501
2502Veuillez choisir le sexe de votre personnage.
2503Vous pourrez le modifier ultérieurement.
2504 </message> 2436 </message>
2505 <option name="Male"> 2437 <option name="Male">
2506 Masculin 2438 Homme
2507 </option> 2439 </option>
2508 <option name="Female"> 2440 <option name="Female">
2509 Féminin 2441 Femme
2510 </option> 2442 </option>
2511 </alert> 2443 </alert>
2512 <alert name="NotEnoughCurrency"> 2444 <alert name="NotEnoughCurrency">
2513 <message name="message"> 2445 <message name="message">
2514 [NAME] L$ [PRICE] Votre solde est insuffisant. 2446 [NAME] [PRICE] L$ Vous n&apos;avez pas suffisamment d&apos;argent pour cela.
2515 </message> 2447 </message>
2516 </alert> 2448 </alert>
2517 <alert name="GrantedModifyRights"> 2449 <alert name="GrantedModifyRights">
@@ -2526,12 +2458,9 @@ Vous pourrez le modifier ultérieurement.
2526 </alert> 2458 </alert>
2527 <alert name="FlushMapVisibilityCaches"> 2459 <alert name="FlushMapVisibilityCaches">
2528 <message name="message"> 2460 <message name="message">
2529 Ceci videra le cache cartographique de la région. 2461 Cela videra le cache cartographique de cette région.
2530 2462Cela n&apos;est vraiment utile que pour faire du débugage.
2531Cette option n&apos;est réellement utile que pour le débogage. 2463(En production, attendez 5 minutes. Les cartes seront mises à jour après reconnexion.)
2532
2533(Si vous êtes en production, attendez 5 minutes, les cartes de chacun
2534seront mises à jour après redémarrage.)
2535 </message> 2464 </message>
2536 <option name="OK"> 2465 <option name="OK">
2537 OK 2466 OK
@@ -2542,8 +2471,8 @@ seront mises à jour après redémarrage.)
2542 </alert> 2471 </alert>
2543 <alert name="OnlyCopyContentsOfSingleItem"> 2472 <alert name="OnlyCopyContentsOfSingleItem">
2544 <message name="message"> 2473 <message name="message">
2545 Impossible de copier le contenu de plus d&apos;un objet à la fois. 2474 Impossible de copier les contenus de plus d&apos;un objet à la fois.
2546Veuillez sélectionner un seul objet et recommencez. 2475Veuillez ne sélectionner qu&apos;un seul objet.
2547 </message> 2476 </message>
2548 <option name="OK"> 2477 <option name="OK">
2549 OK 2478 OK
@@ -2554,7 +2483,7 @@ Veuillez sélectionner un seul objet et recommencez.
2554 </alert> 2483 </alert>
2555 <alert name="KickUsersFromRegion"> 2484 <alert name="KickUsersFromRegion">
2556 <message name="message"> 2485 <message name="message">
2557 Téléporter tous les utilisateurs présents dans la région vers leurs domiciles ? 2486 Téléporter tous les résidents de cette région chez eux ?
2558 </message> 2487 </message>
2559 <option name="OK"> 2488 <option name="OK">
2560 OK 2489 OK
@@ -2592,18 +2521,18 @@ Remplacer la texture [TEXTURE_NUM] avec une image de 24 bits, 512 X 512, ou plus
2592 </alert> 2521 </alert>
2593 <alert name="RawUploadStarted"> 2522 <alert name="RawUploadStarted">
2594 <message name="message"> 2523 <message name="message">
2595 Upload en cours. Celui-ci peut prendre jusqu&apos;à 2 mn, 2524 Le chargement a commencé. Cela va prendre une à deux minutes,
2596en fonction de votre vitesse de connexion. 2525suivant votre vitesse de connexion.
2597 </message> 2526 </message>
2598 </alert> 2527 </alert>
2599 <alert name="ConfirmBakeTerrain"> 2528 <alert name="ConfirmBakeTerrain">
2600 <message name="message"> 2529 <message name="message">
2601 Etes-vous sûr(e) de vouloir figer le relief actuel, 2530 Etes-vous sûr(e) de vouloir figer le relief actuel,
2602en faire le point central des limites de réhaussement/abaissement de relief 2531en faire le point central des limites d&apos;élévation/abaissement de relief
2603et la valeur par défaut pour l&apos;outil &apos;Terrain par défaut&apos; ? 2532et la valeur par défaut du bouton Annuler modification ?
2604 </message> 2533 </message>
2605 <option name="Bake"> 2534 <option name="Bake">
2606 Figer 2535 OK
2607 </option> 2536 </option>
2608 <option name="Cancel"> 2537 <option name="Cancel">
2609 Annuler 2538 Annuler
@@ -2611,12 +2540,12 @@ et la valeur par défaut pour l&apos;outil &apos;Terrain par défaut&apos; ?
2611 </alert> 2540 </alert>
2612 <alert name="MaxAllowedAgentOnRegion"> 2541 <alert name="MaxAllowedAgentOnRegion">
2613 <message name="message"> 2542 <message name="message">
2614 Nombre maximum de résidents autorisés : [MAX_AGENTS] 2543 Vous ne pouvez pas autoriser plus de [MAX_AGENTS] résidents.
2615 </message> 2544 </message>
2616 </alert> 2545 </alert>
2617 <alert name="MaxBannedAgentsOnRegion"> 2546 <alert name="MaxBannedAgentsOnRegion">
2618 <message name="message"> 2547 <message name="message">
2619 Nombre maximum de résidents bannis : [MAX_BANNED] 2548 Vous ne pouvez pas bannir plus de [MAX_BANNED] résidents.
2620 </message> 2549 </message>
2621 </alert> 2550 </alert>
2622 <alert name="MaxAgentOnRegionBatch"> 2551 <alert name="MaxAgentOnRegionBatch">
@@ -2627,7 +2556,7 @@ Dépasse la limite fixée à [MAX_AGENTS] [LIST_TYPE] de [NUM_EXCESS].
2627 </alert> 2556 </alert>
2628 <alert name="MaxAllowedGroupsOnRegion"> 2557 <alert name="MaxAllowedGroupsOnRegion">
2629 <message name="message"> 2558 <message name="message">
2630 Nombre maximum de groupes autorisés : [MAX_GROUPS] 2559 Vous ne pouvez pas avoir plus que [MAX_GROUPS] groupes autorisés.
2631 </message> 2560 </message>
2632 <option name="Bake"> 2561 <option name="Bake">
2633 Figer 2562 Figer
@@ -2638,35 +2567,34 @@ Dépasse la limite fixée à [MAX_AGENTS] [LIST_TYPE] de [NUM_EXCESS].
2638 </alert> 2567 </alert>
2639 <alert name="MaxManagersOnRegion"> 2568 <alert name="MaxManagersOnRegion">
2640 <message name="message"> 2569 <message name="message">
2641 Nombre maximum de résidents bannis : [MAX_MANAGER] 2570 Vous ne pouvez avoir que [MAX_MANAGER] gérants de domaine.
2642 </message> 2571 </message>
2643 </alert> 2572 </alert>
2644 <alert name="OwnerCanNotBeDenied"> 2573 <alert name="OwnerCanNotBeDenied">
2645 <message name="message"> 2574 <message name="message">
2646 Impossible d&apos;ajouter le propriétaire du domaine à la liste noire du domaine. 2575 Impossible d&apos;ajouter le propriétaire du domaine à la liste des résidents bannis.
2647 </message> 2576 </message>
2648 </alert> 2577 </alert>
2649 <alert name="CanNotChangeAppearanceUntilLoaded"> 2578 <alert name="CanNotChangeAppearanceUntilLoaded">
2650 <message name="message"> 2579 <message name="message">
2651 Impossible de modifier son apparence tant que les vêtements et silhouettes ne sont pas chargés. 2580 Impossible de changer d&apos;apparence jusqu&apos;à ce que les habits et la silhouette soient chargés.
2652 </message> 2581 </message>
2653 </alert> 2582 </alert>
2654 <alert name="ClassifiedMustBeAlphanumeric"> 2583 <alert name="ClassifiedMustBeAlphanumeric">
2655 <message name="message"> 2584 <message name="message">
2656 Le nom de votre annonce doit commencer 2585 Le nom de votre petite annonce doit commencer par un chiffre ou une lettre (A à Z). La ponctuation n&apos;est pas autorisée.
2657par une lettre ou un chiffre (pas de ponctuations).
2658 </message> 2586 </message>
2659 </alert> 2587 </alert>
2660 <alert name="CantSetBuyObject"> 2588 <alert name="CantSetBuyObject">
2661 <message name="message"> 2589 <message name="message">
2662 Impossible de définir &quot;Acheter objet&quot;, car l&apos;objet n&apos;est pas à vendre. 2590 Cet objet n&apos;est pas à vendre.
2663Veuillez mettre l&apos;objet en vente et réessayez. 2591Veuillez choisir un objet à vendre et réessayer.
2664 </message> 2592 </message>
2665 </alert> 2593 </alert>
2666 <alert name="FinishedRawDownload"> 2594 <alert name="FinishedRawDownload">
2667 <message name="message"> 2595 <message name="message">
2668 Téléchargement du fichier relief RAW terminé : 2596 Chargement du fichier de terrain raw effectué vers :
2669[DOWNLOAD_PATH] 2597[DOWNLOAD_PATH].
2670 </message> 2598 </message>
2671 </alert> 2599 </alert>
2672 <alert name="DownloadWindowsMandatory"> 2600 <alert name="DownloadWindowsMandatory">
@@ -2755,14 +2683,14 @@ Télécharger vers le dossier Applications ?
2755 </alert> 2683 </alert>
2756 <alert name="DeedObjectToGroup"> 2684 <alert name="DeedObjectToGroup">
2757 <message name="message"> 2685 <message name="message">
2758 Le transfert de cet objet permettra au groupe de : 2686 Si vous cédez cet objet, le groupe :
2759* Recevoir l&apos;argent payé à l&apos;objet 2687* recevra les L$ versés pour l&apos;objet ;
2760 </message> 2688 </message>
2761 <ignore name="ignore"> 2689 <ignore name="ignore">
2762 Lors du transfert d&apos;objets au groupe 2690 Lors de la cession d&apos;objets au groupe
2763 </ignore> 2691 </ignore>
2764 <option name="Deed"> 2692 <option name="Deed">
2765 Transférer 2693 Céder
2766 </option> 2694 </option>
2767 <option name="Cancel"> 2695 <option name="Cancel">
2768 Annuler 2696 Annuler
@@ -2806,7 +2734,7 @@ Télécharger vers le dossier Applications ?
2806 </alert> 2734 </alert>
2807 <alert name="WebLaunchSupportWiki"> 2735 <alert name="WebLaunchSupportWiki">
2808 <message name="message"> 2736 <message name="message">
2809 Visitez le blog officiel des Linden pour les dernières nouvelles et informations. 2737 Visitez le blog officiel des Lindens pour les dernières nouvelles et informations.
2810 </message> 2738 </message>
2811 <option name="Gotopage"> 2739 <option name="Gotopage">
2812 Aller à la page 2740 Aller à la page
@@ -2817,13 +2745,13 @@ Télécharger vers le dossier Applications ?
2817 </alert> 2745 </alert>
2818 <alert name="WebLaunchLSLGuide"> 2746 <alert name="WebLaunchLSLGuide">
2819 <message name="message"> 2747 <message name="message">
2820 Consulter le Manuel LSL pour de l&apos;aide sur les scripts ? 2748 Consulter le Guide guide pour l&apos;écriture de scripts pour obtenir de l&apos;aide ?
2821 </message> 2749 </message>
2822 <ignore name="ignore"> 2750 <ignore name="ignore">
2823 Lors de l&apos;ouverture du navigateur web pour voir le Guide de scripting 2751 Lors de l&apos;ouverture du navigateur web pour voir le Guide pour l&apos;écriture de scripts
2824 </ignore> 2752 </ignore>
2825 <option name="Gotopage"> 2753 <option name="Gotopage">
2826 Aller à la page 2754 OK
2827 </option> 2755 </option>
2828 <option name="Cancel"> 2756 <option name="Cancel">
2829 Annuler 2757 Annuler
@@ -2842,18 +2770,15 @@ Télécharger vers le dossier Applications ?
2842 </alert> 2770 </alert>
2843 <alert name="ReturnToOwner"> 2771 <alert name="ReturnToOwner">
2844 <message name="message"> 2772 <message name="message">
2845 Etes-vous sûr(e) de vouloir renvoyer les objets 2773 Êtes-vous certain de vouloir renvoyer les objets sélectionnés à leur propriétaire ? Les objets donnés transférables seront renvoyés à leur ancien propriétaire.
2846sélectionnés à leurs propriétaires ? Les objets cessibles transférés 2774
2847seront renvoyés à leurs propriétaires précédents. 2775*Avertissement* Les objets non transférables seront supprimés !
2848(Tous les objets renvoyés seront replacés dans leur dernier dossier.)
2849
2850*AVERTISSEMENT* Les objets non cessibles transférés seront supprimés !
2851 </message> 2776 </message>
2852 <ignore name="ignore"> 2777 <ignore name="ignore">
2853 Lors du renvoi d&apos;objets à leurs propriétaires 2778 Lors du renvoi d&apos;objets à leurs propriétaires
2854 </ignore> 2779 </ignore>
2855 <option name="Return"> 2780 <option name="Return">
2856 Retourner 2781 OK
2857 </option> 2782 </option>
2858 <option name="Cancel"> 2783 <option name="Cancel">
2859 Annuler 2784 Annuler
@@ -2861,7 +2786,7 @@ seront renvoyés à leurs propriétaires précédents.
2861 </alert> 2786 </alert>
2862 <alert name="GroupLeaveConfirmOfficer"> 2787 <alert name="GroupLeaveConfirmOfficer">
2863 <message name="message"> 2788 <message name="message">
2864 Vous êtes actuellement officier du groupe [GROUP]. 2789 Vous êtes actuellement officier dans le groupe [GROUP].
2865Quitter le groupe ? 2790Quitter le groupe ?
2866 </message> 2791 </message>
2867 <option name="Leave"> 2792 <option name="Leave">
@@ -2874,10 +2799,10 @@ Quitter le groupe ?
2874 <alert name="GroupLeaveConfirmMember"> 2799 <alert name="GroupLeaveConfirmMember">
2875 <message name="message"> 2800 <message name="message">
2876 Vous êtes actuellement membre du groupe [GROUP]. 2801 Vous êtes actuellement membre du groupe [GROUP].
2877Quitter le groupe ? 2802Quitter le groupe ?
2878 </message> 2803 </message>
2879 <option name="Leave"> 2804 <option name="Leave">
2880 Partir 2805 OK
2881 </option> 2806 </option>
2882 <option name="Cancel"> 2807 <option name="Cancel">
2883 Annuler 2808 Annuler
@@ -2885,10 +2810,10 @@ Quitter le groupe ?
2885 </alert> 2810 </alert>
2886 <alert name="ConfirmKick"> 2811 <alert name="ConfirmKick">
2887 <message name="message"> 2812 <message name="message">
2888 Souhaitez-vous REELLEMENT dégager tous les utilisateurs de la grille ? 2813 Souhaitez-vous vraiment éjecter tous les utilisateurs de la grille ?
2889 </message> 2814 </message>
2890 <option name="Kick"> 2815 <option name="Kick">
2891 Vider Tous 2816 Éjecter tous
2892 </option> 2817 </option>
2893 <option name="Cancel"> 2818 <option name="Cancel">
2894 Annuler 2819 Annuler
@@ -2896,15 +2821,15 @@ Quitter le groupe ?
2896 </alert> 2821 </alert>
2897 <alert name="MuteLinden"> 2822 <alert name="MuteLinden">
2898 <message name="message"> 2823 <message name="message">
2899 Désolés, mais vous ne pouvez ignorer un Linden. 2824 Désolé, vous ne pouvez pas ignorer un Linden.
2900 </message> 2825 </message>
2901 <option name="OK"> 2826 <option name="OK">
2902 OK 2827 OK
2903 </option> 2828 </option>
2904 </alert> 2829 </alert>
2905 <alert name="MuteByNameFailed" title="L&apos;objet n&apos;a pu être ignoré"> 2830 <alert name="MuteByNameFailed" title="Échec de la fonction Ignorer les objets par nom">
2906 <message name="message"> 2831 <message name="message">
2907 Vous avez déjà ignoré ce nom. 2832 Vous ignorez déjà ce résident.
2908 </message> 2833 </message>
2909 <option name="OK"> 2834 <option name="OK">
2910 OK 2835 OK
@@ -2912,14 +2837,13 @@ Quitter le groupe ?
2912 </alert> 2837 </alert>
2913 <alert name="RemoveItemWarn"> 2838 <alert name="RemoveItemWarn">
2914 <message name="message"> 2839 <message name="message">
2915 Bien qu&apos;autorisée, la suppression d&apos;inventaire peut endommager 2840 Si vous supprimez des contenus, vous risquez d&apos;endommager l&apos;objet. Souhaitez-vous supprimer cet objet ?
2916l&apos;objet. Souhaitez-vous supprimer cet elément d&apos;inventaire ?
2917 </message> 2841 </message>
2918 <option name="Yes"> 2842 <option name="Yes">
2919 Oui 2843 OK
2920 </option> 2844 </option>
2921 <option name="No"> 2845 <option name="No">
2922 Non 2846 Annuler
2923 </option> 2847 </option>
2924 </alert> 2848 </alert>
2925 <alert name="CantRateOwnedByGroup"> 2849 <alert name="CantRateOwnedByGroup">
@@ -2932,7 +2856,7 @@ l&apos;objet. Souhaitez-vous supprimer cet elément d&apos;inventaire ?
2932 </alert> 2856 </alert>
2933 <alert name="CantOfferCallingCard"> 2857 <alert name="CantOfferCallingCard">
2934 <message name="message"> 2858 <message name="message">
2935 Impossible d&apos;offrir votre carte de visite actuellement. Veuillez réessayer dans un moment. 2859 Impossible d&apos;offrir une carte de visite actuellement. Veuillez réessayer dans un moment.
2936 </message> 2860 </message>
2937 <option name="OK"> 2861 <option name="OK">
2938 OK 2862 OK
@@ -2940,7 +2864,7 @@ l&apos;objet. Souhaitez-vous supprimer cet elément d&apos;inventaire ?
2940 </alert> 2864 </alert>
2941 <alert name="CantOfferFriendship"> 2865 <alert name="CantOfferFriendship">
2942 <message name="message"> 2866 <message name="message">
2943 Impossible de proposer de devenir votre ami(e). Veuillez réessayer dans quelques instants. 2867 Impossible de proposer votre amitié actuellement. Veuillez réessayer dans un moment.
2944 </message> 2868 </message>
2945 <option name="OK"> 2869 <option name="OK">
2946 OK 2870 OK
@@ -2957,10 +2881,8 @@ Votre domicile doit se trouver sur un terrain vous appartenant ou appartenant à
2957 </alert> 2881 </alert>
2958 <alert name="BusyModeSet"> 2882 <alert name="BusyModeSet">
2959 <message name="message"> 2883 <message name="message">
2960 Vous êtes en mode occupé. 2884 Mode occupé activé.
2961Le chat et les messages instantanés seront cachés. Les IM 2885Les chats et les messages instantanés ne s&apos;afficheront pas. Les messages instantanés génèreront la réponse en mode occupé que vous avez créée. Toutes les offres de téléportation seront refusées. Toutes les offres d&apos;inventaire iront dans la corbeille.
2962retourneront un message d&apos;occupation. Toutes les offres de téléportation
2963et d&apos;inventaire seront déclinées.
2964 </message> 2886 </message>
2965 <ignore name="ignore"> 2887 <ignore name="ignore">
2966 Lors de l&apos;utilisation du mode Occupé 2888 Lors de l&apos;utilisation du mode Occupé
@@ -2988,19 +2910,16 @@ peuvent être joints aux notes.
2988 </alert> 2910 </alert>
2989 <alert name="JoinedTooManyGroupsMember"> 2911 <alert name="JoinedTooManyGroupsMember">
2990 <message name="message"> 2912 <message name="message">
2991 Vous appartenez à trop de groupes pour vous inscrire 2913 Vous appartenez déjà à un nombre élevé de groupes et nous ne pouvez pas en rejoindre un nouveau. Avant de pouvoir rejoindre ce groupe, vous devez en quitter un ou refuser cette offre.
2992à un nouveau. Veuillez quitter au moins un groupe 2914Pour quitter un groupe, sélectionnez l&apos;option Groupe dans le menu Éditer.
2993avant de vous inscrire, ou déclinez l&apos;invitation. 2915[NAME] vous invite à rejoindre un groupe.
2994Pour quitter un groupe, sélectionnez l&apos;option &apos;Mes Groupes&apos;
2995dans le menu &apos;Edition&apos;.
2996[NAME] vous invite à devenir membre du groupe.
2997[INVITE] 2916[INVITE]
2998 </message> 2917 </message>
2999 <option name="Join"> 2918 <option name="Join">
3000 Fusionner 2919 Rejoindre
3001 </option> 2920 </option>
3002 <option name="Decline"> 2921 <option name="Decline">
3003 Décliner 2922 Refuser
3004 </option> 2923 </option>
3005 </alert> 2924 </alert>
3006 <alert name="JoinedTooManyGroupsOfficer"> 2925 <alert name="JoinedTooManyGroupsOfficer">
@@ -3022,10 +2941,10 @@ dans le menu &apos;Edition&apos;.
3022 </alert> 2941 </alert>
3023 <alert name="KickUser"> 2942 <alert name="KickUser">
3024 <message name="message"> 2943 <message name="message">
3025 Dégager cet utilisateur avec quel message ? 2944 Éjecter cet utilisateur avec quel message ?
3026 </message> 2945 </message>
3027 <editline name="editline"> 2946 <editline name="editline">
3028 Vous avez été déconnecté par un administrateur. 2947 Un administrateur vous a déconnecté.
3029 </editline> 2948 </editline>
3030 <option name="OK"> 2949 <option name="OK">
3031 OK 2950 OK
@@ -3036,10 +2955,10 @@ dans le menu &apos;Edition&apos;.
3036 </alert> 2955 </alert>
3037 <alert name="KickAllUsers"> 2956 <alert name="KickAllUsers">
3038 <message name="message"> 2957 <message name="message">
3039 Dégager tous les utilisateurs actuellement présents sur la grille avec quel message ? 2958 Éjecter tous les résidents actuellement en ligne avec quel message ?
3040 </message> 2959 </message>
3041 <editline name="editline"> 2960 <editline name="editline">
3042 Vous avez été déconnecté par un administrateur. 2961 Un administrateur vous a déconnecté.
3043 </editline> 2962 </editline>
3044 <option name="OK"> 2963 <option name="OK">
3045 OK 2964 OK
@@ -3050,10 +2969,10 @@ dans le menu &apos;Edition&apos;.
3050 </alert> 2969 </alert>
3051 <alert name="FreezeUser"> 2970 <alert name="FreezeUser">
3052 <message name="message"> 2971 <message name="message">
3053 Bloquer cet utilisateur avec quel message ? 2972 Geler cet utilisateur avec quel message ?
3054 </message> 2973 </message>
3055 <editline name="editline"> 2974 <editline name="editline">
3056 Vous avez été bloqué. Vous ne pouvez ni vous déplacer, ni chatter. Un administrateur va vous contacter via message instantané (IM). 2975 Vous avez été gelé. Vous ne pouvez ni bouger ni chatter. Un administrateur va vous envoyer un message instantané (IM).
3057 </editline> 2976 </editline>
3058 <option name="OK"> 2977 <option name="OK">
3059 OK 2978 OK
@@ -3064,10 +2983,10 @@ dans le menu &apos;Edition&apos;.
3064 </alert> 2983 </alert>
3065 <alert name="UnFreezeUser"> 2984 <alert name="UnFreezeUser">
3066 <message name="message"> 2985 <message name="message">
3067 Débloquer cet utilisateur avec quel message ? 2986 Dégeler cet utilisateur avec quel message ?
3068 </message> 2987 </message>
3069 <editline name="editline"> 2988 <editline name="editline">
3070 Vous n&apos;êtes plus bloqué. 2989 Vous n&apos;êtes plus gelé.
3071 </editline> 2990 </editline>
3072 <option name="OK"> 2991 <option name="OK">
3073 OK 2992 OK
@@ -3078,7 +2997,7 @@ dans le menu &apos;Edition&apos;.
3078 </alert> 2997 </alert>
3079 <alert name="ExpungeUser"> 2998 <alert name="ExpungeUser">
3080 <message name="message"> 2999 <message name="message">
3081 Entrez l&apos;id d&apos;un avatar à expulser 3000 Entrez l&apos;id de l&apos;avatar à éjecter
3082 </message> 3001 </message>
3083 <option name="OK"> 3002 <option name="OK">
3084 OK 3003 OK
@@ -3089,10 +3008,10 @@ dans le menu &apos;Edition&apos;.
3089 </alert> 3008 </alert>
3090 <alert name="OfferTeleport"> 3009 <alert name="OfferTeleport">
3091 <message name="message"> 3010 <message name="message">
3092 Proposer de téléporter la personne avec le message suivant ? 3011 Proposez une téléportation avec le message suivant ?
3093 </message> 3012 </message>
3094 <editline name="editline"> 3013 <editline name="editline">
3095 Rejoins-moi à [REGION] 3014 On se rejoint à [REGION] ?
3096 </editline> 3015 </editline>
3097 <option name="OK"> 3016 <option name="OK">
3098 OK 3017 OK
@@ -3103,10 +3022,10 @@ dans le menu &apos;Edition&apos;.
3103 </alert> 3022 </alert>
3104 <alert name="OfferTeleportFromGod"> 3023 <alert name="OfferTeleportFromGod">
3105 <message name="message"> 3024 <message name="message">
3106 Super-invoquer l&apos;utilisateur ici ? 3025 Demander au résident de venir vous rejoindre ?
3107 </message> 3026 </message>
3108 <editline name="editline"> 3027 <editline name="editline">
3109 Rejoins-moi à [REGION] 3028 On se rejoint à [REGION] ?
3110 </editline> 3029 </editline>
3111 <option name="OK"> 3030 <option name="OK">
3112 OK 3031 OK
@@ -3117,7 +3036,7 @@ dans le menu &apos;Edition&apos;.
3117 </alert> 3036 </alert>
3118 <alert name="TeleportFromLandmark"> 3037 <alert name="TeleportFromLandmark">
3119 <message name="message"> 3038 <message name="message">
3120 Etes-vous certain de vouloir être téléporté ? 3039 Êtes-vous certain de vouloir être téléporté ?
3121 </message> 3040 </message>
3122 <ignore name="ignore"> 3041 <ignore name="ignore">
3123 Lors de la téléportation depuis un repère de l&apos;inventaire 3042 Lors de la téléportation depuis un repère de l&apos;inventaire
@@ -3129,11 +3048,9 @@ dans le menu &apos;Edition&apos;.
3129 Annuler 3048 Annuler
3130 </option> 3049 </option>
3131 </alert> 3050 </alert>
3132 <alert name="MessageEstate" 3051 <alert name="MessageEstate" title="Envoyer un message à tout le monde dans votre domaine">
3133 title="Envoyez un message à tout le monde dans votre domaine">
3134 <message name="message"> 3052 <message name="message">
3135 Composez une brève annonce qui sera 3053 Saisissez un message court qui sera envoyé à tous les résidents se trouvant actuellement sur votre domaine.
3136envoyée à toutes les personnes présentes sur votre domaine.
3137 </message> 3054 </message>
3138 <option name="OK"> 3055 <option name="OK">
3139 OK 3056 OK
@@ -3142,150 +3059,143 @@ envoyée à toutes les personnes présentes sur votre domaine.
3142 Annuler 3059 Annuler
3143 </option> 3060 </option>
3144 </alert> 3061 </alert>
3145 <alert name="ChangeLindenEstate" title="Modifier domaine Linden"> 3062 <alert name="ChangeLindenEstate" title="Modifier un domaine Linden">
3146 <message name="message"> 3063 <message name="message">
3147 Vous vous apprêtez à modifier un domaine appartenant aux Linden 3064 Vous vous apprêtez à modifier un domaine appartenant aux Lindens (continent, zone réservée aux ados, orientation etc.).
3148(continent, grille ado, orientation, etc.). 3065
3149 3066Cela est extrêmement délicat car l&apos;expérience des résidents est en jeu. Sur le continent, cela modifiera
3150Ceci est EXTREMEMENT DANGEREUX car cela peut fondamentalement 3067des milliers de régions et sera difficile à digérer pour le serveur.
3151affecter l&apos;expérience des utilisateurs. Sur le continent, cela modifiera
3152des milliers de régions et provoquera l&apos;instabilité du serveur principal.
3153 3068
3154Continuer ? 3069Continuer ?
3155 </message> 3070 </message>
3156 <option name="ChangeEstate"> 3071 <option name="ChangeEstate">
3157 Changer de domaine 3072 OK
3158 </option> 3073 </option>
3159 <option name="Cancel"> 3074 <option name="Cancel">
3160 Annuler 3075 Annuler
3161 </option> 3076 </option>
3162 </alert> 3077 </alert>
3163 <alert name="ChangeLindenAccess" title="Modifier l&apos;accès au domaine Linden"> 3078 <alert name="ChangeLindenAccess" title="Modifier l&apos;accès à un domaine Linden">
3164 <message name="message"> 3079 <message name="message">
3165 Vous vous apprêtez à modifier la liste d&apos;accès d&apos;un domaine appartenant aux Linden 3080 Vous vous apprêtez à modifier la liste d&apos;accès à un domaine appartenant aux Linden (continent, zone réservée aux ados, orientation etc.).
3166(continent, grille ado, orientation, etc.). 3081
3167 3082Cette action est délicate et ne doit être effectuée que pour appeler le hack autorisant des objets/L$ à être transférés à l&apos;intérieur/extérieur de la grille.
3168Ceci est DANGEREUX et ne doit être utilisé que pour invoquer le hack 3083Cette action modifiera des milliers de régions et sera difficile à digérer pour le serveur.
3169permettant le transfert d&apos;objets ou d&apos;argent depuis ou vers la grille.
3170
3171Cela modifie des milliers de régions et provoque l&apos;instabilité du serveur principal.
3172
3173Continuer ?
3174 </message> 3084 </message>
3175 <option name="ChangeEstate"> 3085 <option name="ChangeEstate">
3176 Changer de domaine 3086 OK
3177 </option> 3087 </option>
3178 <option name="Cancel"> 3088 <option name="Cancel">
3179 Annuler 3089 Annuler
3180 </option> 3090 </option>
3181 </alert> 3091 </alert>
3182 <alert name="EstateAllowedAgentAdd" title="Sélectionner domaine"> 3092 <alert name="EstateAllowedAgentAdd" title="Choisir le domaine">
3183 <message name="message"> 3093 <message name="message">
3184 Ajouter à la liste d&apos;accès de ce domaine seulement ou [ALL_ESTATES] ? 3094 Ajouter à la liste des résidents autori©s uniquement pour ce domaine ou pour [ALL_ESTATES] ?
3185 </message> 3095 </message>
3186 <option name="ThisEstate"> 3096 <option name="ThisEstate">
3187 Ce domaine 3097 ce domaine
3188 </option> 3098 </option>
3189 <option name="AllEstates"> 3099 <option name="AllEstates">
3190 Tous domaines 3100 tous les domaines
3191 </option> 3101 </option>
3192 <option name="Cancel"> 3102 <option name="Cancel">
3193 Annuler 3103 Annuler
3194 </option> 3104 </option>
3195 </alert> 3105 </alert>
3196 <alert name="EstateAllowedAgentRemove" title="Sélectionner domaine"> 3106 <alert name="EstateAllowedAgentRemove" title="Choisir le domaine">
3197 <message name="message"> 3107 <message name="message">
3198 Retirer de la liste d&apos;accès pour ce domaine seulement ou pour [ALL_ESTATES] ? 3108 Supprimer de la liste des résidents autori©s uniquement pour ce domaine ou pour [ALL_ESTATES] ?
3199 </message> 3109 </message>
3200 <option name="ThisEstate"> 3110 <option name="ThisEstate">
3201 Ce domaine 3111 ce domaine
3202 </option> 3112 </option>
3203 <option name="AllEstates"> 3113 <option name="AllEstates">
3204 Tous domaines 3114 tous les domaines
3205 </option> 3115 </option>
3206 <option name="Cancel"> 3116 <option name="Cancel">
3207 Annuler 3117 Annuler
3208 </option> 3118 </option>
3209 </alert> 3119 </alert>
3210 <alert name="EstateAllowedGroupAdd" title="Sélectionner domaine"> 3120 <alert name="EstateAllowedGroupAdd" title="Choisir le domaine">
3211 <message name="message"> 3121 <message name="message">
3212 Ajouter à la liste des groupes admis pour ce domaine seulement ou [ALL_ESTATES] ? 3122 Ajouter à la liste des résidents autorisés uniquement pour ce domaine ou pour [ALL_ESTATES] ?
3213 </message> 3123 </message>
3214 <option name="ThisEstate"> 3124 <option name="ThisEstate">
3215 Ce domaine 3125 ce domaine
3216 </option> 3126 </option>
3217 <option name="AllEstates"> 3127 <option name="AllEstates">
3218 Tous domaines 3128 tous les domaines
3219 </option> 3129 </option>
3220 <option name="Cancel"> 3130 <option name="Cancel">
3221 Annuler 3131 Annuler
3222 </option> 3132 </option>
3223 </alert> 3133 </alert>
3224 <alert name="EstateAllowedGroupRemove" title="Sélectionner domaine"> 3134 <alert name="EstateAllowedGroupRemove" title="Choisir le domaine">
3225 <message name="message"> 3135 <message name="message">
3226 Retirer de la liste des groupes admis pour ce domaine seulement ou pour [ALL_ESTATES] ? 3136 Supprimer de la liste des groupes autorisés uniquement pour ce domaine ou pour [ALL_ESTATES] ?
3227 </message> 3137 </message>
3228 <option name="ThisEstate"> 3138 <option name="ThisEstate">
3229 Ce domaine 3139 ce domaine
3230 </option> 3140 </option>
3231 <option name="AllEstates"> 3141 <option name="AllEstates">
3232 Tous domaines 3142 tous les domaines
3233 </option> 3143 </option>
3234 <option name="Cancel"> 3144 <option name="Cancel">
3235 Annuler 3145 Annuler
3236 </option> 3146 </option>
3237 </alert> 3147 </alert>
3238 <alert name="EstateBannedAgentAdd" title="Sélectionner domaine"> 3148 <alert name="EstateBannedAgentAdd" title="Choisir le domaine">
3239 <message name="message"> 3149 <message name="message">
3240 Refuser l&apos;accès à ce domaine seulement ou à [ALL_ESTATES] ? 3150 Refuser l&apos;accès à ce domaine uniquement ou à [ALL_ESTATES] ?
3241 </message> 3151 </message>
3242 <option name="ThisEstate"> 3152 <option name="ThisEstate">
3243 Ce domaine 3153 ce domaine
3244 </option> 3154 </option>
3245 <option name="AllEstates"> 3155 <option name="AllEstates">
3246 Tous domaines 3156 tous les domaines
3247 </option> 3157 </option>
3248 <option name="Cancel"> 3158 <option name="Cancel">
3249 Annuler 3159 Annuler
3250 </option> 3160 </option>
3251 </alert> 3161 </alert>
3252 <alert name="EstateBannedAgentRemove" title="Sélectionner domaine"> 3162 <alert name="EstateBannedAgentRemove" title="Choisir le domaine">
3253 <message name="message"> 3163 <message name="message">
3254 Cesser de refuser l&apos;accès à ce domaine ou à [ALL_ESTATES] ? 3164 Supprimer ce résident de la liste des résidents bannis pour ce domaine uniquement ou pour [ALL_ESTATES] ?
3255 </message> 3165 </message>
3256 <option name="ThisEstate"> 3166 <option name="ThisEstate">
3257 Ce domaine 3167 ce domaine
3258 </option> 3168 </option>
3259 <option name="AllEstates"> 3169 <option name="AllEstates">
3260 Tous domaines 3170 tous les domaines
3261 </option> 3171 </option>
3262 <option name="Cancel"> 3172 <option name="Cancel">
3263 Annuler 3173 Annuler
3264 </option> 3174 </option>
3265 </alert> 3175 </alert>
3266 <alert name="EstateManagerAdd" title="Sélectionner domaine"> 3176 <alert name="EstateManagerAdd" title="Choisir le domaine">
3267 <message name="message"> 3177 <message name="message">
3268 Ajouter un administrateur de propriété pour cette propriété seulement ou pour l&apos;ensemble de vos propriétés ? 3178 Ajouter un gérant de domaine pour ce domaine uniquement ou pour [ALL_ESTATES] ?
3269 </message> 3179 </message>
3270 <option name="ThisEstate"> 3180 <option name="ThisEstate">
3271 Ce domaine 3181 ce domaine
3272 </option> 3182 </option>
3273 <option name="AllEstates"> 3183 <option name="AllEstates">
3274 Tous domaines 3184 tous les domaines
3275 </option> 3185 </option>
3276 <option name="Cancel"> 3186 <option name="Cancel">
3277 Annuler 3187 Annuler
3278 </option> 3188 </option>
3279 </alert> 3189 </alert>
3280 <alert name="EstateManagerRemove" title="Sélectionner domaine"> 3190 <alert name="EstateManagerRemove" title="Choisir le domaine">
3281 <message name="message"> 3191 <message name="message">
3282 Retirer l&apos;administrateur pour ce domaine seulement ou pour tous vos domaines? 3192 Supprimer le gérant de domaine pour ce domaine uniquement ou pour [ALL_ESTATES] ?
3283 </message> 3193 </message>
3284 <option name="ThisEstate"> 3194 <option name="ThisEstate">
3285 Ce domaine 3195 ce domaine
3286 </option> 3196 </option>
3287 <option name="AllEstates"> 3197 <option name="AllEstates">
3288 Tous domaines 3198 cous les domaines
3289 </option> 3199 </option>
3290 <option name="Cancel"> 3200 <option name="Cancel">
3291 Annuler 3201 Annuler
@@ -3293,24 +3203,24 @@ Continuer ?
3293 </alert> 3203 </alert>
3294 <alert name="EstateCovenantChange" title="Sélectionner domaine"> 3204 <alert name="EstateCovenantChange" title="Sélectionner domaine">
3295 <message name="message"> 3205 <message name="message">
3296 Modifier le message de la clause de sauvegarde pour ce domaine seulement ou pour [ALL_ESTATES] ? 3206 Modifier le message du règlement pour ce domaine uniquement ou pour [ALL_ESTATES] ?
3297 </message> 3207 </message>
3298 <option name="ThisEstate"> 3208 <option name="ThisEstate">
3299 Ce domaine 3209 ce domaine
3300 </option> 3210 </option>
3301 <option name="AllEstates"> 3211 <option name="AllEstates">
3302 Tous domaines 3212 tous les domaines
3303 </option> 3213 </option>
3304 <option name="Cancel"> 3214 <option name="Cancel">
3305 Annuler 3215 Annuler
3306 </option> 3216 </option>
3307 </alert> 3217 </alert>
3308 <alert name="EstateKickUser" title="Confirmer Dégager"> 3218 <alert name="EstateKickUser" title="Confirmer">
3309 <message name="message"> 3219 <message name="message">
3310 Dégager [EVIL_USER] de ce domaine ? 3220 Éjecter [EVIL_USER] de ce domaine ?
3311 </message> 3221 </message>
3312 <option name="Kick"> 3222 <option name="Kick">
3313 Dégager 3223 OK
3314 </option> 3224 </option>
3315 <option name="Cancel"> 3225 <option name="Cancel">
3316 Annuler 3226 Annuler
@@ -3318,10 +3228,10 @@ Continuer ?
3318 </alert> 3228 </alert>
3319 <alert name="EstateChangeCovenant"> 3229 <alert name="EstateChangeCovenant">
3320 <message name="message"> 3230 <message name="message">
3321 Etes-vous sûr(e) de vouloir modifier la clause de sauvegarde du domaine ? 3231 Êtes-vous certain de vouloir modifier le règlement du domaine ?
3322 </message> 3232 </message>
3323 <option name="Change"> 3233 <option name="Change">
3324 Changer 3234 OK
3325 </option> 3235 </option>
3326 <option name="Cancel"> 3236 <option name="Cancel">
3327 Annuler 3237 Annuler
@@ -3329,7 +3239,7 @@ Continuer ?
3329 </alert> 3239 </alert>
3330 <alert name="ProblemImportingEstateCovenant"> 3240 <alert name="ProblemImportingEstateCovenant">
3331 <message name="message"> 3241 <message name="message">
3332 Erreur d&apos;importation de la clause de sauvegarde du domaine. 3242 Problème lors de l&apos;importation du règlement du domaine.
3333 </message> 3243 </message>
3334 <option name="OK"> 3244 <option name="OK">
3335 OK 3245 OK
@@ -3347,7 +3257,7 @@ Continuer ?
3347 </alert> 3257 </alert>
3348 <alert name="UnableToLoadNotecard"> 3258 <alert name="UnableToLoadNotecard">
3349 <message name="message"> 3259 <message name="message">
3350 Impossible de charger ressource de la note pour le moment. 3260 Impossible de lire les données de la note actuellement.
3351 </message> 3261 </message>
3352 <option name="OK"> 3262 <option name="OK">
3353 OK 3263 OK
@@ -3355,7 +3265,7 @@ Continuer ?
3355 </alert> 3265 </alert>
3356 <alert name="NotAllowedToViewNotecard"> 3266 <alert name="NotAllowedToViewNotecard">
3357 <message name="message"> 3267 <message name="message">
3358 Autorisations insuffisantes pour afficher la note associée à l&apos;ID de ressource demandée. 3268 Permissions pour afficher la note insuffisantes.
3359 </message> 3269 </message>
3360 <option name="OK"> 3270 <option name="OK">
3361 OK 3271 OK
@@ -3363,7 +3273,7 @@ Continuer ?
3363 </alert> 3273 </alert>
3364 <alert name="MissingNotecardAssetID"> 3274 <alert name="MissingNotecardAssetID">
3365 <message name="message"> 3275 <message name="message">
3366 ID de ressource de la note absent de la base de données. 3276 Les références de la note ne se trouvent pas dans la base de données.
3367 </message> 3277 </message>
3368 <option name="OK"> 3278 <option name="OK">
3369 OK 3279 OK
@@ -3371,12 +3281,12 @@ Continuer ?
3371 </alert> 3281 </alert>
3372 <alert name="PublishClassified"> 3282 <alert name="PublishClassified">
3373 <message name="message"> 3283 <message name="message">
3374 Attention : les frais d&apos;insertion sont non remboursables. 3284 Rappel : les frais pour passer des petites annonces ne sont pas remboursables.
3375 3285
3376Publier cette annonce maintenant pour L$[AMOUNT]? 3286Publier cette petite annonce maintenant pour [AMOUNT] L$ ?
3377 </message> 3287 </message>
3378 <option name="Publish"> 3288 <option name="Publish">
3379 Publier 3289 OK
3380 </option> 3290 </option>
3381 <option name="Cancel"> 3291 <option name="Cancel">
3382 Annuler 3292 Annuler
@@ -3410,22 +3320,20 @@ Publier cette annonce maintenant pour L$[AMOUNT]?
3410 Annuler 3320 Annuler
3411 </option> 3321 </option>
3412 </alert> 3322 </alert>
3413 <alert name="ConfirmRestart" title="Confirmer redémarrage"> 3323 <alert name="ConfirmRestart" title="Confirmer le redémarrage">
3414 <message name="message"> 3324 <message name="message">
3415 Etes-vous sûr(e) de vouloir redémarrer cette région dans 2 minutes? 3325 Souhaitez-vous vraiment redémarrer cette région dans 2 minutes ?
3416 </message> 3326 </message>
3417 <option name="Restart"> 3327 <option name="Restart">
3418 Redémarrer 3328 OK
3419 </option> 3329 </option>
3420 <option name="Cancel"> 3330 <option name="Cancel">
3421 Annuler 3331 Annuler
3422 </option> 3332 </option>
3423 </alert> 3333 </alert>
3424 <alert name="MessageRegion" 3334 <alert name="MessageRegion" title="Envoyer un message à tout le monde dans cette région">
3425 title="Envoyez un message à tout le monde dans la région">
3426 <message name="message"> 3335 <message name="message">
3427 Composez une brève annonce qui sera 3336 Saisissez une message court qui sera envoyé à tous les résidents se trouvant actuellement dans cette région.
3428envoyée à toutes les personnes présentes dans cette région.
3429 </message> 3337 </message>
3430 <option name="OK"> 3338 <option name="OK">
3431 OK 3339 OK
@@ -3434,64 +3342,62 @@ envoyée à toutes les personnes présentes dans cette région.
3434 Annuler 3342 Annuler
3435 </option> 3343 </option>
3436 </alert> 3344 </alert>
3437 <alert name="HelpRegionBlockTerraform" title="Interdire le terraforming"> 3345 <alert name="HelpRegionBlockTerraform" title="Bloquer le terraformage">
3438 <message name="message"> 3346 <message name="message">
3439 Si cette option est cochée, les propriétaires terriens ne pourront pas terraformer 3347 Si vous cochez cette case, les propriétaires ne pourront plus terraformer leur terrain, quels que soient leurs paramètres à la section Modifier le terrain.
3440leur terrain, indépendamment des réglages &apos;Modifier Relief&apos; de chaque parcelle. 3348
3441 3349Défaut : désactivé
3442Défaut : désactivé
3443 </message> 3350 </message>
3444 </alert> 3351 </alert>
3445 <alert name="HelpRegionBlockFly" title="Interdire vol"> 3352 <alert name="HelpRegionBlockFly" title="Interdire le vol">
3446 <message name="message"> 3353 <message name="message">
3447 Si cette option est cochée, les personnes ne pourront pas voler dans cette région, 3354 Si vous cochez cette case, les résidents ne pourront plus voler dans cette région, quels que soient leurs paramètres.
3448indépendamment des réglages de &apos;Vol&apos; de chaque parcelle.
3449 3355
3450Défaut : désactivé 3356Défaut : désactivé
3451 </message> 3357 </message>
3452 </alert> 3358 </alert>
3453 <alert name="HelpRegionAllowDamage" title="Autoriser dégâts"> 3359 <alert name="HelpRegionAllowDamage" title="Autoriser les dégâts">
3454 <message name="message"> 3360 <message name="message">
3455 Cette option active le système de santé sur toutes les parcelles 3361 Si vous cohez cette case, l&apos;alerte santé est désactivée sur toutes les parcelles quels que soient les paramètres individuels de la parcelle. Si la case n&apos;est pas cochée, les propriétaires de parcelles peuvent quand même activer l&apos;alerte santé de manière individuelle sur leurs parcelles.
3456indépendamment des réglages individuels des parcelles. Si elle est
3457décochée, les propriétaires de parcelles individuelles pourront
3458activer le système de santé sur leurs parcelles.
3459 3362
3460Défaut : désactivé 3363Défaut : désactivé
3461 </message> 3364 </message>
3462 </alert> 3365 </alert>
3463 <alert name="HelpRegionAgentLimit" title="Limite d&apos;avatars"> 3366 <alert name="HelpRegionAgentLimit" title="Nombre limite d&apos;avatars">
3464 <message name="message"> 3367 <message name="message">
3465 Définit le nombre maximum d&apos;avatars autorisés dans cette région. 3368 Définit le nombre maximum d&apos;avatars autorisés dans cette région.
3466Plus il y a d&apos;avatars dans une région, plus les performances peuvent se dégrader. 3369La performance peut varier en fonction du nombre d&apos;avatars présents.
3467 3370
3468Défaut : 30 3371Défaut : 40
3469 </message> 3372 </message>
3470 </alert> 3373 </alert>
3471 <alert name="HelpRegionMaturity" title="Classification"> 3374 <alert name="HelpRegionObjectBonus" title="Bonus objet">
3472 <message name="message"> 3375 <message name="message">
3473 Définit la classification de la région (M=Adulte, PG=Tout Public), affichée dans le coin supérieur droit 3376 Le bonus objet est le multiplicateur de prims autorisés sur une parcelle donnée. L&apos;échelle autorisée est comprise entre 1 et 10. Lorsque ce chiffre est de 1, chaque parcelle de 512 m² peut contenir 117 objets. S&apos;il est de 2, chaque parcelle peut contenir 234 objets, ou deux fois plus, et ainsi de suite. Le nombre maximum d&apos;objets autorisés dans une région est de 15 000, quel que soit le bonus objet. Attention : si vous définissez un bonus objet et décidez ensuite de le diminuer, cela peut entraîner la suppression ou le renvoi d&apos;objets.
3474de l&apos;écran ou sous forme de bulles d&apos;aide sur la carte. Cette classification
3475affecte également les résultats de recherche - les résidents peuvent choisir d&apos;exclure
3476le contenu situé dans les régions Adultes.
3477 3377
3478Les bulles d&apos;aide de la carte ne seront pas modifiées avant 5 minutes, le système mettant périodiquement à jour les informations de la carte. 3378Défaut : 1.0
3379 </message>
3380 </alert>
3381 <alert name="HelpRegionMaturity" title="Maturité">
3382 <message name="message">
3383 Définit le niveau de maturité de la région. Ce niveau s&apos;affiche
3384 en haut de l&apos;écran et dans les pop-ups d&apos;astuces sur la carte. Ce paramètre influe aussi sur les résultats de recherche. Les résidents peuvent choisir de ne pas rechercher de contenu dans les régions Adultes.
3479 3385
3480Défaut : PG (Tout public) 3386Ce changement n&apos;apparaîtra pas immédiatement sur la carte.
3387
3388Défaut : Tout public
3481 </message> 3389 </message>
3482 </alert> 3390 </alert>
3483 <alert name="HelpRegionRestrictPushObject" title="Interdire de pousser"> 3391 <alert name="HelpRegionRestrictPushObject" title="Interdire les bousculades">
3484 <message name="message"> 3392 <message name="message">
3485 Limite les autorisations de pousser sur la région entière. 3393 Cette case permet de restreindre les bousculades dans toute une région.
3486Les avatars ne peuvent se pousser qu&apos;entre eux, ou être poussés par des scripts 3394Lorsqu&apos;elle est cochée, les résidents ne peuvent être bousculés que par eux-mêmes ou par le propriétaire de la région.
3487appartenant au propriétaire de la parcelle ou attribués au groupe sur la parcelle, 3395(Bousculer fait référence à la fonction LSL llPushObjet().)
3488si celle-ci est attribuée à un groupe.
3489Pousser est lié à la fonction llPushObject() du langage LSL.
3490 3396
3491Défaut : Désactiver 3397Défaut : Désactivé
3492 </message> 3398 </message>
3493 </alert> 3399 </alert>
3494 <alert name="HelpParcelChanges" title="Fusionner/subdiviser parcelle"> 3400 <alert name="HelpParcelChanges" title="Fusionner/Diviser des parcelles">
3495 <message name="message"> 3401 <message name="message">
3496 Cette case permet de choisir si les parcelles n&apos;appartenant pas au gérant du domaine peuvent être fusionnées ou divisées ou pas. 3402 Cette case permet de choisir si les parcelles n&apos;appartenant pas au gérant du domaine peuvent être fusionnées ou divisées ou pas.
3497Si cette case n&apos;est pas cochée : 3403Si cette case n&apos;est pas cochée :
@@ -3512,39 +3418,38 @@ Défaut : Cochée
3512Défaut : Désactivé 3418Défaut : Désactivé
3513 </message> 3419 </message>
3514 </alert> 3420 </alert>
3515 <alert name="HelpParcelSearch" title="Do Not Show In Search"> 3421 <alert name="HelpParcelSearch" title="Ne pas afficher dans la recherche">
3516 <message name="message"> 3422 <message name="message">
3517 Checking this box will show: 3423 Si vous cochez cette option, votre parcelle apparaîtra :
3518- this parcel in search results 3424- dans les résultats de recherche ;
3519- this parcel&apos;s public objects 3425- dans les objets publics de cette parcelle.
3520 </message> 3426 </message>
3521 </alert> 3427 </alert>
3522 <alert name="RegionMaturityChange" title="Classification de la Région modifiée."> 3428 <alert name="RegionMaturityChange" title="Maturité de la région modifiée">
3523 <message name="message"> 3429 <message name="message">
3524 La classification de cette région a été modifiée. 3430 Le niveau de maturité de cette région a été mis à jour.
3525 3431Ce changement n&apos;apparaîtra pas immédiatement sur la carte.
3526Cependant, la carte du monde ne sera pas modifiée avant 5 minutes, le système mettant périodiquement à jour les informations de la carte.
3527 </message> 3432 </message>
3528 </alert> 3433 </alert>
3529 <alert name="HelpRegionLandResell" title="Revente de terrain"> 3434 <alert name="HelpRegionLandResell" title="Revente de terrain">
3530 <message name="message"> 3435 <message name="message">
3531 Les propriétaires et administrateurs de domaines peuvent vendre tout terrain appartenant au propriétaire du domaine. 3436 Les propriétaires et gérants de domaine peuvent vendre n&apos;importe quel terrain appartenant à un propriétaire de domaine.
3532Si cette option est décochée, les acheteurs ne peuvent revendre leur terrain dans cette région. 3437Si cette option n&apos;est pas cochée, les acheteurs ne peuvent pas revendre leur terrain dans cette région.
3533Si cette option est cochée, les acheteurs peuvent revendre leur terrain dans cette région. 3438Si cette option est cochée, les acheteurs peuvent revendre leur terrain dans cette région.
3534 3439
3535Défaut : Ne pas autoriser 3440Défaut : Ne pas autoriser
3536 </message> 3441 </message>
3537 </alert> 3442 </alert>
3538 <alert name="HelpEstateCovenantID" title="ID de ressource de la clause de sauvegarde"> 3443 <alert name="HelpEstateCovenantID" title="ID de ressource du règlement">
3539 <message name="message"> 3444 <message name="message">
3540 Définit l&apos;ID d&apos;élément de la note pour la Clause de sauvegarde de ce Domaine. 3445 Définit l&apos;ID de la note pour le règlement de ce domaine.
3541 3446
3542Défaut : 00000000-0000-0000-0000-000000000000 ou aucun 3447Défaut : 00000000-0000-0000-0000-000000000000 ou aucun
3543 </message> 3448 </message>
3544 </alert> 3449 </alert>
3545 <alert name="HelpRegionDisableScripts" title="Désactiver les scripts"> 3450 <alert name="HelpRegionDisableScripts" title="Désactiver les scripts">
3546 <message name="message"> 3451 <message name="message">
3547 Lorsque la performance d&apos;une sim est faible, cela vient peut-être d&apos;un script. Ouvrez la barre de statistiques (Ctrl-Maj-1). Consultez le Simulateur de propriétés physiques FPS. 3452 Lorsque la performance d&apos;une sim est faible, cela vient peut-être d&apos;un script. Ouvrez la section Statistiques (Ctrl-Maj-1). Consultez le Simulateur de propriétés physiques FPS.
3548S&apos;il est en dessous de 45, ouvrez le panel Heure situé en bas de la barre de statistiques. Si le script Heure indique 25mn ou moins, cliquez sur le bouton Afficher les scripts fréquemment utilisés. Vous verrez le nom et l&apos;emplacement des scripts qui sont peut-être à l&apos;origine du problème. 3453S&apos;il est en dessous de 45, ouvrez le panel Heure situé en bas de la barre de statistiques. Si le script Heure indique 25mn ou moins, cliquez sur le bouton Afficher les scripts fréquemment utilisés. Vous verrez le nom et l&apos;emplacement des scripts qui sont peut-être à l&apos;origine du problème.
3549 3454
3550Si vous cochez la case Désactiver les scripts et que vous appuyez sur Appliquer, tous les scripts de cette région seront temporairement désactivés. Vous devrez peut-être faire cela pour aller dans un endroit où se trouve un 3455Si vous cochez la case Désactiver les scripts et que vous appuyez sur Appliquer, tous les scripts de cette région seront temporairement désactivés. Vous devrez peut-être faire cela pour aller dans un endroit où se trouve un
@@ -3554,7 +3459,7 @@ Décochez la case Désactiver le script, puis cliquez sur Appliquer pour réacti
3554Défaut : désactivé 3459Défaut : désactivé
3555 </message> 3460 </message>
3556 </alert> 3461 </alert>
3557 <alert name="HelpRegionDisableCollisions" title="Désactiver collisions"> 3462 <alert name="HelpRegionDisableCollisions" title="Désactiver les collisions">
3558 <message name="message"> 3463 <message name="message">
3559 Lorsque la performance d&apos;une sim est faible, cela vient peut-être des objets physiques. 3464 Lorsque la performance d&apos;une sim est faible, cela vient peut-être des objets physiques.
3560Ouvrez la barre de statistiques (Ctrl-Maj-1). Consultez le Simulateur de propriétés physiques FPS. S&apos;il est en dessous de 45, ouvrez le panel Heure situé en bas de la barre de statistiques. Si le script Heure indique 25mn ou moins, cliquez sur le bouton Afficher les objets souvent responsables de collision. 3465Ouvrez la barre de statistiques (Ctrl-Maj-1). Consultez le Simulateur de propriétés physiques FPS. S&apos;il est en dessous de 45, ouvrez le panel Heure situé en bas de la barre de statistiques. Si le script Heure indique 25mn ou moins, cliquez sur le bouton Afficher les objets souvent responsables de collision.
@@ -3567,74 +3472,59 @@ Décochez la case Désactiver les collision, puis cliquez sur Appliquer pour ré
3567Défaut : désactivé 3472Défaut : désactivé
3568 </message> 3473 </message>
3569 </alert> 3474 </alert>
3570 <alert name="HelpRegionDisablePhysics" title="Désactiver Physiques"> 3475 <alert name="HelpRegionDisablePhysics" title="Désactiver les propriétés physiques">
3571 <message name="message"> 3476 <message name="message">
3572 Désactiver Physiques est équivalent à Désactiver Collisions, à la différence 3477 L&apos;option Désactiver les propriétés physiques est similaire à l&apos;option Désactiver les collisions sauf qu&apos;elle englobe toutes les simulations physiques. Cela signifie que les objets n&apos;entreront plus en collision et que les avatars ne pourront plus bouger.
3573que toute simulation physique est désactivée. Non seulement les objets
3574cessent toute collision, mais les avatars sont également immobilisés.
3575 3478
3576A n&apos;utiliser que lorsque Désactiver Collisions ne restitue pas 3479Vous ne devriez utiliser cette option que lorsque l&apos;option Désactiver les collisions ne rend pas sufisamment de performance à la région pour résoudre un problème de physique ou trouver les objets souvent responsables de collisions.
3577assez de performances à la région pour analyser
3578un problème physique ou de &apos;Top Collider&apos;.
3579 3480
3580Assurez-vous de bien réactiver Physiques lorsque vous avez fini, 3481Une fois que vous avez fini, n&apos;oubliez pas de réactiver les propriétés physiques sinon vos avatars ne pourront pas bouger.
3581sans quoi les avatars continueront à être immobilisés.
3582 3482
3583Défaut : décoché 3483Défaut : désactivé
3584 </message> 3484 </message>
3585 </alert> 3485 </alert>
3586 <alert name="HelpRegionTopColliders" title="Top Colliders"> 3486 <alert name="HelpRegionTopColliders" title="Objets souvent responsables de collision">
3587 <message name="message"> 3487 <message name="message">
3588 Affiche une liste d&apos;objets les plus exposés aux collisions potentielles entre objets. Ces objets peuvent 3488 Montre une liste des objets qui ont le plus de chances d&apos;entrer en collision avec d&apos;autres objets. Ces objets peuvent ralentir votre performance. Sélectionnez Affichage &gt; Statistiques et regardez sous Simulator &gt; Time &gt; Sim Time (Physics) pour voir si les propriétés physiques prennent plus de 20 ms.
3589ralentir la performance du sim. Sélectionnez Afficher &gt; Barre de statistiques et
3590vérifiez dans Simulateur &gt; Temps &gt; Temps du Sim (Physiques) si
3591plus de 20 ms sont consacrés à Physiques.
3592 </message> 3489 </message>
3593 </alert> 3490 </alert>
3594 <alert name="HelpRegionTopScripts" title="Top Scripts"> 3491 <alert name="HelpRegionTopScripts" title="Scripts souvent utilisés">
3595 <message name="message"> 3492 <message name="message">
3596 Affiche une liste d&apos;objets les plus occupés à exécuter des scripts LSL. Ces objets peuvent 3493 Dresse une liste des objets qui passent le plus de temps à exécuter des scripts LSL. Ces objets peuvent ralentir votre performance.
3597ralentir la performance du sim. Sélectionnez Afficher &gt; Barre de statistiques et 3494Sélectionnez Affichage &gt; Statistiques et regardez sous Simulator &gt; Time &gt; Script Time pour voir si les scripts prennent plus de 25 ms.
3598vérifiez dans Simulateur &gt; Temps &gt; Temps de script si
3599plus de 25 ms sont consacrés aux scripts.
3600 </message> 3495 </message>
3601 </alert> 3496 </alert>
3602 <alert name="HelpRegionRestart" title="Redémarrer région"> 3497 <alert name="HelpRegionRestart" title="Redémarrer la région">
3603 <message name="message"> 3498 <message name="message">
3604 Relancez le processus du serveur qui gère cette région 3499 Redémarre le serveur en charge de la région après un avertissement de deux minutes. Tous les résidents dans cette région seront déconnectés. Les données de la région seront sauvegardées et réapparaîtront au bout de 90 secondes.
3605après un avertissement de 2 minutes. Tous les résidents présents dans la région seront déconnectés. Les données de la région seront sauvegardées, et celle-ci
3606sera à nouveau accessible d&apos;ici 90 secondes.
3607 3500
3608Le redémarrage d&apos;une région ne règle pas la plupart des 3501Le redémarrage la région ne permet pas de résoudre la plupart des problèmes de performance. Les redémarrages ne doivent avoir lieu que si cela est vraiment nécessaire.
3609problèmes de performance, et doit être utilisé seulement lorsque nécessaire.
3610 </message> 3502 </message>
3611 </alert> 3503 </alert>
3612 <alert name="HelpRegionWaterHeight" title="Niveau de l&apos;eau"> 3504 <alert name="HelpRegionWaterHeight" title="Niveau de l&apos;eau">
3613 <message name="message"> 3505 <message name="message">
3614 Ceci est la hauteur en mètres du niveau d&apos;apparition de l&apos;eau. Si 3506 Il s&apos;agit de la hauteur de l&apos;eau en mètres.
3615cette valeur est différente de 20 et que vous avez de l&apos;eau adjacente au bord du monde ou dans 3507Si ce paramètre est différent de 20 et que vous avez de l&apos;eau adjacente au bord du monde ou de l&apos;eau « vide », il y aura un espace vide visible.
3616le &apos;vide&apos;, un espace sera visible. 3508
3617 3509
3618Défaut : 20 3510Défaut : 20
3619 </message> 3511 </message>
3620 </alert> 3512 </alert>
3621 <alert name="HelpRegionTerrainRaise" title="Rehausser relief"> 3513 <alert name="HelpRegionTerrainRaise" title="Surélévation du terrain">
3622 <message name="message"> 3514 <message name="message">
3623 Les propriétaires de parcelles peuvent élever le relief de cette distance 3515 Il s&apos;agit de la distance (en mètres) à laquelle les propriétaires de parcelle peuvent surélever leur terrain, par rapport au terrain « figé » dont la hauteur est fixée par défaut.
3624par rapport à la hauteur par défaut du relief figé.
3625 3516
3626Défaut : 4 3517Défaut : 4
3627 </message> 3518 </message>
3628 </alert> 3519 </alert>
3629 <alert name="HelpRegionTerrainLower" title="Abaisser relief"> 3520 <alert name="HelpRegionTerrainLower" title="Abaisser le terrain">
3630 <message name="message"> 3521 <message name="message">
3631 Les propriétaires de parcelles peuvent abaisser le relief de cette distance 3522 Il s&apos;agit de la distance (en mètres) à laquelle les propriétaires de parcelle peuvent abaisser leur terrain, par rapport au terrain « figé » dont la hauteur est fixée par défaut.
3632par rapport à la hauteur par défaut du relief figé.
3633 3523
3634Défaut : -4 3524Défaut : -4
3635 </message> 3525 </message>
3636 </alert> 3526 </alert>
3637 <alert name="HelpRegionUploadRaw" title="Uploader relief au format RAW..."> 3527 <alert name="HelpRegionUploadRaw" title="Charger le terrain au format RAW">
3638 <message name="message"> 3528 <message name="message">
3639 Ce bouton permet de charger un fichier .RAW dans la région où vous vous trouvez. 3529 Ce bouton permet de charger un fichier .RAW dans la région où vous vous trouvez.
3640Ce fichier doit avoir les bonnes dimensions (RGB, 256 x 256) et 13 canaux. Le meilleur moyen de créer un fichier terrain est de télécharger le fichier RAW existant. Un bon moyen est de modifier le canal rouge (hauteur terrain) et de le charger. 3530Ce fichier doit avoir les bonnes dimensions (RGB, 256 x 256) et 13 canaux. Le meilleur moyen de créer un fichier terrain est de télécharger le fichier RAW existant. Un bon moyen est de modifier le canal rouge (hauteur terrain) et de le charger.
@@ -3644,113 +3534,77 @@ Le chargement peut prendre jusqu&apos;à 45 secondes. Veuillez noter que le char
3644Pour en savoir plus sur la modification de la hauteur des terrains d&apos;une région, consultez l&apos;Aide F1. 3534Pour en savoir plus sur la modification de la hauteur des terrains d&apos;une région, consultez l&apos;Aide F1.
3645 </message> 3535 </message>
3646 </alert> 3536 </alert>
3647 <alert name="HelpRegionDownloadRaw" title="Télécharger un relief au format RAW"> 3537 <alert name="HelpRegionDownloadRaw" title="Télécharger le terrain au format RAW">
3648 <message name="message"> 3538 <message name="message">
3649 Ce bouton télécharge un fichier contenant les données de hauteur, 3539 Ce bouton permet de télécharger un fichier contenant les données relatives à la hauteur du terrain, dimensions de la parcelle, les mises en vente ainsi que certaines permissions relatives à la parcelle pour cette région. Lorsque vous ouvrez le fichier avec un programme tel que Photoshop, vous devez indiquer les dimensions du document qui sont les suivantes : RGB, 256 x 256 avec 13 canaux. Le fichier terrain ne peut pas être ouvert différemment.
3650les dimensions de la parcelle, le statut de parcelles mises en vente et quelques
3651autorisations pour cette région. Si vous ouvrez ce fichier à l&apos;aide d&apos;un programme comme
3652Photoshop, vous devrez préciser les dimensions du document :
3653RVB, 256x256 avec 13 canaux. Ce fichier de relief ne peut
3654être ouvert autrement.
3655 3540
3656Pour plus d&apos;informations sur les champs de hauteur, allez sur : 3541Pour en savoir plus sur la modification de la hauteur des terrains d&apos;une région, consultez l&apos;Aide F1.
3657http://secondlife.com/tiki/tiki-index.php?page=RawTerrainFile
3658 </message> 3542 </message>
3659 </alert> 3543 </alert>
3660 <alert name="HelpRegionUseEstateSun" title="Utiliser soleil du domaine"> 3544 <alert name="HelpRegionUseEstateSun" title="Utiliser le soleil du domaine">
3661 <message name="message"> 3545 <message name="message">
3662 Cette option définit la position du soleil de votre région 3546 Si vous cochez cette case, la position du soleil dans cette région sera la même que dans le reste du domaine.
3663sur celle du soleil dans le reste du domaine.
3664 3547
3665Défaut : activé 3548Défaut : activé
3666 </message> 3549 </message>
3667 </alert> 3550 </alert>
3668 <alert name="HelpRegionFixedSun" title="Soleil fixe"> 3551 <alert name="HelpRegionFixedSun" title="Soleil fixe">
3669 <message name="message"> 3552 <message name="message">
3670 Cette option définit la position du soleil 3553 Si vous cochez cette case, la position du soleil se fixe sur celle du curseur Phase et le soleil arrête de bouger.
3671sur celle du curseur de Phase et fige le soleil.
3672 3554
3673Défaut : désactivé 3555Défaut : désactivé
3674 </message> 3556 </message>
3675 </alert> 3557 </alert>
3676 <alert name="HelpRegionBakeTerrain" title="Figer Relief"> 3558 <alert name="HelpRegionBakeTerrain" title="Figer le terrain">
3677 <message name="message"> 3559 <message name="message">
3678 Ce bouton sauvegarde la forme actuelle du relief comme nouvelle valeur 3560 Ce bouton permet d&apos;enregistrer la forme actuelle du terrain comme nouvelle forme par défaut pour la région. Une fois figé, le terrain peut reprendre la forme enregistrée à partir de l&apos;option Rétablir le terrain à la section Modifer le terrain. Le terrain figé est aussi le point de référence pour les limites de surélévation et d&apos;abaissement.
3679par défaut pour la région. Une fois figé, le terrain peut être ramené
3680à sa forme par défaut en utilisant l&apos;outil &quot;Annuler Modifications&quot; dans
3681le menu Modifier Relief. Le relief figé est également le point central
3682qui fixe les limites d&apos;abaissement/réhaussement du relief.
3683 </message> 3561 </message>
3684 </alert> 3562 </alert>
3685 <alert name="HelpEstateEstateManager" title="Administrateurs du domaine"> 3563 <alert name="HelpEstateEstateManager" title="Gérants du domaine">
3686 <message name="message"> 3564 <message name="message">
3687 Un administrateur de domaine est un résident à qui vous déléguez 3565 Un gérant de domaine est un résident chargé du contrôle de la région et des paramètres du domaine. Un gérant de domaine peut modifier tous les paramètres, mais ne peut pas charger, télécharger ni figer de terrain. Un des pouvoirs principaux du gérant est de bannir ou d&apos;autoriser un résident sur votre domaine.
3688le contrôle de la région et le paramétrage du domaine. Un administrateur de domaine
3689peut modifier tous les paramètres à l&apos;aide de ces contrôles, sauf uploader,
3690télécharger, et fondre le relief. Ils peuvent notamment
3691autoriser ou bannir des résidents de votre domaine.
3692 3566
3693Les administrateurs de domaines ne peuvent être ajoutés ou retirés 3567Seuls les propriétaires de domaine peuvent ajouter ou supprimer des gérants de domaine. Lorsque vous choisissez un gérant de domaine, prenez un résident en qui vous avez confiance car vous serez en quelque sorte responsable de ses actions.
3694que par le propriétaire du domaine. Ne choisissez comme administrateurs que des
3695résidents en qui vous avez totale confiance, car vous serez
3696responsables de leurs actes.
3697 </message> 3568 </message>
3698 </alert> 3569 </alert>
3699 <alert name="HelpEstateUseGlobalTime" title="Utiliser l&apos;heure globale"> 3570 <alert name="HelpEstateUseGlobalTime" title="Utiliser le temps universel">
3700 <message name="message"> 3571 <message name="message">
3701 Cette option cale la position du soleil de votre domaine 3572 Cette case permet au soleil de votre domaine de suivre la position du soleil sur les domaines Linden du continent.
3702sur celle du soleil des domaines appartenant aux Linden&apos;
3703sur le &apos;continent&apos;.
3704 3573
3705Défaut : activé 3574Défaut : activé
3706 </message> 3575 </message>
3707 </alert> 3576 </alert>
3708 <alert name="HelpEstateFixedSun" title="Soleil fixe"> 3577 <alert name="HelpEstateFixedSun" title="Soleil fixe">
3709 <message name="message"> 3578 <message name="message">
3710 Cette option définit la position du soleil 3579 Si vous cochez cette case, la position du soleil se fixe sur celle du curseur Phase et le soleil arrête de bouger.
3711sur celle du curseur de Phase et fige le soleil.
3712 </message> 3580 </message>
3713 </alert> 3581 </alert>
3714 <alert name="HelpEstateExternallyVisible" title="Visible depuis le continent"> 3582 <alert name="HelpEstateExternallyVisible" title="Accès public">
3715 <message name="message"> 3583 <message name="message">
3716 Définit si les résidents qui se trouvent sur des domaines du Continent (appartenant aux Linden) 3584 Cette option vous permet de choisir quels résidents d&apos;autres domaines peuvent pénétrer sur votre domaine sans devoir être ajoutés à la liste d&apos;accès.
3717peuvent voir votre domaine sur la carte du monde.
3718 3585
3719Défaut : activé 3586Défaut : activé
3720 </message> 3587 </message>
3721 </alert> 3588 </alert>
3722 <alert name="HelpEstateAllowDirectTeleport" title="Autoriser téléportation directe"> 3589 <alert name="HelpEstateAllowDirectTeleport" title="Autoriser la téléportation directe">
3723 <message name="message"> 3590 <message name="message">
3724 Activé, permet aux résidents de se téléporter directement vers n&apos;importe quel 3591 Lorsqu&apos;elle est cochée, cette option permet aux résidents d&apos;être téléporté à n&apos;importe quel endroit sur votre domaine. Lorsque cette option n&apos;est pas cochée, les résidents sont téléportés au téléhub le plus proche.
3725point de votre domaine. Désactivé, les résidents se téléportent
3726vers le téléport le plus proche.
3727 3592
3728Défaut : désactivé 3593Défaut : désactivé
3729 </message> 3594 </message>
3730 </alert> 3595 </alert>
3731 <alert name="HelpEstateAllowResident" title="Autoriser l&apos;accès"> 3596 <alert name="HelpEstateAllowResident" title="Autoriser l&apos;accès">
3732 <message name="message"> 3597 <message name="message">
3733 Si un résident figure dans cette liste, l&apos;accès au domaine sera 3598 L&apos;accès à ce domaine sera réservé aux résidents figurant dans cette liste et aux groupes ci-dessous.
3734limité aux résidents de la liste et aux groupes affichés ci-dessous. 3599 Cette option n&apos;est disponible que lorsque la case Accès public est décochée.
3735
3736(Si le domaine est visible depuis le continent, l&apos;accès ne peut être
3737limité à une liste de résidents ou de groupes. Cette option sera
3738désactivée. Seule la liste noire sera prise en compte.)
3739 </message> 3600 </message>
3740 </alert> 3601 </alert>
3741 <alert name="HelpEstateAllowGroup" title="Autoriser l&apos;accès au groupe"> 3602 <alert name="HelpEstateAllowGroup" title="Autoriser l&apos;accès de groupe">
3742 <message name="message"> 3603 <message name="message">
3743 Si un groupe figure dans cette liste, l&apos;accès au domaine sera 3604 L&apos;accès à ce domaine sera réservé aux groupes figurant dans cette liste et aux résidents ci-dessous. Cette option n&apos;est disponible que lorsque la case Accès public est décochée.
3744limité aux groupes de la liste et aux résidents nommément
3745autorisés ci-dessus.
3746
3747(Si le domaine est visible depuis le continent, l&apos;accès ne peut être
3748limité à une liste de résidents ou de groupes. Cette option sera
3749désactivée. Seule la liste noire sera prise en compte.)
3750 </message> 3605 </message>
3751 </alert> 3606 </alert>
3752 <alert name="HelpEstateAbuseEmailAddress" 3607 <alert name="HelpEstateAbuseEmailAddress" title="Adresse e-mail où signaler une infraction">
3753 title="Adresse e-mail où signaler une infraction">
3754 <message name="message"> 3608 <message name="message">
3755 Si vous utilisez une adresse e-mail valide, les rapports d&apos;infraction de ce domaine iront à cette adresse. 3609 Si vous utilisez une adresse e-mail valide, les rapports d&apos;infraction de ce domaine iront à cette adresse.
3756Si vous laissez ce champ vide, les rapports d&apos;infraction seront envoyés à Linden Lab uniquement. 3610Si vous laissez ce champ vide, les rapports d&apos;infraction seront envoyés à Linden Lab uniquement.
@@ -3758,11 +3612,7 @@ Si vous laissez ce champ vide, les rapports d&apos;infraction seront envoyés à
3758 </alert> 3612 </alert>
3759 <alert name="HelpEstateBanResident" title="Refuser l&apos;accès"> 3613 <alert name="HelpEstateBanResident" title="Refuser l&apos;accès">
3760 <message name="message"> 3614 <message name="message">
3761 Les résidents figurant sur cette liste n&apos;ont pas accès à votre domaine, 3615 Les résidents figurant sur cette liste ne peuvent pas pénétrer sur votre domaine, quels que soient les autres paramètres.
3762quels que soient les réglages d&apos;autorisations ou de groupe ci-dessus.
3763
3764Ajouter un résident à cette liste le retirera de
3765la liste des personnes autorisées.
3766 </message> 3616 </message>
3767 </alert> 3617 </alert>
3768 <alert name="HelpEstateVoiceChat" title="Autoriser les chats vocaux"> 3618 <alert name="HelpEstateVoiceChat" title="Autoriser les chats vocaux">
@@ -3777,7 +3627,7 @@ Défaut : désactivé
3777 Cette version de Second Life n&apos;est pas compatible avec la fonctionnalité de chat vocal dans cette région. Vous devez mettre à jour Second Life pour que le chat vocal fonctionne correctement. 3627 Cette version de Second Life n&apos;est pas compatible avec la fonctionnalité de chat vocal dans cette région. Vous devez mettre à jour Second Life pour que le chat vocal fonctionne correctement.
3778 </message> 3628 </message>
3779 </alert> 3629 </alert>
3780 <alert name="HelpEstateCovenant" title="Clause de sauvegarde du domaine"> 3630 <alert name="HelpEstateCovenant" title="Règlement du domaine">
3781 <message name="message"> 3631 <message name="message">
3782 Définir un règlement pour le domaine vous permet de vendre les parcelles de ce domaine. S&apos;il n&apos;y a pas de règlement, vous ne pouvez pas vendre le terrain. Si vous ne souhaitez pas indiquer de règlement ou donner de conseils aux acheteurs, laissez la section relative au règlement vide. 3632 Définir un règlement pour le domaine vous permet de vendre les parcelles de ce domaine. S&apos;il n&apos;y a pas de règlement, vous ne pouvez pas vendre le terrain. Si vous ne souhaitez pas indiquer de règlement ou donner de conseils aux acheteurs, laissez la section relative au règlement vide.
3783 3633
@@ -3792,22 +3642,22 @@ L&apos;acheteur est tenu d&apos;accepter le règlement en cochant une case avan
3792Veuillez sélectionner un seul objet et recommencez. 3642Veuillez sélectionner un seul objet et recommencez.
3793 </message> 3643 </message>
3794 </alert> 3644 </alert>
3795 <alert name="BuyObjectOneOwner" title="Achat des objets impossible"> 3645 <alert name="BuyObjectOneOwner" title="Impossible d&apos;acheter des objets">
3796 <message name="message"> 3646 <message name="message">
3797 Vous ne pouvez acheter des objets à plusieurs personnes en même temps. 3647 Impossible d&apos;acheter simultanément des objets de propriétaires différents.
3798Veuillez sélectionner un seul objet et réessayez. 3648Veuillez ne sélectionner qu&apos;un seul objet.
3799 </message> 3649 </message>
3800 </alert> 3650 </alert>
3801 <alert name="BuyContentsOneOnly" title="Achat du contenu impossible"> 3651 <alert name="BuyContentsOneOnly" title="Impossible d&apos;acheter des contenus">
3802 <message name="message"> 3652 <message name="message">
3803 Impossible d&apos;acheter le contenu de plus d&apos;un objet à la fois. 3653 Impossible d&apos;acheter les contenus de plus d&apos;un objet à la fois.
3804Veuillez sélectionner un seul objet et recommencez. 3654Veuillez ne sélectionner qu&apos;un seul objet.
3805 </message> 3655 </message>
3806 </alert> 3656 </alert>
3807 <alert name="BuyContentsOneOwner" title="Achat du contenu impossible"> 3657 <alert name="BuyContentsOneOwner" title="Impossible d&apos;acheter des contenus">
3808 <message name="message"> 3658 <message name="message">
3809 Vous ne pouvez acheter des objets à plusieurs personnes en même temps. 3659 Impossible d&apos;acheter simultanément des objets de propriétaires différents.
3810Veuillez sélectionner un seul objet et réessayez. 3660Veuillez ne sélectionner qu&apos;un seul objet.
3811 </message> 3661 </message>
3812 </alert> 3662 </alert>
3813 <alert name="PermYes"> 3663 <alert name="PermYes">
@@ -3822,15 +3672,15 @@ Veuillez sélectionner un seul objet et réessayez.
3822 </alert> 3672 </alert>
3823 <alert name="BuyOriginal"> 3673 <alert name="BuyOriginal">
3824 <message name="message"> 3674 <message name="message">
3825 Acheter objet original à [OWNER] pour L$[PRICE] ? 3675 Acheter l&apos;objet original pour [PRICE] L$ à [PRICE] ?
3826Vous deviendrez propriétaire de l&apos;objet. 3676Vous deviendrez le propriétaire de cet objet.
3827Vous pourrez : 3677Vous pourrez :
3828 Le modifier : [MODIFYPERM] 3678 Modifier : [MODIFYPERM]
3829 Le copier : [COPYPERM] 3679 Copier : [COPYPERM]
3830 Le revendre ou le donner : [RESELLPERM] 3680 Revendre ou donner : [RESELLPERM]
3831 </message> 3681 </message>
3832 <option name="Buy"> 3682 <option name="Buy">
3833 Acheter 3683 OK
3834 </option> 3684 </option>
3835 <option name="Cancel"> 3685 <option name="Cancel">
3836 Annuler 3686 Annuler
@@ -3838,15 +3688,15 @@ Vous pourrez :
3838 </alert> 3688 </alert>
3839 <alert name="BuyOriginalNoOwner"> 3689 <alert name="BuyOriginalNoOwner">
3840 <message name="message"> 3690 <message name="message">
3841 Acheter objet original pour L$[PRICE] ? 3691 Acheter l&apos;objet original pour [PRICE] L$ ?
3842Vous deviendrez propriétaire de l&apos;objet. 3692Vous deviendrez le propriétaire de cet objet.
3843Vous pourrez : 3693Vous pourrez :
3844 Le modifier : [MODIFYPERM] 3694 Modifier : [MODIFYPERM]
3845 Le copier : [COPYPERM] 3695 Copier : [COPYPERM]
3846 Le revendre ou le donner : [RESELLPERM] 3696 Revendre ou donner : [RESELLPERM]
3847 </message> 3697 </message>
3848 <option name="Buy"> 3698 <option name="Buy">
3849 Acheter 3699 OK
3850 </option> 3700 </option>
3851 <option name="Cancel"> 3701 <option name="Cancel">
3852 Annuler 3702 Annuler
@@ -3854,15 +3704,15 @@ Vous pourrez :
3854 </alert> 3704 </alert>
3855 <alert name="BuyCopy"> 3705 <alert name="BuyCopy">
3856 <message name="message"> 3706 <message name="message">
3857 Acheter une copie à [OWNER] pour L$[PRICE] ? 3707 Acheter une copie pour [PRICE] L$ à [OWNER] ?
3858L&apos;objet sera copié vers votre inventaire. 3708L&apos;objet sera copié dans votre inventaire.
3859Vous pourrez : 3709Vous pourrez :
3860 Le modifier : [MODIFYPERM] 3710 Modifier : [MODIFYPERM]
3861 Le copier : [COPYPERM] 3711 Copier : [COPYPERM]
3862 Le revendre ou le donner : [RESELLPERM] 3712 Revendre ou donner : [RESELLPERM]
3863 </message> 3713 </message>
3864 <option name="Buy"> 3714 <option name="Buy">
3865 Acheter 3715 OK
3866 </option> 3716 </option>
3867 <option name="Cancel"> 3717 <option name="Cancel">
3868 Annuler 3718 Annuler
@@ -3870,15 +3720,15 @@ Vous pourrez :
3870 </alert> 3720 </alert>
3871 <alert name="BuyCopyNoOwner"> 3721 <alert name="BuyCopyNoOwner">
3872 <message name="message"> 3722 <message name="message">
3873 Acheter une copie pour L$[PRICE] ? 3723 Acheter une copie pour [PRICE] L$ ?
3874L&apos;objet sera copié vers votre inventaire. 3724L&apos;objet sera copié dans votre inventaire.
3875Vous pourrez : 3725Vous pourrez :
3876 Le modifier : [MODIFYPERM] 3726 Modifier : [MODIFYPERM]
3877 Le copier : [COPYPERM] 3727 Copier : [COPYPERM]
3878 Le revendre ou le donner : [RESELLPERM] 3728 Revendre ou donner : [RESELLPERM]
3879 </message> 3729 </message>
3880 <option name="Buy"> 3730 <option name="Buy">
3881 Acheter 3731 OK
3882 </option> 3732 </option>
3883 <option name="Cancel"> 3733 <option name="Cancel">
3884 Annuler 3734 Annuler
@@ -3886,11 +3736,11 @@ Vous pourrez :
3886 </alert> 3736 </alert>
3887 <alert name="BuyContents"> 3737 <alert name="BuyContents">
3888 <message name="message"> 3738 <message name="message">
3889 Acheter le contenu à [OWNER] pour L$[PRICE] ? 3739 Acheter des contenus pour [PRICE] L$ à [OWNER] ?
3890Il sera copié vers votre inventaire. 3740Ils seront copiés dans votre inventaire.
3891 </message> 3741 </message>
3892 <option name="Buy"> 3742 <option name="Buy">
3893 Acheter 3743 OK
3894 </option> 3744 </option>
3895 <option name="Cancel"> 3745 <option name="Cancel">
3896 Annuler 3746 Annuler
@@ -3898,11 +3748,11 @@ Il sera copié vers votre inventaire.
3898 </alert> 3748 </alert>
3899 <alert name="BuyContentsNoOwner"> 3749 <alert name="BuyContentsNoOwner">
3900 <message name="message"> 3750 <message name="message">
3901 Acheter le contenu pour L$[PRICE] ? 3751 Acheter des contenus pour [PRICE] L$ ?
3902Il sera copié vers votre inventaire. 3752Ils seront copiés dans votre inventaire.
3903 </message> 3753 </message>
3904 <option name="Buy"> 3754 <option name="Buy">
3905 Acheter 3755 OK
3906 </option> 3756 </option>
3907 <option name="Cancel"> 3757 <option name="Cancel">
3908 Annuler 3758 Annuler
@@ -3910,14 +3760,13 @@ Il sera copié vers votre inventaire.
3910 </alert> 3760 </alert>
3911 <alert name="ConfirmPurchase"> 3761 <alert name="ConfirmPurchase">
3912 <message name="message"> 3762 <message name="message">
3913 Cette transaction entraînera : 3763 Suite à cette transaction, vous allez :
3914
3915[ACTION] 3764[ACTION]
3916 3765
3917Etes-vous sûr(e) de vouloir poursuivre cet achat ? 3766Êtes-vous certain de vouloir effectuer cette transaction ?
3918 </message> 3767 </message>
3919 <option name="Confirm"> 3768 <option name="Confirm">
3920 Confirmer 3769 OK
3921 </option> 3770 </option>
3922 <option name="Cancel"> 3771 <option name="Cancel">
3923 Annuler 3772 Annuler
@@ -3925,15 +3774,14 @@ Etes-vous sûr(e) de vouloir poursuivre cet achat ?
3925 </alert> 3774 </alert>
3926 <alert name="ConfirmPurchasePassword"> 3775 <alert name="ConfirmPurchasePassword">
3927 <message name="message"> 3776 <message name="message">
3928 Cette transaction entraînera : 3777 Suite à cette transaction, vous allez :
3929
3930[ACTION] 3778[ACTION]
3931 3779
3932Etes-vous sûr(e) de vouloir poursuivre cet achat ? 3780Êtes-vous certain de vouloir effectuer cette transaction ?
3933Veuillez saisir à nouveau votre mot de passe et cliquez sur &apos;Confirmer&apos;. 3781Veuillez saisir à nouveau votre mot de passe et cliquer sur OK.
3934 </message> 3782 </message>
3935 <option name="ConfirmPurchase"> 3783 <option name="ConfirmPurchase">
3936 Confirmer votre achat 3784 OK
3937 </option> 3785 </option>
3938 <option name="Cancel"> 3786 <option name="Cancel">
3939 Annuler 3787 Annuler
@@ -3941,10 +3789,8 @@ Veuillez saisir à nouveau votre mot de passe et cliquez sur &apos;Confirmer&apo
3941 </alert> 3789 </alert>
3942 <alert name="SetPickLocation"> 3790 <alert name="SetPickLocation">
3943 <message name="message"> 3791 <message name="message">
3944 Note : 3792 Remarque :
3945Vous avez mis à jour la position 3793Vous avez mis à jour l&apos;emplacement de ce favori mais les autres détails resteront inchangés.
3946de ce lieu mais les autres détails
3947conserveront leurs valeurs initiales.
3948 </message> 3794 </message>
3949 <option name="OK"> 3795 <option name="OK">
3950 OK 3796 OK
@@ -3952,47 +3798,42 @@ conserveront leurs valeurs initiales.
3952 </alert> 3798 </alert>
3953 <alert name="MoveInventoryFromObject"> 3799 <alert name="MoveInventoryFromObject">
3954 <message name="message"> 3800 <message name="message">
3955 Vous avez sélectionné des éléments d&apos;inventaire non copiables. 3801 Vous avez sélectionné des objets de l&apos;inventaire qui ne peuvent pas être copiés.
3956Ces éléments seront déplacés vers votre inventaire, et non copiés. 3802Ces objets seront déplacés vers votre inventaire, et non pas copiés.
3957 3803
3958Déplacer l(es) élément(s)? 3804Déplacer les objets de l&apos;inventaire ?
3959 </message> 3805 </message>
3960 <ignore name="ignore"> 3806 <ignore name="ignore">
3961 Lors du transfert d&apos;un inventaire non reproductible depuis des objets 3807 Lors du transfert d&apos;un inventaire non reproductible depuis des objets
3962 </ignore> 3808 </ignore>
3963 <option name="Move"> 3809 <option name="Move">
3964 Se déplacer 3810 OK
3965 </option> 3811 </option>
3966 <option name="Don&apos;tMove"> 3812 <option name="Don&apos;tMove">
3967 Ne pas bouger 3813 Annuler
3968 </option> 3814 </option>
3969 </alert> 3815 </alert>
3970 <alert name="MoveInventoryFromScriptedObject"> 3816 <alert name="MoveInventoryFromScriptedObject">
3971 <message name="message"> 3817 <message name="message">
3972 Vous avez sélectionné des éléments d&apos;inventaire non copiables. Ces éléments 3818 Vous avez sélectionné des objets de l&apos;inventaire qui ne peuvent pas être copiés. Ces objets seront déplacés vers votre inventaire, et non pas copiés.
3973seront déplacés vers votre inventaire, et non copiés. 3819Étant donné que l&apos;objet est
3820scripté, déplacer ces objets vers votre inventaire risque de causer des problèmes au niveau du script.
3974 3821
3975Cet objet étant scripté, le déplacement de ces éléments vers 3822Déplacer les objets de l&apos;inventaire ?
3976votre inventaire risque de perturber le fonctionnement du script.
3977
3978Déplacer l(es) élément(s) d&apos;inventaire ?
3979 </message> 3823 </message>
3980 <ignore name="ignore"> 3824 <ignore name="ignore">
3981 Lors du transfert d&apos;un inventaire non reproductible depuis des objets scriptés 3825 Lors du transfert d&apos;un inventaire non reproductible depuis des objets scriptés
3982 </ignore> 3826 </ignore>
3983 <option name="Move"> 3827 <option name="Move">
3984 Se déplacer 3828 OK
3985 </option> 3829 </option>
3986 <option name="Don&apos;tMove"> 3830 <option name="Don&apos;tMove">
3987 Ne pas bouger 3831 Annuler
3988 </option> 3832 </option>
3989 </alert> 3833 </alert>
3990 <alert name="ClickActionNotPayable"> 3834 <alert name="ClickActionNotPayable">
3991 <message name="message"> 3835 <message name="message">
3992 Avertissement : l&apos;action &quot;Payer Objet&quot; a été définie, mais elle 3836 Avertissement : l&apos;action du clic Payer l&apos;objet a été défini mais ne fonctionnera que si un script est ajouté avec l&apos;event money().
3993ne fonctionnera que si un script de transaction money() y est ajouté,
3994car les résidents s&apos;attendent à ce que les objets
3995réagissent lorsqu&apos;un paiement est effectué.
3996 </message> 3837 </message>
3997 <ignore name="ignore"> 3838 <ignore name="ignore">
3998 Lors du paramétrage de la fonction Payer sur des objets sans événement monétaire 3839 Lors du paramétrage de la fonction Payer sur des objets sans événement monétaire
@@ -4000,7 +3841,7 @@ réagissent lorsqu&apos;un paiement est effectué.
4000 </alert> 3841 </alert>
4001 <alert name="OpenObjectCannotCopy"> 3842 <alert name="OpenObjectCannotCopy">
4002 <message name="message"> 3843 <message name="message">
4003 Cet objet ne contient aucun élément copiable. 3844 Vous n&apos;êtes autorisé à copier aucun élément dans cet objet.
4004 </message> 3845 </message>
4005 </alert> 3846 </alert>
4006 <alert name="ClickOpenF1Help"> 3847 <alert name="ClickOpenF1Help">
@@ -4033,7 +3874,7 @@ réagissent lorsqu&apos;un paiement est effectué.
4033 </alert> 3874 </alert>
4034 <alert name="ConfirmQuit"> 3875 <alert name="ConfirmQuit">
4035 <message name="message"> 3876 <message name="message">
4036 Etes-vous sûr(e) de vouloir quitter? 3877 Êtes-vous certain de vouloir continuer ?
4037 </message> 3878 </message>
4038 <ignore name="ignore"> 3879 <ignore name="ignore">
4039 Lorsque vous quittez Second Life 3880 Lorsque vous quittez Second Life
@@ -4059,7 +3900,7 @@ http://secondlife.com/community/blotter.php
4059 </alert> 3900 </alert>
4060 <alert name="HelpReportAbuseEmailEO"> 3901 <alert name="HelpReportAbuseEmailEO">
4061 <message name="message"> 3902 <message name="message">
4062 Important : Ce rapport ira au propriétaire de la 3903 Important : ce rapport ira au propriétaire de la
4063région dans laquelle vous êtes et non à Linden Lab. 3904région dans laquelle vous êtes et non à Linden Lab.
4064 3905
4065Pour aider les résidents et les visiteurs, le propriétaire de 3906Pour aider les résidents et les visiteurs, le propriétaire de
@@ -4078,64 +3919,68 @@ ne sera pas affecté par les résultats de cette enquête. Seul Linden Lab peut
4078interdire l&apos;accès à l&apos;ensemble de Second Life. 3919interdire l&apos;accès à l&apos;ensemble de Second Life.
4079 </message> 3920 </message>
4080 </alert> 3921 </alert>
3922 <alert name="HelpReportBug">
3923 <message name="message">
3924 N&apos;utilisez cet outil que pour signaler des problèmes techniques et soyez aussi précis que possible.
3925Vous pouvez répondre à l&apos;e-mail automatique pour ajouter des détails à votre rapport.
3926
3927Tous les bugs signalés sont reproduits et évalués. Aucune réponse ne sera envoyée par e-mail.
3928
3929Si vous avez un problème technique, veuillez contacter le service clientèle à :
3930
3931http://secondlife.com/community/support.php
3932
3933Remarque : les rapports incomplets ne feront pas l&apos;objet d&apos;une enquête.
3934 </message>
3935 </alert>
4081 <alert name="HelpReportAbuseSelectCategory"> 3936 <alert name="HelpReportAbuseSelectCategory">
4082 <message name="message"> 3937 <message name="message">
4083 Veuillez choisir une catégorie pour ce rapport d&apos;abus. 3938 Veuillez choisir une catégorie pour ce rapport d&apos;infraction.
4084 3939Le choix d&apos;une catégorie nous permet de traiter les rapports d&apos;infraction plus rapidement.
4085Le choix d&apos;une catégorie nous permet de classer et traiter efficacement les rapports d&apos;abus.
4086 </message> 3940 </message>
4087 </alert> 3941 </alert>
4088 <alert name="HelpReportBugSelectCategory"> 3942 <alert name="HelpReportBugSelectCategory">
4089 <message name="message"> 3943 <message name="message">
4090 Veuillez choisir une catégorie pour ce bug. 3944 Veuillez choisir une catégorie pour ce bug.
4091 3945Le choix d&apos;une catégorie nous permet de traiter les bugs plus rapidement.
4092Le choix d&apos;une catégorie nous permet de classer et traiter efficacement les rapports de bugs.
4093 </message> 3946 </message>
4094 </alert> 3947 </alert>
4095 <alert name="HelpReportAbuseAbuserNameEmpty"> 3948 <alert name="HelpReportAbuseAbuserNameEmpty">
4096 <message name="message"> 3949 <message name="message">
4097 Veuillez saisir le nom de la personne responsable de l&apos;abus. 3950 Veuillez saisir le nom du contrevenant.
4098 3951Lorsque nous avons le nom du contrevenant, nous sommes en mesure de traiter les rapports plus rapidement.
4099La précision des données nous permet de classer et traiter efficacement les rapports d&apos;abus.
4100 </message> 3952 </message>
4101 </alert> 3953 </alert>
4102 <alert name="HelpReportAbuseAbuserLocationEmpty"> 3954 <alert name="HelpReportAbuseAbuserLocationEmpty">
4103 <message name="message"> 3955 <message name="message">
4104 Veuillez saisir le lieu où s&apos;est produit l&apos;abus constaté. 3956 Veuillez indiquer l&apos;endroit où l&apos;infraction a eu lieu.
4105 3957Les informations précises et exactes nous permettent de traiter les rapports plus rapidement.
4106La précision des données nous permet de classer et traiter efficacement les rapports d&apos;abus.
4107 </message> 3958 </message>
4108 </alert> 3959 </alert>
4109 <alert name="HelpReportAbuseSummaryEmpty"> 3960 <alert name="HelpReportAbuseSummaryEmpty">
4110 <message name="message"> 3961 <message name="message">
4111 Veuillez saisir un résumé de l&apos;abus constaté. 3962 Veuillez saisir un récapitulatif de l&apos;infraction.
4112 3963Les récapitulatifs précis nous permettent de traiter les rapports plus rapidement.
4113Un résumé précis nous permet de classer et traiter efficacement les rapports d&apos;abus.
4114 </message> 3964 </message>
4115 </alert> 3965 </alert>
4116 <alert name="HelpReportBugSummaryEmpty"> 3966 <alert name="HelpReportBugSummaryEmpty">
4117 <message name="message"> 3967 <message name="message">
4118 Veuillez saisir un résumé du bug constaté. 3968 Veuillez saisir un récapitulatif du bug.
4119 3969Les récapitulatifs précis nous permettent de résoudre les bugs plus rapidement.
4120Un résumé précis nous permet de classer et traiter efficacement les rapports de bugs.
4121 </message> 3970 </message>
4122 </alert> 3971 </alert>
4123 <alert name="HelpReportAbuseDetailsEmpty"> 3972 <alert name="HelpReportAbuseDetailsEmpty">
4124 <message name="message"> 3973 <message name="message">
4125 Veuillez saisir une description précise de l&apos;abus constaté. 3974 Veuillez saisir une description détaillée de l&apos;infraction.
4126Soyez aussi précis(e) que possible, en indiquant les noms et les détails 3975Soyez aussi précis que possible et essayez de fournir des noms ainsi que des détails sur l&apos;incident que vous signalez.
4127de l&apos;incident. 3976Les descriptions précises nous permettent de traiter les rapports plus rapidement.
4128
4129Une description précise nous permet de classer et traiter efficacement les rapports d&apos;abus.
4130 </message> 3977 </message>
4131 </alert> 3978 </alert>
4132 <alert name="HelpReportBugDetailsEmpty"> 3979 <alert name="HelpReportBugDetailsEmpty">
4133 <message name="message"> 3980 <message name="message">
4134 Veuillez saisir une description détaillée du bug. 3981 Veuillez saisir une description détaillée du bug.
4135Soyez aussi précis(e) que possible, en indiquant les étapes pour reproduire le bug 3982Soyez aussi spécifique que possible et essayez d&apos;indiquer les étapes à suivre pour reproduire le bug.
4136si possible. 3983Les descriptions précises nous permettent de résoudre les bugs plus rapidement.
4137
4138Une description précise nous permet de classer et traiter efficacement les rapports de bugs.
4139 </message> 3984 </message>
4140 </alert> 3985 </alert>
4141 <alert name="HelpReportAbuseContainsCopyright"> 3986 <alert name="HelpReportAbuseContainsCopyright">
@@ -4157,50 +4002,47 @@ Linden Lab
4157 </alert> 4002 </alert>
4158 <alert name="FailedRequirementsCheck"> 4003 <alert name="FailedRequirementsCheck">
4159 <message name="message"> 4004 <message name="message">
4160 Les composants nécessaires suivants sont absents de [FLOATER] : 4005 Les composantes requises suivantes ne se trouvent pas dans [FLOATER]:
4161[COMPONENTS] 4006[COMPONENTS]
4162 </message> 4007 </message>
4163 </alert> 4008 </alert>
4164 <alert name="ReplaceAttachment" title="Remplacer attachement existant"> 4009 <alert name="ReplaceAttachment" title="Remplacer la pièce-jointe existante">
4165 <message name="message"> 4010 <message name="message">
4166 Il y a déjà un objet attaché à cette partie du corps. 4011 Vous avez déjà un objet sur cette partie du corps.
4167Voulez-vous le remplacer par l&apos;objet sélectionné ? 4012Voulez-vous le remplacer par l&apos;objet sélectionné ?
4168 </message> 4013 </message>
4169 <ignore name="ignore"> 4014 <ignore name="ignore">
4170 Lors du remplacement de pièces-jointes existantes 4015 Lors du remplacement de pièces-jointes existantes
4171 </ignore> 4016 </ignore>
4172 <option name="Yes"> 4017 <option ignore="Remplacer automatiquement" name="Yes">
4173 Oui 4018 OK
4174 </option> 4019 </option>
4175 <option name="No"> 4020 <option ignore="Ne jamais remplacer" name="No">
4176 Non 4021 Annuler
4177 </option> 4022 </option>
4178 </alert> 4023 </alert>
4179 <alert name="BusyModePay" title="Avertissement de mode occupé"> 4024 <alert name="BusyModePay" title="Réponse si occupé(e)">
4180 <message name="message"> 4025 <message name="message">
4181 Vous êtes en mode Occupé, ce qui signifie que vous 4026 Vous êtes en mode occupé et vous ne recevrez donc aucun objet en échange de ce paiement.
4182ne recevrez aucun objet en échange de
4183ce paiement.
4184 4027
4185Voulez-vous quitter le mode Occupé avant 4028Souhaitez-vous quitter le mode occupé avant de terminer cette transaction ?
4186de finaliser cette transaction ?
4187 </message> 4029 </message>
4188 <ignore name="ignore"> 4030 <ignore name="ignore">
4189 Lorsque vous envoyez de l&apos;argent à une personne en mode Occupé 4031 Lorsque vous envoyez de l&apos;argent à une personne en mode Occupé
4190 </ignore> 4032 </ignore>
4191 <option name="Yes"> 4033 <option ignore="Toujours quitter le mode occupé" name="Yes">
4192 Oui 4034 OK
4193 </option> 4035 </option>
4194 <option name="No"> 4036 <option ignore="Ne jamais quitter le mode occupé" name="No">
4195 Non 4037 Annuler
4196 </option> 4038 </option>
4197 </alert> 4039 </alert>
4198 <alert name="ConfirmEmptyTrash"> 4040 <alert name="ConfirmEmptyTrash">
4199 <message name="message"> 4041 <message name="message">
4200 Etes-vous certain de vouloir supprimer le contenu de votre poubelle de manière permanente  ? 4042 Êtes-vous certain de vouloir supprimer le contenu de votre corbeille de manière permanente  ?
4201 </message> 4043 </message>
4202 <ignore name="ignore"> 4044 <ignore name="ignore">
4203 Lorsque vous videz la poubelle de l&apos;inventaire 4045 Lorsque vous videz la corbeille de l&apos;inventaire
4204 </ignore> 4046 </ignore>
4205 <option name="Yes"> 4047 <option name="Yes">
4206 OK 4048 OK
@@ -4211,7 +4053,7 @@ de finaliser cette transaction ?
4211 </alert> 4053 </alert>
4212 <alert name="ConfirmClearBrowserCache"> 4054 <alert name="ConfirmClearBrowserCache">
4213 <message name="message"> 4055 <message name="message">
4214 Etes-vous certain de vouloir vider le cache de votre navigateur ? 4056 Êtes-vous certain de vouloir vider le cache de votre navigateur ?
4215 </message> 4057 </message>
4216 <option name="Yes"> 4058 <option name="Yes">
4217 Oui 4059 Oui
@@ -4222,7 +4064,7 @@ de finaliser cette transaction ?
4222 </alert> 4064 </alert>
4223 <alert name="ConfirmClearCookies"> 4065 <alert name="ConfirmClearCookies">
4224 <message name="message"> 4066 <message name="message">
4225 Etes-vous certain de vouloir supprimer vos cookies ? 4067 Êtes-vous certain de vouloir supprimer vos cookies ?
4226 </message> 4068 </message>
4227 <option name="Yes"> 4069 <option name="Yes">
4228 Oui 4070 Oui
@@ -4233,7 +4075,7 @@ de finaliser cette transaction ?
4233 </alert> 4075 </alert>
4234 <alert name="ConfirmClearMediaUrlList"> 4076 <alert name="ConfirmClearMediaUrlList">
4235 <message name="message"> 4077 <message name="message">
4236 Etes-vous certain de vouloir supprimer la liste des URL enregistrées ? 4078 Êtes-vous certain de vouloir supprimer la liste des URL enregistrées ?
4237 </message> 4079 </message>
4238 <option name="Yes"> 4080 <option name="Yes">
4239 Oui 4081 Oui
@@ -4244,7 +4086,7 @@ de finaliser cette transaction ?
4244 </alert> 4086 </alert>
4245 <alert name="ConfirmEmptyLostAndFound"> 4087 <alert name="ConfirmEmptyLostAndFound">
4246 <message name="message"> 4088 <message name="message">
4247 Etes-vous certain de vouloir supprimer le contenu de votre dossier Objets trouvés de manière permanente ? 4089 Êtes-vous certain de vouloir supprimer le contenu de votre dossier Objets trouvés de manière permanente ?
4248 </message> 4090 </message>
4249 <ignore name="ignore"> 4091 <ignore name="ignore">
4250 Losque vous videz le dossier Objets trouvés dans vote inventaire 4092 Losque vous videz le dossier Objets trouvés dans vote inventaire
@@ -4258,36 +4100,36 @@ de finaliser cette transaction ?
4258 </alert> 4100 </alert>
4259 <alert name="CopySLURL"> 4101 <alert name="CopySLURL">
4260 <message name="message"> 4102 <message name="message">
4261 La SLURL suivante a été copiée sur votre presse-papier : 4103 La SLURL suivante a été copiée dans votre presse-papier :
4262 [SLURL] 4104 [SLURL]
4263 4105
4264Mettez-la dans une page web pour permettre aux autres utilisateurs d&apos;accéder facilement à cet endroit ou bien collez-la dans la barre d&apos;adresse de votre navigateur. 4106Mettez-la dans une page web pour permettre aux autres résidents d&apos;accéder facilement à cet endroit ou bien collez-la dans la barre d&apos;adresse de votre navigateur.
4265 </message> 4107 </message>
4266 <ignore name="ignore"> 4108 <ignore name="ignore">
4267 Lorsque vous copiez une SLURL sur votre presse-papier 4109 Lorsque vous copiez une SLURL dans votre presse-papier
4268 </ignore> 4110 </ignore>
4269 </alert> 4111 </alert>
4270 <alert name="GraphicsPreferencesHelp"> 4112 <alert name="GraphicsPreferencesHelp">
4271 <message name="message"> 4113 <message name="message">
4272 Ce panel contrôle la taille de la fenêtre et la résolution, ainsi que la qualité des graphiques client. Les préférences de l&apos;interface graphique vous permettent de choisir entre 4 niveaux de graphiques : Faible, Moyen, Élevé et Ultra. Personnalisez vos options graphiques en cliquant sur le bouton Personnaliser et en changeant les paramètres suivants : 4114 Ce menu permet de contrôler la taille de la fenêtre et la résolution, ainsi que la qualité des graphiques client. Les préférences de l&apos;interface graphique vous permettent de choisir entre 4 niveaux de graphiques : Faible, Moyen, Élevé et Ultra. Personnalisez vos options graphiques en cliquant sur le bouton Personnaliser et en changeant les paramètres suivants :
4273 4115
4274Shaders : active ou désactive les différents types de shaders pixels. 4116Effets : active ou désactive les différents types de shaders pixels.
4275 4117
4276Détails des reflets : définit le type d&apos;objets reflétés dans l&apos;eau. 4118Objets reflétés : définit le type d&apos;objets reflétés dans l&apos;eau.
4277 4119
4278Rendu de l&apos;avatar : définit les options qui impactent la manière dont le client rend les avatars. 4120Rendu de l&apos;avatar : définit les options qui influent sur la manière dont le client rend les avatars.
4279 4121
4280Distance d&apos;affichage : la distance à laquelle vous voyez les objets s&apos;afficher dans la scène. 4122Limite d&apos;affichage : la distance à laquelle vous voyez les objets s&apos;afficher dans la scène.
4281 4123
4282Nombre de particules max. : définit le nombre maximum de particules que vous pouvez voir à la fois sur votre écran. 4124Nombre de particules max. : définit le nombre maximum de particules que vous pouvez voir à la fois sur votre écran.
4283 4125
4284Qualité post-traitement : définit la résolution du rayonnement. 4126Qualité post-traitement : définit la résolution du rayonnement.
4285 4127
4286Détails du maillage : définit le niveau de détail ou le nombre de triangles utilisés dans le rendu de certains objets. Une valeur plus élevée prendra plus de temps pour apparaître, mais permettra d&apos;avoir des objets plus détaillés. 4128Détails des rendus : définit le niveau de détail ou le nombre de polygones utilisés dans le rendu de certains objets. Une valeur plus élevée prendra plus de temps pour apparaître, mais permettra d&apos;avoir des objets plus détaillés.
4287 4129
4288Détails de la lumière : définit les types de lumières que vous souhaitez faire apparaître. 4130Sources lumineuses : définit les types de lumières que vous souhaitez faire apparaître.
4289 4131
4290Détails du terrain : définit le niveau de détail que vous souhaitez utiliser dans la texture du terrain. 4132Rendu du terrain : définit le niveau de détail que vous souhaitez utiliser dans la texture du terrain.
4291 </message> 4133 </message>
4292 </alert> 4134 </alert>
4293 <alert name="WLSavePresetAlert"> 4135 <alert name="WLSavePresetAlert">
@@ -4335,7 +4177,7 @@ Détails du terrain : définit le niveau de détail que vous souhaitez utiliser
4335 </alert> 4177 </alert>
4336 <alert name="HelpEditSky"> 4178 <alert name="HelpEditSky">
4337 <message name="message"> 4179 <message name="message">
4338 Pour créer et sauvegarder plusieurs ciels, modifiez les curseurs WindLight. 4180 Pour créer et sauvegarder plusieurs ciels, utilisez les curseurs WindLight.
4339 </message> 4181 </message>
4340 </alert> 4182 </alert>
4341 <alert name="HelpEditDayCycle"> 4183 <alert name="HelpEditDayCycle">
@@ -4345,7 +4187,7 @@ Détails du terrain : définit le niveau de détail que vous souhaitez utiliser
4345 </alert> 4187 </alert>
4346 <alert name="EnvSettingsHelpButton"> 4188 <alert name="EnvSettingsHelpButton">
4347 <message name="message"> 4189 <message name="message">
4348 Ces paramètres permettent de modifier l&apos;environnement local sur votre ordinateur. Pour que vous ayez accès à tous les paramètres, votre carte graphique doit prendre en charge les shaders atmosphériques. 4190 Ces paramètres permettent de modifier l&apos;environnement local sur votre ordinateur. Pour que vous ayez accès à tous les paramètres, votre carte graphique doit prendre en charge les effets atmosphériques.
4349 4191
4350Pour changer les différentes phases de la journée sur votre visualisateur, utilisez le curseur Heure de la journée. 4192Pour changer les différentes phases de la journée sur votre visualisateur, utilisez le curseur Heure de la journée.
4351 4193
@@ -4390,7 +4232,7 @@ Il permet de simuler de nombreux paramètres d&apos;exposition, tels que les voi
4390 </alert> 4232 </alert>
4391 <alert name="HelpBlueDensity"> 4233 <alert name="HelpBlueDensity">
4392 <message name="message"> 4234 <message name="message">
4393 La Densité du bleu affecte la saturation générale des couleurs du ciel et du brouillard. Si vous déplacez le curseur Intensité (I) vers la droite, les couleurs deviennent plus vives et plus vibrantes. Si vous vous le déplacez complètement à gauche, les couleurs deviennent plus fades, puis finalement noires et blanches. Pour paramétrer avec précision la couleur du ciel, vous pouvez contrôler chacun des éléments de la saturation à l&apos;aide des curseurs Rouge/Vert/Bleu (RVB). 4235 La Densité du bleu affecte la saturation générale des couleurs du ciel et du brouillard. Si vous déplacez le curseur Intensité (I) vers la droite, les couleurs deviennent plus vives et plus vibrantes. Si vous le déplacez complètement à gauche, les couleurs deviennent plus fades, puis finalement noires et blanches. Pour paramétrer avec précision la couleur du ciel, vous pouvez contrôler chacun des éléments de la saturation à l&apos;aide des curseurs Rouge/Vert/Bleu (RVB).
4394 </message> 4236 </message>
4395 </alert> 4237 </alert>
4396 <alert name="HelpHazeDensity"> 4238 <alert name="HelpHazeDensity">
@@ -4412,7 +4254,7 @@ Les valeurs supérieures à 1 simulent des distances plus importantes pour des e
4412 </alert> 4254 </alert>
4413 <alert name="HelpMaxAltitude"> 4255 <alert name="HelpMaxAltitude">
4414 <message name="message"> 4256 <message name="message">
4415 L&apos;Altitude max. ajuste les calculs de WindLight lors de la computation de la lumière atmosphérique. Quand la fin de la journée approche, il est utile pour ajuster la « profondeur » du coucher de soleil. 4257 L&apos;Altitude max. ajuste les calculs de WindLight lors de la computation de la lumière atmosphérique. Quand la fin de la journée approche, il est utile pour ajuster la « profondeur » du coucher de soleil.
4416 </message> 4258 </message>
4417 </alert> 4259 </alert>
4418 <alert name="HelpSunlightColor"> 4260 <alert name="HelpSunlightColor">
@@ -4422,7 +4264,7 @@ Les valeurs supérieures à 1 simulent des distances plus importantes pour des e
4422 </alert> 4264 </alert>
4423 <alert name="HelpSunAmbient"> 4265 <alert name="HelpSunAmbient">
4424 <message name="message"> 4266 <message name="message">
4425 Ajuste la couleur et l&apos;intensité de la lumière atmosphérique ambiante de la scène. 4267 Ajuste la couleur et l&apos;intensité de la lumière atmosphérique ambiante.
4426 </message> 4268 </message>
4427 </alert> 4269 </alert>
4428 <alert name="HelpSunGlow"> 4270 <alert name="HelpSunGlow">
@@ -4633,8 +4475,7 @@ Même chose que l&apos;azimut.
4633 Les objets qui font partie d&apos;une pièce-jointe ne peuvent pas être achetés. 4475 Les objets qui font partie d&apos;une pièce-jointe ne peuvent pas être achetés.
4634 </message> 4476 </message>
4635 </alert> 4477 </alert>
4636 <alert name="DebitPermissionDetails" 4478 <alert name="DebitPermissionDetails" title="À propos des requêtes pour les permissions de débit">
4637 title="À propos des requêtes pour les permissions de débit">
4638 <message name="message"> 4479 <message name="message">
4639 Accepter cette requête donne au script la permission de prélever des dollars Linden (L$) sur votre compte de manière continue. Pour révoquer cette permission, le propriétaire de l&apos;objet doit supprimer l&apos;objet ou bien réinitialiser les scripts dans l&apos;objet. 4480 Accepter cette requête donne au script la permission de prélever des dollars Linden (L$) sur votre compte de manière continue. Pour révoquer cette permission, le propriétaire de l&apos;objet doit supprimer l&apos;objet ou bien réinitialiser les scripts dans l&apos;objet.
4640 </message> 4481 </message>
diff --git a/linden/indra/newview/skins/default/xui/fr/floater_about.xml b/linden/indra/newview/skins/default/xui/fr/floater_about.xml
index 31b4c95..3f6d47c 100644
--- a/linden/indra/newview/skins/default/xui/fr/floater_about.xml
+++ b/linden/indra/newview/skins/default/xui/fr/floater_about.xml
@@ -1,4 +1,4 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 1<?xml version="1.0" encoding="utf-8" standalone="yes"?>
2<floater name="floater_about" title="A propos de Second Life"> 2<floater name="floater_about" title="A propos de Second Life">
3 <text_editor name="credits_editor"> 3 <text_editor name="credits_editor">
4 Second Life existe grâce aux efforts de Philip, Tessa, Andrew, Cory, James, Ben, Char, Charlie, Colin, Dan, Daniel, Doug, Eric, Hamlet, Haney, Eve, Hunter, Ian, Jeff, Jennifer, Jim, John, Lee, Mark, Peter, Phoenix, Richard, Robin, Xenon, Steve, Tanya, Eddie, Avi, Frank, Bruce, Aaron, Alice, Bob, Debra, Eileen, Helen, Janet, Louie, Leviathania, Stefan, Ray, Kevin, Tom, Mikeb, MikeT, Burgess, Elena, Tracy, Bill, Todd, Ryan, Zach, Sarah, Nova, Tim, Stephanie, Michael, Evan, Nicolas, Catherine, Rachelle, Dave, Holly, Bub, Kelly, Magellan, Ramzi, Don, Sabin, Jill, Rheya, Jeska, Torley, Kona, Callum, Charity, Ventrella, Jack, Vektor, Iris, Chris, Nicole, Mick, Reuben, Blue, Babbage, Yedwab, Deana, Lauren, Brent, Pathfinder, Chadrick, Altruima, Jesse, Teeny, Monroe, Icculus, David, Tess, Lizzie, Patsy, Isaac, Lawrence, Cyn, Bo, Gia, Annette, Marius, Tbone, Jonathan, Karen, Ginsu, Satoko, Yuko, Makiko, Thomas, Harry, Seth, Alexei, Brian, Guy, Runitai, Ethan, Data, Cornelius, Kenny, Swiss, Zero, Natria, Wendy, Stephen, Teeple, Thumper, Lucy, Dee, Mia, Liana, Warren, Branka, Aura, beez, Milo, Hermia, Red, Thrax, Joe, Sally, Magenta, Mogura, Paul, Jose, Rejean, Henrik, Lexie, Amber, Logan, Xan, Nora, Morpheus, Donovan, Leyla, MichaelFrancis, Beast, Cube, Bucky, Joshua, Stryfe, Harmony, Teresa, Claudia, Walker, Glenn, Fritz, Fordak, June, Cleopetra, Jean, Ivy, Betsy, Roosevelt, Spike, Ken, Which, Tofu, Chiyo, Rob, Zee, dustin, George, Del, Matthew, Cat, Jacqui, Lightfoot, Adrian, Viola, Alfred, Noel, Irfan, Sunil, Yool, Rika, Jane, Xtreme, Frontier, a2, Neo, Siobhan, Yoz, Justin, Elle, Qarl, Benjamin, Isabel, Gulliver, Everett, Christopher, Izzy, Stephany, Garry, Sejong, Sean, Tobin, Iridium, Meta, Anthony, Jeremy, JP, Jake, Maurice, Madhavi, Leopard, Kyle, Joon, Kari, Bert, Belinda, Jon, Kristi, Bridie, Pramod, KJ, Socrates, Maria, Ivan, Aric, Yamasaki, Adreanne, Jay, MitchK, Ceren, Coco, Durl, Jenny, Periapse, Kartic, Storrs, Lotte, Sandy, Rohn, Colossus, Zen, BigPapi, Brad, Pastrami, Kurz, Mani, Neuro, Jaime, MJ, Rowan, Sgt, Elvis, Gecko, Samuel, Sardonyx, Leo, Bryan, Niko, Soft, Poppy, Rachel, Aki, Angelo, Banzai, Alexa, Sue, CeeLo, Bender, CG, Gillian, Pelle, Nick, Echo, Zara, Christine, Shamiran, Emma, Blake, Keiko, Plexus, Joppa, Sidewinder, Erica, Ashlei, Twilight, Kristen, Brett, Q, Enus, Simon, Bevis, Kraft, Kip, Chandler, Ron, LauraP, Ram, KyleJM, Scouse, Prospero, Melissa, Marty, Nat, Hamilton, Kend, Lordan, Jimmy, Kosmo, Seraph, Green, Ekim, Wiggo, JT, Rome, Doris, Miz, Benoc, Whump, Trinity, Patch, Kate, TJ, Bao, Joohwan, Christy, Sofia, Matias, Cogsworth, Johan, Oreh, Cheah, Angela, Brandy, Mango, Lan, Aleks, Gloria, Heidy, Mitchell, Space, Colton, Bambers, Einstein, Maggie, Malbers, Rose, Winnie, Stella, Milton, Rothman, Niall, Marin, Allison, Katie, Dawn, Katt, Dusty, Kalpana, Judy, Andrea, Ambroff, Infinity, Gail, Rico, Raymond, Yi, William, Christa, M, Teagan, Scout, Molly, Dante, Corr, Dynamike, Usi, Kaylee, Vidtuts, Lil, Danica, Sascha, Kelv, Jacob, Nya, Rodney, Brandon, Elsie, Blondin, Grant, Katrin, Nyx, Gabriel, Locklainn, Claire, Devin, Minerva, Monty, Austin, Bradford, Si, Keira, H, Caitlin, Dita, Makai, Jenn, Ann, Meredith, Clare, Joy, Praveen, Cody, Edmund, Ruthe, Sirena, Gayathri, Spider, FJ, Davidoff, Tian, Jennie, Louise, Oskar, Landon, Noelle, Jarv, Ingrid, Al, Sommer, Doc, Aria, Huin, Gray, Lili, Vir, DJ et de nombreuses autres personnes. 4 Second Life existe grâce aux efforts de Philip, Tessa, Andrew, Cory, James, Ben, Char, Charlie, Colin, Dan, Daniel, Doug, Eric, Hamlet, Haney, Eve, Hunter, Ian, Jeff, Jennifer, Jim, John, Lee, Mark, Peter, Phoenix, Richard, Robin, Xenon, Steve, Tanya, Eddie, Avi, Frank, Bruce, Aaron, Alice, Bob, Debra, Eileen, Helen, Janet, Louie, Leviathania, Stefan, Ray, Kevin, Tom, Mikeb, MikeT, Burgess, Elena, Tracy, Bill, Todd, Ryan, Zach, Sarah, Nova, Tim, Stephanie, Michael, Evan, Nicolas, Catherine, Rachelle, Dave, Holly, Bub, Kelly, Magellan, Ramzi, Don, Sabin, Jill, Rheya, Jeska, Torley, Kona, Callum, Charity, Ventrella, Jack, Vektor, Iris, Chris, Nicole, Mick, Reuben, Blue, Babbage, Yedwab, Deana, Lauren, Brent, Pathfinder, Chadrick, Altruima, Jesse, Teeny, Monroe, Icculus, David, Tess, Lizzie, Patsy, Isaac, Lawrence, Cyn, Bo, Gia, Annette, Marius, Tbone, Jonathan, Karen, Ginsu, Satoko, Yuko, Makiko, Thomas, Harry, Seth, Alexei, Brian, Guy, Runitai, Ethan, Data, Cornelius, Kenny, Swiss, Zero, Natria, Wendy, Stephen, Teeple, Thumper, Lucy, Dee, Mia, Liana, Warren, Branka, Aura, beez, Milo, Hermia, Red, Thrax, Joe, Sally, Magenta, Mogura, Paul, Jose, Rejean, Henrik, Lexie, Amber, Logan, Xan, Nora, Morpheus, Donovan, Leyla, MichaelFrancis, Beast, Cube, Bucky, Joshua, Stryfe, Harmony, Teresa, Claudia, Walker, Glenn, Fritz, Fordak, June, Cleopetra, Jean, Ivy, Betsy, Roosevelt, Spike, Ken, Which, Tofu, Chiyo, Rob, Zee, dustin, George, Del, Matthew, Cat, Jacqui, Lightfoot, Adrian, Viola, Alfred, Noel, Irfan, Sunil, Yool, Rika, Jane, Xtreme, Frontier, a2, Neo, Siobhan, Yoz, Justin, Elle, Qarl, Benjamin, Isabel, Gulliver, Everett, Christopher, Izzy, Stephany, Garry, Sejong, Sean, Tobin, Iridium, Meta, Anthony, Jeremy, JP, Jake, Maurice, Madhavi, Leopard, Kyle, Joon, Kari, Bert, Belinda, Jon, Kristi, Bridie, Pramod, KJ, Socrates, Maria, Ivan, Aric, Yamasaki, Adreanne, Jay, MitchK, Ceren, Coco, Durl, Jenny, Periapse, Kartic, Storrs, Lotte, Sandy, Rohn, Colossus, Zen, BigPapi, Brad, Pastrami, Kurz, Mani, Neuro, Jaime, MJ, Rowan, Sgt, Elvis, Gecko, Samuel, Sardonyx, Leo, Bryan, Niko, Soft, Poppy, Rachel, Aki, Angelo, Banzai, Alexa, Sue, CeeLo, Bender, CG, Gillian, Pelle, Nick, Echo, Zara, Christine, Shamiran, Emma, Blake, Keiko, Plexus, Joppa, Sidewinder, Erica, Ashlei, Twilight, Kristen, Brett, Q, Enus, Simon, Bevis, Kraft, Kip, Chandler, Ron, LauraP, Ram, KyleJM, Scouse, Prospero, Melissa, Marty, Nat, Hamilton, Kend, Lordan, Jimmy, Kosmo, Seraph, Green, Ekim, Wiggo, JT, Rome, Doris, Miz, Benoc, Whump, Trinity, Patch, Kate, TJ, Bao, Joohwan, Christy, Sofia, Matias, Cogsworth, Johan, Oreh, Cheah, Angela, Brandy, Mango, Lan, Aleks, Gloria, Heidy, Mitchell, Space, Colton, Bambers, Einstein, Maggie, Malbers, Rose, Winnie, Stella, Milton, Rothman, Niall, Marin, Allison, Katie, Dawn, Katt, Dusty, Kalpana, Judy, Andrea, Ambroff, Infinity, Gail, Rico, Raymond, Yi, William, Christa, M, Teagan, Scout, Molly, Dante, Corr, Dynamike, Usi, Kaylee, Vidtuts, Lil, Danica, Sascha, Kelv, Jacob, Nya, Rodney, Brandon, Elsie, Blondin, Grant, Katrin, Nyx, Gabriel, Locklainn, Claire, Devin, Minerva, Monty, Austin, Bradford, Si, Keira, H, Caitlin, Dita, Makai, Jenn, Ann, Meredith, Clare, Joy, Praveen, Cody, Edmund, Ruthe, Sirena, Gayathri, Spider, FJ, Davidoff, Tian, Jennie, Louise, Oskar, Landon, Noelle, Jarv, Ingrid, Al, Sommer, Doc, Aria, Huin, Gray, Lili, Vir, DJ et de nombreuses autres personnes.
@@ -26,7 +26,7 @@
26 Codage Audio du chat vocal : Polycom(R) Siren14(TM) (ITU-T Rec. G.722.1 Annex C) 26 Codage Audio du chat vocal : Polycom(R) Siren14(TM) (ITU-T Rec. G.722.1 Annex C)
27 27
28 28
29 On ne peut pas voir très loin devant nous, mais l&apos;on peut déjà y voir qu&apos;il y a beaucoup à faire. --Alan Turing 29 On ne peut pas voir très loin devant nous, mais l&apos;on peut déjà y voir qu&apos;il y a beaucoup à faire. -Alan Turing
30 </text_editor> 30 </text_editor>
31 <string name="you_are_at"> 31 <string name="you_are_at">
32 Votre position : [POSITION] 32 Votre position : [POSITION]
diff --git a/linden/indra/newview/skins/default/xui/fr/floater_about_land.xml b/linden/indra/newview/skins/default/xui/fr/floater_about_land.xml
index 50ce466..736bf90 100644
--- a/linden/indra/newview/skins/default/xui/fr/floater_about_land.xml
+++ b/linden/indra/newview/skins/default/xui/fr/floater_about_land.xml
@@ -1,85 +1,72 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 1<?xml version="1.0" encoding="utf-8" standalone="yes"?>
2<floater name="floaterland" title="À propos du terrain"> 2<floater name="floaterland" title="À propos du terrain">
3 <tab_container name="landtab"> 3 <tab_container name="landtab">
4 <panel label="Général" name="land_general_panel"> 4 <panel label="Général" name="land_general_panel">
5 <text type="string" length="1" name="Name:"> 5 <text length="1" name="Name:" type="string">
6 Nom : 6 Nom :
7 </text> 7 </text>
8 <text type="string" length="1" name="Description:"> 8 <text length="1" name="Description:" type="string">
9 Description : 9 Description :
10 </text> 10 </text>
11 <text type="string" length="1" name="Owner:"> 11 <text length="1" name="Owner:" type="string">
12 Propriétaire : 12 Propriétaire :
13 </text> 13 </text>
14 <text type="string" length="1" name="OwnerText"> 14 <text length="1" name="OwnerText" type="string">
15 Leyla Linden 15 Leyla Linden
16 </text> 16 </text>
17 <button label="Profil..." label_selected="Profil..." name="Profile..." /> 17 <button label="Profil..." label_selected="Profil..." name="Profile..."/>
18 <text type="string" length="1" name="Group:"> 18 <text length="1" name="Group:" type="string">
19 Groupe : 19 Groupe :
20 </text> 20 </text>
21 <button label="Définir..." label_selected="Définir..." name="Set..." /> 21 <button label="Définir..." label_selected="Définir..." name="Set..."/>
22 <check_box label="Autoriser le transfert au groupe" name="check deed" 22 <check_box label="Autoriser la cession au groupe" name="check deed" tool_tip="Un officier peut céder ce terrain au groupe. Il viendra alors s&apos;ajouter au patrimoine du groupe."/>
23 tool_tip="Un officier peut transférer ce terrain au groupe. Il viendra alors s&apos;ajouter au patrimoine du groupe." /> 23 <button label="Céder..." label_selected="Céder..." name="Deed..." tool_tip="Vous ne pouvez céder le terrain que si vous avez un rôle d&apos;officier dans le groupe sélectionné."/>
24 <button label="Transférer..." label_selected="Transférer..." name="Deed..." 24 <check_box label="Le propriétaire contribue en cédant du terrain" name="check contib" tool_tip="Lorsque le terrain est cédé au groupe, la contribution du précédent propriétaire suffit à l&apos;entretenir."/>
25 tool_tip="Vous ne pouvez transférer le terrain que si vous avez un rôle d&apos;officier dans le groupe sélectionné." /> 25 <check_box label="Le propriétaire contribue en cédant du terrain" name="check contrib" tool_tip="Lorsqu&apos;un terrain est cédé au groupe, l&apos;ancien propriétaire fait également un don de terrain suffisant."/>
26 <check_box label="Le propriétaire contribue par transfert" name="check contib" 26 <text length="1" name="For Sale:" type="string">
27 tool_tip="Lorsque le terrain est transféré au groupe, la contribution du précédent propriétaire suffit à l&apos;entretenir." />
28 <check_box label="Le propriétaire contribue par une donation" name="check contrib"
29 tool_tip="Lorsqu&apos;un titre de propriété est transféré au groupe, l&apos;ancien propriétaire fait également un don de terrain suffisant." />
30 <text type="string" length="1" name="For Sale:">
31 À vendre : 27 À vendre :
32 </text> 28 </text>
33 <text type="string" length="1" name="Not for sale."> 29 <text length="1" name="Not for sale." type="string">
34 Pas à vendre. 30 Pas à vendre.
35 </text> 31 </text>
36 <text type="string" length="1" name="For Sale: Price L$[PRICE]."> 32 <text length="1" name="For Sale: Price L$[PRICE]." type="string">
37 Prix : [PRICE] $L. 33 Prix : [PRICE] L$.
38 </text> 34 </text>
39 <button label="Vendre le terrain..." label_selected="Vendre le terrain..." 35 <button label="Vendre le terrain..." label_selected="Vendre le terrain..." name="Sell Land..."/>
40 name="Sell Land..." /> 36 <text length="1" name="For sale to" type="string">
41 <text type="string" length="1" name="For sale to">
42 À vendre à : [BUYER] 37 À vendre à : [BUYER]
43 </text> 38 </text>
44 <text type="string" length="1" name="Sell with landowners objects in parcel."> 39 <text length="1" name="Sell with landowners objects in parcel." type="string">
45 Objets inclus dans la vente. 40 Objets inclus dans la vente.
46 </text> 41 </text>
47 <text type="string" length="1" name="Selling with no objects in parcel."> 42 <text length="1" name="Selling with no objects in parcel." type="string">
48 Objets non inclus dans la vente. 43 Objets non inclus dans la vente.
49 </text> 44 </text>
50 <button label="Annuler la vente du terrain" 45 <button label="Annuler la vente du terrain" label_selected="Annuler la vente du terrain" name="Cancel Land Sale"/>
51 label_selected="Annuler la vente du terrain" name="Cancel Land Sale" /> 46 <text length="1" name="Claimed:" type="string">
52 <text type="string" length="1" name="Claimed:">
53 Réclamée : 47 Réclamée :
54 </text> 48 </text>
55 <text type="string" length="1" name="DateClaimText"> 49 <text length="1" name="DateClaimText" type="string">
56 Tue Aug 15 13:47:25 2006 50 Tue Aug 15 13:47:25 2006
57 </text> 51 </text>
58 <text type="string" length="1" name="PriceLabel"> 52 <text length="1" name="PriceLabel" type="string">
59 Surface : 53 Surface :
60 </text> 54 </text>
61 <text type="string" length="1" name="PriceText"> 55 <text length="1" name="PriceText" type="string">
62 4048 m² 56 4048 m²
63 </text> 57 </text>
64 <text type="string" length="1" name="Traffic:"> 58 <text length="1" name="Traffic:" type="string">
65 Trafic : 59 Trafic :
66 </text> 60 </text>
67 <text type="string" length="1" name="DwellText"> 61 <text length="1" name="DwellText" type="string">
68 0 62 0
69 </text> 63 </text>
70 <button label="Acheter le terrain..." label_selected="Acheter le terrain..." 64 <button label="Acheter le terrain..." label_selected="Acheter le terrain..." name="Buy Land..."/>
71 name="Buy Land..." /> 65 <button label="Acheter pour le groupe..." label_selected="Acheter pour le groupe..." name="Buy For Group..."/>
72 <button label="Acheter pour le groupe..." label_selected="Acheter pour le groupe..." 66 <button label="Acheter un pass..." label_selected="Acheter un pass..." name="Buy Pass..." tool_tip="Un pass vous donne un accès temporaire à ce terrain."/>
73 name="Buy For Group..." /> 67 <button label="Abandonner le terrain..." label_selected="Abandonner le terrain..." name="Abandon Land..."/>
74 <button label="Acheter un passe..." label_selected="Acheter un passe..." 68 <button label="Redemander le terrain…" label_selected="Redemander le terrain…" name="Reclaim Land..."/>
75 name="Buy Pass..." 69 <button label="Vente Linden..." label_selected="Vente Linden..." name="Linden Sale..." tool_tip="Le terrain doit être la propriété d&apos;un résident, avoir un contenu défini et ne pas être aux enchères."/>
76 tool_tip="Un passe vous donne un accès temporaire à ce terrain." />
77 <button label="Céder le terrain..." label_selected="Céder le terrain..."
78 name="Abandon Land..." />
79 <button label="Récupérer le terrain…" label_selected="Récupérer le terrain…"
80 name="Reclaim Land..." />
81 <button label="Vente Linden..." label_selected="Vente Linden..." name="Linden Sale..."
82 tool_tip="Le terrain doit être la propriété d&apos;un résident, avoir un contenu défini et ne pas être aux enchères." />
83 <text name="new users only"> 70 <text name="new users only">
84 Nouveaux utilisateurs uniquement 71 Nouveaux utilisateurs uniquement
85 </text> 72 </text>
@@ -122,34 +109,34 @@ Allez dans le menu Monde &gt; À propos du terrain ou sélectionnez une autre pa
122 </string> 109 </string>
123 </panel> 110 </panel>
124 <panel label="Règlement" name="land_covenant_panel"> 111 <panel label="Règlement" name="land_covenant_panel">
125 <text type="string" length="1" name="covenant_timestamp_text"> 112 <text length="1" name="covenant_timestamp_text" type="string">
126 Last Modified Wed Dec 31 16:00:00 1969 113 Last Modified Wed Dec 31 16:00:00 1969
127 </text> 114 </text>
128 <text type="string" length="1" name="region_name_lbl"> 115 <text length="1" name="region_name_lbl" type="string">
129 Région : 116 Région :
130 </text> 117 </text>
131 <text type="string" length="1" name="region_name_text"> 118 <text length="1" name="region_name_text" type="string">
132 leyla 119 leyla
133 </text> 120 </text>
134 <text type="string" length="1" name="estate_name_lbl"> 121 <text length="1" name="estate_name_lbl" type="string">
135 Domaine : 122 Domaine :
136 </text> 123 </text>
137 <text type="string" length="1" name="estate_name_text"> 124 <text length="1" name="estate_name_text" type="string">
138 continent 125 continent
139 </text> 126 </text>
140 <text type="string" length="1" name="estate_owner_lbl"> 127 <text length="1" name="estate_owner_lbl" type="string">
141 Propriétaire : 128 Propriétaire :
142 </text> 129 </text>
143 <text type="string" length="1" name="estate_owner_text"> 130 <text length="1" name="estate_owner_text" type="string">
144 (aucun) 131 (aucun)
145 </text> 132 </text>
146 <text type="string" length="1" name="resellable_clause"> 133 <text length="1" name="resellable_clause" type="string">
147 Le terrain acheté dans cette région ne peut être revendu. 134 Le terrain acheté dans cette région ne peut être revendu.
148 </text> 135 </text>
149 <text type="string" length="1" name="changeable_clause"> 136 <text length="1" name="changeable_clause" type="string">
150 Le terrain acheté dans cette région ne peut être revendu/divisé. 137 Le terrain acheté dans cette région ne peut être revendu/divisé.
151 </text> 138 </text>
152 <text_editor type="string" length="1" name="covenant_editor"> 139 <text_editor length="1" name="covenant_editor" type="string">
153 Il n&apos;y a aucun règlement pour ce domaine. 140 Il n&apos;y a aucun règlement pour ce domaine.
154 </text_editor> 141 </text_editor>
155 <text name="can_resell"> 142 <text name="can_resell">
@@ -169,14 +156,11 @@ Allez dans le menu Monde &gt; À propos du terrain ou sélectionnez une autre pa
169 <text name="parcel_object_bonus"> 156 <text name="parcel_object_bonus">
170 Facteur Bonus Objets : [BONUS] 157 Facteur Bonus Objets : [BONUS]
171 </text> 158 </text>
172 <text type="string" length="1" name="Simulator primitive usage:"> 159 <text length="1" name="Simulator primitive usage:" type="string">
173 Prims utilisés sur le sim : 160 Prims utilisés sur le sim :
174 </text> 161 </text>
175 <text type="string" length="1" name="0 out of 0 available">
176 0 sur 14055 (14055 disponibles)
177 </text>
178 <text name="objects_available"> 162 <text name="objects_available">
179 [COUNT] sur [COUNT] ([COUNT] disponibles) 163 [COUNT] sur [MAX] ([AVAILABLE] disponibles)
180 </text> 164 </text>
181 <string name="objects_available_text"> 165 <string name="objects_available_text">
182 [COUNT] sur [MAX] ([AVAILABLE] disponibles) 166 [COUNT] sur [MAX] ([AVAILABLE] disponibles)
@@ -184,110 +168,102 @@ Allez dans le menu Monde &gt; À propos du terrain ou sélectionnez une autre pa
184 <string name="objects_deleted_text"> 168 <string name="objects_deleted_text">
185 [COUNT] sur [MAX] ([DELETED] seront supprimés) 169 [COUNT] sur [MAX] ([DELETED] seront supprimés)
186 </string> 170 </string>
187 <text type="string" length="1" name="Primitives parcel supports:"> 171 <text length="1" name="Primitives parcel supports:" type="string">
188 Prims max. sur la parcelle : 172 Prims max. sur la parcelle :
189 </text> 173 </text>
190 <text type="string" length="1" name="object_contrib_text"> 174 <text length="1" name="object_contrib_text" type="string">
191 [COUNT] 175 [COUNT]
192 </text> 176 </text>
193 <text type="string" length="1" name="Primitives on parcel:"> 177 <text length="1" name="Primitives on parcel:" type="string">
194 Prims sur la parcelle : 178 Prims sur la parcelle :
195 </text> 179 </text>
196 <text type="string" length="1" name="total_objects_text"> 180 <text length="1" name="total_objects_text" type="string">
197 [COUNT] 181 [COUNT]
198 </text> 182 </text>
199 <text type="string" length="1" name="Owned by parcel owner:"> 183 <text length="1" name="Owned by parcel owner:" type="string">
200 Appartenant au propriétaire : 184 Appartenant au propriétaire :
201 </text> 185 </text>
202 <text type="string" length="1" name="owner_objects_text"> 186 <text length="1" name="owner_objects_text" type="string">
203 [COUNT] 187 [COUNT]
204 </text> 188 </text>
205 <button label="Afficher" label_selected="Afficher" name="ShowOwner" /> 189 <button label="Afficher" label_selected="Afficher" name="ShowOwner"/>
206 <button label="Renvoyer..." label_selected="Renvoyer..." name="ReturnOwner..." 190 <button label="Renvoyer..." label_selected="Renvoyer..." name="ReturnOwner..." tool_tip="Renvoyer les objets à leurs propriétaires."/>
207 tool_tip="Renvoyer les objets à leurs propriétaires." /> 191 <text length="1" name="Set to group:" type="string">
208 <text type="string" length="1" name="Set to group:">
209 Donnés au groupe : 192 Donnés au groupe :
210 </text> 193 </text>
211 <text type="string" length="1" name="group_objects_text"> 194 <text length="1" name="group_objects_text" type="string">
212 0 195 [COUNT]
213 </text> 196 </text>
214 <button label="Afficher" label_selected="Afficher" name="ShowGroup" /> 197 <button label="Afficher" label_selected="Afficher" name="ShowGroup"/>
215 <button label="Renvoyer..." label_selected="Renvoyer..." name="ReturnGroup..." 198 <button label="Renvoyer..." label_selected="Renvoyer..." name="ReturnGroup..." tool_tip="Renvoyer les objets à leurs propriétaires."/>
216 tool_tip="Renvoyer les objets à leurs propriétaires." /> 199 <text length="1" name="Owned by others:" type="string">
217 <text type="string" length="1" name="Owned by others:">
218 Appartenant à d&apos;autres : 200 Appartenant à d&apos;autres :
219 </text> 201 </text>
220 <text type="string" length="1" name="other_objects_text"> 202 <text length="1" name="other_objects_text" type="string">
221 0 203 [COUNT]
222 </text> 204 </text>
223 <button label="Afficher" label_selected="Afficher" name="ShowOther" /> 205 <button label="Afficher" label_selected="Afficher" name="ShowOther"/>
224 <button label="Renvoyer..." label_selected="Renvoyer..." name="ReturnOther..." 206 <button label="Renvoyer..." label_selected="Renvoyer..." name="ReturnOther..." tool_tip="Renvoyer les objets à leurs propriétaires."/>
225 tool_tip="Renvoyer les objets à leurs propriétaires." /> 207 <text length="1" name="Selected / sat upon:" type="string">
226 <text type="string" length="1" name="Selected / sat upon:">
227 Sélectionnés/où quelqu&apos;un est assis : 208 Sélectionnés/où quelqu&apos;un est assis :
228 </text> 209 </text>
229 <text type="string" length="1" name="selected_objects_text"> 210 <text length="1" name="selected_objects_text" type="string">
230 0 211 [COUNT]
231 </text> 212 </text>
232 <text type="string" length="1" name="Autoreturn other resident&amp;apos;s objects (minutes, 0 for off):"> 213 <text length="1" name="Autoreturn other resident&amp;apos;s objects (minutes, 0 for off):" type="string">
233 Renvoi automatique des objets appartenant aux autres résidents (minutes, 0 pour désactiver): 214 Renvoi automatique des objets appartenant aux autres résidents (minutes, 0 pour désactiver):
234 </text> 215 </text>
235 <text name="Autoreturn"> 216 <text name="Autoreturn">
236 Renvoi automatique des objets d&apos;autres résidents (minutes, 0 pour désactiver) : 217 Renvoi automatique des objets d&apos;autres résidents (minutes, 0 pour désactiver) :
237 </text> 218 </text>
238 <text type="string" length="1" name="Object Owners:"> 219 <text length="1" name="Object Owners:" type="string">
239 Propriétaires : 220 Propriétaires :
240 </text> 221 </text>
241 <button label="Rafraîchir la liste" label_selected="Rafraîchir la liste" 222 <button label="Rafraîchir la liste" label_selected="Rafraîchir la liste" name="Refresh List"/>
242 name="Refresh List" /> 223 <button label="Renvoyer les objets..." label_selected="Renvoyer les objets..." name="Return objects..."/>
243 <button label="Renvoyer les objets..." label_selected="Renvoyer les objets..." 224 <button label="" label_selected="" name="Type" tool_tip="Trier par type"/>
244 name="Return objects..." /> 225 <button label="Nom" label_selected="Nom" name="Name" tool_tip="Trier par nom"/>
245 <button label="" label_selected="" name="Type" tool_tip="Trier par type" /> 226 <button label="Trafic" label_selected="Trafic" name="Count" tool_tip="Trier par trafic"/>
246 <button label="Nom" label_selected="Nom" name="Name" tool_tip="Trier par nom" />
247 <button label="Trafic" label_selected="Trafic" name="Count" tool_tip="Trier par trafic" />
248 <name_list label="Plus récents" name="owner list"> 227 <name_list label="Plus récents" name="owner list">
249 <column label="Type" name="type" /> 228 <column label="Type" name="type"/>
250 <column label="Nom" name="name" /> 229 <column label="Nom" name="name"/>
251 <column label="Nombre" name="count" /> 230 <column label="Nombre" name="count"/>
252 </name_list> 231 </name_list>
253 </panel> 232 </panel>
254 <panel label="Options" name="land_options_panel"> 233 <panel label="Options" name="land_options_panel">
255 <text type="string" length="1" name="allow_label"> 234 <text length="1" name="allow_label" type="string">
256 Autoriser les autres résidents à : 235 Autoriser les autres résidents à :
257 </text> 236 </text>
258 <text name="allow_label2"> 237 <text name="allow_label2">
259 Créer des objets : 238 Créer des objets :
260 </text> 239 </text>
261 <check_box label="Tous les résidents" name="edit objects check" /> 240 <check_box label="Tous les résidents" name="edit objects check"/>
262 <check_box label="Modifier le terrain" name="edit land check" /> 241 <check_box label="Modifier le terrain" name="edit land check"/>
263 <check_box label="Créer des repères" name="check landmark" /> 242 <check_box label="Créer des repères" name="check landmark"/>
264 <check_box label="Groupe" name="edit group objects check" /> 243 <check_box label="Groupe" name="edit group objects check"/>
265 <text name="allow_label3"> 244 <text name="allow_label3">
266 Apporter des objets : 245 Laisser entrer des objets :
267 </text> 246 </text>
268 <check_box label="Tous les résidents" name="all object entry check" /> 247 <check_box label="Tous les résidents" name="all object entry check"/>
269 <check_box label="Groupe" name="group object entry check" /> 248 <check_box label="Groupe" name="group object entry check"/>
270 <text name="allow_label4"> 249 <text name="allow_label4">
271 Exécuter des scripts : 250 Exécuter des scripts :
272 </text> 251 </text>
273 <check_box label="Groupe" name="check group scripts" /> 252 <check_box label="Groupe" name="check group scripts"/>
274 <check_box label="Voler" name="check fly" /> 253 <check_box label="Voler" name="check fly"/>
275 <check_box label="Tous les résidents" name="check other scripts" /> 254 <check_box label="Tous les résidents" name="check other scripts"/>
276 <text type="string" length="1" name="land_options_label"> 255 <text length="1" name="land_options_label" type="string">
277 Options du terrain : 256 Options du terrain :
278 </text> 257 </text>
279 <check_box label="Sécurisé (pas de dégâts)" name="check safe" /> 258 <check_box label="Sécurisé (pas de dégâts)" name="check safe"/>
280 <check_box label="Interdire les bousculades" name="PushRestrictCheck" 259 <check_box label="Interdire les bousculades" name="PushRestrictCheck" tool_tip="llPushObject ne fonctionne que sur les scripts du propriétaire de la parcelle ou sur les scripts où la personne qui bouscule est aussi la propriétaire du script."/>
281 tool_tip="llPushObject ne fonctionne que sur les scripts du propriétaire de la parcelle ou sur les scripts où la personne qui bouscule est aussi la propriétaire du script." /> 260 <check_box label="Afficher dans la recherche (30 L$/semaine) sous" name="ShowDirectoryCheck" tool_tip="Afficher la parcelle dans les résultats de recherche"/>
282 <check_box label="Afficher dans la recherche (30 $L/semaine) sous"
283 name="ShowDirectoryCheck"
284 tool_tip="Afficher la parcelle dans les résultats de recherche" />
285 <combo_box name="land category"> 261 <combo_box name="land category">
286 <combo_item name="AnyCategory"> 262 <combo_item name="AnyCategory">
287 Toute catégorie 263 Toute catégorie
288 </combo_item> 264 </combo_item>
289 <combo_item name="LindenLocation"> 265 <combo_item name="LindenLocation">
290 Emplacement Linden 266 Lindens
291 </combo_item> 267 </combo_item>
292 <combo_item name="Adult"> 268 <combo_item name="Adult">
293 Adultes 269 Adultes
@@ -323,16 +299,14 @@ Allez dans le menu Monde &gt; À propos du terrain ou sélectionnez une autre pa
323 Autre 299 Autre
324 </combo_item> 300 </combo_item>
325 </combo_box> 301 </combo_box>
326 <check_box label="Publier liste sur le web" name="PublishCheck" 302 <check_box label="Publier liste sur le web" name="PublishCheck" tool_tip="Publiez vos informations de parcelle sur le web."/>
327 tool_tip="Publiez vos informations de parcelle sur le web." /> 303 <check_box label="Contenu pour adultes" name="MatureCheck" tool_tip="Les infos sur votre parcelle, ou le contenu de cette dernière, sont à caractère adulte."/>
328 <check_box label="Contenu pour adultes" name="MatureCheck" 304 <button label="?" label_selected="?" name="?"/>
329 tool_tip="Les infos sur votre parcelle, ou le contenu de cette dernière, sont à caractère adulte." /> 305 <text length="1" name="Snapshot:" type="string">
330 <button label="?" label_selected="?" name="?" />
331 <text type="string" length="1" name="Snapshot:">
332 Photo : 306 Photo :
333 </text> 307 </text>
334 <texture_picker label="" name="snapshot_ctrl" tool_tip="Cliquez pour sélectionner une image" /> 308 <texture_picker label="" name="snapshot_ctrl" tool_tip="Cliquez pour sélectionner une image"/>
335 <text type="string" length="1" name="Landing Point: (none)"> 309 <text length="1" name="Landing Point: (none)" type="string">
336 Point d&apos;atterrissage : (aucun) 310 Point d&apos;atterrissage : (aucun)
337 </text> 311 </text>
338 <text name="landing_point"> 312 <text name="landing_point">
@@ -341,22 +315,19 @@ Allez dans le menu Monde &gt; À propos du terrain ou sélectionnez une autre pa
341 <string name="landing_point_none"> 315 <string name="landing_point_none">
342 (aucun) 316 (aucun)
343 </string> 317 </string>
344 <button label="Définir" label_selected="Définir" name="Set" 318 <button label="Définir" label_selected="Définir" name="Set" tool_tip="Définir le lieu d&apos;arrivée de l&apos;avatar sur votre position actuelle. ll doit se trouver sur cette parcelle."/>
345 tool_tip="Définir le lieu d&apos;arrivée de l&apos;avatar sur votre position actuelle. ll doit se trouver sur cette parcelle de terrain." /> 319 <button label="Annuler" label_selected="Annuler" name="Clear" tool_tip="Libérer le lieu d&apos;arrivée."/>
346 <button label="Annuler" label_selected="Annuler" name="Clear" 320 <text length="1" name="Teleport Routing: " type="string">
347 tool_tip="Dégager le lieu d&apos;arrivée." /> 321 Règles de téléportation :
348 <text type="string" length="1" name="Teleport Routing: "> 322 </text>
349 Options de téléportation : 323 <combo_box name="landing type" tool_tip="Vous permet de paramétrer les téléportations sur votre terrain.">
350 </text> 324 <combo_item length="1" name="Blocked" type="string">
351 <combo_box name="landing type"
352 tool_tip="Vous permet de paramétrer les téléportations sur votre terrain.">
353 <combo_item type="string" length="1" name="Blocked">
354 Bloquée 325 Bloquée
355 </combo_item> 326 </combo_item>
356 <combo_item type="string" length="1" name="LandingPoint"> 327 <combo_item length="1" name="LandingPoint" type="string">
357 Lieu d&apos;arrivée défini 328 Lieu d&apos;arrivée défini
358 </combo_item> 329 </combo_item>
359 <combo_item type="string" length="1" name="Anywhere"> 330 <combo_item length="1" name="Anywhere" type="string">
360 Lieu d&apos;arrivée indéfini 331 Lieu d&apos;arrivée indéfini
361 </combo_item> 332 </combo_item>
362 </combo_box> 333 </combo_box>
@@ -371,17 +342,15 @@ Allez dans le menu Monde &gt; À propos du terrain ou sélectionnez une autre pa
371 <text name="with media:"> 342 <text name="with media:">
372 Type de média : 343 Type de média :
373 </text> 344 </text>
374 <combo_box name="media type" 345 <combo_box name="media type" tool_tip="Indiquez s&apos;il s&apos;agit de l&apos;URL d&apos;un film, d&apos;une page web ou autre"/>
375 tool_tip="Indiquez s&apos;il s&apos;agit de l&apos;URL d&apos;un film, d&apos;une page web ou autre" />
376 <text name="at URL:"> 346 <text name="at URL:">
377 URL du média : 347 URL du média :
378 </text> 348 </text>
379 <button label="Définir..." label_selected="Définir..." name="set_media_url" /> 349 <button label="Définir..." label_selected="Définir..." name="set_media_url"/>
380 <text name="Description:"> 350 <text name="Description:">
381 Description : 351 Description :
382 </text> 352 </text>
383 <line_editor name="url_description" 353 <line_editor name="url_description" tool_tip="Texte affiché à côté du bouton Jouer/Charger"/>
384 tool_tip="Texte affiché à côté du bouton Jouer/Charger" />
385 <text name="replace_texture_help"> 354 <text name="replace_texture_help">
386 (Les objets avec cette texture affichent le film ou 355 (Les objets avec cette texture affichent le film ou
387la page web quand vous cliquez sur la flèche Jouer). 356la page web quand vous cliquez sur la flèche Jouer).
@@ -390,20 +359,14 @@ la page web quand vous cliquez sur la flèche Jouer).
390 Options 359 Options
391média : 360média :
392 </text> 361 </text>
393 <check_box label="Média en boucle" name="media_loop" 362 <check_box label="Média en boucle" name="media_loop" tool_tip="Jouer le média en boucle. Lorsque le média aura fini de jouer, il recommencera."/>
394 tool_tip="Jouer le média en boucle. Lorsque le média aura fini de jouer, il recommencera." /> 363 <check_box label="Masquer l&apos;URL du média" name="hide_media_url" tool_tip="Si vous cochez cette option, les personnes non autorisées à accéder aux infos de cette parcelle ne verront pas l&apos;URL du média. Cette option n&apos;est pas disponible pour les fichiers HTML."/>
395 <check_box label="Masquer l&apos;URL du média" name="hide_media_url" 364 <check_box label="Masquer l&apos;URL de la musique" name="hide_music_url" tool_tip="Si vous cochez cette option, les personnes non autorisées à accéder aux infos de cette parcelle ne verront pas l&apos;URL de la musique."/>
396 tool_tip="Si vous cochez cette option, les personnes non autorisées à accéder aux infos de cette parcelle ne verront pas l&apos;URL du média. Cette option n&apos;est pas disponible pour les fichiers HTML." /> 365 <text name="media_size" tool_tip="Taille du média Web, laisser 0 pour la valeur par défaut.">
397 <check_box label="Masquer l&apos;URL de la musique" name="hide_music_url"
398 tool_tip="Si vous cochez cette option, les personnes non autorisées à accéder aux infos de cette parcelle ne verront pas l&apos;URL de la musique." />
399 <text name="media_size"
400 tool_tip="Taille du média Web, laisser 0 pour la valeur par défaut.">
401 Taille du média : 366 Taille du média :
402 </text> 367 </text>
403 <spinner name="media_size_width" 368 <spinner name="media_size_width" tool_tip="Taille du média Web, laisser 0 pour la valeur par défaut."/>
404 tool_tip="Taille du média Web, laisser 0 pour la valeur par défaut." /> 369 <spinner name="media_size_height" tool_tip="Taille du média Web, laisser 0 pour la valeur par défaut."/>
405 <spinner name="media_size_height"
406 tool_tip="Taille du média Web, laisser 0 pour la valeur par défaut." />
407 <text name="pixels"> 370 <text name="pixels">
408 pixels 371 pixels
409 </text> 372 </text>
@@ -413,23 +376,22 @@ média :
413 <text name="Sound:"> 376 <text name="Sound:">
414 Son : 377 Son :
415 </text> 378 </text>
416 <check_box label="Limiter le son spatial à cette parcelle" name="check sound local" /> 379 <check_box label="Limiter le son spatial à cette parcelle" name="check sound local"/>
417 <text type="string" length="1" name="Music URL:"> 380 <text length="1" name="Music URL:" type="string">
418 URL du flux : 381 URL du flux :
419 </text> 382 </text>
420 <text type="string" length="1" name="Media texture:"> 383 <text length="1" name="Media texture:" type="string">
421 Remplacer 384 Remplacer
422la texture : 385la texture :
423 </text> 386 </text>
424 <text type="string" length="1" name="Replace this texture:"> 387 <text length="1" name="Replace this texture:" type="string">
425 Remplacer cette texture : 388 Remplacer cette texture :
426 </text> 389 </text>
427 <texture_picker label="" name="media texture" tool_tip="Cliquez pour sélectionner une image" /> 390 <texture_picker label="" name="media texture" tool_tip="Cliquez pour sélectionner une image"/>
428 <text type="string" length="1" name="with content from this URL:"> 391 <text length="1" name="with content from this URL:" type="string">
429 par du contenu situé à l&apos;URL suivante : 392 par du contenu situé à l&apos;URL suivante :
430 </text> 393 </text>
431 <check_box label="Échelle automatique" name="media_auto_scale" 394 <check_box label="Échelle automatique" name="media_auto_scale" tool_tip="Si vous sélectionnez cette option, le contenu de cette parcelle sera automatiquement mis à l&apos;échelle. La qualité visuelle sera peut-être amoindrie mais vous n&apos;aurez à faire aucune autre mise à l&apos;échelle ou alignement."/>
432 tool_tip="Si vous sélectionnez cette option, le contenu de cette parcelle sera automatiquement mis à l&apos;échelle. La qualité visuelle sera peut-être amoindrie mais vous n&apos;aurez à faire aucune autre mise à l&apos;échelle ou alignement." />
433 <text name="Voice settings:"> 395 <text name="Voice settings:">
434 Voix : 396 Voix :
435 </text> 397 </text>
@@ -446,29 +408,23 @@ la texture :
446 </radio_group> 408 </radio_group>
447 </panel> 409 </panel>
448 <panel label="Accès" name="land_access_panel"> 410 <panel label="Accès" name="land_access_panel">
449 <text type="string" length="1" name="Limit access to this parcel to:"> 411 <text length="1" name="Limit access to this parcel to:" type="string">
450 Accès à cette parcelle 412 Accès à cette parcelle
451 </text> 413 </text>
452 <check_box label="Autoriser l&apos;accès public" name="public_access" /> 414 <check_box label="Autoriser l&apos;accès public" name="public_access"/>
453 <text name="Only Allow"> 415 <text name="Only Allow">
454 Bloquer l&apos;accès : 416 Bloquer l&apos;accès :
455 </text> 417 </text>
456 <check_box 418 <check_box label="Aux résidents qui n&apos;ont pas fourni leurs informations de paiement à Linden Lab" name="limit_payment" tool_tip="Aux résidents non identifés"/>
457 label="Aux résidents qui n&apos;ont pas fourni leurs informations de paiement à Linden Lab" 419 <check_box label="Aux résidents dont l&apos;âge n&apos;a pas été vérifié" name="limit_age_verified" tool_tip="Aux résidents dont l&apos;âge n&apos;a pas été vérifié. Pour plus d&apos;infos, consultez la page support.secondlife.com."/>
458 name="limit_payment" tool_tip="Aux résidents non identifés" />
459 <check_box label="Aux résidents dont l&apos;âge n&apos;a pas été vérifié"
460 name="limit_age_verified"
461 tool_tip="Aux résidents dont l&apos;âge n&apos;a pas été vérifié. Pour plus d&apos;infos, consultez la page support.secondlife.com." />
462 <string name="estate_override"> 420 <string name="estate_override">
463 Au moins une de ces options est définie au niveau du domaine. 421 Au moins une de ces options est définie au niveau du domaine.
464 </string> 422 </string>
465 <check_box label="Autoriser l&apos;accès au groupe : [GROUP]" name="GroupCheck" 423 <check_box label="Autoriser l&apos;accès au groupe : [GROUP]" name="GroupCheck" tool_tip="Définir le groupe à l&apos;onglet Général."/>
466 tool_tip="Définir le groupe à l&apos;onglet Général." /> 424 <check_box label="Avatars : (0 dans la liste, 300 max)" name="AccessCheck"/>
467 <check_box label="Avatars : (0 dans la liste, 300 max)" name="AccessCheck" /> 425 <button label="Ajouter..." label_selected="Ajouter..." name="Add..."/>
468 <button label="Ajouter..." label_selected="Ajouter..." name="Add..." /> 426 <button label="Retirer" label_selected="Retirer" name="Remove"/>
469 <button label="Retirer" label_selected="Retirer" name="Remove" /> 427 <check_box label="Vendre des pass à :" name="PassCheck" tool_tip="Autoriser un accès temporaire à cette parcelle"/>
470 <check_box label="Vendre des passes à :" name="PassCheck"
471 tool_tip="Autoriser un accès temporaire à cette parcelle" />
472 <combo_box name="pass_combo"> 428 <combo_box name="pass_combo">
473 <combo_item name="Anyone"> 429 <combo_item name="Anyone">
474 N&apos;importe qui 430 N&apos;importe qui
@@ -477,32 +433,31 @@ la texture :
477 Groupe 433 Groupe
478 </combo_item> 434 </combo_item>
479 </combo_box> 435 </combo_box>
480 <spinner label="Prix en $L :" name="PriceSpin" /> 436 <spinner label="Prix en L$ :" name="PriceSpin"/>
481 <spinner label="Heures d&apos;accès :" name="HoursSpin" /> 437 <spinner label="Heures d&apos;accès :" name="HoursSpin"/>
482 <text label="Toujours autoriser" name="AllowedText"> 438 <text label="Toujours autoriser" name="AllowedText">
483 Résidents autorisés 439 Résidents autorisés
484 </text> 440 </text>
485 <name_list name="AccessList" tool_tip="([LISTED] listés, [MAX] max)" /> 441 <name_list name="AccessList" tool_tip="([LISTED] listés, [MAX] max)"/>
486 <button label="Ajouter..." label_selected="Ajouter..." name="add_allowed" /> 442 <button label="Ajouter..." label_selected="Ajouter..." name="add_allowed"/>
487 <button label="Supprimer" label_selected="Supprimer" name="remove_allowed" /> 443 <button label="Supprimer" label_selected="Supprimer" name="remove_allowed"/>
488 <text label="Interdire" name="BanCheck"> 444 <text label="Bannir" name="BanCheck">
489 Résidents interdits 445 Résidents bannis
490 </text> 446 </text>
491 <name_list name="BannedList" tool_tip="([LISTED] listés, [MAX] max)" /> 447 <name_list name="BannedList" tool_tip="([LISTED] listés, [MAX] max)"/>
492 <button label="Ajouter..." label_selected="Ajouter..." name="add_banned" /> 448 <button label="Ajouter..." label_selected="Ajouter..." name="add_banned"/>
493 <button label="Supprimer" label_selected="Supprimer" name="remove_banned" /> 449 <button label="Supprimer" label_selected="Supprimer" name="remove_banned"/>
494 </panel> 450 </panel>
495 <panel label="Bannir" name="land_ban_panel"> 451 <panel label="Bannir" name="land_ban_panel">
496 <check_box label="Bannir les avatars suivants : (0 dans la liste, 300 max)" 452 <check_box label="Bannir les avatars suivants : (0 dans la liste, 300 max)" name="LandBanCheck"/>
497 name="LandBanCheck" /> 453 <button label="Ajouter..." label_selected="Ajouter..." name="Add..."/>
498 <button label="Ajouter..." label_selected="Ajouter..." name="Add..." /> 454 <button label="Retirer" label_selected="Retirer" name="Remove"/>
499 <button label="Retirer" label_selected="Retirer" name="Remove" /> 455 <text length="1" name="Deny by Payment Status:" type="string">
500 <text type="string" length="1" name="Deny by Payment Status:">
501 Refuser selon les infos de paiement : 456 Refuser selon les infos de paiement :
502 </text> 457 </text>
503 <check_box label="Refuser sans infos de paiement enregistrées" name="DenyAnonymousCheck" /> 458 <check_box label="Refuser sans infos de paiement enregistrées" name="DenyAnonymousCheck"/>
504 <check_box label="Refuser avec infos de paiement enregistrées" name="DenyIdentifiedCheck" /> 459 <check_box label="Refuser avec infos de paiement enregistrées" name="DenyIdentifiedCheck"/>
505 <check_box label="Refuser avec infos de paiement utilisées" name="DenyTransactedCheck" /> 460 <check_box label="Refuser avec infos de paiement utilisées" name="DenyTransactedCheck"/>
506 </panel> 461 </panel>
507 </tab_container> 462 </tab_container>
508</floater> 463</floater>
diff --git a/linden/indra/newview/skins/default/xui/fr/floater_active_speakers.xml b/linden/indra/newview/skins/default/xui/fr/floater_active_speakers.xml
index 4c39f36..6fe853f 100644
--- a/linden/indra/newview/skins/default/xui/fr/floater_active_speakers.xml
+++ b/linden/indra/newview/skins/default/xui/fr/floater_active_speakers.xml
@@ -1,11 +1,11 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 1<?xml version="1.0" encoding="utf-8" standalone="yes"?>
2<floater name="active_speakers" title="Intervenants actifs"> 2<floater name="active_speakers" title="Intervenants actifs">
3 <panel name="active_speakers_panel"> 3 <panel name="active_speakers_panel">
4 <scroll_list name="speakers_list"> 4 <scroll_list name="speakers_list">
5 <column label="Nom" name="speaker_name" /> 5 <column label="Nom" name="speaker_name"/>
6 </scroll_list> 6 </scroll_list>
7 <panel name="volume_container"> 7 <panel name="volume_container">
8 <button name="mute_btn" tool_tip="Rendre ce résident muet" /> 8 <button name="mute_btn" tool_tip="Ignorer ce résident"/>
9 </panel> 9 </panel>
10 </panel> 10 </panel>
11</floater> 11</floater>
diff --git a/linden/indra/newview/skins/default/xui/fr/floater_animation_preview.xml b/linden/indra/newview/skins/default/xui/fr/floater_animation_preview.xml
index 8614cd0..a38fd12 100644
--- a/linden/indra/newview/skins/default/xui/fr/floater_animation_preview.xml
+++ b/linden/indra/newview/skins/default/xui/fr/floater_animation_preview.xml
@@ -1,4 +1,4 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 1<?xml version="1.0" encoding="utf-8" standalone="yes"?>
2<floater name="Animation Preview" title=""> 2<floater name="Animation Preview" title="">
3 <text name="name_label"> 3 <text name="name_label">
4 Nom : 4 Nom :
@@ -6,13 +6,11 @@
6 <text name="description_label"> 6 <text name="description_label">
7 Description : 7 Description :
8 </text> 8 </text>
9 <spinner label="Priorité" name="priority" 9 <spinner label="Priorité" name="priority" tool_tip="Contrôle quelles animations peuvent êtres écrasées par cette animation."/>
10 tool_tip="Contrôle quelles animations peuvent êtres écrasées par cette animation." />
11 <text name="preview_label"> 10 <text name="preview_label">
12 Prévisualiser pendant 11 Prévisualiser pendant
13 </text> 12 </text>
14 <combo_box label="" name="preview_base_anim" 13 <combo_box label="" name="preview_base_anim" tool_tip="Utilisez cette option pour tester votre animation pendant que votre avatar fait des choses banales.">
15 tool_tip="Utilisez cette option pour tester votre animation pendant que votre avatar fait des choses banales.">
16 <combo_item name="Standing"> 14 <combo_item name="Standing">
17 Debout 15 Debout
18 </combo_item> 16 </combo_item>
@@ -26,16 +24,13 @@
26 En train de voler 24 En train de voler
27 </combo_item> 25 </combo_item>
28 </combo_box> 26 </combo_box>
29 <check_box label="Boucle" name="loop_check" tool_tip="Joue cette animation en boucle." /> 27 <check_box label="Boucle" name="loop_check" tool_tip="Joue cette animation en boucle."/>
30 <spinner label="Début (%)" name="loop_in_point" 28 <spinner label="Début (%)" name="loop_in_point" tool_tip="Définit le moment de l&apos;animation où la boucle repart."/>
31 tool_tip="Définit le moment de l&apos;animation où la boucle repart." /> 29 <spinner label="Fin (%)" name="loop_out_point" tool_tip="Définit le moment de l&apos;animation où la boucle finit."/>
32 <spinner label="Fin (%)" name="loop_out_point"
33 tool_tip="Définit le moment de l&apos;animation où la boucle finit." />
34 <text name="hand_label"> 30 <text name="hand_label">
35 Mouvement de main 31 Mouvement de main
36 </text> 32 </text>
37 <combo_box label="" name="hand_pose_combo" 33 <combo_box label="" name="hand_pose_combo" tool_tip="Contrôle le mouvement des mains au cours de l&apos;animation">
38 tool_tip="Contrôle le mouvement des mains au cours de lanimation">
39 <combo_item name="Spread"> 34 <combo_item name="Spread">
40 Doigts écartés 35 Doigts écartés
41 </combo_item> 36 </combo_item>
@@ -73,14 +68,13 @@
73 Taper 68 Taper
74 </combo_item> 69 </combo_item>
75 <combo_item name="PeaceRight"> 70 <combo_item name="PeaceRight">
76 Peace (droite) 71 Paix (main droite)
77 </combo_item> 72 </combo_item>
78 </combo_box> 73 </combo_box>
79 <text name="emote_label"> 74 <text name="emote_label">
80 Expression 75 Expression
81 </text> 76 </text>
82 <combo_box label="" name="emote_combo" 77 <combo_box label="" name="emote_combo" tool_tip="Contrôle l&apos;expression du visage au cours de l&apos;animation.">
83 tool_tip="Contrôle l&apos;expression du visage au cours de l&apos;animation.">
84 <combo_item name="[None]"> 78 <combo_item name="[None]">
85 [None] 79 [None]
86 </combo_item> 80 </combo_item>
@@ -142,20 +136,18 @@
142 Soucis 136 Soucis
143 </combo_item> 137 </combo_item>
144 </combo_box> 138 </combo_box>
145 <spinner label="Transition début (s)" name="ease_in_time" 139 <spinner label="Transition début (s)" name="ease_in_time" tool_tip="Durée (en secondes) pendant laquelle l&apos;animation s&apos;intègre au mouvement."/>
146 tool_tip="Durée (en secondes) pendant laquelle l&apos;animation s&apos;intègre au mouvement." /> 140 <spinner label="Transition fin (s)" name="ease_out_time" tool_tip="Durée (en secondes) pendant laquelle l&apos;animation disparaît du mouvement."/>
147 <spinner label="Transition fin (s)" name="ease_out_time" 141 <button label="" name="play_btn" tool_tip="Jouer/Pauser votre animation."/>
148 tool_tip="Durée (en secondes) pendant laquelle l&apos;animation disparaît du mouvement." /> 142 <button label="" name="stop_btn" tool_tip="Arrêter le playback"/>
149 <button label="" name="play_btn" tool_tip="Jouer/Pauser votre animation." /> 143 <slider label="" name="playback_slider"/>
150 <button label="" name="stop_btn" tool_tip="Arrêter le playback" />
151 <slider label="" name="playback_slider" />
152 <text name="bad_animation_text"> 144 <text name="bad_animation_text">
153 Impossible de lire le fichier d&apos;animation. 145 Impossible de lire le fichier d&apos;animation.
154 146
155Nous recommandons les fichiers BVH extraits de Poser 4. 147Nous recommandons les fichiers BVH extraits de Poser 4.
156 </text> 148 </text>
157 <button label="Annuler" name="cancel_btn" /> 149 <button label="Annuler" name="cancel_btn"/>
158 <button label="Charger ([AMOUNT] $L)" name="ok_btn" /> 150 <button label="Charger ([AMOUNT] L$)" name="ok_btn"/>
159 <string name="failed_to_initialize"> 151 <string name="failed_to_initialize">
160 Echec de l&apos;initialisation du mouvement 152 Echec de l&apos;initialisation du mouvement
161 </string> 153 </string>
diff --git a/linden/indra/newview/skins/default/xui/fr/floater_avatar_picker.xml b/linden/indra/newview/skins/default/xui/fr/floater_avatar_picker.xml
index 91e30a9..d98cb5a 100644
--- a/linden/indra/newview/skins/default/xui/fr/floater_avatar_picker.xml
+++ b/linden/indra/newview/skins/default/xui/fr/floater_avatar_picker.xml
@@ -1,4 +1,4 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 1<?xml version="1.0" encoding="utf-8" standalone="yes"?>
2<floater name="avatarpicker" title="Choisir le résident"> 2<floater name="avatarpicker" title="Choisir le résident">
3 <text name="Type part of the person&apos;s name:"> 3 <text name="Type part of the person&apos;s name:">
4 Entrez les premières lettres du nom de la personne : 4 Entrez les premières lettres du nom de la personne :
@@ -6,15 +6,15 @@
6 <text name="instruct_search_resident_name"> 6 <text name="instruct_search_resident_name">
7 Saisissez une partie du nom du résident : 7 Saisissez une partie du nom du résident :
8 </text> 8 </text>
9 <button label="Trouver" label_selected="Trouver" name="Find" /> 9 <button label="Chercher" label_selected="Chercher" name="Find"/>
10 <text name="Or select a calling card:"> 10 <text name="Or select a calling card:">
11 Ou sélectionnez une carte de visite : 11 Ou sélectionnez une carte de visite :
12 </text> 12 </text>
13 <text name="Or select their calling card:"> 13 <text name="Or select their calling card:">
14 Ou choisissez une carte de visite : 14 Ou sélectionnez une carte de visite :
15 </text> 15 </text>
16 <button label="Sélectionner" label_selected="Sélectionner" name="Select" /> 16 <button label="Sélectionner" label_selected="Sélectionner" name="Select"/>
17 <button label="Fermer" label_selected="Fermer" name="Close" /> 17 <button label="Fermer" label_selected="Fermer" name="Close"/>
18 <text name="NotFound"> 18 <text name="NotFound">
19 &apos;[TEXT]&apos; introuvable 19 &apos;[TEXT]&apos; introuvable
20 </text> 20 </text>
diff --git a/linden/indra/newview/skins/default/xui/fr/floater_buy_contents.xml b/linden/indra/newview/skins/default/xui/fr/floater_buy_contents.xml
index a008f33..a305c30 100644
--- a/linden/indra/newview/skins/default/xui/fr/floater_buy_contents.xml
+++ b/linden/indra/newview/skins/default/xui/fr/floater_buy_contents.xml
@@ -1,14 +1,14 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 1<?xml version="1.0" encoding="utf-8" standalone="yes"?>
2<floater name="floater_buy_contents" title="Acheter des contenus"> 2<floater name="floater_buy_contents" title="Acheter des contenus">
3 <text name="contains_text"> 3 <text name="contains_text">
4 [NAME] contient : 4 [NAME] contient :
5 </text> 5 </text>
6 <text name="buy_text"> 6 <text name="buy_text">
7 Acheter [AMOUNT] $L à [NAME] ? 7 Acheter [AMOUNT] L$ à [NAME] ?
8 </text> 8 </text>
9 <button label="Annuler" label_selected="Annuler" name="cancel_btn" /> 9 <button label="Annuler" label_selected="Annuler" name="cancel_btn"/>
10 <button label="Acheter" label_selected="Acheter" name="buy_btn" /> 10 <button label="Acheter" label_selected="Acheter" name="buy_btn"/>
11 <check_box label="Porter maintenant" name="wear_check" /> 11 <check_box label="Porter maintenant" name="wear_check"/>
12 <string name="no_copy_text"> 12 <string name="no_copy_text">
13 (pas de copie) 13 (pas de copie)
14 </string> 14 </string>
diff --git a/linden/indra/newview/skins/default/xui/fr/floater_buy_currency.xml b/linden/indra/newview/skins/default/xui/fr/floater_buy_currency.xml
index 91fa5a3..f6c7455 100644
--- a/linden/indra/newview/skins/default/xui/fr/floater_buy_currency.xml
+++ b/linden/indra/newview/skins/default/xui/fr/floater_buy_currency.xml
@@ -1,4 +1,4 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 1<?xml version="1.0" encoding="utf-8" standalone="yes"?>
2<floater name="buy currency" title="Acheter des devises"> 2<floater name="buy currency" title="Acheter des devises">
3 <text left="5" name="info_buying"> 3 <text left="5" name="info_buying">
4 Achat de devises : 4 Achat de devises :
@@ -12,24 +12,24 @@
12 <text name="error_message"> 12 <text name="error_message">
13 Quelque chose ne va pas. 13 Quelque chose ne va pas.
14 </text> 14 </text>
15 <button label="Aller sur le site" name="error_web" /> 15 <button label="Aller sur le site" name="error_web"/>
16 <text name="contacting"> 16 <text name="contacting">
17 En train de contacter Lindex... 17 En train de contacter le Lindex...
18 </text> 18 </text>
19 <text name="buy_action_unknown" right="-5"> 19 <text name="buy_action_unknown" right="-5">
20 Acheter des $L sur le marché des changes du LindeX 20 Acheter des L$ sur le marché des changes du LindeX
21 </text> 21 </text>
22 <text name="buy_action"> 22 <text name="buy_action">
23 [NAME] $L [PRICE] 23 [NAME] L$ [PRICE]
24 </text> 24 </text>
25 <text name="currency_action"> 25 <text name="currency_action">
26 Acheter des $L 26 Acheter des L$
27 </text> 27 </text>
28 <line_editor name="currency_amt"> 28 <line_editor name="currency_amt">
29 1234 29 1234
30 </line_editor> 30 </line_editor>
31 <text name="currency_est" width="138"> 31 <text name="currency_est" width="138">
32 pour environ [USD] $US 32 pour environ [USD] US$
33 </text> 33 </text>
34 <text name="getting_data" width="138"> 34 <text name="getting_data" width="138">
35 Obtention des données... 35 Obtention des données...
@@ -38,19 +38,19 @@
38 Actuellement, vous avez 38 Actuellement, vous avez
39 </text> 39 </text>
40 <text name="balance_amount"> 40 <text name="balance_amount">
41 [AMT] $L 41 [AMT] L$
42 </text> 42 </text>
43 <text name="buying_label"> 43 <text name="buying_label">
44 Vous achetez 44 Vous achetez
45 </text> 45 </text>
46 <text name="buying_amount"> 46 <text name="buying_amount">
47 [AMT] $L 47 [AMT] L$
48 </text> 48 </text>
49 <text name="total_label"> 49 <text name="total_label">
50 Votre solde sera de 50 Votre solde sera de
51 </text> 51 </text>
52 <text name="total_amount"> 52 <text name="total_amount">
53 [AMT] $L 53 [AMT] L$
54 </text> 54 </text>
55 <text name="purchase_warning_repurchase"> 55 <text name="purchase_warning_repurchase">
56 En confirmant cette transaction, vous achetez uniquement les devises. 56 En confirmant cette transaction, vous achetez uniquement les devises.
@@ -60,9 +60,9 @@ Vous devrez recommencer cette opération.
60 Vous n&apos;achetez pas assez de devises. 60 Vous n&apos;achetez pas assez de devises.
61Veuillez saisir un montant plus élevé. 61Veuillez saisir un montant plus élevé.
62 </text> 62 </text>
63 <button label="Acheter" name="buy_btn" /> 63 <button label="Acheter" name="buy_btn"/>
64 <button label="Annuler" name="cancel_btn" /> 64 <button label="Annuler" name="cancel_btn"/>
65 <string name="buy_currency"> 65 <string name="buy_currency">
66 Acheter [LINDENS] $L pour environ [USD] $US 66 Acheter [LINDENS] L$ pour environ [USD] US$
67 </string> 67 </string>
68</floater> 68</floater>
diff --git a/linden/indra/newview/skins/default/xui/fr/floater_buy_land.xml b/linden/indra/newview/skins/default/xui/fr/floater_buy_land.xml
index 9cdb3ad..a8a88df 100644
--- a/linden/indra/newview/skins/default/xui/fr/floater_buy_land.xml
+++ b/linden/indra/newview/skins/default/xui/fr/floater_buy_land.xml
@@ -1,4 +1,4 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 1<?xml version="1.0" encoding="utf-8" standalone="yes"?>
2<floater name="buy land" title="Acheter le terrain"> 2<floater name="buy land" title="Acheter le terrain">
3 <text name="region_name_label"> 3 <text name="region_name_label">
4 Région : 4 Région :
@@ -33,7 +33,7 @@
33 <text_editor name="covenant_editor"> 33 <text_editor name="covenant_editor">
34 Chargement en cours... 34 Chargement en cours...
35 </text_editor> 35 </text_editor>
36 <check_box label="J&apos;accepte le règlement ci-dessus." name="agree_covenant" /> 36 <check_box label="J&apos;accepte le règlement ci-dessus." name="agree_covenant"/>
37 <text name="info_parcel_label"> 37 <text name="info_parcel_label">
38 Parcelle : 38 Parcelle :
39 </text> 39 </text>
@@ -50,7 +50,7 @@
50 Prix : 50 Prix :
51 </text> 51 </text>
52 <text name="info_price"> 52 <text name="info_price">
53 1500 $L, objets inclus 53 1500 L$, objets inclus
54 </text> 54 </text>
55 <text name="info_action"> 55 <text name="info_action">
56 Si vous achetez ce terrain : 56 Si vous achetez ce terrain :
@@ -58,7 +58,7 @@
58 <text name="error_message"> 58 <text name="error_message">
59 Quelque chose ne va pas. 59 Quelque chose ne va pas.
60 </text> 60 </text>
61 <button label="Aller sur le site" name="error_web" /> 61 <button label="Aller sur le site" name="error_web"/>
62 <text name="account_action"> 62 <text name="account_action">
63 Vous passerez à un compte Premium. 63 Vous passerez à un compte Premium.
64 </text> 64 </text>
@@ -67,44 +67,43 @@
67 </text> 67 </text>
68 <combo_box name="account_level"> 68 <combo_box name="account_level">
69 <combo_item name="US$9.95/month,billedmonthly"> 69 <combo_item name="US$9.95/month,billedmonthly">
70 9,95 $US/mois, facturation mensuelle 70 9,95 US$/mois, facturation mensuelle
71 </combo_item> 71 </combo_item>
72 <combo_item name="US$7.50/month,billedquarterly"> 72 <combo_item name="US$7.50/month,billedquarterly">
73 7,50 $US/mois, facturation trimestrielle 73 7,50 US$/mois, facturation trimestrielle
74 </combo_item> 74 </combo_item>
75 <combo_item name="US$6.00/month,billedannually"> 75 <combo_item name="US$6.00/month,billedannually">
76 6,00 $US/mois, facturation annuelle 76 6,00 US$/mois, facturation annuelle
77 </combo_item> 77 </combo_item>
78 </combo_box> 78 </combo_box>
79 <text name="land_use_action"> 79 <text name="land_use_action">
80 Augmentez vos frais d&apos;occupation de terrain à 40 $US/mois. 80 Augmentez vos frais d&apos;occupation de terrain à 40 US$/mois.
81 </text> 81 </text>
82 <text name="land_use_reason"> 82 <text name="land_use_reason">
83 Vous possédez un terrain de 1,309 mètres carrés. 83 Vous possédez un terrain de 1,309 mètres carrés.
84Cette parcelle fait 512 mètres carrés. 84Cette parcelle fait 512 mètres carrés.
85 </text> 85 </text>
86 <text name="purchase_action"> 86 <text name="purchase_action">
87 Payez au résident X 4 000 $L pour le terrain 87 Payez au résident X 4 000 L$ pour le terrain
88 </text> 88 </text>
89 <text name="currency_reason"> 89 <text name="currency_reason">
90 Vous avez 2 100 $L. 90 Vous avez 2 100 L$.
91 </text> 91 </text>
92 <text name="currency_action"> 92 <text name="currency_action">
93 Acheter des $L 93 Acheter des L$
94 </text> 94 </text>
95 <line_editor name="currency_amt"> 95 <line_editor name="currency_amt">
96 1000 96 1000
97 </line_editor> 97 </line_editor>
98 <text name="currency_est"> 98 <text name="currency_est">
99 pour environ [AMOUNT2] $US 99 pour environ [AMOUNT2] US$
100 </text> 100 </text>
101 <text name="currency_balance"> 101 <text name="currency_balance">
102 Vous avez 2 100 $L. 102 Vous avez 2 100 L$.
103 </text> 103 </text>
104 <check_box label="Supprimer [AMOUNT] mètres carrés de votre contribution au groupe." 104 <check_box label="Supprimer [AMOUNT] mètres carrés de votre contribution au groupe." name="remove_contribution"/>
105 name="remove_contribution" /> 105 <button label="Acheter" name="buy_btn"/>
106 <button label="Acheter" name="buy_btn" /> 106 <button label="Annuler" name="cancel_btn"/>
107 <button label="Annuler" name="cancel_btn" />
108 <text name="can_resell"> 107 <text name="can_resell">
109 Peut être revendu. 108 Peut être revendu.
110 </text> 109 </text>
@@ -184,20 +183,20 @@ et la seule fois où vous pouvez acheter une parcelle &apos;Premier Terrain&apos
184 </text> 183 </text>
185 <text name="first_time_but_not_first_land"> 184 <text name="first_time_but_not_first_land">
186 Ceci est votre première acquisition de terrain, mais cette 185 Ceci est votre première acquisition de terrain, mais cette
187parcelle n&apos;est pas réservée aux nouveaux acheteurs. Vous devriez 186parcelle n&apos;est pas réservée aux nouveaux acheteurs. Vous devriez
188peut-être chercher une parcelle &apos;Premier Terrain&apos; moins chère. 187peut-être chercher une parcelle Premier Terrain moins chère.
189 </text> 188 </text>
190 <text name="land_holdings"> 189 <text name="land_holdings">
191 Vous possédez un terrain de [BUYER] mètres carrés. 190 Vous possédez un terrain de [BUYER] m².
192 </text> 191 </text>
193 <text name="pay_to_for_land"> 192 <text name="pay_to_for_land">
194 Payez [AMOUNT] $L à [SELLER] pour ce terrain 193 Payez [AMOUNT] L$ à [SELLER] pour ce terrain
195 </text> 194 </text>
196 <text name="buy_for_US"> 195 <text name="buy_for_US">
197 Acheter [AMOUNT] $L pour environ [AMOUNT2] $US, 196 Acheter [AMOUNT] L$ pour environ [AMOUNT2] US$,
198 </text> 197 </text>
199 <text name="parcel_meters"> 198 <text name="parcel_meters">
200 Cette parcelle fait [AMOUNT] mètres carrés. 199 Cette parcelle fait [AMOUNT] m².
201 </text> 200 </text>
202 <text name="premium_land"> 201 <text name="premium_land">
203 Ce terrain est premium et les frais associés sont de [AMOUNT]/m². 202 Ce terrain est premium et les frais associés sont de [AMOUNT]/m².
@@ -215,21 +214,21 @@ peut-être chercher une parcelle &apos;Premier Terrain&apos; moins chère.
215 Ce groupe, [GROUP], aura besoin de suffisamment de crédit pour payer les frais d&apos;occupation de terrain avant que l&apos;achat de cette parcelle ne soit finalisé. 214 Ce groupe, [GROUP], aura besoin de suffisamment de crédit pour payer les frais d&apos;occupation de terrain avant que l&apos;achat de cette parcelle ne soit finalisé.
216 </text> 215 </text>
217 <text name="have_enough_lindens"> 216 <text name="have_enough_lindens">
218 Vous avez [AMOUNT]$L, ce qui est suffisant pour acheter ce terrain. 217 Vous avez [AMOUNT]L$, ce qui est suffisant pour acheter ce terrain.
219 </text> 218 </text>
220 <text name="not_enough_lindens"> 219 <text name="not_enough_lindens">
221 Vous n&apos;avez que [AMOUNT] $L et vous avez besoin de [AMOUNT2] $L de plus. 220 Vous n&apos;avez que [AMOUNT] L$ et vous avez besoin de [AMOUNT2] L$ de plus.
222 </text> 221 </text>
223 <text name="balance_left"> 222 <text name="balance_left">
224 Après cet achat, il vous restera [AMOUNT] $L. 223 Après cet achat, il vous restera [AMOUNT] L$.
225 </text> 224 </text>
226 <text name="balance_needed"> 225 <text name="balance_needed">
227 Pour avoir les moyens d&apos;acquérir ce terrain, vous devez acheter au moins [AMOUNT] $L. 226 Pour avoir les moyens d&apos;acquérir ce terrain, vous devez acheter au moins [AMOUNT] L$.
228 </text> 227 </text>
229 <string name="no_parcel_selected"> 228 <string name="no_parcel_selected">
230 (aucune parcelle sélectionnée) 229 (aucune parcelle sélectionnée)
231 </string> 230 </string>
232 <string name="buy_currency"> 231 <string name="buy_currency">
233 Acheter [LINDENS] $L pour environ [USD] $US 232 Acheter [LINDENS] L$ pour environ [USD] US$
234 </string> 233 </string>
235</floater> 234</floater>
diff --git a/linden/indra/newview/skins/default/xui/fr/floater_buy_object.xml b/linden/indra/newview/skins/default/xui/fr/floater_buy_object.xml
index 9cdb72e..2bbbbc9 100644
--- a/linden/indra/newview/skins/default/xui/fr/floater_buy_object.xml
+++ b/linden/indra/newview/skins/default/xui/fr/floater_buy_object.xml
@@ -1,13 +1,13 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 1<?xml version="1.0" encoding="utf-8" standalone="yes"?>
2<floater name="contents" title="Acheter une copie de l&apos;objet"> 2<floater name="contents" title="Acheter une copie de l&apos;objet">
3 <text name="contents_text"> 3 <text name="contents_text">
4 et ses contenus : 4 et ses contenus :
5 </text> 5 </text>
6 <text name="buy_text"> 6 <text name="buy_text">
7 Acheter pour [AMOUNT] $L à [NAME] ? 7 Acheter pour [AMOUNT] L$ à [NAME] ?
8 </text> 8 </text>
9 <button label="Annuler" label_selected="Annuler" name="cancel_btn" /> 9 <button label="Annuler" label_selected="Annuler" name="cancel_btn"/>
10 <button label="Acheter" label_selected="Acheter" name="buy_btn" /> 10 <button label="Acheter" label_selected="Acheter" name="buy_btn"/>
11 <string name="title_buy_text"> 11 <string name="title_buy_text">
12 Acheter 12 Acheter
13 </string> 13 </string>
diff --git a/linden/indra/newview/skins/default/xui/fr/floater_chat_history.xml b/linden/indra/newview/skins/default/xui/fr/floater_chat_history.xml
index 0f6633c..705bf97 100644
--- a/linden/indra/newview/skins/default/xui/fr/floater_chat_history.xml
+++ b/linden/indra/newview/skins/default/xui/fr/floater_chat_history.xml
@@ -1,4 +1,4 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 1<?xml version="1.0" encoding="utf-8" standalone="yes"?>
2<floater name="chat floater" title="Chat local"> 2<floater name="chat floater" title="Chat local">
3 <string name="ringing"> 3 <string name="ringing">
4 Connexion au chat vocal du Monde en cours… 4 Connexion au chat vocal du Monde en cours…
@@ -10,16 +10,16 @@
10 Voix non disponible à l&apos;endroit où vous êtes 10 Voix non disponible à l&apos;endroit où vous êtes
11 </string> 11 </string>
12 <string name="hang_up"> 12 <string name="hang_up">
13 Déconnecté du chat vocal du Monde 13 Déconnecté du chat vocal
14 </string> 14 </string>
15 <string name="voice_icon"> 15 <string name="voice_icon">
16 icn_voice-localchat.tga 16 icn_voice-localchat.tga
17 </string> 17 </string>
18 <string name="IM_logging_string"> 18 <string name="IM_logging_string">
19 -- Connexion de messagerie instantanée activée -- 19 -- Archivage des IM activé --
20 </string> 20 </string>
21 <string name="IM_end_log_string"> 21 <string name="IM_end_log_string">
22 - Fin da la connexion -- 22 - Fin de l&apos;archivage --
23 </string> 23 </string>
24 <layout_stack name="panels"> 24 <layout_stack name="panels">
25 <layout_panel name="im_contents_panel"> 25 <layout_panel name="im_contents_panel">
@@ -28,14 +28,13 @@
28 Gestes 28 Gestes
29 </combo_item> 29 </combo_item>
30 </combo_box> 30 </combo_box>
31 <check_box label="Afficher le texte ignoré" name="show mutes" /> 31 <check_box label="Afficher le texte ignoré" name="show mutes"/>
32 <button label="&lt; &lt;" label_selected="&gt; &gt;" name="toggle_active_speakers_btn" 32 <button label="&lt; &lt;" label_selected="&gt; &gt;" name="toggle_active_speakers_btn" tool_tip="Affichez/masquez la liste des intervenants actifs dans cette session IM."/>
33 tool_tip="Cliquez ici pour voir la liste des intervenants actifs dans cette session IM." />
34 <panel name="chat_panel"> 33 <panel name="chat_panel">
35 <string name="gesture_label"> 34 <string name="gesture_label">
36 Gestes 35 Gestes
37 </string> 36 </string>
38 <line_editor label="Cliquez ici pour chatter." name="Chat Editor" /> 37 <line_editor label="Cliquez ici pour chatter." name="Chat Editor"/>
39 <flyout_button label="Dire" name="Say" tool_tip="(Entrée)"> 38 <flyout_button label="Dire" name="Say" tool_tip="(Entrée)">
40 <flyout_button_item name="shout_item"> 39 <flyout_button_item name="shout_item">
41 Crier 40 Crier
diff --git a/linden/indra/newview/skins/default/xui/fr/floater_color_picker.xml b/linden/indra/newview/skins/default/xui/fr/floater_color_picker.xml
index b21e1b3..f6c210c 100644
--- a/linden/indra/newview/skins/default/xui/fr/floater_color_picker.xml
+++ b/linden/indra/newview/skins/default/xui/fr/floater_color_picker.xml
@@ -1,5 +1,5 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 1<?xml version="1.0" encoding="utf-8" standalone="yes"?>
2<floater name="ColorPicker" title="Sélecteur de couleurs"> 2<floater name="ColorPicker" title="Choix de texture et de couleur">
3 <text name="r_val_text"> 3 <text name="r_val_text">
4 Rouge : 4 Rouge :
5 </text> 5 </text>
@@ -18,14 +18,14 @@
18 <text name="l_val_text"> 18 <text name="l_val_text">
19 Lum : 19 Lum :
20 </text> 20 </text>
21 <check_box label="Appliquer immédiatement" name="apply_immediate" left="4" width="108"/> 21 <check_box label="Application auto" left="4" name="apply_immediate" width="108"/>
22 <button label="" label_selected="" name="color_pipette" left_delta="138"/> 22 <button label="" label_selected="" left_delta="138" name="color_pipette"/>
23 <button label="Annuler" label_selected="Annuler" name="cancel_btn" /> 23 <button label="Annuler" label_selected="Annuler" name="cancel_btn"/>
24 <button label="Sélectionner" label_selected="Sélectionner" name="select_btn" /> 24 <button label="Sélectionner" label_selected="Sélectionner" name="select_btn"/>
25 <text name="Current color:" left="8"> 25 <text left="8" name="Current color:">
26 Couleur actuelle : 26 Couleur actuelle :
27 </text> 27 </text>
28 <text name="(Drag below to save.)" left="8" width="114"> 28 <text left="8" name="(Drag below to save.)" width="114">
29 (Faire glisser dessous 29 (Faire glisser dessous
30pour enregistrer.) 30pour enregistrer.)
31 </text> 31 </text>
diff --git a/linden/indra/newview/skins/default/xui/fr/floater_customize.xml b/linden/indra/newview/skins/default/xui/fr/floater_customize.xml
index 24b5054..9985a17 100644
--- a/linden/indra/newview/skins/default/xui/fr/floater_customize.xml
+++ b/linden/indra/newview/skins/default/xui/fr/floater_customize.xml
@@ -1,525 +1,449 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 1<?xml version="1.0" encoding="utf-8" standalone="yes"?>
2<floater name="floater customize" title="Apparence" width="511"> 2<floater name="floater customize" title="Apparence" width="511">
3 <tab_container name="customize tab container" tab_min_width="113" width="509"> 3 <tab_container name="customize tab container" tab_min_width="113" width="509">
4 <panel label="Parties du corps" /> 4 <panel label="Parties du corps"/>
5 <panel label="Parties du corps" name="body_parts_placeholder" /> 5 <panel label="Parties du corps" name="body_parts_placeholder"/>
6 <panel label="Silhouette" left="119" name="Shape" width="389"> 6 <panel label="Silhouette" left="119" name="Shape" width="389">
7 <button label="Créer une silhouette" label_selected="Créer une silhouette" 7 <button label="Créer une silhouette" label_selected="Créer une silhouette" name="Create New" width="140"/>
8 name="Create New" width="140" /> 8 <button label="Enlever" label_selected="Enlever" left="12" name="Take Off" width="82"/>
9 <button label="Enlever" label_selected="Enlever" left="12" name="Take Off" width="82" /> 9 <button label="Enregistrer" label_selected="Enregistrer" left="100" name="Save" width="82"/>
10 <button label="Enregistrer" label_selected="Enregistrer" left="100" name="Save" 10 <button label="Enregistrer sous" label_selected="Enregistrer sous" left="188" name="Save As" width="105"/>
11 width="82" /> 11 <button label="Rétablir" label_selected="Rétablir" left="299" name="Revert" width="82"/>
12 <button label="Enregistrer sous" label_selected="Enregistrer sous" left="188" 12 <button label="Corps" label_selected="Corps" name="Body"/>
13 name="Save As" width="105" /> 13 <button label="Tête" label_selected="Tête" name="Head"/>
14 <button label="Rétablir" label_selected="Rétablir" left="299" name="Revert" 14 <button label="Yeux" label_selected="Yeux" name="Eyes"/>
15 width="82" /> 15 <button label="Oreilles" label_selected="Oreilles" name="Ears"/>
16 <button label="Corps" label_selected="Corps" name="Body" /> 16 <button label="Nez" label_selected="Nez" name="Nose"/>
17 <button label="Tête" label_selected="Tête" name="Head" /> 17 <button label="Bouche" label_selected="Bouche" name="Mouth"/>
18 <button label="Yeux" label_selected="Yeux" name="Eyes" /> 18 <button label="Menton" label_selected="Menton" name="Chin"/>
19 <button label="Oreilles" label_selected="Oreilles" name="Ears" /> 19 <button label="Torse" label_selected="Torse" name="Torso"/>
20 <button label="Nez" label_selected="Nez" name="Nose" /> 20 <button label="Jambes" label_selected="Jambes" name="Legs"/>
21 <button label="Bouche" label_selected="Bouche" name="Mouth" /> 21 <button label="Aléatoire" label_selected="Aléatoire" name="Randomize"/>
22 <button label="Menton" label_selected="Menton" name="Chin" /> 22 <text length="1" name="title" type="string">
23 <button label="Torse" label_selected="Torse" name="Torso" />
24 <button label="Jambes" label_selected="Jambes" name="Legs" />
25 <button label="Aléatoire" label_selected="Aléatoire" name="Randomize" />
26 <text type="string" length="1" name="title">
27 [DESC] 23 [DESC]
28 </text> 24 </text>
29 <text type="string" length="1" name="title_no_modify"> 25 <text length="1" name="title_no_modify" type="string">
30 [DESC]: impossible de modifier 26 [DESC]: impossible de modifier
31 </text> 27 </text>
32 <text type="string" length="1" name="title_loading"> 28 <text length="1" name="title_loading" type="string">
33 [DESC]: en cours de chargement... 29 [DESC]: en cours de chargement...
34 </text> 30 </text>
35 <text type="string" length="1" name="title_not_worn"> 31 <text length="1" name="title_not_worn" type="string">
36 [DESC]: non portée 32 [DESC]: non portée
37 </text> 33 </text>
38 <text type="string" length="1" name="path"> 34 <text length="1" name="path" type="string">
39 Emplacement : [PATH] 35 Emplacement : [PATH]
40 </text> 36 </text>
41 <text type="string" length="1" name="not worn instructions"> 37 <text length="1" name="not worn instructions" type="string">
42 Pour changer de silhouette, faites-en glisser une à partir de votre 38 Pour changer de silhouette, faites-en glisser une à partir de votre
43inventaire. jusqu&apos;à votre avatar. L&apos;autre possibilité est d&apos;en créer 39inventaire jusqu&apos;à votre avatar. Vous pouvez aussi en créer une nouvelle et la porter.
44une nouvelle et de la porter. 40une nouvelle et de la porter.
45 </text> 41 </text>
46 <text type="string" length="1" name="no modify instructions"> 42 <text length="1" name="no modify instructions" type="string">
47 Vous n&apos;avez pas la permission de modifier cet objet. 43 Vous n&apos;avez pas la permission de modifier cet objet.
48 </text> 44 </text>
49 <radio_group name="sex radio"> 45 <radio_group name="sex radio">
50 <radio_item type="string" length="1" name="radio"> 46 <radio_item length="1" name="radio" type="string">
51 Femme 47 Femme
52 </radio_item> 48 </radio_item>
53 <radio_item type="string" length="1" name="radio2"> 49 <radio_item length="1" name="radio2" type="string">
54 Homme 50 Homme
55 </radio_item> 51 </radio_item>
56 </radio_group> 52 </radio_group>
57 </panel> 53 </panel>
58 <panel label="Peau" name="Skin"> 54 <panel label="Peau" name="Skin">
59 <button label="Créer une peau" label_selected="Créer une peau" name="Create New" /> 55 <button label="Créer une peau" label_selected="Créer une peau" name="Create New"/>
60 <button label="Enlever" label_selected="Enlever" left="12" name="Take Off" width="82" /> 56 <button label="Enlever" label_selected="Enlever" left="12" name="Take Off" width="82"/>
61 <button label="Enregistrer" label_selected="Enregistrer" left="100" name="Save" 57 <button label="Enregistrer" label_selected="Enregistrer" left="100" name="Save" width="82"/>
62 width="82" /> 58 <button label="Enregistrer sous" label_selected="Enregistrer sous" left="188" name="Save As" width="105"/>
63 <button label="Enregistrer sous" label_selected="Enregistrer sous" left="188" 59 <button label="Rétablir" label_selected="Rétablir" left="299" name="Revert" width="82"/>
64 name="Save As" width="105" /> 60 <button label="Couleur" label_selected="Couleur" name="Skin Color" width="84"/>
65 <button label="Rétablir" label_selected="Rétablir" left="299" name="Revert" 61 <button label="Détails visage" label_selected="Détails visage" name="Face Detail" width="84"/>
66 width="82" /> 62 <button label="Maquillage" label_selected="Maquillage" name="Makeup" width="84"/>
67 <button label="Couleur" label_selected="Couleur" name="Skin Color" width="84" /> 63 <button label="Détails corps" label_selected="Détails corps" name="Body Detail" width="84"/>
68 <button label="Détails visage" label_selected="Détails visage" name="Face Detail" 64 <button label="Aléatoire" label_selected="Aléatoire" name="Randomize" width="84"/>
69 width="84" /> 65 <text length="1" name="title" type="string">
70 <button label="Maquillage" label_selected="Maquillage" name="Makeup" width="84" />
71 <button label="Détails corps" label_selected="Détails corps" name="Body Detail"
72 width="84" />
73 <button label="Aléatoire" label_selected="Aléatoire" name="Randomize" width="84" />
74 <text type="string" length="1" name="title">
75 [DESC] 66 [DESC]
76 </text> 67 </text>
77 <text type="string" length="1" name="title_no_modify"> 68 <text length="1" name="title_no_modify" type="string">
78 [DESC]: impossible de modifier 69 [DESC]: impossible de modifier
79 </text> 70 </text>
80 <text type="string" length="1" name="title_loading"> 71 <text length="1" name="title_loading" type="string">
81 [DESC]: en cours de chargement... 72 [DESC]: en cours de chargement...
82 </text> 73 </text>
83 <text type="string" length="1" name="title_not_worn"> 74 <text length="1" name="title_not_worn" type="string">
84 [DESC]: non portée 75 [DESC]: non portée
85 </text> 76 </text>
86 <text type="string" length="1" name="path"> 77 <text length="1" name="path" type="string">
87 Emplacement : [PATH] 78 Emplacement : [PATH]
88 </text> 79 </text>
89 <text type="string" length="1" name="not worn instructions"> 80 <text length="1" name="not worn instructions" type="string">
90 Pour changer de peau, faites-en glisser une à partir de votre inventaire. 81 Pour changer de peau, faites-en glisser une à partir de votre inventaire.
91L&apos;autre possibilité est d&apos;en créer une nouvelle et de la porter. 82Vous pouvez aussi en créer une nouvelle et la porter.
92 </text> 83 </text>
93 <text type="string" length="1" name="no modify instructions"> 84 <text length="1" name="no modify instructions" type="string">
94 Vous n&apos;avez pas la permission de modifier cet objet. 85 Vous n&apos;avez pas la permission de modifier cet objet.
95 </text> 86 </text>
96 <texture_picker label="Tatouages tête" name="Head Tattoos" 87 <texture_picker label="Tatouages tête" name="Head Tattoos" tool_tip="Cliquez pour sélectionner une image" width="78"/>
97 tool_tip="Cliquez pour sélectionner une image" width="78" /> 88 <texture_picker label="Tatouages haut" name="Upper Tattoos" tool_tip="Cliquez pour sélectionner une image" width="78"/>
98 <texture_picker label="Tatouages haut" name="Upper Tattoos" 89 <texture_picker label="Tatouages bas" name="Lower Tattoos" tool_tip="Cliquez pour sélectionner une image" width="78"/>
99 tool_tip="Cliquez pour sélectionner une image" width="78" />
100 <texture_picker label="Tatouages bas" name="Lower Tattoos"
101 tool_tip="Cliquez pour sélectionner une image" width="78" />
102 </panel> 90 </panel>
103 <panel label="Cheveux" name="Hair"> 91 <panel label="Cheveux" name="Hair">
104 <button label="Créer des cheveux" label_selected="Créer des cheveux" 92 <button label="Créer des cheveux" label_selected="Créer des cheveux" name="Create New"/>
105 name="Create New" /> 93 <button label="Enlever" label_selected="Enlever" left="12" name="Take Off" width="82"/>
106 <button label="Enlever" label_selected="Enlever" left="12" name="Take Off" width="82" /> 94 <button label="Enregistrer" label_selected="Enregistrer" left="100" name="Save" width="82"/>
107 <button label="Enregistrer" label_selected="Enregistrer" left="100" name="Save" 95 <button label="Enregistrer sous" label_selected="Enregistrer sous" left="188" name="Save As" width="105"/>
108 width="82" /> 96 <button label="Rétablir" label_selected="Rétablir" left="299" name="Revert" width="82"/>
109 <button label="Enregistrer sous" label_selected="Enregistrer sous" left="188" 97 <button label="Couleur" label_selected="Couleur" name="Color"/>
110 name="Save As" width="105" /> 98 <button label="Style" label_selected="Style" name="Style"/>
111 <button label="Rétablir" label_selected="Rétablir" left="299" name="Revert" 99 <button label="Sourcils" label_selected="Sourcils" name="Eyebrows"/>
112 width="82" /> 100 <button label="Pilosité" label_selected="Pilosité" name="Facial"/>
113 <button label="Couleur" label_selected="Couleur" name="Color" /> 101 <button label="Aléatoire" label_selected="Aléatoire" name="Randomize"/>
114 <button label="Style" label_selected="Style" name="Style" /> 102 <text length="1" name="title" type="string">
115 <button label="Sourcils" label_selected="Sourcils" name="Eyebrows" />
116 <button label="Pilosité" label_selected="Pilosité" name="Facial" />
117 <button label="Aléatoire" label_selected="Aléatoire" name="Randomize" />
118 <text type="string" length="1" name="title">
119 [DESC] 103 [DESC]
120 </text> 104 </text>
121 <text type="string" length="1" name="title_no_modify"> 105 <text length="1" name="title_no_modify" type="string">
122 [DESC]: impossible de modifier 106 [DESC]: impossible de modifier
123 </text> 107 </text>
124 <text type="string" length="1" name="title_loading"> 108 <text length="1" name="title_loading" type="string">
125 [DESC]: en cours de chargement... 109 [DESC]: en cours de chargement...
126 </text> 110 </text>
127 <text type="string" length="1" name="title_not_worn"> 111 <text length="1" name="title_not_worn" type="string">
128 [DESC]: non portés 112 [DESC]: non portés
129 </text> 113 </text>
130 <text type="string" length="1" name="path"> 114 <text length="1" name="path" type="string">
131 Emplacement : [PATH] 115 Emplacement : [PATH]
132 </text> 116 </text>
133 <text type="string" length="1" name="not worn instructions"> 117 <text length="1" name="not worn instructions" type="string">
134 Pour changer de chevelure, faites-en glisser une de votre inventaire 118 Pour changer de chevelure, faites-en glisser une de votre inventaire
135jusqu&apos;à votre avatar. L&apos;autre possibilité est d&apos;en créer une 119jusqu&apos;à votre avatar. Vous pouvez aussi en créer une
136nouvelle et de la porter. 120nouvelle et la porter.
137 </text> 121 </text>
138 <text type="string" length="1" name="no modify instructions"> 122 <text length="1" name="no modify instructions" type="string">
139 Vous n&apos;avez pas la permission de modifier cet objet. 123 Vous n&apos;avez pas la permission de modifier cet objet.
140 </text> 124 </text>
141 <texture_picker label="Texture" name="Texture" tool_tip="Cliquez pour sélectionner une image" /> 125 <texture_picker label="Texture" name="Texture" tool_tip="Cliquez pour sélectionner une image"/>
142 </panel> 126 </panel>
143 <panel label="Yeux" name="Eyes"> 127 <panel label="Yeux" name="Eyes">
144 <button label="Créer des yeux" label_selected="Créer des yeux" name="Create New" /> 128 <button label="Créer des yeux" label_selected="Créer des yeux" name="Create New"/>
145 <button label="Enlever" label_selected="Enlever" left="12" name="Take Off" width="82" /> 129 <button label="Enlever" label_selected="Enlever" left="12" name="Take Off" width="82"/>
146 <button label="Enregistrer" label_selected="Enregistrer" left="100" name="Save" 130 <button label="Enregistrer" label_selected="Enregistrer" left="100" name="Save" width="82"/>
147 width="82" /> 131 <button label="Enregistrer sous" label_selected="Enregistrer sous" left="188" name="Save As" width="105"/>
148 <button label="Enregistrer sous" label_selected="Enregistrer sous" left="188" 132 <button label="Rétablir" label_selected="Rétablir" left="299" name="Revert" width="82"/>
149 name="Save As" width="105" /> 133 <button label="Aléatoire" label_selected="Aléatoire" name="Randomize"/>
150 <button label="Rétablir" label_selected="Rétablir" left="299" name="Revert" 134 <text length="1" name="title" type="string">
151 width="82" />
152 <button label="Aléatoire" label_selected="Aléatoire" name="Randomize" />
153 <text type="string" length="1" name="title">
154 [DESC] 135 [DESC]
155 </text> 136 </text>
156 <text type="string" length="1" name="title_no_modify"> 137 <text length="1" name="title_no_modify" type="string">
157 [DESC]: impossible de modifier 138 [DESC]: impossible de modifier
158 </text> 139 </text>
159 <text type="string" length="1" name="title_loading"> 140 <text length="1" name="title_loading" type="string">
160 [DESC]: en cours de chargement... 141 [DESC]: en cours de chargement...
161 </text> 142 </text>
162 <text type="string" length="1" name="title_not_worn"> 143 <text length="1" name="title_not_worn" type="string">
163 [DESC]: non portés 144 [DESC]: non portés
164 </text> 145 </text>
165 <text type="string" length="1" name="path"> 146 <text length="1" name="path" type="string">
166 Emplacement : [PATH] 147 Emplacement : [PATH]
167 </text> 148 </text>
168 <text type="string" length="1" name="not worn instructions"> 149 <text length="1" name="not worn instructions" type="string">
169 Pour changer vos yeux, faites-les glisser de votre inventaire 150 Pour changer vos yeux, faites-les glisser de votre inventaire
170jusqu&apos;à votre avatar. L&apos;autre possibilité est 151jusqu&apos;à votre avatar. Vous pouvez aussi en créer de nouveaux et les porter.
171d&apos;en créer de nouveaux et de les porter.
172 </text> 152 </text>
173 <text type="string" length="1" name="no modify instructions"> 153 <text length="1" name="no modify instructions" type="string">
174 Vous n&apos;avez pas la permission de modifier cet objet. 154 Vous n&apos;avez pas la permission de modifier cet objet.
175 </text> 155 </text>
176 <texture_picker label="Iris" name="Iris" tool_tip="Cliquez pour sélectionner une image" /> 156 <texture_picker label="Iris" name="Iris" tool_tip="Cliquez pour sélectionner une image"/>
177 </panel> 157 </panel>
178 <panel label="Vêtements" /> 158 <panel label="Vêtements"/>
179 <panel label="Habits" name="clothes_placeholder" /> 159 <panel label="Habits" name="clothes_placeholder"/>
180 <panel label="Chemise" name="Shirt"> 160 <panel label="Chemise" name="Shirt">
181 <button label="Créer une chemise" label_selected="Créer une chemise" 161 <button label="Créer une chemise" label_selected="Créer une chemise" name="Create New"/>
182 name="Create New" /> 162 <button label="Enlever" label_selected="Enlever" left="12" name="Take Off" width="82"/>
183 <button label="Enlever" label_selected="Enlever" left="12" name="Take Off" width="82" /> 163 <button label="Enregistrer" label_selected="Enregistrer" left="100" name="Save" width="82"/>
184 <button label="Enregistrer" label_selected="Enregistrer" left="100" name="Save" 164 <button label="Enregistrer sous" label_selected="Enregistrer sous" left="188" name="Save As" width="105"/>
185 width="82" /> 165 <button label="Rétablir" label_selected="Rétablir" left="299" name="Revert" width="82"/>
186 <button label="Enregistrer sous" label_selected="Enregistrer sous" left="188" 166 <text length="1" name="title" type="string">
187 name="Save As" width="105" />
188 <button label="Rétablir" label_selected="Rétablir" left="299" name="Revert"
189 width="82" />
190 <text type="string" length="1" name="title">
191 [DESC] 167 [DESC]
192 </text> 168 </text>
193 <text type="string" length="1" name="title_no_modify"> 169 <text length="1" name="title_no_modify" type="string">
194 [DESC]: impossible de modifier 170 [DESC]: impossible de modifier
195 </text> 171 </text>
196 <text type="string" length="1" name="title_loading"> 172 <text length="1" name="title_loading" type="string">
197 [DESC]: en cours de chargement... 173 [DESC]: en cours de chargement...
198 </text> 174 </text>
199 <text type="string" length="1" name="title_not_worn"> 175 <text length="1" name="title_not_worn" type="string">
200 [DESC]: non porté 176 [DESC]: non portée
201 </text> 177 </text>
202 <text type="string" length="1" name="path"> 178 <text length="1" name="path" type="string">
203 Emplacement : [PATH] 179 Emplacement : [PATH]
204 </text> 180 </text>
205 <text type="string" length="1" name="not worn instructions"> 181 <text length="1" name="not worn instructions" type="string">
206 Pour changer de chemise, faites-en glisser une de votre inventaire 182 Pour changer de chemise, faites-en glisser une de votre inventaire
207jusqu&apos;à votre avatar. L&apos;autre possibilité est 183jusqu&apos;à votre avatar. Vous pouvez aussi en créer une nouvelle et la porter.
208d&apos;en créer une nouvelle et de la porter.
209 </text> 184 </text>
210 <text type="string" length="1" name="no modify instructions"> 185 <text length="1" name="no modify instructions" type="string">
211 Vous n&apos;avez pas la permission de modifier cet objet. 186 Vous n&apos;avez pas la permission de modifier cet objet.
212 </text> 187 </text>
213 <color_swatch label="Couleur/Teinte" name="Color/Tint" 188 <color_swatch label="Couleur/Teinte" name="Color/Tint" tool_tip="Cliquer pour ouvrir le sélecteur de couleurs" width="74"/>
214 tool_tip="Cliquer pour ouvrir le sélecteur de couleurs" width="74" /> 189 <texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image" width="74"/>
215 <texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image"
216 width="74" />
217 </panel> 190 </panel>
218 <panel label="Pantalon" name="Pants"> 191 <panel label="Pantalon" name="Pants">
219 <button label="Créer un pantalon" label_selected="Créer un pantalon" 192 <button label="Créer un pantalon" label_selected="Créer un pantalon" name="Create New"/>
220 name="Create New" /> 193 <button label="Enlever" label_selected="Enlever" left="12" name="Take Off" width="82"/>
221 <button label="Enlever" label_selected="Enlever" left="12" name="Take Off" width="82" /> 194 <button label="Enregistrer" label_selected="Enregistrer" left="100" name="Save" width="82"/>
222 <button label="Enregistrer" label_selected="Enregistrer" left="100" name="Save" 195 <button label="Enregistrer sous" label_selected="Enregistrer sous" left="188" name="Save As" width="105"/>
223 width="82" /> 196 <button label="Rétablir" label_selected="Rétablir" left="299" name="Revert" width="82"/>
224 <button label="Enregistrer sous" label_selected="Enregistrer sous" left="188" 197 <text length="1" name="title" type="string">
225 name="Save As" width="105" />
226 <button label="Rétablir" label_selected="Rétablir" left="299" name="Revert"
227 width="82" />
228 <text type="string" length="1" name="title">
229 [DESC] 198 [DESC]
230 </text> 199 </text>
231 <text type="string" length="1" name="title_no_modify"> 200 <text length="1" name="title_no_modify" type="string">
232 [DESC]: impossible de modifier 201 [DESC]: impossible de modifier
233 </text> 202 </text>
234 <text type="string" length="1" name="title_loading"> 203 <text length="1" name="title_loading" type="string">
235 [DESC]: en cours de chargement... 204 [DESC]: en cours de chargement...
236 </text> 205 </text>
237 <text type="string" length="1" name="title_not_worn"> 206 <text length="1" name="title_not_worn" type="string">
238 [DESC]: non porté 207 [DESC]: non porté
239 </text> 208 </text>
240 <text type="string" length="1" name="path"> 209 <text length="1" name="path" type="string">
241 Emplacement : [PATH] 210 Emplacement : [PATH]
242 </text> 211 </text>
243 <text type="string" length="1" name="not worn instructions"> 212 <text length="1" name="not worn instructions" type="string">
244 Pour changer de pantalon, faites-en glisser un de votre inventaire 213 Pour changer de pantalon, faites-en glisser un de votre inventaire
245jusqu&apos;à votre avatar. L&apos;autre possibilité est 214jusqu&apos;à votre avatar. Vous pouvez aussi en créer un nouveau et le porter.
246d&apos;en créer un nouveau et de le porter.
247 </text> 215 </text>
248 <text type="string" length="1" name="no modify instructions"> 216 <text length="1" name="no modify instructions" type="string">
249 Vous n&apos;avez pas la permission de modifier cet objet. 217 Vous n&apos;avez pas la permission de modifier cet objet.
250 </text> 218 </text>
251 <color_swatch label="Couleur/Teinte" name="Color/Tint" 219 <color_swatch label="Couleur/Teinte" name="Color/Tint" tool_tip="Cliquer pour ouvrir le sélecteur de couleurs" width="74"/>
252 tool_tip="Cliquer pour ouvrir le sélecteur de couleurs" width="74" /> 220 <texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image" width="74"/>
253 <texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image"
254 width="74" />
255 </panel> 221 </panel>
256 <panel label="Chaussures" name="Shoes"> 222 <panel label="Chaussures" name="Shoes">
257 <button label="Créer des chaussures" label_selected="Créer des chaussures" 223 <button label="Créer des chaussures" label_selected="Créer des chaussures" name="Create New" width="140"/>
258 name="Create New" width="140" /> 224 <button label="Enlever" label_selected="Enlever" left="12" name="Take Off" width="82"/>
259 <button label="Enlever" label_selected="Enlever" left="12" name="Take Off" width="82" /> 225 <button label="Enregistrer" label_selected="Enregistrer" left="100" name="Save" width="82"/>
260 <button label="Enregistrer" label_selected="Enregistrer" left="100" name="Save" 226 <button label="Enregistrer sous" label_selected="Enregistrer sous" left="188" name="Save As" width="105"/>
261 width="82" /> 227 <button label="Rétablir" label_selected="Rétablir" left="299" name="Revert" width="82"/>
262 <button label="Enregistrer sous" label_selected="Enregistrer sous" left="188" 228 <text length="1" name="title" type="string">
263 name="Save As" width="105" />
264 <button label="Rétablir" label_selected="Rétablir" left="299" name="Revert"
265 width="82" />
266 <text type="string" length="1" name="title">
267 [DESC] 229 [DESC]
268 </text> 230 </text>
269 <text type="string" length="1" name="title_no_modify"> 231 <text length="1" name="title_no_modify" type="string">
270 [DESC]: impossible de modifier 232 [DESC]: impossible de modifier
271 </text> 233 </text>
272 <text type="string" length="1" name="title_loading"> 234 <text length="1" name="title_loading" type="string">
273 [DESC]: en cours de chargement... 235 [DESC]: en cours de chargement...
274 </text> 236 </text>
275 <text type="string" length="1" name="title_not_worn"> 237 <text length="1" name="title_not_worn" type="string">
276 [DESC]: non portées 238 [DESC]: non portées
277 </text> 239 </text>
278 <text type="string" length="1" name="path"> 240 <text length="1" name="path" type="string">
279 Emplacement : [PATH] 241 Emplacement : [PATH]
280 </text> 242 </text>
281 <text type="string" length="1" name="not worn instructions"> 243 <text length="1" name="not worn instructions" type="string">
282 Pour changer de chaussures, faites-en glisser une paire de votre 244 Pour changer de chaussures, faites-en glisser une paire de votre
283inventaire jusqu&apos;à votre avatar. L&apos;autre possibilité est d&apos;en créer une 245inventaire jusqu&apos;à votre avatar. Vous pouvez aussi en créer une
284nouvelle paire et de la porter. 246nouvelle paire et la porter.
285 </text> 247 </text>
286 <text type="string" length="1" name="no modify instructions"> 248 <text length="1" name="no modify instructions" type="string">
287 Vous n&apos;avez pas la permission de modifier cet objet. 249 Vous n&apos;avez pas la permission de modifier cet objet.
288 </text> 250 </text>
289 <color_swatch label="Couleur/Teinte" name="Color/Tint" 251 <color_swatch label="Couleur/Teinte" name="Color/Tint" tool_tip="Cliquer pour ouvrir le sélecteur de couleurs" width="74"/>
290 tool_tip="Cliquer pour ouvrir le sélecteur de couleurs" width="74" /> 252 <texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image" width="74"/>
291 <texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image"
292 width="74" />
293 </panel> 253 </panel>
294 <panel label="Chaussettes" name="Socks"> 254 <panel label="Chaussettes" name="Socks">
295 <button label="Créer des chaussettes" label_selected="Créer des chaussettes" 255 <button label="Créer des chaussettes" label_selected="Créer des chaussettes" name="Create New" width="140"/>
296 name="Create New" width="140" /> 256 <button label="Enlever" label_selected="Enlever" left="12" name="Take Off" width="82"/>
297 <button label="Enlever" label_selected="Enlever" left="12" name="Take Off" width="82" /> 257 <button label="Enregistrer" label_selected="Enregistrer" left="100" name="Save" width="82"/>
298 <button label="Enregistrer" label_selected="Enregistrer" left="100" name="Save" 258 <button label="Enregistrer sous" label_selected="Enregistrer sous" left="188" name="Save As" width="105"/>
299 width="82" /> 259 <button label="Rétablir" label_selected="Rétablir" left="299" name="Revert" width="82"/>
300 <button label="Enregistrer sous" label_selected="Enregistrer sous" left="188" 260 <text length="1" name="title" type="string">
301 name="Save As" width="105" />
302 <button label="Rétablir" label_selected="Rétablir" left="299" name="Revert"
303 width="82" />
304 <text type="string" length="1" name="title">
305 [DESC] 261 [DESC]
306 </text> 262 </text>
307 <text type="string" length="1" name="title_no_modify"> 263 <text length="1" name="title_no_modify" type="string">
308 [DESC]: impossible de modifier 264 [DESC]: impossible de modifier
309 </text> 265 </text>
310 <text type="string" length="1" name="title_loading"> 266 <text length="1" name="title_loading" type="string">
311 [DESC]: en cours de chargement... 267 [DESC]: en cours de chargement...
312 </text> 268 </text>
313 <text type="string" length="1" name="title_not_worn"> 269 <text length="1" name="title_not_worn" type="string">
314 [DESC]: non portées 270 [DESC]: non portées
315 </text> 271 </text>
316 <text type="string" length="1" name="path"> 272 <text length="1" name="path" type="string">
317 Emplacement : [PATH] 273 Emplacement : [PATH]
318 </text> 274 </text>
319 <text type="string" length="1" name="not worn instructions"> 275 <text length="1" name="not worn instructions" type="string">
320 Pour changer de chaussettes, faites-en glisser une paire de votre 276 Pour changer de chaussettes, faites-en glisser une paire de votre
321inventaire jusqu&apos;à votre avatar. L&apos;autre possibilité est d&apos;en créer une 277inventaire jusqu&apos;à votre avatar. Vous pouvez aussi en créer une
322nouvelle paire et de la porter. 278nouvelle paire et la porter.
323 </text> 279 </text>
324 <text type="string" length="1" name="no modify instructions"> 280 <text length="1" name="no modify instructions" type="string">
325 Vous n&apos;avez pas la permission de modifier cet objet. 281 Vous n&apos;avez pas la permission de modifier cet objet.
326 </text> 282 </text>
327 <color_swatch label="Couleur/Teinte" name="Color/Tint" 283 <color_swatch label="Couleur/Teinte" name="Color/Tint" tool_tip="Cliquer pour ouvrir le sélecteur de couleurs" width="74"/>
328 tool_tip="Cliquer pour ouvrir le sélecteur de couleurs" width="74" /> 284 <texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image" width="74"/>
329 <texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image"
330 width="74" />
331 </panel> 285 </panel>
332 <panel label="Veste" name="Jacket"> 286 <panel label="Veste" name="Jacket">
333 <button label="Créer une veste" label_selected="Créer une veste" name="Create New" /> 287 <button label="Créer une veste" label_selected="Créer une veste" name="Create New"/>
334 <button label="Enlever" label_selected="Enlever" left="12" name="Take Off" width="82" /> 288 <button label="Enlever" label_selected="Enlever" left="12" name="Take Off" width="82"/>
335 <button label="Enregistrer" label_selected="Enregistrer" left="100" name="Save" 289 <button label="Enregistrer" label_selected="Enregistrer" left="100" name="Save" width="82"/>
336 width="82" /> 290 <button label="Enregistrer sous" label_selected="Enregistrer sous" left="188" name="Save As" width="105"/>
337 <button label="Enregistrer sous" label_selected="Enregistrer sous" left="188" 291 <button label="Rétablir" label_selected="Rétablir" left="299" name="Revert" width="82"/>
338 name="Save As" width="105" /> 292 <text length="1" name="title" type="string">
339 <button label="Rétablir" label_selected="Rétablir" left="299" name="Revert"
340 width="82" />
341 <text type="string" length="1" name="title">
342 [DESC] 293 [DESC]
343 </text> 294 </text>
344 <text type="string" length="1" name="title_no_modify"> 295 <text length="1" name="title_no_modify" type="string">
345 [DESC]: impossible de modifier 296 [DESC]: impossible de modifier
346 </text> 297 </text>
347 <text type="string" length="1" name="title_loading"> 298 <text length="1" name="title_loading" type="string">
348 [DESC]: en cours de chargement... 299 [DESC]: en cours de chargement...
349 </text> 300 </text>
350 <text type="string" length="1" name="title_not_worn"> 301 <text length="1" name="title_not_worn" type="string">
351 [DESC]: non portée 302 [DESC]: non portée
352 </text> 303 </text>
353 <text type="string" length="1" name="path"> 304 <text length="1" name="path" type="string">
354 Emplacement : [PATH] 305 Emplacement : [PATH]
355 </text> 306 </text>
356 <text type="string" length="1" name="not worn instructions"> 307 <text length="1" name="not worn instructions" type="string">
357 Pour changer de veste, faites-en glisser une de votre inventaire 308 Pour changer de veste, faites-en glisser une de votre inventaire
358jusqu&apos;à votre avatar. L&apos;autre possibilité est d&apos;en créer une 309jusqu&apos;à votre avatar. Vous pouvez aussi en créer une
359nouvelle et de la porter. 310nouvelle et la porter.
360 </text> 311 </text>
361 <text type="string" length="1" name="no modify instructions"> 312 <text length="1" name="no modify instructions" type="string">
362 Vous n&apos;avez pas la permission de modifier cet objet. 313 Vous n&apos;avez pas la permission de modifier cet objet.
363 </text> 314 </text>
364 <color_swatch label="Couleur/Teinte" name="Color/Tint" 315 <color_swatch label="Couleur/Teinte" name="Color/Tint" tool_tip="Cliquer pour ouvrir le sélecteur de couleurs" width="81"/>
365 tool_tip="Cliquer pour ouvrir le sélecteur de couleurs" width="81" /> 316 <texture_picker label="Tissu (dessus)" name="Upper Fabric" tool_tip="Cliquez pour sélectionner une image" width="81"/>
366 <texture_picker label="Tissu (dessus)" name="Upper Fabric" 317 <texture_picker label="Tissu (dessous)" name="Lower Fabric" tool_tip="Cliquez pour sélectionner une image" width="81"/>
367 tool_tip="Cliquez pour sélectionner une image" width="81" />
368 <texture_picker label="Tissu (dessous)" name="Lower Fabric"
369 tool_tip="Cliquez pour sélectionner une image" width="81" />
370 </panel> 318 </panel>
371 <panel label="Gants" name="Gloves"> 319 <panel label="Gants" name="Gloves">
372 <button label="Créer des gants" label_selected="Créer des gants" name="Create New" /> 320 <button label="Créer des gants" label_selected="Créer des gants" name="Create New"/>
373 <button label="Enlever" label_selected="Enlever" left="12" name="Take Off" width="82" /> 321 <button label="Enlever" label_selected="Enlever" left="12" name="Take Off" width="82"/>
374 <button label="Enregistrer" label_selected="Enregistrer" left="100" name="Save" 322 <button label="Enregistrer" label_selected="Enregistrer" left="100" name="Save" width="82"/>
375 width="82" /> 323 <button label="Enregistrer sous" label_selected="Enregistrer sous" left="188" name="Save As" width="105"/>
376 <button label="Enregistrer sous" label_selected="Enregistrer sous" left="188" 324 <button label="Rétablir" label_selected="Rétablir" left="299" name="Revert" width="82"/>
377 name="Save As" width="105" /> 325 <text length="1" name="title" type="string">
378 <button label="Rétablir" label_selected="Rétablir" left="299" name="Revert"
379 width="82" />
380 <text type="string" length="1" name="title">
381 [DESC] 326 [DESC]
382 </text> 327 </text>
383 <text type="string" length="1" name="title_no_modify"> 328 <text length="1" name="title_no_modify" type="string">
384 [DESC]: impossible de modifier 329 [DESC]: impossible de modifier
385 </text> 330 </text>
386 <text type="string" length="1" name="title_loading"> 331 <text length="1" name="title_loading" type="string">
387 [DESC]: en cours de chargement... 332 [DESC]: en cours de chargement...
388 </text> 333 </text>
389 <text type="string" length="1" name="title_not_worn"> 334 <text length="1" name="title_not_worn" type="string">
390 [DESC]: non portés 335 [DESC]: non portés
391 </text> 336 </text>
392 <text type="string" length="1" name="path"> 337 <text length="1" name="path" type="string">
393 Emplacement : [PATH] 338 Emplacement : [PATH]
394 </text> 339 </text>
395 <text type="string" length="1" name="not worn instructions"> 340 <text length="1" name="not worn instructions" type="string">
396 Pour changer de gants, faites-en glisser une paire à partir de votre 341 Pour changer de gants, faites-en glisser une paire à partir de votre
397inventaire. L&apos;autre possibilité est d&apos;en créer une nouvelle paire 342inventaire. Vous pouvez aussi en créer une nouvelle paire
398et de la porter. 343et la porter.
399 </text> 344 </text>
400 <text type="string" length="1" name="no modify instructions"> 345 <text length="1" name="no modify instructions" type="string">
401 Vous n&apos;avez pas la permission de modifier cet objet. 346 Vous n&apos;avez pas la permission de modifier cet objet.
402 </text> 347 </text>
403 <color_swatch label="Couleur/Teinte" name="Color/Tint" 348 <color_swatch label="Couleur/Teinte" name="Color/Tint" tool_tip="Cliquer pour ouvrir le sélecteur de couleurs" width="74"/>
404 tool_tip="Cliquer pour ouvrir le sélecteur de couleurs" width="74" /> 349 <texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image" width="74"/>
405 <texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image"
406 width="74" />
407 </panel> 350 </panel>
408 <panel label="Tricot de peau" name="Undershirt"> 351 <panel label="Tricot de peau" name="Undershirt">
409 <button label="Créer un tricot de peau" label_selected="Créer un tricot" 352 <button label="Créer un tricot de peau" label_selected="Créer un tricot" name="Create New"/>
410 name="Create New" /> 353 <button label="Enlever" label_selected="Enlever" left="12" name="Take Off" width="82"/>
411 <button label="Enlever" label_selected="Enlever" left="12" name="Take Off" width="82" /> 354 <button label="Enregistrer" label_selected="Enregistrer" left="100" name="Save" width="82"/>
412 <button label="Enregistrer" label_selected="Enregistrer" left="100" name="Save" 355 <button label="Enregistrer sous" label_selected="Enregistrer sous" left="188" name="Save As" width="105"/>
413 width="82" /> 356 <button label="Rétablir" label_selected="Rétablir" left="299" name="Revert" width="82"/>
414 <button label="Enregistrer sous" label_selected="Enregistrer sous" left="188" 357 <text length="1" name="title" type="string">
415 name="Save As" width="105" />
416 <button label="Rétablir" label_selected="Rétablir" left="299" name="Revert"
417 width="82" />
418 <text type="string" length="1" name="title">
419 [DESC] 358 [DESC]
420 </text> 359 </text>
421 <text type="string" length="1" name="title_no_modify"> 360 <text length="1" name="title_no_modify" type="string">
422 [DESC]: impossible de modifier 361 [DESC]: impossible de modifier
423 </text> 362 </text>
424 <text type="string" length="1" name="title_loading"> 363 <text length="1" name="title_loading" type="string">
425 [DESC]: en cours de chargement... 364 [DESC]: en cours de chargement...
426 </text> 365 </text>
427 <text type="string" length="1" name="title_not_worn"> 366 <text length="1" name="title_not_worn" type="string">
428 [DESC]: non porté 367 [DESC]: non porté
429 </text> 368 </text>
430 <text type="string" length="1" name="path"> 369 <text length="1" name="path" type="string">
431 Emplacement : [PATH] 370 Emplacement : [PATH]
432 </text> 371 </text>
433 <text type="string" length="1" name="not worn instructions"> 372 <text length="1" name="not worn instructions" type="string">
434 Pour changer de tricot, faites-en glisser un à partir de votre inventaire. 373 Pour changer de tricot, faites-en glisser un à partir de votre inventaire.
435L&apos;autre possibilité est d&apos;en créer un nouveau et de le porter. 374Vous pouvez aussi en créer un nouveau et le porter.
436 </text> 375 </text>
437 <text type="string" length="1" name="no modify instructions"> 376 <text length="1" name="no modify instructions" type="string">
438 Vous n&apos;avez pas la permission de modifier cet objet. 377 Vous n&apos;avez pas la permission de modifier cet objet.
439 </text> 378 </text>
440 <color_swatch label="Couleur/Teinte" name="Color/Tint" 379 <color_swatch label="Couleur/Teinte" name="Color/Tint" tool_tip="Cliquer pour ouvrir le sélecteur de couleurs" width="74"/>
441 tool_tip="Cliquer pour ouvrir le sélecteur de couleurs" width="74" /> 380 <texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image" width="74"/>
442 <texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image"
443 width="74" />
444 </panel> 381 </panel>
445 <panel label="Sous-vêtements" name="Underpants"> 382 <panel label="Sous-vêtements" name="Underpants">
446 <button label="Créer des sous-vêtements" label_selected="Créer des sous-vêtements" 383 <button label="Créer des sous-vêtements" label_selected="Créer des sous-vêtements" name="Create New"/>
447 name="Create New" /> 384 <button label="Enlever" label_selected="Enlever" left="12" name="Take Off" width="82"/>
448 <button label="Enlever" label_selected="Enlever" left="12" name="Take Off" width="82" /> 385 <button label="Enregistrer" label_selected="Enregistrer" left="100" name="Save" width="82"/>
449 <button label="Enregistrer" label_selected="Enregistrer" left="100" name="Save" 386 <button label="Enregistrer sous" label_selected="Enregistrer sous" left="188" name="Save As" width="105"/>
450 width="82" /> 387 <button label="Rétablir" label_selected="Rétablir" left="299" name="Revert" width="82"/>
451 <button label="Enregistrer sous" label_selected="Enregistrer sous" left="188" 388 <text length="1" name="title" type="string">
452 name="Save As" width="105" />
453 <button label="Rétablir" label_selected="Rétablir" left="299" name="Revert"
454 width="82" />
455 <text type="string" length="1" name="title">
456 [DESC] 389 [DESC]
457 </text> 390 </text>
458 <text type="string" length="1" name="title_no_modify"> 391 <text length="1" name="title_no_modify" type="string">
459 [DESC]: impossible de modifier 392 [DESC]: impossible de modifier
460 </text> 393 </text>
461 <text type="string" length="1" name="title_loading"> 394 <text length="1" name="title_loading" type="string">
462 [DESC]: en cours de chargement... 395 [DESC]: en cours de chargement...
463 </text> 396 </text>
464 <text type="string" length="1" name="title_not_worn"> 397 <text length="1" name="title_not_worn" type="string">
465 [DESC]: non portés 398 [DESC]: non portés
466 </text> 399 </text>
467 <text type="string" length="1" name="path"> 400 <text length="1" name="path" type="string">
468 Emplacement : [PATH] 401 Emplacement : [PATH]
469 </text> 402 </text>
470 <text type="string" length="1" name="not worn instructions"> 403 <text length="1" name="not worn instructions" type="string">
471 Pour changer de sous-vêtement, faites-en glisser un à partir de votre 404 Pour changer de sous-vêtement, faites-en glisser une paire à partir de votre
472inventaire. L&apos;autre possibilité est d&apos;en créer un nouveau et de le porter. 405inventaire. Vous pouvez aussi en créer des nouveaux et les porter.
473 </text> 406 </text>
474 <text type="string" length="1" name="no modify instructions"> 407 <text length="1" name="no modify instructions" type="string">
475 Vous n&apos;avez pas la permission de modifier cet objet. 408 Vous n&apos;avez pas la permission de modifier cet objet.
476 </text> 409 </text>
477 <color_swatch label="Couleur/Teinte" name="Color/Tint" 410 <color_swatch label="Couleur/Teinte" name="Color/Tint" tool_tip="Cliquer pour ouvrir le sélecteur de couleurs" width="74"/>
478 tool_tip="Cliquer pour ouvrir le sélecteur de couleurs" width="74" /> 411 <texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image" width="74"/>
479 <texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image"
480 width="74" />
481 </panel> 412 </panel>
482 <panel label="Jupe" name="Skirt"> 413 <panel label="Jupe" name="Skirt">
483 <button label="Créer une jupe" label_selected="Créer une jupe" name="Create New" /> 414 <button label="Créer une jupe" label_selected="Créer une jupe" name="Create New"/>
484 <button label="Enlever" label_selected="Enlever" left="12" name="Take Off" width="82" /> 415 <button label="Enlever" label_selected="Enlever" left="12" name="Take Off" width="82"/>
485 <button label="Enregistrer" label_selected="Enregistrer" left="100" name="Save" 416 <button label="Enregistrer" label_selected="Enregistrer" left="100" name="Save" width="82"/>
486 width="82" /> 417 <button label="Enregistrer sous" label_selected="Enregistrer sous" left="188" name="Save As" width="105"/>
487 <button label="Enregistrer sous" label_selected="Enregistrer sous" left="188" 418 <button label="Rétablir" label_selected="Rétablir" left="299" name="Revert" width="82"/>
488 name="Save As" width="105" /> 419 <text length="1" name="title" type="string">
489 <button label="Rétablir" label_selected="Rétablir" left="299" name="Revert"
490 width="82" />
491 <text type="string" length="1" name="title">
492 [DESC] 420 [DESC]
493 </text> 421 </text>
494 <text type="string" length="1" name="title_no_modify"> 422 <text length="1" name="title_no_modify" type="string">
495 [DESC]: impossible de modifier 423 [DESC]: impossible de modifier
496 </text> 424 </text>
497 <text type="string" length="1" name="title_loading"> 425 <text length="1" name="title_loading" type="string">
498 [DESC]: en cours de chargement... 426 [DESC]: en cours de chargement...
499 </text> 427 </text>
500 <text type="string" length="1" name="title_not_worn"> 428 <text length="1" name="title_not_worn" type="string">
501 [DESC]: non portée 429 [DESC]: non portée
502 </text> 430 </text>
503 <text type="string" length="1" name="path"> 431 <text length="1" name="path" type="string">
504 Emplacement : [PATH] 432 Emplacement : [PATH]
505 </text> 433 </text>
506 <text type="string" length="1" name="not worn instructions"> 434 <text length="1" name="not worn instructions" type="string">
507 Pour changer de jupe, faites-en glisser une à partir de votre inventaire. 435 Pour changer de jupe, faites-en glisser une à partir de votre inventaire.
508L&apos;autre possibilité est d&apos;en créer une nouvelle et de la porter. 436Vous pouvez aussi en créer une nouvelle et la porter.
509 </text> 437 </text>
510 <text type="string" length="1" name="no modify instructions"> 438 <text length="1" name="no modify instructions" type="string">
511 Vous n&apos;avez pas la permission de modifier cet objet. 439 Vous n&apos;avez pas la permission de modifier cet objet.
512 </text> 440 </text>
513 <color_swatch label="Couleur/Teinte" name="Color/Tint" 441 <color_swatch label="Couleur/Teinte" name="Color/Tint" tool_tip="Cliquer pour ouvrir le sélecteur de couleurs" width="74"/>
514 tool_tip="Cliquer pour ouvrir le sélecteur de couleurs" width="74" /> 442 <texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image" width="74"/>
515 <texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image"
516 width="74" />
517 </panel> 443 </panel>
518 </tab_container> 444 </tab_container>
519 <scroll_container left="214" name="panel_container" /> 445 <scroll_container left="214" name="panel_container"/>
520 <button label="Créer un ensemble" label_selected="Créer un ensemble" 446 <button label="Créer un ensemble" label_selected="Créer un ensemble" name="Make Outfit" right="-252" width="115"/>
521 name="Make Outfit" right="-252" width="115" /> 447 <button label="Tout enregistrer" label_selected="Tout enregistrer" name="Save All" right="-131" width="115"/>
522 <button label="Tout enregistrer" label_selected="Tout enregistrer" name="Save All" 448 <button label="Fermer" label_selected="Fermer" name="Close" width="115"/>
523 right="-131" width="115" />
524 <button label="Fermer" label_selected="Fermer" name="Close" width="115" />
525</floater> 449</floater>
diff --git a/linden/indra/newview/skins/default/xui/fr/floater_directory.xml b/linden/indra/newview/skins/default/xui/fr/floater_directory.xml
index ce51ac4..b5df2db 100644
--- a/linden/indra/newview/skins/default/xui/fr/floater_directory.xml
+++ b/linden/indra/newview/skins/default/xui/fr/floater_directory.xml
@@ -1,4 +1,4 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 1<?xml version="1.0" encoding="utf-8" standalone="yes"?>
2<floater name="directory" title="Rechercher dans Second Life"> 2<floater name="directory" title="Rechercher dans Second Life">
3 <tab_container name="Directory Tabs"> 3 <tab_container name="Directory Tabs">
4 <panel label="Tout" name="find_all_panel"> 4 <panel label="Tout" name="find_all_panel">
@@ -8,13 +8,13 @@
8 <string name="not_found_text"> 8 <string name="not_found_text">
9 Aucun résultat. 9 Aucun résultat.
10 </string> 10 </string>
11 <button label="Précédente" name="back_btn" /> 11 <button label="Précédente" name="back_btn"/>
12 <button label="Suivante" name="forward_btn" /> 12 <button label="Suivante" name="forward_btn"/>
13 <line_editor label="Rechercher" name="search_editor" tool_tip="Rechercher dans Second Life" /> 13 <line_editor label="Rechercher" name="search_editor" tool_tip="Rechercher dans Second Life"/>
14 <button label="Rechercher" name="search_btn" width="80" /> 14 <button label="Rechercher" name="search_btn" width="80"/>
15 <combo_box name="Category"> 15 <combo_box name="Category">
16 <combo_item name="AnyCategory"> 16 <combo_item name="AnyCategory">
17 Toute catégorie 17 Toutes catégories
18 </combo_item> 18 </combo_item>
19 <combo_item name="Events"> 19 <combo_item name="Events">
20 Événements 20 Événements
@@ -23,16 +23,16 @@
23 Groupes 23 Groupes
24 </combo_item> 24 </combo_item>
25 <combo_item name="People"> 25 <combo_item name="People">
26 Personnes 26 Résidents
27 </combo_item> 27 </combo_item>
28 <combo_item name="Places"> 28 <combo_item name="Places">
29 Endroits 29 Lieux
30 </combo_item> 30 </combo_item>
31 <combo_item name="Wiki"> 31 <combo_item name="Wiki">
32 Wiki 32 Wiki
33 </combo_item> 33 </combo_item>
34 </combo_box> 34 </combo_box>
35 <check_box label="Inclure le contenu pour adultes" name="mature_check" /> 35 <check_box label="Inclure le contenu pour adultes" name="mature_check"/>
36 <string name="loading_text"> 36 <string name="loading_text">
37 Chargement en cours... 37 Chargement en cours...
38 </string> 38 </string>
@@ -53,56 +53,55 @@
53 <string name="not_found_text"> 53 <string name="not_found_text">
54 Aucun résultat. 54 Aucun résultat.
55 </string> 55 </string>
56 <button label="Parcourir" label_selected="Parcourir" name="Browse" /> 56 <button label="Parcourir" label_selected="Parcourir" name="Browse"/>
57 <scroll_list name="results"> 57 <scroll_list name="results">
58 <column label="" name="icon" /> 58 <column label="" name="icon"/>
59 <column label="" name="type" /> 59 <column label="" name="type"/>
60 <column label="Nom" name="name" /> 60 <column label="Nom" name="name"/>
61 <column label="Prix" name="price" /> 61 <column label="Prix" name="price"/>
62 </scroll_list> 62 </scroll_list>
63 <button label="&lt; Préc" label_selected="&lt; Préc" name="&lt; Prev" /> 63 <button label="&lt; Préc" label_selected="&lt; Préc" name="&lt; Prev"/>
64 <button label="Suivante &gt;" label_selected="Suivante &gt;" name="Next &gt;" /> 64 <button label="Suivante &gt;" label_selected="Suivante &gt;" name="Next &gt;"/>
65 <text name="find" width="63"> 65 <text name="find" width="63">
66 Trouver : 66 Trouver :
67 </text> 67 </text>
68 <line_editor left_delta="51" name="name" width="128" /> 68 <line_editor left_delta="51" name="name" width="128"/>
69 <check_box label="Inclure le contenu pour adultes" name="incmature" /> 69 <check_box label="Inclure le contenu pour adultes" name="incmature"/>
70 <combo_box left="195" name="Category"> 70 <combo_box left="195" name="Category">
71 <combo_item name="AnyCategory"> 71 <combo_item name="AnyCategory">
72 Toute catégorie 72 Toutes catégories
73 </combo_item> 73 </combo_item>
74 <combo_item name="Shopping"> 74 <combo_item name="Shopping">
75 Shopping 75 Shopping
76 </combo_item> 76 </combo_item>
77 <combo_item name="LandRental"> 77 <combo_item name="LandRental">
78 Terrain à louer 78 Terrains à louer
79 </combo_item> 79 </combo_item>
80 <combo_item name="PropertyRental"> 80 <combo_item name="PropertyRental">
81 Propriété à louer 81 Propriétés à louer
82 </combo_item> 82 </combo_item>
83 <combo_item name="SpecialAttraction"> 83 <combo_item name="SpecialAttraction">
84 Divertissements spéciaux 84 Divertissements
85 </combo_item> 85 </combo_item>
86 <combo_item name="NewProducts"> 86 <combo_item name="NewProducts">
87 Nouveaux produits 87 Nouveaux produits
88 </combo_item> 88 </combo_item>
89 <combo_item name="Employment"> 89 <combo_item name="Employment">
90 Emploi 90 Emplois
91 </combo_item> 91 </combo_item>
92 <combo_item name="Wanted"> 92 <combo_item name="Wanted">
93 Offres 93 Offres
94 </combo_item> 94 </combo_item>
95 <combo_item name="Service"> 95 <combo_item name="Service">
96 Service 96 Services
97 </combo_item> 97 </combo_item>
98 <combo_item name="Personal"> 98 <combo_item name="Personal">
99 Rencontres 99 Rencontres
100 </combo_item> 100 </combo_item>
101 </combo_box> 101 </combo_box>
102 <button label="Rechercher" label_selected="Rechercher" name="Search" width="85" /> 102 <button label="Rechercher" label_selected="Rechercher" name="Search" width="85"/>
103 <button label="Passer une annonce…" label_selected="Passer une annonce…" 103 <button label="Passer une annonce…" label_selected="Passer une annonce…" name="Place an Ad..." width="135"/>
104 name="Place an Ad..." width="135" /> 104 <button label="Supprimer" label_selected="Supprimer" name="Delete"/>
105 <button label="Supprimer" label_selected="Supprimer" name="Delete" />
106 </panel> 105 </panel>
107 <panel label="Événements" name="events_panel"> 106 <panel label="Événements" name="events_panel">
108 <string name="searching_text"> 107 <string name="searching_text">
@@ -112,15 +111,15 @@
112 Aucun résultat. 111 Aucun résultat.
113 </string> 112 </string>
114 <scroll_list name="results"> 113 <scroll_list name="results">
115 <column label="" name="icon" /> 114 <column label="" name="icon"/>
116 <column label="" name="type" /> 115 <column label="" name="type"/>
117 <column label="Nom" name="name" /> 116 <column label="Nom" name="name"/>
118 <column label="Heure (Californie)" name="date" width="115" /> 117 <column label="Heure (Californie)" name="date" width="115"/>
119 <column label="" name="event_id" /> 118 <column label="" name="event_id"/>
120 <column label="Heure" name="time" /> 119 <column label="Heure" name="time"/>
121 </scroll_list> 120 </scroll_list>
122 <button label="&lt; Préc" label_selected="&lt; Préc" name="&lt; Prev" /> 121 <button label="&lt; Préc" label_selected="&lt; Préc" name="&lt; Prev"/>
123 <button label="Suivante &gt;" label_selected="Suivante &gt;" name="Next &gt;" /> 122 <button label="Suivante &gt;" label_selected="Suivante &gt;" name="Next &gt;"/>
124 <radio_group name="date_mode"> 123 <radio_group name="date_mode">
125 <radio_item name="current"> 124 <radio_item name="current">
126 En cours et futurs 125 En cours et futurs
@@ -129,15 +128,12 @@
129 Date 128 Date
130 </radio_item> 129 </radio_item>
131 </radio_group> 130 </radio_group>
132 <button label="&lt;&lt;" label_selected="&lt;&lt;" name="&lt;&lt;" 131 <button label="&lt;&lt;" label_selected="&lt;&lt;" name="&lt;&lt;" tool_tip="Revenir en arrière d&apos;un jour"/>
133 tool_tip="Revenir en arrière d&apos;un jour" />
134 <text name="date_text"> 132 <text name="date_text">
135 6/6 133 6/6
136 </text> 134 </text>
137 <button label="&gt;&gt;" label_selected="&gt;&gt;" name="&gt;&gt;" 135 <button label="&gt;&gt;" label_selected="&gt;&gt;" name="&gt;&gt;" tool_tip="Avancer d&apos;un jour"/>
138 tool_tip="Avancer d&apos;un jour" /> 136 <button label="Aujourd&apos;hui" label_selected="Aujourd&apos;hui" name="Today" tool_tip="Afficher les événements qui ont lieu aujourd&apos;hui"/>
139 <button label="Aujourd&apos;hui" label_selected="Aujourd&apos;hui" name="Today"
140 tool_tip="Afficher les événements qui ont lieu aujourd&apos;hui" />
141 <text name="text"> 137 <text name="text">
142 Catégorie : 138 Catégorie :
143 </text> 139 </text>
@@ -149,7 +145,7 @@
149 Tout 145 Tout
150 </combo_item> 146 </combo_item>
151 <combo_item name="Discussion"> 147 <combo_item name="Discussion">
152 Discussion 148 Discussions
153 </combo_item> 149 </combo_item>
154 <combo_item name="Sports"> 150 <combo_item name="Sports">
155 Sports 151 Sports
@@ -158,7 +154,7 @@
158 Musique live 154 Musique live
159 </combo_item> 155 </combo_item>
160 <combo_item name="Commercial"> 156 <combo_item name="Commercial">
161 Publicité 157 Publicités
162 </combo_item> 158 </combo_item>
163 <combo_item name="Nightlife/Entertainment"> 159 <combo_item name="Nightlife/Entertainment">
164 Divertissements/Soirées 160 Divertissements/Soirées
@@ -182,21 +178,21 @@
182 Divers 178 Divers
183 </combo_item> 179 </combo_item>
184 </combo_box> 180 </combo_box>
185 <line_editor left="370" name="event_search_text" width="175" /> 181 <line_editor left="370" name="event_search_text" width="175"/>
186 <check_box label="Inclure le contenu &#10;pour adultes" left="551" name="incmature" /> 182 <check_box label="Inclure le contenu
187 <button label="Rechercher" label_selected="Rechercher" left_delta="129" name="Search" 183pour adultes" left="551" name="incmature"/>
188 tool_tip="Rechercher" /> 184 <button label="Rechercher" label_selected="Rechercher" left_delta="129" name="Search" tool_tip="Rechercher"/>
189 <button label="Supprimer" label_selected="Supprimer" name="Delete" /> 185 <button label="Supprimer" label_selected="Supprimer" name="Delete"/>
190 </panel> 186 </panel>
191 <panel label="A la Une" name="showcase_panel"> 187 <panel label="À la Une" name="showcase_panel">
192 <string name="searching_text"> 188 <string name="searching_text">
193 Recherche en cours... 189 Recherche en cours...
194 </string> 190 </string>
195 <string name="not_found_text"> 191 <string name="not_found_text">
196 Aucun résultat. 192 Aucun résultat.
197 </string> 193 </string>
198 <button label="Précédente" name="back_btn" /> 194 <button label="Précédente" name="back_btn"/>
199 <button label="Suivante" name="forward_btn" /> 195 <button label="Suivante" name="forward_btn"/>
200 <string name="loading_text"> 196 <string name="loading_text">
201 Chargement en cours... 197 Chargement en cours...
202 </string> 198 </string>
@@ -218,21 +214,21 @@
218 Aucun résultat. 214 Aucun résultat.
219 </string> 215 </string>
220 <scroll_list name="results"> 216 <scroll_list name="results">
221 <column label="" name="icon" /> 217 <column label="" name="icon"/>
222 <column label="" name="type" /> 218 <column label="" name="type"/>
223 <column label="Nom" name="name" /> 219 <column label="Nom" name="name"/>
224 <column label="Prix en $L" name="price" width="75" /> 220 <column label="Prix en L$" name="price" width="75"/>
225 <column label="Surface" name="area" width="65" /> 221 <column label="Surface" name="area" width="65"/>
226 <column label="$L/m²" name="per_meter" /> 222 <column label="L$/m²" name="per_meter"/>
227 </scroll_list> 223 </scroll_list>
228 <button label="&lt; Préc" label_selected="&lt; Préc" name="&lt; Prev" /> 224 <button label="&lt; Préc" label_selected="&lt; Préc" name="&lt; Prev"/>
229 <button label="Suivante &gt;" label_selected="Suivante &gt;" name="Next &gt;" /> 225 <button label="Suivante &gt;" label_selected="Suivante &gt;" name="Next &gt;"/>
230 <combo_box name="type" width="150"> 226 <combo_box name="type" width="150">
231 <combo_item name="AllTypes"> 227 <combo_item name="AllTypes">
232 Tous types 228 Tous types
233 </combo_item> 229 </combo_item>
234 <combo_item name="Auction"> 230 <combo_item name="Auction">
235 Enchère 231 Enchères
236 </combo_item> 232 </combo_item>
237 <combo_item name="MainlandSales"> 233 <combo_item name="MainlandSales">
238 À vendre - Continent 234 À vendre - Continent
@@ -243,28 +239,27 @@
243 </combo_box> 239 </combo_box>
244 <combo_box name="rating" width="150"> 240 <combo_box name="rating" width="150">
245 <combo_item name="PG&amp;Mature"> 241 <combo_item name="PG&amp;Mature">
246 Public averti et adulte 242 Tout public et Adultes
247 </combo_item> 243 </combo_item>
248 <combo_item name="PGonly"> 244 <combo_item name="PGonly">
249 Public averti uniquement 245 Tout public uniquement
250 </combo_item> 246 </combo_item>
251 <combo_item name="Matureonly"> 247 <combo_item name="Matureonly">
252 Adultes uniquement 248 Adultes uniquement
253 </combo_item> 249 </combo_item>
254 </combo_box> 250 </combo_box>
255 <check_box label="Prix &lt;= $L" left="157" name="pricecheck" /> 251 <check_box label="Prix &lt;= L$" left="157" name="pricecheck"/>
256 <check_box label="Surface &gt;= m²" left="157" name="areacheck" /> 252 <check_box label="Surface &gt;= m²" left="157" name="areacheck"/>
257 <line_editor left="251" name="priceedit" width="50" /> 253 <line_editor left="251" name="priceedit" width="50"/>
258 <line_editor left="251" name="areaedit" width="50" /> 254 <line_editor left="251" name="areaedit" width="50"/>
259 <button label="Rechercher" label_selected="Rechercher" left="306" name="Search" 255 <button label="Rechercher" label_selected="Rechercher" left="306" name="Search" width="85"/>
260 width="85" />
261 <text left="399" name="land" width="379"> 256 <text left="399" name="land" width="379">
262 Les terrains peuvent être achetés directement en dollars Linden (L$) ou 257 Vous pouvez acheter un terrain directement en dollars Linden (L$) ou
263aux enchères (en $L ou $US). Pour acheter directement, visitez le terrain 258aux enchères (en L$ ou US$). Pour acheter directement, visitez le terrain
264et cliquez sur le nom de l&apos;endroit dans la barre de titre. 259et cliquez sur le nom de l&apos;endroit dans la barre de titre.
265 </text> 260 </text>
266 </panel> 261 </panel>
267 <panel label="Endroits" name="places_panel"> 262 <panel label="Lieux" name="places_panel">
268 <string name="searching_text"> 263 <string name="searching_text">
269 Recherche en cours... 264 Recherche en cours...
270 </string> 265 </string>
@@ -272,24 +267,24 @@ et cliquez sur le nom de l&apos;endroit dans la barre de titre.
272 Aucun résultat. 267 Aucun résultat.
273 </string> 268 </string>
274 <scroll_list name="results"> 269 <scroll_list name="results">
275 <column label="" name="icon" /> 270 <column label="" name="icon"/>
276 <column label="" name="type" /> 271 <column label="" name="type"/>
277 <column label="Nom" name="name" /> 272 <column label="Nom" name="name"/>
278 <column label="Trafic" name="dwell" /> 273 <column label="Trafic" name="dwell"/>
279 </scroll_list> 274 </scroll_list>
280 <button label="&lt; Préc" label_selected="&lt; Préc" name="&lt; Prev" /> 275 <button label="&lt; Préc" label_selected="&lt; Préc" name="&lt; Prev"/>
281 <button label="Suivante &gt;" label_selected="Suivante &gt;" name="Next &gt;" /> 276 <button label="Suivante &gt;" label_selected="Suivante &gt;" name="Next &gt;"/>
282 <text name="find" width="63"> 277 <text name="find" width="63">
283 Trouver : 278 Trouver :
284 </text> 279 </text>
285 <line_editor left_delta="51" name="name" width="128" /> 280 <line_editor left_delta="51" name="name" width="128"/>
286 <check_box label="Inclure les parcelles avec du contenu Adultes" name="incmature" /> 281 <check_box label="Inclure les parcelles avec du contenu Adultes" name="incmature"/>
287 <combo_box left="195" name="Category" width="170"> 282 <combo_box left="195" name="Category" width="170">
288 <combo_item name="AnyCategory"> 283 <combo_item name="AnyCategory">
289 Toute catégorie 284 Toutes catégories
290 </combo_item> 285 </combo_item>
291 <combo_item name="LindenLocation"> 286 <combo_item name="LindenLocation">
292 Emplacement Linden 287 Appartenant aux Lindens
293 </combo_item> 288 </combo_item>
294 <combo_item name="Adult"> 289 <combo_item name="Adult">
295 Adultes 290 Adultes
@@ -307,10 +302,10 @@ et cliquez sur le nom de l&apos;endroit dans la barre de titre.
307 Jeux 302 Jeux
308 </combo_item> 303 </combo_item>
309 <combo_item name="Hangout"> 304 <combo_item name="Hangout">
310 Endroit favori 305 Favoris
311 </combo_item> 306 </combo_item>
312 <combo_item name="NewcomerFriendly"> 307 <combo_item name="NewcomerFriendly">
313 Convivial pour les nouveaux 308 Accueil pour les nouveaux
314 </combo_item> 309 </combo_item>
315 <combo_item name="Parks&amp;Nature"> 310 <combo_item name="Parks&amp;Nature">
316 Parcs et Nature 311 Parcs et Nature
@@ -325,10 +320,9 @@ et cliquez sur le nom de l&apos;endroit dans la barre de titre.
325 Autre 320 Autre
326 </combo_item> 321 </combo_item>
327 </combo_box> 322 </combo_box>
328 <button label="Rechercher" label_selected="Rechercher" left_delta="178" name="Search" 323 <button label="Rechercher" label_selected="Rechercher" left_delta="178" name="Search" width="80"/>
329 width="80" />
330 </panel> 324 </panel>
331 <panel label="Personnes" name="people_panel"> 325 <panel label="Résidents" name="people_panel">
332 <string name="searching_text"> 326 <string name="searching_text">
333 Recherche en cours... 327 Recherche en cours...
334 </string> 328 </string>
@@ -336,32 +330,32 @@ et cliquez sur le nom de l&apos;endroit dans la barre de titre.
336 Aucun résultat. 330 Aucun résultat.
337 </string> 331 </string>
338 <scroll_list name="results"> 332 <scroll_list name="results">
339 <column label="" name="icon" /> 333 <column label="" name="icon"/>
340 <column label="" name="type" /> 334 <column label="" name="type"/>
341 <column label="Nom" name="name" /> 335 <column label="Nom" name="name"/>
342 </scroll_list> 336 </scroll_list>
343 <button label="&lt; Préc" label_selected="&lt; Préc" name="&lt; Prev" /> 337 <button label="&lt; Préc" label_selected="&lt; Préc" name="&lt; Prev"/>
344 <button label="Suivante &gt;" label_selected="Suivante &gt;" name="Next &gt;" /> 338 <button label="Suivante &gt;" label_selected="Suivante &gt;" name="Next &gt;"/>
345 <text name="find" width="63"> 339 <text name="find" width="63">
346 Trouver : 340 Trouver :
347 </text> 341 </text>
348 <line_editor left_delta="51" name="name" width="200" /> 342 <line_editor left_delta="51" name="name" width="200"/>
349 <button label="Rechercher" label_selected="Rechercher" name="Search" width="80" /> 343 <button label="Rechercher" label_selected="Rechercher" name="Search" width="80"/>
350 </panel> 344 </panel>
351 <panel label="Groupes" name="groups_panel"> 345 <panel label="Groupes" name="groups_panel">
352 <button label="&lt; Précédent" label_selected="&lt; Précédent" name="&lt; Prev" /> 346 <button label="&lt; Précédent" label_selected="&lt; Précédent" name="&lt; Prev"/>
353 <button label="Suivant &gt;" label_selected="Suivant &gt;" name="Next &gt;" /> 347 <button label="Suivant &gt;" label_selected="Suivant &gt;" name="Next &gt;"/>
354 <string name="searching_text"> 348 <string name="searching_text">
355 Recherche en cours... 349 Recherche en cours...
356 </string> 350 </string>
357 <string name="not_found_text"> 351 <string name="not_found_text">
358 Aucun résultat. 352 Aucun résultat.
359 </string> 353 </string>
360 <button label="Précédente" name="back_btn" /> 354 <button label="Précédente" name="back_btn"/>
361 <button label="Suivante" name="forward_btn" /> 355 <button label="Suivante" name="forward_btn"/>
362 <line_editor label="Rechercher" name="search_editor" tool_tip="Rechercher dans Second Life" /> 356 <line_editor label="Rechercher" name="search_editor" tool_tip="Rechercher dans Second Life"/>
363 <button label="Rechercher" name="search_btn" width="80" /> 357 <button label="Rechercher" name="search_btn" width="80"/>
364 <check_box label="Inclure le contenu pour adultes" name="mature_check" /> 358 <check_box label="Inclure le contenu pour adultes" name="mature_check"/>
365 <string name="loading_text"> 359 <string name="loading_text">
366 Chargement en cours... 360 Chargement en cours...
367 </string> 361 </string>
diff --git a/linden/indra/newview/skins/default/xui/fr/floater_env_settings.xml b/linden/indra/newview/skins/default/xui/fr/floater_env_settings.xml
index 1fe3192..b509ceb 100644
--- a/linden/indra/newview/skins/default/xui/fr/floater_env_settings.xml
+++ b/linden/indra/newview/skins/default/xui/fr/floater_env_settings.xml
@@ -1,27 +1,27 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 1<?xml version="1.0" encoding="utf-8" standalone="yes"?>
2<floater name="Environment Editor Floater" title="Editeur d&apos;environnement"> 2<floater name="Environment Editor Floater" title="Éditeur d&apos;environnement">
3 <text name="EnvTimeText" bottom="-45" > 3 <text bottom="-45" name="EnvTimeText">
4 Heure de la 4 Heure de la
5journée 5journée
6 </text> 6 </text>
7 <text name="EnvTimeText2" bottom_delta="-36" > 7 <text bottom_delta="-36" name="EnvTimeText2">
8 Midi 8 Midi
9 </text> 9 </text>
10 <text name="EnvCloudText"> 10 <text name="EnvCloudText">
11 Couverture 11 Couverture
12nuageuse 12nuageuse
13 </text> 13 </text>
14 <text name="EnvWaterColorText" bottom="-45" > 14 <text bottom="-45" name="EnvWaterColorText">
15 Couleur de 15 Couleur de
16l&apos;eau 16l&apos;eau
17 </text> 17 </text>
18 <color_swatch name="EnvWaterColor" tool_tip="Cliquer pour ouvrir le sélecteur de couleurs" /> 18 <color_swatch name="EnvWaterColor" tool_tip="Cliquer pour ouvrir le sélecteur de couleurs"/>
19 <text name="EnvWaterFogText"> 19 <text name="EnvWaterFogText">
20 Brouillard 20 Brouillard
21dans l&apos;eau 21dans l&apos;eau
22 </text> 22 </text>
23 <button label="Utiliser heure du domaine" name="EnvUseEstateTimeButton" bottom="-144"/> 23 <button bottom="-144" label="Utiliser heure du domaine" name="EnvUseEstateTimeButton"/>
24 <button label="Ciel avancé" name="EnvAdvancedSkyButton" /> 24 <button label="Ciel avancé" name="EnvAdvancedSkyButton"/>
25 <button label="Eau avancée" name="EnvAdvancedWaterButton" /> 25 <button label="Eau avancée" name="EnvAdvancedWaterButton"/>
26 <button label="?" name="EnvSettingsHelpButton" /> 26 <button label="?" name="EnvSettingsHelpButton"/>
27</floater> 27</floater>
diff --git a/linden/indra/newview/skins/default/xui/fr/floater_god_tools.xml b/linden/indra/newview/skins/default/xui/fr/floater_god_tools.xml
index afa38f3..2625b00 100644
--- a/linden/indra/newview/skins/default/xui/fr/floater_god_tools.xml
+++ b/linden/indra/newview/skins/default/xui/fr/floater_god_tools.xml
@@ -1,54 +1,37 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 1<?xml version="1.0" encoding="utf-8" standalone="yes"?>
2<floater name="godtools floater" title="Outils Admin"> 2<floater name="godtools floater" title="Outils divins">
3 <tab_container name="GodTools Tabs"> 3 <tab_container name="GodTools Tabs">
4 <panel label="Grille" name="grid"> 4 <panel label="Grille" name="grid">
5 <button label="Vider Tous" label_selected="Vider Tous" name="Kick all users" /> 5 <button label="Éjecter tous" label_selected="Éjecter tous" name="Kick all users"/>
6 <button label="Vider le cache cartographique de la région" 6 <button label="Vider le cache cartographique de la région" label_selected="Vider le cache cartographique de la région" name="Flush This Region&apos;s Map Visibility Caches"/>
7 label_selected="Vider le cache cartographique de la région"
8 name="Flush This Region&apos;s Map Visibility Caches" />
9 </panel> 7 </panel>
10 <panel label="Région" name="region"> 8 <panel label="Région" name="region">
11 <text name="Sim Name:"> 9 <text name="Sim Name:">
12 Nom du sim : 10 Nom du sim :
13 </text> 11 </text>
14 <check_box label="Initiation" name="check prelude" 12 <check_box label="Initiation" name="check prelude" tool_tip="Définir cette région comme zone d&apos;initiation."/>
15 tool_tip="Définir cette région comme zone d&apos;initiation." /> 13 <check_box label="Soleil fixe" name="check fixed sun" tool_tip="Définir la position du soleil (comme dans Région et Domaine &gt; Terrain.)"/>
16 <check_box label="Soleil fixe" name="check fixed sun" 14 <check_box label="Réinitialiser le domicile à la téléportation" name="check reset home" tool_tip="Lorsqu&apos;un résident se téléporte à l&apos;extérieur, réinitialise son domicile à la position de sa destination."/>
17 tool_tip="Définir la position du soleil (comme dans Région/Domaine &gt; Terrain.)" /> 15 <check_box label="Visible" name="check visible" tool_tip="Cochez pour rendre la région visible aux non-admins."/>
18 <check_box label="Réinitialiser le domicile à la téléportation" 16 <check_box label="Dégâts" name="check damage" tool_tip="Cochez pour activer les dégâts dans cette région."/>
19 name="check reset home" 17 <check_box label="Bloquer le suivi de trafic" name="block dwell" tool_tip="Cochez pour que la région ne comptabilise pas le trafic."/>
20 tool_tip="Lorsqu&apos;un résident se téléporte à l&apos;extérieur, réinitialise son domicile à la position de sa destination." /> 18 <check_box label="Bloquer le terraformage" name="block terraform" tool_tip="Cochez pour empêcher les personnes de terraformer leur terrain"/>
21 <check_box label="Visible" name="check visible" 19 <check_box label="Bac à sable" name="is sandbox" tool_tip="Basculer cette région en bac à sable."/>
22 tool_tip="Cochez pour rendre la région visible aux non-admins." /> 20 <button label="Figer le terrain" label_selected="Figer le terrain" name="Bake Terrain" tool_tip="Enregistrer le terrain actuel comme terrain par défaut."/>
23 <check_box label="Dégâts" name="check damage" 21 <button label="Rétablir le terrain" label_selected="Rétablir le terrain" name="Revert Terrain" tool_tip="Remplacer le terrain actuel avec le terrain par défaut."/>
24 tool_tip="Cochez pour activer les dégâts dans cette région." /> 22 <button label="Échanger le terrain" label_selected="Échanger le terrain" name="Swap Terrain" tool_tip="Échangez le terrain actuel avec le terrain par défaut."/>
25 <check_box label="Bloquer le suivi de trafic" name="block dwell"
26 tool_tip="Cochez pour que la région ne comptabilise pas le trafic." />
27 <check_box label="Bloquer le terraformage" name="block terraform"
28 tool_tip="Cochez pour empêcher les personnes de terraformer leur terrain" />
29 <check_box label="Bac à sable" name="is sandbox"
30 tool_tip="Basculer cette région en bac à sable." />
31 <button label="Figer le terrain" label_selected="Figer le terrain" name="Bake Terrain"
32 tool_tip="Enregistrer le terrain actuel comme terrain par défaut." />
33 <button label="Rétablir le terrain" label_selected="Rétablir le terrain"
34 name="Revert Terrain"
35 tool_tip="Remplacer le terrain actuel avec le terrain par défaut." />
36 <button label="Échanger le terrain" label_selected="Échanger le terrain"
37 name="Swap Terrain"
38 tool_tip="Échanger le terrain actuel avec le terrain par défaut." />
39 <text name="estate id"> 23 <text name="estate id">
40 ID du domaine : 24 ID du domaine :
41 </text> 25 </text>
42 <text name="parent id"> 26 <text name="parent id">
43 ID parent : 27 ID parent :
44 </text> 28 </text>
45 <line_editor name="parentestate" 29 <line_editor name="parentestate" tool_tip="Il s&apos;agit du domaine parent de cette région"/>
46 tool_tip="Il s&apos;agit du domaine parent de cette région" />
47 <text name="Grid Pos: "> 30 <text name="Grid Pos: ">
48 Position sur la grille : 31 Position sur la grille :
49 </text> 32 </text>
50 <line_editor name="gridposx" tool_tip="Position x de cette région sur la grille" /> 33 <line_editor name="gridposx" tool_tip="Position x de cette région sur la grille"/>
51 <line_editor name="gridposy" tool_tip="Position y de cette région sur la grille" /> 34 <line_editor name="gridposy" tool_tip="Position y de cette région sur la grille"/>
52 <text name="Redirect to Grid: "> 35 <text name="Redirect to Grid: ">
53 Rediriger vers la grille : 36 Rediriger vers la grille :
54 </text> 37 </text>
@@ -56,17 +39,12 @@
56 Facteur de facturation : 39 Facteur de facturation :
57 </text> 40 </text>
58 <text name="land cost text"> 41 <text name="land cost text">
59 $L par m² : 42 L$ par m² :
60 </text> 43 </text>
61 <button label="Rafraîchir" label_selected="Rafraîchir" name="Refresh" 44 <button label="Rafraîchir" label_selected="Rafraîchir" name="Refresh" tool_tip="Cliquez ici pour rafraîchir les informations ci-dessus."/>
62 tool_tip="Cliquez ici pour rafraîchir les informations ci-dessus." /> 45 <button label="Appliquer" label_selected="Appliquer" name="Apply" tool_tip="Cliquez ici pour appliquer les modifications effectuées ci-dessus."/>
63 <button label="Appliquer" label_selected="Appliquer" name="Apply" 46 <button label="Sélectionner une région" label_selected="Sélectionner une région" name="Select Region" tool_tip="Sélectionnez une région entière à l&apos;aide de l&apos;outil Terrain."/>
64 tool_tip="Cliquez ici pour appliquer les modifications effectuées ci-dessus." /> 47 <button label="Sauvegarde automatique" label_selected="Sauvegarde automatique" name="Autosave now" tool_tip="Sauvegarde automatique au format gzip."/>
65 <button label="Sélectionner une région" label_selected="Sélectionner une région"
66 name="Select Region"
67 tool_tip="Sélectionnez une région entière à l&apos;aide de l&apos;outil Terrain." />
68 <button label="Sauvegarde automatique" label_selected="Sauvegarde automatique"
69 name="Autosave now" tool_tip="Sauvegarde automatique au format gzip." />
70 </panel> 48 </panel>
71 <panel label="Objets" name="objects"> 49 <panel label="Objets" name="objects">
72 <text name="Sim Name:"> 50 <text name="Sim Name:">
@@ -75,43 +53,20 @@
75 <text name="region name"> 53 <text name="region name">
76 Gallois 54 Gallois
77 </text> 55 </text>
78 <check_box label="Désactiver les scripts" name="disable scripts" 56 <check_box label="Désactiver les scripts" name="disable scripts" tool_tip="Cochez pour désactiver tous les scripts dans cette région"/>
79 tool_tip="Cochez pour désactiver tous les scripts dans cette région" /> 57 <check_box label="Désactiver les collisions" name="disable collisions" tool_tip="Cochez pour désactiver les collisions entre non-avatars dans cette région"/>
80 <check_box label="Désactiver les collisions" name="disable collisions" 58 <check_box label="Désactiver les propriétés physiques" name="disable physics" tool_tip="Cochez pour désactiver toutes les propriétés physiques dans cette région"/>
81 tool_tip="Cochez pour désactiver les collisions entre non-avatars dans cette région" /> 59 <button label="Appliquer" label_selected="Appliquer" name="Apply" tool_tip="Cliquez ici pour appliquer les modifications effectuées ci-dessus."/>
82 <check_box label="Désactiver les propriétés physiques" name="disable physics" 60 <button label="Définir la cible" label_selected="Définir la cible" name="Set Target" tool_tip="Définir l&apos;avatar cible pour la suppression de l&apos;objet."/>
83 tool_tip="Cochez pour désactiver toutes les propriétés physiques dans cette région" />
84 <button label="Appliquer" label_selected="Appliquer" name="Apply"
85 tool_tip="Cliquez ici pour appliquer les modifications effectuées ci-dessus." />
86 <button label="Définir la cible" label_selected="Définir la cible" name="Set Target"
87 tool_tip="Définir l&apos;avatar cible pour la suppression de l&apos;objet." />
88 <text name="target_avatar_name"> 61 <text name="target_avatar_name">
89 (aucune cible) 62 (aucune cible)
90 </text> 63 </text>
91 <button 64 <button label="Supprimer tous les objets scriptés de la cible sur les terrains des autres" label_selected="Supprimer tous les objets scriptés de la cible sur les terrains des autres" name="Delete Target&apos;s Scripted Objects On Others Land" tool_tip="Supprimer tous les objets scriptés appartenant à la cible sur les terrains ne lui appartenant pas. Les objets non reproductibles seront renvoyés."/>
92 label="Supprimer tous les objets scriptés de la cible sur les terrains des autres" 65 <button label="Supprimer les objets scriptés de la cible sur *tous* les terrains" label_selected="Supprimer les objets scriptés de la cible sur *tous* les terrains" name="Delete Target&apos;s Scripted Objects On *Any* Land" tool_tip="Supprimer les objets scriptés appartenant à la cible dans cette région. Les objets non reproductibles seront renvoyés."/>
93 label_selected="Supprimer tous les objets scriptés de la cible sur les terrains des autres" 66 <button label="Supprimer *tous* les objets de la cible" label_selected="Supprimer *tous* les objets de la cible" name="Delete *ALL* Of Target&apos;s Objects" tool_tip="Supprimer tous les objets appartenant à la cible dans cette région. Les objets non reproductibles seront renvoyés."/>
94 name="Delete Target&apos;s Scripted Objects On Others Land" 67 <button label="Afficher les objets souvent responsables de collision" label_selected="Afficher les objets souvent responsables de collision" name="Get Top Colliders" tool_tip="Dresse une liste des objets avec les callbacks les plus fréquents. "/>
95 tool_tip="Supprimer tous les objets scriptés appartenant à la cible sur les terrains ne lui appartenant pas. Les objets non reproductibles seront renvoyés." /> 68 <button label="Afficher les scripts fréquemment utilisés" label_selected="Afficher les scripts fréquemment utilisés" name="Get Top Scripts" tool_tip="Dresse une liste des objets qui passent le plus de temps à exécuter des scripts."/>
96 <button label="Supprimer les objets scriptés de la cible sur *tous* les terrains" 69 <button label="Résumé des scripts" label_selected="Résumé des scripts" name="Scripts digest" tool_tip="Dresse une liste des scripts et de leurs occurrences."/>
97 label_selected="Supprimer les objets scriptés de la cible sur *tous* les terrains"
98 name="Delete Target&apos;s Scripted Objects On *Any* Land"
99 tool_tip="Supprimer les objets scriptés appartenant à la cible dans cette région. Les objets non reproductibles seront renvoyés." />
100 <button label="Supprimer *tous* les objets de la cible"
101 label_selected="Supprimer *tous* les objets de la cible"
102 name="Delete *ALL* Of Target&apos;s Objects"
103 tool_tip="Supprimer tous les objets appartenant à la cible dans cette région. Les objets non reproductibles seront renvoyés." />
104 <button label="Afficher les objets souvent responsables de collision"
105 label_selected="Afficher les objets souvent responsables de collision"
106 name="Get Top Colliders"
107 tool_tip="Dresse une liste des objets avec les callbacks les plus fréquents. " />
108 <button label="Afficher les scripts fréquemment utilisés"
109 label_selected="Afficher les scripts fréquemment utilisés"
110 name="Get Top Scripts"
111 tool_tip="Dresse une liste des objets qui passent le plus de temps à exécuter des scripts." />
112 <button label="Résumé des scripts" label_selected="Résumé des scripts"
113 name="Scripts digest"
114 tool_tip="Dresse une liste des scripts et de leurs occurrences." />
115 </panel> 70 </panel>
116 <panel label="Requête" name="request"> 71 <panel label="Requête" name="request">
117 <text name="Destination:"> 72 <text name="Destination:">
@@ -145,8 +100,7 @@
145 <text name="Parameter:"> 100 <text name="Parameter:">
146 Paramètre : 101 Paramètre :
147 </text> 102 </text>
148 <button label="Effectuer la requête" label_selected="Effectuer la requête" 103 <button label="Effectuer la requête" label_selected="Effectuer la requête" name="Make Request"/>
149 name="Make Request" />
150 </panel> 104 </panel>
151 </tab_container> 105 </tab_container>
152</floater> 106</floater>
diff --git a/linden/indra/newview/skins/default/xui/fr/floater_group_info.xml b/linden/indra/newview/skins/default/xui/fr/floater_group_info.xml
index ec3b4bd..ac25eb0 100644
--- a/linden/indra/newview/skins/default/xui/fr/floater_group_info.xml
+++ b/linden/indra/newview/skins/default/xui/fr/floater_group_info.xml
@@ -1,4 +1,4 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 1<?xml version="1.0" encoding="utf-8" standalone="yes"?>
2<floater name="groupinfo" title="Les Linden – Informations sur le groupe"> 2<floater name="groupinfo" title="Les Linden – Informations sur le groupe">
3 <tab_container name="tab"> 3 <tab_container name="tab">
4 <panel label="Général" name="gen"> 4 <panel label="Général" name="gen">
@@ -9,16 +9,16 @@
9 Les groupes sont un moyen divertissant de collaborer avec vos amis. 9 Les groupes sont un moyen divertissant de collaborer avec vos amis.
10 </text> 10 </text>
11 <text name="txt2"> 11 <text name="txt2">
12 Les groupes vous permettent d&apos;avoir un titre, un emblème et de voter. 12 Les groupes vous permettent d&apos;avoir un titre, un logo et de voter.
13 </text> 13 </text>
14 <text name="txt3"> 14 <text name="txt3">
15 Tout le monde peut créer un groupe. Chaque personne peut appartenir à 15 groupes maximum. 15 Tout le monde peut créer un groupe. Chaque résident peut appartenir jusqu&apos;à 15 groupes.
16 </text> 16 </text>
17 <text name="txt4"> 17 <text name="txt4">
18 Pour rester actif, un groupe doit avoir au moins 3 membres. 18 Pour rester actif, un groupe doit avoir au moins 3 membres.
19 </text> 19 </text>
20 <text name="group_create_text"> 20 <text name="group_create_text">
21 La création d&apos;un groupe coûte 100 $L. 21 La création d&apos;un groupe coûte 100 L$.
22 </text> 22 </text>
23 <text name="lbl"> 23 <text name="lbl">
24 Nom : 24 Nom :
@@ -29,17 +29,15 @@
29 <text name="lbl2"> 29 <text name="lbl2">
30 Charte : 30 Charte :
31 </text> 31 </text>
32 <check_box label="Afficher dans la liste du groupe" name="sho" /> 32 <check_box label="Afficher dans la liste du groupe" name="sho"/>
33 <check_box label="Afficher les membres dans la liste du groupe" name="sho_mem" /> 33 <check_box label="Afficher les membres dans la liste du groupe" name="sho_mem"/>
34 <check_box label="Publier sur le web." name="allow_publish" 34 <check_box label="Publier sur le web." name="allow_publish" tool_tip="Publiez votre profil sur le web."/>
35 tool_tip="Publiez votre profil sur le web." /> 35 <button label="?" label_selected="?" name="publish_help_btn"/>
36 <button label="?" label_selected="?" name="publish_help_btn" /> 36 <check_box label="Adulte" name="mature" tool_tip="Les informations de votre profil sont à caractère adulte."/>
37 <check_box label="Adulte" name="mature"
38 tool_tip="Les informations de votre profil sont à caractère adulte." />
39 </panel> 37 </panel>
40 <panel label="Titres" name="tit"> 38 <panel label="Titres" name="tit">
41 <text name="txt"> 39 <text name="txt">
42 Titres au sein du groupe 40 Titres de groupe
43 </text> 41 </text>
44 <text name="txt2"> 42 <text name="txt2">
45 Les groupes peuvent avoir des officiers et des membres avec des titres particuliers. 43 Les groupes peuvent avoir des officiers et des membres avec des titres particuliers.
@@ -54,9 +52,9 @@
54 Titre du membre : 52 Titre du membre :
55 </text> 53 </text>
56 <text name="lbl3"> 54 <text name="lbl3">
57 Pour créer l&apos;emblème du groupe, faites glisser une texture depuis votre inventaire. 55 Pour créer le logo du groupe, faites glisser une texture depuis votre inventaire.
58 </text> 56 </text>
59 <texture_picker name="insig" tool_tip="Cliquez pour sélectionner une image" /> 57 <texture_picker name="insig" tool_tip="Cliquez pour sélectionner une image"/>
60 </panel> 58 </panel>
61 <panel label="Membres" name="mem"> 59 <panel label="Membres" name="mem">
62 <text name="txt"> 60 <text name="txt">
@@ -74,8 +72,7 @@
74 <text name="members_label"> 72 <text name="members_label">
75 Membres : 73 Membres :
76 </text> 74 </text>
77 <button label="Expulser le membre" label_selected="Expulser le membre" 75 <button label="Expulser le membre" label_selected="Expulser le membre" name="eject_member_btn"/>
78 name="eject_member_btn" />
79 </panel> 76 </panel>
80 <panel label="Vote" name="voting"> 77 <panel label="Vote" name="voting">
81 <tab_container name="tab"> 78 <tab_container name="tab">
@@ -85,33 +82,30 @@
85 </text> 82 </text>
86 <text name="instructions"> 83 <text name="instructions">
87 Pour commencer une nouvelle élection, cliquez sur Lancer l&apos;élection. 84 Pour commencer une nouvelle élection, cliquez sur Lancer l&apos;élection.
88Tous les membres qui ne sont pas officiers sont candidats. 85Les candidats incluent tous les membres qui ne sont pas officiers.
89 </text> 86 </text>
90 <text name="lbl"> 87 <text name="lbl">
91 Candidats : 88 Candidats :
92 </text> 89 </text>
93 <button label="Vote" label_selected="Voter" name="btn_vote" /> 90 <button label="Vote" label_selected="Voter" name="btn_vote"/>
94 <button label="M&apos;abstenir" label_selected="M&apos;abstenir" name="btn_abstain" /> 91 <button label="M&apos;abstenir" label_selected="M&apos;abstenir" name="btn_abstain"/>
95 <button label="Lancer l&apos;élection" label_selected="Lancer l&apos;élection" 92 <button label="Lancer l&apos;élection" label_selected="Lancer l&apos;élection" name="btn_start_election"/>
96 name="btn_start_election" />
97 <text name="lbl2"> 93 <text name="lbl2">
98 Quorum : 94 Quorum :
99 </text> 95 </text>
100 <spinner name="quorum" 96 <spinner name="quorum" tool_tip="Nombre total de votants nécessaires pour que les résultats de l&apos;élection soient valides."/>
101 tool_tip="Nombre total de votants nécessaires pour que les résultats de l&apos;élection soient valides." />
102 <text name="quorum_text"> 97 <text name="quorum_text">
103 sur un total de 111 membres. 98 sur un total de 111 membres.
104 </text> 99 </text>
105 <text name="lbl3"> 100 <text name="lbl3">
106 Majorité : 101 Majorité :
107 </text> 102 </text>
108 <radio_group name="majority" 103 <radio_group name="majority" tool_tip="Majorité de tous les votes nécessaires pour remporter l&apos;élection.">
109 tool_tip="Majorité de tous les votes nécessaires pour remporter l&apos;élection.">
110 <radio_item name="radio"> 104 <radio_item name="radio">
111 Majorité simple 105 Majorité simple
112 </radio_item> 106 </radio_item>
113 <radio_item name="radio2"> 107 <radio_item name="radio2">
114 Majorité des deux-tiers 108 Majorité des 2/3
115 </radio_item> 109 </radio_item>
116 <radio_item name="radio3"> 110 <radio_item name="radio3">
117 Unanimité 111 Unanimité
@@ -120,7 +114,7 @@ Tous les membres qui ne sont pas officiers sont candidats.
120 <text name="duration_lbl"> 114 <text name="duration_lbl">
121 Durée : 115 Durée :
122 </text> 116 </text>
123 <spinner name="duration" tool_tip="Durée de l&apos;élection (en nombre de jours)." /> 117 <spinner name="duration" tool_tip="Durée de l&apos;élection (en nombre de jours)."/>
124 <text name="duration_days"> 118 <text name="duration_days">
125 jours 119 jours
126 </text> 120 </text>
@@ -141,34 +135,29 @@ Tous les membres qui ne sont pas officiers sont candidats.
141 <text name="proposal_lbl"> 135 <text name="proposal_lbl">
142 Propositions : 136 Propositions :
143 </text> 137 </text>
144 <button label="Oui" label_selected="Oui" name="btn_yes" /> 138 <button label="Oui" label_selected="Oui" name="btn_yes"/>
145 <button label="Non" label_selected="Non" name="btn_no" /> 139 <button label="Non" label_selected="Non" name="btn_no"/>
146 <button label="M&apos;abstenir" label_selected="M&apos;abstenir" name="btn_abstain" /> 140 <button label="M&apos;abstenir" label_selected="M&apos;abstenir" name="btn_abstain"/>
147 <button label="Afficher la liste" label_selected="Afficher la liste" 141 <button label="Afficher la liste" label_selected="Afficher la liste" name="btn_view_list"/>
148 name="btn_view_list" /> 142 <button label="Afficher l&apos;objet" label_selected="Afficher l&apos;objet" name="btn_view_item"/>
149 <button label="Afficher l&apos;objet" label_selected="Afficher l&apos;objet" 143 <button label="Créer une proposition" label_selected="Créer une proposition" name="btn_proposal"/>
150 name="btn_view_item" /> 144 <button label="Soumettre" label_selected="Soumettre" name="btn_submit"/>
151 <button label="Créer une proposition" label_selected="Créer une proposition"
152 name="btn_proposal" />
153 <button label="Soumettre" label_selected="Soumettre" name="btn_submit" />
154 <text name="quorum_lbl"> 145 <text name="quorum_lbl">
155 Quorum : 146 Quorum :
156 </text> 147 </text>
157 <spinner name="quorum" 148 <spinner name="quorum" tool_tip="Nombre total de votants nécessaires pour que les résultats de l&apos;élection soient valides."/>
158 tool_tip="Nombre total de votants nécessaires pour que les résultats de l&apos;élection soient valides." />
159 <text name="quorum_text"> 149 <text name="quorum_text">
160 sur un total de 111 membres. 150 sur un total de 111 membres.
161 </text> 151 </text>
162 <text name="majority_lbl"> 152 <text name="majority_lbl">
163 Majorité : 153 Majorité :
164 </text> 154 </text>
165 <radio_group name="majority" 155 <radio_group name="majority" tool_tip="Majorité de tous les votes nécessaires pour remporter l&apos;élection.">
166 tool_tip="Majorité de tous les votes nécessaires pour remporter l&apos;élection.">
167 <radio_item name="radio"> 156 <radio_item name="radio">
168 Majorité simple 157 Majorité simple
169 </radio_item> 158 </radio_item>
170 <radio_item name="radio2"> 159 <radio_item name="radio2">
171 Majorité des deux-tiers 160 Majorité des 2/3
172 </radio_item> 161 </radio_item>
173 <radio_item name="radio3"> 162 <radio_item name="radio3">
174 Unanimité 163 Unanimité
@@ -177,7 +166,7 @@ Tous les membres qui ne sont pas officiers sont candidats.
177 <text name="duration_lbl"> 166 <text name="duration_lbl">
178 Durée : 167 Durée :
179 </text> 168 </text>
180 <spinner name="duration" tool_tip="Durée de l&apos;élection (en nombre de jours)." /> 169 <spinner name="duration" tool_tip="Durée de l&apos;élection (en nombre de jours)."/>
181 <text name="duration_text"> 170 <text name="duration_text">
182 jours 171 jours
183 </text> 172 </text>
@@ -204,10 +193,8 @@ Tous les membres qui ne sont pas officiers sont candidats.
204 <text name="vote_text_lbl"> 193 <text name="vote_text_lbl">
205 Résultats du vote : 194 Résultats du vote :
206 </text> 195 </text>
207 <button label="Afficher la liste" label_selected="Afficher la liste" 196 <button label="Afficher la liste" label_selected="Afficher la liste" name="btn_view_list"/>
208 name="btn_view_list" /> 197 <button label="Afficher l&apos;objet" label_selected="Afficher l&apos;objet" name="btn_view_item"/>
209 <button label="Afficher l&apos;objet" label_selected="Afficher l&apos;objet"
210 name="btn_view_item" />
211 </panel> 198 </panel>
212 </tab_container> 199 </tab_container>
213 </panel> 200 </panel>
@@ -224,21 +211,17 @@ Tous les membres qui ne sont pas officiers sont candidats.
224 <text name="lbl"> 211 <text name="lbl">
225 Officiers : 212 Officiers :
226 </text> 213 </text>
227 <button label="Ajouter un officier..." label_selected="Ajouter un officier..." 214 <button label="Ajouter un officier..." label_selected="Ajouter un officier..." name="add_officer_btn"/>
228 name="add_officer_btn" /> 215 <button label="Supprimer la sélection" label_selected="Supprimer la sélection" name="remove_officer_btn"/>
229 <button label="Supprimer la sélection" label_selected="Supprimer la sélection"
230 name="remove_officer_btn" />
231 <text name="lbl2"> 216 <text name="lbl2">
232 Membres : 217 Membres :
233 </text> 218 </text>
234 <button label="Ajouter un membre..." label_selected="Ajouter un membre..." 219 <button label="Ajouter un membre..." label_selected="Ajouter un membre..." name="add_member_btn"/>
235 name="add_member_btn" /> 220 <button label="Supprimer la sélection" label_selected="Supprimer la sélection" name="remove_member_btn"/>
236 <button label="Supprimer la sélection" label_selected="Supprimer la sélection"
237 name="remove_member_btn" />
238 <text name="lbl3"> 221 <text name="lbl3">
239 Frais d&apos;adhésion : 222 Frais d&apos;inscription :
240 </text> 223 </text>
241 <check_box label="Inscription libre (sans invitation)" name="open" /> 224 <check_box label="Inscription libre (sans invitation)" name="open"/>
242 </panel> 225 </panel>
243 <panel label="Terrain" name="land"> 226 <panel label="Terrain" name="land">
244 <text name="txt"> 227 <text name="txt">
@@ -247,37 +230,32 @@ Tous les membres qui ne sont pas officiers sont candidats.
247 <text name="lbl"> 230 <text name="lbl">
248 Total des contributions : 231 Total des contributions :
249 </text> 232 </text>
250 <button label="Carte..." label_selected="Carte..." name="map_btn" /> 233 <button label="Carte..." label_selected="Carte..." name="map_btn"/>
251 <text name="lbl2"> 234 <text name="lbl2">
252 Total du terrain utilisé : 235 Superficie déjà utilisée :
253 </text> 236 </text>
254 <text name="lbl3"> 237 <text name="lbl3">
255 Terrain disponible : 238 Superficie disponible :
256 </text> 239 </text>
257 <button label="Définir la contribution" label_selected="Définir la contribution" 240 <button label="Définir la contribution" label_selected="Définir la contribution" name="set_contrib_btn"/>
258 name="set_contrib_btn" />
259 <text name="warning_label"> 241 <text name="warning_label">
260 Avertissement : ce groupe a trop de terrain. les membres du groupe doivent faire une contribution plus importante. 242 Avertissement : ce groupe a trop de terrain. Les membres du groupe doivent faire une contribution plus importante.
261 </text> 243 </text>
262 </panel> 244 </panel>
263 <panel label="Argent" name="mon"> 245 <panel label="Argent" name="mon">
264 <tab_container name="group money history tab"> 246 <tab_container name="group money history tab">
265 <panel label="Planification" name="money panel" /> 247 <panel label="Planification" name="money panel"/>
266 <panel label="Détails" name="money panel2"> 248 <panel label="Détails" name="money panel2">
267 <button label="&lt; Plus tôt" label_selected="&lt; Plus tôt" name="&lt; Earlier" 249 <button label="&lt; Plus tôt" label_selected="&lt; Plus tôt" name="&lt; Earlier" tool_tip="Reculer dans le temps"/>
268 tool_tip="Reculer dans le temps" /> 250 <button label="Plus tard &gt;" label_selected="Plus tard &gt;" name="Later &gt;" tool_tip="Avancer dans le temps"/>
269 <button label="Plus tard &gt;" label_selected="Plus tard &gt;" name="Later &gt;"
270 tool_tip="Avancer dans le temps" />
271 </panel> 251 </panel>
272 <panel label="Ventes" name="money panel3"> 252 <panel label="Ventes" name="money panel3">
273 <button label="&lt; Plus tôt" label_selected="&lt; Plus tôt" name="&lt; Earlier" 253 <button label="&lt; Plus tôt" label_selected="&lt; Plus tôt" name="&lt; Earlier" tool_tip="Reculer dans le temps"/>
274 tool_tip="Reculer dans le temps" /> 254 <button label="Plus tard &gt;" label_selected="Plus tard &gt;" name="Later &gt;" tool_tip="Avancer dans le temps"/>
275 <button label="Plus tard &gt;" label_selected="Plus tard &gt;" name="Later &gt;"
276 tool_tip="Avancer dans le temps" />
277 </panel> 255 </panel>
278 </tab_container> 256 </tab_container>
279 </panel> 257 </panel>
280 </tab_container> 258 </tab_container>
281 <button label="OK" label_selected="OK" name="OK" /> 259 <button label="OK" label_selected="OK" name="OK"/>
282 <button label="Annuler" label_selected="Annuler" name="Cancel" /> 260 <button label="Annuler" label_selected="Annuler" name="Cancel"/>
283</floater> 261</floater>
diff --git a/linden/indra/newview/skins/default/xui/fr/floater_hardware_settings.xml b/linden/indra/newview/skins/default/xui/fr/floater_hardware_settings.xml
index 1b5bcdb..87ab55f 100644
--- a/linden/indra/newview/skins/default/xui/fr/floater_hardware_settings.xml
+++ b/linden/indra/newview/skins/default/xui/fr/floater_hardware_settings.xml
@@ -1,9 +1,9 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 1<?xml version="1.0" encoding="utf-8" standalone="yes"?>
2<floater name="Hardware Settings Floater" title="Configuration du matériel"> 2<floater name="Hardware Settings Floater" title="Configuration du matériel">
3 <text name="Filtering:"> 3 <text name="Filtering:">
4 Filtres : 4 Filtres :
5 </text> 5 </text>
6 <check_box label="Filtre anisotrope (plus lent si activé)" name="ani" /> 6 <check_box label="Filtre anisotrope (plus lent si activé)" name="ani"/>
7 <text name="Antialiasing:"> 7 <text name="Antialiasing:">
8 Anti-aliasing : 8 Anti-aliasing :
9 </text> 9 </text>
@@ -24,17 +24,16 @@
24 16x 24 16x
25 </combo_item> 25 </combo_item>
26 </combo_box> 26 </combo_box>
27 <spinner label="Gamma :" name="gamma" /> 27 <spinner label="Gamma :" name="gamma"/>
28 <text name="(brightness, lower is brighter)" left="217" > 28 <text left="217" name="(brightness, lower is brighter)">
29 (luminosité, valeur faible = plus lumineux, 0 = défaut) 29 (luminosité, valeur faible = plus lumineux, 0 = défaut)
30 </text> 30 </text>
31 <text name="Enable VBO:"> 31 <text name="Enable VBO:">
32 Activer le VBO : 32 Activer le VBO :
33 </text> 33 </text>
34 <check_box label="Activer OpenGL Vertex Buffer Objects" name="vbo" 34 <check_box label="Activer OpenGL Vertex Buffer Objects" name="vbo" tool_tip="Sur un matériel moderne, cette option permet une meilleure performance. Par contre, sur un matériel plus ancien, les VBO sont souvent mal implémentés et peuvent causer des crashs lorsqu&apos;ils sont activés."/>
35 tool_tip="Sur un matériel moderne, cette option permet une meilleure performance. Par contre, sur un matériel plus ancien, les VBO sont souvent mal implémentés et peuvent causer des crashs lorsqu&apos;ils sont activés." /> 35 <slider label="Mémoire vidéo (Mo) :" name="GrapicsCardTextureMemory" tool_tip="Total de la mémoire alloué aux textures. Mémoire de la carte vidéo par défaut. En réduisant cette valeur, vous pouvez accroître la performance mais les textures risquent de devenir floues."/>
36 <slider label="Mémoire texture (Mo) :" name="GrapicsCardTextureMemory" 36 <spinner label="Indice
37 tool_tip="Total de la mémoire alloué aux textures. Mémoire de la carte vidéo par défaut. En réduisant cette valeur, vous pouvez accroître la performance mais les textures risquent de devenir floues." /> 37du brouillard :" name="fog"/>
38 <spinner label="Rapport de distance &#10;du brouillard :" name="fog" /> 38 <button label="OK" label_selected="OK" name="OK"/>
39 <button label="OK" label_selected="OK" name="OK" />
40</floater> 39</floater>
diff --git a/linden/indra/newview/skins/default/xui/fr/floater_image_preview.xml b/linden/indra/newview/skins/default/xui/fr/floater_image_preview.xml
index a93547f..f440ffd 100644
--- a/linden/indra/newview/skins/default/xui/fr/floater_image_preview.xml
+++ b/linden/indra/newview/skins/default/xui/fr/floater_image_preview.xml
@@ -1,4 +1,4 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 1<?xml version="1.0" encoding="utf-8" standalone="yes"?>
2<floater name="Image Preview" title=""> 2<floater name="Image Preview" title="">
3 <text name="name_label"> 3 <text name="name_label">
4 Nom : 4 Nom :
@@ -46,7 +46,7 @@
46 46
47Sauvegardez en Targa 24 bit (.tga). 47Sauvegardez en Targa 24 bit (.tga).
48 </text> 48 </text>
49 <check_box label="Utiliser une compression sans perte" name="lossless_check" /> 49 <check_box label="Utiliser une compression sans perte" name="lossless_check"/>
50 <button label="Annuler" name="cancel_btn" /> 50 <button label="Annuler" name="cancel_btn"/>
51 <button label="Charger ([AMOUNT] $L)" name="ok_btn" /> 51 <button label="Charger ([AMOUNT] L$)" name="ok_btn"/>
52</floater> 52</floater>
diff --git a/linden/indra/newview/skins/default/xui/fr/floater_import.xml b/linden/indra/newview/skins/default/xui/fr/floater_import.xml
index a29d8e6..3b4cdc0 100644
--- a/linden/indra/newview/skins/default/xui/fr/floater_import.xml
+++ b/linden/indra/newview/skins/default/xui/fr/floater_import.xml
@@ -1,4 +1,4 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 1<?xml version="1.0" encoding="utf-8" standalone="yes"?>
2<floater name="Import" title=""> 2<floater name="Import" title="">
3 <text name="name_label"> 3 <text name="name_label">
4 Nom : 4 Nom :
@@ -9,8 +9,8 @@
9 <text name="preview_label"> 9 <text name="preview_label">
10 Fichiers à charger : 10 Fichiers à charger :
11 </text> 11 </text>
12 <button label="Annuler" name="cancel_btn" /> 12 <button label="Annuler" name="cancel_btn"/>
13 <button label="Charger (10 $L)" name="ok_btn" /> 13 <button label="Charger (10 L$)" name="ok_btn"/>
14 <text name="preview_label2"> 14 <text name="preview_label2">
15 Prévisualisation de l&apos;image : 15 Prévisualisation de l&apos;image :
16 </text> 16 </text>
diff --git a/linden/indra/newview/skins/default/xui/fr/floater_instant_message.xml b/linden/indra/newview/skins/default/xui/fr/floater_instant_message.xml
index cfa89fe..a11d1db 100644
--- a/linden/indra/newview/skins/default/xui/fr/floater_instant_message.xml
+++ b/linden/indra/newview/skins/default/xui/fr/floater_instant_message.xml
@@ -1,7 +1,7 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 1<?xml version="1.0" encoding="utf-8" standalone="yes"?>
2<floater label="(inconnue)" name="im_floater" title="(inconnue)"> 2<floater label="(inconnue)" name="im_floater" title="(inconnue)">
3 <button label="Profil..." label_selected="Profil..." name="profile_btn" /> 3 <button label="Profil..." label_selected="Profil..." name="profile_btn"/>
4 <button label="Fermer" label_selected="Fermer" name="close_btn" /> 4 <button label="Fermer" label_selected="Fermer" name="close_btn"/>
5 <string name="ringing"> 5 <string name="ringing">
6 Appel en cours... 6 Appel en cours...
7 </string> 7 </string>
@@ -26,14 +26,14 @@
26 <string name="default_text_label"> 26 <string name="default_text_label">
27 Cliquez ici pour envoyer un message instantané. 27 Cliquez ici pour envoyer un message instantané.
28 </string> 28 </string>
29 <button label="Profil..." name="profile_callee_btn" /> 29 <button label="Profil..." name="profile_callee_btn"/>
30 <button label="Appeler" name="start_call_btn" /> 30 <button label="Appeler" name="start_call_btn"/>
31 <button label="Raccrocher" name="end_call_btn" /> 31 <button label="Raccrocher" name="end_call_btn"/>
32 <panel name="speaker_controls"> 32 <panel name="speaker_controls">
33 <button name="mute_btn" tool_tip="Ignorer" /> 33 <button name="mute_btn" tool_tip="Ignorez"/>
34 </panel> 34 </panel>
35 <line_editor label="Cliquez ici pour envoyer un message instantané" name="chat_editor" /> 35 <line_editor label="Cliquez ici pour envoyer un message instantané" name="chat_editor"/>
36 <button label="Envoyer" name="send_btn" /> 36 <button label="Envoyer" name="send_btn"/>
37 <text name="live_help_dialog"> 37 <text name="live_help_dialog">
38 *** Bienvenue sur la page Demande d&apos;aide *** 38 *** Bienvenue sur la page Demande d&apos;aide ***
39Veuillez au préalable consulter les pages d&apos;aide de Second Life en appuyant sur la touche F1, ou en accédant à la base de connaissances http://secondlife.com/knowledgebase/ 39Veuillez au préalable consulter les pages d&apos;aide de Second Life en appuyant sur la touche F1, ou en accédant à la base de connaissances http://secondlife.com/knowledgebase/
diff --git a/linden/indra/newview/skins/default/xui/fr/floater_instant_message_ad_hoc.xml b/linden/indra/newview/skins/default/xui/fr/floater_instant_message_ad_hoc.xml
index 64a9743..66e9767 100644
--- a/linden/indra/newview/skins/default/xui/fr/floater_instant_message_ad_hoc.xml
+++ b/linden/indra/newview/skins/default/xui/fr/floater_instant_message_ad_hoc.xml
@@ -1,4 +1,4 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 1<?xml version="1.0" encoding="utf-8" standalone="yes"?>
2<floater label="(inconnu)" name="im_floater" title="(inconnu)"> 2<floater label="(inconnu)" name="im_floater" title="(inconnu)">
3 <string name="ringing"> 3 <string name="ringing">
4 En train de rejoindre le chat vocal... 4 En train de rejoindre le chat vocal...
@@ -27,11 +27,10 @@
27 <layout_stack name="panels"> 27 <layout_stack name="panels">
28 <layout_panel name="im_contents_panel"> 28 <layout_panel name="im_contents_panel">
29 <button label="Appeler" name="start_call_btn" width="95"/> 29 <button label="Appeler" name="start_call_btn" width="95"/>
30 <button label="Raccrocher" name="end_call_btn" width="95" halign="right"/> 30 <button halign="right" label="Raccrocher" name="end_call_btn" width="95"/>
31 <button label="&lt; &lt;" label_selected="&gt; &gt;" name="toggle_active_speakers_btn" 31 <button label="&lt; &lt;" label_selected="&gt; &gt;" name="toggle_active_speakers_btn" tool_tip="Affichez/masquez la liste des intervenants actifs dans cette session IM."/>
32 tool_tip="Cliquez ici pour mettre la liste des intervenants actifs dans cette session IM en mode bascule." /> 32 <line_editor label="Cliquez ici pour envoyer un message instantané" name="chat_editor"/>
33 <line_editor label="Cliquez ici pour envoyer un message instantané" name="chat_editor" /> 33 <button label="Envoyer" name="send_btn"/>
34 <button label="Envoyer" name="send_btn" />
35 </layout_panel> 34 </layout_panel>
36 </layout_stack> 35 </layout_stack>
37 <string name="live_help_dialog"> 36 <string name="live_help_dialog">
diff --git a/linden/indra/newview/skins/default/xui/fr/floater_instant_message_group.xml b/linden/indra/newview/skins/default/xui/fr/floater_instant_message_group.xml
index faede02..06e4be0 100644
--- a/linden/indra/newview/skins/default/xui/fr/floater_instant_message_group.xml
+++ b/linden/indra/newview/skins/default/xui/fr/floater_instant_message_group.xml
@@ -1,4 +1,4 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 1<?xml version="1.0" encoding="utf-8" standalone="yes"?>
2<floater label="(inconnu)" name="im_floater" title="(inconnu)"> 2<floater label="(inconnu)" name="im_floater" title="(inconnu)">
3 <string name="ringing"> 3 <string name="ringing">
4 En train de rejoindre le chat vocal... 4 En train de rejoindre le chat vocal...
@@ -38,13 +38,11 @@
38 </string> 38 </string>
39 <layout_stack name="panels"> 39 <layout_stack name="panels">
40 <layout_panel name="im_contents_panel"> 40 <layout_panel name="im_contents_panel">
41 <button label="Infos sur le groupe" name="group_info_btn" width="120" /> 41 <button label="Infos sur le groupe" name="group_info_btn" width="120"/>
42 <button label="Participer à l&apos;appel" left_delta="125" name="start_call_btn" 42 <button label="Participer à l&apos;appel" left_delta="125" name="start_call_btn" width="145"/>
43 width="145" /> 43 <button halign="center" label="Raccrocher" name="end_call_btn" width="145"/>
44 <button halign="center" label="Raccrocher" name="end_call_btn" width="145" /> 44 <button label="&lt; &lt;" label_selected="&gt; &gt;" name="toggle_active_speakers_btn" tool_tip="Affichez/Masquez la liste des intervenants actifs dans cette session IM."/>
45 <button label="&lt; &lt;" label_selected="&gt; &gt;" name="toggle_active_speakers_btn" 45 <button label="Envoyer" name="send_btn"/>
46 tool_tip="Cliquez ici pour mettre la liste des intervenants actifs dans cette session IM en mode bascule." />
47 <button label="Envoyer" name="send_btn" />
48 </layout_panel> 46 </layout_panel>
49 </layout_stack> 47 </layout_stack>
50</floater> 48</floater>
diff --git a/linden/indra/newview/skins/default/xui/fr/floater_inventory.xml b/linden/indra/newview/skins/default/xui/fr/floater_inventory.xml
index eb692db..4a552bd 100644
--- a/linden/indra/newview/skins/default/xui/fr/floater_inventory.xml
+++ b/linden/indra/newview/skins/default/xui/fr/floater_inventory.xml
@@ -1,55 +1,55 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 1<?xml version="1.0" encoding="utf-8" standalone="yes"?>
2<floater name="Inventory" title="Inventaire"> 2<floater name="Inventory" title="Inventaire">
3 <search_editor label="Saisissez votre recherche ici" name="inventory search editor" /> 3 <search_editor label="Saisissez votre recherche ici" name="inventory search editor"/>
4 <tab_container name="inventory filter tabs"> 4 <tab_container name="inventory filter tabs">
5 <inventory_panel label="Tous les objets" name="All Items" /> 5 <inventory_panel label="Tous les objets" name="All Items"/>
6 <inventory_panel label="Objets récents" name="Recent Items" /> 6 <inventory_panel label="Objets récents" name="Recent Items"/>
7 </tab_container> 7 </tab_container>
8 <menu_bar name="Inventory Menu"> 8 <menu_bar name="Inventory Menu">
9 <menu label="Fichier" name="File"> 9 <menu label="Fichier" name="File">
10 <tearoff_menu label="~~~~~~~~~~~" name="~~~~~~~~~~~" /> 10 <tearoff_menu label="~~~~~~~~~~~" name="~~~~~~~~~~~"/>
11 <menu_item_call label="Ouvrir" name="Open" /> 11 <menu_item_call label="Ouvrir" name="Open"/>
12 <menu_item_call label="Nouvelle fenêtre" name="New Window" /> 12 <menu_item_call label="Nouvelle fenêtre" name="New Window"/>
13 <menu_item_call label="Afficher les filtres" name="Show Filters" /> 13 <menu_item_call label="Afficher les filtres" name="Show Filters"/>
14 <menu_item_call label="Réinitialiser les filtres" name="Reset Current" /> 14 <menu_item_call label="Réinitialiser les filtres" name="Reset Current"/>
15 <menu_item_call label="Fermer tous les dossiers" name="Close All Folders" /> 15 <menu_item_call label="Fermer tous les dossiers" name="Close All Folders"/>
16 <menu_item_call label="Vider la corbeille" name="Empty Trash" /> 16 <menu_item_call label="Vider la corbeille" name="Empty Trash"/>
17 </menu> 17 </menu>
18 <menu label="Créer" name="Create"> 18 <menu label="Créer" name="Create">
19 <tearoff_menu label="~~~~~~~~~~~" name="~~~~~~~~~~~" /> 19 <tearoff_menu label="~~~~~~~~~~~" name="~~~~~~~~~~~"/>
20 <menu_item_call label="Nouveau dossier" name="New Folder" /> 20 <menu_item_call label="Nouveau dossier" name="New Folder"/>
21 <menu_item_call label="Nouveau script" name="New Script" /> 21 <menu_item_call label="Nouveau script" name="New Script"/>
22 <menu_item_call label="Nouvelle note" name="New Note" /> 22 <menu_item_call label="Nouvelle note" name="New Note"/>
23 <menu_item_call label="Nouveau geste" name="New Gesture" /> 23 <menu_item_call label="Nouveau geste" name="New Gesture"/>
24 <menu name="New Clothes"> 24 <menu name="New Clothes">
25 <menu_item_call label="Nouvelle jupe" name="New Shirt" /> 25 <menu_item_call label="Nouvelle chemise" name="New Shirt"/>
26 <menu_item_call label="Nouveau pantalon" name="New Pants" /> 26 <menu_item_call label="Nouveau pantalon" name="New Pants"/>
27 <menu_item_call label="Nouvelles chaussures" name="New Shoes" /> 27 <menu_item_call label="Nouvelles chaussures" name="New Shoes"/>
28 <menu_item_call label="Nouvelles chaussettes" name="New Socks" /> 28 <menu_item_call label="Nouvelles chaussettes" name="New Socks"/>
29 <menu_item_call label="Nouvelle veste" name="New Jacket" /> 29 <menu_item_call label="Nouvelle veste" name="New Jacket"/>
30 <menu_item_call label="Nouvelle jupe" name="New Skirt" /> 30 <menu_item_call label="Nouvelle jupe" name="New Skirt"/>
31 <menu_item_call label="Nouveaux gants" name="New Gloves" /> 31 <menu_item_call label="Nouveaux gants" name="New Gloves"/>
32 <menu_item_call label="Nouveau tricot de peau" name="New Undershirt" /> 32 <menu_item_call label="Nouveau tricot de peau" name="New Undershirt"/>
33 <menu_item_call label="Nouveaux sous-vêtements" name="New Underpants" /> 33 <menu_item_call label="Nouveaux sous-vêtements" name="New Underpants"/>
34 </menu> 34 </menu>
35 <menu name="New Body Parts"> 35 <menu name="New Body Parts">
36 <menu_item_call label="Nouvelle silhouette" name="New Shape" /> 36 <menu_item_call label="Nouvelle silhouette" name="New Shape"/>
37 <menu_item_call label="Nouvelle peau" name="New Skin" /> 37 <menu_item_call label="Nouvelle peau" name="New Skin"/>
38 <menu_item_call label="Nouveaux cheveux" name="New Hair" /> 38 <menu_item_call label="Nouveaux cheveux" name="New Hair"/>
39 <menu_item_call label="Nouveaux yeux" name="New Eyes" /> 39 <menu_item_call label="Nouveaux yeux" name="New Eyes"/>
40 </menu> 40 </menu>
41 </menu> 41 </menu>
42 <menu label="Trier" name="Sort"> 42 <menu label="Trier" name="Sort">
43 <tearoff_menu label="~~~~~~~~~~~" name="~~~~~~~~~~~" /> 43 <tearoff_menu label="~~~~~~~~~~~" name="~~~~~~~~~~~"/>
44 <menu_item_check label="Par nom" name="By Name" /> 44 <menu_item_check label="Par nom" name="By Name"/>
45 <menu_item_check label="Par date" name="By Date" /> 45 <menu_item_check label="Par date" name="By Date"/>
46 <menu_item_check label="Dossiers toujours par nom" name="Folders Always By Name" /> 46 <menu_item_check label="Trier les dossiers par nom" name="Folders Always By Name"/>
47 <menu_item_check label="Dossiers système au dessus" name="System Folders To Top" /> 47 <menu_item_check label="Dossiers système en premier" name="System Folders To Top"/>
48 </menu> 48 </menu>
49 <menu label="Filters" name="Filters"> 49 <menu label="Filters" name="Filters">
50 <tearoff_menu label="~~~~~~~~~~~" name="~~~~~~~~~~~" /> 50 <tearoff_menu label="~~~~~~~~~~~" name="~~~~~~~~~~~"/>
51 <menu_item_check label="Modifier actuel" name="Modify Current" /> 51 <menu_item_check label="Modifier actuel" name="Modify Current"/>
52 <menu_item_call label="Réinitialiser actuel" name="Reset Current" /> 52 <menu_item_call label="Réinitialiser actuel" name="Reset Current"/>
53 </menu> 53 </menu>
54 </menu_bar> 54 </menu_bar>
55</floater> 55</floater>
diff --git a/linden/indra/newview/skins/default/xui/fr/floater_inventory_item_properties.xml b/linden/indra/newview/skins/default/xui/fr/floater_inventory_item_properties.xml
index a23a589..09934ad 100644
--- a/linden/indra/newview/skins/default/xui/fr/floater_inventory_item_properties.xml
+++ b/linden/indra/newview/skins/default/xui/fr/floater_inventory_item_properties.xml
@@ -1,6 +1,5 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 1<?xml version="1.0" encoding="utf-8" standalone="yes"?>
2<floater name="item properties" 2<floater name="item properties" title="Propriétés de l&apos;objet de l&apos;inventaire">
3 title="Propriétés de l&apos;objet de l&apos;inventaire">
4 <text name="LabelItemNameTitle"> 3 <text name="LabelItemNameTitle">
5 Nom : 4 Nom :
6 </text> 5 </text>
@@ -13,14 +12,14 @@
13 <text name="LabelCreatorName"> 12 <text name="LabelCreatorName">
14 Nicole Linden 13 Nicole Linden
15 </text> 14 </text>
16 <button label="Profil..." label_selected="" name="BtnCreator" /> 15 <button label="Profil..." label_selected="" name="BtnCreator"/>
17 <text name="LabelOwnerTitle"> 16 <text name="LabelOwnerTitle">
18 Propriétaire : 17 Propriétaire :
19 </text> 18 </text>
20 <text name="LabelOwnerName"> 19 <text name="LabelOwnerName">
21 Thrax Linden 20 Thrax Linden
22 </text> 21 </text>
23 <button label="Profil..." label_selected="" name="BtnOwner" /> 22 <button label="Profil..." label_selected="" name="BtnOwner"/>
24 <text name="LabelAcquiredTitle"> 23 <text name="LabelAcquiredTitle">
25 Acquis : 24 Acquis :
26 </text> 25 </text>
@@ -30,9 +29,9 @@
30 <text name="OwnerLabel"> 29 <text name="OwnerLabel">
31 Vous pouvez : 30 Vous pouvez :
32 </text> 31 </text>
33 <check_box label="Modifier" name="CheckOwnerModify" /> 32 <check_box label="Modifier" name="CheckOwnerModify"/>
34 <check_box label="Copier" name="CheckOwnerCopy" /> 33 <check_box label="Copier" name="CheckOwnerCopy"/>
35 <check_box label="Revendre/Donner" name="CheckOwnerTransfer" /> 34 <check_box label="Revendre/Donner" name="CheckOwnerTransfer"/>
36 <text name="BaseMaskDebug"> 35 <text name="BaseMaskDebug">
37 B : 36 B :
38 </text> 37 </text>
@@ -48,18 +47,18 @@
48 <text name="NextMaskDebug"> 47 <text name="NextMaskDebug">
49 N : 48 N :
50 </text> 49 </text>
51 <check_box label="Partager avec le groupe" name="CheckShareWithGroup" /> 50 <check_box label="Partager avec le groupe" name="CheckShareWithGroup"/>
52 <check_box label="Autoriser tout le monde à copier" name="CheckEveryoneCopy" /> 51 <check_box label="Autoriser tout le monde à copier" name="CheckEveryoneCopy"/>
53 <text name="NextOwnerLabel"> 52 <text name="NextOwnerLabel">
54 Le prochain propriétaire pourra : 53 Le prochain propriétaire pourra :
55 </text> 54 </text>
56 <check_box label="Modifier" name="CheckNextOwnerModify" /> 55 <check_box label="Modifier" name="CheckNextOwnerModify"/>
57 <check_box label="Copier" name="CheckNextOwnerCopy" /> 56 <check_box label="Copier" name="CheckNextOwnerCopy"/>
58 <check_box label="Revendre/Donner" name="CheckNextOwnerTransfer" /> 57 <check_box label="Revendre/Donner" name="CheckNextOwnerTransfer"/>
59 <text name="SaleLabel"> 58 <text name="SaleLabel">
60 Marquer l&apos;objet : 59 Marquer l&apos;objet :
61 </text> 60 </text>
62 <check_box label="À vendre" name="CheckPurchase" /> 61 <check_box label="À vendre" name="CheckPurchase"/>
63 <radio_group name="RadioSaleType"> 62 <radio_group name="RadioSaleType">
64 <radio_item name="radio"> 63 <radio_item name="radio">
65 Original 64 Original
@@ -69,7 +68,7 @@
69 </radio_item> 68 </radio_item>
70 </radio_group> 69 </radio_group>
71 <text name="TextPrice"> 70 <text name="TextPrice">
72 Prix : $L 71 Prix : L$
73 </text> 72 </text>
74 <string name="unknown"> 73 <string name="unknown">
75 (inconnu) 74 (inconnu)
diff --git a/linden/indra/newview/skins/default/xui/fr/floater_inventory_view_finder.xml b/linden/indra/newview/skins/default/xui/fr/floater_inventory_view_finder.xml
index 2207d50..08c3e2a 100644
--- a/linden/indra/newview/skins/default/xui/fr/floater_inventory_view_finder.xml
+++ b/linden/indra/newview/skins/default/xui/fr/floater_inventory_view_finder.xml
@@ -1,24 +1,24 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 1<?xml version="1.0" encoding="utf-8" standalone="yes"?>
2<floater name="Inventory Finder" title="inventory_recent_items"> 2<floater name="Inventory Finder" title="inventory_recent_items">
3 <check_box label="Animation" name="check_animation" /> 3 <check_box label="Animations" name="check_animation"/>
4 <check_box label="Cartes de visite" name="check_calling_card" /> 4 <check_box label="Cartes de visite" name="check_calling_card"/>
5 <check_box label="Habits" name="check_clothing" /> 5 <check_box label="Habits" name="check_clothing"/>
6 <check_box label="Gestes" name="check_gesture" /> 6 <check_box label="Gestes" name="check_gesture"/>
7 <check_box label="Repères" name="check_landmark" /> 7 <check_box label="Repères" name="check_landmark"/>
8 <check_box label="Notes" name="check_notecard" /> 8 <check_box label="Notes" name="check_notecard"/>
9 <check_box label="Objets" name="check_object" /> 9 <check_box label="Objets" name="check_object"/>
10 <check_box label="Scripts" name="check_script" /> 10 <check_box label="Scripts" name="check_script"/>
11 <check_box label="Sons" name="check_sound" /> 11 <check_box label="Sons" name="check_sound"/>
12 <check_box label="Textures" name="check_texture" /> 12 <check_box label="Textures" name="check_texture"/>
13 <check_box label="Photos" name="check_snapshot" /> 13 <check_box label="Photos" name="check_snapshot"/>
14 <button label="Tout" label_selected="Tout" name="All" /> 14 <button label="Tout" label_selected="Tout" name="All"/>
15 <button label="Aucun" label_selected="Aucun" name="None" /> 15 <button label="Aucun" label_selected="Aucun" name="None"/>
16 <check_box label="Toujours montrer les dossiers" name="check_show_empty" /> 16 <check_box label="Toujours montrer les dossiers" name="check_show_empty"/>
17 <check_box label="Depuis la déconnexion" name="check_since_logoff" /> 17 <check_box label="Depuis la déconnexion" name="check_since_logoff"/>
18 <text type="string" length="1" name="- OR -"> 18 <text length="1" name="- OR -" type="string">
19 Ou il y a... 19 Ou il y a...
20 </text> 20 </text>
21 <spinner label="Heures" name="spin_hours_ago" /> 21 <spinner label="Heures" name="spin_hours_ago"/>
22 <spinner label="Jours" name="spin_days_ago" /> 22 <spinner label="Jours" name="spin_days_ago"/>
23 <button label="Fermer" label_selected="Fermer" name="Close" /> 23 <button label="Fermer" label_selected="Fermer" name="Close"/>
24</floater> 24</floater>
diff --git a/linden/indra/newview/skins/default/xui/fr/floater_lagmeter.xml b/linden/indra/newview/skins/default/xui/fr/floater_lagmeter.xml
index d6837c3..da51b1b 100644
--- a/linden/indra/newview/skins/default/xui/fr/floater_lagmeter.xml
+++ b/linden/indra/newview/skins/default/xui/fr/floater_lagmeter.xml
@@ -1,30 +1,30 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 1<?xml version="1.0" encoding="utf-8" standalone="yes"?>
2<floater name="floater_lagmeter" title="Calcul du lag"> 2<floater name="floater_lagmeter" title="Mesure du lag">
3 <button name="client_lagmeter" tool_tip="Statut du lag client" /> 3 <button name="client_lagmeter" tool_tip="Statut du lag client"/>
4 <text name="client"> 4 <text name="client">
5 Client : 5 Client :
6 </text> 6 </text>
7 <text name="client_text"> 7 <text name="client_text">
8 Normal 8 Normal
9 </text> 9 </text>
10 <button name="network_lagmeter" tool_tip="Statut du lag réseau" /> 10 <button name="network_lagmeter" tool_tip="Statut du lag réseau"/>
11 <text name="network"> 11 <text name="network">
12 Réseau : 12 Réseau :
13 </text> 13 </text>
14 <text name="network_text"> 14 <text name="network_text">
15 Normal 15 Normal
16 </text> 16 </text>
17 <button name="server_lagmeter" tool_tip="Statut du lag serveur" /> 17 <button name="server_lagmeter" tool_tip="Statut du lag serveur"/>
18 <text name="server"> 18 <text name="server">
19 Serveur : 19 Serveur :
20 </text> 20 </text>
21 <text name="server_text"> 21 <text name="server_text">
22 Normal 22 Normal
23 </text> 23 </text>
24 <button label="?" name="server_help" /> 24 <button label="?" name="server_help"/>
25 <button label="&gt;&gt;" name="minimize" /> 25 <button label="&gt;&gt;" name="minimize"/>
26 <string name="max_title_msg"> 26 <string name="max_title_msg">
27 Calcul du lag 27 Mesure du lag
28 </string> 28 </string>
29 <string name="max_width_px"> 29 <string name="max_width_px">
30 360 30 360
@@ -57,7 +57,7 @@
57 Normal 57 Normal
58 </string> 58 </string>
59 <string name="client_draw_distance_cause_msg"> 59 <string name="client_draw_distance_cause_msg">
60 Cause possible : la distance d&apos;affichage est trop élevée 60 Cause possible : la limite d&apos;affichage est trop élevée
61 </string> 61 </string>
62 <string name="client_texture_loading_cause_msg"> 62 <string name="client_texture_loading_cause_msg">
63 Cause possible : images en cours de chargement 63 Cause possible : images en cours de chargement
diff --git a/linden/indra/newview/skins/default/xui/fr/floater_media_browser.xml b/linden/indra/newview/skins/default/xui/fr/floater_media_browser.xml
index 6d6d4fc..4695d16 100644
--- a/linden/indra/newview/skins/default/xui/fr/floater_media_browser.xml
+++ b/linden/indra/newview/skins/default/xui/fr/floater_media_browser.xml
@@ -1,20 +1,20 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 1<?xml version="1.0" encoding="utf-8" standalone="yes"?>
2<floater name="floater_about" title="Navigateur média"> 2<floater name="floater_about" title="Navigateur">
3 <layout_stack name="stack1"> 3 <layout_stack name="stack1">
4 <layout_panel name="nav_controls"> 4 <layout_panel name="nav_controls">
5 <button label="Précédente" name="back" width="75" /> 5 <button label="Précédente" name="back" width="75"/>
6 <button label="Suivante" name="forward" width="70" left_delta="75" /> 6 <button label="Suivante" left_delta="75" name="forward" width="70"/>
7 <button label="Recharger" name="reload" left_delta="75" /> 7 <button label="Recharger" left_delta="75" name="reload"/>
8 <combo_box left_delta="75" name="address" width="250" /> 8 <combo_box left_delta="75" name="address" width="250"/>
9 <button label="Aller" name="go" left_delta="255"/> 9 <button label="OK" left_delta="255" name="go"/>
10 </layout_panel> 10 </layout_panel>
11 <layout_panel name="parcel_owner_controls"> 11 <layout_panel name="parcel_owner_controls">
12 <button label="Envoyer URL actuelle sur parcelle" name="assign" /> 12 <button label="Envoyer l&apos;URL sur la parcelle" name="assign"/>
13 </layout_panel> 13 </layout_panel>
14 <layout_panel name="external_controls"> 14 <layout_panel name="external_controls">
15 <button label="Ouvrir dans mon navigateur web" name="open_browser" width="190" /> 15 <button label="Ouvrir dans mon navigateur web" name="open_browser" width="190"/>
16 <check_box label="Toujours ouvrir dans mon navigateur web" name="open_always" left_delta="195"/> 16 <check_box label="Toujours ouvrir dans mon navigateur web" left_delta="195" name="open_always"/>
17 <button label="Fermer" name="close" /> 17 <button label="Fermer" name="close"/>
18 </layout_panel> 18 </layout_panel>
19 </layout_stack> 19 </layout_stack>
20</floater> 20</floater>
diff --git a/linden/indra/newview/skins/default/xui/fr/floater_moveview.xml b/linden/indra/newview/skins/default/xui/fr/floater_moveview.xml
index 002dcce..7da1b46 100644
--- a/linden/indra/newview/skins/default/xui/fr/floater_moveview.xml
+++ b/linden/indra/newview/skins/default/xui/fr/floater_moveview.xml
@@ -1,15 +1,12 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 1<?xml version="1.0" encoding="utf-8" standalone="yes"?>
2<floater name="move floater" title=""> 2<floater name="move floater" title="">
3 <button label="" label_selected="" name="turn left btn" tool_tip="Tourner à gauche" /> 3 <button label="" label_selected="" name="turn left btn" tool_tip="Tourner à gauche"/>
4 <button label="" label_selected="" name="turn right btn" tool_tip="Tourner à droite" /> 4 <button label="" label_selected="" name="turn right btn" tool_tip="Tourner à droite"/>
5 <button label="" label_selected="" name="move up btn" 5 <button label="" label_selected="" name="move up btn" tool_tip="Sauter ou voler vers le haut"/>
6 tool_tip="Sauter ou voler vers le haut" /> 6 <button label="" label_selected="" name="move down btn" tool_tip="S&apos;accroupir ou voler vers le bas"/>
7 <button label="" label_selected="" name="move down btn" 7 <button label="Voler" label_selected="Voler" name="fly btn" tool_tip="Démarrer/arrêter le vol"/>
8 tool_tip="S&apos;accroupir ou voler vers le bas" /> 8 <joystick_slide name="slide left btn" tool_tip="Se déplacer vers la gauche"/>
9 <button label="Voler" label_selected="Voler" name="fly btn" 9 <joystick_slide name="slide right btn" tool_tip="Se déplacer vers la droite"/>
10 tool_tip="Démarrer/arrêter vol" /> 10 <joystick_turn name="forward btn" tool_tip="Se déplacer vers l&apos;avant"/>
11 <joystick_slide name="slide left btn" tool_tip="Se déplacer vers la gauche" /> 11 <joystick_turn name="backward btn" tool_tip="Se déplacer vers l&apos;arrière"/>
12 <joystick_slide name="slide right btn" tool_tip="Se déplacer vers la droite" />
13 <joystick_turn name="forward btn" tool_tip="Se déplacer vers l&apos;avant" />
14 <joystick_turn name="backward btn" tool_tip="Se déplacer vers l&apos;arrière" />
15</floater> 12</floater>
diff --git a/linden/indra/newview/skins/default/xui/fr/floater_mute_object.xml b/linden/indra/newview/skins/default/xui/fr/floater_mute_object.xml
index 0ce234a..61f40e8 100644
--- a/linden/indra/newview/skins/default/xui/fr/floater_mute_object.xml
+++ b/linden/indra/newview/skins/default/xui/fr/floater_mute_object.xml
@@ -1,12 +1,12 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 1<?xml version="1.0" encoding="utf-8" standalone="yes"?>
2<floater name="mute by name" title="Ignorer les objets par nom"> 2<floater name="mute by name" title="Ignorer les objets par nom">
3 <text name="message"> 3 <text name="message">
4 Ignorer par nom ne marche que pour les chats et IM, pas les sons. 4 Cette fonction ne marche que pour les chats et les IM,
5Vous devez saisir le nom exact de l&apos;objet. 5pas les sons. Saisissez le nom exact de l&apos;objet.
6 </text> 6 </text>
7 <line_editor name="object_name"> 7 <line_editor name="object_name">
8 Nom de l&apos;objet 8 Nom de l&apos;objet
9 </line_editor> 9 </line_editor>
10 <button label="OK" name="OK" /> 10 <button label="OK" name="OK"/>
11 <button label="Annuler" name="Cancel" /> 11 <button label="Annuler" name="Cancel"/>
12</floater> 12</floater>
diff --git a/linden/indra/newview/skins/default/xui/fr/floater_name_description.xml b/linden/indra/newview/skins/default/xui/fr/floater_name_description.xml
index 8ff5d3a..33faa06 100644
--- a/linden/indra/newview/skins/default/xui/fr/floater_name_description.xml
+++ b/linden/indra/newview/skins/default/xui/fr/floater_name_description.xml
@@ -1,4 +1,4 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 1<?xml version="1.0" encoding="utf-8" standalone="yes"?>
2<floater name="Name/Description" title=""> 2<floater name="Name/Description" title="">
3 <text name="name_label"> 3 <text name="name_label">
4 Nom : 4 Nom :
@@ -6,6 +6,6 @@
6 <text name="description_label"> 6 <text name="description_label">
7 Description : 7 Description :
8 </text> 8 </text>
9 <button label="Annuler" name="cancel_btn" /> 9 <button label="Annuler" name="cancel_btn"/>
10 <button label="Charger (10 $L)" name="ok_btn" /> 10 <button label="Charger (10 L$)" name="ok_btn"/>
11</floater> 11</floater>
diff --git a/linden/indra/newview/skins/default/xui/fr/floater_new_outfit_dialog.xml b/linden/indra/newview/skins/default/xui/fr/floater_new_outfit_dialog.xml
index 2f3f00b..3b2d497 100644
--- a/linden/indra/newview/skins/default/xui/fr/floater_new_outfit_dialog.xml
+++ b/linden/indra/newview/skins/default/xui/fr/floater_new_outfit_dialog.xml
@@ -1,86 +1,85 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 1<?xml version="1.0" encoding="utf-8" standalone="yes"?>
2<floater name="modal container" width="585"> 2<floater name="modal container" width="585">
3 <button label="Enregistrer" label_selected="Enregistrer" left="171" name="Save" 3 <button label="Enregistrer" label_selected="Enregistrer" left="171" name="Save" width="100"/>
4 width="100" /> 4 <button label="Annuler" label_selected="Annuler" left="280" name="Cancel" width="100"/>
5 <button label="Annuler" label_selected="Annuler" left="280" name="Cancel" width="100" /> 5 <check_box label="Silhouette" name="checkbox_Shape"/>
6 <check_box label="Silhouette" name="checkbox_Shape" /> 6 <check_box label="Peau" name="checkbox_Skin"/>
7 <check_box label="Peau" name="checkbox_Skin" /> 7 <check_box label="Cheveux" name="checkbox_Hair"/>
8 <check_box label="Cheveux" name="checkbox_Hair" /> 8 <check_box label="Yeux" name="checkbox_Eyes"/>
9 <check_box label="Yeux" name="checkbox_Eyes" /> 9 <check_box label="Donner le nom du
10 <check_box label="Donner un nom de &#10;dossier à l&apos;ensemble" name="rename" /> 10dossier à l&apos;ensemble" name="rename"/>
11 <check_box label="Chemise" name="checkbox_Shirt" /> 11 <check_box label="Chemise" name="checkbox_Shirt"/>
12 <check_box label="Pantalon" name="checkbox_Pants" /> 12 <check_box label="Pantalon" name="checkbox_Pants"/>
13 <check_box label="Chaussures" name="checkbox_Shoes" /> 13 <check_box label="Chaussures" name="checkbox_Shoes"/>
14 <check_box label="Chaussettes" name="checkbox_Socks" /> 14 <check_box label="Chaussettes" name="checkbox_Socks"/>
15 <check_box label="Veste" name="checkbox_Jacket" /> 15 <check_box label="Veste" name="checkbox_Jacket"/>
16 <check_box label="Gants" name="checkbox_Gloves" /> 16 <check_box label="Gants" name="checkbox_Gloves"/>
17 <check_box label="Tricot de peau" name="checkbox_Undershirt" /> 17 <check_box label="Tricot de peau" name="checkbox_Undershirt"/>
18 <check_box label="Sous-vêtements" name="checkbox_Underpants" /> 18 <check_box label="Sous-vêtements" name="checkbox_Underpants"/>
19 <check_box label="Jupe" name="checkbox_Skirt" /> 19 <check_box label="Jupe" name="checkbox_Skirt"/>
20 <check_box label="Poitrine" left="225" name="checkbox_Chest" /> 20 <check_box label="Poitrine" left="225" name="checkbox_Chest"/>
21 <check_box label="Crâne" left="225" name="checkbox_Skull" /> 21 <check_box label="Crâne" left="225" name="checkbox_Skull"/>
22 <check_box label="Épaule gauche" left="225" name="checkbox_Left Shoulder" /> 22 <check_box label="Épaule gauche" left="225" name="checkbox_Left Shoulder"/>
23 <check_box label="Épaule droite" left="225" name="checkbox_Right Shoulder" /> 23 <check_box label="Épaule droite" left="225" name="checkbox_Right Shoulder"/>
24 <check_box label="Main gauche" left="225" name="checkbox_Left Hand" /> 24 <check_box label="Main gauche" left="225" name="checkbox_Left Hand"/>
25 <check_box label="Main droite" left="225" name="checkbox_Right Hand" /> 25 <check_box label="Main droite" left="225" name="checkbox_Right Hand"/>
26 <check_box label="Pied gauche" left="225" name="checkbox_Left Foot" /> 26 <check_box label="Pied gauche" left="225" name="checkbox_Left Foot"/>
27 <check_box label="Pied droit" left="225" name="checkbox_Right Foot" /> 27 <check_box label="Pied droit" left="225" name="checkbox_Right Foot"/>
28 <check_box label="Colonne" left="225" name="checkbox_Spine" /> 28 <check_box label="Colonne" left="225" name="checkbox_Spine"/>
29 <check_box label="Bassin" left="225" name="checkbox_Pelvis" /> 29 <check_box label="Bassin" left="225" name="checkbox_Pelvis"/>
30 <check_box label="Bouche" left="225" name="checkbox_Mouth" /> 30 <check_box label="Bouche" left="225" name="checkbox_Mouth"/>
31 <check_box label="Menton" left="225" name="checkbox_Chin" /> 31 <check_box label="Menton" left="225" name="checkbox_Chin"/>
32 <check_box label="Oreille gauche" left="225" name="checkbox_Left Ear" /> 32 <check_box label="Oreille gauche" left="225" name="checkbox_Left Ear"/>
33 <check_box label="Oreille droite" left="325" name="checkbox_Right Ear" /> 33 <check_box label="Oreille droite" left="325" name="checkbox_Right Ear"/>
34 <check_box label="Globe oculaire gauche" left="325" name="checkbox_Left Eyeball" /> 34 <check_box label="Å’il gauche" left="325" name="checkbox_Left Eyeball"/>
35 <check_box label="Globe oculaire droit" left="325" name="checkbox_Right Eyeball" /> 35 <check_box label="Å’il droit" left="325" name="checkbox_Right Eyeball"/>
36 <check_box label="Nez" left="325" name="checkbox_Nose" /> 36 <check_box label="Nez" left="325" name="checkbox_Nose"/>
37 <check_box label="Bras droit" left="325" name="checkbox_R Upper Arm" /> 37 <check_box label="Bras droit" left="325" name="checkbox_R Upper Arm"/>
38 <check_box label="Avant-bras droit" left="325" name="checkbox_R Forearm" /> 38 <check_box label="Avant-bras droit" left="325" name="checkbox_R Forearm"/>
39 <check_box label="Bras gauche" left="325" name="checkbox_L Upper Arm" /> 39 <check_box label="Bras gauche" left="325" name="checkbox_L Upper Arm"/>
40 <check_box label="Avant-bras gauche" left="325" name="checkbox_L Forearm" /> 40 <check_box label="Avant-bras gauche" left="325" name="checkbox_L Forearm"/>
41 <check_box label="Hanche droite" left="325" name="checkbox_Right Hip" /> 41 <check_box label="Hanche droite" left="325" name="checkbox_Right Hip"/>
42 <check_box label="Cuisse droite" left="325" name="checkbox_R Upper Leg" /> 42 <check_box label="Cuisse droite" left="325" name="checkbox_R Upper Leg"/>
43 <check_box label="Jambe droite" left="325" name="checkbox_R Lower Leg" /> 43 <check_box label="Jambe droite" left="325" name="checkbox_R Lower Leg"/>
44 <check_box label="Hanche gauche" left="325" name="checkbox_Left Hip" /> 44 <check_box label="Hanche gauche" left="325" name="checkbox_Left Hip"/>
45 <check_box label="Cuisse gauche" left="325" name="checkbox_L Upper Leg" /> 45 <check_box label="Cuisse gauche" left="325" name="checkbox_L Upper Leg"/>
46 <check_box label="Jambe gauche" left="460" name="checkbox_L Lower Leg" /> 46 <check_box label="Jambe gauche" left="460" name="checkbox_L Lower Leg"/>
47 <check_box label="Estomac" left="460" name="checkbox_Stomach" /> 47 <check_box label="Estomac" left="460" name="checkbox_Stomach"/>
48 <check_box label="Pectoral gauche" left="460" name="checkbox_Left Pec" /> 48 <check_box label="Pectoral gauche" left="460" name="checkbox_Left Pec"/>
49 <check_box label="Pectoral droit" left="460" name="checkbox_Right Pec" /> 49 <check_box label="Pectoral droit" left="460" name="checkbox_Right Pec"/>
50 <check_box label="Centre 2" left="460" name="checkbox_Center 2" /> 50 <check_box label="Centre 2" left="460" name="checkbox_Center 2"/>
51 <check_box label="En haut à droite" left="460" name="checkbox_Top Right" /> 51 <check_box label="En haut à droite" left="460" name="checkbox_Top Right"/>
52 <check_box label="En haut" left="460" name="checkbox_Top" /> 52 <check_box label="En haut" left="460" name="checkbox_Top"/>
53 <check_box label="En haut à gauche" left="460" name="checkbox_Top Left" /> 53 <check_box label="En haut à gauche" left="460" name="checkbox_Top Left"/>
54 <check_box label="Centre" left="460" name="checkbox_Center" /> 54 <check_box label="Centre" left="460" name="checkbox_Center"/>
55 <check_box label="En bas à gauche" left="460" name="checkbox_Bottom Left" /> 55 <check_box label="En bas à gauche" left="460" name="checkbox_Bottom Left"/>
56 <check_box label="En bas" left="460" name="checkbox_Bottom" /> 56 <check_box label="En bas" left="460" name="checkbox_Bottom"/>
57 <check_box label="En bas à droite" left="460" name="checkbox_Bottom Right" /> 57 <check_box label="En bas à droite" left="460" name="checkbox_Bottom Right"/>
58 <text type="string" length="1" name="Make New Outfit"> 58 <text length="1" name="Make New Outfit" type="string">
59 Créer un ensemble 59 Créer un ensemble
60 </text> 60 </text>
61 <text type="string" length="1" 61 <text length="1" name="Outfits are folders that contain clothing and body parts. Drag an outfit folder onto your avatar to put it on. &quot;Make New Outfit&quot; makes a new folder and saves copies of the items you are now wearing into it." type="string">
62 name="Outfits are folders that contain clothing and body parts. Drag an outfit folder onto your avatar to put it on. &quot;Make New Outfit&quot; makes a new folder and saves copies of the items you are now wearing into it.">
63 Les ensembles sont des dossiers qui contiennent des habits et des parties du corps. 62 Les ensembles sont des dossiers qui contiennent des habits et des parties du corps.
64Faites glisser le dossier contenant un ensemble vers votre avatar pour lui faire porter. 63Faites glisser le dossier contenant un ensemble vers votre avatar pour lui faire porter.
65 64
66Le bouton Créer un ensemble vous permet de créer un dossier et d&apos;y sauvegarder les copies des articles que vous portez maintenant. 65Le bouton Créer un ensemble vous permet de créer un dossier et d&apos;y sauvegarder les copies des articles que vous portez maintenant.
67 </text> 66 </text>
68 <text type="string" length="1" name="Folder name:"> 67 <text length="1" name="Folder name:" type="string">
69 Nom du dossier : 68 Nom du dossier :
70 </text> 69 </text>
71 <text type="string" length="1" name="Items to include in outfit:"> 70 <text length="1" name="Items to include in outfit:" type="string">
72 Articles à inclure à l&apos;ensemble : 71 Articles à inclure à l&apos;ensemble :
73 </text> 72 </text>
74 <text type="string" length="1" name="Body Parts:"> 73 <text length="1" name="Body Parts:" type="string">
75 Parties du corps : 74 Parties du corps :
76 </text> 75 </text>
77 <text type="string" length="1" left="115" name="Clothes:"> 76 <text left="115" length="1" name="Clothes:" type="string">
78 Habits : 77 Habits :
79 </text> 78 </text>
80 <text type="string" length="1" left="227" name="Attachments:"> 79 <text left="227" length="1" name="Attachments:" type="string">
81 Attachements : 80 Attachements :
82 </text> 81 </text>
83 <text type="string" length="1" name="Options:"> 82 <text length="1" name="Options:" type="string">
84 Options : 83 Options :
85 </text> 84 </text>
86 <line_editor name="name ed"> 85 <line_editor name="name ed">
diff --git a/linden/indra/newview/skins/default/xui/fr/floater_pay.xml b/linden/indra/newview/skins/default/xui/fr/floater_pay.xml
index 70146eb..7933a26 100644
--- a/linden/indra/newview/skins/default/xui/fr/floater_pay.xml
+++ b/linden/indra/newview/skins/default/xui/fr/floater_pay.xml
@@ -1,22 +1,22 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 1<?xml version="1.0" encoding="utf-8" standalone="yes"?>
2<floater name="Give Money" title=""> 2<floater name="Give Money" title="">
3 <button label="1 $L" label_selected="1 $L" name="fastpay 1" /> 3 <button label="1 L$" label_selected="1 L$" name="fastpay 1"/>
4 <button label="5 $L" label_selected="5 $L" name="fastpay 5" /> 4 <button label="5 L$" label_selected="5 L$" name="fastpay 5"/>
5 <button label="10 $L" label_selected="10 $L" name="fastpay 10" /> 5 <button label="10 L$" label_selected="10 L$" name="fastpay 10"/>
6 <button label="20 $L" label_selected="20 $L" name="fastpay 20" /> 6 <button label="20 L$" label_selected="20 L$" name="fastpay 20"/>
7 <button label="Payer" label_selected="Payer" name="pay btn" /> 7 <button label="Payer" label_selected="Payer" name="pay btn"/>
8 <button label="Annuler" label_selected="Annuler" name="cancel btn" /> 8 <button label="Annuler" label_selected="Annuler" name="cancel btn"/>
9 <text type="string" length="1" name="payee_label"> 9 <text length="1" name="payee_label" type="string">
10 Payer : 10 Payer :
11 </text> 11 </text>
12 <text type="string" length="1" name="payee_name"> 12 <text length="1" name="payee_name" type="string">
13 [FIRST] [LAST] 13 [FIRST] [LAST]
14 </text> 14 </text>
15 <text type="string" length="1" name="fastpay text"> 15 <text length="1" name="fastpay text" type="string">
16 Paiement rapide : 16 Paiement rapide :
17 </text> 17 </text>
18 <text type="string" length="1" name="amount text" left="4"> 18 <text left="4" length="1" name="amount text" type="string">
19 Montant : 19 Montant :
20 </text> 20 </text>
21 <line_editor left="60" name="amount" width="55" /> 21 <line_editor left="60" name="amount" width="55"/>
22</floater> 22</floater>
diff --git a/linden/indra/newview/skins/default/xui/fr/floater_pay_object.xml b/linden/indra/newview/skins/default/xui/fr/floater_pay_object.xml
index 13675f7..ce2c4bb 100644
--- a/linden/indra/newview/skins/default/xui/fr/floater_pay_object.xml
+++ b/linden/indra/newview/skins/default/xui/fr/floater_pay_object.xml
@@ -1,30 +1,30 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 1<?xml version="1.0" encoding="utf-8" standalone="yes"?>
2<floater name="Give Money" title=""> 2<floater name="Give Money" title="">
3 <text type="string" length="1" name="payee_group"> 3 <text length="1" name="payee_group" type="string">
4 Payer le groupe : 4 Payer le groupe :
5 </text> 5 </text>
6 <text type="string" length="1" name="payee_resident"> 6 <text length="1" name="payee_resident" type="string">
7 Payer le résident : 7 Payer le résident :
8 </text> 8 </text>
9 <text type="string" length="1" name="payee_name"> 9 <text length="1" name="payee_name" type="string">
10 [FIRST] [LAST] 10 [FIRST] [LAST]
11 </text> 11 </text>
12 <text type="string" length="1" name="object_name_label"> 12 <text length="1" name="object_name_label" type="string">
13 Via un objet : 13 Via un objet :
14 </text> 14 </text>
15 <text type="string" length="1" name="object_name_text"> 15 <text length="1" name="object_name_text" type="string">
16 ... 16 ...
17 </text> 17 </text>
18 <text type="string" length="1" name="fastpay text"> 18 <text length="1" name="fastpay text" type="string">
19 Paiement rapide : 19 Paiement rapide :
20 </text> 20 </text>
21 <text type="string" length="1" name="amount text"> 21 <text length="1" name="amount text" type="string">
22 Montant : 22 Montant :
23 </text> 23 </text>
24 <button label="1 $L" label_selected="1 $L" name="fastpay 1" /> 24 <button label="1 L$" label_selected="1 L$" name="fastpay 1"/>
25 <button label="5 $L" label_selected="5 $L" name="fastpay 5" /> 25 <button label="5 L$" label_selected="5 L$" name="fastpay 5"/>
26 <button label="10 $L" label_selected="10 $L" name="fastpay 10" /> 26 <button label="10 L$" label_selected="10 L$" name="fastpay 10"/>
27 <button label="20 $L" label_selected="20 $L" name="fastpay 20" /> 27 <button label="20 L$" label_selected="20 L$" name="fastpay 20"/>
28 <button label="Payer" label_selected="Payer" name="pay btn" /> 28 <button label="Payer" label_selected="Payer" name="pay btn"/>
29 <button label="Annuler" label_selected="Annuler" name="cancel btn" /> 29 <button label="Annuler" label_selected="Annuler" name="cancel btn"/>
30</floater> 30</floater>
diff --git a/linden/indra/newview/skins/default/xui/fr/floater_preview_gesture.xml b/linden/indra/newview/skins/default/xui/fr/floater_preview_gesture.xml
index e8441ea..0371469 100644
--- a/linden/indra/newview/skins/default/xui/fr/floater_preview_gesture.xml
+++ b/linden/indra/newview/skins/default/xui/fr/floater_preview_gesture.xml
@@ -33,12 +33,14 @@
33 <text name="steps_label"> 33 <text name="steps_label">
34 Étapes : 34 Étapes :
35 </text> 35 </text>
36 <!-- Revert translations as interim fix to VWR-9985 while the code is not properly internationalized
36 <scroll_list name="library_list"> 37 <scroll_list name="library_list">
37 Animation 38 Animation
38Son 39Son
39Chat 40Chat
40Attendre 41Attendre
41 </scroll_list> 42 </scroll_list>
43 -->
42 <button label="Ajouter &gt;&gt;" name="add_btn" /> 44 <button label="Ajouter &gt;&gt;" name="add_btn" />
43 <button label="Monter" name="up_btn" /> 45 <button label="Monter" name="up_btn" />
44 <button label="Descendre" name="down_btn" /> 46 <button label="Descendre" name="down_btn" />
diff --git a/linden/indra/newview/skins/default/xui/fr/floater_price_for_listing.xml b/linden/indra/newview/skins/default/xui/fr/floater_price_for_listing.xml
index 1a4b20b..0efec83 100644
--- a/linden/indra/newview/skins/default/xui/fr/floater_price_for_listing.xml
+++ b/linden/indra/newview/skins/default/xui/fr/floater_price_for_listing.xml
@@ -1,4 +1,4 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 1<?xml version="1.0" encoding="utf-8" standalone="yes"?>
2<floater name="price_for_listing" title="Publier la petite annonce"> 2<floater name="price_for_listing" title="Publier la petite annonce">
3 <text name="explanation_text"> 3 <text name="explanation_text">
4 Votre petite annonce restera en ligne pendant une semaine à compter de sa date de publication. 4 Votre petite annonce restera en ligne pendant une semaine à compter de sa date de publication.
@@ -7,8 +7,8 @@ La position de votre annonce dans les listes dépend du montant que vous décide
7Les annonces les plus chères paraissent en tête de liste et sont plus visibles dans les résultats de recherche. 7Les annonces les plus chères paraissent en tête de liste et sont plus visibles dans les résultats de recherche.
8 </text> 8 </text>
9 <text name="price_text"> 9 <text name="price_text">
10 Coût de l&apos;annonce ($L) : 10 Coût de l&apos;annonce (L$) :
11 </text> 11 </text>
12 <button label="Fixer le prix" name="set_price_btn" /> 12 <button label="Fixer le prix" name="set_price_btn"/>
13 <button label="Annuler" name="cancel_btn" /> 13 <button label="Annuler" name="cancel_btn"/>
14</floater> 14</floater>
diff --git a/linden/indra/newview/skins/default/xui/fr/floater_region_info.xml b/linden/indra/newview/skins/default/xui/fr/floater_region_info.xml
index 631d37a..be36b41 100644
--- a/linden/indra/newview/skins/default/xui/fr/floater_region_info.xml
+++ b/linden/indra/newview/skins/default/xui/fr/floater_region_info.xml
@@ -1,2 +1,2 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 1<?xml version="1.0" encoding="utf-8" standalone="yes"?>
2<floater name="regioninfo" title="Région/Domaine" /> 2<floater name="regioninfo" title="Région et domaine"/>
diff --git a/linden/indra/newview/skins/default/xui/fr/floater_report_abuse.xml b/linden/indra/newview/skins/default/xui/fr/floater_report_abuse.xml
index 7b90653..7c6826c 100644
--- a/linden/indra/newview/skins/default/xui/fr/floater_report_abuse.xml
+++ b/linden/indra/newview/skins/default/xui/fr/floater_report_abuse.xml
@@ -1,4 +1,4 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 1<?xml version="1.0" encoding="utf-8" standalone="yes"?>
2<floater name="floater_report_abuse" title="Signaler une infraction"> 2<floater name="floater_report_abuse" title="Signaler une infraction">
3 <text name="reporter_title" width="60"> 3 <text name="reporter_title" width="60">
4 Déposant : 4 Déposant :
@@ -15,8 +15,8 @@
15 <text name="pos_title"> 15 <text name="pos_title">
16 Position : 16 Position :
17 </text> 17 </text>
18 <texture_picker name="screenshot" /> 18 <texture_picker name="screenshot"/>
19 <check_box label="Inclure une capture d&apos;écran" name="screen_check" /> 19 <check_box label="Inclure une capture d&apos;écran" name="screen_check"/>
20 <text name="pos_field"> 20 <text name="pos_field">
21 {128.1, 128.1, 15.4} 21 {128.1, 128.1, 15.4}
22 </text> 22 </text>
@@ -26,8 +26,7 @@
26 <text left_delta="70" name="owner_name" width="105"> 26 <text left_delta="70" name="owner_name" width="105">
27 Hendrerit Vulputate 27 Hendrerit Vulputate
28 </text> 28 </text>
29 <combo_box name="category_combo" 29 <combo_box name="category_combo" tool_tip="Choisissez la catégorie qui décrit le mieux ce rapport">
30 tool_tip="Choisissez la catégorie qui décrit le mieux ce rapport">
31 <combo_item name="Select_category"> 30 <combo_item name="Select_category">
32 Sélectionnez une catégorie 31 Sélectionnez une catégorie
33 </combo_item> 32 </combo_item>
@@ -56,7 +55,7 @@
56 Commerce &gt; Incapacité à fournir un produit ou service 55 Commerce &gt; Incapacité à fournir un produit ou service
57 </combo_item> 56 </combo_item>
58 <combo_item name="Disclosure__First_Life_information"> 57 <combo_item name="Disclosure__First_Life_information">
59 Divulgation &gt; Informations sur la première vie (First Life) 58 Divulgation &gt; Informations sur la vie réelle (First Life)
60 </combo_item> 59 </combo_item>
61 <combo_item name="Disclosure__Remotely_monitoring chat"> 60 <combo_item name="Disclosure__Remotely_monitoring chat">
62 Divulgation &gt; Écoute d&apos;un chat à distance 61 Divulgation &gt; Écoute d&apos;un chat à distance
@@ -80,7 +79,7 @@
80 Trouble de la paix &gt; Spam à caractère commercial 79 Trouble de la paix &gt; Spam à caractère commercial
81 </combo_item> 80 </combo_item>
82 <combo_item name="Fraud__L$"> 81 <combo_item name="Fraud__L$">
83 Fraude &gt; $L 82 Fraude &gt; L$
84 </combo_item> 83 </combo_item>
85 <combo_item name="Fraud__Land"> 84 <combo_item name="Fraud__Land">
86 Fraude &gt; Terrain 85 Fraude &gt; Terrain
@@ -89,7 +88,7 @@
89 Fraude &gt; Vente pyramidale ou lettre-chaîne 88 Fraude &gt; Vente pyramidale ou lettre-chaîne
90 </combo_item> 89 </combo_item>
91 <combo_item name="Fraud__US$"> 90 <combo_item name="Fraud__US$">
92 Fraude &gt; $US 91 Fraude &gt; US$
93 </combo_item> 92 </combo_item>
94 <combo_item name="Harassment__Advert_farms___visual_spam"> 93 <combo_item name="Harassment__Advert_farms___visual_spam">
95 Harcèlement &gt; Spam visuel 94 Harcèlement &gt; Spam visuel
@@ -119,10 +118,10 @@
119 Indécence &gt; Nom d&apos;avatar inapproprié 118 Indécence &gt; Nom d&apos;avatar inapproprié
120 </combo_item> 119 </combo_item>
121 <combo_item name="Indecency__Mature_content_in_PG_region"> 120 <combo_item name="Indecency__Mature_content_in_PG_region">
122 Indécence &gt; Contenu Adulte dans une région où l&apos;accompagnement parental est requis 121 Indécence &gt; Contenu Adultes dans une région Tout public
123 </combo_item> 122 </combo_item>
124 <combo_item name="Intolerance"> 123 <combo_item name="Intolerance">
125 Intolerance 124 Intolérance
126 </combo_item> 125 </combo_item>
127 <combo_item name="Land__Abuse_of_sandbox_resources"> 126 <combo_item name="Land__Abuse_of_sandbox_resources">
128 Terrain &gt; Utilisation abusive des ressources du bac à sable 127 Terrain &gt; Utilisation abusive des ressources du bac à sable
@@ -146,8 +145,7 @@
146 Autre 145 Autre
147 </combo_item> 146 </combo_item>
148 </combo_box> 147 </combo_box>
149 <button label="" label_selected="" name="pick_btn" 148 <button label="" label_selected="" name="pick_btn" tool_tip="Le sélecteur d&apos;objet vous permet d&apos;identifier un objet comme sujet du rapport."/>
150 tool_tip="Le sélecteur d&apos;objet vous permet d&apos;identifier un objet comme sujet du rapport." />
151 <text name="select_object_label"> 149 <text name="select_object_label">
152 Cliquez sur le bouton puis l&apos;objet : 150 Cliquez sur le bouton puis l&apos;objet :
153 </text> 151 </text>
@@ -160,12 +158,10 @@
160 <text name="abuser_name_title"> 158 <text name="abuser_name_title">
161 Nom du contrevenant : 159 Nom du contrevenant :
162 </text> 160 </text>
163 <button label="Choisir le résident" label_selected="" name="select_abuser" 161 <button label="Choisir le résident" label_selected="" name="select_abuser" tool_tip="Sélectionnez le nom du résident dans une liste"/>
164 tool_tip="Sélectionnez le nom du résident dans une liste" /> 162 <check_box label="Ne connaît pas le nom du contrevenant" name="omit_abuser_name" tool_tip="Cochez cette case si vous ne connaissez pas le nom du contrevenant"/>
165 <check_box label="Ne connaît pas le nom du contrevenant" name="omit_abuser_name"
166 tool_tip="Cochez cette case si vous ne connaissez pas le nom du contrevenant" />
167 <text name="abuser_name_title2"> 163 <text name="abuser_name_title2">
168 Lieu où l&apos;infraction a eu lieu : 164 Indiquez où l&apos;infraction a eu lieu :
169 </text> 165 </text>
170 <text name="sum_title"> 166 <text name="sum_title">
171 Récapitulatif : 167 Récapitulatif :
@@ -176,13 +172,12 @@
176 <text name="bug_aviso"> 172 <text name="bug_aviso">
177 Indiquez la date, le lieu, la nature de l&apos;infraction, ainsi que 173 Indiquez la date, le lieu, la nature de l&apos;infraction, ainsi que
178tout chat ou IM relatif à l&apos;infraction, en étant aussi précis 174tout chat ou IM relatif à l&apos;infraction, en étant aussi précis
179que possible. Essayez aussi d&apos;indiquer un sujet. 175que possible. Pensez à indiquer un objet.
180 </text> 176 </text>
181 <text bottom_delta="-16" name="incomplete_title"> 177 <text bottom_delta="-16" name="incomplete_title">
182 Remarque : les rapports incomplets ne feront pas l&apos;objet d&apos;une 178 Remarque : les rapports incomplets ne feront pas l&apos;objet d&apos;une
183enquête. 179enquête.
184 </text> 180 </text>
185 <button label="Signaler une infraction" label_selected="Signaler une infraction" 181 <button label="Signaler une infraction" label_selected="Signaler une infraction" name="send_btn"/>
186 name="send_btn" /> 182 <button label="Annuler" label_selected="Annuler" name="cancel_btn"/>
187 <button label="Annuler" label_selected="Annuler" name="cancel_btn" />
188</floater> 183</floater>
diff --git a/linden/indra/newview/skins/default/xui/fr/floater_report_bug.xml b/linden/indra/newview/skins/default/xui/fr/floater_report_bug.xml
index 0ab0981..eba1faa 100644
--- a/linden/indra/newview/skins/default/xui/fr/floater_report_bug.xml
+++ b/linden/indra/newview/skins/default/xui/fr/floater_report_bug.xml
@@ -1,4 +1,4 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 1<?xml version="1.0" encoding="utf-8" standalone="yes"?>
2<floater name="bug_reporter" title="Signaler un bug"> 2<floater name="bug_reporter" title="Signaler un bug">
3 <text name="reporter_title"> 3 <text name="reporter_title">
4 Signalant : 4 Signalant :
@@ -12,8 +12,7 @@
12 <text name="select_object_label"> 12 <text name="select_object_label">
13 Cliquez sur le bouton puis l&apos;objet : 13 Cliquez sur le bouton puis l&apos;objet :
14 </text> 14 </text>
15 <button label="" label_selected="" name="pick_btn" 15 <button label="" label_selected="" name="pick_btn" tool_tip="Le sélecteur d&apos;objet vous permet d&apos;identifier un objet comme sujet du rapport."/>
16 tool_tip="Le sélecteur d&apos;objet vous permet d&apos;identifier un objet comme sujet du rapport." />
17 <text name="object_name_label"> 16 <text name="object_name_label">
18 Nom : 17 Nom :
19 </text> 18 </text>
@@ -23,16 +22,15 @@
23 <text name="owner_name_label"> 22 <text name="owner_name_label">
24 Propriétaire : 23 Propriétaire :
25 </text> 24 </text>
26 <check_box label="Inclure une capture d&apos;écran" name="screen_check" /> 25 <check_box label="Inclure une capture d&apos;écran" name="screen_check"/>
27 <texture_picker label="Instantané en cours..." name="screenshot" /> 26 <texture_picker label="Instantané en cours..." name="screenshot"/>
28 <text name="category_label"> 27 <text name="category_label">
29 Catégorie : 28 Catégorie :
30 </text> 29 </text>
31 <text name="owner_name"> 30 <text name="owner_name">
32 Hendrerit Vulputate 31 Hendrerit Vulputate
33 </text> 32 </text>
34 <combo_box name="category_combo" 33 <combo_box name="category_combo" tool_tip="Choisissez la catégorie qui décrit le mieux ce rapport">
35 tool_tip="Choisissez la catégorie qui décrit le mieux ce rapport">
36 <combo_item name="Selectcategory"> 34 <combo_item name="Selectcategory">
37 Sélectionnez une catégorie 35 Sélectionnez une catégorie
38 </combo_item> 36 </combo_item>
@@ -64,7 +62,7 @@
64 Contenu manquant 62 Contenu manquant
65 </combo_item> 63 </combo_item>
66 <combo_item name="LindenDollars(L$)"> 64 <combo_item name="LindenDollars(L$)">
67 Dollar Linden ($L) 65 Dollar Linden (L$)
68 </combo_item> 66 </combo_item>
69 <combo_item name="Permissions"> 67 <combo_item name="Permissions">
70 Autorisations 68 Autorisations
@@ -92,7 +90,7 @@
92 Récapitulatif : 90 Récapitulatif :
93 </text> 91 </text>
94 <text name="dscr_title"> 92 <text name="dscr_title">
95 Détails : (Soyez aussi précis que possible) 93 Détails (soyez aussi précis que possible) :
96 </text> 94 </text>
97 <text_editor name="details_edit"> 95 <text_editor name="details_edit">
98 Étapes pour reproduire le bug : 96 Étapes pour reproduire le bug :
@@ -105,6 +103,6 @@ Résultats attendus :
105 Remarque : les rapports incomplets ne feront pas l&apos;objet d&apos;une enquête. 103 Remarque : les rapports incomplets ne feront pas l&apos;objet d&apos;une enquête.
106Si ce bug vous permet de faire quelque chose que vous ne devriez pas pouvoir faire, surtout s&apos;il a des conséquences sur la sécurité et la performance, veuillez sélectionner la catégorie Exploit. Merci ! 104Si ce bug vous permet de faire quelque chose que vous ne devriez pas pouvoir faire, surtout s&apos;il a des conséquences sur la sécurité et la performance, veuillez sélectionner la catégorie Exploit. Merci !
107 </text> 105 </text>
108 <button label="Signaler un bug" label_selected="Signaler un bug" name="send_btn" /> 106 <button label="Signaler un bug" label_selected="Signaler un bug" name="send_btn"/>
109 <button label="Annuler" label_selected="Annuler" name="cancel_btn" /> 107 <button label="Annuler" label_selected="Annuler" name="cancel_btn"/>
110</floater> 108</floater>
diff --git a/linden/indra/newview/skins/default/xui/fr/floater_sell_land.xml b/linden/indra/newview/skins/default/xui/fr/floater_sell_land.xml
index e3256c8..7b90982 100644
--- a/linden/indra/newview/skins/default/xui/fr/floater_sell_land.xml
+++ b/linden/indra/newview/skins/default/xui/fr/floater_sell_land.xml
@@ -1,4 +1,4 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 1<?xml version="1.0" encoding="utf-8" standalone="yes"?>
2<floater name="sell land" title="Vendre terrain"> 2<floater name="sell land" title="Vendre terrain">
3 <text name="info_parcel_label"> 3 <text name="info_parcel_label">
4 Parcelle : 4 Parcelle :
@@ -22,10 +22,10 @@
22 Fixez un prix convenable pour ce terrain. 22 Fixez un prix convenable pour ce terrain.
23 </text> 23 </text>
24 <text name="price_ld"> 24 <text name="price_ld">
25 $L 25 L$
26 </text> 26 </text>
27 <text name="price_per_m"> 27 <text name="price_per_m">
28 ([PER_METER] $L par mètre carré) 28 ([PER_METER] L$ par mètre carré)
29 </text> 29 </text>
30 <text name="sell_to_label"> 30 <text name="sell_to_label">
31 Vos acheteurs : 31 Vos acheteurs :
@@ -44,7 +44,7 @@
44 Acheteur spécifique : 44 Acheteur spécifique :
45 </combo_item> 45 </combo_item>
46 </combo_box> 46 </combo_box>
47 <button label="Sélectionner..." name="sell_to_select_agent" /> 47 <button label="Sélectionner..." name="sell_to_select_agent"/>
48 <text name="sell_objects_label"> 48 <text name="sell_objects_label">
49 Vendez-vous des objets avec ce terrain ? 49 Vendez-vous des objets avec ce terrain ?
50 </text> 50 </text>
@@ -59,10 +59,10 @@
59 Oui, vendre les objets avec le terrain 59 Oui, vendre les objets avec le terrain
60 </radio_item> 60 </radio_item>
61 </radio_group> 61 </radio_group>
62 <button label="Afficher les objets" name="show_objects" /> 62 <button label="Afficher les objets" name="show_objects"/>
63 <text name="nag_message_label"> 63 <text name="nag_message_label">
64 Rappel : toute vente est définitive. 64 Rappel : toute vente est définitive.
65 </text> 65 </text>
66 <button label="Mettre le terrain en vente" name="sell_btn" /> 66 <button label="Mettre le terrain en vente" name="sell_btn"/>
67 <button label="Annuler" name="cancel_btn" /> 67 <button label="Annuler" name="cancel_btn"/>
68</floater> 68</floater>
diff --git a/linden/indra/newview/skins/default/xui/fr/floater_skin_preview_template.xml b/linden/indra/newview/skins/default/xui/fr/floater_skin_preview_template.xml
index 23206bb..8bd1ec3 100644
--- a/linden/indra/newview/skins/default/xui/fr/floater_skin_preview_template.xml
+++ b/linden/indra/newview/skins/default/xui/fr/floater_skin_preview_template.xml
@@ -1,19 +1,16 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 1<?xml version="1.0" encoding="utf-8" standalone="yes"?>
2<multi_floater name="floater_chatterbox"> 2<multi_floater name="floater_chatterbox">
3 <icon label="Voler" label_selected="Atterrir" name="" 3 <icon label="Voler" label_selected="Atterrir" name="" tool_tip="Commencez à voler. Utilisez E/C ou PgHaut/PageBas pour voler vers le haut et vers le bas."/>
4 tool_tip="Commencez à voler. Utilisez E/C ou PgHaut/PageBas pour voler vers le haut et vers le bas." />
5 <panel name="panel_littletoolbar"> 4 <panel name="panel_littletoolbar">
6 <button name="chat_btn" tool_tip="Afficher la barre de chat. (Entrée)" /> 5 <button name="chat_btn" tool_tip="Affichez la barre de chat. (Entrée)"/>
7 <flyout_button label="Communiquer" name="communicate_btn" 6 <flyout_button label="Communiquer" name="communicate_btn" tool_tip="Communiquez avec vos amis et vos groupes."/>
8 tool_tip="Communiquer avec vos amis et vos groupes." /> 7 <button label="Voler" label_selected="Atterrir" name="fly_btn" tool_tip="Commencez à voler. Utilisez E/C ou PgHaut/PageBas pour voler vers le haut et vers le bas."/>
9 <button label="Voler" label_selected="Atterrir" name="fly_btn"
10 tool_tip="Commencez à voler. Utilisez E/C ou PgHaut/PageBas pour voler vers le haut et vers le bas." />
11 </panel> 8 </panel>
12 <panel name="panel_unfocused_floater"> 9 <panel name="panel_unfocused_floater">
13 <text name="titlebar_focused"> 10 <text name="titlebar_focused">
14 Pas de mise au point 11 Pas de mise au point
15 </text> 12 </text>
16 <combo_box label="Zone combinée" name="combo_box_1" /> 13 <combo_box label="Zone combinée" name="combo_box_1"/>
17 <text_editor name="Chat History Editor"> 14 <text_editor name="Chat History Editor">
18 Texte 15 Texte
19 </text_editor> 16 </text_editor>
@@ -24,14 +21,14 @@
24 </text> 21 </text>
25 <tab_container name="chatterbox_tabs"> 22 <tab_container name="chatterbox_tabs">
26 <panel label="Mise au point" name="test_1"> 23 <panel label="Mise au point" name="test_1">
27 <slider label="Curseur" name="SliderTestName" /> 24 <slider label="Curseur" name="SliderTestName"/>
28 <check_box label="Vrai" name="check_box_test_1" /> 25 <check_box label="Vrai" name="check_box_test_1"/>
29 <check_box label="Faux" name="check_box_test_2" /> 26 <check_box label="Faux" name="check_box_test_2"/>
30 <text_editor name="Chat History Editor"> 27 <text_editor name="Chat History Editor">
31 Texte du chat 28 Texte du chat
32 </text_editor> 29 </text_editor>
33 </panel> 30 </panel>
34 <panel label="Pas de mise au point" name="test_2" /> 31 <panel label="Pas de mise au point" name="test_2"/>
35 </tab_container> 32 </tab_container>
36 </panel> 33 </panel>
37</multi_floater> 34</multi_floater>
diff --git a/linden/indra/newview/skins/default/xui/fr/floater_snapshot.xml b/linden/indra/newview/skins/default/xui/fr/floater_snapshot.xml
index 8fee6dc..aa2cfdd 100644
--- a/linden/indra/newview/skins/default/xui/fr/floater_snapshot.xml
+++ b/linden/indra/newview/skins/default/xui/fr/floater_snapshot.xml
@@ -1,4 +1,4 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 1<?xml version="1.0" encoding="utf-8" standalone="yes"?>
2<floater height="536" name="Snapshot" title="Prévisualiser la photo" width="245"> 2<floater height="536" name="Snapshot" title="Prévisualiser la photo" width="245">
3 <text name="type_label"> 3 <text name="type_label">
4 Destination de la photo 4 Destination de la photo
@@ -8,14 +8,14 @@
8 Envoyer par e-mail 8 Envoyer par e-mail
9 </radio_item> 9 </radio_item>
10 <radio_item name="texture"> 10 <radio_item name="texture">
11 Enregistrer dans votre inventaire (10 $L) 11 Enregistrer dans votre inventaire (10 L$)
12 </radio_item> 12 </radio_item>
13 <radio_item name="local"> 13 <radio_item name="local">
14 Enregistrer sur votre disque dur 14 Enregistrer sur votre disque dur
15 </radio_item> 15 </radio_item>
16 </radio_group> 16 </radio_group>
17 <button label="Plus &gt;&gt;" name="more_btn" tool_tip="Options avancées" /> 17 <button label="Plus &gt;&gt;" name="more_btn" tool_tip="Options avancées"/>
18 <button label="&lt;&lt; Moins" name="less_btn" tool_tip="Options avancées" /> 18 <button label="&lt;&lt; Moins" name="less_btn" tool_tip="Options avancées"/>
19 <text name="type_label2"> 19 <text name="type_label2">
20 Taille 20 Taille
21 </text> 21 </text>
@@ -93,9 +93,9 @@
93 BMP 93 BMP
94 </combo_item> 94 </combo_item>
95 </combo_box> 95 </combo_box>
96 <spinner label="Largeur" label_width="41" name="snapshot_width" width="101" /> 96 <spinner label="Largeur" label_width="41" name="snapshot_width" width="101"/>
97 <spinner label="Hauteur" label_width="41" left="121" name="snapshot_height" width="101" /> 97 <spinner label="Hauteur" label_width="41" left="121" name="snapshot_height" width="101"/>
98 <slider label="Qualité de l&apos;image" name="image_quality_slider" /> 98 <slider label="Qualité de l&apos;image" name="image_quality_slider"/>
99 <text name="layer_type_label"> 99 <text name="layer_type_label">
100 Capturer : 100 Capturer :
101 </text> 101 </text>
@@ -113,20 +113,17 @@
113 <text name="file_size_label"> 113 <text name="file_size_label">
114 Taille du fichier : [SIZE] Ko 114 Taille du fichier : [SIZE] Ko
115 </text> 115 </text>
116 <check_box bottom_delta="-20" label="Voir l&apos;interface sur la photo" name="ui_check" /> 116 <check_box bottom_delta="-20" label="Voir l&apos;interface sur la photo" name="ui_check"/>
117 <check_box bottom_delta="-18" label="Voir les éléments HUD sur la photo" 117 <check_box bottom_delta="-18" label="Voir les éléments HUD sur la photo" name="hud_check"/>
118 name="hud_check" /> 118 <check_box bottom_delta="-18" label="Garder ouvert après enregistrement" name="keep_open_check"/>
119 <check_box bottom_delta="-18" label="Garder ouvert après enregistrement" 119 <check_box label="Imposer les proportions" name="keep_aspect_check"/>
120 name="keep_open_check" /> 120 <check_box bottom_delta="-18" label="Prévisualisation plein écran
121 <check_box label="Imposer les proportions" name="keep_aspect_check" /> 121(geler l&apos;écran)" name="freeze_frame_check"/>
122 <check_box bottom_delta="-18" label="Geler le cadre (prévisualisation &#10;plein écran)" 122 <button bottom_delta="-18" label="Rafraîchir" name="new_snapshot_btn"/>
123 name="freeze_frame_check" /> 123 <check_box bottom_delta="-30" label="Rafraîchissement automatique" name="auto_snapshot_check"/>
124 <button bottom_delta="-18" label="Rafraîchir" name="new_snapshot_btn" /> 124 <button label="Enregistrer (10 L$)" name="upload_btn"/>
125 <check_box bottom_delta="-30" label="Auto-rafraîchir" name="auto_snapshot_check" /> 125 <button label="Envoyer" name="send_btn"/>
126 <button label="Enregistrer (10 $L)" name="upload_btn" /> 126 <flyout_button label="Enregistrer" name="save_btn" tool_tip="Enregistrer l&apos;image dans un fichier">
127 <button label="Envoyer" name="send_btn" />
128 <flyout_button label="Enregistrer" name="save_btn"
129 tool_tip="Enregistrer l&apos;image dans un fichier">
130 <flyout_button_item name="save_item"> 127 <flyout_button_item name="save_item">
131 Enregistrer 128 Enregistrer
132 </flyout_button_item> 129 </flyout_button_item>
@@ -134,7 +131,7 @@
134 Enregistrer sous... 131 Enregistrer sous...
135 </flyout_button_item> 132 </flyout_button_item>
136 </flyout_button> 133 </flyout_button>
137 <button label="Annuler" name="discard_btn" /> 134 <button label="Annuler" name="discard_btn"/>
138 <string name="unknown"> 135 <string name="unknown">
139 inconnu 136 inconnu
140 </string> 137 </string>
diff --git a/linden/indra/newview/skins/default/xui/fr/floater_sound_preview.xml b/linden/indra/newview/skins/default/xui/fr/floater_sound_preview.xml
index 9c9c630..22bf929 100644
--- a/linden/indra/newview/skins/default/xui/fr/floater_sound_preview.xml
+++ b/linden/indra/newview/skins/default/xui/fr/floater_sound_preview.xml
@@ -1,4 +1,4 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 1<?xml version="1.0" encoding="utf-8" standalone="yes"?>
2<floater name="Name/Description" title="sound.wav"> 2<floater name="Name/Description" title="sound.wav">
3 <text name="name_label"> 3 <text name="name_label">
4 Nom : 4 Nom :
@@ -6,8 +6,8 @@
6 <text name="description_label"> 6 <text name="description_label">
7 Description : 7 Description :
8 </text> 8 </text>
9 <button label="Annuler" label_selected="Annuler" name="cancel_btn" /> 9 <button label="Annuler" label_selected="Annuler" name="cancel_btn"/>
10 <button label="Charger (10 $L)" label_selected="Charger (10 $L)" name="ok_btn" /> 10 <button label="Charger (10 L$)" label_selected="Charger (10 L$)" name="ok_btn"/>
11 <text name="text"> 11 <text name="text">
12 Débit (kbps) : 12 Débit (kbps) :
13 </text> 13 </text>
diff --git a/linden/indra/newview/skins/default/xui/fr/floater_texture_ctrl.xml b/linden/indra/newview/skins/default/xui/fr/floater_texture_ctrl.xml
index 115d006..07b18e4 100644
--- a/linden/indra/newview/skins/default/xui/fr/floater_texture_ctrl.xml
+++ b/linden/indra/newview/skins/default/xui/fr/floater_texture_ctrl.xml
@@ -1,23 +1,23 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 1<?xml version="1.0" encoding="utf-8" standalone="yes"?>
2<floater name="texture picker" title="Choisir : Texture"> 2<floater name="texture picker" title="Texture">
3 <string name="choose_picture"> 3 <string name="choose_picture">
4 Cliquez pour sélectionner une image 4 Cliquez pour sélectionner une image
5 </string> 5 </string>
6 <text type="string" length="1" name="Multiple"> 6 <text length="1" name="Multiple" type="string">
7 Multiple 7 Multiple
8 </text> 8 </text>
9 <text type="string" length="1" name="unknown"> 9 <text length="1" name="unknown" type="string">
10 Dimensions : [DIMENSIONS] 10 Dimensions : [DIMENSIONS]
11 </text> 11 </text>
12 <button label="Défaut" label_selected="Défaut" name="Default" /> 12 <button label="Défaut" label_selected="Défaut" name="Default"/>
13 <button label="Aucune" label_selected="Aucune" name="None" /> 13 <button label="Aucune" label_selected="Aucune" name="None"/>
14 <button label="Vierge" label_selected="Vierge" name="Blank" /> 14 <button label="Vierge" label_selected="Vierge" name="Blank"/>
15 <check_box label="Afficher les dossiers" name="show_folders_check" /> 15 <check_box label="Afficher les dossiers" name="show_folders_check"/>
16 <search_editor label="Saisissez votre recherche ici" name="inventory search editor" /> 16 <search_editor label="Saisissez votre recherche ici" name="inventory search editor"/>
17 <check_box label="Appliquer immédiatement" name="apply_immediate_check" /> 17 <check_box label="Appliquer immédiatement" name="apply_immediate_check"/>
18 <button label="" label_selected="" name="Pipette" /> 18 <button label="" label_selected="" name="Pipette"/>
19 <button label="Annuler" label_selected="Annuler" name="Cancel" /> 19 <button label="Annuler" label_selected="Annuler" name="Cancel"/>
20 <button label="Sélectionner" label_selected="Sélectionner" name="Select" /> 20 <button label="Sélectionner" label_selected="Sélectionner" name="Select"/>
21 <string name="pick title"> 21 <string name="pick title">
22 Choisir : 22 Choisir :
23 </string> 23 </string>
diff --git a/linden/indra/newview/skins/default/xui/fr/floater_tools.xml b/linden/indra/newview/skins/default/xui/fr/floater_tools.xml
index 35d9d8a..33ddbfa 100644
--- a/linden/indra/newview/skins/default/xui/fr/floater_tools.xml
+++ b/linden/indra/newview/skins/default/xui/fr/floater_tools.xml
@@ -1,42 +1,42 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 1<?xml version="1.0" encoding="utf-8" standalone="yes"?>
2<floater name="toolbox floater" title=""> 2<floater name="toolbox floater" title="">
3 <button label="" label_selected="" name="button focus" tool_tip="Mise au point" /> 3 <button label="" label_selected="" name="button focus" tool_tip="Mise au point"/>
4 <text name="tool label"> 4 <text name="tool label">
5 Faire le point 5 Mise au point
6 </text> 6 </text>
7 <button label="" label_selected="" name="button move" tool_tip="Déplacer" /> 7 <button label="" label_selected="" name="button move" tool_tip="Déplacer"/>
8 <text name="tool label2"> 8 <text name="tool label2">
9 Se déplacer 9 Se déplacer
10 </text> 10 </text>
11 <button label="" label_selected="" name="button edit" tool_tip="Modifier" /> 11 <button label="" label_selected="" name="button edit" tool_tip="Modifier"/>
12 <text name="tool label3"> 12 <text name="tool label3">
13 Edition 13 Edition
14 </text> 14 </text>
15 <button label="" label_selected="" name="button create" tool_tip="Créer" /> 15 <button label="" label_selected="" name="button create" tool_tip="Créer"/>
16 <text name="tool label4"> 16 <text name="tool label4">
17 Créer 17 Créer
18 </text> 18 </text>
19 <button label="" label_selected="" name="button land" tool_tip="Terrain" /> 19 <button label="" label_selected="" name="button land" tool_tip="Terrain"/>
20 <text name="tool label5"> 20 <text name="tool label5">
21 Terrain 21 Terrain
22 </text> 22 </text>
23 <check_box label="Zoom" name="radio zoom" /> 23 <check_box label="Zoom" name="radio zoom"/>
24 <check_box label="Orbite (Ctrl)" name="radio orbit" /> 24 <check_box label="Orbite (Ctrl)" name="radio orbit"/>
25 <check_box label="Panoramique (Ctrl-Maj)" name="radio pan" /> 25 <check_box label="Panoramique (Ctrl-Maj)" name="radio pan"/>
26 <check_box label="Déplacer" name="radio move" /> 26 <check_box label="Déplacer" name="radio move"/>
27 <check_box label="Orbite (Ctrl)" name="radio lift" /> 27 <check_box label="Orbite (Ctrl)" name="radio lift"/>
28 <check_box label="Faire tourner (Ctrl-Maj)" name="radio spin" /> 28 <check_box label="Faire tourner (Ctrl-Maj)" name="radio spin"/>
29 <check_box label="Position" name="radio position" /> 29 <check_box label="Positionner" name="radio position"/>
30 <check_box label="Faire pivoter (Ctrl)" name="radio rotate" /> 30 <check_box label="Pivoter (Ctrl)" name="radio rotate"/>
31 <check_box label="Étirer (Ctrl-Maj)" name="radio stretch" /> 31 <check_box label="Étirer (Ctrl-Maj)" name="radio stretch"/>
32 <check_box label="Sélectionner une texture" name="radio select face" /> 32 <check_box label="Sélectionner une face" name="radio select face"/>
33 <check_box label="Modifier les parties liées" name="checkbox edit linked parts" /> 33 <check_box label="Modifier les parties liées" name="checkbox edit linked parts"/>
34 <check_box label="Utiliser la grille" name="checkbox snap to grid" /> 34 <check_box label="Utiliser la grille" name="checkbox snap to grid"/>
35 <button label="Options..." label_selected="Options..." name="Options..." /> 35 <button label="Options..." label_selected="Options..." name="Options..."/>
36 <check_box label="Étirer les deux côtés" name="checkbox uniform" /> 36 <check_box label="Étirer les deux côtés" name="checkbox uniform"/>
37 <check_box label="Étirer les textures" name="checkbox stretch textures" /> 37 <check_box label="Étirer les textures" name="checkbox stretch textures"/>
38 <text name="text ruler mode"> 38 <text name="text ruler mode">
39 Règle : 39 Axe :
40 </text> 40 </text>
41 <text name="text status"> 41 <text name="text status">
42 Faîtes glisser pour déplacer, Maj-faire glisser pour copier. 42 Faîtes glisser pour déplacer, Maj-faire glisser pour copier.
@@ -52,32 +52,32 @@
52 Référence 52 Référence
53 </combo_item> 53 </combo_item>
54 </combo_box> 54 </combo_box>
55 <button label="" label_selected="" name="ToolCube" tool_tip="Cube" /> 55 <button label="" label_selected="" name="ToolCube" tool_tip="Cube"/>
56 <button label="" label_selected="" name="ToolPrism" tool_tip="Prisme" /> 56 <button label="" label_selected="" name="ToolPrism" tool_tip="Prisme"/>
57 <button label="" label_selected="" name="ToolPyramid" tool_tip="Pyramide" /> 57 <button label="" label_selected="" name="ToolPyramid" tool_tip="Pyramide"/>
58 <button label="" label_selected="" name="ToolTetrahedron" tool_tip="Tétraèdre" /> 58 <button label="" label_selected="" name="ToolTetrahedron" tool_tip="Tétraèdre"/>
59 <button label="" label_selected="" name="ToolCylinder" tool_tip="Cylindre" /> 59 <button label="" label_selected="" name="ToolCylinder" tool_tip="Cylindre"/>
60 <button label="" label_selected="" name="ToolHemiCylinder" tool_tip="Demi-cylindre" /> 60 <button label="" label_selected="" name="ToolHemiCylinder" tool_tip="Demi-cylindre"/>
61 <button label="" label_selected="" name="ToolCone" tool_tip="Cône" /> 61 <button label="" label_selected="" name="ToolCone" tool_tip="Cône"/>
62 <button label="" label_selected="" name="ToolHemiCone" tool_tip="Demi-cône" /> 62 <button label="" label_selected="" name="ToolHemiCone" tool_tip="Demi-cône"/>
63 <button label="" label_selected="" name="ToolSphere" tool_tip="Sphère" /> 63 <button label="" label_selected="" name="ToolSphere" tool_tip="Sphère"/>
64 <button label="" label_selected="" name="ToolHemiSphere" tool_tip="Demi-sphère" /> 64 <button label="" label_selected="" name="ToolHemiSphere" tool_tip="Demi-sphère"/>
65 <check_box label="Copier la sélection" name="checkbox copy selection" /> 65 <check_box label="Copier la sélection" name="checkbox copy selection"/>
66 <button label="" label_selected="" name="ToolTorus" tool_tip="Tore" /> 66 <button label="" label_selected="" name="ToolTorus" tool_tip="Tore"/>
67 <button label="" label_selected="" name="ToolTube" tool_tip="Tube" /> 67 <button label="" label_selected="" name="ToolTube" tool_tip="Tube"/>
68 <button label="" label_selected="" name="ToolRing" tool_tip="Anneau" /> 68 <button label="" label_selected="" name="ToolRing" tool_tip="Anneau"/>
69 <button label="" label_selected="" name="ToolTree" tool_tip="Arbre" /> 69 <button label="" label_selected="" name="ToolTree" tool_tip="Arbre"/>
70 <button label="" label_selected="" name="ToolGrass" tool_tip="Herbe" /> 70 <button label="" label_selected="" name="ToolGrass" tool_tip="Herbe"/>
71 <check_box label="Maintenir l&apos;outil sélectionné" name="checkbox sticky" /> 71 <check_box label="Maintenir l&apos;outil sélectionné" name="checkbox sticky"/>
72 <check_box label="Centrer la copie" name="checkbox copy centers" /> 72 <check_box label="Centrer la copie" name="checkbox copy centers"/>
73 <check_box label="Faire pivoter la copie" name="checkbox copy rotates" /> 73 <check_box label="Pivoter la copie" name="checkbox copy rotates"/>
74 <check_box label="Sélectionner le terrain" name="radio select land" /> 74 <check_box label="Sélectionner le terrain" name="radio select land"/>
75 <check_box label="Aplatir le terrain" name="radio flatten" /> 75 <check_box label="Aplatir le terrain" name="radio flatten"/>
76 <check_box label="Surélever le terrain" name="radio raise" /> 76 <check_box label="Ãlever le terrain" name="radio raise"/>
77 <check_box label="Abaisser le terrain" name="radio lower" /> 77 <check_box label="Abaisser le terrain" name="radio lower"/>
78 <check_box label="Lisser le terrain" name="radio smooth" /> 78 <check_box label="Lisser le terrain" name="radio smooth"/>
79 <check_box label="Bosseler le terrain" name="radio noise" /> 79 <check_box label="Bosseler le terrain" name="radio noise"/>
80 <check_box label="Rétablir le terrain" name="radio revert" /> 80 <check_box label="Annuler modification" name="radio revert"/>
81 <combo_box name="combobox brush size"> 81 <combo_box name="combobox brush size">
82 <combo_item name="Small"> 82 <combo_item name="Small">
83 Petit 83 Petit
@@ -92,12 +92,10 @@
92 <text name="Strength:"> 92 <text name="Strength:">
93 Force : 93 Force :
94 </text> 94 </text>
95 <button label="Appliquer à la sélection" label_selected="Appliquer à la sélection" 95 <button label="Appliquer à la sélection" label_selected="Appliquer à la sélection" name="button apply to selection" tool_tip="Modifier le terrain sélectionné"/>
96 name="button apply to selection" 96 <check_box label="Afficher les limites" name="checkbox show owners"/>
97 tool_tip="Modifier le terrain sélectionné" /> 97 <button label="Plus &gt;&gt;" name="button more" tool_tip="Options avancées"/>
98 <check_box label="Afficher les propriétaires" name="checkbox show owners" /> 98 <button label="&lt;&lt; Moins" name="button less" tool_tip="Options avancées"/>
99 <button label="Plus &gt;&gt;" name="button more" tool_tip="Options avancées" />
100 <button label="&lt;&lt; Moins" name="button less" tool_tip="Options avancées" />
101 <tab_container name="Object Info Tabs"> 99 <tab_container name="Object Info Tabs">
102 <panel label="Général" name="General"> 100 <panel label="Général" name="General">
103 <text name="Name:"> 101 <text name="Name:">
@@ -112,21 +110,21 @@
112 <text name="Creator Name"> 110 <text name="Creator Name">
113 Thrax Linden 111 Thrax Linden
114 </text> 112 </text>
115 <button label="Profil..." label_selected="Profil..." name="button creator profile" /> 113 <button label="Profil..." label_selected="Profil..." name="button creator profile"/>
116 <text name="Owner:"> 114 <text name="Owner:">
117 Propriétaire : 115 Propriétaire :
118 </text> 116 </text>
119 <text name="Owner Name"> 117 <text name="Owner Name">
120 Thrax Linden 118 Thrax Linden
121 </text> 119 </text>
122 <button label="Profil..." label_selected="Profil..." name="button owner profile" /> 120 <button label="Profil..." label_selected="Profil..." name="button owner profile"/>
123 <text name="Group:"> 121 <text name="Group:">
124 Groupe : 122 Groupe :
125 </text> 123 </text>
126 <text name="Group Name Proxy"> 124 <text name="Group Name Proxy">
127 Les Linden 125 Les Lindens
128 </text> 126 </text>
129 <button label="Définir..." label_selected="Définir..." name="button set group" /> 127 <button label="Définir..." label_selected="Définir..." name="button set group"/>
130 <text name="prim info"> 128 <text name="prim info">
131 1 objet, 1 prim 129 1 objet, 1 prim
132 </text> 130 </text>
@@ -136,34 +134,30 @@
136 <text name="perm_modify"> 134 <text name="perm_modify">
137 Vous pouvez modifier cet objet. 135 Vous pouvez modifier cet objet.
138 </text> 136 </text>
139 <check_box label="Partager avec le groupe" name="checkbox share with group" 137 <check_box label="Partager avec le groupe" name="checkbox share with group" tool_tip="Autoriser les membres du groupe à déplacer, copier et supprimer."/>
140 tool_tip="Autoriser les membres du groupe à déplacer, copier et supprimer." />
141 <text name="text deed continued"> 138 <text name="text deed continued">
142 Transférer... 139 Transférer...
143 </text> 140 </text>
144 <text name="text deed"> 141 <text name="text deed">
145 Transférer 142 Transférer
146 </text> 143 </text>
147 <button label="Transférer..." label_selected="Transférer..." name="button deed" 144 <button label="Céder..." label_selected="Céder..." name="button deed" tool_tip="Les objets partagés par un groupe peuvent être cédés par un officier."/>
148 tool_tip="Les objets partagés par un groupe peuvent être transférés par un officier." /> 145 <check_box label="Autoriser tout le monde à déplacer" name="checkbox allow everyone move"/>
149 <check_box label="Autoriser tout le monde à déplacer" 146 <check_box label="Autoriser tout le monde à copier" name="checkbox allow everyone copy"/>
150 name="checkbox allow everyone move" /> 147 <check_box label="Afficher dans la recherche" name="search_check" tool_tip="Afficher l&apos;objet dans les résultats de recherche"/>
151 <check_box label="Autoriser tout le monde à copier" name="checkbox allow everyone copy" /> 148 <check_box label="À vendre" name="checkbox for sale"/>
152 <check_box label="Afficher dans la recherche" name="search_check"
153 tool_tip="Afficher l&apos;objet dans les résultats de recherche" />
154 <check_box label="À vendre" name="checkbox for sale" />
155 <text name="Price: L$"> 149 <text name="Price: L$">
156 Prix : L$ 150 Prix : L$
157 </text> 151 </text>
158 <text name="Cost"> 152 <text name="Cost">
159 Prix : $L 153 Prix : L$
160 </text> 154 </text>
161 <radio_group name="sale type"> 155 <radio_group name="sale type">
162 <radio_item name="Original"> 156 <radio_item name="Original">
163 Original 157 Original
164 </radio_item> 158 </radio_item>
165 <radio_item name="Copy"> 159 <radio_item name="Copy">
166 Copier 160 Copie
167 </radio_item> 161 </radio_item>
168 <radio_item name="Contents"> 162 <radio_item name="Contents">
169 Contenus 163 Contenus
@@ -172,18 +166,18 @@
172 <text name="Next owner can:"> 166 <text name="Next owner can:">
173 Le prochain propriétaire pourra : 167 Le prochain propriétaire pourra :
174 </text> 168 </text>
175 <check_box label="Modifier" name="checkbox next owner can modify" /> 169 <check_box label="Modifier" name="checkbox next owner can modify"/>
176 <check_box label="Copier" name="checkbox next owner can copy" /> 170 <check_box label="Copier" name="checkbox next owner can copy"/>
177 <check_box label="Revendre/Donner" name="checkbox next owner can transfer" /> 171 <check_box label="Revendre/Donner" name="checkbox next owner can transfer"/>
178 <text name="label click action"> 172 <text name="label click action">
179 Action clic-gauche : 173 Action du clic-gauche :
180 </text> 174 </text>
181 <combo_box name="clickaction"> 175 <combo_box name="clickaction">
182 <combo_item name="Touch/grab(default)"> 176 <combo_item name="Touch/grab(default)">
183 Toucher/attraper (défaut) 177 Toucher/attraper (défaut)
184 </combo_item> 178 </combo_item>
185 <combo_item name="Sitonobject"> 179 <combo_item name="Sitonobject">
186 M&apos;asseoir sur l&apos;objet 180 S&apos;asseoir sur l&apos;objet
187 </combo_item> 181 </combo_item>
188 <combo_item name="Buyobject"> 182 <combo_item name="Buyobject">
189 Acheter l&apos;objet 183 Acheter l&apos;objet
@@ -195,10 +189,10 @@
195 Ouvrir 189 Ouvrir
196 </combo_item> 190 </combo_item>
197 <combo_item name="Play"> 191 <combo_item name="Play">
198 Jouer le média sur la parcelle 192 Jouer le média de la parcelle
199 </combo_item> 193 </combo_item>
200 <combo_item name="Opemmedia"> 194 <combo_item name="Opemmedia">
201 Ouvrir le média sur la parcelle 195 Ouvrir le média de la parcelle
202 </combo_item> 196 </combo_item>
203 </combo_box> 197 </combo_box>
204 <text name="B:"> 198 <text name="B:">
@@ -232,16 +226,16 @@
232 Vous ne pouvez pas modifier ces objets. 226 Vous ne pouvez pas modifier ces objets.
233 </text> 227 </text>
234 <text name="text modify warning"> 228 <text name="text modify warning">
235 Pour définir les permissions, vous devez sélectionner l&apos;objet en entier. 229 Sélectionnez l&apos;objet en entier.
236 </text> 230 </text>
237 <string name="Cost Default"> 231 <string name="Cost Default">
238 Prix : $L 232 Prix : L$
239 </string> 233 </string>
240 <string name="Cost Total"> 234 <string name="Cost Total">
241 Prix total : $L 235 Prix total : L$
242 </string> 236 </string>
243 <string name="Cost Per Unit"> 237 <string name="Cost Per Unit">
244 Prix par : $L 238 Prix par : L$
245 </string> 239 </string>
246 <string name="Cost Mixed"> 240 <string name="Cost Mixed">
247 Prix mixte 241 Prix mixte
@@ -252,37 +246,33 @@
252 </panel> 246 </panel>
253 <panel label="Objet" name="Object"> 247 <panel label="Objet" name="Object">
254 <text name="select_single"> 248 <text name="select_single">
255 Sélectionnez un seul prim pour modifier les paramètres. 249 Sélectionnez un prim pour modifier les paramètres.
256 </text> 250 </text>
257 <text name="edit_object"> 251 <text name="edit_object">
258 Modifier les paramètres de l&apos;objet : 252 Modifier les paramètres de l&apos;objet :
259 </text> 253 </text>
260 <check_box label="Verrouillé" name="checkbox locked" 254 <check_box label="Verrouillé" name="checkbox locked" tool_tip="Empêche l&apos;objet d&apos;être déplacé ou supprimé. Utile pendant la construction pour éviter les modifications involontaires."/>
261 tool_tip="Empêche l&apos;objet d&apos;être déplacé ou supprimé. Utile pendant la construction pour éviter les modifications involontaires." /> 255 <check_box label="Physique" name="Physical Checkbox Ctrl" tool_tip="Permet à l&apos;objet d&apos;être poussé et affecté par la gravité"/>
262 <check_box label="Physique" name="Physical Checkbox Ctrl" 256 <check_box label="Temporaire" name="Temporary Checkbox Ctrl" tool_tip="L&apos;objet est supprimé 1 mn après sa création."/>
263 tool_tip="Permet à l&apos;objet d&apos;être poussé et affecté par la gravité" /> 257 <check_box label="Fantôme" name="Phantom Checkbox Ctrl" tool_tip="Permet à l&apos;objet de ne pas entrer en collision avec d&apos;autres objets ou avatars."/>
264 <check_box label="Temporaire" name="Temporary Checkbox Ctrl"
265 tool_tip="L&apos;objet est supprimé 1 mn après sa création." />
266 <check_box label="Fantôme" name="Phantom Checkbox Ctrl"
267 tool_tip="Permet à l&apos;objet de ne pas entrer en collision avec d&apos;autres objets ou avatars." />
268 <text name="label position"> 258 <text name="label position">
269 Position (mètres) 259 Position (mètres)
270 </text> 260 </text>
271 <spinner label="X" name="Pos X" /> 261 <spinner label="X" name="Pos X"/>
272 <spinner label="Y" name="Pos Y" /> 262 <spinner label="Y" name="Pos Y"/>
273 <spinner label="Z" name="Pos Z" /> 263 <spinner label="Z" name="Pos Z"/>
274 <text name="label size"> 264 <text name="label size">
275 Taille (mètres) 265 Taille (mètres)
276 </text> 266 </text>
277 <spinner label="X" name="Scale X" /> 267 <spinner label="X" name="Scale X"/>
278 <spinner label="Y" name="Scale Y" /> 268 <spinner label="Y" name="Scale Y"/>
279 <spinner label="Z" name="Scale Z" /> 269 <spinner label="Z" name="Scale Z"/>
280 <text name="label rotation"> 270 <text name="label rotation">
281 Rotation (degrés) 271 Rotation (degrés)
282 </text> 272 </text>
283 <spinner label="X" name="Rot X" /> 273 <spinner label="X" name="Rot X"/>
284 <spinner label="Y" name="Rot Y" /> 274 <spinner label="Y" name="Rot Y"/>
285 <spinner label="Z" name="Rot Z" /> 275 <spinner label="Z" name="Rot Z"/>
286 <text name="label material"> 276 <text name="label material">
287 Matériau 277 Matériau
288 </text> 278 </text>
@@ -335,19 +325,19 @@
335 Anneau 325 Anneau
336 </combo_item> 326 </combo_item>
337 <combo_item name="Sculpted"> 327 <combo_item name="Sculpted">
338 Sculpté 328 Sculptie
339 </combo_item> 329 </combo_item>
340 </combo_box> 330 </combo_box>
341 <text name="text cut"> 331 <text name="text cut">
342 Début et fin de la découpe du tracé 332 Début et fin de découpe du tracé
343 </text> 333 </text>
344 <spinner label="D" name="cut begin" /> 334 <spinner label="D" name="cut begin"/>
345 <spinner label="F" name="cut end" /> 335 <spinner label="F" name="cut end"/>
346 <text name="text hollow"> 336 <text name="text hollow">
347 Creux 337 Creux
348 </text> 338 </text>
349 <text name="text skew"> 339 <text name="text skew">
350 Biaiser 340 Biais
351 </text> 341 </text>
352 <text name="Hollow Shape"> 342 <text name="Hollow Shape">
353 Forme du creux 343 Forme du creux
@@ -367,50 +357,47 @@
367 </combo_item> 357 </combo_item>
368 </combo_box> 358 </combo_box>
369 <text name="text twist"> 359 <text name="text twist">
370 Début et fin de la vrille 360 Début et fin de vrille
371 </text> 361 </text>
372 <spinner label="D" name="Twist Begin" /> 362 <spinner label="D" name="Twist Begin"/>
373 <spinner label="F" name="Twist End" /> 363 <spinner label="F" name="Twist End"/>
374 <text name="scale_taper"> 364 <text name="scale_taper">
375 Biseauter 365 Biseautage
376 </text> 366 </text>
377 <text name="scale_hole"> 367 <text name="scale_hole">
378 Taille du trou 368 Taille du trou
379 </text> 369 </text>
380 <spinner label="X" name="Taper Scale X" /> 370 <spinner label="X" name="Taper Scale X"/>
381 <spinner label="Y" name="Taper Scale Y" /> 371 <spinner label="Y" name="Taper Scale Y"/>
382 <text name="text topshear"> 372 <text name="text topshear">
383 Inclinaison 373 Inclinaison
384 </text> 374 </text>
385 <spinner label="X" name="Shear X" /> 375 <spinner label="X" name="Shear X"/>
386 <spinner label="Y" name="Shear Y" /> 376 <spinner label="Y" name="Shear Y"/>
387 <text name="advanced_cut"> 377 <text name="advanced_cut">
388 Début et fin de la découpe du profilé 378 Début et fin de découpe du profilé
389 </text> 379 </text>
390 <text name="advanced_dimple"> 380 <text name="advanced_dimple">
391 Début et fin du creux 381 Début et fin du creux
392 </text> 382 </text>
393 <spinner label="D" name="Path Limit Begin" /> 383 <spinner label="D" name="Path Limit Begin"/>
394 <spinner label="F" name="Path Limit End" /> 384 <spinner label="F" name="Path Limit End"/>
395 <text name="text taper2"> 385 <text name="text taper2">
396 Biseauter 386 Biseautage
397 </text> 387 </text>
398 <spinner label="X" name="Taper X" /> 388 <spinner label="X" name="Taper X"/>
399 <spinner label="Y" name="Taper Y" /> 389 <spinner label="Y" name="Taper Y"/>
400 <text name="text radius delta"> 390 <text name="text radius delta">
401 Rayon 391 Rayon
402 </text> 392 </text>
403 <text name="text revolutions"> 393 <text name="text revolutions">
404 Révolutions 394 Révolutions
405 </text> 395 </text>
406 <texture_picker label="Sculpter la texture" name="sculpt texture control" 396 <texture_picker label="Texture du sculptie" name="sculpt texture control" tool_tip="Cliquez pour sélectionner une image"/>
407 tool_tip="Cliquez pour sélectionner une image" /> 397 <check_box label="Mirroir" name="sculpt mirror control" tool_tip="Retourne le sculptie le long de l&apos;axe des X."/>
408 <check_box label="Mirroir" name="sculpt mirror control" 398 <check_box label="A l&apos;envers" name="sculpt invert control" tool_tip="Inverse les valeurs normales d&apos;un sculptie et le fait apparaître à l&apos;envers."/>
409 tool_tip="Retourne le prim sculpté le long de l&apos;axe des X." />
410 <check_box label="A l&apos;envers" name="sculpt invert control"
411 tool_tip="Inverse les valeurs normales d&apos;un prim sculpté et le fait apparaître à l&apos;envers." />
412 <text name="label sculpt type"> 399 <text name="label sculpt type">
413 Type de couture 400 Type de raccord
414 </text> 401 </text>
415 <combo_box name="sculpt type control"> 402 <combo_box name="sculpt type control">
416 <combo_item name="None"> 403 <combo_item name="None">
@@ -432,44 +419,39 @@
432 </panel> 419 </panel>
433 <panel label="Attributs" name="Features"> 420 <panel label="Attributs" name="Features">
434 <text name="select_single"> 421 <text name="select_single">
435 Sélectionnez un seul prim pour modifier les attributs. 422 Sélectionnez un prim pour modifier les attributs.
436 </text> 423 </text>
437 <text name="edit_object"> 424 <text name="edit_object">
438 Modifier les attributs de l&apos;objet : 425 Modifier les attributs de l&apos;objet :
439 </text> 426 </text>
440 <check_box label="Tracé flexible" name="Flexible1D Checkbox Ctrl" 427 <check_box label="Flexibilité" name="Flexible1D Checkbox Ctrl" tool_tip="Donne à l&apos;objet de la souplesse sur l&apos;axe des Z (côté client uniquement)."/>
441 tool_tip="Donne à l&apos;objet de la souplesse sur l&apos;axe des Z. (côté client uniquement)" /> 428 <spinner label="Souplesse" name="FlexNumSections"/>
442 <spinner label="Souplesse" name="FlexNumSections" /> 429 <spinner label="Gravité" name="FlexGravity"/>
443 <spinner label="Gravité" name="FlexGravity" /> 430 <spinner label="Élasticité" name="FlexFriction"/>
444 <spinner label="Faire glisser" name="FlexFriction" /> 431 <spinner label="Vent" name="FlexWind"/>
445 <spinner label="Vent" name="FlexWind" /> 432 <spinner label="Tension" name="FlexTension"/>
446 <spinner label="Tension" name="FlexTension" /> 433 <spinner label="Force X" name="FlexForceX"/>
447 <spinner label="Force X" name="FlexForceX" /> 434 <spinner label="Force Y" name="FlexForceY"/>
448 <spinner label="Force Y" name="FlexForceY" /> 435 <spinner label="Force Z" name="FlexForceZ"/>
449 <spinner label="Force Z" name="FlexForceZ" /> 436 <check_box label="Lumière" name="Light Checkbox Ctrl" tool_tip="Permet aux objets d&apos;émettre de la lumière"/>
450 <check_box label="Lumière" name="Light Checkbox Ctrl"
451 tool_tip="Permet aux objets d&apos;émettre de la lumière" />
452 <text name="label color"> 437 <text name="label color">
453 Couleur 438 Couleur
454 </text> 439 </text>
455 <color_swatch label="" name="colorswatch" 440 <color_swatch label="" name="colorswatch" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs"/>
456 tool_tip="Cliquer pour ouvrir le sélecteur de couleurs" /> 441 <spinner label="Intensité" name="Light Intensity"/>
457 <spinner label="Intensité" name="Light Intensity" /> 442 <spinner label="Portée" name="Light Radius"/>
458 <spinner label="Rayon" name="Light Radius" /> 443 <spinner label="Atténuation" name="Light Falloff"/>
459 <spinner label="Atténuation" name="Light Falloff" />
460 </panel> 444 </panel>
461 <panel label="Texture" name="Texture"> 445 <panel label="Texture" name="Texture">
462 <texture_picker label="Texture" name="texture control" 446 <texture_picker label="Texture" name="texture control" tool_tip="Cliquez pour sélectionner une image"/>
463 tool_tip="Cliquez pour sélectionner une image" /> 447 <color_swatch label="Couleur" name="colorswatch" tool_tip="Cliquer pour ouvrir le sélecteur de couleurs"/>
464 <color_swatch label="Couleur" name="colorswatch"
465 tool_tip="Cliquer pour ouvrir le sélecteur de couleurs" />
466 <text name="color trans" width="88"> 448 <text name="color trans" width="88">
467 Transparence (%) 449 Transparence
468 </text> 450 </text>
469 <text name="glow label"> 451 <text name="glow label">
470 Rayonnement 452 Rayonnement
471 </text> 453 </text>
472 <check_box label="Luminosité &#10;maximale" name="checkbox fullbright" /> 454 <check_box label="Rendre lumineux" name="checkbox fullbright"/>
473 <text name="tex gen"> 455 <text name="tex gen">
474 Application 456 Application
475 </text> 457 </text>
@@ -478,7 +460,7 @@
478 Défaut 460 Défaut
479 </combo_item> 461 </combo_item>
480 <combo_item name="Planar"> 462 <combo_item name="Planar">
481 Planaire 463 Planar
482 </combo_item> 464 </combo_item>
483 </combo_box> 465 </combo_box>
484 <text name="label shininess"> 466 <text name="label shininess">
@@ -512,58 +494,58 @@
512 Obscurité 494 Obscurité
513 </combo_item> 495 </combo_item>
514 <combo_item name="woodgrain"> 496 <combo_item name="woodgrain">
515 aggloméré 497 Aggloméré
516 </combo_item> 498 </combo_item>
517 <combo_item name="bark"> 499 <combo_item name="bark">
518 écorce 500 Ãcorce
519 </combo_item> 501 </combo_item>
520 <combo_item name="bricks"> 502 <combo_item name="bricks">
521 briques 503 Briques
522 </combo_item> 504 </combo_item>
523 <combo_item name="checker"> 505 <combo_item name="checker">
524 damier 506 Damier
525 </combo_item> 507 </combo_item>
526 <combo_item name="concrete"> 508 <combo_item name="concrete">
527 béton 509 Béton
528 </combo_item> 510 </combo_item>
529 <combo_item name="crustytile"> 511 <combo_item name="crustytile">
530 carrelage 512 Carrelage
531 </combo_item> 513 </combo_item>
532 <combo_item name="cutstone"> 514 <combo_item name="cutstone">
533 pierre de taille 515 Pierre de taille
534 </combo_item> 516 </combo_item>
535 <combo_item name="discs"> 517 <combo_item name="discs">
536 rondelles 518 Disques
537 </combo_item> 519 </combo_item>
538 <combo_item name="gravel"> 520 <combo_item name="gravel">
539 gravier 521 Gravier
540 </combo_item> 522 </combo_item>
541 <combo_item name="petridish"> 523 <combo_item name="petridish">
542 boîte de Petri 524 Boîte de Petri
543 </combo_item> 525 </combo_item>
544 <combo_item name="siding"> 526 <combo_item name="siding">
545 bardage 527 Lattes
546 </combo_item> 528 </combo_item>
547 <combo_item name="stonetile"> 529 <combo_item name="stonetile">
548 carreau 530 Carreaux
549 </combo_item> 531 </combo_item>
550 <combo_item name="stucco"> 532 <combo_item name="stucco">
551 stuc 533 Stuc
552 </combo_item> 534 </combo_item>
553 <combo_item name="suction"> 535 <combo_item name="suction">
554 ventouses 536 Ventouses
555 </combo_item> 537 </combo_item>
556 <combo_item name="weave"> 538 <combo_item name="weave">
557 tissage 539 Tissage
558 </combo_item> 540 </combo_item>
559 </combo_box> 541 </combo_box>
560 <text name="tex scale"> 542 <text name="tex scale">
561 Répétitions par face 543 Répétitions par face
562 </text> 544 </text>
563 <spinner label="Horizontal (U)" name="TexScaleU" /> 545 <spinner label="Horizontal (U)" name="TexScaleU"/>
564 <check_box label="Retourner" name="checkbox flip s" /> 546 <check_box label="Inverser" name="checkbox flip s"/>
565 <spinner label="Vertical (V)" name="TexScaleV" /> 547 <spinner label="Vertical (V)" name="TexScaleV"/>
566 <check_box label="Retourner" name="checkbox flip t" /> 548 <check_box label="Inverser" name="checkbox flip t"/>
567 <text name="tex rotate"> 549 <text name="tex rotate">
568 Rotation (degrés) 550 Rotation (degrés)
569 </text> 551 </text>
@@ -576,38 +558,34 @@
576 <text name="rpt"> 558 <text name="rpt">
577 Répétitions au mètre 559 Répétitions au mètre
578 </text> 560 </text>
579 <button label="Appliquer" label_selected="Appliquer" name="button apply" /> 561 <button label="Appliquer" label_selected="Appliquer" name="button apply"/>
580 <text name="tex offset"> 562 <text name="tex offset">
581 Décaler 563 Décalage
582 </text> 564 </text>
583 <spinner label="Horizontal (U)" name="TexOffsetU" /> 565 <spinner label="Horizontal (U)" name="TexOffsetU"/>
584 <spinner label="Vertical (V)" name="TexOffsetV" /> 566 <spinner label="Vertical (V)" name="TexOffsetV"/>
585 <text name="textbox autofix"> 567 <text name="textbox autofix">
586 Ajuster la texture du média 568 Ajuster la texture du média
587(chargement préalable) 569(chargement préalable)
588 </text> 570 </text>
589 <button label="Ajuster" label_selected="Ajuster" name="button align" /> 571 <button label="Ajuster" label_selected="Ajuster" name="button align"/>
590 </panel> 572 </panel>
591 <panel label="Contenu" name="Contents"> 573 <panel label="Contenu" name="Contents">
592 <button label="Nouveau script..." label_selected="Nouveau script..." 574 <button label="Nouveau script..." label_selected="Nouveau script..." name="button new script"/>
593 name="button new script" />
594 </panel> 575 </panel>
595 </tab_container> 576 </tab_container>
596 <panel name="land info panel"> 577 <panel name="land info panel">
597 <text name="label_area_price"> 578 <text name="label_area_price">
598 Prix : [PRICE] $L pour [AREA] m². 579 Prix : [PRICE] L$ pour [AREA] m².
599 </text> 580 </text>
600 <text name="label_area"> 581 <text name="label_area">
601 Surface : [AREA] m² 582 Surface : [AREA] m²
602 </text> 583 </text>
603 <button label="Acheter le terrain..." label_selected="Acheter le terrain..." 584 <button label="Acheter le terrain..." label_selected="Acheter le terrain..." name="button buy land" width="132"/>
604 name="button buy land" width="132" /> 585 <button label="Abandonner le terrain..." label_selected="Abandonner le terrain..." name="button abandon land" width="132"/>
605 <button label="Céder le terrain..." label_selected="Céder le terrain..." 586 <button label="Diviser..." label_selected="Diviser..." name="button subdivide land" width="132"/>
606 name="button abandon land" width="132" /> 587 <button label="Fusionner..." label_selected="Fusionner..." name="button join land" width="132"/>
607 <button label="Diviser..." label_selected="Diviser..." name="button subdivide land" width="132" /> 588 <button label="À propos du terrain..." label_selected="À propos du terrain..." name="button about land" width="132"/>
608 <button label="Fusionner..." label_selected="Fusionner..." name="button join land" width="132" />
609 <button label="À propos du terrain..." label_selected="À propos du terrain..."
610 name="button about land" width="132" />
611 </panel> 589 </panel>
612 <string name="status_rotate"> 590 <string name="status_rotate">
613 Pour faire tourner l&apos;objet, faîtes glisser les bandes de couleur. 591 Pour faire tourner l&apos;objet, faîtes glisser les bandes de couleur.
@@ -634,7 +612,7 @@
634 Cliquez et faîtes glisser pour sélectionner le terrain 612 Cliquez et faîtes glisser pour sélectionner le terrain
635 </string> 613 </string>
636 <string name="grid_screen_text"> 614 <string name="grid_screen_text">
637 Ecran 615 Écran
638 </string> 616 </string>
639 <string name="grid_local_text"> 617 <string name="grid_local_text">
640 Local 618 Local
diff --git a/linden/indra/newview/skins/default/xui/fr/floater_top_objects.xml b/linden/indra/newview/skins/default/xui/fr/floater_top_objects.xml
index be92328..7ef4a60 100644
--- a/linden/indra/newview/skins/default/xui/fr/floater_top_objects.xml
+++ b/linden/indra/newview/skins/default/xui/fr/floater_top_objects.xml
@@ -1,32 +1,32 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 1<?xml version="1.0" encoding="utf-8" standalone="yes"?>
2<floater name="top_objects" title="en cours de chargement..."> 2<floater name="top_objects" title="en cours de chargement...">
3 <text name="title_text"> 3 <text name="title_text">
4 Chargement en cours... 4 Chargement en cours...
5 </text> 5 </text>
6 <scroll_list name="objects_list"> 6 <scroll_list name="objects_list">
7 <column label="Score" name="score" /> 7 <column label="Score" name="score"/>
8 <column label="Nom" name="name" /> 8 <column label="Nom" name="name"/>
9 <column label="Propriétaire" name="owner" /> 9 <column label="Propriétaire" name="owner"/>
10 <column label="Emplacement" name="location" /> 10 <column label="Lieu" name="location"/>
11 <column label="Heure" name="time" /> 11 <column label="Heure" name="time"/>
12 </scroll_list> 12 </scroll_list>
13 <text name="id_text"> 13 <text name="id_text">
14 ID de l&apos;objet : 14 ID de l&apos;objet :
15 </text> 15 </text>
16 <button label="Afficher balise" name="show_beacon_btn" /> 16 <button label="Afficher balise" name="show_beacon_btn"/>
17 <text name="obj_name_text"> 17 <text name="obj_name_text">
18 Nom : 18 Nom :
19 </text> 19 </text>
20 <button label="Filtre" name="filter_object_btn" /> 20 <button label="Filtre" name="filter_object_btn"/>
21 <text name="owner_name_text"> 21 <text name="owner_name_text">
22 Nom : 22 Nom :
23 </text> 23 </text>
24 <button label="Filtre" name="filter_owner_btn" /> 24 <button label="Filtre" name="filter_owner_btn"/>
25 <button label="Renvoyer" name="return_selected_btn" /> 25 <button label="Renvoyer" name="return_selected_btn"/>
26 <button label="Renvoyer tous" name="return_all_btn" /> 26 <button label="Renvoyer tous" name="return_all_btn"/>
27 <button label="Désactiver" name="disable_selected_btn" /> 27 <button label="Désactiver" name="disable_selected_btn"/>
28 <button label="Désactiver tous" name="disable_all_btn" /> 28 <button label="Désactiver tous" name="disable_all_btn"/>
29 <button label="Rafraîchir" name="refresh_btn" /> 29 <button label="Rafraîchir" name="refresh_btn"/>
30 <text name="top_scripts_title"> 30 <text name="top_scripts_title">
31 Scripts principaux 31 Scripts principaux
32 </text> 32 </text>
diff --git a/linden/indra/newview/skins/default/xui/fr/floater_world_map.xml b/linden/indra/newview/skins/default/xui/fr/floater_world_map.xml
index f2219c8..c628b11 100644
--- a/linden/indra/newview/skins/default/xui/fr/floater_world_map.xml
+++ b/linden/indra/newview/skins/default/xui/fr/floater_world_map.xml
@@ -1,107 +1,90 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 1<?xml version="1.0" encoding="utf-8" standalone="yes"?>
2<floater name="worldmap" title="Carte du monde"> 2<floater name="worldmap" title="Carte du monde">
3 <tab_container name="maptab" width="955"> 3 <tab_container name="maptab" width="955">
4 <panel label="Objets" name="objects_mapview" width="953" /> 4 <panel label="Objets" name="objects_mapview" width="953"/>
5 <panel label="Terrain" name="terrain_mapview" width="953" /> 5 <panel label="Terrain" name="terrain_mapview" width="953"/>
6 </tab_container> 6 </tab_container>
7 <icon left="973" name="square" /> 7 <icon left="973" name="square"/>
8 <text name="land_for_sale_label"> 8 <text name="land_for_sale_label">
9 Terrain à vendre 9 Terrain à vendre
10 </text> 10 </text>
11 <icon left="1113" name="square2" /> 11 <icon left="1113" name="square2"/>
12 <text name="auction_label"> 12 <text name="auction_label">
13 Enchère 13 Enchère
14 </text> 14 </text>
15 <icon left="973" name="self" /> 15 <icon left="973" name="self"/>
16 <text name="you_label"> 16 <text name="you_label">
17 Vous 17 Vous
18 </text> 18 </text>
19 <icon left="1033" name="home" /> 19 <icon left="1033" name="home"/>
20 <text name="home_label"> 20 <text name="home_label">
21 Domicile 21 Domicile
22 </text> 22 </text>
23 <button label="Aller chez moi" label_selected="Aller chez moi" name="Go Home" 23 <button label="Aller chez moi" label_selected="Aller chez moi" name="Go Home" tool_tip="Vous téléporte à votre domicile"/>
24 tool_tip="Vous téléporte à votre domicile" /> 24 <icon left="977" name="person"/>
25 <icon left="977" name="person" />
26 <text name="person_label"> 25 <text name="person_label">
27 Personne 26 Résident
28 </text> 27 </text>
29 <icon left="973" name="infohub" /> 28 <icon left="973" name="infohub"/>
30 <check_box label=" " left_delta="60" name="people_chk" /> 29 <check_box label=" " left_delta="60" name="people_chk"/>
31 <text name="infohub_label"> 30 <text name="infohub_label">
32 Infohub 31 Infohub
33 </text> 32 </text>
34 <icon left="973" name="telehub" /> 33 <icon left="973" name="telehub"/>
35 <check_box label=" " left_delta="60" name="infohub_chk" /> 34 <check_box label=" " left_delta="60" name="infohub_chk"/>
36 <text name="telehub_label"> 35 <text name="telehub_label">
37 Téléhub 36 Téléhub
38 </text> 37 </text>
39 <check_box label=" " left_delta="60" name="telehubchk" /> 38 <check_box label=" " left_delta="60" name="telehubchk"/>
40 <icon left="1113" name="landforsale" /> 39 <icon left="1113" name="landforsale"/>
41 <text name="land_for_sale_label2"> 40 <text name="land_for_sale_label2">
42 Terrain à vendre 41 Terrain à vendre
43 </text> 42 </text>
44 <check_box label=" " name="land_for_sale_chk" /> 43 <check_box label=" " name="land_for_sale_chk"/>
45 <icon left="1113" name="event" /> 44 <icon left="1113" name="event"/>
46 <text name="events_label"> 45 <text name="events_label">
47 Événements 46 Événements
48 </text> 47 </text>
49 <check_box label=" " name="event_chk" /> 48 <check_box label=" " name="event_chk"/>
50 <icon left="1113" name="events_mature_icon" /> 49 <icon left="1113" name="events_mature_icon"/>
51 <text name="events_mature_label"> 50 <text name="events_mature_label">
52 Événements (A) 51 Événements (A)
53 </text> 52 </text>
54 <check_box label=" " name="event_mature_chk" /> 53 <check_box label=" " name="event_mature_chk"/>
55 <icon left="973" name="avatar_icon" /> 54 <icon left="973" name="avatar_icon"/>
56 <combo_box label="Amis connectés" name="friend combo" 55 <combo_box label="Amis connectés" name="friend combo" tool_tip="Ami à afficher sur la carte" width="232">
57 tool_tip="Ami à afficher sur la carte" width="232">
58 <combo_item name="none_selected"> 56 <combo_item name="none_selected">
59 Amis connectés 57 Amis connectés
60 </combo_item> 58 </combo_item>
61 </combo_box> 59 </combo_box>
62 <icon left="973" name="landmark_icon" /> 60 <icon left="973" name="landmark_icon"/>
63 <combo_box label="Repères" name="landmark combo" 61 <combo_box label="Repères" name="landmark combo" tool_tip="Repère à afficher sur la carte" width="232">
64 tool_tip="Repère à afficher sur la carte" width="232">
65 <combo_item name="none_selected"> 62 <combo_item name="none_selected">
66 Repères 63 Repères
67 </combo_item> 64 </combo_item>
68 </combo_box> 65 </combo_box>
69 <icon left="973" name="location_icon" /> 66 <icon left="973" name="location_icon"/>
70 <line_editor label="Rechercher par nom de région" name="location" 67 <line_editor label="Rechercher par nom de région" name="location" tool_tip="Saisissez le nom d&apos;une région" width="155">
71 tool_tip="Saisissez le nom d&apos;une région" width="155">
72 Recherche par nom de région 68 Recherche par nom de région
73 </line_editor> 69 </line_editor>
74 <button label="Rechercher" label_selected="&gt;" left_delta="160" name="DoSearch" 70 <button label="Rechercher" label_selected="&gt;" left_delta="160" name="DoSearch" tool_tip="Rechercher dans la région" width="75"/>
75 tool_tip="Rechercher dans la région" width="75" />
76 <text left="973" name="search_label"> 71 <text left="973" name="search_label">
77 Résultats de la recherche : 72 Résultats de la recherche :
78 </text> 73 </text>
79 <scroll_list left="973" name="search_results" width="252"> 74 <scroll_list left="973" name="search_results" width="252">
80 <column label="" name="icon" /> 75 <column label="" name="icon"/>
81 <column label="" name="sim_name" /> 76 <column label="" name="sim_name"/>
82 </scroll_list> 77 </scroll_list>
83 <text left="973" name="location_label"> 78 <text left="973" name="location_label">
84 Emplacement : 79 Emplacement :
85 </text> 80 </text>
86 <spinner left="993" name="spin x" 81 <spinner left="993" name="spin x" tool_tip="Coordonnées des X du lieu à afficher sur la carte"/>
87 tool_tip="Coordonnées des X du lieu à afficher sur la carte" /> 82 <spinner left="993" name="spin y" tool_tip="Coordonnées des Y du lieu à afficher sur la carte"/>
88 <spinner left="993" name="spin y" 83 <spinner left="993" name="spin z" tool_tip="Coordonnées des Z du lieu à afficher sur la carte"/>
89 tool_tip="Coordonnées des Y du lieu à afficher sur la carte" /> 84 <button label="Téléporter" label_selected="Téléporter" left="-270" name="Teleport" tool_tip="Téléporter à l&apos;endroit sélectionné"/>
90 <spinner left="993" name="spin z" 85 <button label="Afficher la destination" label_selected="Afficher la destination" name="Show Destination" tool_tip="Centrer la carte sur l&apos;endroit sélectionné" width="165"/>
91 tool_tip="Coordonnées des Z du lieu à afficher sur la carte" /> 86 <button label="Effacer" label_selected="Effacer" left="-270" name="Clear" tool_tip="Arrêter de suivre"/>
92 <button label="Téléporter" label_selected="Téléporter" left="-270" name="Teleport" 87 <button label="Afficher mon emplacement" label_selected="Afficher mon emplacement" name="Show My Location" tool_tip="Centrer la carte sur l&apos;emplacement de votre avatar" width="165"/>
93 tool_tip="Téléporter à l&apos;endroit sélectionné" /> 88 <button label="Copier la SLURL dans le presse-papier" left="-270" name="copy_slurl" tool_tip="Copier l&apos;emplacement actuel comme SLURL pour l&apos;utiliser sur le Web." width="262"/>
94 <button label="Afficher la destination" label_selected="Afficher la destination" 89 <slider label="Zoom" left="-270" name="zoom slider"/>
95 name="Show Destination"
96 tool_tip="Centrer la carte sur l&apos;endroit sélectionné" width="165" />
97 <button label="Effacer" label_selected="Effacer" left="-270" name="Clear"
98 tool_tip="Arrêter de suivre" />
99 <button label="Afficher mon emplacement" label_selected="Afficher mon emplacement"
100 name="Show My Location"
101 tool_tip="Centrer la carte sur l&apos;emplacement de votre avatar"
102 width="165" />
103 <button label="Copier la SLURL sur le presse-papier" left="-270" name="copy_slurl"
104 tool_tip="Copier l&apos;emplacement actuel comme SLURL pour l&apos;utiliser sur le Web."
105 width="262" />
106 <slider label="Zoom" left="-270" name="zoom slider" />
107</floater> 90</floater>
diff --git a/linden/indra/newview/skins/default/xui/fr/menu_inventory.xml b/linden/indra/newview/skins/default/xui/fr/menu_inventory.xml
index da1773e..8391e3b 100644
--- a/linden/indra/newview/skins/default/xui/fr/menu_inventory.xml
+++ b/linden/indra/newview/skins/default/xui/fr/menu_inventory.xml
@@ -1,70 +1,67 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 1<?xml version="1.0" encoding="utf-8" standalone="yes"?>
2<menu name="Popup"> 2<menu name="Popup">
3 <menu_item_call label="Acheter" name="Task Buy" /> 3 <menu_item_call label="Acheter" name="Task Buy"/>
4 <menu_item_call label="Ouvrir" name="Task Open" /> 4 <menu_item_call label="Ouvrir" name="Task Open"/>
5 <menu_item_call label="Jouer" name="Task Play" /> 5 <menu_item_call label="Jouer" name="Task Play"/>
6 <menu_item_call label="Propriétés" name="Task Properties" /> 6 <menu_item_call label="Propriétés" name="Task Properties"/>
7 <menu_item_call label="Renommer" name="Task Rename" /> 7 <menu_item_call label="Renommer" name="Task Rename"/>
8 <menu_item_call label="Supprimer" name="Task Remove" /> 8 <menu_item_call label="Supprimer" name="Task Remove"/>
9 <menu_item_call label="Vider la corbeille" name="Empty Trash" /> 9 <menu_item_call label="Vider la corbeille" name="Empty Trash"/>
10 <menu_item_call label="Vider les objets trouvés" name="Empty Lost And Found" /> 10 <menu_item_call label="Vider les objets trouvés" name="Empty Lost And Found"/>
11 <menu_item_call label="Nouveau dossier" name="New Folder" /> 11 <menu_item_call label="Nouveau dossier" name="New Folder"/>
12 <menu_item_call label="Nouveau script" name="New Script" /> 12 <menu_item_call label="Nouveau script" name="New Script"/>
13 <menu_item_call label="Nouvelle note" name="New Note" /> 13 <menu_item_call label="Nouvelle note" name="New Note"/>
14 <menu_item_call label="Nouveau geste" name="New Gesture" /> 14 <menu_item_call label="Nouveau geste" name="New Gesture"/>
15 <menu name="New Clothes"> 15 <menu name="New Clothes">
16 <menu_item_call label="Nouvelle jupe" name="New Shirt" /> 16 <menu_item_call label="Nouvelle chemise" name="New Shirt"/>
17 <menu_item_call label="Nouveau pantalon" name="New Pants" /> 17 <menu_item_call label="Nouveau pantalon" name="New Pants"/>
18 <menu_item_call label="Nouvelles chaussures" name="New Shoes" /> 18 <menu_item_call label="Nouvelles chaussures" name="New Shoes"/>
19 <menu_item_call label="Nouvelles chaussettes" name="New Socks" /> 19 <menu_item_call label="Nouvelles chaussettes" name="New Socks"/>
20 <menu_item_call label="Nouvelle veste" name="New Jacket" /> 20 <menu_item_call label="Nouvelle veste" name="New Jacket"/>
21 <menu_item_call label="Nouvelle jupe" name="New Skirt" /> 21 <menu_item_call label="Nouvelle jupe" name="New Skirt"/>
22 <menu_item_call label="Nouveaux gants" name="New Gloves" /> 22 <menu_item_call label="Nouveaux gants" name="New Gloves"/>
23 <menu_item_call label="Nouveau tricot de peau" name="New Undershirt" /> 23 <menu_item_call label="Nouveau tricot de peau" name="New Undershirt"/>
24 <menu_item_call label="Nouveaux sous-vêtements" name="New Underpants" /> 24 <menu_item_call label="Nouveaux sous-vêtements" name="New Underpants"/>
25 </menu> 25 </menu>
26 <menu name="New Body Parts"> 26 <menu name="New Body Parts">
27 <menu_item_call label="Nouvelle silhouette" name="New Shape" /> 27 <menu_item_call label="Nouvelle silhouette" name="New Shape"/>
28 <menu_item_call label="Nouvelle peau" name="New Skin" /> 28 <menu_item_call label="Nouvelle peau" name="New Skin"/>
29 <menu_item_call label="Nouveaux cheveux" name="New Hair" /> 29 <menu_item_call label="Nouveaux cheveux" name="New Hair"/>
30 <menu_item_call label="Nouveaux yeux" name="New Eyes" /> 30 <menu_item_call label="Nouveaux yeux" name="New Eyes"/>
31 </menu> 31 </menu>
32 <menu_item_call label="Téléporter" name="Landmark Open" /> 32 <menu_item_call label="Téléporter" name="Landmark Open"/>
33 <menu_item_call label="Ouvrir" name="Animation Open" /> 33 <menu_item_call label="Ouvrir" name="Animation Open"/>
34 <menu_item_call label="Ouvrir" name="Sound Open" /> 34 <menu_item_call label="Ouvrir" name="Sound Open"/>
35 <menu_item_call label="Purger l&apos;objet" name="Purge Item" /> 35 <menu_item_call label="Purger l&apos;objet" name="Purge Item"/>
36 <menu_item_call label="Restaurer l&apos;objet" name="Restore Item" /> 36 <menu_item_call label="Restaurer l&apos;objet" name="Restore Item"/>
37 <menu_item_call label="Ouvrir" name="Open" /> 37 <menu_item_call label="Ouvrir" name="Open"/>
38 <menu_item_call label="Propriétés" name="Properties" /> 38 <menu_item_call label="Propriétés" name="Properties"/>
39 <menu_item_call label="Renommer" name="Rename" /> 39 <menu_item_call label="Renommer" name="Rename"/>
40 <menu_item_call label="Copier l&apos;identifiant universel unique (UUID) de l&apos;actif" 40 <menu_item_call label="Copier l&apos;UUID (identifiant universel unique)" name="Copy Asset UUID"/>
41 name="Copy Asset UUID" /> 41 <menu_item_call label="Copier" name="Copy"/>
42 <menu_item_call label="Copier" name="Copy" /> 42 <menu_item_call label="Coller" name="Paste"/>
43 <menu_item_call label="Coller" name="Paste" /> 43 <menu_item_call label="Supprimer" name="Delete"/>
44 <menu_item_call label="Supprimer" name="Delete" /> 44 <menu_item_call label="Ajouter à l&apos;ensemble" name="Add To Outfit"/>
45 <menu_item_call label="Ajouter à l&apos;ensemble" name="Add To Outfit" /> 45 <menu_item_call label="Remplacer l&apos;ensemble" name="Replace Outfit"/>
46 <menu_item_call label="Remplacer l&apos;ensemble" name="Replace Outfit" /> 46 <menu_item_call label="Enlever les objets" name="Take Off Items"/>
47 <menu_item_call label="Enlever les objets" name="Take Off Items" /> 47 <menu_item_call label="Envoyer un IM aux contacts en ligne dans le dossier" name="IM Online Contacts In Folder"/>
48 <menu_item_call label="Envoyer un IM aux contacts en ligne dans le dossier" 48 <menu_item_call label="Envoyer un IM à tous les contacts dans le dossier" name="IM All Contacts In Folder"/>
49 name="IM Online Contacts In Folder" /> 49 <menu_item_call label="Démarrer le chat conférence" name="Conference Chat Folder"/>
50 <menu_item_call label="Envoyer un IM à tous les contacts dans le dossier" 50 <menu_item_call label="Jouer" name="Sound Play"/>
51 name="IM All Contacts In Folder" /> 51 <menu_item_call label="Au sujet du repère" name="Teleport To Landmark"/>
52 <menu_item_call label="Démarrer le chat conférence" name="Conference Chat Folder" /> 52 <menu_item_call label="Jouer dans le Monde" name="Animation Play"/>
53 <menu_item_call label="Jouer" name="Sound Play" /> 53 <menu_item_call label="Jouer localement" name="Animation Audition"/>
54 <menu_item_call label="Au sujet du repère" name="Teleport To Landmark" /> 54 <menu_item_call label="Envoyer un message instantané" name="Send Instant Message"/>
55 <menu_item_call label="Jouer dans le Monde" name="Animation Play" /> 55 <menu_item_call label="Offrir de téléporter..." name="Offer Teleport..."/>
56 <menu_item_call label="Jouer localement" name="Animation Audition" /> 56 <menu_item_call label="Démarrer le chat conférence" name="Conference Chat"/>
57 <menu_item_call label="Envoyer un message instantané" name="Send Instant Message" /> 57 <menu_item_call label="Activer" name="Activate"/>
58 <menu_item_call label="Offrir de téléporter..." name="Offer Teleport..." /> 58 <menu_item_call label="Désactiver" name="Deactivate"/>
59 <menu_item_call label="Démarrer le chat conférence" name="Conference Chat" /> 59 <menu_item_call label="Détacher de vous" name="Detach From Yourself"/>
60 <menu_item_call label="Activer" name="Activate" /> 60 <menu_item_call label="Porter" name="Object Wear"/>
61 <menu_item_call label="Désactiver" name="Deactivate" /> 61 <menu label="Attacher à" name="Attach To"/>
62 <menu_item_call label="Détacher de vous" name="Detach From Yourself" /> 62 <menu label="Attacher au HUD " name="Attach To HUD"/>
63 <menu_item_call label="Porter" name="Object Wear" /> 63 <menu_item_call label="Porter" name="Wearable Wear"/>
64 <menu label="Attacher à" name="Attach To" /> 64 <menu_item_call label="Éditer" name="Wearable Edit"/>
65 <menu label="Attacher au HUD " name="Attach To HUD" /> 65 <menu_item_call label="Enlever" name="Take Off"/>
66 <menu_item_call label="Porter" name="Wearable Wear" /> 66 <menu_item_call label="--aucune option--" name="--no options--"/>
67 <menu_item_call label="Éditer" name="Wearable Edit" />
68 <menu_item_call label="Enlever" name="Take Off" />
69 <menu_item_call label="--aucune option--" name="--no options--" />
70</menu> 67</menu>
diff --git a/linden/indra/newview/skins/default/xui/fr/menu_pie_avatar.xml b/linden/indra/newview/skins/default/xui/fr/menu_pie_avatar.xml
index cccece5..c6d5ff6 100644
--- a/linden/indra/newview/skins/default/xui/fr/menu_pie_avatar.xml
+++ b/linden/indra/newview/skins/default/xui/fr/menu_pie_avatar.xml
@@ -1,17 +1,17 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 1<?xml version="1.0" encoding="utf-8" standalone="yes"?>
2<pie_menu name="Avatar Pie"> 2<pie_menu name="Avatar Pie">
3 <menu_item_call label="Profil..." name="Profile..." /> 3 <menu_item_call label="Profil..." name="Profile..."/>
4 <menu_item_call label="Ignorer" name="Avatar Mute" /> 4 <menu_item_call label="Ignorer" name="Avatar Mute"/>
5 <menu_item_call label="Aller" name="Go To" /> 5 <menu_item_call label="Aller" name="Go To"/>
6 <menu_item_call label="Ajouter comme ami..." name="Add Friend" /> 6 <menu_item_call label="Devenir amis..." name="Add Friend"/>
7 <menu_item_call label="Payer..." name="Pay..." /> 7 <menu_item_call label="Payer..." name="Pay..."/>
8 <pie_menu label="Plus &gt;" name="More &gt;"> 8 <pie_menu label="Plus &gt;" name="More &gt;">
9 <menu_item_call label="Geler..." name="Freeze..." /> 9 <menu_item_call label="Geler..." name="Freeze..."/>
10 <menu_item_call label="Donner une carte" name="Give Card" /> 10 <menu_item_call label="Donner une carte" name="Give Card"/>
11 <menu_item_call label="Invitation de groupe..." name="Invite..." /> 11 <menu_item_call label="Invitation de groupe..." name="Invite..."/>
12 <menu_item_call label="Expulser..." name="Eject..." /> 12 <menu_item_call label="Expulser..." name="Eject..."/>
13 <menu_item_call label="Débugger..." name="Debug..." /> 13 <menu_item_call label="Débugger..." name="Debug..."/>
14 <menu_item_call label="Inspecter" name="Object Inspect" /> 14 <menu_item_call label="Inspecter" name="Object Inspect"/>
15 </pie_menu> 15 </pie_menu>
16 <menu_item_call label="Envoyer IM..." name="Send IM..." /> 16 <menu_item_call label="Envoyer IM..." name="Send IM..."/>
17</pie_menu> 17</pie_menu>
diff --git a/linden/indra/newview/skins/default/xui/fr/menu_pie_land.xml b/linden/indra/newview/skins/default/xui/fr/menu_pie_land.xml
index 3da5245..0cc7469 100644
--- a/linden/indra/newview/skins/default/xui/fr/menu_pie_land.xml
+++ b/linden/indra/newview/skins/default/xui/fr/menu_pie_land.xml
@@ -1,10 +1,10 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 1<?xml version="1.0" encoding="utf-8" standalone="yes"?>
2<pie_menu name="Land Pie"> 2<pie_menu name="Land Pie">
3 <menu_item_call label="À propos du terrain..." name="About Land..." /> 3 <menu_item_call label="À propos du terrain..." name="About Land..."/>
4 <menu_item_call label="Créer" name="Create" /> 4 <menu_item_call label="Créer" name="Create"/>
5 <menu_item_call label="Aller ici" name="Go Here" /> 5 <menu_item_call label="Aller ici" name="Go Here"/>
6 <menu_item_call label="M&apos;asseoir ici" name="Sit Here" /> 6 <menu_item_call label="M&apos;asseoir ici" name="Sit Here"/>
7 <menu_item_call label="Acheter laissez-passer..." name="Land Buy Pass" /> 7 <menu_item_call label="Acheter pass..." name="Land Buy Pass"/>
8 <menu_item_call label="Modifier le terrain" name="Edit Terrain" /> 8 <menu_item_call label="Modifier le terrain" name="Edit Terrain"/>
9 <menu_item_call label="Acheter le terrain..." name="Land Buy" /> 9 <menu_item_call label="Acheter le terrain..." name="Land Buy"/>
10</pie_menu> 10</pie_menu>
diff --git a/linden/indra/newview/skins/default/xui/fr/menu_viewer.xml b/linden/indra/newview/skins/default/xui/fr/menu_viewer.xml
index 6e34d27..4746d82 100644
--- a/linden/indra/newview/skins/default/xui/fr/menu_viewer.xml
+++ b/linden/indra/newview/skins/default/xui/fr/menu_viewer.xml
@@ -1,279 +1,263 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 1<?xml version="1.0" encoding="utf-8" standalone="yes"?>
2<menu_bar name="Main Menu"> 2<menu_bar name="Main Menu">
3 <menu label="Fichier" name="File"> 3 <menu label="Fichier" name="File">
4 <tearoff_menu label="~~~~~~~~~~~" name="~~~~~~~~~~~" /> 4 <tearoff_menu label="~~~~~~~~~~~" name="~~~~~~~~~~~"/>
5 <menu_item_call label="Charger une image ([COST] $L)..." name="Upload Image" /> 5 <menu_item_call label="Charger une image ([COST] L$)..." name="Upload Image"/>
6 <menu_item_call label="Charger un son ([COST] $L)..." name="Upload Sound" /> 6 <menu_item_call label="Charger un son ([COST] L$)..." name="Upload Sound"/>
7 <menu_item_call label="Charger une animation ([COST] $L)..." name="Upload Animation" /> 7 <menu_item_call label="Charger une animation ([COST] L$)..." name="Upload Animation"/>
8 <menu_item_call label="Charger un lot de fichiers ([COST] $L par fichier)..." 8 <menu_item_call label="Charger un lot de fichiers ([COST] L$ par fichier)..." name="Bulk Upload"/>
9 name="Bulk Upload" /> 9 <menu_item_separator label="-----------" name="separator"/>
10 <menu_item_separator label="-----------" name="separator" /> 10 <menu_item_call label="Fermer la fenêtre" name="Close Window"/>
11 <menu_item_call label="Fermer la fenêtre" name="Close Window" /> 11 <menu_item_call label="Fermer toutes les fenêtres" name="Close All Windows"/>
12 <menu_item_call label="Fermer toutes les fenêtres" name="Close All Windows" /> 12 <menu_item_separator label="-----------" name="separator2"/>
13 <menu_item_separator label="-----------" name="separator2" /> 13 <menu_item_call label="Enregistrer la texture sous..." name="Save Texture As..."/>
14 <menu_item_call label="Enregistrer la texture sous..." name="Save Texture As..." /> 14 <menu_item_separator label="-----------" name="separator3"/>
15 <menu_item_separator label="-----------" name="separator3" /> 15 <menu_item_call label="Prendre une photo" name="Take Snapshot"/>
16 <menu_item_call label="Prendre une photo" name="Take Snapshot" /> 16 <menu_item_call label="Enregistrer la photo sur le disque" name="Snapshot to Disk" shortcut="control|shift|X"/>
17 <menu_item_call label="Enregistrer la photo sur le disque" name="Snapshot to Disk" 17 <menu_item_separator label="-----------" name="separator4"/>
18 shortcut="control|shift|X" />
19 <menu_item_separator label="-----------" name="separator4" />
20 <menu label="Définir taille de la fenêtre" name="Set Window Size"> 18 <menu label="Définir taille de la fenêtre" name="Set Window Size">
21 <tearoff_menu label="~~~~~~~~~~~" name="~~~~~~~~~~~" /> 19 <tearoff_menu label="~~~~~~~~~~~" name="~~~~~~~~~~~"/>
22 <menu_item_call label="320x240" name="320x240" /> 20 <menu_item_call label="320x240" name="320x240"/>
23 <menu_item_call label="640x480" name="640x480" /> 21 <menu_item_call label="640x480" name="640x480"/>
24 <menu_item_call label="800x600" name="800x600" /> 22 <menu_item_call label="800x600" name="800x600"/>
25 <menu_item_separator label="-----------" name="separator" /> 23 <menu_item_separator label="-----------" name="separator"/>
26 <menu_item_call label="720x480 (NTSC)" name="720x480 (NTSC)" /> 24 <menu_item_call label="720x480 (NTSC)" name="720x480 (NTSC)"/>
27 <menu_item_call label="768x576 (PAL)" name="768x576 (PAL)" /> 25 <menu_item_call label="768x576 (PAL)" name="768x576 (PAL)"/>
28 </menu> 26 </menu>
29 <menu_item_separator label="-----------" name="separator5" /> 27 <menu_item_separator label="-----------" name="separator5"/>
30 <menu_item_call label="Quitter" name="Quit" /> 28 <menu_item_call label="Quitter" name="Quit"/>
31 </menu> 29 </menu>
32 <menu label="Édition" name="Edit"> 30 <menu label="Édition" name="Edit">
33 <tearoff_menu label="~~~~~~~~~~~" name="~~~~~~~~~~~" /> 31 <tearoff_menu label="~~~~~~~~~~~" name="~~~~~~~~~~~"/>
34 <menu_item_call label="Annuler" name="Undo" /> 32 <menu_item_call label="Annuler" name="Undo"/>
35 <menu_item_call label="Recommencer" name="Redo" /> 33 <menu_item_call label="Recommencer" name="Redo"/>
36 <menu_item_separator label="-----------" name="separator" /> 34 <menu_item_separator label="-----------" name="separator"/>
37 <menu_item_call label="Couper" name="Cut" /> 35 <menu_item_call label="Couper" name="Cut"/>
38 <menu_item_call label="Copier" name="Copy" /> 36 <menu_item_call label="Copier" name="Copy"/>
39 <menu_item_call label="Coller" name="Paste" /> 37 <menu_item_call label="Coller" name="Paste"/>
40 <menu_item_call label="Supprimer" name="Delete" /> 38 <menu_item_call label="Supprimer" name="Delete"/>
41 <menu_item_separator label="-----------" name="separator2" /> 39 <menu_item_separator label="-----------" name="separator2"/>
42 <menu_item_call label="Rechercher..." name="Search..." /> 40 <menu_item_call label="Rechercher..." name="Search..."/>
43 <menu_item_separator label="-----------" name="separator3" /> 41 <menu_item_separator label="-----------" name="separator3"/>
44 <menu_item_call label="Tout sélectionner" name="Select All" /> 42 <menu_item_call label="Tout sélectionner" name="Select All"/>
45 <menu_item_call label="Désélectionner" name="Deselect" /> 43 <menu_item_call label="Désélectionner" name="Deselect"/>
46 <menu_item_separator label="-----------" name="separator4" /> 44 <menu_item_separator label="-----------" name="separator4"/>
47 <menu_item_call label="Dupliquer" name="Duplicate" /> 45 <menu_item_call label="Dupliquer" name="Duplicate"/>
48 <menu_item_separator label="-----------" name="separator5" /> 46 <menu_item_separator label="-----------" name="separator5"/>
49 <menu label="Attacher objet" name="Attach Object" /> 47 <menu label="Attacher l&apos;objet" name="Attach Object"/>
50 <menu label="Détacher objet" name="Detach Object" /> 48 <menu label="Détacher l&apos;objet" name="Detach Object"/>
51 <menu label="Enlever mes habits" name="Take Off Clothing"> 49 <menu label="Enlever mes habits" name="Take Off Clothing">
52 <tearoff_menu label="~~~~~~~~~~~" name="~~~~~~~~~~~" /> 50 <tearoff_menu label="~~~~~~~~~~~" name="~~~~~~~~~~~"/>
53 <menu_item_call label="Chemise" name="Shirt" /> 51 <menu_item_call label="Chemise" name="Shirt"/>
54 <menu_item_call label="Pantalon" name="Pants" /> 52 <menu_item_call label="Pantalon" name="Pants"/>
55 <menu_item_call label="Chaussures" name="Shoes" /> 53 <menu_item_call label="Chaussures" name="Shoes"/>
56 <menu_item_call label="Chaussettes" name="Socks" /> 54 <menu_item_call label="Chaussettes" name="Socks"/>
57 <menu_item_call label="Veste" name="Jacket" /> 55 <menu_item_call label="Veste" name="Jacket"/>
58 <menu_item_call label="Gants" name="Gloves" /> 56 <menu_item_call label="Gants" name="Gloves"/>
59 <menu_item_call label="Tricot de peau" name="Menu Undershirt" /> 57 <menu_item_call label="Tricot de peau" name="Menu Undershirt"/>
60 <menu_item_call label="Sous-vêtements" name="Menu Underpants" /> 58 <menu_item_call label="Sous-vêtements" name="Menu Underpants"/>
61 <menu_item_call label="Jupe" name="Skirt" /> 59 <menu_item_call label="Jupe" name="Skirt"/>
62 <menu_item_call label="Tous les habits" name="All Clothes" /> 60 <menu_item_call label="Tous les habits" name="All Clothes"/>
63 </menu> 61 </menu>
64 <menu_item_separator label="-----------" name="separator6" /> 62 <menu_item_separator label="-----------" name="separator6"/>
65 <menu_item_call label="Gestes..." name="Gestures..." /> 63 <menu_item_call label="Gestes..." name="Gestures..."/>
66 <menu_item_call label="Profil..." name="Profile..." /> 64 <menu_item_call label="Profil..." name="Profile..."/>
67 <menu_item_call label="Apparence..." name="Appearance..." /> 65 <menu_item_call label="Apparence..." name="Appearance..."/>
68 <menu_item_separator label="-----------" name="separator7" /> 66 <menu_item_separator label="-----------" name="separator7"/>
69 <menu_item_check label="Amis..." name="Friends..." /> 67 <menu_item_check label="Amis..." name="Friends..."/>
70 <menu_item_call label="Groupes..." name="Groups..." /> 68 <menu_item_call label="Groupes..." name="Groups..."/>
71 <menu_item_separator label="-----------" name="separator8" /> 69 <menu_item_separator label="-----------" name="separator8"/>
72 <menu_item_call label="Préférences..." name="Preferences..." /> 70 <menu_item_call label="Préférences..." name="Preferences..."/>
73 </menu> 71 </menu>
74 <menu label="Affichage" name="View"> 72 <menu label="Affichage" name="View">
75 <tearoff_menu label="~~~~~~~~~~~" name="~~~~~~~~~~~" /> 73 <tearoff_menu label="~~~~~~~~~~~" name="~~~~~~~~~~~"/>
76 <menu_item_call label="Vue subjective" name="Mouselook" /> 74 <menu_item_call label="Vue subjective" name="Mouselook"/>
77 <menu_item_check label="Construire" name="Build" /> 75 <menu_item_check label="Construire" name="Build"/>
78 <menu_item_check label="Joystick Flycam" name="Joystick Flycam" /> 76 <menu_item_check label="Vue avec le joystick" name="Joystick Flycam"/>
79 <menu_item_call label="Réinitialiser l&apos;affichage" name="Reset View" /> 77 <menu_item_call label="Réinitialiser l&apos;affichage" name="Reset View"/>
80 <menu_item_call label="Regarder la dernière personne qui a parlé" name="Look at Last Chatter" 78 <menu_item_call label="Regarder le dernier intervenant" name="Look at Last Chatter" shortcut="alt|V"/>
81 shortcut="alt|V" /> 79 <menu_item_separator label="-----------" name="separator"/>
82 <menu_item_separator label="-----------" name="separator" /> 80 <menu_item_check label="Barre d&apos;outils" name="Toolbar"/>
83 <menu_item_check label="Barre d&apos;outils" name="Toolbar" /> 81 <menu_item_check label="Chat local" name="Chat History"/>
84 <menu_item_check label="Chat local" name="Chat History" /> 82 <menu_item_check label="Communiquer" name="Instant Message"/>
85 <menu_item_check label="Communiquer" name="Instant Message" /> 83 <menu_item_call label="Inventaire" name="Inventory"/>
86 <menu_item_call label="Inventaire" name="Inventory" /> 84 <menu_item_check label="Intervenants actifs" name="Active Speakers"/>
87 <menu_item_check label="Intervenants actifs" name="Active Speakers" /> 85 <menu_item_check label="Liste des ignorés" name="Mute List"/>
88 <menu_item_check label="Liste des ignorés" name="Mute List" /> 86 <menu_item_separator label="-----------" name="separator2"/>
89 <menu_item_separator label="-----------" name="separator2" /> 87 <menu_item_check label="Contrôles de la caméra" name="Camera Controls"/>
90 <menu_item_check label="Contrôles de la caméra" name="Camera Controls" /> 88 <menu_item_check label="Contrôle des déplacements" name="Movement Controls"/>
91 <menu_item_check label="Contrôle des déplacements" name="Movement Controls" /> 89 <menu_item_check label="Carte du monde" name="World Map"/>
92 <menu_item_check label="Carte du monde" name="World Map" /> 90 <menu_item_check label="Mini-carte" name="Mini-Map"/>
93 <menu_item_check label="Mini-carte" name="Mini-Map" /> 91 <menu_item_separator label="-----------" name="separator3"/>
94 <menu_item_separator label="-----------" name="separator3" /> 92 <menu_item_check label="Statistiques" name="Statistics Bar"/>
95 <menu_item_check label="Barre de statistiques" name="Statistics Bar" /> 93 <menu_item_check label="Limites des parcelles" name="Property Lines"/>
96 <menu_item_check label="Limites de la propriété" name="Property Lines" /> 94 <menu_item_check label="Propriétaires fonciers" name="Land Owners"/>
97 <menu_item_check label="Propriétaires fonciers" name="Land Owners" /> 95 <menu_item_separator label="-----------" name="separator4"/>
98 <menu_item_separator label="-----------" name="separator4" /> 96 <menu label="Infobulles" name="Hover Tips">
99 <menu label="Astuces en survol" name="Hover Tips"> 97 <tearoff_menu label="~~~~~~~~~~~" name="~~~~~~~~~~~"/>
100 <tearoff_menu label="~~~~~~~~~~~" name="~~~~~~~~~~~" /> 98 <menu_item_check label="Affichez les astuces" name="Show Tips"/>
101 <menu_item_check label="Afficher les astuces" name="Show Tips" /> 99 <menu_item_separator label="-----------" name="separator"/>
102 <menu_item_separator label="-----------" name="separator" /> 100 <menu_item_check label="Astuces sur les terrains" name="Land Tips"/>
103 <menu_item_check label="Astuces sur les terrains" name="Land Tips" /> 101 <menu_item_check label="Astuces sur tous les objets" name="Tips On All Objects"/>
104 <menu_item_check label="Astuces sur tous les objets" name="Tips On All Objects" />
105 </menu> 102 </menu>
106 <menu_item_check label="Alt affiche les propriétés physiques" name="Alt Shows Physical" /> 103 <menu_item_check label="Alt affiche les propriétés physiques" name="Alt Shows Physical"/>
107 <menu_item_check label="Voir les objets invisibles" name="Highlight Transparent" /> 104 <menu_item_check label="Voir les objets invisibles" name="Highlight Transparent"/>
108 <menu_item_check label="Balises toujours activées" name="Beacons Always On" /> 105 <menu_item_check label="Balises toujours activées" name="Beacons Always On"/>
109 <menu label="Balises" name="Beacons"> 106 <menu label="Balises" name="Beacons">
110 <tearoff_menu label="~~~~~~~~~~~" name="~~~~~~~~~~~" /> 107 <tearoff_menu label="~~~~~~~~~~~" name="~~~~~~~~~~~"/>
111 <menu_item_check label="Objets scriptés avec Toucher uniquement" 108 <menu_item_check label="Objets scriptés avec Toucher uniquement" name="Scripted Objects With Touch Only"/>
112 name="Scripted Objects With Touch Only" /> 109 <menu_item_check label="Objets scriptés" name="Scripted Objects"/>
113 <menu_item_check label="Objets scriptés" name="Scripted Objects" /> 110 <menu_item_check label="Objets physiques" name="Physical Objects"/>
114 <menu_item_check label="Objets physiques" name="Physical Objects" /> 111 <menu_item_check label="Sources sonores" name="Sound Sources"/>
115 <menu_item_check label="Sources sonores" name="Sound Sources" /> 112 <menu_item_check label="Sources des particules" name="Particle Sources"/>
116 <menu_item_check label="Sources des particules" name="Particle Sources" /> 113 <menu_item_separator label="-----------" name="separator"/>
117 <menu_item_separator label="-----------" name="separator" /> 114 <menu_item_check label="Montrer les surbrillances" name="Render Highlights"/>
118 <menu_item_check label="Montrer les surbrillances" name="Render Highlights" /> 115 <menu_item_check label="Montrer les balises" name="Render Beacons"/>
119 <menu_item_check label="Montrer les balises" name="Render Beacons" /> 116 <menu_item_separator label="-----------" name="separator2"/>
120 <menu_item_separator label="-----------" name="separator2" /> 117 <menu_item_check label="Masquer les particules" name="Hide Particles"/>
121 <menu_item_check label="Masquer les particules" name="Hide Particles" /> 118 <menu_item_separator label="-----------" name="separator3"/>
122 <menu_item_separator label="-----------" name="separator3" />
123 <menu label="Largeur de la balise" name="Beacon Width"> 119 <menu label="Largeur de la balise" name="Beacon Width">
124 <menu_item_call label="1" name="Beacon Width 1" /> 120 <menu_item_call label="1" name="Beacon Width 1"/>
125 <menu_item_call label="4" name="Beacon Width 4" /> 121 <menu_item_call label="4" name="Beacon Width 4"/>
126 <menu_item_call label="16" name="Beacon Width 16" /> 122 <menu_item_call label="16" name="Beacon Width 16"/>
127 <menu_item_call label="32" name="Beacon Width 32" /> 123 <menu_item_call label="32" name="Beacon Width 32"/>
128 </menu> 124 </menu>
129 </menu> 125 </menu>
130 <menu_item_check label="Afficher les éléments HUD" name="Show HUD Attachments" /> 126 <menu_item_check label="Afficher les HUD" name="Show HUD Attachments"/>
131 <menu_item_separator label="-----------" name="separator5" /> 127 <menu_item_separator label="-----------" name="separator5"/>
132 <menu_item_call label="Zoomer" name="Zoom In" /> 128 <menu_item_call label="Zoomer" name="Zoom In"/>
133 <menu_item_call label="Zoom par défaut" name="Zoom Default" /> 129 <menu_item_call label="Zoom par défaut" name="Zoom Default"/>
134 <menu_item_call label="Zoomer en arrière" name="Zoom Out" /> 130 <menu_item_call label="Zoomer en arrière" name="Zoom Out"/>
135 <menu_item_separator label="-----------" name="separator6" /> 131 <menu_item_separator label="-----------" name="separator6"/>
136 <menu label="Plus" name="More"> 132 <menu label="Plus" name="More">
137 <menu_item_call label="Passer en plein écran" name="Toggle Fullscreen" /> 133 <menu_item_call label="Passer en plein écran" name="Toggle Fullscreen"/>
138 <menu_item_call label="Définir la taille de l&apos;IU à sa valeur par défaut" 134 <menu_item_call label="Définir la taille de l&apos;interface à sa valeur par défaut" name="Set UI Size to Default"/>
139 name="Set UI Size to Default" />
140 </menu> 135 </menu>
141 <menu_item_call label="Plein écran en mode bascule" name="Toggle Fullscreen" /> 136 <menu_item_call label="Activer/Quitter le plein écran" name="Toggle Fullscreen"/>
142 <menu_item_call label="Taille de l&apos;interface par défaut" name="Set UI Size to Default" /> 137 <menu_item_call label="Taille de l&apos;interface par défaut" name="Set UI Size to Default"/>
143 </menu> 138 </menu>
144 <menu label="Monde" name="World"> 139 <menu label="Monde" name="World">
145 <tearoff_menu label="~~~~~~~~~~~" name="~~~~~~~~~~~" /> 140 <tearoff_menu label="~~~~~~~~~~~" name="~~~~~~~~~~~"/>
146 <menu_item_call label="Chat" name="Chat" /> 141 <menu_item_call label="Chat" name="Chat"/>
147 <menu_item_call label="Démarrer geste" name="Start Gesture" /> 142 <menu_item_call label="Démarrer le geste" name="Start Gesture"/>
148 <menu_item_check label="Toujours courir" name="Always Run" /> 143 <menu_item_check label="Toujours courir" name="Always Run"/>
149 <menu_item_check label="Voler" name="Fly" shortcut="F" /> 144 <menu_item_check label="Voler" name="Fly" shortcut="F"/>
150 <menu_item_separator label="-----------" name="separator" /> 145 <menu_item_separator label="-----------" name="separator"/>
151 <menu_item_call label="Créer un repère ici" name="Create Landmark Here" /> 146 <menu_item_call label="Créer un repère ici" name="Create Landmark Here"/>
152 <menu_item_call label="Définir comme domicile" name="Set Home to Here" /> 147 <menu_item_call label="Définir comme domicile" name="Set Home to Here"/>
153 <menu_item_separator label="-----------" name="separator2" /> 148 <menu_item_separator label="-----------" name="separator2"/>
154 <menu_item_call label="Téléporter chez moi" name="Teleport Home" /> 149 <menu_item_call label="Me téléporter chez moi" name="Teleport Home"/>
155 <menu_item_separator label="-----------" name="separator3" /> 150 <menu_item_separator label="-----------" name="separator3"/>
156 <menu_item_call label="Définir comme absent(e)" name="Set Away" /> 151 <menu_item_call label="Me mettre absent(e)" name="Set Away"/>
157 <menu_item_call label="Définir comme occupé(e)" name="Set Busy" /> 152 <menu_item_call label="Me mettre occupé(e)" name="Set Busy"/>
158 <menu_item_call label="Arrêter toutes les animations" name="Stop All Animations" /> 153 <menu_item_call label="Arrêter mes animations" name="Stop All Animations"/>
159 <menu_item_call label="Libérer les touches" name="Release Keys" /> 154 <menu_item_call label="Reprendre le contrôle" name="Release Keys"/>
160 <menu_item_separator label="-----------" name="separator4" /> 155 <menu_item_separator label="-----------" name="separator4"/>
161 <menu_item_call label="Historique du compte..." name="Account History..." /> 156 <menu_item_call label="Historique de mon compte..." name="Account History..."/>
162 <menu_item_call label="Gérer mon compte..." name="Manage My Account..." /> 157 <menu_item_call label="Gérer mon compte..." name="Manage My Account..."/>
163 <menu_item_call label="Acheter des $L..." name="Buy and Sell L$..." /> 158 <menu_item_call label="Acheter des L$..." name="Buy and Sell L$..."/>
164 <menu_item_separator label="-----------" name="separator5" /> 159 <menu_item_separator label="-----------" name="separator5"/>
165 <menu_item_call label="Mon terrain..." name="My Land..." /> 160 <menu_item_call label="Mes terrains..." name="My Land..."/>
166 <menu_item_call label="À propos du terrain..." name="About Land..." /> 161 <menu_item_call label="À propos du terrain..." name="About Land..."/>
167 <menu_item_call label="Acheter le terrain..." name="Buy Land..." /> 162 <menu_item_call label="Acheter le terrain..." name="Buy Land..."/>
168 <menu_item_call label="Région/Domaine..." name="Region/Estate..." /> 163 <menu_item_call label="Région et domaine..." name="Region/Estate..."/>
169 <menu_item_separator label="-----------" name="separator6" /> 164 <menu_item_separator label="-----------" name="separator6"/>
170 <menu label="Forcer le soleil" name="Force Sun"> 165 <menu label="Forcer le soleil" name="Force Sun">
171 <tearoff_menu label="~~~~~~~~~~~" name="~~~~~~~~~~~" /> 166 <tearoff_menu label="~~~~~~~~~~~" name="~~~~~~~~~~~"/>
172 <menu_item_call label="Soleil Levant" name="Sunrise" /> 167 <menu_item_call label="Soleil Levant" name="Sunrise"/>
173 <menu_item_call label="Midi" name="Noon" /> 168 <menu_item_call label="Midi" name="Noon"/>
174 <menu_item_call label="Soleil Couchant" name="Sunset" /> 169 <menu_item_call label="Soleil Couchant" name="Sunset"/>
175 <menu_item_call label="Minuit" name="Midnight" /> 170 <menu_item_call label="Minuit" name="Midnight"/>
176 <menu_item_separator label="-----------" name="separator" /> 171 <menu_item_separator label="-----------" name="separator"/>
177 <menu_item_call label="Revenir aux valeurs par défaut de la région" 172 <menu_item_call label="Revenir aux valeurs par défaut de la région" name="Revert to Region Default"/>
178 name="Revert to Region Default" />
179 </menu> 173 </menu>
180 <menu label="Paramètres de l&apos;environnement" name="Environment Settings"> 174 <menu label="Environnement" name="Environment Settings">
181 <menu_item_call label="Lever de soleil" name="Sunrise" /> 175 <menu_item_call label="Aube" name="Sunrise"/>
182 <menu_item_call label="Milieu de journée" name="Noon" /> 176 <menu_item_call label="Milieu de journée" name="Noon"/>
183 <menu_item_call label="Coucher de soleil" name="Sunset" /> 177 <menu_item_call label="Coucher de soleil" name="Sunset"/>
184 <menu_item_call label="Minuit" name="Midnight" /> 178 <menu_item_call label="Minuit" name="Midnight"/>
185 <menu_item_call label="Revenir aux options par défaut" name="Revert to Region Default" /> 179 <menu_item_call label="Revenir aux options par défaut" name="Revert to Region Default"/>
186 <menu_item_separator label="-----------" name="separator" /> 180 <menu_item_separator label="-----------" name="separator"/>
187 <menu_item_call label="Éditeur d&apos;environnement" name="Environment Editor" /> 181 <menu_item_call label="Éditeur d&apos;environnement" name="Environment Editor"/>
188 </menu> 182 </menu>
189 </menu> 183 </menu>
190 <menu label="Outils" name="Tools"> 184 <menu label="Outils" name="Tools">
191 <tearoff_menu label="~~~~~~~~~~~" name="~~~~~~~~~~~" /> 185 <tearoff_menu label="~~~~~~~~~~~" name="~~~~~~~~~~~"/>
192 <menu label="Sélectionner un outil" name="Select Tool"> 186 <menu label="Sélectionner un outil" name="Select Tool">
193 <tearoff_menu label="~~~~~~~~~~~" name="~~~~~~~~~~~" /> 187 <tearoff_menu label="~~~~~~~~~~~" name="~~~~~~~~~~~"/>
194 <menu_item_call label="Mise au point" name="Focus" /> 188 <menu_item_call label="Mise au point" name="Focus"/>
195 <menu_item_call label="Déplacer" name="Move" /> 189 <menu_item_call label="Déplacer" name="Move"/>
196 <menu_item_call label="Éditer" name="Edit" /> 190 <menu_item_call label="Éditer" name="Edit"/>
197 <menu_item_call label="Créer" name="Create" /> 191 <menu_item_call label="Créer" name="Create"/>
198 <menu_item_call label="Terrain" name="Land" /> 192 <menu_item_call label="Terrain" name="Land"/>
199 </menu> 193 </menu>
200 <menu_item_separator label="-----------" name="separator" /> 194 <menu_item_separator label="-----------" name="separator"/>
201 <menu_item_check label="Sélectionner mes objets uniquement" name="Select Only My Objects" /> 195 <menu_item_check label="Sélectionner mes objets uniquement" name="Select Only My Objects"/>
202 <menu_item_check label="Sélectionner les objets déplaçables uniquement" 196 <menu_item_check label="Sélectionner les objets déplaçables uniquement" name="Select Only Movable Objects"/>
203 name="Select Only Movable Objects" /> 197 <menu_item_check label="Sélectionner en entourant" name="Select By Surrounding"/>
204 <menu_item_check label="Sélectionner mes alentours" name="Select By Surrounding" /> 198 <menu_item_check label="Afficher les parties cachées de la sélection" name="Show Hidden Selection"/>
205 <menu_item_check label="Afficher la sélection cachée" name="Show Hidden Selection" /> 199 <menu_item_check label="Afficher la sphère de lumière de la sélection" name="Show Light Radius for Selection"/>
206 <menu_item_check label="Afficher le marquage lumineux de la sélection" 200 <menu_item_check label="Afficher le faisceau de sélection" name="Show Selection Beam"/>
207 name="Show Light Radius for Selection" /> 201 <menu_item_separator label="-----------" name="separator2"/>
208 <menu_item_check label="Afficher le faisceau de sélection" name="Show Selection Beam" /> 202 <menu_item_check label="Fixer sur la grille" name="Snap to Grid"/>
209 <menu_item_separator label="-----------" name="separator2" /> 203 <menu_item_call label="Fixer sur les axes XY de la grille" name="Snap Object XY to Grid"/>
210 <menu_item_check label="Fixer sur la grille" name="Snap to Grid" /> 204 <menu_item_call label="Utiliser la sélection pour la grille" name="Use Selection for Grid"/>
211 <menu_item_call label="Fixer sur les axes XY de la grille" name="Snap Object XY to Grid" /> 205 <menu_item_call label="Options de la grille..." name="Grid Options..."/>
212 <menu_item_call label="Utiliser la sélection pour la grille" name="Use Selection for Grid" /> 206 <menu_item_separator label="-----------" name="separator3"/>
213 <menu_item_call label="Options de la grille..." name="Grid Options..." /> 207 <menu_item_check label="Modifier les parties liées" name="Edit Linked Parts"/>
214 <menu_item_separator label="-----------" name="separator3" /> 208 <menu_item_call label="Lier" name="Link"/>
215 <menu_item_check label="Modifier les parties liées" name="Edit Linked Parts" /> 209 <menu_item_call label="Délier" name="Unlink"/>
216 <menu_item_call label="Lier" name="Link" /> 210 <menu_item_separator label="-----------" name="separator4"/>
217 <menu_item_call label="Délier" name="Unlink" /> 211 <menu_item_separator label="-----------" name="separator5"/>
218 <menu_item_separator label="-----------" name="separator4" /> 212 <menu_item_call label="Mise au point sur la sélection" name="Focus on Selection"/>
219 <menu_item_separator label="-----------" name="separator5" /> 213 <menu_item_call label="Zoom sur la sélection" name="Zoom to Selection"/>
220 <menu_item_call label="Mise au point sur la sélection" name="Focus on Selection" /> 214 <menu_item_call label="Acheter l&apos;objet" name="Menu Object Take"/>
221 <menu_item_call label="Zoom sur la sélection" name="Zoom to Selection" /> 215 <menu_item_call label="Prendre une copie" name="Take Copy"/>
222 <menu_item_call label="Acheter l&apos;objet" name="Menu Object Take" /> 216 <menu_item_call label="Remplacer l&apos;objet dans mon inventaire" name="Save Object Back to My Inventory"/>
223 <menu_item_call label="Prendre une copie" name="Take Copy" /> 217 <menu_item_call label="Remplacer l&apos;objet dans le contenu de l&apos;objet" name="Save Object Back to Object Contents"/>
224 <menu_item_call label="Remettre et enregistrer l&apos;objet dans mon inventaire" 218 <menu_item_separator label="-----------" name="separator6"/>
225 name="Save Object Back to My Inventory" /> 219 <menu_item_call label="Afficher la fenêtre d&apos;alertes/erreurs de script" name="Show Script Warning/Error Window"/>
226 <menu_item_call label="Remettre et enregistrer l&apos;objet dans les Contenus de l&apos;objet" 220 <menu_item_call label="Recompiler les scripts dans la sélection" name="Recompile Scripts in Selection">
227 name="Save Object Back to Object Contents" /> 221 <menu_item_call label="Mono" name="Mono"/>
228 <menu_item_separator label="-----------" name="separator6" /> 222 <menu_item_call label="LSL" name="LSL"/>
229 <menu_item_call label="Afficher fenêtre d&apos;alertes/erreurs de script"
230 name="Show Script Warning/Error Window" />
231 <menu_item_call label="Recompiler les scripts dans la sélection"
232 name="Recompile Scripts in Selection">
233 <menu_item_call label="Mono" name="Mono" />
234 <menu_item_call label="LSL" name="LSL" />
235 </menu_item_call> 223 </menu_item_call>
236 <menu_item_call label="Réinitialiser les scripts dans la sélection" 224 <menu_item_call label="Réinitialiser les scripts dans la sélection" name="Reset Scripts in Selection"/>
237 name="Reset Scripts in Selection" /> 225 <menu_item_call label="Activer les scripts dans la sélection" name="Set Scripts to Running in Selection"/>
238 <menu_item_call label="Activer les scripts dans la sélection" 226 <menu_item_call label="Désactiver les scripts dans la sélection" name="Set Scripts to Not Running in Selection"/>
239 name="Set Scripts to Running in Selection" />
240 <menu_item_call label="Désactiver les scripts dans la sélection"
241 name="Set Scripts to Not Running in Selection" />
242 </menu> 227 </menu>
243 <menu label="Aide" name="Help"> 228 <menu label="Aide" name="Help">
244 <tearoff_menu label="~~~~~~~~~~~" name="~~~~~~~~~~~" /> 229 <tearoff_menu label="~~~~~~~~~~~" name="~~~~~~~~~~~"/>
245 <menu_item_call label="Aide Second Life" name="Second Life Help" /> 230 <menu_item_call label="Aide Second Life" name="Second Life Help"/>
246 <menu_item_call label="Base de connaissances…" name="Knowledge Base..." /> 231 <menu_item_call label="Base de connaissances…" name="Knowledge Base..."/>
247 <menu_item_call label="Aide en ligne" name="Live Help..." /> 232 <menu_item_call label="Aide en ligne" name="Live Help..."/>
248 <menu_item_call label="Didacticiel" name="Tutorial" /> 233 <menu_item_call label="Didacticiel" name="Tutorial"/>
249 <menu_item_separator label="-----------" name="separator" /> 234 <menu_item_separator label="-----------" name="separator"/>
250 <menu_item_call label="Blog officiel des Linden..." name="Official Linden Blog..." /> 235 <menu_item_call label="Blog officiel des Lindens..." name="Official Linden Blog..."/>
251 <menu_item_separator label="-----------" name="separator2" /> 236 <menu_item_separator label="-----------" name="separator2"/>
252 <menu_item_call label="Guide de scripting..." name="Scripting Guide..." /> 237 <menu_item_call label="Guide pour l&apos;écriture de scripts..." name="Scripting Guide..."/>
253 <menu_item_call label="Scripting Wiki..." name="Scripting Wiki..." /> 238 <menu_item_call label="Scripting Wiki..." name="Scripting Wiki..."/>
254 <menu_item_call label="Portail de scripting..." name="Scripting Portal..." /> 239 <menu_item_call label="Portail pour l&apos;écriture de scripts..." name="Scripting Portal..."/>
255 <menu_item_separator label="-----------" name="separator3" /> 240 <menu_item_separator label="-----------" name="separator3"/>
256 <menu_item_call label="Message du jour..." name="Message of the Day..." /> 241 <menu_item_call label="Message du jour..." name="Message of the Day..."/>
257 <menu_item_separator label="-----------" name="separator4" /> 242 <menu_item_separator label="-----------" name="separator4"/>
258 <menu_item_call label="Signaler une infraction..." name="Report Abuse..." /> 243 <menu_item_call label="Signaler une infraction..." name="Report Abuse..."/>
259 <menu_item_call label="Collisions, coups et bousculades…" 244 <menu_item_call label="Collisions, coups et bousculades…" name="Bumps, Pushes &amp;amp; Hits..."/>
260 name="Bumps, Pushes &amp;amp; Hits..." /> 245 <menu_item_separator label="-----------" name="separator5"/>
261 <menu_item_separator label="-----------" name="separator5" /> 246 <menu_item_call label="Signaler un bug..." name="Report Bug..."/>
262 <menu_item_call label="Signaler un bug..." name="Report Bug..." /> 247 <menu_item_call label="Notes de version…" name="Release Notes..."/>
263 <menu_item_call label="Notes de version…" name="Release Notes..." /> 248 <menu_item_separator label="-----------" name="separator6"/>
264 <menu_item_separator label="-----------" name="separator6" /> 249 <menu_item_call label="Mesure du lag" name="Lag Meter"/>
265 <menu_item_call label="Calcul du lag" name="Lag Meter" /> 250 <menu_item_separator label="-----------" name="separator7"/>
266 <menu_item_separator label="-----------" name="separator7" />
267 <menu label="Signaler des bugs" name="Bug Reporting"> 251 <menu label="Signaler des bugs" name="Bug Reporting">
268 <menu_item_call label="Suivi des problèmes..." name="Public Issue Tracker..." /> 252 <menu_item_call label="Ouvrir un JIRA..." name="Public Issue Tracker..."/>
269 <menu_item_call label="Aide au suivi des problèmes..." name="Publc Issue Tracker Help..." /> 253 <menu_item_call label="Comment utiliser JIRA ?" name="Publc Issue Tracker Help..."/>
270 <menu_item_separator label="-----------" name="separator7" /> 254 <menu_item_separator label="-----------" name="separator7"/>
271 <menu_item_call label="Comment signaler des bugs ?" name="Bug Reporing 101..." /> 255 <menu_item_call label="Comment signaler des bugs ?" name="Bug Reporing 101..."/>
272 <menu_item_call label="Problèmes de sécurité..." name="Security Issues..." /> 256 <menu_item_call label="Comment signaler un problème de sécurité ?" name="Security Issues..."/>
273 <menu_item_call label="Wiki Assurance Qualité…" name="QA Wiki..." /> 257 <menu_item_call label="Wiki Assurance Qualité…" name="QA Wiki..."/>
274 <menu_item_separator label="-----------" name="separator9" /> 258 <menu_item_separator label="-----------" name="separator9"/>
275 <menu_item_call label="Signaler un bug..." name="Report Bug..." /> 259 <menu_item_call label="Signaler un bug..." name="Report Bug..."/>
276 </menu> 260 </menu>
277 <menu_item_call label="À propos de Second Life..." name="About Second Life..." /> 261 <menu_item_call label="À propos de Second Life..." name="About Second Life..."/>
278 </menu> 262 </menu>
279</menu_bar> 263</menu_bar>
diff --git a/linden/indra/newview/skins/default/xui/fr/mime_types.xml b/linden/indra/newview/skins/default/xui/fr/mime_types.xml
index 3e5c96d..5b8b7ca 100644
--- a/linden/indra/newview/skins/default/xui/fr/mime_types.xml
+++ b/linden/indra/newview/skins/default/xui/fr/mime_types.xml
@@ -1,11 +1,11 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 1<?xml version="1.0" encoding="utf-8" standalone="yes"?>
2<mimetypes name="default"> 2<mimetypes name="default">
3 <widgetset name="web"> 3 <widgetset name="web">
4 <label name="web_label"> 4 <label name="web_label">
5 Contenu web 5 Contenu web
6 </label> 6 </label>
7 <tooltip name="web_tooltip"> 7 <tooltip name="web_tooltip">
8 Il y a du contenu web à cet endroit 8 Cette parcelle propose du contenu multimédia
9 </tooltip> 9 </tooltip>
10 <playtip name="web_playtip"> 10 <playtip name="web_playtip">
11 Afficher le contenu web 11 Afficher le contenu web
@@ -35,7 +35,7 @@
35 Image 35 Image
36 </label> 36 </label>
37 <tooltip name="image_tooltip"> 37 <tooltip name="image_tooltip">
38 Il y a une image ici 38 Cette parcelle contient une image
39 </tooltip> 39 </tooltip>
40 <playtip name="image_playtip"> 40 <playtip name="image_playtip">
41 Afficher l&apos;image qui se trouve ici 41 Afficher l&apos;image qui se trouve ici
@@ -46,7 +46,7 @@
46 Audio 46 Audio
47 </label> 47 </label>
48 <tooltip name="audio_tooltip"> 48 <tooltip name="audio_tooltip">
49 Il y a du contenu audio ici 49 Cette parcelle propose du contenu audio
50 </tooltip> 50 </tooltip>
51 <playtip name="audio_playtip"> 51 <playtip name="audio_playtip">
52 Jouer le contenu audio qui se trouve ici 52 Jouer le contenu audio qui se trouve ici
diff --git a/linden/indra/newview/skins/default/xui/fr/notify.xml b/linden/indra/newview/skins/default/xui/fr/notify.xml
index e9aefcb..3a33b05 100644
--- a/linden/indra/newview/skins/default/xui/fr/notify.xml
+++ b/linden/indra/newview/skins/default/xui/fr/notify.xml
@@ -1,4 +1,4 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 1<?xml version="1.0" encoding="utf-8" standalone="yes"?>
2<notifications> 2<notifications>
3 <notify name="SystemMessageTip"> 3 <notify name="SystemMessageTip">
4 <message name="message"> 4 <message name="message">
@@ -37,7 +37,7 @@
37 </notify> 37 </notify>
38 <notify name="AddSelfFriend"> 38 <notify name="AddSelfFriend">
39 <message name="message"> 39 <message name="message">
40 Vous ne pouvez pas vous ajouter comme ami. 40 Vous ne pouvez pas devenir ami avec vous-même.
41 </message> 41 </message>
42 </notify> 42 </notify>
43 <notify name="UploadingAuctionSnapshot"> 43 <notify name="UploadingAuctionSnapshot">
@@ -48,7 +48,7 @@
48 </notify> 48 </notify>
49 <notify name="UploadPayment"> 49 <notify name="UploadPayment">
50 <message name="message"> 50 <message name="message">
51 Le chargement a coûté [AMOUNT] $L. 51 Le chargement a coûté [AMOUNT] L$.
52 </message> 52 </message>
53 </notify> 53 </notify>
54 <notify name="UploadingSnapshot"> 54 <notify name="UploadingSnapshot">
@@ -100,7 +100,7 @@ Merci de réessayer.
100 </notify> 100 </notify>
101 <notify name="UnableToLoadLandmark"> 101 <notify name="UnableToLoadLandmark">
102 <message name="message"> 102 <message name="message">
103 Impossible de charger le repère. Merci de réessayer. 103 Impossible de charger le repère. Merci de réessayer.
104 </message> 104 </message>
105 </notify> 105 </notify>
106 <notify name="CapsKeyOn"> 106 <notify name="CapsKeyOn">
@@ -143,7 +143,7 @@ Merci de réessayer.
143 </notify> 143 </notify>
144 <notify name="UnableToLoadScript"> 144 <notify name="UnableToLoadScript">
145 <message name="message"> 145 <message name="message">
146 Impossible de charger le script. Merci de réessayer. 146 Impossible de charger le script. Merci de réessayer.
147 </message> 147 </message>
148 </notify> 148 </notify>
149 <notify name="IncompleteInventory"> 149 <notify name="IncompleteInventory">
@@ -198,12 +198,12 @@ propriétaires différents. Veuillez sélectionner un seul objet.
198 </notify> 198 </notify>
199 <notify name="EnteringGodMode"> 199 <notify name="EnteringGodMode">
200 <message name="message"> 200 <message name="message">
201 Activation du mode admin : niveau [LEVEL] 201 Activation du mode divin : niveau [LEVEL]
202 </message> 202 </message>
203 </notify> 203 </notify>
204 <notify name="LeavingGodMode"> 204 <notify name="LeavingGodMode">
205 <message name="message"> 205 <message name="message">
206 Désactivation du mode admin : niveau [LEVEL] 206 Désactivation du mode divin : niveau [LEVEL]
207 </message> 207 </message>
208 </notify> 208 </notify>
209 <notify name="CopyFailed"> 209 <notify name="CopyFailed">
@@ -307,7 +307,7 @@ Veuillez sélectionner un terrain plus petit.
307 </notify> 307 </notify>
308 <notify name="TransferObjectsHighlighted"> 308 <notify name="TransferObjectsHighlighted">
309 <message name="message"> 309 <message name="message">
310 Tous les objets sur cette parcelle qui seront 310 Tous les objets de cette parcelle qui seront
311transférés à l&apos;acheteur sont maintenant mis en surbrillance. 311transférés à l&apos;acheteur sont maintenant mis en surbrillance.
312 312
313* Les arbres et la pelouse qui seront transférés ne sont pas mis en surbrillance. 313* Les arbres et la pelouse qui seront transférés ne sont pas mis en surbrillance.
@@ -348,7 +348,7 @@ ont été renvoyés dans votre inventaire.
348 </notify> 348 </notify>
349 <notify name="OtherObjectsReturned2"> 349 <notify name="OtherObjectsReturned2">
350 <message name="message"> 350 <message name="message">
351 Les objets sur la parcelle de terrain 351 Les objets sur la parcelle
352appartenant à « [NAME] » 352appartenant à « [NAME] »
353ont étés renvoyés à leur propriétaire. 353ont étés renvoyés à leur propriétaire.
354 </message> 354 </message>
@@ -368,7 +368,7 @@ Les objets non transférables donnés au groupe ont étés supprimés.
368 <notify name="NotSafe"> 368 <notify name="NotSafe">
369 <message name="message"> 369 <message name="message">
370 Les dégâts sont autorisés sur ce terrain (« non sécurisé »). 370 Les dégâts sont autorisés sur ce terrain (« non sécurisé »).
371Vous pouvez être blessé ici. Si vous décédez, vous serez téléporté à votre domicile. 371Vous pouvez être blessé ici. Si vous décédez, vous serez téléporté à votre domicile.
372 </message> 372 </message>
373 </notify> 373 </notify>
374 <notify name="NoFly"> 374 <notify name="NoFly">
@@ -494,7 +494,7 @@ Aucun script n&apos;est exécuté à part ceux du propriétaire du terrain.
494 <message name="message"> 494 <message name="message">
495 [NAME] vous invite à 495 [NAME] vous invite à
496rejoindre un groupe comme officier. 496rejoindre un groupe comme officier.
497L&apos;adhésion est gratuite. 497L&apos;inscription est gratuite.
498 498
499[MESSAGE] 499[MESSAGE]
500 </message> 500 </message>
@@ -512,7 +512,7 @@ L&apos;adhésion est gratuite.
512 <message name="message"> 512 <message name="message">
513 [NAME] vous invite à 513 [NAME] vous invite à
514rejoindre un groupe. 514rejoindre un groupe.
515L&apos;adhésion coûte [COST] $L. 515L&apos;inscription coûte [COST] L$.
516 516
517[MESSAGE] 517[MESSAGE]
518 </message> 518 </message>
@@ -530,7 +530,7 @@ L&apos;adhésion coûte [COST] $L.
530 <message name="message"> 530 <message name="message">
531 [NAME] vous invite à 531 [NAME] vous invite à
532rejoindre un groupe. 532rejoindre un groupe.
533L&apos;adhésion est gratuite. 533L&apos;inscription est gratuite.
534 534
535[MESSAGE] 535[MESSAGE]
536 </message> 536 </message>
@@ -576,7 +576,7 @@ le/la rejoindre par téléportation :
576 576
577[MESSAGE] 577[MESSAGE]
578 578
579(Par défaut, vous pourrez voir chacun si l&apos;autre est connecté.) 579(Par défaut, vous pourrez voir lorsque vous êtes tous deux connectés.)
580 </message> 580 </message>
581 <option name="Accept"> 581 <option name="Accept">
582 Accepter 582 Accepter
@@ -625,13 +625,13 @@ vous permet d&apos;envoyer rapidement un IM à ce résident.
625 <notify name="RegionRestartMinutes"> 625 <notify name="RegionRestartMinutes">
626 <message name="message"> 626 <message name="message">
627 La région va redémarrer dans [MINUTES] minutes. 627 La région va redémarrer dans [MINUTES] minutes.
628Si vous restez dans cette région, vous serez déconnecté. 628Si vous restez dans cette région, vous serez déconnecté(e).
629 </message> 629 </message>
630 </notify> 630 </notify>
631 <notify name="RegionRestartSeconds"> 631 <notify name="RegionRestartSeconds">
632 <message name="message"> 632 <message name="message">
633 La région va redémarrer dans [SECONDS] secondes. 633 La région va redémarrer dans [SECONDS] secondes.
634Si vous restez dans cette région, vous serez déconnecté. 634Si vous restez dans cette région, vous serez déconnecté(e).
635 </message> 635 </message>
636 </notify> 636 </notify>
637 <notify name="LoadWebPage"> 637 <notify name="LoadWebPage">
@@ -640,7 +640,7 @@ Si vous restez dans cette région, vous serez déconnecté.
640 640
641[MESSAGE] 641[MESSAGE]
642 642
643Venant de l&apos;objet : [OBJECTNAME], appartenant à : [NAME]? 643Venant de l&apos;objet : [OBJECTNAME], appartenant à : [NAME]?
644 </message> 644 </message>
645 <option name="Gotopage"> 645 <option name="Gotopage">
646 Aller sur cette page 646 Aller sur cette page
@@ -679,7 +679,7 @@ Réessayez dans une minute le temps de résoudre le problème.
679 </notify> 679 </notify>
680 <notify name="ScriptTakeMoney"> 680 <notify name="ScriptTakeMoney">
681 <message name="message"> 681 <message name="message">
682 Débite vos dollars Linden ($L) 682 Débite vos dollars Linden (L$)
683 </message> 683 </message>
684 </notify> 684 </notify>
685 <notify name="ActOnControlInputs"> 685 <notify name="ActOnControlInputs">
@@ -751,22 +751,22 @@ Acceptez-vous ?
751 </notify> 751 </notify>
752 <notify name="ScriptQuestionCautionChatGranted"> 752 <notify name="ScriptQuestionCautionChatGranted">
753 <message name="message"> 753 <message name="message">
754 &apos;[OBJECTNAME]&apos;, un objet appartenant à &apos;[OWNERNAME]&apos;, situé dans [REGIONNAME] à [REGIONPOS], a reçu la permission de : [PERMISSIONS]. 754 &apos;[OBJECTNAME]&apos;, un objet appartenant à [OWNERNAME], situé dans [REGIONNAME] à [REGIONPOS], a reçu la permission de : [PERMISSIONS].
755 </message> 755 </message>
756 </notify> 756 </notify>
757 <notify name="ScriptQuestionCautionChatDenied"> 757 <notify name="ScriptQuestionCautionChatDenied">
758 <message name="message"> 758 <message name="message">
759 &apos;[OBJECTNAME]&apos;, un objet appartenant à &apos;[OWNERNAME]&apos;, situé dans [REGIONNAME] à [REGIONPOS], n&apos;a pas reçu la permission de : [PERMISSIONS]. 759 &apos;[OBJECTNAME]&apos;, un objet appartenant à [OWNERNAME], situé dans [REGIONNAME] à [REGIONPOS], n&apos;a pas reçu la permission de : [PERMISSIONS].
760 </message> 760 </message>
761 </notify> 761 </notify>
762 <notify name="ScriptQuestionCautionWarn"> 762 <notify name="ScriptQuestionCautionWarn">
763 <message name="message"> 763 <message name="message">
764 Un objet demande la permission de prélever des dollars Linden ($L) sur votre compte. 764 Un objet demande la permission de prélever des dollars Linden (L$) sur votre compte.
765 </message> 765 </message>
766 </notify> 766 </notify>
767 <notify name="ScriptQuestionCaution"> 767 <notify name="ScriptQuestionCaution">
768 <message name="message"> 768 <message name="message">
769 &apos;[OBJECTNAME]&apos;, un objet appartenant à &apos;[NAME]&apos;, aimerait : 769 [OBJECTNAME], un objet appartenant à [NAME], aimerait :
770 770
771[QUESTIONS] 771[QUESTIONS]
772Si vous n&apos;avez pas confiance en cet objet ni en son créateur, vous devriez refuser cette requête. Pour plus d&apos;informations, cliquez sur le bouton Détails. 772Si vous n&apos;avez pas confiance en cet objet ni en son créateur, vous devriez refuser cette requête. Pour plus d&apos;informations, cliquez sur le bouton Détails.
@@ -803,14 +803,14 @@ Accepter cette requête ?
803 </notify> 803 </notify>
804 <notify name="FirstBalanceIncrease"> 804 <notify name="FirstBalanceIncrease">
805 <message name="message"> 805 <message name="message">
806 Vous venez de recevoir [AMOUNT] $L. 806 Vous venez de recevoir [AMOUNT] L$.
807Des objets et des utilisateurs peuvent vous donner des $L. 807Des objets et des utilisateurs peuvent vous donner des L$.
808Votre solde est affiché dans le coin en haut à droite de l&apos;écran. 808Votre solde est affiché dans le coin en haut à droite de l&apos;écran.
809 </message> 809 </message>
810 </notify> 810 </notify>
811 <notify name="FirstBalanceDecrease"> 811 <notify name="FirstBalanceDecrease">
812 <message name="message"> 812 <message name="message">
813 Vous venez de payer [AMOUNT] $L. 813 Vous venez de payer [AMOUNT] L$.
814Votre solde est affiché dans le coin en haut à droite de l&apos;écran. 814Votre solde est affiché dans le coin en haut à droite de l&apos;écran.
815 </message> 815 </message>
816 </notify> 816 </notify>
@@ -867,10 +867,10 @@ Vous pouvez modifier votre apparence aussi souvent que vous le souhaitez.
867 </notify> 867 </notify>
868 <notify name="FirstInventory"> 868 <notify name="FirstInventory">
869 <message name="message"> 869 <message name="message">
870 Il s&apos;agit de votre inventaire qui contient des objets, notes, vêtements, et autres choses que vous possédez. 870 Il s&apos;agit de votre inventaire qui contient des objets, notes, vêtements, et autres possessions.
871* Pour porter un objet ou le dossier contenant un ensemble complet, faites-le glisser sur vous-même. 871* Pour porter un objet ou le dossier contenant un ensemble complet, faites-le glisser sur vous-même.
872* Pour mettre un objet dans le monde, faites-le glisser sur le sol. 872* Pour mettre un objet dans le monde, faites-le glisser sur le sol.
873* Pour lire une notice, double-cliquez dessus. 873* Pour lire une note, double-cliquez dessus.
874 </message> 874 </message>
875 </notify> 875 </notify>
876 <notify name="FirstSandbox"> 876 <notify name="FirstSandbox">
@@ -944,7 +944,7 @@ Pour y participer, cliquez sur Accepter. Sinon, cliquez sur Refuser. Pour ignore
944 </notify> 944 </notify>
945 <notify name="VoiceInviteGroup"> 945 <notify name="VoiceInviteGroup">
946 <message name="message"> 946 <message name="message">
947 [NAME] a rejoint un chat oral avec le groupe [GROUP]. 947 [NAME] a rejoint un chat vocal avec le groupe [GROUP].
948Pour y participer, cliquez sur Accepter. Sinon, cliquez sur Refuser. Pour ignorer cette personne, cliquez sur Ignorer. 948Pour y participer, cliquez sur Accepter. Sinon, cliquez sur Refuser. Pour ignorer cette personne, cliquez sur Ignorer.
949 </message> 949 </message>
950 <option name="Accept"> 950 <option name="Accept">
@@ -994,7 +994,7 @@ Pour y participer, cliquez sur Accepter. Sinon, cliquez sur Refuser. Pour ignore
994 </notify> 994 </notify>
995 <notify name="ProximalVoiceChannelFull"> 995 <notify name="ProximalVoiceChannelFull">
996 <message name="message"> 996 <message name="message">
997 Nous sommes désolés. Le nombre maximum de conversations orales a été atteint dans cette zone. Veuillez trouver un autre endroit pour discuter. 997 Nous sommes désolés. Le nombre maximum de conversations vocales a été atteint dans cette zone. Veuillez trouver un autre endroit pour discuter.
998 </message> 998 </message>
999 </notify> 999 </notify>
1000 <notify name="VoiceChannelDisconnected"> 1000 <notify name="VoiceChannelDisconnected">
@@ -1044,7 +1044,7 @@ Pour y participer, cliquez sur Accepter. Sinon, cliquez sur Refuser. Pour ignore
1044 </notify> 1044 </notify>
1045 <notify name="VoiceNotAllowed"> 1045 <notify name="VoiceNotAllowed">
1046 <message name="message"> 1046 <message name="message">
1047 Vous n&apos;êtes pas autorisé à vous connecter au chat oral pour [VOICE_CHANNEL_NAME]. 1047 Vous n&apos;êtes pas autorisé à vous connecter au chat vocal pour [VOICE_CHANNEL_NAME].
1048 </message> 1048 </message>
1049 </notify> 1049 </notify>
1050 <notify name="VoiceCallGenericError"> 1050 <notify name="VoiceCallGenericError">
diff --git a/linden/indra/newview/skins/default/xui/fr/panel_audio.xml b/linden/indra/newview/skins/default/xui/fr/panel_audio.xml
index f2be953..380d952 100644
--- a/linden/indra/newview/skins/default/xui/fr/panel_audio.xml
+++ b/linden/indra/newview/skins/default/xui/fr/panel_audio.xml
@@ -1,10 +1,10 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 1<?xml version="1.0" encoding="utf-8" standalone="yes"?>
2<panel label="Audio et Vidéo" name="Media panel"> 2<panel label="Audio et Vidéo" name="Media panel">
3 <slider label="Master" name="System Volume" label_width="65" /> 3 <slider label="Principal" label_width="65" name="System Volume"/>
4 <slider label="Musique" name="Music Volume" label_width="65" /> 4 <slider label="Musique" label_width="65" name="Music Volume"/>
5 <slider label="Média" name="Media Volume" label_width="65" /> 5 <slider label="Média" label_width="65" name="Media Volume"/>
6 <slider label="Voix" name="Voice Volume" label_width="65" /> 6 <slider label="Voix" label_width="65" name="Voice Volume"/>
7 <slider label="Sons" name="SFX Volume" label_width="65"/> 7 <slider label="Sons" label_width="65" name="SFX Volume"/>
8 <slider label="Son ambiant" name="Wind Volume" label_width="65" /> 8 <slider label="Son ambiant" label_width="65" name="Wind Volume"/>
9 <slider label="UI" name="UI Volume" label_width="65"/> 9 <slider label="Interface" label_width="65" name="UI Volume"/>
10</panel> 10</panel>
diff --git a/linden/indra/newview/skins/default/xui/fr/panel_audio_device.xml b/linden/indra/newview/skins/default/xui/fr/panel_audio_device.xml
index 8663fe1..7ca53b7 100644
--- a/linden/indra/newview/skins/default/xui/fr/panel_audio_device.xml
+++ b/linden/indra/newview/skins/default/xui/fr/panel_audio_device.xml
@@ -1,4 +1,4 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 1<?xml version="1.0" encoding="utf-8" standalone="yes"?>
2<panel name="device_settings"> 2<panel name="device_settings">
3 <text name="Audio Devices"> 3 <text name="Audio Devices">
4 Matériel audio 4 Matériel audio
@@ -7,16 +7,15 @@
7 Périphérique d&apos;entrée (micro) : 7 Périphérique d&apos;entrée (micro) :
8 </text> 8 </text>
9 <text name="Output device (speakers):"> 9 <text name="Output device (speakers):">
10 Périphérique de sortie (speakers) : 10 Périphérique de sortie (haut-parleurs) :
11 </text> 11 </text>
12 <text name="Input level:"> 12 <text name="Input level:">
13 Volume d&apos;entrée 13 Volume d&apos;entrée
14 </text> 14 </text>
15 <text_editor name="voice_intro_text1"> 15 <text_editor name="voice_intro_text1">
16 Pour que les autres résidents vous entendent plus ou moins fort, utilisez le curseur. Pour tester le volume d&apos;entrée, il vous suffit de parler dans le micro. 16 Pour que les autres résidents vous entendent plus ou moins fort, utilisez le curseur. Pour tester le volume, parlez dans le micro.
17 </text_editor> 17 </text_editor>
18 <volume_slider name="mic_volume_slider" 18 <volume_slider name="mic_volume_slider" tool_tip="Réglez le volume avec ce curseur."/>
19 tool_tip="Réglez le volume à l&apos;aide de ce curseur." />
20 <text name="wait_text"> 19 <text name="wait_text">
21 Veuillez patienter 20 Veuillez patienter
22 </text> 21 </text>
diff --git a/linden/indra/newview/skins/default/xui/fr/panel_avatar.xml b/linden/indra/newview/skins/default/xui/fr/panel_avatar.xml
index 548020c..bb49a1b 100644
--- a/linden/indra/newview/skins/default/xui/fr/panel_avatar.xml
+++ b/linden/indra/newview/skins/default/xui/fr/panel_avatar.xml
@@ -1,4 +1,4 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 1<?xml version="1.0" encoding="utf-8" standalone="yes"?>
2<panel name="Panel Avatar"> 2<panel name="Panel Avatar">
3 <tab_container name="tab"> 3 <tab_container name="tab">
4 <panel label="2nd Life" name="2nd Life"> 4 <panel label="2nd Life" name="2nd Life">
@@ -16,7 +16,7 @@
16 Membre originaire 16 Membre originaire
17 </string> 17 </string>
18 <string name="AcctTypeEmployee"> 18 <string name="AcctTypeEmployee">
19 Employé de Linden Lab 19 Employé(e) de Linden Lab
20 </string> 20 </string>
21 <string name="PaymentInfoUsed"> 21 <string name="PaymentInfoUsed">
22 Infos de paiement utilisées 22 Infos de paiement utilisées
@@ -37,7 +37,7 @@
37 Nom : 37 Nom :
38 </text> 38 </text>
39 <text name="online_yes"> 39 <text name="online_yes">
40 Connecté actuellement 40 Actuellement connecté(e)
41 </text> 41 </text>
42 <text name="label"> 42 <text name="label">
43 Né(e) le : 43 Né(e) le :
@@ -45,21 +45,18 @@
45 <text name="label2"> 45 <text name="label2">
46 Compte : 46 Compte :
47 </text> 47 </text>
48 <text name="partner_label" 48 <text name="partner_label" tool_tip="Partenaire sur Second Life. Pour en savoir plus, allez sur www.secondlife.com/partner">
49 tool_tip="Partenaire sur Second Life. Pour en savoir plus, allez sur www.secondlife.com/partner">
50 Partenaire : 49 Partenaire :
51 </text> 50 </text>
52 <button label="i" label_selected="i" left_delta="62" name="partner_info" 51 <button label="i" label_selected="i" left_delta="62" name="partner_info" tool_tip="Cliquez pour ouvrir le profil du partenaire"/>
53 tool_tip="Cliquez pour ouvrir le profil du partenaire" /> 52 <button label="?" label_selected="?" left_delta="24" name="partner_help"/>
54 <button label="?" label_selected="?" left_delta="24" name="partner_help" /> 53 <line_editor name="partner_edit" tool_tip="Partenaire sur Second Life. Pour en savoir plus, allez sur www.secondlife.com/partner">
55 <line_editor name="partner_edit"
56 tool_tip="Partenaire sur Second Life. Pour en savoir plus, allez sur www.secondlife.com/partner">
57 [FIRST] [LAST] 54 [FIRST] [LAST]
58 </line_editor> 55 </line_editor>
59 <text name="Photo:"> 56 <text name="Photo:">
60 Photo : 57 Photo :
61 </text> 58 </text>
62 <texture_picker label="" name="img" tool_tip="Cliquez pour sélectionner une image" /> 59 <texture_picker label="" name="img" tool_tip="Cliquez pour sélectionner une image"/>
63 <text name="Groups:"> 60 <text name="Groups:">
64 Groupes : 61 Groupes :
65 </text> 62 </text>
@@ -70,28 +67,22 @@
70 (500 car.) 67 (500 car.)
71 </text> 68 </text>
72 <text name="Give item:"> 69 <text name="Give item:">
73 Donner objet : 70 Donner des objets :
74 </text> 71 </text>
75 <text name="Give inventory" 72 <text name="Give inventory" tool_tip="Mettez les objets de l&apos;inventaire ici pour les donner à cette personne.">
76 tool_tip="Mettez les objets de l&apos;inventaire ici pour les donner à cette personne."> 73 Mettez les objets à transférer ici.
77 Mettez les objets de l&apos;inventaire ici. 74 </text>
78 </text> 75 <check_box label="Afficher dans la recherche" name="allow_publish" tool_tip="Publiez des infos suplémentaires telles qu&apos;une description et une image dans la Recherche."/>
79 <check_box label="Afficher dans la recherche" name="allow_publish" 76 <button label="?" label_selected="?" left_delta="160" name="?"/>
80 tool_tip="Publiez des infos suplémentaires telles qu&apos;une description et une image dans la Recherche." /> 77 <button label="Localiser" label_selected="Localiser" name="Find on Map"/>
81 <button label="?" label_selected="?" left_delta="160" name="?" /> 78 <button label="Proposer téléportation..." label_selected="Proposer téléportation..." name="Offer Teleport..."/>
82 <button label="Localiser" label_selected="Localiser" name="Find on Map" /> 79 <button label="Devenir amis..." label_selected="Devenir amis..." name="Add Friend..."/>
83 <button label="Offrir téléportation..." label_selected="Offrir téléportation..." 80 <button label="Payer..." label_selected="Payer..." name="Pay..."/>
84 name="Offer Teleport..." /> 81 <button label="Message instantané..." label_selected="Message instantané..." name="Instant Message..." tool_tip="Message instantané (IM)"/>
85 <button label="Ajouter comme ami..." label_selected="Ajouter comme ami..." 82 <button label="Ignorer" label_selected="Ignorer" name="Mute"/>
86 name="Add Friend..." />
87 <button label="Payer..." label_selected="Payer..." name="Pay..." />
88 <button label="Message instantané..." label_selected="Message instantané..."
89 name="Instant Message..." tool_tip="Message instantané (IM)" />
90 <button label="Ignorer" label_selected="Ignorer" name="Mute" />
91 </panel> 83 </panel>
92 <panel label="Web" name="WebProfile"> 84 <panel label="Web" name="WebProfile">
93 <flyout_button label="Charger" label_selected="Charger" name="load" 85 <flyout_button label="Charger" label_selected="Charger" name="load" tool_tip="Charger cette page du profil avec le navigateur web incorporé.">
94 tool_tip="Charger cette page du profil avec le navigateur web incorporé.">
95 <flyout_button_item name="open_item"> 86 <flyout_button_item name="open_item">
96 Dans un navigateur externe 87 Dans un navigateur externe
97 </flyout_button_item> 88 </flyout_button_item>
@@ -99,42 +90,40 @@
99 URL du domicile 90 URL du domicile
100 </flyout_button_item> 91 </flyout_button_item>
101 </flyout_button> 92 </flyout_button>
102 <button label="?" label_selected="?" name="web_profile_help" /> 93 <button label="?" label_selected="?" name="web_profile_help"/>
103 <check_box label="Charger automatiquement les profils du web" name="auto_load" 94 <check_box label="Charger directement la page web" name="auto_load" tool_tip="Charger automatiquement toutes les pages web des profils sans demander au préalable."/>
104 tool_tip="Charger automatiquement toutes les pages web des profils sans demander au préalable." />
105 </panel> 95 </panel>
106 <panel label="Intérêts" name="Interests"> 96 <panel label="Intérêts" name="Interests">
107 <text left="2" name="I Want To:"> 97 <text left="2" name="I Want To:">
108 Je veux : 98 Je veux :
109 </text> 99 </text>
110 <check_box label="Construire" name="chk0" /> 100 <check_box label="Construire" name="chk0"/>
111 <check_box label="Explorer" left_delta="160" name="chk1" /> 101 <check_box label="Explorer" left_delta="160" name="chk1"/>
112 <check_box label="Faire des rencontres" left_delta="-160" name="chk2" /> 102 <check_box label="Faire des rencontres" left_delta="-160" name="chk2"/>
113 <check_box label="Être engagé" left_delta="160" name="chk6" /> 103 <check_box label="Être engagé" left_delta="160" name="chk6"/>
114 <check_box label="Rejoindre un groupe" left_delta="-160" name="chk3" /> 104 <check_box label="Rejoindre un groupe" left_delta="-160" name="chk3"/>
115 <check_box label="Acheter" left_delta="160" name="chk4" /> 105 <check_box label="Acheter" left_delta="160" name="chk4"/>
116 <check_box label="Vendre" left_delta="-160" name="chk5" /> 106 <check_box label="Vendre" left_delta="-160" name="chk5"/>
117 <check_box label="Recruter" left_delta="160" name="chk7" /> 107 <check_box label="Recruter" left_delta="160" name="chk7"/>
118 <text left="2" name="Skills:"> 108 <text left="2" name="Skills:">
119 Mes talents : 109 Mes talents :
120 </text> 110 </text>
121 <check_box label="Textures" name="schk0" /> 111 <check_box label="Textures" name="schk0"/>
122 <check_box label="Architecture" left_delta="160" name="schk1" /> 112 <check_box label="Architecture" left_delta="160" name="schk1"/>
123 <check_box label="Organisation d&apos;événements" name="schk2" /> 113 <check_box label="Organisation d&apos;événements" name="schk2"/>
124 <check_box label="Modélisation" left_delta="-160" name="schk3" /> 114 <check_box label="Modélisation" left_delta="-160" name="schk3"/>
125 <check_box label="Rédaction de scripts" name="schk4" /> 115 <check_box label="Rédaction de scripts" name="schk4"/>
126 <check_box label="Customisation de personnages" left_delta="160" name="schk5" /> 116 <check_box label="Customisation de personnages" left_delta="160" name="schk5"/>
127 <text left="2" name="Languages:"> 117 <text left="2" name="Languages:">
128 Langues : 118 Langues :
129 </text> 119 </text>
130 </panel> 120 </panel>
131 <panel label="Favoris" name="Picks"> 121 <panel label="Favoris" name="Picks">
132 <text left="10" name="Tell everyone about your favorite places in Second Life." 122 <text left="10" name="Tell everyone about your favorite places in Second Life." width="412">
133 width="412">
134 Faites connaître aux autres résidents vos endroits favoris dans Second Life. 123 Faites connaître aux autres résidents vos endroits favoris dans Second Life.
135 </text> 124 </text>
136 <button label="Créer..." label_selected="Créer..." name="New..." /> 125 <button label="Créer..." label_selected="Créer..." name="New..."/>
137 <button label="Supprimer..." label_selected="Supprimer..." name="Delete..." /> 126 <button label="Supprimer..." label_selected="Supprimer..." name="Delete..."/>
138 <text name="loading_text"> 127 <text name="loading_text">
139 Chargement en cours... 128 Chargement en cours...
140 </text> 129 </text>
@@ -143,8 +132,8 @@
143 <text name="Place an ad in Second Life&apos;s classified listings."> 132 <text name="Place an ad in Second Life&apos;s classified listings.">
144 Passez une petite annonce sur Second Life. 133 Passez une petite annonce sur Second Life.
145 </text> 134 </text>
146 <button label="Créer..." label_selected="Créer..." name="New..." /> 135 <button label="Créer..." label_selected="Créer..." name="New..."/>
147 <button label="Supprimer..." label_selected="Supprimer..." name="Delete..." /> 136 <button label="Supprimer..." label_selected="Supprimer..." name="Delete..."/>
148 <text name="loading_text"> 137 <text name="loading_text">
149 Chargement en cours... 138 Chargement en cours...
150 </text> 139 </text>
@@ -153,7 +142,7 @@
153 <text name="Photo:"> 142 <text name="Photo:">
154 Photo : 143 Photo :
155 </text> 144 </text>
156 <texture_picker label="" name="img" tool_tip="Cliquez pour sélectionner une photo" /> 145 <texture_picker label="" name="img" tool_tip="Cliquez pour sélectionner une photo"/>
157 <text name="Info:"> 146 <text name="Info:">
158 Infos : 147 Infos :
159 </text> 148 </text>
@@ -167,22 +156,19 @@
167 </string> 156 </string>
168 <text name="label"> 157 <text name="label">
169 Dans cet espace, vous pouvez enregistrer vos remarques au sujet de ce 158 Dans cet espace, vous pouvez enregistrer vos remarques au sujet de ce
170résident. Vous pouvez aussi utiliser cet onglet pour prendre des notes sur 159résident ou prendre des notes sur certains projets. Vous êtes le seul à
171certains projets. Vous êtes le seul à pouvoir y accéder. Même le résident 160pouvoir accéder à cet espace et même le résident dont vous consultez le profil
172dont vous consultez le profil actuellement ne peut pas voir vos notes. 161ne pourra pas voir ce que vous avez écrit.
173 </text> 162 </text>
174 <text_editor bottom_delta="-260" height="240" name="notes edit" /> 163 <text_editor bottom_delta="-260" height="240" name="notes edit"/>
175 </panel> 164 </panel>
176 </tab_container> 165 </tab_container>
177 <button label="OK" label_selected="OK" name="OK" /> 166 <button label="OK" label_selected="OK" name="OK"/>
178 <button label="Annuler" label_selected="Annuler" name="Cancel" /> 167 <button label="Annuler" label_selected="Annuler" name="Cancel"/>
179 <button label="Vider" label_selected="Vider" name="Kick" /> 168 <button label="Éjecter" label_selected="Éjecter" name="Kick"/>
180 <button label="Geler" label_selected="Geler" name="Freeze" 169 <button label="Geler" label_selected="Geler" name="Freeze" tool_tip="Empêcher ce résident de bouger et de chatter."/>
181 tool_tip="Empêcher ce résident de bouger et de chatter." /> 170 <button label="Dégeler" label_selected="Dégeler" name="Unfreeze" tool_tip="Dégeler le résident"/>
182 <button label="Dégeler" label_selected="Dégeler" name="Unfreeze" 171 <button label="Admin" label_selected="Admin" name="csr_btn" tool_tip="Contacter le Service Clientèle pour ce résident"/>
183 tool_tip="Dégeler le résident" />
184 <button label="Admin" label_selected="Admin" name="csr_btn"
185 tool_tip="Contacter le Service Clientèle pour ce résident" />
186 <string name="ShowOnMapNonFriend"> 172 <string name="ShowOnMapNonFriend">
187 Voir sur la carte. 173 Voir sur la carte.
188Ceci n&apos;est pas possible car vous 174Ceci n&apos;est pas possible car vous
@@ -200,7 +186,7 @@ n&apos;êtes pas ami avec cette personne.
200 Téléporter le résident là où vous êtes de force. 186 Téléporter le résident là où vous êtes de force.
201 </string> 187 </string>
202 <string name="TeleportPrelude"> 188 <string name="TeleportPrelude">
203 Offrir au résident d&apos;être téléporté là où vous êtes. 189 Proposer au résident d&apos;être téléporté là où vous êtes.
204Ceci n&apos;est pas possible tant que vous êtes sur l&apos;île d&apos;orientation. 190Ceci n&apos;est pas possible tant que vous êtes sur l&apos;île d&apos;orientation.
205 </string> 191 </string>
206 <string name="TeleportNormal"> 192 <string name="TeleportNormal">
diff --git a/linden/indra/newview/skins/default/xui/fr/panel_avatar_classified.xml b/linden/indra/newview/skins/default/xui/fr/panel_avatar_classified.xml
index 3074e95..b43b1fe 100644
--- a/linden/indra/newview/skins/default/xui/fr/panel_avatar_classified.xml
+++ b/linden/indra/newview/skins/default/xui/fr/panel_avatar_classified.xml
@@ -1,16 +1,14 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 1<?xml version="1.0" encoding="utf-8" standalone="yes"?>
2<panel name="Classified" title="Annonces"> 2<panel name="Classified" title="Annonces">
3 <line_editor name="given_name_editor" 3 <line_editor name="given_name_editor" tool_tip="Le nom doit commencer par une lettre ou un chiffre, et non un signe de ponctuation."/>
4 tool_tip="Le nom doit commencer par une lettre ou un chiffre, et non un signe de ponctuation." /> 4 <line_editor name="location_editor" tool_tip="Définir votre position actuelle comme emplacement pour cette annonce."/>
5 <line_editor name="location_editor" 5 <button label="Définir position" name="set_location_btn"/>
6 tool_tip="Définir votre position actuelle comme emplacement pour cette annonce." /> 6 <button label="Téléporter" name="classified_teleport_btn"/>
7 <button label="Définir position" name="set_location_btn" /> 7 <button label="Carte" name="classified_map_btn"/>
8 <button label="Téléporter" name="classified_teleport_btn" /> 8 <combo_box label="" name="classified_category_combo"/>
9 <button label="Carte" name="classified_map_btn" />
10 <combo_box label="" name="classified_category_combo" />
11 <check_box label="Adulte" name="classified_mature_check"> 9 <check_box label="Adulte" name="classified_mature_check">
12 <combo_item name="select_mature"> 10 <combo_item name="select_mature">
13 - Pour adultes - 11 - Type de public -
14 </combo_item> 12 </combo_item>
15 <combo_item name="mature"> 13 <combo_item name="mature">
16 Contenu réservé aux adultes 14 Contenu réservé aux adultes
@@ -19,18 +17,16 @@
19 Contenu non réservé aux adultes 17 Contenu non réservé aux adultes
20 </combo_item> 18 </combo_item>
21 </check_box> 19 </check_box>
22 <text name="classified_info_text" 20 <text name="classified_info_text" tool_tip="Plus vous payez cher pour votre annonce, mieux elle est placée dans la liste.">
23 tool_tip="Plus vous payez pour votre annonce, mieux elle est placée dans la liste."> 21 Annonce passée, pas encore publiée
24 Annonce passée : pas encore publiée
25 </text> 22 </text>
26 <text name="click_through_text" 23 <text name="click_through_text" tool_tip="Nombre total de clics sur chaque bouton depuis la parution de l&apos;annonce.">
27 tool_tip="Nombre total de clics sur chaque bouton depuis la parution de l&apos;annonce.">
28 Clics : 24 Clics :
29 </text> 25 </text>
30 <button label="Publier..." name="classified_update_btn" /> 26 <button label="Publier..." name="classified_update_btn"/>
31 <check_box label="Republier chaque semaine" name="auto_renew_check" /> 27 <check_box label="Publier chaque semaine" name="auto_renew_check"/>
32 <text name="ad_placed_paid"> 28 <text name="ad_placed_paid">
33 Annonce passée : [DATE], a payé [AMT] $L pour l&apos;annonce. 29 Annonce passée le : [DATE]. Prix : [AMT] L$.
34 </text> 30 </text>
35 <string name="update_txt"> 31 <string name="update_txt">
36 Mise à jour 32 Mise à jour
diff --git a/linden/indra/newview/skins/default/xui/fr/panel_classified.xml b/linden/indra/newview/skins/default/xui/fr/panel_classified.xml
index 37b632d..1797015 100644
--- a/linden/indra/newview/skins/default/xui/fr/panel_classified.xml
+++ b/linden/indra/newview/skins/default/xui/fr/panel_classified.xml
@@ -1,13 +1,11 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 1<?xml version="1.0" encoding="utf-8" standalone="yes"?>
2<panel name="Classified" title="Annonces"> 2<panel name="Classified" title="Annonces">
3 <line_editor name="given_name_editor" 3 <line_editor name="given_name_editor" tool_tip="Le nom doit commencer par une lettre ou un chiffre, et non un signe de ponctuation."/>
4 tool_tip="Le nom doit commencer par une lettre ou un chiffre, et non un signe de ponctuation." /> 4 <line_editor name="location_editor" tool_tip="Définir votre position actuelle comme emplacement pour cette annonce."/>
5 <line_editor name="location_editor" 5 <button label="Définir" name="set_location_btn"/>
6 tool_tip="Définir votre position actuelle comme emplacement pour cette annonce." /> 6 <button label="Téléporter" name="classified_teleport_btn"/>
7 <button label="Définir" name="set_location_btn" /> 7 <button label="Voir sur la carte" name="classified_map_btn" width="115"/>
8 <button label="Téléporter" name="classified_teleport_btn" /> 8 <button label="Profil" left="245" name="classified_profile_btn"/>
9 <button label="Voir sur la carte" name="classified_map_btn" width="115" />
10 <button label="Profil" left="245" name="classified_profile_btn" />
11 <check_box label="Adulte" name="classified_mature_check"> 9 <check_box label="Adulte" name="classified_mature_check">
12 <combo_item name="select_mature"> 10 <combo_item name="select_mature">
13 - Sélectionner Pour adultes - 11 - Sélectionner Pour adultes -
@@ -19,10 +17,10 @@
19 Contenu non réservé aux adultes 17 Contenu non réservé aux adultes
20 </combo_item> 18 </combo_item>
21 </check_box> 19 </check_box>
22 <combo_box label="" name="classified_category_combo" /> 20 <combo_box label="" name="classified_category_combo"/>
23 <button label="Mise à jour" name="classified_update_btn" /> 21 <button label="Mise à jour" name="classified_update_btn"/>
24 <string name="ad_placed_paid"> 22 <string name="ad_placed_paid">
25 Annonce passée  : [DATE], a payé [AMT] $L pour l&apos;annonce. 23 Annonce passée le : [DATE]. Prix : [AMT] L$.
26 </string> 24 </string>
27 <string name="update_txt"> 25 <string name="update_txt">
28 Mise à jour 26 Mise à jour
diff --git a/linden/indra/newview/skins/default/xui/fr/panel_friends.xml b/linden/indra/newview/skins/default/xui/fr/panel_friends.xml
index f553287..e43305b 100644
--- a/linden/indra/newview/skins/default/xui/fr/panel_friends.xml
+++ b/linden/indra/newview/skins/default/xui/fr/panel_friends.xml
@@ -1,29 +1,20 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 1<?xml version="1.0" encoding="utf-8" standalone="yes"?>
2<panel name="friends"> 2<panel name="friends">
3 <string name="Multiple"> 3 <string name="Multiple">
4 Amis multiples... 4 Amis multiples...
5 </string> 5 </string>
6 <scroll_list name="friend_list" 6 <scroll_list name="friend_list" tool_tip="Pour sélectionner plusieurs amis, cliquez en maintenant la touche Maj ou Ctrl appuyée">
7 tool_tip="Pour sélectionner plusieurs amis, cliquez en maintenant la touche Maj ou Ctrl appuyée"> 7 <column name="icon_online_status" tool_tip="Statut en ligne"/>
8 <column name="icon_online_status" tool_tip="Statut en ligne" /> 8 <column label="Nom" name="friend_name" tool_tip="Nom"/>
9 <column label="Nom" name="friend_name" tool_tip="Nom" /> 9 <column name="icon_visible_online" tool_tip="Vos amis voient si vous êtes connecté(e)"/>
10 <column name="icon_visible_online" 10 <column name="icon_visible_map" tool_tip="Vos amis peuvent vous situer sur la carte"/>
11 tool_tip="Vos amis voient si vous êtes connecté(e)" /> 11 <column name="icon_edit_mine" tool_tip="Vos amis peuvent modifier, supprimer ou prendre vos objets"/>
12 <column name="icon_visible_map" tool_tip="Vos amis peuvent vous situer sur la carte" /> 12 <column name="icon_edit_theirs" tool_tip="Vous pouvez modifier les objets de cet ami"/>
13 <column name="icon_edit_mine"
14 tool_tip="Vos amis peuvent modifier, supprimer ou prendre vos objets" />
15 <column name="icon_edit_theirs" tool_tip="Vous pouvez modifier les objets de cet ami" />
16 </scroll_list> 13 </scroll_list>
17 <button label="IM/Appel" name="im_btn" 14 <button label="IM/Appel" name="im_btn" tool_tip="Ouvrez une session de messagerie instantanée"/>
18 tool_tip="Ouvrez une session de messagerie instantanée" /> 15 <button label="Profil" name="profile_btn" tool_tip="Affichez une photo, vos groupes et autres infos"/>
19 <button label="Profil" name="profile_btn" 16 <button label="Téléporter..." name="offer_teleport_btn" tool_tip="Proposez à cet ami d&apos;être téléporté là où vous êtes"/>
20 tool_tip="Affichez une photo, vos groupes et autres infos" /> 17 <button label="Payer..." name="pay_btn" tool_tip="Donnez des L$ à cet ami"/>
21 <button label="Téléporter..." name="offer_teleport_btn" 18 <button label="Supprimer..." name="remove_btn" tool_tip="Supprimez cette personne de votre liste d&apos;amis"/>
22 tool_tip="Proposez à cet ami d&apos;être téléporté là où vous êtes" /> 19 <button label="Ajouter..." name="add_btn" tool_tip="Demandez à un résident de devenir votre ami"/>
23 <button label="Payer..." name="pay_btn"
24 tool_tip="Donnez des dollars Linden ($L) à cet ami" />
25 <button label="Supprimer..." name="remove_btn"
26 tool_tip="Supprimez cette personne de votre liste d&apos;amis" />
27 <button label="Ajouter..." name="add_btn"
28 tool_tip="Demandez à un résident de devenir votre ami" />
29</panel> 20</panel>
diff --git a/linden/indra/newview/skins/default/xui/fr/panel_group_general.xml b/linden/indra/newview/skins/default/xui/fr/panel_group_general.xml
index 16e9890..b6814cf 100644
--- a/linden/indra/newview/skins/default/xui/fr/panel_group_general.xml
+++ b/linden/indra/newview/skins/default/xui/fr/panel_group_general.xml
@@ -1,4 +1,4 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 1<?xml version="1.0" encoding="utf-8" standalone="yes"?>
2<panel label="Général" name="general_tab"> 2<panel label="Général" name="general_tab">
3 <text name="help_text"> 3 <text name="help_text">
4 L&apos;onglet Général contient des infos générales sur le groupe, une liste des propriétaires et des membres visibles, les préférences relatives au groupe ainsi que différentes options concernant les membres. 4 L&apos;onglet Général contient des infos générales sur le groupe, une liste des propriétaires et des membres visibles, les préférences relatives au groupe ainsi que différentes options concernant les membres.
@@ -8,7 +8,7 @@ Pour obtenir de l&apos;aide, survolez les options avec votre souris.
8 <string name="group_info_unchanged"> 8 <string name="group_info_unchanged">
9 Les infos générales du groupe ont changé. 9 Les infos générales du groupe ont changé.
10 </string> 10 </string>
11 <button label="?" label_selected="?" name="help_button" /> 11 <button label="?" label_selected="?" name="help_button"/>
12 <line_editor label="Saisissez le nom du groupe ici" name="group_name_editor"> 12 <line_editor label="Saisissez le nom du groupe ici" name="group_name_editor">
13 Entrez le nom de votre nouveau groupe ici 13 Entrez le nom de votre nouveau groupe ici
14 </line_editor> 14 </line_editor>
@@ -24,14 +24,12 @@ Pour obtenir de l&apos;aide, survolez les options avec votre souris.
24 <text name="group_charter_label"> 24 <text name="group_charter_label">
25 Charte du groupe 25 Charte du groupe
26 </text> 26 </text>
27 <texture_picker label="Emblème du groupe" name="insignia" 27 <texture_picker label="Logo du groupe" name="insignia" tool_tip="Cliquez pour sélectionner une image"/>
28 tool_tip="Cliquez pour sélectionner une image" />
29 <text_editor name="charter"> 28 <text_editor name="charter">
30 Charte du groupe 29 Charte du groupe
31 </text_editor> 30 </text_editor>
32 <button label="Rejoindre (0$L)" label_selected="Rejoindre (0$L)" name="join_button" /> 31 <button label="Rejoindre (0L$)" label_selected="Rejoindre (0L$)" name="join_button"/>
33 <button label="Affichage détaillé" label_selected="Affichage détaillé" 32 <button label="Affichage détaillé" label_selected="Affichage détaillé" name="info_button"/>
34 name="info_button" />
35 <text> 33 <text>
36 Propriétaires et membres visibles 34 Propriétaires et membres visibles
37 </text> 35 </text>
@@ -56,48 +54,38 @@ Pour obtenir de l&apos;aide, survolez les options avec votre souris.
56 Extraction des données du résident en cours 54 Extraction des données du résident en cours
57 </text> 55 </text>
58 <text name="confirm_group_create_str"> 56 <text name="confirm_group_create_str">
59 La création de ce groupe coûte 100 $L. 57 La création de ce groupe coûte 100 L$.
60Êtes-vous vraiment certain de vouloir dépenser 100 $L pour créer ce groupe ? 58Êtes-vous vraiment certain de vouloir dépenser 100 L$ pour créer ce groupe ?
61Sachez que si personne ne rejoint ce groupe sous 48h, il sera démantelé et ne pourra plus être utilisé à l&apos;avenir. 59Sachez que si personne ne rejoint ce groupe sous 48h, il sera démantelé et ne pourra plus être utilisé à l&apos;avenir.
62 </text> 60 </text>
63 <text> 61 <text>
64 Préférences du Groupe 62 Préférences du Groupe
65 </text> 63 </text>
66 <panel name="preferences_container"> 64 <panel name="preferences_container">
67 <check_box label="Afficher dans la recherche" name="show_in_group_list" 65 <check_box label="Afficher dans la recherche" name="show_in_group_list" tool_tip="Afficher ce groupe dans les résultats de recherche."/>
68 tool_tip="Afficher ce groupe dans les résultats de recherche." /> 66 <check_box label="Publier sur le web" name="publish_on_web" tool_tip="Cochez pour publier les informations de ce groupe sur le web."/>
69 <check_box label="Publier sur le web" name="publish_on_web" 67 <check_box label="Inscription libre" name="open_enrollement" tool_tip="Indique si une invitation est nécessaire pour devenir membre de ce groupe."/>
70 tool_tip="Cochez pour publier les informations de ce groupe sur le web." /> 68 <check_box label="Frais d&apos;inscription : L$" name="check_enrollment_fee" tool_tip="Indique s&apos;il y a des frais d&apos;inscription pour devenir membre."/>
71 <check_box label="Inscription libre" name="open_enrollement" 69 <spinner name="spin_enrollment_fee" tool_tip="Si la case Frais d&apos;inscription est cochée, cela signifie qu&apos;il faut payer des frais pour devenir membre."/>
72 tool_tip="Indique si une invitation est nécessaire pour devenir membre de ce groupe." /> 70 <check_box label="Adulte" name="mature" tool_tip="Cochez si les informations de votre groupe sont à caractère adulte."/>
73 <check_box label="Frais d&apos;inscription : $L" name="check_enrollment_fee" 71 <combo_box name="group_mature_check" tool_tip="Indique si les informations de votre groupe sont considérées comme étant réservées aux adultes." width="195">
74 tool_tip="Indique s&apos;il y a des frais d&apos;inscription pour devenir membre." /> 72 <combo_item name="select_mature">
75 <spinner name="spin_enrollment_fee" 73 - Type de public -
76 tool_tip="Lorsque la case Frais d&apos;inscription est cochée, cela signifie qu&apos;il faut payer des frais pour devenir membre." />
77 <check_box label="Adulte" name="mature"
78 tool_tip="Cochez si les informations de votre groupe sont à caractère adulte." />
79 <combo_box width="195" name="group_mature_check"
80 tool_tip="Indique si les informations de votre groupe sont considérées comme étant réservées aux adultes.">
81 <combo_item name="select_mature" >
82 - Sélectionner Pour adultes -
83 </combo_item> 74 </combo_item>
84 <combo_item name="mature"> 75 <combo_item name="mature">
85 Contenu pour adultes 76 Contenu pour adultes
86 </combo_item> 77 </combo_item>
87 <combo_item name="not_mature"> 78 <combo_item name="not_mature">
88 Contenu non réservé aux adultes 79 Tout public
89 </combo_item> 80 </combo_item>
90 </combo_box> 81 </combo_box>
91 <panel name="title_container"> 82 <panel name="title_container">
92 <text name="active_title_label"> 83 <text name="active_title_label">
93 Mon titre actuel 84 Mon titre actuel
94 </text> 85 </text>
95 <combo_box name="active_title" 86 <combo_box name="active_title" tool_tip="Définit le titre qui apparaît près du nom de votre avatar lorsque ce groupe est actif."/>
96 tool_tip="Définit le titre qui apparaît près du nom de votre avatar lorsque ce groupe est actif." />
97 </panel> 87 </panel>
98 <check_box label="Recevoir des notes de groupe" name="receive_notices" 88 <check_box label="Recevoir des notifications du groupe" name="receive_notices" tool_tip="Cochez si vous souhaitez recevoir les notifications envoyées au groupe. Décochez si ce groupe vous envoie des spams."/>
99 tool_tip="Définit si vous souhaitez recevoir les notes envoyées au groupe. Décochez si ce groupe vous envoie des spams." /> 89 <check_box label="Afficher dans mon profil" name="list_groups_in_profile" tool_tip="Indique si vous voulez que ce groupe apparaisse dans votre profil"/>
100 <check_box label="Afficher dans mon profil" name="list_groups_in_profile"
101 tool_tip="Indique si vous voulez que ce groupe apparaisse dans votre profil" />
102 </panel> 90 </panel>
103</panel> 91</panel>
diff --git a/linden/indra/newview/skins/default/xui/fr/panel_group_invite.xml b/linden/indra/newview/skins/default/xui/fr/panel_group_invite.xml
index e989fa0..00a62ad 100644
--- a/linden/indra/newview/skins/default/xui/fr/panel_group_invite.xml
+++ b/linden/indra/newview/skins/default/xui/fr/panel_group_invite.xml
@@ -1,5 +1,5 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 1<?xml version="1.0" encoding="utf-8" standalone="yes"?>
2<panel label="Inviter un membre" name="invite_panel"> 2<panel label="Inviter un résident" name="invite_panel">
3 <text> 3 <text>
4 Vous pouvez sélectionner plusieurs résidents 4 Vous pouvez sélectionner plusieurs résidents
5à inviter dans votre groupe. Cliquez sur &apos;Ouvrir 5à inviter dans votre groupe. Cliquez sur &apos;Ouvrir
@@ -10,21 +10,18 @@ le Sélecteur de Personnes&apos; pour commencer.
10Cliquez sur Sélecteur 10Cliquez sur Sélecteur
11de personnes pour commencer. 11de personnes pour commencer.
12 </text> 12 </text>
13 <button label="Sélecteur de personnes" name="add_button" tool_tip="" /> 13 <button label="Sélecteur de personnes" name="add_button" tool_tip=""/>
14 <name_list name="invitee_list" 14 <name_list name="invitee_list" tool_tip="Pour sélectionner plusieurs noms, maintenez la touche Ctrl enfoncée en cliquant sur le nom des résidents."/>
15 tool_tip="Pour sélectionner plusieurs noms, maintenez la touche Ctrl enfoncée en cliquant sur le nom des résidents." /> 15 <button label="Supprimer de la liste" name="remove_button" tool_tip="Supprime les résidents sélectionnés de la liste des invités."/>
16 <button label="Supprimer de la liste" name="remove_button"
17 tool_tip="Supprime les résidents sélectionnés de la liste des invités." />
18 <text> 16 <text>
19 Choisissez le Rôle à leur attribuer : 17 Choisissez le Rôle à leur attribuer :
20 </text> 18 </text>
21 <text name="role_text"> 19 <text name="role_text">
22 Assignez-leur un rôle : 20 Assignez-leur un rôle :
23 </text> 21 </text>
24 <combo_box name="role_name" 22 <combo_box name="role_name" tool_tip="Choisissez des rôles à assigner aux membres dans la liste."/>
25 tool_tip="Choisissez des rôles à assigner aux membres dans la liste." /> 23 <button label="Envoyer des invitations" name="ok_button"/>
26 <button label="Envoyer des invitations" name="ok_button" /> 24 <button label="Annuler" name="cancel_button"/>
27 <button label="Annuler" name="cancel_button" />
28 <string name="confirm_invite_owner_str"> 25 <string name="confirm_invite_owner_str">
29 Etes-vous certain de vouloir inviter un/de nouveau(x) propriétaire(s) ? Ce choix est permanent ! 26 Etes-vous certain de vouloir inviter un/de nouveau(x) propriétaire(s) ? Ce choix est permanent !
30 </string> 27 </string>
diff --git a/linden/indra/newview/skins/default/xui/fr/panel_group_land_money.xml b/linden/indra/newview/skins/default/xui/fr/panel_group_land_money.xml
index 17beac2..2bc97bd 100644
--- a/linden/indra/newview/skins/default/xui/fr/panel_group_land_money.xml
+++ b/linden/indra/newview/skins/default/xui/fr/panel_group_land_money.xml
@@ -1,9 +1,9 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 1<?xml version="1.0" encoding="utf-8" standalone="yes"?>
2<panel label="Terrain &amp; $L" name="land_money_tab"> 2<panel label="Terrain &amp; L$" name="land_money_tab">
3 <text name="help_text"> 3 <text name="help_text">
4 Les parcelles appartenant au groupe apparaissent avec les détails des contributions. Un avertissement apparaîtra tant que le Total du terrain utilisé sera inférieur ou égal aux Contributions totales. Les onglets Planification, Détails et Ventes fournissent des détails sur les finances du groupe. 4 Les parcelles appartenant au groupe apparaissent avec les détails des contributions. Un avertissement apparaîtra tant que le Total du terrain utilisé sera inférieur ou égal au Total des contributions. Les onglets Planification, Détails et Ventes fournissent des détails sur les finances du groupe.
5 </text> 5 </text>
6 <button label="?" name="help_button" /> 6 <button label="?" name="help_button"/>
7 <text name="cant_view_group_land_text"> 7 <text name="cant_view_group_land_text">
8 Vous n&apos;avez pas la permission de voir quel terrain possède ce groupe. 8 Vous n&apos;avez pas la permission de voir quel terrain possède ce groupe.
9 </text> 9 </text>
@@ -17,26 +17,26 @@
17 Terrain du groupe 17 Terrain du groupe
18 </text> 18 </text>
19 <scroll_list name="group_parcel_list"> 19 <scroll_list name="group_parcel_list">
20 <column label="Nom de la parcelle" name="name" /> 20 <column label="Nom de la parcelle" name="name"/>
21 <column label="Région" name="location" /> 21 <column label="Région" name="location"/>
22 <column label="Surface" name="area" /> 22 <column label="Surface" name="area"/>
23 <column label="" name="hidden" /> 23 <column label="" name="hidden"/>
24 </scroll_list> 24 </scroll_list>
25 <button label="Voir sur la carte" label_selected="Voir sur la carte" name="map_button" /> 25 <button label="Voir sur la carte" label_selected="Voir sur la carte" name="map_button"/>
26 <text name="total_contributed_land_label"> 26 <text name="total_contributed_land_label">
27 Contributions totales : 27 Total des contributions :
28 </text> 28 </text>
29 <text name="total_contributed_land_value"> 29 <text name="total_contributed_land_value">
30 [AREA] m² 30 [AREA] m²
31 </text> 31 </text>
32 <text name="total_land_in_use_label"> 32 <text name="total_land_in_use_label">
33 Total du terrain utilisé : 33 Superficie déjà utilisée :
34 </text> 34 </text>
35 <text name="total_land_in_use_value"> 35 <text name="total_land_in_use_value">
36 [AREA] m² 36 [AREA] m²
37 </text> 37 </text>
38 <text name="land_available_label"> 38 <text name="land_available_label">
39 Terrain disponible : 39 Superficie disponible :
40 </text> 40 </text>
41 <text name="land_available_value"> 41 <text name="land_available_value">
42 [AREA] m² 42 [AREA] m²
@@ -58,7 +58,7 @@
58charge le terrain utilisé. 58charge le terrain utilisé.
59 </text> 59 </text>
60 <text name="group_money_heading"> 60 <text name="group_money_heading">
61 $L du groupe 61 Comptes du groupe
62 </text> 62 </text>
63 <tab_container name="group_money_tab_container"> 63 <tab_container name="group_money_tab_container">
64 <panel label="Planification" name="group_money_planning_tab"> 64 <panel label="Planification" name="group_money_planning_tab">
@@ -70,19 +70,15 @@ charge le terrain utilisé.
70 <text_editor name="group_money_details_text"> 70 <text_editor name="group_money_details_text">
71 Calcul en cours... 71 Calcul en cours...
72 </text_editor> 72 </text_editor>
73 <button label="&lt; Plus tôt" label_selected="&lt; Plus tôt" 73 <button label="&lt; Plus tôt" label_selected="&lt; Plus tôt" name="earlier_details_button" tool_tip="Reculer dans le temps"/>
74 name="earlier_details_button" tool_tip="Reculer dans le temps" /> 74 <button label="Plus tard &gt;" label_selected="Plus tard &gt;" name="later_details_button" tool_tip="Avancer dans le temps"/>
75 <button label="Plus tard &gt;" label_selected="Plus tard &gt;"
76 name="later_details_button" tool_tip="Avancer dans le temps" />
77 </panel> 75 </panel>
78 <panel label="Ventes" name="group_money_sales_tab"> 76 <panel label="Ventes" name="group_money_sales_tab">
79 <text_editor name="group_money_sales_text"> 77 <text_editor name="group_money_sales_text">
80 Calcul en cours... 78 Calcul en cours...
81 </text_editor> 79 </text_editor>
82 <button label="&lt; Plus tôt" label_selected="&lt; Plus tôt" 80 <button label="&lt; Plus tôt" label_selected="&lt; Plus tôt" name="earlier_sales_button" tool_tip="Reculer dans le temps"/>
83 name="earlier_sales_button" tool_tip="Reculer dans le temps" /> 81 <button label="Plus tard &gt;" label_selected="Plus tard &gt;" name="later_sales_button" tool_tip="Avancer dans le temps"/>
84 <button label="Plus tard &gt;" label_selected="Plus tard &gt;"
85 name="later_sales_button" tool_tip="Avancer dans le temps" />
86 </panel> 82 </panel>
87 </tab_container> 83 </tab_container>
88</panel> 84</panel>
diff --git a/linden/indra/newview/skins/default/xui/fr/panel_group_notices.xml b/linden/indra/newview/skins/default/xui/fr/panel_group_notices.xml
index a065839..8a9ef69 100644
--- a/linden/indra/newview/skins/default/xui/fr/panel_group_notices.xml
+++ b/linden/indra/newview/skins/default/xui/fr/panel_group_notices.xml
@@ -1,70 +1,65 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 1<?xml version="1.0" encoding="utf-8" standalone="yes"?>
2<panel label="Notes" name="notices_tab"> 2<panel label="Notifications" name="notices_tab">
3 <text name="help_text"> 3 <text name="help_text">
4 Les notes vous permettent d&apos;envoyer des messages et pièces-jointes à tous les membres du groupe en même temps. Ces messages ne sont envoyés qu&apos;aux membres dont le rôle les autorise à recevoir des notes. Vous pouvez désactiver les notes à l&apos;onglet Général. 4 Les notifications vous permettent d&apos;envoyer des messages et pièces-jointes à tous les membres du groupe en même temps. Ces messages ne sont envoyés qu&apos;aux membres dont le rôle les autorise à recevoir des notifications. Vous pouvez désactiver les notifications à l&apos;onglet Général.
5 </text> 5 </text>
6 <text name="no_notices_text"> 6 <text name="no_notices_text">
7 Aucune note précédemment envoyée. 7 Aucune notification précédemment envoyée.
8 </text> 8 </text>
9 <button label="?" label_selected="?" name="help_button" /> 9 <button label="?" label_selected="?" name="help_button"/>
10 <text name="lbl"> 10 <text name="lbl">
11 Archive des notes du groupe 11 Archive des notifications du groupe
12 </text> 12 </text>
13 <text name="lbl2"> 13 <text name="lbl2">
14 Les notes sont conservées pendant 14 jours. Cliquez sur la note que vous 14 Les notifications sont conservées pendant 14 jours. Cliquez sur la notification que vous
15voulez afficher. Pour voir si vous avez reçu de nouvelles notes, cliquez sur 15voulez afficher. Pour voir si vous avez reçu de nouvelles notifications, cliquez sur
16Rafraîchir. Chaque groupe a une limite quotidienne de 200 notes. 16Rafraîchir. Chaque groupe a une limite quotidienne de 200 notifications.
17 </text> 17 </text>
18 <scroll_list name="notice_list"> 18 <scroll_list name="notice_list">
19 <column label="" name="icon" /> 19 <column label="" name="icon"/>
20 <column label="Sujet" name="subject" /> 20 <column label="Sujet" name="subject"/>
21 <column label="De" name="from" /> 21 <column label="De" name="from"/>
22 <column label="Date" name="date" /> 22 <column label="Date" name="date"/>
23 </scroll_list> 23 </scroll_list>
24 <text name="notice_list_none_found"> 24 <text name="notice_list_none_found">
25 Aucun résultat. 25 Aucun résultat.
26 </text> 26 </text>
27 <button label="Créer une note" label_selected="Créer une note" 27 <button label="Créer une notification" label_selected="Créer une notification" name="create_new_notice"/>
28 name="create_new_notice" /> 28 <button label="Rafraîchir" label_selected="Rafraîchir la liste" name="refresh_notices"/>
29 <button label="Rafraîchir" label_selected="Rafraîchir la liste" 29 <panel label="Créer une notification" name="panel_create_new_notice">
30 name="refresh_notices" />
31 <panel label="Créer une note" name="panel_create_new_notice">
32 <text name="lbl"> 30 <text name="lbl">
33 Créer une note 31 Créer une notification
34 </text> 32 </text>
35 <text name="lbl2"> 33 <text name="lbl2">
36 Pour envoyer une note, vous devez saisir un sujet. Pour joindre 34 Pour envoyer une notification, vous devez saisir un sujet. Pour joindre
37une pièce-jointe à cette note, faites-la glisser depuis votre 35une pièce-jointe à cette notification, faites-la glisser depuis votre
38inventaire vers cette fenêtre. Les pièces-jointes doivent être 36inventaire vers cette fenêtre. Les pièces-jointes doivent être
39copiables et transférables. Il n&apos;est pas possible d&apos;envoyer de 37copiables et transférables. Il n&apos;est pas possible d&apos;envoyer de
40dossiers. 38dossiers.
41 </text> 39 </text>
42 <text name="lbl3" bottom_delta="-79" > 40 <text bottom_delta="-79" name="lbl3">
43 Sujet : 41 Sujet :
44 </text> 42 </text>
45 <line_editor name="create_subject" width="346" /> 43 <line_editor name="create_subject" width="346"/>
46 <text name="lbl4"> 44 <text name="lbl4">
47 Message : 45 Message :
48 </text> 46 </text>
49 <text_editor bottom_delta="-90" height="104" name="create_message" /> 47 <text_editor bottom_delta="-90" height="104" name="create_message"/>
50 <text name="lbl5"> 48 <text name="lbl5">
51 Attacher : 49 Attacher :
52 </text> 50 </text>
53 <line_editor name="create_inventory_name" width="206" /> 51 <line_editor name="create_inventory_name" width="206"/>
54 <button label="Supprimer pièce-jointe" label_selected="Supprimer pièce-jointe" 52 <button label="Supprimer pièce-jointe" label_selected="Supprimer pièce-jointe" left="274" name="remove_attachment" width="140"/>
55 name="remove_attachment" left="274" width="140"/> 53 <button label="Envoyer notification" label_selected="Envoyer notification" left="274" name="send_notice" width="140"/>
56 <button label="Envoyer note" label_selected="Envoyer note" name="send_notice" left="274" width="140"/> 54 <panel name="drop_target2" tool_tip="Pour joindre un objet de l&apos;inventaire à la notification, faites-le glisser dans la boîte de message. Pour envoyer l&apos;objet avec la notification, vous devez avoir la permission de le copier et de le transférer."/>
57 <panel name="drop_target2" 55 <panel name="drop_target" tool_tip="Pour joindre un objet de l&apos;inventaire à la notification, faites-le glisser dans la boîte de message. Pour envoyer l&apos;objet avec la notification, vous devez avoir la permission de le copier et de le transférer."/>
58 tool_tip="Drag an inventory item onto the message box to send it with the notice. You must have permission to copy and transfer the object to send it with the notice." />
59 <panel name="drop_target"
60 tool_tip="Pour joindre un objet de l&apos;inventaire à la note, faites-le glisser dans la boîte de message. Pour envoyer l&apos;objet avec la note, vous devez avoir la permission de le copier et de le transférer." />
61 </panel> 56 </panel>
62 <panel label="Voir ancienne note" name="panel_view_past_notice"> 57 <panel label="Voir ancienne notification" name="panel_view_past_notice">
63 <text name="lbl"> 58 <text name="lbl">
64 Note archivée 59 Notification archivée
65 </text> 60 </text>
66 <text name="lbl2"> 61 <text name="lbl2">
67 Pour envoyer une nouvelle note, cliquez sur Créer une note ci-dessus. 62 Pour envoyer une nouvelle notification, cliquez sur Créer une notification ci-dessus.
68 </text> 63 </text>
69 <text name="lbl3"> 64 <text name="lbl3">
70 Sujet : 65 Sujet :
@@ -72,8 +67,7 @@ dossiers.
72 <text name="lbl4"> 67 <text name="lbl4">
73 Message : 68 Message :
74 </text> 69 </text>
75 <button label="Ouvrir pièce-jointe" label_selected="Ouvrir pièce-jointe" 70 <button label="Ouvrir pièce-jointe" label_selected="Ouvrir pièce-jointe" name="open_attachment" width="118"/>
76 name="open_attachment" width="118" /> 71 <line_editor left="128" name="view_inventory_name" width="256"/>
77 <line_editor left="128" name="view_inventory_name" width="256" />
78 </panel> 72 </panel>
79</panel> 73</panel>
diff --git a/linden/indra/newview/skins/default/xui/fr/panel_group_roles.xml b/linden/indra/newview/skins/default/xui/fr/panel_group_roles.xml
index ab32917..e973b43 100644
--- a/linden/indra/newview/skins/default/xui/fr/panel_group_roles.xml
+++ b/linden/indra/newview/skins/default/xui/fr/panel_group_roles.xml
@@ -1,4 +1,4 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 1<?xml version="1.0" encoding="utf-8" standalone="yes"?>
2<panel label="Membres et rôles" name="roles_tab"> 2<panel label="Membres et rôles" name="roles_tab">
3 <text name="default_needs_apply_text"> 3 <text name="default_needs_apply_text">
4 Certains changements n&apos;ont pas été appliqués sur ce sous-onglet. 4 Certains changements n&apos;ont pas été appliqués sur ce sous-onglet.
@@ -7,9 +7,9 @@
7 Voulez-vous les appliquer ? 7 Voulez-vous les appliquer ?
8 </text> 8 </text>
9 <text name="cant_delete_role"> 9 <text name="cant_delete_role">
10 Les Rôles &apos;Tout le monde&apos; et &apos;Propriétaires&apos; sont particuliers, et ne peuvent être supprimés. 10 Les Rôles Tout le monde et Propriétaires sont spéciaux et ne peuvent être supprimés.
11 </text> 11 </text>
12 <button label="?" name="help_button" /> 12 <button label="?" name="help_button"/>
13 <panel name="members_header"> 13 <panel name="members_header">
14 <text name="static"> 14 <text name="static">
15 Membres et rôles 15 Membres et rôles
@@ -32,7 +32,7 @@ description et le titre du membre.
32 Sélectionnez un rôle ci-dessous pour en connaître les propriétés, les 32 Sélectionnez un rôle ci-dessous pour en connaître les propriétés, les
33membres et les pouvoirs. 33membres et les pouvoirs.
34 </text> 34 </text>
35 <text name="role_actions_modifiable" bottom_delta="-28"> 35 <text bottom_delta="-28" name="role_actions_modifiable">
36 Vous pouvez aussi assigner des pouvoirs au rôle. 36 Vous pouvez aussi assigner des pouvoirs au rôle.
37 </text> 37 </text>
38 <text name="role_actions_not_modifiable"> 38 <text name="role_actions_not_modifiable">
@@ -48,34 +48,34 @@ membres et les pouvoirs.
48quels membres ces pouvoirs sont assignés. 48quels membres ces pouvoirs sont assignés.
49 </text> 49 </text>
50 </panel> 50 </panel>
51 <tab_container name="roles_tab_container" height="164"> 51 <tab_container height="164" name="roles_tab_container">
52 <panel label="Membres" name="members_sub_tab" tool_tip="Membres" height="148"> 52 <panel height="148" label="Membres" name="members_sub_tab" tool_tip="Membres">
53 <line_editor bottom="127" name="search_text" /> 53 <line_editor bottom="127" name="search_text"/>
54 <button label="Rechercher" name="search_button" width="75" /> 54 <button label="Rechercher" name="search_button" width="75"/>
55 <button label="Afficher tout" name="show_all_button" left_delta="80" /> 55 <button label="Afficher tout" left_delta="80" name="show_all_button"/>
56 <name_list name="member_list" height="104" bottom_delta="-105"> 56 <name_list bottom_delta="-105" height="104" name="member_list">
57 <column label="Nom du membre" name="name" /> 57 <column label="Nom du membre" name="name"/>
58 <column label="Terrain donné" name="donated" width="116"/> 58 <column label="Terrain donné" name="donated" width="116"/>
59 <column label="Dernière connexion" name="online" width="136"/> 59 <column label="Dernière connexion" name="online" width="136"/>
60 </name_list> 60 </name_list>
61 <button label="Inviter nouvelle personne..." name="member_invite" width="165"/> 61 <button label="Inviter nouveau résident..." name="member_invite" width="165"/>
62 <button label="Expulser du groupe" name="member_eject" /> 62 <button label="Expulser du groupe" name="member_eject"/>
63 <text name="help_text"> 63 <text name="help_text">
64 Vous pouvez ajouter ou supprimer les rôles assignés aux membres. 64 Vous pouvez ajouter ou supprimer les rôles assignés aux membres.
65Pour sélectionner plusieurs membres, cliquez sur leurs noms en maintenant la touche Ctrl enfoncée. 65Pour sélectionner plusieurs membres, cliquez sur leurs noms en maintenant la touche Ctrl enfoncée.
66 </text> 66 </text>
67 </panel> 67 </panel>
68 <panel label="Rôles" name="roles_sub_tab" height="148"> 68 <panel height="148" label="Rôles" name="roles_sub_tab">
69 <line_editor bottom="127" name="search_text" /> 69 <line_editor bottom="127" name="search_text"/>
70 <button label="Rechercher" name="search_button" width="75"/> 70 <button label="Rechercher" name="search_button" width="75"/>
71 <button label="Afficher tout" name="show_all_button" left_delta="80"/> 71 <button label="Afficher tout" left_delta="80" name="show_all_button"/>
72 <scroll_list name="role_list" height="104" bottom_delta="-104"> 72 <scroll_list bottom_delta="-104" height="104" name="role_list">
73 <column label="Nom du rôle" name="name" /> 73 <column label="Nom du rôle" name="name"/>
74 <column label="Titre" name="title" /> 74 <column label="Titre" name="title"/>
75 <column label="Membres" name="members" /> 75 <column label="Membres" name="members"/>
76 </scroll_list> 76 </scroll_list>
77 <button label="Créer un rôle..." name="role_create" /> 77 <button label="Créer un rôle..." name="role_create"/>
78 <button label="Supprimer le rôle" name="role_delete" /> 78 <button label="Supprimer le rôle" name="role_delete"/>
79 <text name="help_text"> 79 <text name="help_text">
80 Chaque rôle a un titre et une liste des pouvoirs assignés aux membres. Chaque membre peut avoir un ou plusieurs rôles. Un groupe peut avoir jusqu&apos;à 10 rôles, y compris les rôles Tous et Propriétaires. 80 Chaque rôle a un titre et une liste des pouvoirs assignés aux membres. Chaque membre peut avoir un ou plusieurs rôles. Un groupe peut avoir jusqu&apos;à 10 rôles, y compris les rôles Tous et Propriétaires.
81 </text> 81 </text>
@@ -83,14 +83,13 @@ Pour sélectionner plusieurs membres, cliquez sur leurs noms en maintenant la to
83 Les rôles Tous et Propriétaires sont spéciaux et ne peuvent pas être supprimés. 83 Les rôles Tous et Propriétaires sont spéciaux et ne peuvent pas être supprimés.
84 </string> 84 </string>
85 </panel> 85 </panel>
86 <panel label="Pouvoirs" name="actions_sub_tab" height="148"> 86 <panel height="148" label="Pouvoirs" name="actions_sub_tab">
87 <line_editor bottom="127" name="search_text" /> 87 <line_editor bottom="127" name="search_text"/>
88 <button label="Rechercher" name="search_button" width="75"/> 88 <button label="Rechercher" name="search_button" width="75"/>
89 <button label="Afficher tout" name="show_all_button" left_delta="80"/> 89 <button label="Afficher tout" left_delta="80" name="show_all_button"/>
90 <scroll_list name="action_list" 90 <scroll_list bottom_delta="-120" height="118" name="action_list" tool_tip="Sélectionnez un pouvoir pour en afficher les détails.">
91 tool_tip="Sélectionnez un pouvoir pour en afficher les détails." height="118" bottom_delta="-120"> 91 <column label="" name="icon"/>
92 <column label="" name="icon" /> 92 <column label="" name="action"/>
93 <column label="" name="action" />
94 </scroll_list> 93 </scroll_list>
95 <text name="help_text"> 94 <text name="help_text">
96 Lorsqu&apos;un membre a des pouvoirs, il peut faire un certain nombre de choses dans le groupe. Il existe un grand nombre de pouvoirs. 95 Lorsqu&apos;un membre a des pouvoirs, il peut faire un certain nombre de choses dans le groupe. Il existe un grand nombre de pouvoirs.
@@ -105,13 +104,12 @@ Pour sélectionner plusieurs membres, cliquez sur leurs noms en maintenant la to
105 Pouvoirs attribués 104 Pouvoirs attribués
106 </text> 105 </text>
107 <scroll_list name="member_assigned_roles"> 106 <scroll_list name="member_assigned_roles">
108 <column label="" name="checkbox" /> 107 <column label="" name="checkbox"/>
109 <column label="" name="role" /> 108 <column label="" name="role"/>
110 </scroll_list> 109 </scroll_list>
111 <scroll_list name="member_allowed_actions" 110 <scroll_list name="member_allowed_actions" tool_tip="Pour avoir des détails sur chacun des pouvoirs attribués, allez à l&apos;onglet Pouvoirs.">
112 tool_tip="Pour avoir des détails sur chacun des pouvoirs attribués, allez à l&apos;onglet Pouvoirs."> 111 <column label="" name="icon"/>
113 <column label="" name="icon" /> 112 <column label="" name="action"/>
114 <column label="" name="action" />
115 </scroll_list> 113 </scroll_list>
116 </panel> 114 </panel>
117 <panel name="roles_footer"> 115 <panel name="roles_footer">
@@ -136,17 +134,15 @@ Pour sélectionner plusieurs membres, cliquez sur leurs noms en maintenant la to
136 <text name="static4"> 134 <text name="static4">
137 Membres assignés 135 Membres assignés
138 </text> 136 </text>
139 <text name="static5" 137 <text name="static5" tool_tip="Une liste des pouvoirs auquel le rôle sélectionné a accès.">
140 tool_tip="Une liste des pouvoirs auquel le rôle sélectionné a accès.">
141 Pouvoirs attribués 138 Pouvoirs attribués
142 </text> 139 </text>
143 <check_box label="Les membres sont &#10;visibles" name="role_visible_in_list" 140 <check_box label="Les membres sont
144 tool_tip="Définit si les membres de ce rôle sont visibles à partir de l&apos;onglet Général aux personnes en dehors du groupe." /> 141visibles" name="role_visible_in_list" tool_tip="Définit si les membres de ce rôle sont visibles à partir de l&apos;onglet Général aux personnes en dehors du groupe."/>
145 <scroll_list name="role_allowed_actions" 142 <scroll_list name="role_allowed_actions" tool_tip="Pour avoir des détails sur chacun des pouvoirs attribués, allez à l&apos;onglet Pouvoirs.">
146 tool_tip="Pour avoir des détails sur chacun des pouvoirs attribués, allez à l&apos;onglet Pouvoirs."> 143 <column label="" name="icon"/>
147 <column label="" name="icon" /> 144 <column label="" name="checkbox"/>
148 <column label="" name="checkbox" /> 145 <column label="" name="action"/>
149 <column label="" name="action" />
150 </scroll_list> 146 </scroll_list>
151 </panel> 147 </panel>
152 <panel name="actions_footer"> 148 <panel name="actions_footer">
@@ -154,7 +150,7 @@ Pour sélectionner plusieurs membres, cliquez sur leurs noms en maintenant la to
154 Description 150 Description
155 </text> 151 </text>
156 <text_editor name="action_description"> 152 <text_editor name="action_description">
157 Ce pouvoir permet d&apos; « expulser les membres de ce groupe ». Seul un propriétaire peut expulser un autre propriétaire. 153 Ce pouvoir permet d&apos;expulser des membres du groupe. Seul un propriétaire peut expulser un autre propriétaire.
158 </text_editor> 154 </text_editor>
159 <text name="static2"> 155 <text name="static2">
160 Rôles avec pouvoirs 156 Rôles avec pouvoirs
diff --git a/linden/indra/newview/skins/default/xui/fr/panel_group_voting.xml b/linden/indra/newview/skins/default/xui/fr/panel_group_voting.xml
index 85a9ba6..ffe96fb 100644
--- a/linden/indra/newview/skins/default/xui/fr/panel_group_voting.xml
+++ b/linden/indra/newview/skins/default/xui/fr/panel_group_voting.xml
@@ -1,9 +1,9 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 1<?xml version="1.0" encoding="utf-8" standalone="yes"?>
2<panel label="Propositions" name="voting_tab"> 2<panel label="Propositions" name="voting_tab">
3 <text name="help_text"> 3 <text name="help_text">
4 Les propositions de groupe permettent d&apos;en savoir plus sur les objectifs du groupe ou son avis sur un sujet donné. Si vous avez les pouvoirs requis, vous pouvez créer des propositions, voter et accéder à d&apos;anciennes propositions. 4 Les propositions de groupe permettent d&apos;en savoir plus sur les objectifs du groupe ou son avis sur un sujet donné. Si vous avez les pouvoirs requis, vous pouvez créer des propositions, voter et accéder à d&apos;anciennes propositions.
5 </text> 5 </text>
6 <button label="?" name="help_button" /> 6 <button label="?" name="help_button"/>
7 <text name="proposal_header"> 7 <text name="proposal_header">
8 Propositions du groupe actives 8 Propositions du groupe actives
9 </text> 9 </text>
@@ -43,29 +43,24 @@ ou abstenez-vous en cliquant sur M&apos;abstenir.
43 <text name="proposal_lbl"> 43 <text name="proposal_lbl">
44 Description de la proposition 44 Description de la proposition
45 </text> 45 </text>
46 <button label="Créer une proposition" label_selected="Créer une proposition" 46 <button label="Créer une proposition" label_selected="Créer une proposition" name="btn_proposal"/>
47 name="btn_proposal" /> 47 <button label="Afficher la proposition" label_selected="Afficher la proposition" name="btn_view_proposal_item"/>
48 <button label="Afficher la proposition" label_selected="Afficher la proposition" 48 <button label="Afficher la liste" label_selected="Afficher la liste" name="btn_view_proposal_list"/>
49 name="btn_view_proposal_item" />
50 <button label="Afficher la liste" label_selected="Afficher la liste"
51 name="btn_view_proposal_list" />
52 <text name="quorum_lbl"> 49 <text name="quorum_lbl">
53 Quorum : 50 Quorum :
54 </text> 51 </text>
55 <spinner name="quorum" 52 <spinner name="quorum" tool_tip="Nombre total de votants nécessaires pour que les résultats de l&apos;élection soient valides."/>
56 tool_tip="Nombre total de votants nécessaires pour que les résultats de l&apos;élection soient valides." />
57 <text name="quorum_text"> 53 <text name="quorum_text">
58 sur [MEMBERS] membres doivent voter. 54 sur [MEMBERS] membres doivent voter.
59 </text> 55 </text>
60 <text name="duration_lbl"> 56 <text name="duration_lbl">
61 Durée : 57 Durée :
62 </text> 58 </text>
63 <spinner name="duration" tool_tip="Durée de l&apos;élection (en nombre de jours)." /> 59 <spinner name="duration" tool_tip="Durée de l&apos;élection (en nombre de jours)."/>
64 <text name="duration_text"> 60 <text name="duration_text">
65 jours 61 jours
66 </text> 62 </text>
67 <radio_group name="majority" left="296" 63 <radio_group left="296" name="majority" tool_tip="Majorité de tous les votes nécessaires pour remporter l&apos;élection.">
68 tool_tip="Majorité de tous les votes nécessaires pour remporter l&apos;élection.">
69 Majorité simple 64 Majorité simple
70 Majorité des 2/3 65 Majorité des 2/3
71 Unanimité 66 Unanimité
@@ -76,28 +71,25 @@ ou abstenez-vous en cliquant sur M&apos;abstenir.
76 <text name="end_lbl"> 71 <text name="end_lbl">
77 Fin du vote : 72 Fin du vote :
78 </text> 73 </text>
79 <button label="Soumettre la proposition" label_selected="Soumettre la proposition" 74 <button label="Soumettre la proposition" label_selected="Soumettre la proposition" left="170" name="btn_submit" width="150"/>
80 name="btn_submit" width="150" left="170" /> 75 <button label="Annuler" label_selected="Annuler" left_delta="158" name="btn_cancel"/>
81 <button label="Annuler" label_selected="Annuler" name="btn_cancel" left_delta="158"/> 76 <button font="SansSerifSmall" label="Oui" label_selected="Oui" left="183" name="btn_yes" width="70"/>
82 <button label="Oui" label_selected="Oui" name="btn_yes" width="70" left="183" font="SansSerifSmall" /> 77 <button font="SansSerifSmall" label="Non" label_selected="Non" left_delta="77" name="btn_no" width="70"/>
83 <button label="Non" label_selected="Non" name="btn_no" width="70" left_delta="77" font="SansSerifSmall"/> 78 <button font="SansSerifSmall" label="M&apos;abstenir" label_selected="M&apos;abstenir" left_delta="77" name="btn_abstain" width="70"/>
84 <button label="M&apos;abstenir" label_selected="M&apos;abstenir" name="btn_abstain" width="70" left_delta="77" font="SansSerifSmall"/> 79 <text left="7" name="txt">
85 <text name="txt" left="7">
86 Historique des votes du groupe 80 Historique des votes du groupe
87 </text> 81 </text>
88 <text name="instructions" left="7" width="405"> 82 <text left="7" name="instructions" width="405">
89 Double-cliquez sur un ancien vote ou sélectionnez-en un pour voir les résultats. 83 Double-cliquez sur un ancien vote ou sélectionnez-en un pour voir les résultats.
90 </text> 84 </text>
91 <text name="history_list_lbl"> 85 <text name="history_list_lbl">
92 Ancien vote Fin du vote 86 Ancien vote Fin du vote
93 </text> 87 </text>
94 <button label="Afficher la proposition" label_selected="Afficher la proposition" 88 <button label="Afficher la proposition" label_selected="Afficher la proposition" left="247" name="btn_view_history_item" width="160"/>
95 name="btn_view_history_item" width="160" left="247"/>
96 <text name="vote_text_lbl"> 89 <text name="vote_text_lbl">
97 Résultats du vote : 90 Résultats du vote :
98 </text> 91 </text>
99 <button label="Afficher la liste" label_selected="Afficher la liste" 92 <button label="Afficher la liste" label_selected="Afficher la liste" name="btn_view_history_list"/>
100 name="btn_view_history_list" />
101 <string name="proposals_submit_yes_txt"> 93 <string name="proposals_submit_yes_txt">
102 Soumission du Oui en cours... 94 Soumission du Oui en cours...
103 </string> 95 </string>
@@ -111,7 +103,7 @@ ou abstenez-vous en cliquant sur M&apos;abstenir.
111 Soumission de la nouvelle proposition en cours... 103 Soumission de la nouvelle proposition en cours...
112 </string> 104 </string>
113 <string name="vote_recorded"> 105 <string name="vote_recorded">
114 Votre vote a été reçu. 106 Votre vote a bien été reçu.
115 </string> 107 </string>
116 <string name="vote_previously_recorded"> 108 <string name="vote_previously_recorded">
117 Vous avez déjà voté. Vous ne pouvez voter qu&apos;une fois au cours d&apos;une élection. 109 Vous avez déjà voté. Vous ne pouvez voter qu&apos;une fois au cours d&apos;une élection.
diff --git a/linden/indra/newview/skins/default/xui/fr/panel_groups.xml b/linden/indra/newview/skins/default/xui/fr/panel_groups.xml
index dda643e..c64ce9e 100644
--- a/linden/indra/newview/skins/default/xui/fr/panel_groups.xml
+++ b/linden/indra/newview/skins/default/xui/fr/panel_groups.xml
@@ -1,18 +1,16 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 1<?xml version="1.0" encoding="utf-8" standalone="yes"?>
2<panel name="groups"> 2<panel name="groups">
3 <scroll_list bottom="50" name="group list" /> 3 <scroll_list bottom="50" name="group list"/>
4 <text name="groupdesc" bottom="16" height="32" width="268"> 4 <text bottom="16" height="32" name="groupdesc" width="268">
5 Le groupe dans lequel vous êtes actif en ce moment 5 Le groupe actif est en gras.
6est en gras.
7 </text> 6 </text>
8 <text name="groupcount" bottom="3" > 7 <text bottom="3" name="groupcount">
9 Vous appartenez à [COUNT] groupes (sur [MAX] maximum). 8 Vous appartenez à [COUNT] groupes ([MAX] max).
10 </text> 9 </text>
11 <button label="IM/Appel" name="IM" 10 <button label="IM/Appel" name="IM" tool_tip="Ouvrir une session de messagerie instantanée"/>
12 tool_tip="Ouvrir une session de messagerie instantanée" /> 11 <button label="Infos" name="Info"/>
13 <button label="Infos" name="Info" /> 12 <button label="Activer" name="Activate"/>
14 <button label="Activer" name="Activate" /> 13 <button label="Quitter" name="Leave"/>
15 <button label="Quitter" name="Leave" /> 14 <button label="Créer..." name="Create"/>
16 <button label="Créer..." name="Create" /> 15 <button label="Rechercher..." name="Search..."/>
17 <button label="Rechercher..." name="Search..." />
18</panel> 16</panel>
diff --git a/linden/indra/newview/skins/default/xui/fr/panel_login.xml b/linden/indra/newview/skins/default/xui/fr/panel_login.xml
index 3d2fa68..4be1bf8 100644
--- a/linden/indra/newview/skins/default/xui/fr/panel_login.xml
+++ b/linden/indra/newview/skins/default/xui/fr/panel_login.xml
@@ -1,4 +1,4 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 1<?xml version="1.0" encoding="utf-8" standalone="yes"?>
2<panel name="panel_login"> 2<panel name="panel_login">
3 <string name="forgot_password_url"> 3 <string name="forgot_password_url">
4 http://secondlife.com/account/request.php 4 http://secondlife.com/account/request.php
@@ -17,7 +17,7 @@
17 </text> 17 </text>
18 <combo_box name="start_location_combo"> 18 <combo_box name="start_location_combo">
19 <combo_item name="MyHome"> 19 <combo_item name="MyHome">
20 Mon domicile 20 Domicile
21 </combo_item> 21 </combo_item>
22 <combo_item name="MyLastLocation"> 22 <combo_item name="MyLastLocation">
23 Dernier emplacement 23 Dernier emplacement
@@ -29,16 +29,14 @@
29 &lt;Nom de la région&gt; 29 &lt;Nom de la région&gt;
30 </combo_item> 30 </combo_item>
31 </combo_box> 31 </combo_box>
32 <check_box label="Enregistrer le mot de passe" name="remember_check" /> 32 <check_box label="Enregistrer le mot de passe" name="remember_check"/>
33 <text name="full_screen_text"> 33 <text name="full_screen_text">
34 Le plein écran sera activé après identification. 34 Le plein écran sera activé après identification.
35 </text> 35 </text>
36 <button label="Nouveau Compte..." label_selected="Nouveau Compte..." 36 <button label="Nouveau Compte..." label_selected="Nouveau Compte..." name="new_account_btn"/>
37 name="new_account_btn" /> 37 <button label="Me connecter" label_selected="Me connecter" name="connect_btn"/>
38 <button label="Me connecter" label_selected="Me connecter" name="connect_btn" /> 38 <button label="Préférences..." label_selected="Préférences..." name="preferences_btn"/>
39 <button label="Préférences..." label_selected="Préférences..." 39 <button label="Quitter" label_selected="Quitter" name="quit_btn"/>
40 name="preferences_btn" />
41 <button label="Quitter" label_selected="Quitter" name="quit_btn" />
42 <text name="version_text"> 40 <text name="version_text">
43 1.23.4 (5) 41 1.23.4 (5)
44 </text> 42 </text>
diff --git a/linden/indra/newview/skins/default/xui/fr/panel_master_volume.xml b/linden/indra/newview/skins/default/xui/fr/panel_master_volume.xml
index 95486f1..cfba25a 100644
--- a/linden/indra/newview/skins/default/xui/fr/panel_master_volume.xml
+++ b/linden/indra/newview/skins/default/xui/fr/panel_master_volume.xml
@@ -1,6 +1,5 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 1<?xml version="1.0" encoding="utf-8" standalone="yes"?>
2<panel name="master_volume"> 2<panel name="master_volume">
3 <button name="volume" 3 <button name="volume" tool_tip="Contrôle du volume principal, cliquez pour ouvrir les paramètres"/>
4 tool_tip="Contrôle du volume master, cliquez pour ouvrir les paramètres" /> 4 <volume_slider name="volume_slider" tool_tip="Réglez le volume à l&apos;aide de ce curseur."/>
5 <volume_slider name="volume_slider" tool_tip="Réglez le volume à l&apos;aide de ce curseur." />
6</panel> 5</panel>
diff --git a/linden/indra/newview/skins/default/xui/fr/panel_media_controls.xml b/linden/indra/newview/skins/default/xui/fr/panel_media_controls.xml
index 4fa8769..d13aaee 100644
--- a/linden/indra/newview/skins/default/xui/fr/panel_media_controls.xml
+++ b/linden/indra/newview/skins/default/xui/fr/panel_media_controls.xml
@@ -1,16 +1,16 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 1<?xml version="1.0" encoding="utf-8" standalone="yes"?>
2<panel name="media_controls"> 2<panel name="media_controls">
3 <icon name="music_icon" tool_tip="Jouer/pauser le flux musical" /> 3 <icon name="music_icon" tool_tip="Jouer/pauser le flux musical"/>
4 <button name="music_play" tool_tip="Jouer/pauser le flux musical" /> 4 <button name="music_play" tool_tip="Jouer/pauser le flux musical"/>
5 <button name="music_pause" tool_tip="Pauser le flux musical" /> 5 <button name="music_pause" tool_tip="Pauser le flux musical"/>
6 <button name="music_stop" tool_tip="Arrêter le flux musical" /> 6 <button name="music_stop" tool_tip="Arrêter le flux musical"/>
7 <icon name="media_icon" tool_tip="Jouer/pauser le flux musical" /> 7 <icon name="media_icon" tool_tip="Jouer/pauser le flux musical"/>
8 <button name="media_play" tool_tip="Jouer/pauser le flux musical" /> 8 <button name="media_play" tool_tip="Jouer/pauser le flux musical"/>
9 <button name="media_pause" tool_tip="Pauser le flux de média" /> 9 <button name="media_pause" tool_tip="Pauser le flux de média"/>
10 <button name="media_stop" tool_tip="Arrêter le flux de média" /> 10 <button name="media_stop" tool_tip="Arrêter le flux de média"/>
11 <volume_slider name="volume_slider" tool_tip="Volume master" /> 11 <volume_slider name="volume_slider" tool_tip="Volume principal"/>
12 <button name="mute_master" tool_tip="Master muet" /> 12 <button name="mute_master" tool_tip="Coupez le volume principal"/>
13 <button name="expand" tool_tip="Ajuster les niveaux de volume individuels" /> 13 <button name="expand" tool_tip="Ajustez les niveaux de volume individuels"/>
14 <string name="play_label"> 14 <string name="play_label">
15 Jouer 15 Jouer
16 </string> 16 </string>
diff --git a/linden/indra/newview/skins/default/xui/fr/panel_media_remote.xml b/linden/indra/newview/skins/default/xui/fr/panel_media_remote.xml
index 50ef48d..3e86085 100644
--- a/linden/indra/newview/skins/default/xui/fr/panel_media_remote.xml
+++ b/linden/indra/newview/skins/default/xui/fr/panel_media_remote.xml
@@ -1,10 +1,10 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 1<?xml version="1.0" encoding="utf-8" standalone="yes"?>
2<panel name="music_remote"> 2<panel name="music_remote">
3 <text type="string" length="1" name="text"> 3 <text length="1" name="text" type="string">
4 Vidéo 4 Vidéo
5 </text> 5 </text>
6 <button label="" label_selected="" name="stop_btn" tool_tip="Arrêter le media" /> 6 <button label="" label_selected="" name="stop_btn" tool_tip="Arrêter le média"/>
7 <button label="" label_selected="" name="play_btn" tool_tip="Lire le flux" /> 7 <button label="" label_selected="" name="play_btn" tool_tip="Lire le flux"/>
8 <button label="" label_selected="" name="pause_btn" tool_tip="Suspendre le flux" /> 8 <button label="" label_selected="" name="pause_btn" tool_tip="Suspendre le flux"/>
9 <volume_slider name="volume_slider" tool_tip="Réglez le volume à l&apos;aide du curseur" /> 9 <volume_slider name="volume_slider" tool_tip="Réglez le volume à l&apos;aide du curseur"/>
10</panel> 10</panel>
diff --git a/linden/indra/newview/skins/default/xui/fr/panel_media_remote_expanded.xml b/linden/indra/newview/skins/default/xui/fr/panel_media_remote_expanded.xml
index f2cac09..33afb1c 100644
--- a/linden/indra/newview/skins/default/xui/fr/panel_media_remote_expanded.xml
+++ b/linden/indra/newview/skins/default/xui/fr/panel_media_remote_expanded.xml
@@ -1,6 +1,6 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 1<?xml version="1.0" encoding="utf-8" standalone="yes"?>
2<panel name="media_remote"> 2<panel name="media_remote">
3 <panel label="Audio et Vidéo" name="Volume Panel" /> 3 <panel label="Audio et Vidéo" name="Volume Panel"/>
4 <string name="play_label"> 4 <string name="play_label">
5 Jouer 5 Jouer
6 </string> 6 </string>
@@ -17,7 +17,7 @@
17 (URL cachée par le propriétaire de la parcelle) 17 (URL cachée par le propriétaire de la parcelle)
18 </string> 18 </string>
19 <string name="media_icon_tooltip_web"> 19 <string name="media_icon_tooltip_web">
20 Il y a du contenu web à cet endroit. Cliquez sur Jouer pour afficher le contenu web. 20 Il y a du contenu web à cet endroit. Cliquez sur Jouer pour afficher le contenu web.
21 </string> 21 </string>
22 <string name="media_icon_tooltip_movie"> 22 <string name="media_icon_tooltip_movie">
23 Il y a du contenu vidéo à cet endroit. Cliquez sur Jouer pour lire la vidéo. 23 Il y a du contenu vidéo à cet endroit. Cliquez sur Jouer pour lire la vidéo.
diff --git a/linden/indra/newview/skins/default/xui/fr/panel_overlaybar.xml b/linden/indra/newview/skins/default/xui/fr/panel_overlaybar.xml
index 11e8bff..dab1f79 100644
--- a/linden/indra/newview/skins/default/xui/fr/panel_overlaybar.xml
+++ b/linden/indra/newview/skins/default/xui/fr/panel_overlaybar.xml
@@ -1,18 +1,13 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 1<?xml version="1.0" encoding="utf-8" standalone="yes"?>
2<panel name="overlay"> 2<panel name="overlay">
3 <layout_stack name="overlay_layout_panel"> 3 <layout_stack name="overlay_layout_panel">
4 <layout_panel name="main_panel"> 4 <layout_panel name="main_panel">
5 <layout_stack name="chatbar_and_buttons"> 5 <layout_stack name="chatbar_and_buttons">
6 <layout_panel name="state_buttons"> 6 <layout_panel name="state_buttons">
7 <button label="IM reçus" label_selected="IM reçus" name="IM Received" 7 <button label="IM reçus" label_selected="IM reçus" name="IM Received" tool_tip="Vous avez reçu des messages instantanés. Cliquez pour afficher les IM."/>
8 tool_tip="Vous avez reçu un message instantané. Cliquez pour afficher les IM." /> 8 <button label="Disponible" label_selected="Disponible" name="Set Not Busy" tool_tip="Le chat et les IM ne s&apos;affichent pas. Cliquez ici pour ne plus être en mode occupé(e)."/>
9 <button label="Disponible" 9 <button label="Vue subjective" label_selected="Vue subjective" name="Mouselook" tool_tip="Utilisez la souris pour diriger votre vue. Si vous avez un pistolet, vous pouvez tirer en cliquant."/>
10 label_selected="Disponible" name="Set Not Busy" 10 <button label="Me lever" label_selected="Me lever" name="Stand Up" tool_tip="Cliquez ici pour vous lever."/>
11 tool_tip="Le chat et les IM ne s&apos;affichent pas. Cliquez ici pour ne pas apparaître occupé(e)." />
12 <button label="Vue subjective" label_selected="Vue subjective" name="Mouselook"
13 tool_tip="Utilisez la souris pour diriger votre vue. Si vous avez un pistolet, vous pouvez tirer en cliquant." />
14 <button label="Me lever" label_selected="Me lever" name="Stand Up"
15 tool_tip="Cliquez ici pour vous lever." />
16 </layout_panel> 11 </layout_panel>
17 </layout_stack> 12 </layout_stack>
18 </layout_panel> 13 </layout_panel>
diff --git a/linden/indra/newview/skins/default/xui/fr/panel_place.xml b/linden/indra/newview/skins/default/xui/fr/panel_place.xml
index 1df6495..d2f21a7 100644
--- a/linden/indra/newview/skins/default/xui/fr/panel_place.xml
+++ b/linden/indra/newview/skins/default/xui/fr/panel_place.xml
@@ -1,4 +1,4 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 1<?xml version="1.0" encoding="utf-8" standalone="yes"?>
2<panel name="Place" title="Emplacement"> 2<panel name="Place" title="Emplacement">
3 <text name="name_label"> 3 <text name="name_label">
4 Nom : 4 Nom :
@@ -9,14 +9,14 @@
9 <text name="information_label"> 9 <text name="information_label">
10 Informations : 10 Informations :
11 </text> 11 </text>
12 <text left="103" name="info_editor" width="338" /> 12 <text left="103" name="info_editor" width="338"/>
13 <text name="location_label"> 13 <text name="location_label">
14 Emplacement : 14 Emplacement :
15 </text> 15 </text>
16 <text left="103" name="location_editor" width="338" /> 16 <text left="103" name="location_editor" width="338"/>
17 <button label="Téléporter" name="teleport_btn" /> 17 <button label="Téléporter" name="teleport_btn"/>
18 <button label="Voir sur la carte" name="map_btn" /> 18 <button label="Voir sur la carte" name="map_btn"/>
19 <button label="Enchères..." name="auction_btn" /> 19 <button label="Enchères..." name="auction_btn"/>
20 <string name="traffic_text"> 20 <string name="traffic_text">
21 Trafic : [TRAFFIC] 21 Trafic : [TRAFFIC]
22 </string> 22 </string>
@@ -24,18 +24,18 @@
24 Surface : [AREA] m² 24 Surface : [AREA] m²
25 </string> 25 </string>
26 <string name="forsale_text"> 26 <string name="forsale_text">
27 En vente pour [PRICE] $L 27 En vente pour [PRICE] L$
28 </string> 28 </string>
29 <string name="auction_text"> 29 <string name="auction_text">
30 Code de l&apos;enchère [ID]. 30 Code de l&apos;enchère [ID].
31 </string> 31 </string>
32 <string name="server_update_text"> 32 <string name="server_update_text">
33 Les informations sur l&apos;emplacement ne sont pas disponibles sans mise à jour du serveur. 33 Les informations sur le lieu ne sont pas disponibles sans mise à jour du serveur.
34 </string> 34 </string>
35 <string name="server_error_text"> 35 <string name="server_error_text">
36 Aucune information sur cet emplacement n&apos;est disponible actuellement, veuillez réessayer ultérieurement. 36 Aucune information sur ce lieu n&apos;est disponible actuellement, veuillez réessayer ultérieurement.
37 </string> 37 </string>
38 <string name="server_forbidden_text"> 38 <string name="server_forbidden_text">
39 Les informations sur cet emplacement ne sont pas disponibles car l&apos;accès y est restreint. Veuillez vérifier vos permissions avec le propriétaire de la parcelle. 39 Les informations sur ce lieu ne sont pas disponibles car l&apos;accès y est restreint. Veuillez vérifier vos permissions avec le propriétaire de la parcelle.
40 </string> 40 </string>
41</panel> 41</panel>
diff --git a/linden/indra/newview/skins/default/xui/fr/panel_place_small.xml b/linden/indra/newview/skins/default/xui/fr/panel_place_small.xml
index 1df6495..50b8c8b 100644
--- a/linden/indra/newview/skins/default/xui/fr/panel_place_small.xml
+++ b/linden/indra/newview/skins/default/xui/fr/panel_place_small.xml
@@ -1,5 +1,5 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 1<?xml version="1.0" encoding="utf-8" standalone="yes"?>
2<panel name="Place" title="Emplacement"> 2<panel name="Place" title="Lieu">
3 <text name="name_label"> 3 <text name="name_label">
4 Nom : 4 Nom :
5 </text> 5 </text>
@@ -9,14 +9,14 @@
9 <text name="information_label"> 9 <text name="information_label">
10 Informations : 10 Informations :
11 </text> 11 </text>
12 <text left="103" name="info_editor" width="338" /> 12 <text left="103" name="info_editor" width="338"/>
13 <text name="location_label"> 13 <text name="location_label">
14 Emplacement : 14 Lieu :
15 </text> 15 </text>
16 <text left="103" name="location_editor" width="338" /> 16 <text left="103" name="location_editor" width="338"/>
17 <button label="Téléporter" name="teleport_btn" /> 17 <button label="Téléporter" name="teleport_btn"/>
18 <button label="Voir sur la carte" name="map_btn" /> 18 <button label="Voir sur la carte" name="map_btn"/>
19 <button label="Enchères..." name="auction_btn" /> 19 <button label="Enchères..." name="auction_btn"/>
20 <string name="traffic_text"> 20 <string name="traffic_text">
21 Trafic : [TRAFFIC] 21 Trafic : [TRAFFIC]
22 </string> 22 </string>
@@ -24,18 +24,18 @@
24 Surface : [AREA] m² 24 Surface : [AREA] m²
25 </string> 25 </string>
26 <string name="forsale_text"> 26 <string name="forsale_text">
27 En vente pour [PRICE] $L 27 En vente pour [PRICE] L$
28 </string> 28 </string>
29 <string name="auction_text"> 29 <string name="auction_text">
30 Code de l&apos;enchère [ID]. 30 Code de l&apos;enchère [ID].
31 </string> 31 </string>
32 <string name="server_update_text"> 32 <string name="server_update_text">
33 Les informations sur l&apos;emplacement ne sont pas disponibles sans mise à jour du serveur. 33 Les informations sur le lieu ne sont pas disponibles sans mise à jour du serveur.
34 </string> 34 </string>
35 <string name="server_error_text"> 35 <string name="server_error_text">
36 Aucune information sur cet emplacement n&apos;est disponible actuellement, veuillez réessayer ultérieurement. 36 Aucune information sur ce lieu n&apos;est disponible actuellement, veuillez réessayer ultérieurement.
37 </string> 37 </string>
38 <string name="server_forbidden_text"> 38 <string name="server_forbidden_text">
39 Les informations sur cet emplacement ne sont pas disponibles car l&apos;accès y est restreint. Veuillez vérifier vos permissions avec le propriétaire de la parcelle. 39 Les informations sur ce lieu ne sont pas disponibles car l&apos;accès y est restreint. Veuillez vérifier vos permissions avec le propriétaire de la parcelle.
40 </string> 40 </string>
41</panel> 41</panel>
diff --git a/linden/indra/newview/skins/default/xui/fr/panel_preferences_audio.xml b/linden/indra/newview/skins/default/xui/fr/panel_preferences_audio.xml
index 8298b6e..eb1ce2f 100644
--- a/linden/indra/newview/skins/default/xui/fr/panel_preferences_audio.xml
+++ b/linden/indra/newview/skins/default/xui/fr/panel_preferences_audio.xml
@@ -1,29 +1,26 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 1<?xml version="1.0" encoding="utf-8" standalone="yes"?>
2<panel label="Audio et Vidéo" name="Media panel"> 2<panel label="Audio et Vidéo" name="Media panel">
3 <text type="string" length="1" name="muting_text"> 3 <text length="1" name="muting_text" type="string">
4 Volume : 4 Volume :
5 </text> 5 </text>
6 <panel left="159" name="Volume Panel" width="249" /> 6 <panel left="159" name="Volume Panel" width="249"/>
7 <check_box label="Désactiver le son" name="disable audio" /> 7 <check_box label="Couper le son" name="disable audio"/>
8 <text name="streaming_prefs_text" width="145" bottom="-195" > 8 <text bottom="-195" name="streaming_prefs_text" width="145">
9 Préférences de flux continu : 9 Préférences média :
10 </text> 10 </text>
11 <text name="audio_prefs_text"> 11 <text name="audio_prefs_text">
12 Préférences audio : 12 Préférences audio :
13 </text> 13 </text>
14 <panel label="Volume" name="Volume Panel" /> 14 <panel label="Volume" name="Volume Panel"/>
15 <check_box label="Désactiver le son lorsque la fenêtre est minimisée" 15 <check_box label="Couper le son lorsque la fenêtre est minimisée" left="159" name="mute_when_minimized"/>
16 name="mute_when_minimized" left="159" /> 16 <check_box bottom="-200" height="32" label="Jouer la musique disponible
17 <check_box 17(consommateur en bande passante)" left="159" name="streaming_music"/>
18 label="Jouer des flux musicaux quand cela est possible&#10;(gourmand en bande passante)" 18 <check_box bottom_delta="-32" height="32" label="Jouer le média disponible
19 name="streaming_music" left="159" bottom="-200" height="32" /> 19(consommateur en bande passante)" left="159" name="streaming_video"/>
20 <check_box 20 <check_box bottom_delta="-32" label="Lire automatiquement le média" left="179" name="auto_streaming_video"/>
21 label="Jouer des flux médias quand cela est possible&#10;(gourmand en bande passante)" 21 <slider label="Effet Doppler" label_width="115" left="165" name="Doppler Effect"/>
22 name="streaming_video" left="159" bottom_delta="-32" height="32" /> 22 <slider label="Facteur d&apos;éloignement" label_width="115" left="165" name="Distance Factor"/>
23 <check_box label="Lire automatiquement le média" name="auto_streaming_video" left="179" bottom_delta="-32" /> 23 <slider label="Facteur d&apos;atténuation" label_width="115" left="165" name="Rolloff Factor"/>
24 <slider label="Effet Doppler" name="Doppler Effect" left="165" label_width="115" /> 24 <spinner label="Alerte L$" left="165" name="L$ Change Threshold"/>
25 <slider label="Facteur d&apos;éloignement" name="Distance Factor" left="165" label_width="115" /> 25 <spinner label="Alerte santé" left="165" name="Health Change Threshold"/>
26 <slider label="Facteur d&apos;atténuation" name="Rolloff Factor" left="165" label_width="115" />
27 <spinner label="Alerte dépenses" name="L$ Change Threshold" left="165" />
28 <spinner label="Alerte santé" name="Health Change Threshold" left="165" />
29</panel> 26</panel>
diff --git a/linden/indra/newview/skins/default/xui/fr/panel_preferences_chat.xml b/linden/indra/newview/skins/default/xui/fr/panel_preferences_chat.xml
index ddd7f59..55faeb5 100644
--- a/linden/indra/newview/skins/default/xui/fr/panel_preferences_chat.xml
+++ b/linden/indra/newview/skins/default/xui/fr/panel_preferences_chat.xml
@@ -1,66 +1,59 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 1<?xml version="1.0" encoding="utf-8" standalone="yes"?>
2<panel label="Chat écrit" name="chat"> 2<panel label="Chat écrit" name="chat">
3 <text type="string" length="1" name="text_box"> 3 <text length="1" name="text_box" type="string">
4 Taille de la police 4 Taille de la police
5du chat : 5du chat :
6 </text> 6 </text>
7 <radio_group name="chat font size"> 7 <radio_group name="chat_font_size">
8 <radio_item type="string" length="1" name="radio"> 8 <radio_item length="1" name="radio" type="string">
9 Petite 9 Petite
10 </radio_item> 10 </radio_item>
11 <radio_item type="string" length="1" name="radio2"> 11 <radio_item length="1" name="radio2" type="string">
12 Moyenne 12 Moyenne
13 </radio_item> 13 </radio_item>
14 <radio_item type="string" length="1" name="radio3"> 14 <radio_item length="1" name="radio3" type="string">
15 Grande 15 Grande
16 </radio_item> 16 </radio_item>
17 </radio_group> 17 </radio_group>
18 <text type="string" length="1" name="text_box2"> 18 <text length="1" name="text_box2" type="string">
19 Couleur du chat : 19 Couleur du chat :
20 </text> 20 </text>
21 <color_swatch label="Vous" name="user" /> 21 <color_swatch label="Vous" name="user"/>
22 <color_swatch label="Les autres" name="agent" width="60" /> 22 <color_swatch label="Les autres" name="agent" width="60"/>
23 <color_swatch label="IM" left_delta="64" name="im" /> 23 <color_swatch label="IM" left_delta="64" name="im"/>
24 <color_swatch label="Système" name="system" /> 24 <color_swatch label="Système" name="system"/>
25 <color_swatch label="Erreurs" name="script_error" /> 25 <color_swatch label="Erreurs" name="script_error"/>
26 <color_swatch label="Objets" name="objects" /> 26 <color_swatch label="Objets" name="objects"/>
27 <color_swatch label="Propriétaire" name="owner" width="60" /> 27 <color_swatch label="Propriétaire" name="owner" width="60"/>
28 <color_swatch label="Bulle" left_delta="64" name="background" /> 28 <color_swatch label="Bulle" left_delta="64" name="background"/>
29 <color_swatch label="URL" name="links" /> 29 <color_swatch label="URL" name="links"/>
30 <text type="string" length="1" name="text_box3"> 30 <text length="1" name="text_box3" type="string">
31 Console du chat : 31 Console du chat :
32 </text> 32 </text>
33 <spinner label="Effacer le texte après" label_width="112" name="fade_chat_time" 33 <spinner label="Effacer le texte après" label_width="112" name="fade_chat_time" width="162"/>
34 width="162" /> 34 <text left="313" length="1" name="text_box4" type="string">
35 <text type="string" length="1" left="313" name="text_box4">
36 s 35 s
37 </text> 36 </text>
38 <spinner left="335" name="max_chat_count" /> 37 <spinner left="335" name="max_chat_count"/>
39 <text type="string" length="1" left="397" name="text_box5" width="74"> 38 <text left="397" length="1" name="text_box5" type="string" width="74">
40 (nb de lignes) 39 lignes
41 </text> 40 </text>
42 <slider label="Opacité" name="console_opacity" /> 41 <slider label="Opacité" name="console_opacity"/>
43 <text type="string" length="1" name="text_box6"> 42 <text length="1" name="text_box6" type="string">
44 Options du chat : 43 Options du chat :
45 </text> 44 </text>
46 <check_box label="Utiliser la largeur du plein écran (redémarrage requis)" 45 <check_box label="Utiliser la largeur de l&apos;écran (redémarrage requis)" name="chat_full_width_check"/>
47 name="chat_full_width_check" /> 46 <check_box label="Fermer le chat après avoir appuyé sur Entrée" name="close_chat_on_return_check"/>
48 <check_box label="Fermer le chat après avoir appuyé sur Entrée" 47 <check_box label="Faire bouger l&apos;avatar avec les touches de direction" name="arrow_keys_move_avatar_check"/>
49 name="close_chat_on_return_check" /> 48 <check_box label="Afficher les heures dans le chat local" name="show_timestamps_check"/>
50 <check_box label="Faire bouger l&apos;avatar avec les touches de direction" 49 <check_box label="Jouer l&apos;animation clavier quand vous écrivez" name="play_typing_animation"/>
51 name="arrow_keys_move_avatar_check" /> 50 <text length="1" name="text_box7" type="string">
52 <check_box label="Afficher les marques temporelles dans le chat local"
53 name="show_timestamps_check" />
54 <check_box label="Montrer lorsque vous écrivez pendant la discussion"
55 name="play_typing_animation" />
56 <text type="string" length="1" name="text_box7">
57 Bulles de chat  : 51 Bulles de chat  :
58 </text> 52 </text>
59 <check_box label="Afficher les bulles de chat" name="bubble_text_chat" /> 53 <check_box label="Afficher les bulles de chat" name="bubble_text_chat"/>
60 <slider label="Opacité" name="bubble_chat_opacity" /> 54 <slider label="Opacité" name="bubble_chat_opacity"/>
61 <text type="string" length="1" name="text_box8"> 55 <text length="1" name="text_box8" type="string">
62 Erreurs de script : 56 Erreurs de script :
63 </text> 57 </text>
64 <check_box label="Afficher les erreurs et avertissements comme chat ordinaire" 58 <check_box label="Afficher les erreurs et avertissements dans le chat" name="script_errors_as_chat"/>
65 name="script_errors_as_chat" />
66</panel> 59</panel>
diff --git a/linden/indra/newview/skins/default/xui/fr/panel_preferences_general.xml b/linden/indra/newview/skins/default/xui/fr/panel_preferences_general.xml
index 34d3bda..04a7172 100644
--- a/linden/indra/newview/skins/default/xui/fr/panel_preferences_general.xml
+++ b/linden/indra/newview/skins/default/xui/fr/panel_preferences_general.xml
@@ -1,15 +1,14 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 1<?xml version="1.0" encoding="utf-8" standalone="yes"?>
2<panel label="Général" name="general_panel"> 2<panel label="Général" name="general_panel">
3 <combo_box name="location_combobox" width="166"> 3 <combo_box name="location_combobox" width="166">
4 <combo_item name="MyHome"> 4 <combo_item name="MyHome">
5 Mon domicile 5 Domicile
6 </combo_item> 6 </combo_item>
7 <combo_item name="MyLastLocation"> 7 <combo_item name="MyLastLocation">
8 Mon dernier emplacement 8 Dernier emplacement
9 </combo_item> 9 </combo_item>
10 </combo_box> 10 </combo_box>
11 <check_box label="Afficher le lieu de départ sur l&apos;écran de connexion" 11 <check_box label="Afficher le lieu de départ sur l&apos;écran de connexion" name="show_location_checkbox"/>
12 name="show_location_checkbox" />
13 <combo_box name="fade_out_combobox" width="166"> 12 <combo_box name="fade_out_combobox" width="166">
14 <combo_item name="Never"> 13 <combo_item name="Never">
15 Jamais 14 Jamais
@@ -21,79 +20,68 @@
21 Toujours 20 Toujours
22 </combo_item> 21 </combo_item>
23 </combo_box> 22 </combo_box>
24 <check_box label="Masquer mon nom sur mon écran" name="show_my_name_checkbox" /> 23 <check_box label="Masquer mon nom sur mon écran" name="show_my_name_checkbox"/>
25 <text name="group_titles_textbox"> 24 <text name="group_titles_textbox">
26 Titres de groupe : 25 Titres de groupe :
27 </text> 26 </text>
28 <check_box label="Masquer tous les titres de groupe" 27 <check_box label="Masquer tous les titres de groupe" name="show_all_title_checkbox"/>
29 name="show_all_title_checkbox" /> 28 <check_box label="Masquer mon titre de groupe" name="show_my_title_checkbox"/>
30 <check_box label="Masquer mon titre de groupe" name="show_my_title_checkbox" /> 29 <check_box label="Nom de l&apos;avatar en petit" name="small_avatar_names_checkbox"/>
31 <check_box label="Nom de l&apos;avatar en petit" name="small_avatar_names_checkbox" /> 30 <check_box label="M&apos;avertir lorsque mes amis se connectent" name="friends_online_notify_checkbox"/>
32 <check_box label="M&apos;avertir lorsque mes amis se connectent"
33 name="friends_online_notify_checkbox" />
34 <text name="UI Size:"> 31 <text name="UI Size:">
35 Taille de l&apos;interface : 32 Taille de l&apos;interface :
36 </text> 33 </text>
37 <check_box label="Utiliser une échelle indépendante de la résolution" 34 <check_box label="Utiliser une échelle indépendante de la résolution" name="ui_auto_scale"/>
38 name="ui_auto_scale" /> 35 <check_box label="Pivoter la mini-carte" name="rotate_mini_map_checkbox"/>
39 <check_box label="Faire pivoter la mini-carte" name="rotate_mini_map_checkbox" /> 36 <check_box label="M&apos;avertir lorsque je dépense ou reçois des L$" name="notify_money_change_checkbox"/>
40 <check_box label="M&apos;avertir lorsque je dépense ou reçois des dollars Linden ($L)" 37 <check_box label="Détecter carte graphique au prochain démarrage" name="probe_hardware_checkbox" tool_tip="Second Life configure automatiquement certains réglages de la carte graphique d&apos;après votre configuration matérielle. Nous vous recommandons d&apos;effectuer la détection à chaque nouvelle installation de matériel."/>
41 name="notify_money_change_checkbox" /> 38 <check_box label="Utiliser le sélecteur de couleur par défaut" name="use_system_color_picker_checkbox" tool_tip="Utiliser le sélecteur de couleur par défaut au lieu de celui intégré à Second Life."/>
42 <check_box label="Détecter carte graphique au prochain démarrage" 39 <check_box label="Afficher la boîte de recherche en haut à droite de l&apos;écran" name="show_search_panel" tool_tip="Affiche la boîte de recherche incorporée."/>
43 name="probe_hardware_checkbox" 40 <text length="1" name="start_location_textbox" type="string">
44 tool_tip="Second Life configure automatiquement certains réglages de la carte graphique d&apos;après votre configuration matérielle. Nous vous recommandons d&apos;effectuer la détection à chaque nouvelle installation de matériel." />
45 <check_box label="Utiliser le sélecteur de couleur par défaut"
46 name="use_system_color_picker_checkbox"
47 tool_tip="Utiliser le sélecteur de couleur par défaut au lieu de celui intégré à Second Life." />
48 <check_box label="Afficher la boîte de recherche en haut à droite de l&apos;écran"
49 name="show_search_panel"
50 tool_tip="Affiche la boîte de recherche incorporée." />
51 <text type="string" length="1" name="start_location_textbox">
52 Lieu de départ : 41 Lieu de départ :
53 </text> 42 </text>
54 <text type="string" length="1" name="show_names_textbox"> 43 <text length="1" name="show_names_textbox" type="string">
55 Afficher les noms : 44 Afficher les noms :
56 </text> 45 </text>
57 <text type="string" length="1" name="effects_color_textbox"> 46 <text length="1" name="effects_color_textbox" type="string">
58 Couleur de mes effets : 47 Couleur du faisceau de sélection :
59 </text> 48 </text>
60 <text type="string" length="1" name="seconds_textbox"> 49 <text length="1" name="seconds_textbox" type="string">
61 secondes 50 secondes
62 </text> 51 </text>
63 <text type="string" length="1" name="crash_report_textbox"> 52 <text length="1" name="crash_report_textbox" type="string">
64 Rapports de crash : 53 Rapports de crash :
65 </text> 54 </text>
66 <text type="string" length="1" name="language_textbox"> 55 <text length="1" name="language_textbox" type="string">
67 Langue : 56 Langue :
68 </text> 57 </text>
69 <text type="string" length="1" left_delta="313" name="language_textbox2"> 58 <text left_delta="313" length="1" name="language_textbox2" type="string">
70 (nécessite un redémarrage) 59 (redémarrage requis)
71 </text> 60 </text>
72 <radio_group name="fade_out_radio"> 61 <radio_group name="fade_out_radio">
73 <radio_item type="string" length="1" name="Never"> 62 <radio_item length="1" name="Never" type="string">
74 Jamais 63 Jamais
75 </radio_item> 64 </radio_item>
76 <radio_item type="string" length="1" name="Temporarily"> 65 <radio_item length="1" name="Temporarily" type="string">
77 Temporairement 66 Temporairement
78 </radio_item> 67 </radio_item>
79 <radio_item type="string" length="1" name="Always"> 68 <radio_item length="1" name="Always" type="string">
80 Toujours 69 Toujours
81 </radio_item> 70 </radio_item>
82 </radio_group> 71 </radio_group>
83 <color_swatch label="" name="effect_color_swatch" 72 <color_swatch label="" name="effect_color_swatch" tool_tip="Cliquer pour ouvrir le sélecteur de couleurs"/>
84 tool_tip="Cliquer pour ouvrir le sélecteur de couleurs" /> 73 <spinner label="Absent(e) après :" name="afk_timeout_spinner"/>
85 <spinner label="Absent(e) après :" name="afk_timeout_spinner" />
86 <text name="region_name_prompt"> 74 <text name="region_name_prompt">
87 &lt;Saisissez le nom de la région&gt; 75 &lt;Saisissez le nom de la région&gt;
88 </text> 76 </text>
89 <combo_box name="crash_behavior_combobox" width="166"> 77 <combo_box name="crash_behavior_combobox" width="166">
90 <combo_item type="string" length="1" name="Askbeforesending"> 78 <combo_item length="1" name="Askbeforesending" type="string">
91 Demander avant d&apos;envoyer 79 Demander avant d&apos;envoyer
92 </combo_item> 80 </combo_item>
93 <combo_item type="string" length="1" name="Alwayssend"> 81 <combo_item length="1" name="Alwayssend" type="string">
94 Toujours envoyer 82 Toujours envoyer
95 </combo_item> 83 </combo_item>
96 <combo_item type="string" length="1" name="Neversend"> 84 <combo_item length="1" name="Neversend" type="string">
97 Ne jamais envoyer 85 Ne jamais envoyer
98 </combo_item> 86 </combo_item>
99 </combo_box> 87 </combo_box>
@@ -101,22 +89,22 @@
101 <combo_item name="System Default Language"> 89 <combo_item name="System Default Language">
102 Choix par défaut 90 Choix par défaut
103 </combo_item> 91 </combo_item>
104 <combo_item type="string" length="1" name="English"> 92 <combo_item length="1" name="English" type="string">
105 Anglais 93 Anglais
106 </combo_item> 94 </combo_item>
107 <combo_item type="string" length="1" name="Deutsch(German)"> 95 <combo_item length="1" name="Deutsch(German)" type="string">
108 Deutsch (Allemand) - Bêta 96 Deutsch (Allemand) - Bêta
109 </combo_item> 97 </combo_item>
110 <combo_item name="French"> 98 <combo_item name="French">
111 Français - Bêta 99 Français - Bêta
112 </combo_item> 100 </combo_item>
113 <combo_item type="string" length="1" name="(Japanese)"> 101 <combo_item length="1" name="(Japanese)" type="string">
114 日本語 (Japonais) - Bêta 102 日本語 (Japonais) - Bêta
115 </combo_item> 103 </combo_item>
116 <combo_item type="string" length="1" name="(Korean)"> 104 <combo_item length="1" name="(Korean)" type="string">
117 한국어 (Coréen) - Bêta 105 한국어 (Coréen) - Bêta
118 </combo_item> 106 </combo_item>
119 <combo_item type="string" length="1" name="Chinese"> 107 <combo_item length="1" name="Chinese" type="string">
120 汉语/漢語 (Chinois) - Bêta 108 汉语/漢語 (Chinois) - Bêta
121 </combo_item> 109 </combo_item>
122 <combo_item name="Portugese"> 110 <combo_item name="Portugese">
@@ -126,6 +114,5 @@
126 Español (Espagnol) - Bêta 114 Español (Espagnol) - Bêta
127 </combo_item> 115 </combo_item>
128 </combo_box> 116 </combo_box>
129 <check_box label="Partager la langue avec les objets" name="language_is_public" 117 <check_box label="Partager la langue avec les objets" name="language_is_public" tool_tip="Cette option permet de faire connaître aux objets du Monde votre langue favorite."/>
130 tool_tip="Cette option permet de faire connaître aux objets du Monde votre langue favorite." />
131</panel> 118</panel>
diff --git a/linden/indra/newview/skins/default/xui/fr/panel_preferences_graphics1.xml b/linden/indra/newview/skins/default/xui/fr/panel_preferences_graphics1.xml
index bf2b336..00e4cae 100644
--- a/linden/indra/newview/skins/default/xui/fr/panel_preferences_graphics1.xml
+++ b/linden/indra/newview/skins/default/xui/fr/panel_preferences_graphics1.xml
@@ -1,8 +1,8 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 1<?xml version="1.0" encoding="utf-8" standalone="yes"?>
2<panel label="Graphiques" name="Display panel"> 2<panel label="Graphiques" name="Display panel">
3 <button label="?" name="GraphicsPreferencesHelpButton" /> 3 <button label="?" name="GraphicsPreferencesHelpButton"/>
4 <text_editor bottom="-56" height="40" left="25" name="FullScreenInfo" width="460"> 4 <text_editor bottom="-56" height="40" left="25" name="FullScreenInfo" width="460">
5 Si cette option n&apos;est pas cochée, le visualisateur prend tout l&apos;écran lorsque vous êtes connecté(e). 5 Cochez cette option pour que le client s&apos;affiche en plein écran.
6 </text_editor> 6 </text_editor>
7 <text name="WindowSizeLabel"> 7 <text name="WindowSizeLabel">
8 Taille de la fenêtre : 8 Taille de la fenêtre :
@@ -31,42 +31,42 @@
31 Rapport hauteur/largeur : 31 Rapport hauteur/largeur :
32 </text> 32 </text>
33 <combo_box name="aspect_ratio" tool_tip="largeur/hauteur"> 33 <combo_box name="aspect_ratio" tool_tip="largeur/hauteur">
34 <combo_item type="string" length="1" name="4:3(StandardCRT)"> 34 <combo_item length="1" name="4:3(StandardCRT)" type="string">
35 4:3 (Standard CRT) 35 4:3 (Standard CRT)
36 </combo_item> 36 </combo_item>
37 <combo_item type="string" length="1" name="5:4(1280x1024LCD)"> 37 <combo_item length="1" name="5:4(1280x1024LCD)" type="string">
38 5:4 (1280 x 1024 LCD) 38 5:4 (1280 x 1024 LCD)
39 </combo_item> 39 </combo_item>
40 <combo_item name="8:5(Widescreen)"> 40 <combo_item name="8:5(Widescreen)">
41 8 : 5 (écran large) 41 8:5 (écran large)
42 </combo_item> 42 </combo_item>
43 <combo_item type="string" length="1" name="16:9(Widescreen)"> 43 <combo_item length="1" name="16:9(Widescreen)" type="string">
44 16:9 (plein écran) 44 16:9 (plein écran)
45 </combo_item> 45 </combo_item>
46 </combo_box> 46 </combo_box>
47 <text type="string" length="1" name="text"> 47 <text length="1" name="text" type="string">
48 Résolution d&apos;affichage : 48 Résolution d&apos;affichage :
49 </text> 49 </text>
50 <text type="string" length="1" name="Fullscreen Aspect Ratio:"> 50 <text length="1" name="Fullscreen Aspect Ratio:" type="string">
51 Format de plein écran : 51 Format de plein écran :
52 </text> 52 </text>
53 <text type="string" length="1" name="(width / height)"> 53 <text length="1" name="(width / height)" type="string">
54 (largeur / hauteur) 54 (largeur / hauteur)
55 </text> 55 </text>
56 <text type="string" length="1" name="UI Size:"> 56 <text length="1" name="UI Size:" type="string">
57 Taille de l&apos;IU : 57 Taille de l&apos;IU :
58 </text> 58 </text>
59 <text type="string" length="1" name="(meters, lower is faster)"> 59 <text length="1" name="(meters, lower is faster)" type="string">
60 (mètres, moins = plus rapide) 60 (mètres, moins = plus rapide)
61 </text> 61 </text>
62 <text type="string" length="1" name="text2"> 62 <text length="1" name="text2" type="string">
63 Options d&apos;affichage : 63 Options d&apos;affichage :
64 </text> 64 </text>
65 <check_box label="Lancer Second Life dans une fenêtre" name="windowed mode" /> 65 <check_box label="Lancer Second Life en mode fenêtré" name="windowed mode"/>
66 <check_box label="Auto-détection du ratio" left="350" name="aspect_auto_detect" /> 66 <check_box label="Auto-détection du ratio" left="350" name="aspect_auto_detect"/>
67 <check_box label="Utiliser échelle de résolution indépendante" name="ui_auto_scale" /> 67 <check_box label="Utiliser échelle de résolution indépendante" name="ui_auto_scale"/>
68 <check_box label="Montrer l&apos;avatar en mode Mouselook" name="avfp" /> 68 <check_box label="Montrer l&apos;avatar en vue subjective" name="avfp"/>
69 <spinner label="Draw Distance :" name="draw_distance" /> 69 <spinner label="Distance d&apos;affichage :" name="draw_distance"/>
70 <text name="HigherText"> 70 <text name="HigherText">
71 Qualité et 71 Qualité et
72 </text> 72 </text>
@@ -91,28 +91,27 @@
91 <text bottom="-86" left="325" name="HigherText2"> 91 <text bottom="-86" left="325" name="HigherText2">
92 Plus élevée 92 Plus élevée
93 </text> 93 </text>
94 <text name="QualityText2" visible="false" /> 94 <text name="QualityText2" visible="false"/>
95 <check_box label="Personnaliser" left="395" name="CustomSettings" /> 95 <check_box label="Personnaliser" left="395" name="CustomSettings"/>
96 <text name="ShadersText"> 96 <text name="ShadersText">
97 Shaders : 97 Effets :
98 </text> 98 </text>
99 <check_box label="Placage de relief et brillance" name="BumpShiny" /> 99 <check_box label="Placage de relief et brillance" name="BumpShiny"/>
100 <check_box label="Shaders de base" name="BasicShaders" 100 <check_box label="Effets de base" name="BasicShaders" tool_tip="Désactiver cette option peut empêcher certains drivers de cartes graphiques de planter."/>
101 tool_tip="Désactiver cette option peut empêcher certains drivers de cartes graphiques de planter." /> 101 <check_box label="Effets atmosphériques" name="WindLightUseAtmosShaders"/>
102 <check_box label="Shaders atmosphériques" name="WindLightUseAtmosShaders" /> 102 <check_box label="Reflets de l&apos;eau" name="Reflections"/>
103 <check_box label="Reflets de l&apos;eau" name="Reflections" />
104 <text name="ReflectionDetailText"> 103 <text name="ReflectionDetailText">
105 Détails des reflets : 104 Objets reflétés :
106 </text> 105 </text>
107 <radio_group name="ReflectionDetailRadio"> 106 <radio_group name="ReflectionDetailRadio">
108 <radio_item name="0"> 107 <radio_item name="0">
109 Terrain et Arbres 108 Terrain et Arbres
110 </radio_item> 109 </radio_item>
111 <radio_item name="1"> 110 <radio_item name="1">
112 Tous les objets statiques 111 Objets statiques
113 </radio_item> 112 </radio_item>
114 <radio_item name="2"> 113 <radio_item name="2">
115 Tous les objets et avatars 114 Objets et avatars
116 </radio_item> 115 </radio_item>
117 <radio_item name="3"> 116 <radio_item name="3">
118 Tout 117 Tout
@@ -121,27 +120,27 @@
121 <text name="AvatarRenderingText"> 120 <text name="AvatarRenderingText">
122 Rendu de l&apos;avatar : 121 Rendu de l&apos;avatar :
123 </text> 122 </text>
124 <check_box label="Avatars éloignés en 2D" name="AvatarImpostors" /> 123 <check_box label="Avatars éloignés en 2D" name="AvatarImpostors"/>
125 <check_box label="Rendu matériel des skins" name="AvatarVertexProgram" /> 124 <check_box label="Accélération du rendu" name="AvatarVertexProgram"/>
126 <check_box label="Habit de l&apos;avatar" name="AvatarCloth" /> 125 <check_box label="Mouvement des habits" name="AvatarCloth"/>
127 <text name="DrawDistanceMeterText1"> 126 <text name="DrawDistanceMeterText1">
128 m 127 m
129 </text> 128 </text>
130 <text name="DrawDistanceMeterText2"> 129 <text name="DrawDistanceMeterText2">
131 m 130 m
132 </text> 131 </text>
133 <slider label="Distance d&apos;affichage :" name="DrawDistance" /> 132 <slider label="Limite d&apos;affichage :" name="DrawDistance"/>
134 <slider label="Nombre de particules max. :" label_width="143" name="MaxParticleCount" /> 133 <slider label="Nombre de particules max. :" label_width="143" name="MaxParticleCount"/>
135 <slider label="Qualité post-traitement :" name="RenderPostProcess" /> 134 <slider label="Qualité post-traitement :" name="RenderPostProcess"/>
136 <text name="MeshDetailText"> 135 <text name="MeshDetailText">
137 Détails du maillage : 136 Détails des rendus :
138 </text> 137 </text>
139 <slider label=" Objets :" name="ObjectMeshDetail" /> 138 <slider label=" Objets :" name="ObjectMeshDetail"/>
140 <slider label=" Flexiprims :" name="FlexibleMeshDetail" /> 139 <slider label=" Flexiprims :" name="FlexibleMeshDetail"/>
141 <slider label=" Arbres :" name="TreeMeshDetail" /> 140 <slider label=" Arbres :" name="TreeMeshDetail"/>
142 <slider label=" Avatars :" name="AvatarMeshDetail" /> 141 <slider label=" Avatars :" name="AvatarMeshDetail"/>
143 <slider label=" Terrain :" name="TerrainMeshDetail" /> 142 <slider label="Relief :" name="TerrainMeshDetail"/>
144 <slider label=" Ciel :" name="SkyMeshDetail" /> 143 <slider label=" Ciel :" name="SkyMeshDetail"/>
145 <text name="PostProcessText"> 144 <text name="PostProcessText">
146 Faible 145 Faible
147 </text> 146 </text>
@@ -164,7 +163,7 @@
164 Faible 163 Faible
165 </text> 164 </text>
166 <text name="LightingDetailText"> 165 <text name="LightingDetailText">
167 Détails de la lumière : 166 Sources lumineuses :
168 </text> 167 </text>
169 <radio_group name="LightingDetailRadio"> 168 <radio_group name="LightingDetailRadio">
170 <radio_item name="SunMoon"> 169 <radio_item name="SunMoon">
@@ -175,7 +174,7 @@
175 </radio_item> 174 </radio_item>
176 </radio_group> 175 </radio_group>
177 <text left="380" name="TerrainDetailText"> 176 <text left="380" name="TerrainDetailText">
178 Détails du terrain : 177 Rendu du terrain :
179 </text> 178 </text>
180 <radio_group name="TerrainDetailRadio"> 179 <radio_group name="TerrainDetailRadio">
181 <radio_item name="0"> 180 <radio_item name="0">
@@ -185,9 +184,8 @@
185 Élevé 184 Élevé
186 </radio_item> 185 </radio_item>
187 </radio_group> 186 </radio_group>
188 <button label="Paramètres recommandés" name="Defaults" /> 187 <button label="Paramètres recommandés" name="Defaults"/>
189 <button label="Configuration du matériel" label_selected="Configuration du matériel" 188 <button label="Configuration du matériel" label_selected="Configuration du matériel" name="GraphicsHardwareButton"/>
190 name="GraphicsHardwareButton" />
191 <text name="resolution_format"> 189 <text name="resolution_format">
192 [RES_X] x [RES_Y] 190 [RES_X] x [RES_Y]
193 </text> 191 </text>
diff --git a/linden/indra/newview/skins/default/xui/fr/panel_preferences_im.xml b/linden/indra/newview/skins/default/xui/fr/panel_preferences_im.xml
index 2640bd5..e855e6a 100644
--- a/linden/indra/newview/skins/default/xui/fr/panel_preferences_im.xml
+++ b/linden/indra/newview/skins/default/xui/fr/panel_preferences_im.xml
@@ -1,38 +1,32 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 1<?xml version="1.0" encoding="utf-8" standalone="yes"?>
2<panel label="Communication" name="im"> 2<panel label="Communication" name="im">
3 <text type="string" length="1" name="text_box"> 3 <text length="1" name="text_box" type="string">
4 Mon statut en ligne : 4 Mon statut en ligne :
5 </text> 5 </text>
6 <check_box label="Seuls mes amis et groupes voient quand je suis connecté(e)" 6 <check_box label="Seuls mes amis et groupes voient quand je suis connecté(e)" name="online_visibility"/>
7 name="online_visibility" />
8 <text name="log_in_to_change"> 7 <text name="log_in_to_change">
9 se connecter pour changer 8 se connecter pour changer
10 </text> 9 </text>
11 <check_box label="Envoyer l&apos;IM à une adresse e-mail ([EMAIL])" 10 <check_box label="Envoyer les IM à mon adresse e-mail ([EMAIL])" name="send_im_to_email"/>
12 name="send_im_to_email" /> 11 <check_box label="Inclure les IM dans le chat local" name="include_im_in_chat_history"/>
13 <check_box label="Inclure les IM dans le chat local" name="include_im_in_chat_history" /> 12 <check_box label="Afficher l&apos;heure dans les IM" name="show_timestamps_check"/>
14 <check_box label="Afficher les marques temporelles dans les IM" 13 <check_box label="Me prévenir quand des amis se connectent" name="friends_online_notify_checkbox"/>
15 name="show_timestamps_check" />
16 <check_box label="Me prévenir quand des amis se connectent"
17 name="friends_online_notify_checkbox" />
18 <text name="text_box3"> 14 <text name="text_box3">
19 Réponse mode occupé : 15 Réponse si occupé(e) :
20 </text> 16 </text>
21 <text name="text_box4"> 17 <text name="text_box4">
22 Options de connexion : 18 Options de connexion :
23 </text> 19 </text>
24 <check_box label="Enregistrer un journal des IM sur mon ordinateur" 20 <check_box label="Enregistrer les IM sur mon ordinateur" name="log_instant_messages"/>
25 name="log_instant_messages" /> 21 <check_box label="Inclure les heures" name="log_instant_messages_timestamp"/>
26 <check_box label="Inclure les marques temporelles" name="log_instant_messages_timestamp" /> 22 <check_box label="Enregistrer le chat local sur mon ordinateur" name="log_chat"/>
27 <check_box label="Enregistrer un journal du chat local sur mon ordinateur" name="log_chat" /> 23 <check_box label="Inclure la fin de la dernière conversation IM" name="log_show_history"/>
28 <check_box label="Inclure la fin de la dernière conversation IM" name="log_show_history" /> 24 <check_box label="Inclure les heures" name="log_chat_timestamp"/>
29 <check_box label="Inclure les marques temporelles" name="log_chat_timestamp" /> 25 <check_box label="Inclure les IM reçus" name="log_chat_IM"/>
30 <check_box label="Inclure les IM reçus" name="log_chat_IM" /> 26 <check_box label="Inclure la date avec les heures" name="log_date_timestamp"/>
31 <check_box label="Inclure la date avec les marques temporelles" name="log_date_timestamp" /> 27 <button label="Changer d&apos;emplacement" label_selected="Changer d&apos;emplacement" name="log_path_button" width="150"/>
32 <button label="Changer d&apos;emplacement" label_selected="Changer d&apos;emplacement" 28 <line_editor left="308" name="log_path_string" right="-20"/>
33 name="log_path_button" width="150" /> 29 <text length="1" name="text_box2" type="string">
34 <line_editor left="308" name="log_path_string" right="-20" /> 30 Options des IM :
35 <text type="string" length="1" name="text_box2">
36 Options IM :
37 </text> 31 </text>
38</panel> 32</panel>
diff --git a/linden/indra/newview/skins/default/xui/fr/panel_preferences_input.xml b/linden/indra/newview/skins/default/xui/fr/panel_preferences_input.xml
index ae37dab..6593e2a 100644
--- a/linden/indra/newview/skins/default/xui/fr/panel_preferences_input.xml
+++ b/linden/indra/newview/skins/default/xui/fr/panel_preferences_input.xml
@@ -1,23 +1,22 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 1<?xml version="1.0" encoding="utf-8" standalone="yes"?>
2<panel label="Entrée et Caméra" name="Input panel"> 2<panel label="Contrôle et Caméra" name="Input panel">
3 <text type="string" length="1" name=" Mouselook Options:"> 3 <text length="1" name=" Mouselook Options:" type="string">
4 Vue subjective : 4 Vue subjective :
5 </text> 5 </text>
6 <text type="string" length="1" name=" Mouse Sensitivity:"> 6 <text length="1" name=" Mouse Sensitivity:" type="string">
7 Sensibilité de la souris : 7 Sensibilité de la souris :
8 </text> 8 </text>
9 <text type="string" length="1" name=" Auto Fly Options:"> 9 <text length="1" name=" Auto Fly Options:" type="string">
10 Vol automatique : 10 Vol automatique :
11 </text> 11 </text>
12 <text type="string" length="1" name=" Camera Options:"> 12 <text length="1" name=" Camera Options:" type="string">
13 Options de la caméra : 13 Options de la caméra :
14 </text> 14 </text>
15 <text type="string" length="1" name="Camera Springiness:"> 15 <text length="1" name="Camera Springiness:" type="string">
16 Réactivité : 16 Réactivité :
17 </text> 17 </text>
18 <check_box label="Inverser la souris" name="invert mouse" /> 18 <check_box label="Inverser la souris" name="invert_mouse"/>
19 <check_box label="Voler/atterrir en appuyant sur la flèche du haut/bas" 19 <check_box label="Voler/atterrir en appuyant sur la flèche du haut/bas" name="automatic_fly"/>
20 name="automatic fly" />
21 <text name="Camera Follow Distance:"> 20 <text name="Camera Follow Distance:">
22 Distance de la caméra : 21 Distance de la caméra :
23 </text> 22 </text>
@@ -27,18 +26,14 @@
27 <text name="Camera Smoothing:"> 26 <text name="Camera Smoothing:">
28 Effet de lissage : 27 Effet de lissage :
29 </text> 28 </text>
30 <check_box label="Ajustement automatique de la caméra en mode Édition" 29 <check_box label="Ajustement automatique de la caméra en mode Édition" name="edit_camera_movement" tool_tip="Positionner automatiquement la caméra lors de l&apos;entrée ou de la sortie du mode Édition"/>
31 name="edit camera movement" 30 <check_box label="Ajustement automatique de la caméra en mode Apparence" name="appearance_camera_movement" tool_tip="Positionner automatiquement la caméra en mode Édition"/>
32 tool_tip="Positionner automatiquement la caméra lors de l&apos;entrée ou de la sortie du mode Édition" />
33 <check_box label="Ajustement automatique de la caméra en mode Apparence"
34 name="appearance camera movement"
35 tool_tip="Positionner automatiquement la caméra en mode Édition" />
36 <text name="text2"> 31 <text name="text2">
37 Affichage de l&apos;avatar : 32 Affichage de l&apos;avatar :
38 </text> 33 </text>
39 <check_box label="Montrer l&apos;avatar dans la vue subjective" name="avfp" /> 34 <check_box label="Montrer l&apos;avatar dans la vue subjective" name="first_person_avatar_visible"/>
40 <text name="text5"> 35 <text name="text5">
41 Options du joystick : 36 Options du joystick :
42 </text> 37 </text>
43 <button label="Configuration du joystick" name="joystic_setup_button" width="175" /> 38 <button label="Configuration du joystick" name="joystick_setup_button" width="175"/>
44</panel> 39</panel>
diff --git a/linden/indra/newview/skins/default/xui/fr/panel_preferences_network.xml b/linden/indra/newview/skins/default/xui/fr/panel_preferences_network.xml
index cd63d30..99acb4f 100644
--- a/linden/indra/newview/skins/default/xui/fr/panel_preferences_network.xml
+++ b/linden/indra/newview/skins/default/xui/fr/panel_preferences_network.xml
@@ -1,24 +1,23 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 1<?xml version="1.0" encoding="utf-8" standalone="yes"?>
2<panel label="Réseau" name="network"> 2<panel label="Réseau" name="network">
3 <text type="string" length="1" name="text_box"> 3 <text length="1" name="text_box" type="string">
4 Bande passante maximum : 4 Bande passante maximale :
5 </text> 5 </text>
6 <text type="string" length="1" name="text_box2"> 6 <text length="1" name="text_box2" type="string">
7 kbps (kilobits par seconde) 7 kbps (kilobits par seconde)
8 </text> 8 </text>
9 <text name="cache_size_label_l" width="210"> 9 <text name="cache_size_label_l" width="210">
10 Taille de la mémoire cache du disque : 10 Taille de la mémoire cache du disque :
11 </text> 11 </text>
12 <text type="string" length="1" name="text_box5"> 12 <text length="1" name="text_box5" type="string">
13 Mo 13 Mo
14 </text> 14 </text>
15 <button label="Vider la mémoire cache" label_selected="Vider le cache" 15 <button label="Vider la mémoire cache" label_selected="Vider le cache" name="clear_cache" width="150"/>
16 name="clear_cache" width="150"/>
17 <text name="cache_location_label"> 16 <text name="cache_location_label">
18 Emplacement du cache : 17 Emplacement du cache :
19 </text> 18 </text>
20 <button label="Définir" label_selected="Définir" name="set_cache" /> 19 <button label="Définir" label_selected="Définir" name="set_cache"/>
21 <button label="Redéfinir" label_selected="Définir" name="reset_cache" /> 20 <button label="Redéfinir" label_selected="Définir" name="reset_cache"/>
22 <check_box label="Port de connexion personnalisé" name="connection_port_enabled" /> 21 <check_box label="Port de connexion personnalisé" name="connection_port_enabled"/>
23 <spinner label="Numéro de port :" name="connection_port" label_width="95" width="170"/> 22 <spinner label="Numéro de port :" label_width="95" name="connection_port" width="170"/>
24</panel> 23</panel>
diff --git a/linden/indra/newview/skins/default/xui/fr/panel_preferences_popups.xml b/linden/indra/newview/skins/default/xui/fr/panel_preferences_popups.xml
index 72ea942..01fe695 100644
--- a/linden/indra/newview/skins/default/xui/fr/panel_preferences_popups.xml
+++ b/linden/indra/newview/skins/default/xui/fr/panel_preferences_popups.xml
@@ -1,29 +1,21 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 1<?xml version="1.0" encoding="utf-8" standalone="yes"?>
2<panel label="Pop-ups" name="popups" title="Pop-ups"> 2<panel label="Pop-ups" name="popups" title="Pop-ups">
3 <text type="string" length="1" name="text_box"> 3 <text length="1" name="text_box" type="string">
4 Ne pas afficher les pop-ups : 4 Ne pas afficher les pop-ups :
5 </text> 5 </text>
6 <text name="dont_show_label"> 6 <text name="dont_show_label">
7 Ne pas afficher ces pop-ups : 7 Ne pas afficher ces pop-ups :
8 </text> 8 </text>
9 <button label="Activer ce pop-up" label_selected="Autoriser cette pop-up" 9 <button label="Activer ce pop-up" label_selected="Autoriser ce pop-up" name="enable_popup"/>
10 name="enable_popup" />
11 <text name="show_label"> 10 <text name="show_label">
12 Afficher ces pop-ups : 11 Afficher ces pop-ups :
13 </text> 12 </text>
14 <button width="185" label="Désactiver tous ces pop-ups..." name="skip_dialogs_btn" 13 <button label="Désactiver tous les pop-ups..." name="skip_dialogs_btn" tool_tip="Désactiver tous les pop-ups et les notifications envoyées lors d&apos;un premier usage." width="185"/>
15 tool_tip="Désactiver tous les pop-ups facultatifs et les notifications envoyées lors d&apos;un premier usage." /> 14 <text length="1" name="text_box2" type="string">
16 <text type="string" length="1" name="text_box2">
17 Offres de notes, textures et repères : 15 Offres de notes, textures et repères :
18 </text> 16 </text>
19 <button width="185" label="Activer tous les pop-ups..." 17 <button label="Activer tous les pop-ups" label_selected="Réinitialiser les dialogues &apos;Afficher la prochaine fois&apos;..." name="reset_dialogs_btn" tool_tip="Activer tous les pop-ups et les notifications envoyées lors d&apos;un premier usage." width="185"/>
20 label_selected="Réinitialiser les dialogues &apos;Afficher la prochaine fois&apos;..." 18 <check_box label="Accepter automatiquement" name="accept_new_inventory"/>
21 name="reset_dialogs_btn" 19 <check_box label="Afficher après avoir accepté" name="show_new_inventory"/>
22 tool_tip="Activer tous les pop-ups facultatifs et les notifications envoyées lors d&apos;un premier usage." /> 20 <check_box label="Ouvrir l&apos;inventaire et sélectionner les objets reçus" name="show_in_inventory"/>
23 <check_box label="Accepter automatiquement" name="accept_new_inventory" />
24 <check_box label="Afficher automatiquement après avoir accepté"
25 name="show_new_inventory" />
26 <check_box
27 label="Afficher automatiquement les objets récemment acceptés dans l&apos;inventaire"
28 name="show_in_inventory" />
29</panel> 21</panel>
diff --git a/linden/indra/newview/skins/default/xui/fr/panel_preferences_voice.xml b/linden/indra/newview/skins/default/xui/fr/panel_preferences_voice.xml
index 996f60a..4580984 100644
--- a/linden/indra/newview/skins/default/xui/fr/panel_preferences_voice.xml
+++ b/linden/indra/newview/skins/default/xui/fr/panel_preferences_voice.xml
@@ -1,9 +1,9 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 1<?xml version="1.0" encoding="utf-8" standalone="yes"?>
2<panel label="Chat vocal" name="chat"> 2<panel label="Chat vocal" name="chat">
3 <text_editor name="voice_unavailable"> 3 <text_editor name="voice_unavailable">
4 Le chat vocal n&apos;est pas disponible 4 Le chat vocal n&apos;est pas disponible
5 </text_editor> 5 </text_editor>
6 <check_box label="Activer le chat vocal" name="enable_voice_check" /> 6 <check_box label="Activer la voix" name="enable_voice_check"/>
7 <radio_group name="ear_location"> 7 <radio_group name="ear_location">
8 <radio_item name="0"> 8 <radio_item name="0">
9 Écouter depuis la position de la caméra. 9 Écouter depuis la position de la caméra.
@@ -16,22 +16,20 @@
16 Mode Appuyer pour parler 16 Mode Appuyer pour parler
17 </text> 17 </text>
18 <text_editor name="voice_chat_description" width="465"> 18 <text_editor name="voice_chat_description" width="465">
19 En mode Appuyer pour parler, vous contrôlez le moment où votre voix est transmise. Lorsque vous êtes en mode bascule, appuyez et relâchez le bouton Appuyer pour parler pour activer ou désactiver votre micro. Lorsque vous n&apos;êtes pas en mode bascule, le micro n&apos;est activé que lorsque vous appuyez sur le déclencheur. 19 En mode Appuyer pour parler, vous contrôlez le moment où votre voix est transmise en appuyant et en relâchant le bouton Parler en bas à droite de l&apos;écran. Pour quitter ce mode et laisser votre micro constamment activé, verrouillez le petit cadenas en cliquant dessus. Vous pouvez aussi définir une touche de contrôle pour le mode Appuyer pour parler. Pour cela, laissez le cadenas à gauche du bouton Parler déverrouillé, cochez l&apos;option ci-dessous et choisissez une nouvelle touche.
20 </text_editor> 20 </text_editor>
21 <check_box label="Utiliser la fonction Appuyer pour parler en mode bascule" 21 <check_box label="Attribuer une touche de contrôle" name="push_to_talk_toggle_check"/>
22 name="push_to_talk_toggle_check" />
23 <text name="push_to_talk_label"> 22 <text name="push_to_talk_label">
24 Déclencheur de la fonction Appuyer pour parler : 23 Touche de contrôle du mode Appuyer pour parler :
25 </text> 24 </text>
26 <button label="Choisir la touche" name="set_voice_hotkey_button" /> 25 <button label="Choisir la touche" name="set_voice_hotkey_button"/>
27 <button label="Molette de la souris" name="set_voice_middlemouse_button" /> 26 <button label="Molette de la souris" name="set_voice_middlemouse_button"/>
28 <text name="privacy_heading"> 27 <text name="privacy_heading">
29 Options de confidentialité 28 Options de confidentialité
30 </text> 29 </text>
31 <check_box label="N&apos;accepter que les appels de mes amis" 30 <check_box label="N&apos;accepter que les appels de mes amis" name="voice_call_friends_only_check"/>
32 name="voice_call_friends_only_check" />
33 <text_editor name="device_settings_text"> 31 <text_editor name="device_settings_text">
34 Remarque : si vous cliquez sur Paramètres du matériel, vous serez temporairement deconnecté du chat vocal. 32 Remarque : si vous cliquez sur Paramètres du matériel, vous serez temporairement deconnecté du chat vocal.
35 </text_editor> 33 </text_editor>
36 <button label="Paramètres du matériel" name="device_settings_btn" /> 34 <button label="Paramètres du matériel" name="device_settings_btn"/>
37</panel> 35</panel>
diff --git a/linden/indra/newview/skins/default/xui/fr/panel_preferences_web.xml b/linden/indra/newview/skins/default/xui/fr/panel_preferences_web.xml
index d2c0288..afc081e 100644
--- a/linden/indra/newview/skins/default/xui/fr/panel_preferences_web.xml
+++ b/linden/indra/newview/skins/default/xui/fr/panel_preferences_web.xml
@@ -1,31 +1,28 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 1<?xml version="1.0" encoding="utf-8" standalone="yes"?>
2<panel label="Web" name="web"> 2<panel label="Web" name="web">
3 <radio_group name="use_external_browser"> 3 <radio_group name="use_external_browser">
4 <radio_item name="external" 4 <radio_item name="external" tool_tip="Utilisez le navigateur web du système pour l&apos;aide, les liens web etc. Déconseillé en mode plein écran.">
5 tool_tip="Utilisez le navigateur web du système pour l&apos;aide, les liens web etc. Déconseillé en mode plein écran.">
6 Utiliser un navigateur web externe (Firefox, Safari, Internet Explorer) 5 Utiliser un navigateur web externe (Firefox, Safari, Internet Explorer)
7 </radio_item> 6 </radio_item>
8 <radio_item name="internal" 7 <radio_item name="internal" tool_tip="Utilisez le navigateur web intégré pour l&apos;aide, les liens etc. Ce navigateur s&apos;ouvre dans une nouvelle fenêtre à l&apos;intérieur de Second Life.">
9 tool_tip="Utilisez le navigateur web intégré pour l&apos;aide, les liens etc. Ce navigateur s&apos;ouvre dans une nouvelle fenêtre à l&apos;intérieur de Second Life.">
10 Utiliser le navigateur web intégré 8 Utiliser le navigateur web intégré
11 </radio_item> 9 </radio_item>
12 </radio_group> 10 </radio_group>
13 <text name="cache_size_label_l"> 11 <text name="cache_size_label_l">
14 Cache du navigateur : 12 Cache du navigateur :
15 </text> 13 </text>
16 <button label="Vider" name="clear_cache" /> 14 <button label="Vider" name="clear_cache"/>
17 <text name="cookie_label"> 15 <text name="cookie_label">
18 Cookies : 16 Cookies :
19 </text> 17 </text>
20 <check_box label="Accepter les cookies d&apos;autres sites" name="cookies_enabled" /> 18 <check_box label="Accepter les cookies" name="cookies_enabled"/>
21 <text name="proxy_label"> 19 <text name="proxy_label">
22 Web proxy : 20 Proxy web :
23 </text> 21 </text>
24 <check_box label="Activer le Web proxy" name="web_proxy_enabled" /> 22 <check_box label="Activer le proxy web" name="web_proxy_enabled"/>
25 <text name="proxy_text_label"> 23 <text name="proxy_text_label">
26 Adresse : 24 Adresse :
27 </text> 25 </text>
28 <line_editor name="web_proxy_editor" 26 <line_editor left="237" name="web_proxy_editor" tool_tip="Le nom ou adresse IP du proxy que vous souhaitez utiliser"/>
29 tool_tip="Le nom ou adresse IP du proxy que vous souhaitez utiliser" left="237" /> 27 <spinner label="Numéro de port :" label_width="95" name="web_proxy_port" width="170"/>
30 <spinner label="Numéro de port :" name="web_proxy_port" label_width="95" width="170"/>
31</panel> 28</panel>
diff --git a/linden/indra/newview/skins/default/xui/fr/panel_region_debug.xml b/linden/indra/newview/skins/default/xui/fr/panel_region_debug.xml
index d001191..2cc1736 100644
--- a/linden/indra/newview/skins/default/xui/fr/panel_region_debug.xml
+++ b/linden/indra/newview/skins/default/xui/fr/panel_region_debug.xml
@@ -1,4 +1,4 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 1<?xml version="1.0" encoding="utf-8" standalone="yes"?>
2<panel label="Débugger" name="Debug"> 2<panel label="Débugger" name="Debug">
3 <text name="region_text_lbl"> 3 <text name="region_text_lbl">
4 Région : 4 Région :
@@ -6,46 +6,28 @@
6 <text name="region_text"> 6 <text name="region_text">
7 (inconnue) 7 (inconnue)
8 </text> 8 </text>
9 <check_box label="Désactiver les scripts" name="disable_scripts_check" 9 <check_box label="Désactiver les scripts" name="disable_scripts_check" tool_tip="Désactiver tous les scripts dans cette région"/>
10 tool_tip="Désactiver tous les scripts dans cette région" /> 10 <button label="?" name="disable_scripts_help"/>
11 <button label="?" name="disable_scripts_help" /> 11 <check_box label="Désactiver les collisions" name="disable_collisions_check" tool_tip="Désactiver les collisions entre non-avatars dans cette région"/>
12 <check_box label="Désactiver les collisions" name="disable_collisions_check" 12 <button label="?" name="disable_collisions_help"/>
13 tool_tip="Désactiver les collisions entre non-avatars dans cette région" /> 13 <check_box label="Désactiver les propriétés physiques" name="disable_physics_check" tool_tip="Désactiver toutes les propriétés physiques dans cette région"/>
14 <button label="?" name="disable_collisions_help" /> 14 <button label="?" name="disable_physics_help"/>
15 <check_box label="Désactiver les propriétés physiques" name="disable_physics_check" 15 <button label="Appliquer" name="apply_btn"/>
16 tool_tip="Désactiver toutes les propriétés physiques dans cette région" />
17 <button label="?" name="disable_physics_help" />
18 <button label="Appliquer" name="apply_btn" />
19 <line_editor name="target_avatar_name"> 16 <line_editor name="target_avatar_name">
20 (aucun) 17 (aucun)
21 </line_editor> 18 </line_editor>
22 <button label="Choisir..." name="choose_avatar_btn" /> 19 <button label="Choisir..." name="choose_avatar_btn"/>
23 <button 20 <button label="Renvoyer les objets scriptés de l&apos;avatar vers une propriété tierce" name="return_scripted_other_land_btn"/>
24 label="Renvoyer les objets scriptés de l&apos;avatar vers une propriété tierce" 21 <button label="Renvoyer tous les objets scriptés de l&apos;avatar" name="return_scripted_all_btn"/>
25 name="return_scripted_other_land_btn" /> 22 <check_box label="Ne renvoyer que les objets avec des scripts" name="return_scripts" tool_tip="Ne renvoyer que les objets avec des scripts."/>
26 <button label="Renvoyer TOUS les objets scriptés de l&apos;avatar" 23 <check_box label="Ne renvoyer que les objets sur le terrain de quelqu&apos;un d&apos;autre" name="return_other_land" tool_tip="Ne renvoyer que les objets se trouvant sur le terrain de quelqu&apos;un d&apos;autre"/>
27 name="return_scripted_all_btn" /> 24 <check_box label="Renvoyer les objets dans toutes les régions de ce domaine" name="return_estate_wide" tool_tip="Renvoyer les objets dans toutes les régions qui constituent ce domaine"/>
28 <check_box label="Ne renvoyer que les objets avec des scripts" name="return_scripts" 25 <button label="Renvoyer" name="return_btn"/>
29 tool_tip="Ne renvoyer que les objets avec des scripts." /> 26 <button label="Afficher les objets souvent responsables de collision..." name="top_colliders_btn" tool_tip="Liste des objets avec le plus de collisions potentielles"/>
30 <check_box 27 <button label="?" name="top_colliders_help"/>
31 label="Ne renvoyer que les objets sur le terrain de quelqu&apos;un d&apos;autre" 28 <button label="Afficher les objets exécutant le plus de scripts..." name="top_scripts_btn" tool_tip="Liste des objets qui passent le plus de temps à exécuter des scripts"/>
32 name="return_other_land" 29 <button label="?" name="top_scripts_help"/>
33 tool_tip="Ne renvoyer que les objets se trouvant sur le terrain de quelqu&apos;un d&apos;autre" /> 30 <button label="Redémarrer la région" name="restart_btn" tool_tip="Redémarrer la région au bout de 2 minutes"/>
34 <check_box label="Renvoyer les objets dans toutes les régions de ce domaine" 31 <button label="?" name="restart_help"/>
35 name="return_estate_wide" 32 <button label="Retarder le redémarrage" name="cancel_restart_btn" tool_tip="Retarder le redémarrage de la région d&apos;une heure"/>
36 tool_tip="Renvoyer les objets dans toutes les régions qui constituent ce domaine" />
37 <button label="Renvoyer" name="return_btn" />
38 <button label="Afficher les objets souvent responsables de collision..."
39 name="top_colliders_btn"
40 tool_tip="Liste des objets avec le plus de collisions potentielles" />
41 <button label="?" name="top_colliders_help" />
42 <button label="Afficher les objets exécutant le plus de scripts..."
43 name="top_scripts_btn"
44 tool_tip="Liste des objets qui passent le plus de temps à exécuter des scripts" />
45 <button label="?" name="top_scripts_help" />
46 <button label="Redémarrer la région" name="restart_btn"
47 tool_tip="Redémarrer la région au bout de 2 minutes" />
48 <button label="?" name="restart_help" />
49 <button label="Retarder le redémarrage" name="cancel_restart_btn"
50 tool_tip="Retarder le redémarrage de la région d&apos;une heure" />
51</panel> 33</panel>
diff --git a/linden/indra/newview/skins/default/xui/fr/panel_region_estate.xml b/linden/indra/newview/skins/default/xui/fr/panel_region_estate.xml
index f4585a8..5052bed 100644
--- a/linden/indra/newview/skins/default/xui/fr/panel_region_estate.xml
+++ b/linden/indra/newview/skins/default/xui/fr/panel_region_estate.xml
@@ -1,4 +1,4 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 1<?xml version="1.0" encoding="utf-8" standalone="yes"?>
2<panel label="Domaine" name="Estate"> 2<panel label="Domaine" name="Estate">
3 <text name="estate_help_text"> 3 <text name="estate_help_text">
4 Les changements apportés aux paramètres de cet onglet auront des répercussions sur toutes les régions du domaine. 4 Les changements apportés aux paramètres de cet onglet auront des répercussions sur toutes les régions du domaine.
@@ -18,61 +18,59 @@
18 <text name="Only Allow"> 18 <text name="Only Allow">
19 Limiter l&apos;accès aux résidents : 19 Limiter l&apos;accès aux résidents :
20 </text> 20 </text>
21 <check_box label="Qui ont enregistré leurs infos de paiement" name="limit_payment" 21 <check_box label="Qui ont enregistré leurs infos de paiement" name="limit_payment" tool_tip="Bannir les résidents non identifés."/>
22 tool_tip="Interdire les résidents non identifés." /> 22 <check_box label="Adultes dont l&apos;âge a été vérifié" name="limit_age_verified" tool_tip="Bannir les résidents dont l&apos;âge n&apos;a pas été vérifié. Pour plus d&apos;infos, consultez la page support.secondlife.com."/>
23 <check_box label="Adultes dont l&apos;âge a été vérifié" name="limit_age_verified" 23 <check_box label="Autoriser les chats vocaux" name="voice_chat_check"/>
24 tool_tip="Interdire les résidents dont l&apos;âge n&apos;a pas été vérifié. Pour plus d&apos;infos, consultez la page support.secondlife.com." /> 24 <button label="?" name="voice_chat_help"/>
25 <check_box label="Autoriser les chats vocaux" name="voice_chat_check" />
26 <button label="?" name="voice_chat_help" />
27 <text name="abuse_email_text"> 25 <text name="abuse_email_text">
28 E-mail où signaler l&apos;infraction : 26 E-mail où signaler l&apos;infraction :
29 </text> 27 </text>
30 <string name="email_unsupported"> 28 <string name="email_unsupported">
31 Non pris en charge 29 Non pris en charge
32 </string> 30 </string>
33 <button label="?" name="abuse_email_address_help" /> 31 <button label="?" name="abuse_email_address_help"/>
34 <text name="estate_manager_label"> 32 <text name="estate_manager_label">
35 Gérants du domaine : 33 Gérants du domaine :
36 </text> 34 </text>
37 <button label="?" name="estate_manager_help" /> 35 <button label="?" name="estate_manager_help"/>
38 <button label="Ajouter..." name="add_estate_manager_btn" /> 36 <button label="Ajouter..." name="add_estate_manager_btn"/>
39 <button label="Supprimer..." name="remove_estate_manager_btn" /> 37 <button label="Supprimer..." name="remove_estate_manager_btn"/>
40 <check_box label="Utiliser le temps universel" name="use_global_time_check" /> 38 <check_box label="Utiliser le temps universel" name="use_global_time_check"/>
41 <button label="?" name="use_global_time_help" /> 39 <button label="?" name="use_global_time_help"/>
42 <check_box label="Soleil fixe" name="fixed_sun_check" /> 40 <check_box label="Soleil fixe" name="fixed_sun_check"/>
43 <button label="?" name="fixed_sun_help" /> 41 <button label="?" name="fixed_sun_help"/>
44 <slider label="Phase" name="sun_hour_slider" /> 42 <slider label="Phase" name="sun_hour_slider"/>
45 <check_box label="Autoriser l&apos;accès public" name="externally_visible_check" /> 43 <check_box label="Autoriser l&apos;accès public" name="externally_visible_check"/>
46 <button label="?" name="externally_visible_help" /> 44 <button label="?" name="externally_visible_help"/>
47 <check_box label="Vue sur le continent" name="mainland_visible_check" /> 45 <check_box label="Vue sur le continent" name="mainland_visible_check"/>
48 <button label="?" name="mainland_visible_help" /> 46 <button label="?" name="mainland_visible_help"/>
49 <check_box label="Autoriser la téléportation directe" name="allow_direct_teleport" /> 47 <check_box label="Autoriser la téléportation directe" name="allow_direct_teleport"/>
50 <button label="?" name="allow_direct_teleport_help" /> 48 <button label="?" name="allow_direct_teleport_help"/>
51 <text name="region_text_lbl"> 49 <text name="region_text_lbl">
52 Refuser l&apos;accès selon les infos de paiement : 50 Refuser l&apos;accès selon les infos de paiement :
53 </text> 51 </text>
54 <check_box label="Refuser sans infos de paiement enregistrées" name="deny_anonymous" /> 52 <check_box label="Refuser sans infos de paiement enregistrées" name="deny_anonymous"/>
55 <check_box label="Refuser avec infos de paiement enregistrées" name="deny_identified" /> 53 <check_box label="Refuser avec infos de paiement enregistrées" name="deny_identified"/>
56 <check_box label="Refuser avec infos de paiement utilisées" name="deny_transacted" /> 54 <check_box label="Refuser avec infos de paiement utilisées" name="deny_transacted"/>
57 <button label="Appliquer" name="apply_btn" /> 55 <button label="Appliquer" name="apply_btn"/>
58 <text name="allow_resident_label"> 56 <text name="allow_resident_label">
59 Résidents autorisés : 57 Résidents autorisés :
60 </text> 58 </text>
61 <button label="?" name="allow_resident_help" /> 59 <button label="?" name="allow_resident_help"/>
62 <button label="Ajouter..." name="add_allowed_avatar_btn" /> 60 <button label="Ajouter..." name="add_allowed_avatar_btn"/>
63 <button label="Supprimer..." name="remove_allowed_avatar_btn" /> 61 <button label="Supprimer..." name="remove_allowed_avatar_btn"/>
64 <text name="allow_group_label"> 62 <text name="allow_group_label">
65 Groupes autorisés : 63 Groupes autorisés :
66 </text> 64 </text>
67 <button label="?" name="allow_group_help" /> 65 <button label="?" name="allow_group_help"/>
68 <button label="Ajouter..." name="add_allowed_group_btn" /> 66 <button label="Ajouter..." name="add_allowed_group_btn"/>
69 <button label="Supprimer..." name="remove_allowed_group_btn" /> 67 <button label="Supprimer..." name="remove_allowed_group_btn"/>
70 <text name="ban_resident_label"> 68 <text name="ban_resident_label">
71 Résidents interdits : 69 Résidents bannis :
72 </text> 70 </text>
73 <button label="?" name="ban_resident_help" /> 71 <button label="?" name="ban_resident_help"/>
74 <button label="Ajouter..." name="add_banned_avatar_btn" /> 72 <button label="Ajouter..." name="add_banned_avatar_btn"/>
75 <button label="Supprimer..." name="remove_banned_avatar_btn" /> 73 <button label="Supprimer..." name="remove_banned_avatar_btn"/>
76 <button label="Envoyer un message au domaine..." name="message_estate_btn" /> 74 <button label="Envoyer un message au domaine..." name="message_estate_btn"/>
77 <button label="Expulser le résident du domaine..." name="kick_user_from_estate_btn" /> 75 <button label="Éjecter le résident du domaine..." name="kick_user_from_estate_btn"/>
78</panel> 76</panel>
diff --git a/linden/indra/newview/skins/default/xui/fr/panel_region_general.xml b/linden/indra/newview/skins/default/xui/fr/panel_region_general.xml
index 95cd0c2..1556c87 100644
--- a/linden/indra/newview/skins/default/xui/fr/panel_region_general.xml
+++ b/linden/indra/newview/skins/default/xui/fr/panel_region_general.xml
@@ -1,4 +1,4 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 1<?xml version="1.0" encoding="utf-8" standalone="yes"?>
2<panel label="Région" name="General"> 2<panel label="Région" name="General">
3 <text name="region_text_lbl"> 3 <text name="region_text_lbl">
4 Région : 4 Région :
@@ -12,42 +12,39 @@
12 <text name="version_channel_text"> 12 <text name="version_channel_text">
13 (inconnu) 13 (inconnu)
14 </text> 14 </text>
15 <check_box label="Bloquer le terraformage" name="block_terraform_check" /> 15 <check_box label="Bloquer le terraformage" name="block_terraform_check"/>
16 <button label="?" name="terraform_help" /> 16 <button label="?" name="terraform_help"/>
17 <check_box label="Interdire le vol" name="block_fly_check" /> 17 <check_box label="Interdire le vol" name="block_fly_check"/>
18 <button label="?" name="fly_help" /> 18 <button label="?" name="fly_help"/>
19 <check_box label="Autoriser les dégâts" name="allow_damage_check" /> 19 <check_box label="Autoriser les dégâts" name="allow_damage_check"/>
20 <button label="?" name="damage_help" /> 20 <button label="?" name="damage_help"/>
21 <check_box label="Interdire les bousculades" name="restrict_pushobject" /> 21 <check_box label="Interdire les bousculades" name="restrict_pushobject"/>
22 <button label="?" name="restrict_pushobject_help" /> 22 <button label="?" name="restrict_pushobject_help"/>
23 <check_box label="Autoriser la revente de terrain" name="allow_land_resell_check" /> 23 <check_box label="Autoriser la revente de terrain" name="allow_land_resell_check"/>
24 <button label="?" name="land_resell_help" /> 24 <button label="?" name="land_resell_help"/>
25 <check_box label="Autoriser la fusion/division de terrain" 25 <check_box label="Autoriser la fusion/division de terrain" name="allow_parcel_changes_check"/>
26 name="allow_parcel_changes_check" /> 26 <button label="?" name="parcel_changes_help"/>
27 <button label="?" name="parcel_changes_help" /> 27 <check_box label="Ne pas afficher le terrain dans la recherche" name="block_parcel_search_check" tool_tip="Afficher cette région et ses parcelles dans les résultats de recherche"/>
28 <check_box label="Ne pas afficher le terrain dans la recherche" 28 <button label="?" name="parcel_search_help"/>
29 name="block_parcel_search_check" 29 <spinner label="Nombre limite d&apos;avatars" name="agent_limit_spin"/>
30 tool_tip="Afficher cette région et ses parcelles dans les résultats de recherche" /> 30 <button label="?" name="agent_limit_help"/>
31 <button label="?" name="parcel_search_help" /> 31 <spinner label="Bonus objet" name="object_bonus_spin"/>
32 <spinner label="Nombre limite d&apos;avatars" name="agent_limit_spin" /> 32 <button label="?" name="object_bonus_help"/>
33 <button label="?" name="agent_limit_help" />
34 <spinner label="Bonus objet" name="object_bonus_spin" />
35 <button label="?" name="object_bonus_help" />
36 <text label="Maturité" name="access_text"> 33 <text label="Maturité" name="access_text">
37 Maturité : 34 Maturité :
38 </text> 35 </text>
39 <combo_box label="Adulte" name="access_combo"> 36 <combo_box label="Adulte" name="access_combo">
40 <combo_item name="PG"> 37 <combo_item name="PG">
41 Accompagnement parental 38 Tout public
42 </combo_item> 39 </combo_item>
43 <combo_item name="Mature"> 40 <combo_item name="Mature">
44 Adulte 41 Adultes
45 </combo_item> 42 </combo_item>
46 </combo_box> 43 </combo_box>
47 <button label="?" name="access_help" /> 44 <button label="?" name="access_help"/>
48 <button label="Appliquer" name="apply_btn" /> 45 <button label="Appliquer" name="apply_btn"/>
49 <button label="Téléporter un résident chez lui..." name="kick_btn" /> 46 <button label="Téléporter un résident chez lui..." name="kick_btn"/>
50 <button label="Téléporter tous les résidents chez eux..." name="kick_all_btn" /> 47 <button label="Téléporter tous les résidents chez eux..." name="kick_all_btn"/>
51 <button label="Envoyer un message à la région..." name="im_btn" /> 48 <button label="Envoyer un message à la région..." name="im_btn"/>
52 <button label="Gérer le Téléhub..." name="manage_telehub_btn" /> 49 <button label="Gérer le Téléhub..." name="manage_telehub_btn"/>
53</panel> 50</panel>
diff --git a/linden/indra/newview/skins/default/xui/fr/panel_region_terrain.xml b/linden/indra/newview/skins/default/xui/fr/panel_region_terrain.xml
index d176f07..219e0da 100644
--- a/linden/indra/newview/skins/default/xui/fr/panel_region_terrain.xml
+++ b/linden/indra/newview/skins/default/xui/fr/panel_region_terrain.xml
@@ -1,4 +1,4 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 1<?xml version="1.0" encoding="utf-8" standalone="yes"?>
2<panel label="Terrain" name="Terrain"> 2<panel label="Terrain" name="Terrain">
3 <text name="region_text_lbl"> 3 <text name="region_text_lbl">
4 Région : 4 Région :
@@ -6,25 +6,22 @@
6 <text name="region_text"> 6 <text name="region_text">
7 (inconnue) 7 (inconnue)
8 </text> 8 </text>
9 <spinner label="Niveau de l&apos;eau" name="water_height_spin" /> 9 <spinner label="Niveau de l&apos;eau" name="water_height_spin"/>
10 <button label="?" name="water_height_help" /> 10 <button label="?" name="water_height_help"/>
11 <spinner label="Limite de surélévation du terrain" name="terrain_raise_spin" /> 11 <spinner label="Limite d&apos;élévation du terrain" name="terrain_raise_spin"/>
12 <button label="?" name="terrain_raise_help" /> 12 <button label="?" name="terrain_raise_help"/>
13 <spinner label="Limite d&apos;abaissement du terrain" name="terrain_lower_spin" /> 13 <spinner label="Limite d&apos;abaissement du terrain" name="terrain_lower_spin"/>
14 <button label="?" name="terrain_lower_help" /> 14 <button label="?" name="terrain_lower_help"/>
15 <check_box label="Utiliser le soleil du domaine" name="use_estate_sun_check" /> 15 <check_box label="Utiliser le soleil du domaine" name="use_estate_sun_check"/>
16 <button label="?" name="use_estate_sun_help" /> 16 <button label="?" name="use_estate_sun_help"/>
17 <check_box label="Soleil fixe" name="fixed_sun_check" /> 17 <check_box label="Soleil fixe" name="fixed_sun_check"/>
18 <button label="?" name="fixed_sun_help" /> 18 <button label="?" name="fixed_sun_help"/>
19 <slider label="Phase" name="sun_hour_slider" /> 19 <slider label="Phase" name="sun_hour_slider"/>
20 <button label="Appliquer" name="apply_btn" /> 20 <button label="Appliquer" name="apply_btn"/>
21 <button label="Télécharger le terrain au format RAW..." name="download_raw_btn" 21 <button label="Télécharger le terrain au format RAW..." name="download_raw_btn" tool_tip="Réservé aux propriétaires de domaine, pas aux gérants"/>
22 tool_tip="Réservé aux propriétaires de domaine, pas aux gérants" /> 22 <button label="?" name="download_raw_help"/>
23 <button label="?" name="download_raw_help" /> 23 <button label="Charger le terrain au format RAW..." name="upload_raw_btn" tool_tip="Réservé aux propriétaires de domaine, pas aux gérants"/>
24 <button label="Charger le terrain au format RAW..." name="upload_raw_btn" 24 <button label="?" name="upload_raw_help"/>
25 tool_tip="Réservé aux propriétaires de domaine, pas aux gérants" /> 25 <button label="Figer le terrain" name="bake_terrain_btn" tool_tip="Définir le terrain actuel comme point central pour les limites d&apos;élévation/abaissement"/>
26 <button label="?" name="upload_raw_help" /> 26 <button label="?" name="bake_terrain_help"/>
27 <button label="Figer le terrain" name="bake_terrain_btn"
28 tool_tip="Définir le terrain actuel comme point central pour les limites de surélévation/abaissement" />
29 <button label="?" name="bake_terrain_help" />
30</panel> 27</panel>
diff --git a/linden/indra/newview/skins/default/xui/fr/panel_speaker_controls.xml b/linden/indra/newview/skins/default/xui/fr/panel_speaker_controls.xml
index 7c63202..c23e95d 100644
--- a/linden/indra/newview/skins/default/xui/fr/panel_speaker_controls.xml
+++ b/linden/indra/newview/skins/default/xui/fr/panel_speaker_controls.xml
@@ -1,4 +1,4 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 1<?xml version="1.0" encoding="utf-8" standalone="yes"?>
2<panel name="active_speakers_panel"> 2<panel name="active_speakers_panel">
3 <string name="moderator_label"> 3 <string name="moderator_label">
4 (Modérateur) 4 (Modérateur)
@@ -7,23 +7,23 @@
7 <layout_panel name="moderation_mode_panel"> 7 <layout_panel name="moderation_mode_panel">
8 <combo_box name="moderation_mode"> 8 <combo_box name="moderation_mode">
9 <combo_item name="OpenVoice"> 9 <combo_item name="OpenVoice">
10 Voix activées par défaut) 10 Voix activées par défaut
11 </combo_item> 11 </combo_item>
12 <combo_item name="ModeratedVoice"> 12 <combo_item name="ModeratedVoice">
13 Voix désactivées par défaut) 13 Voix désactivées par défaut
14 </combo_item> 14 </combo_item>
15 </combo_box> 15 </combo_box>
16 </layout_panel> 16 </layout_panel>
17 <layout_panel name="moderate_chat_panel"> 17 <layout_panel name="moderate_chat_panel">
18 <scroll_list name="speakers_list"> 18 <scroll_list name="speakers_list">
19 <column label="Nom" name="speaker_name" /> 19 <column label="Nom" name="speaker_name"/>
20 </scroll_list> 20 </scroll_list>
21 <panel name="speaker_controls"> 21 <panel name="speaker_controls">
22 <text name="resident_name"> 22 <text name="resident_name">
23 Rumplstiltskin Califragilistic 23 Rumplstiltskin Califragilistic
24 </text> 24 </text>
25 <button name="mute_btn" tool_tip="Rendre ce résident muet" /> 25 <button name="mute_btn" tool_tip="Ignorer ce résident"/>
26 <check_box label="Ignorer le texte" name="mute_text_btn" /> 26 <check_box label="Ignorer les messages" name="mute_text_btn"/>
27 </panel> 27 </panel>
28 </layout_panel> 28 </layout_panel>
29 <layout_panel name="moderator_controls"> 29 <layout_panel name="moderator_controls">
diff --git a/linden/indra/newview/skins/default/xui/fr/panel_status_bar.xml b/linden/indra/newview/skins/default/xui/fr/panel_status_bar.xml
index fc94923..c3ff6f7 100644
--- a/linden/indra/newview/skins/default/xui/fr/panel_status_bar.xml
+++ b/linden/indra/newview/skins/default/xui/fr/panel_status_bar.xml
@@ -1,14 +1,13 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 1<?xml version="1.0" encoding="utf-8" standalone="yes"?>
2<panel name="status"> 2<panel name="status">
3 <text type="string" length="1" name="ParcelNameText" 3 <text length="1" name="ParcelNameText" tool_tip="Nom de la parcelle de terrain sur laquelle vous vous trouvez. Cliquez pour ouvrir la section À propos du terrain." type="string">
4 tool_tip="Nom de la parcelle de terrain sur laquelle vous vous trouvez. Cliquez pour ouvrir À propos du terrain.">
5 Saisissez le nom de la parcelle ici 4 Saisissez le nom de la parcelle ici
6 </text> 5 </text>
7 <text type="string" length="1" name="BalanceText" tool_tip="Solde du compte"> 6 <text length="1" name="BalanceText" tool_tip="Solde du compte" type="string">
8 Chargement en cours... 7 Chargement en cours...
9 </text> 8 </text>
10 <button label="" label_selected="" name="buycurrency" tool_tip="Acheter des devises" /> 9 <button label="" label_selected="" name="buycurrency" tool_tip="Acheter des devises"/>
11 <text type="string" length="12" name="TimeText" tool_tip="Heure actuelle (Californie)"> 10 <text length="12" name="TimeText" tool_tip="Heure actuelle (Californie)" type="string">
12 midi 11 midi
13 </text> 12 </text>
14 <string name="StatBarDaysOfWeek"> 13 <string name="StatBarDaysOfWeek">
@@ -17,23 +16,22 @@
17 <string name="StatBarMonthsOfYear"> 16 <string name="StatBarMonthsOfYear">
18 January:February:March:April:May:June:July:August:September:October:November:December 17 January:February:March:April:May:June:July:August:September:October:November:December
19 </string> 18 </string>
20 <button label="" label_selected="" name="scriptout" 19 <button label="" label_selected="" name="scriptout" tool_tip="Alertes et erreurs de scripts"/>
21 tool_tip="Alertes et erreurs de scripts" /> 20 <button label="" label_selected="" name="health" tool_tip="Santé"/>
22 <button label="" label_selected="" name="health" tool_tip="Santé" /> 21 <text length="1" name="HealthText" tool_tip="Santé" type="string">
23 <text type="string" length="1" name="HealthText" tool_tip="Santé"> 22 100 %
24 100%
25 </text> 23 </text>
26 <button label="" label_selected="" name="fly" tool_tip="Vol interdit" /> 24 <button label="" label_selected="" name="fly" tool_tip="Vol interdit"/>
27 <button label="" label_selected="" name="build" tool_tip="Construction interdite" /> 25 <button label="" label_selected="" name="build" tool_tip="Construction interdite"/>
28 <button label="" label_selected="" name="scripts" tool_tip="Scripts interdits" /> 26 <button label="" label_selected="" name="scripts" tool_tip="Scripts interdits"/>
29 <button name="no_fly" tool_tip="Interdiction de voler" /> 27 <button name="no_fly" tool_tip="Interdiction de voler"/>
30 <button name="no_build" tool_tip="Interdiction de construire/rezzer" /> 28 <button name="no_build" tool_tip="Interdiction de construire/rezzer"/>
31 <button name="no_scripts" tool_tip="Interdiction d&apos;utiliser des scripts" /> 29 <button name="no_scripts" tool_tip="Interdiction d&apos;utiliser des scripts"/>
32 <button label="" label_selected="" name="restrictpush" tool_tip="llPushObject interdit" /> 30 <button label="" label_selected="" name="restrictpush" tool_tip="llPushObject interdit"/>
33 <button name="status_no_voice" tool_tip="Voix non disponible ici" /> 31 <button name="status_no_voice" tool_tip="Voix non disponible ici"/>
34 <button label="" label_selected="" name="buyland" tool_tip="Acheter cette parcelle" /> 32 <button label="" label_selected="" name="buyland" tool_tip="Acheter cette parcelle"/>
35 <line_editor label="Rechercher" name="search_editor" tool_tip="Rechercher dans Second Life" /> 33 <line_editor label="Rechercher" name="search_editor" tool_tip="Rechercher dans Second Life"/>
36 <button name="search_btn" tool_tip="Rechercher dans Second Life" /> 34 <button name="search_btn" tool_tip="Rechercher dans Second Life"/>
37 <text name="packet_loss_tooltip"> 35 <text name="packet_loss_tooltip">
38 Perte de paquets 36 Perte de paquets
39 </text> 37 </text>
diff --git a/linden/indra/newview/skins/default/xui/fr/panel_toolbar.xml b/linden/indra/newview/skins/default/xui/fr/panel_toolbar.xml
index c059fff..99aaa65 100644
--- a/linden/indra/newview/skins/default/xui/fr/panel_toolbar.xml
+++ b/linden/indra/newview/skins/default/xui/fr/panel_toolbar.xml
@@ -1,22 +1,17 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 1<?xml version="1.0" encoding="utf-8" standalone="yes"?>
2<panel name="toolbar"> 2<panel name="toolbar">
3 <string name="Redock Windows"> 3 <string name="Redock Windows">
4 Rétablir les fenêtres 4 Rétablir les fenêtres
5 </string> 5 </string>
6 <layout_stack name="toolbar_stack"> 6 <layout_stack name="toolbar_stack">
7 <button label="" name="chat_btn" tool_tip="Afficher la barre de chat. (Entrée)" /> 7 <button label="" name="chat_btn" tool_tip="Affichez la barre de chat. (Entrée)"/>
8 <flyout_button label="Communiquer" name="communicate_btn" 8 <flyout_button label="Communiquer" name="communicate_btn" tool_tip="Communiquez avec vos amis et vos groupes."/>
9 tool_tip="Communiquer avec vos amis et vos groupes." /> 9 <button label="Voler" label_selected="Atterrir" name="fly_btn" tool_tip="Commencez à voler. Utilisez E/C ou PgHaut/PageBas pour voler vers le haut et vers le bas."/>
10 <button label="Voler" label_selected="Atterrir" name="fly_btn" 10 <button label="Photo" name="snapshot_btn" tool_tip="Enregistrez une photo sur le disque ou dans l&apos;inventaire."/>
11 tool_tip="Commencer à voler. Utilisez E/C ou PgHaut/PageBas pour voler vers le haut et vers le bas." /> 11 <button label="Rechercher" name="directory_btn" tool_tip="Recherchez des endroits, des événements, des résidents, et plus encore."/>
12 <button label="Photo" name="snapshot_btn" 12 <button label="Construire" name="build_btn" tool_tip="Créez de nouveaux objets."/>
13 tool_tip="Enregistrer une photo sur le disque ou dans l&apos;inventaire." /> 13 <button label="Mini-carte" name="radar_btn" tool_tip="Affichez la carte de la zone autour de vous. (Ctrl-Maj-M)"/>
14 <button label="Rechercher" name="directory_btn" 14 <button label="Carte" name="map_btn" tool_tip="Affichez la carte du Monde. (Ctrl-M)"/>
15 tool_tip="Rechercher des endroits, des événements, des personnes, et plus encore." /> 15 <button label="Inventaire" name="inventory_btn" tool_tip="Vos objets (Ctrl-I)"/>
16 <button label="Construire" name="build_btn" tool_tip="Créer de nouveaux objets." />
17 <button label="Mini-carte" name="radar_btn"
18 tool_tip="Carte de la zone autour de vous. (Ctrl-Maj-M)" />
19 <button label="Carte" name="map_btn" tool_tip="Carte du monde. (Ctrl-M)" />
20 <button label="Inventaire" name="inventory_btn" tool_tip="Vos objets. (Ctrl-I)" />
21 </layout_stack> 16 </layout_stack>
22</panel> 17</panel>
diff --git a/linden/indra/newview/skins/default/xui/fr/panel_voice_enable.xml b/linden/indra/newview/skins/default/xui/fr/panel_voice_enable.xml
index 7fcc9bc..f585388 100644
--- a/linden/indra/newview/skins/default/xui/fr/panel_voice_enable.xml
+++ b/linden/indra/newview/skins/default/xui/fr/panel_voice_enable.xml
@@ -1,7 +1,7 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 1<?xml version="1.0" encoding="utf-8" standalone="yes"?>
2<panel name="content_panel"> 2<panel name="content_panel">
3 <text_editor name="voice_intro_text1"> 3 <text_editor name="voice_intro_text1">
4 Bienvenue dans le chat vocal de Second Life ! Le chat vocal vous permet de communiquer avec les autres résidents. Cet assistant vous aidera à le paramétrer correctement. Le chat vocal requiert l&apos;utilisation de speakers audio. Pour parler, il vous faudra aussi un micro ou un casque stéréo avec un micro. 4 Bienvenue dans le chat vocal de Second Life ! Le chat vocal vous permet de communiquer avec les autres résidents. Cet assistant vous aidera à le paramétrer correctement. Le chat vocal requiert l&apos;utilisation de haut-parleurs audio. Pour parler, il vous faudra aussi un micro ou un casque stéréo avec un micro.
5 </text_editor> 5 </text_editor>
6 <text_editor name="voice_intro_text2"> 6 <text_editor name="voice_intro_text2">
7 Le chat vocal est activé par défaut. Souhaitez-vous continuer à l&apos;utiliser ? 7 Le chat vocal est activé par défaut. Souhaitez-vous continuer à l&apos;utiliser ?
diff --git a/linden/indra/newview/skins/default/xui/fr/panel_voice_options.xml b/linden/indra/newview/skins/default/xui/fr/panel_voice_options.xml
index 0814e76..9d67987 100644
--- a/linden/indra/newview/skins/default/xui/fr/panel_voice_options.xml
+++ b/linden/indra/newview/skins/default/xui/fr/panel_voice_options.xml
@@ -1,4 +1,4 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 1<?xml version="1.0" encoding="utf-8" standalone="yes"?>
2<panel name="content_panel"> 2<panel name="content_panel">
3 <text_editor name="voice_intro_text1"> 3 <text_editor name="voice_intro_text1">
4 Pour configurer votre chat vocal, utilisez les options ci-dessous. 4 Pour configurer votre chat vocal, utilisez les options ci-dessous.
@@ -11,13 +11,11 @@
11 Écouter depuis la position de l&apos;avatar. 11 Écouter depuis la position de l&apos;avatar.
12 </radio_item> 12 </radio_item>
13 </radio_group> 13 </radio_group>
14 <check_box label="N&apos;autoriser que mes amis à m&apos;appeler." 14 <check_box label="N&apos;autoriser que mes amis à m&apos;appeler." name="friends_only_check"/>
15 name="friends_only_check" /> 15 <check_box label="Attribuer une touche de contrôle" name="push_to_talk_toggle_check"/>
16 <check_box label="Utiliser la fonction Appuyer pour parler en mode bascule"
17 name="push_to_talk_toggle_check" />
18 <text name="push_to_talk_label"> 16 <text name="push_to_talk_label">
19 Déclencheur de la fonction Appuyer pour parler : 17 Touche de contrôle de la fonction Appuyer pour parler :
20 </text> 18 </text>
21 <button label="Choisir la touche" name="set_voice_hotkey_button" /> 19 <button label="Choisir la touche" name="set_voice_hotkey_button"/>
22 <button label="Molette de la souris" name="set_voice_middlemouse_button" /> 20 <button label="Molette de la souris" name="set_voice_middlemouse_button"/>
23</panel> 21</panel>
diff --git a/linden/indra/newview/skins/default/xui/fr/strings.xml b/linden/indra/newview/skins/default/xui/fr/strings.xml
index 0c4b625..3978b1d 100644
--- a/linden/indra/newview/skins/default/xui/fr/strings.xml
+++ b/linden/indra/newview/skins/default/xui/fr/strings.xml
@@ -1,4 +1,4 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 1<?xml version="1.0" encoding="utf-8" standalone="yes"?>
2<strings> 2<strings>
3 <string name="LoginInProgress"> 3 <string name="LoginInProgress">
4 La connexion à [APP_NAME] apparaît peut-être comme étant gelée. Veuillez patienter. 4 La connexion à [APP_NAME] apparaît peut-être comme étant gelée. Veuillez patienter.
@@ -82,7 +82,7 @@
82 Toucher 82 Toucher
83 </string> 83 </string>
84 <string name="TooltipFlagL$"> 84 <string name="TooltipFlagL$">
85 $L 85 L$
86 </string> 86 </string>
87 <string name="TooltipFlagDropInventory"> 87 <string name="TooltipFlagDropInventory">
88 Laisser tomber l&apos;inventaire 88 Laisser tomber l&apos;inventaire
@@ -100,7 +100,7 @@
100 Copie autorisée 100 Copie autorisée
101 </string> 101 </string>
102 <string name="TooltipForSaleL$"> 102 <string name="TooltipForSaleL$">
103 À vendre : [AMOUNT] $L 103 À vendre : [AMOUNT] L$
104 </string> 104 </string>
105 <string name="TooltipForSaleMsg"> 105 <string name="TooltipForSaleMsg">
106 À vendre : [MESSAGE] 106 À vendre : [MESSAGE]
@@ -301,7 +301,7 @@
301 Non 301 Non
302 </string> 302 </string>
303 <string name="anim_nyanya"> 303 <string name="anim_nyanya">
304 Na na na nère 304 Na na na na nère
305 </string> 305 </string>
306 <string name="anim_punch_onetwo"> 306 <string name="anim_punch_onetwo">
307 Gauche-droite 307 Gauche-droite
@@ -409,9 +409,9 @@
409 Hors ligne 409 Hors ligne
410 </string> 410 </string>
411 <string name="whisper"> 411 <string name="whisper">
412 chuchotages : 412 chuchote :
413 </string> 413 </string>
414 <string name="shout"> 414 <string name="shout">
415 cris : 415 crie :
416 </string> 416 </string>
417</strings> 417</strings>
diff --git a/linden/indra/newview/skins/default/xui/ja/floater_about_land.xml b/linden/indra/newview/skins/default/xui/ja/floater_about_land.xml
index adc85df..55df129 100644
--- a/linden/indra/newview/skins/default/xui/ja/floater_about_land.xml
+++ b/linden/indra/newview/skins/default/xui/ja/floater_about_land.xml
@@ -171,9 +171,6 @@
171 <text type="string" length="1" name="Simulator primitive usage:" width="500"> 171 <text type="string" length="1" name="Simulator primitive usage:" width="500">
172 シミュレータã®åŸºæœ¬è¦ç´ ä½¿ç”¨çжæ³ï¼š 172 シミュレータã®åŸºæœ¬è¦ç´ ä½¿ç”¨çжæ³ï¼š
173 </text> 173 </text>
174 <text type="string" length="1" left="200" name="0 out of 0 available">
175 14055ã®ã†ã¡0(14055利用å¯èƒ½ï¼‰
176 </text>
177 <text left="200" name="objects_available"> 174 <text left="200" name="objects_available">
178 [MAX]ã®å†…[COUNT]([AVAILABLE]利用å¯èƒ½ï¼‰ 175 [MAX]ã®å†…[COUNT]([AVAILABLE]利用å¯èƒ½ï¼‰
179 </text> 176 </text>
diff --git a/linden/indra/newview/skins/default/xui/ja/floater_preview_gesture.xml b/linden/indra/newview/skins/default/xui/ja/floater_preview_gesture.xml
index bc5675c..7ebcacd 100644
--- a/linden/indra/newview/skins/default/xui/ja/floater_preview_gesture.xml
+++ b/linden/indra/newview/skins/default/xui/ja/floater_preview_gesture.xml
@@ -30,12 +30,14 @@
30 <text name="steps_label"> 30 <text name="steps_label">
31 手順: 31 手順:
32 </text> 32 </text>
33 <!-- Revert translations as interim fix to VWR-9985 while the code is not properly internationalized
33 <scroll_list name="library_list"> 34 <scroll_list name="library_list">
34 アニメーション 35 アニメーション
35サウンド 36サウンド
36ãƒãƒ£ãƒƒãƒˆ 37ãƒãƒ£ãƒƒãƒˆ
37待機 38待機
38 </scroll_list> 39 </scroll_list>
40 -->
39 <button label="追加>>" name="add_btn"/> 41 <button label="追加>>" name="add_btn"/>
40 <button label="上ã«ç§»å‹•" name="up_btn"/> 42 <button label="上ã«ç§»å‹•" name="up_btn"/>
41 <button label="下ã«ç§»å‹•" name="down_btn"/> 43 <button label="下ã«ç§»å‹•" name="down_btn"/>
diff --git a/linden/indra/newview/skins/default/xui/ja/floater_tools.xml b/linden/indra/newview/skins/default/xui/ja/floater_tools.xml
index 4d22f39..b8e6c3e 100644
--- a/linden/indra/newview/skins/default/xui/ja/floater_tools.xml
+++ b/linden/indra/newview/skins/default/xui/ja/floater_tools.xml
@@ -74,7 +74,7 @@
74 <check_box label="åœŸåœ°ã‚’é¸æŠž" name="radio select land" /> 74 <check_box label="åœŸåœ°ã‚’é¸æŠž" name="radio select land" />
75 <check_box label="土地をãªã‚‰ã™" name="radio flatten" /> 75 <check_box label="土地をãªã‚‰ã™" name="radio flatten" />
76 <check_box label="土地を隆起ã•ã›ã‚‹" name="radio raise" /> 76 <check_box label="土地を隆起ã•ã›ã‚‹" name="radio raise" />
77 <check_box label="低地" name="radio lower" /> 77 <check_box label="土地を低ãã™ã‚‹" name="radio lower" />
78 <check_box label="土地を滑らã‹ã«ã™ã‚‹" name="radio smooth" /> 78 <check_box label="土地を滑らã‹ã«ã™ã‚‹" name="radio smooth" />
79 <check_box label="土地をè’らã™" name="radio noise" /> 79 <check_box label="土地をè’らã™" name="radio noise" />
80 <check_box label="åœŸåœ°ã‚’å…ƒã«æˆ»ã™" name="radio revert" /> 80 <check_box label="åœŸåœ°ã‚’å…ƒã«æˆ»ã™" name="radio revert" />
diff --git a/linden/indra/newview/skins/default/xui/ja/panel_avatar.xml b/linden/indra/newview/skins/default/xui/ja/panel_avatar.xml
index 04f802a..5bdc712 100644
--- a/linden/indra/newview/skins/default/xui/ja/panel_avatar.xml
+++ b/linden/indra/newview/skins/default/xui/ja/panel_avatar.xml
@@ -20,7 +20,7 @@
20 Linden Lab従業員 20 Linden Lab従業員
21 </string> 21 </string>
22 <string name="PaymentInfoUsed"> 22 <string name="PaymentInfoUsed">
23 使用ã™ã‚‹æ”¯æ‰•ã„æƒ…å ± 23 æ”¯æ‰•ã„æƒ…報登録済
24 </string> 24 </string>
25 <string name="PaymentInfoOnFile"> 25 <string name="PaymentInfoOnFile">
26 æ”¯æ‰•ã„æƒ…報登録済㿠26 æ”¯æ‰•ã„æƒ…報登録済ã¿
diff --git a/linden/indra/newview/skins/default/xui/ja/panel_preferences_chat.xml b/linden/indra/newview/skins/default/xui/ja/panel_preferences_chat.xml
index 1ad08fb..96a4bc3 100644
--- a/linden/indra/newview/skins/default/xui/ja/panel_preferences_chat.xml
+++ b/linden/indra/newview/skins/default/xui/ja/panel_preferences_chat.xml
@@ -3,7 +3,7 @@
3 <text length="1" name="text_box" type="string"> 3 <text length="1" name="text_box" type="string">
4 ãƒãƒ£ãƒƒãƒˆã®ãƒ•ォント: 4 ãƒãƒ£ãƒƒãƒˆã®ãƒ•ォント:
5 </text> 5 </text>
6 <radio_group name="chat font size"> 6 <radio_group name="chat_font_size">
7 <radio_item length="1" name="radio" type="string"> 7 <radio_item length="1" name="radio" type="string">
8 å° 8 å°
9 </radio_item> 9 </radio_item>
diff --git a/linden/indra/newview/skins/default/xui/ja/panel_preferences_input.xml b/linden/indra/newview/skins/default/xui/ja/panel_preferences_input.xml
index b24b01e..75e9051 100644
--- a/linden/indra/newview/skins/default/xui/ja/panel_preferences_input.xml
+++ b/linden/indra/newview/skins/default/xui/ja/panel_preferences_input.xml
@@ -6,11 +6,11 @@
6 <text name=" Mouse Sensitivity:"> 6 <text name=" Mouse Sensitivity:">
7 感度: 7 感度:
8 </text> 8 </text>
9 <check_box label="上下をå転" name="invert mouse"/> 9 <check_box label="上下をå転" name="invert_mouse"/>
10 <text name=" Auto Fly Options:"> 10 <text name=" Auto Fly Options:">
11 自動飛行オプション: 11 自動飛行オプション:
12 </text> 12 </text>
13 <check_box label="上下矢å°ã‚­ãƒ¼ã®é•·æŠ¼ã—ã§é£›è¡Œï¼ç€åœ°" name="automatic fly"/> 13 <check_box label="上下矢å°ã‚­ãƒ¼ã®é•·æŠ¼ã—ã§é£›è¡Œï¼ç€åœ°" name="automatic_fly"/>
14 <text name=" Camera Options:"> 14 <text name=" Camera Options:">
15 カメラ・オプション: 15 カメラ・オプション:
16 </text> 16 </text>
@@ -23,15 +23,15 @@
23 <text name="Camera Smoothing:"> 23 <text name="Camera Smoothing:">
24 カメラ・スムージング: 24 カメラ・スムージング:
25 </text> 25 </text>
26 <check_box label="編集カメラã®è‡ªå‹•移動" name="edit camera movement" tool_tip="編集モードã®é–‹å§‹ã€çµ‚了時ã¯ã‚«ãƒ¡ãƒ©è‡ªå‹•ä½ç½®èª¿æ•´ã‚’使用"/> 26 <check_box label="編集カメラã®è‡ªå‹•移動" name="edit_camera_movement" tool_tip="編集モードã®é–‹å§‹ã€çµ‚了時ã¯ã‚«ãƒ¡ãƒ©è‡ªå‹•ä½ç½®èª¿æ•´ã‚’使用"/>
27 <check_box label="容姿カメラã®è‡ªå‹•移動" name="appearance camera movement" tool_tip="編集モードã§ã¯ã€ã‚«ãƒ¡ãƒ©è‡ªå‹•ä½ç½®èª¿æ•´ã‚’使用"/> 27 <check_box label="容姿カメラã®è‡ªå‹•移動" name="appearance_camera_movement" tool_tip="編集モードã§ã¯ã€ã‚«ãƒ¡ãƒ©è‡ªå‹•ä½ç½®èª¿æ•´ã‚’使用"/>
28 <text name="text2"> 28 <text name="text2">
29 ã‚¢ãƒã‚¿ãƒ¼è¡¨ç¤ºï¼š 29 ã‚¢ãƒã‚¿ãƒ¼è¡¨ç¤ºï¼š
30 </text> 30 </text>
31 <check_box label="ã‚¢ãƒã‚¿ãƒ¼ã‚’マウスルックã§è¡¨ç¤º" name="avfp"/> 31 <check_box label="ã‚¢ãƒã‚¿ãƒ¼ã‚’マウスルックã§è¡¨ç¤º" name="first_person_avatar_visible"/>
32 <text name="text5"> 32 <text name="text5">
33 ジョイスティック 33 ジョイスティック
34オプション: 34オプション:
35 </text> 35 </text>
36 <button label="ジョイスティック設定" name="joystic_setup_button"/> 36 <button label="ジョイスティック設定" name="joystick_setup_button"/>
37</panel> 37</panel>
diff --git a/linden/indra/newview/skins/default/xui/ja/panel_preferences_network.xml b/linden/indra/newview/skins/default/xui/ja/panel_preferences_network.xml
index 1c65481..3e408af 100644
--- a/linden/indra/newview/skins/default/xui/ja/panel_preferences_network.xml
+++ b/linden/indra/newview/skins/default/xui/ja/panel_preferences_network.xml
@@ -4,7 +4,7 @@
4 最大帯域幅: 4 最大帯域幅:
5 </text> 5 </text>
6 <text type="string" length="1" name="text_box2"> 6 <text type="string" length="1" name="text_box2">
7 Kbps 7 kbps
8 </text> 8 </text>
9 <text type="string" length="1" name="cache_size_label_l"> 9 <text type="string" length="1" name="cache_size_label_l">
10 キャッシュ: 10 キャッシュ:
diff --git a/linden/indra/newview/skins/default/xui/ja/strings.xml b/linden/indra/newview/skins/default/xui/ja/strings.xml
index 8339b10..f982b84 100644
--- a/linden/indra/newview/skins/default/xui/ja/strings.xml
+++ b/linden/indra/newview/skins/default/xui/ja/strings.xml
@@ -435,9 +435,9 @@
435 </string> 435 </string>
436 <!-- Chat --> 436 <!-- Chat -->
437 <string name="whisper"> 437 <string name="whisper">
438 ã•ã•ã‚„ã: 438 ã®ã•ã•ã‚„ã:
439 </string> 439 </string>
440 <string name="shout"> 440 <string name="shout">
441 å«ã: 441 ã®å«ã³:
442 </string> 442 </string>
443</strings> 443</strings>
diff --git a/linden/indra/newview/skins/default/xui/ko/floater_about_land.xml b/linden/indra/newview/skins/default/xui/ko/floater_about_land.xml
index 01b3072..0eb42ad 100644
--- a/linden/indra/newview/skins/default/xui/ko/floater_about_land.xml
+++ b/linden/indra/newview/skins/default/xui/ko/floater_about_land.xml
@@ -169,9 +169,6 @@
169 <text type="string" length="1" name="Simulator primitive usage:"> 169 <text type="string" length="1" name="Simulator primitive usage:">
170 시뮬레ì´í„° 프림 사용률: 170 시뮬레ì´í„° 프림 사용률:
171 </text> 171 </text>
172 <text type="string" length="1" name="0 out of 0 available">
173 14055개 중 0개(14055개 사용 가능)
174 </text>
175 <text name="objects_available"> 172 <text name="objects_available">
176 [MAX] 중 [COUNT] ([AVAILABLE] 사용 가능) 173 [MAX] 중 [COUNT] ([AVAILABLE] 사용 가능)
177 </text> 174 </text>
diff --git a/linden/indra/newview/skins/default/xui/ko/floater_preview_gesture.xml b/linden/indra/newview/skins/default/xui/ko/floater_preview_gesture.xml
index fda53bc..1327873 100644
--- a/linden/indra/newview/skins/default/xui/ko/floater_preview_gesture.xml
+++ b/linden/indra/newview/skins/default/xui/ko/floater_preview_gesture.xml
@@ -30,12 +30,14 @@
30 <text name="steps_label"> 30 <text name="steps_label">
31 단계: 31 단계:
32 </text> 32 </text>
33 <!-- Revert translations as interim fix to VWR-9985 while the code is not properly internationalized
33 <scroll_list name="library_list"> 34 <scroll_list name="library_list">
34 애니메ì´ì…˜ 35 애니메ì´ì…˜
35사운드 36사운드
36채팅 37채팅
37대기 38대기
38 </scroll_list> 39 </scroll_list>
40 -->
39 <button label="추가 &gt;&gt;" name="add_btn"/> 41 <button label="추가 &gt;&gt;" name="add_btn"/>
40 <button label="위로 ì´ë™" name="up_btn"/> 42 <button label="위로 ì´ë™" name="up_btn"/>
41 <button label="아래로 ì´ë™" name="down_btn"/> 43 <button label="아래로 ì´ë™" name="down_btn"/>
diff --git a/linden/indra/newview/skins/default/xui/ko/panel_preferences_chat.xml b/linden/indra/newview/skins/default/xui/ko/panel_preferences_chat.xml
index e94c428..1f9bdbc 100644
--- a/linden/indra/newview/skins/default/xui/ko/panel_preferences_chat.xml
+++ b/linden/indra/newview/skins/default/xui/ko/panel_preferences_chat.xml
@@ -3,7 +3,7 @@
3 <text length="1" name="text_box" type="string"> 3 <text length="1" name="text_box" type="string">
4 ê¸€ìž í¬ê¸°: 4 ê¸€ìž í¬ê¸°:
5 </text> 5 </text>
6 <radio_group name="chat font size"> 6 <radio_group name="chat_font_size">
7 <radio_item length="1" name="radio" type="string"> 7 <radio_item length="1" name="radio" type="string">
8 소 8 소
9 </radio_item> 9 </radio_item>
diff --git a/linden/indra/newview/skins/default/xui/ko/panel_preferences_input.xml b/linden/indra/newview/skins/default/xui/ko/panel_preferences_input.xml
index f391b2b..06edb21 100644
--- a/linden/indra/newview/skins/default/xui/ko/panel_preferences_input.xml
+++ b/linden/indra/newview/skins/default/xui/ko/panel_preferences_input.xml
@@ -6,11 +6,11 @@
6 <text name=" Mouse Sensitivity:"> 6 <text name=" Mouse Sensitivity:">
7 마우스 민ê°ì„±: 7 마우스 민ê°ì„±:
8 </text> 8 </text>
9 <check_box label="마우스 반전" name="invert mouse"/> 9 <check_box label="마우스 반전" name="invert_mouse"/>
10 <text name=" Auto Fly Options:"> 10 <text name=" Auto Fly Options:">
11 ìžë™ 비행 옵션: 11 ìžë™ 비행 옵션:
12 </text> 12 </text>
13 <check_box label="PageUp/Down 키로 ì´ì°©ë¥™" name="automatic fly"/> 13 <check_box label="PageUp/Down 키로 ì´ì°©ë¥™" name="automatic_fly"/>
14 <text name=" Camera Options:"> 14 <text name=" Camera Options:">
15 ì¹´ë©”ë¼ ì˜µì…˜: 15 ì¹´ë©”ë¼ ì˜µì…˜:
16 </text> 16 </text>
@@ -23,14 +23,14 @@
23 <text name="Camera Smoothing:"> 23 <text name="Camera Smoothing:">
24 ì¹´ë©”ë¼ ìŠ¤ë¬´ë”©: 24 ì¹´ë©”ë¼ ìŠ¤ë¬´ë”©:
25 </text> 25 </text>
26 <check_box label="ìžë™íŽ¸ì§‘ ì¹´ë©”ë¼ ì„¤ì •" name="edit camera movement" tool_tip="편집 모드를 시작하거나 종료할 때 ì¹´ë©”ë¼ ìžë™ 위치 설정 사용"/> 26 <check_box label="ìžë™íŽ¸ì§‘ ì¹´ë©”ë¼ ì„¤ì •" name="edit_camera_movement" tool_tip="편집 모드를 시작하거나 종료할 때 ì¹´ë©”ë¼ ìžë™ 위치 설정 사용"/>
27 <check_box label="ë‚´ 모습 변경시 ì¹´ë©”ë¼ ìžë™ 설정" name="appearance camera movement" tool_tip="편집 ëª¨ë“œì¼ ë•Œ ì¹´ë©”ë¼ ìžë™ 위치 설정 사용"/> 27 <check_box label="ë‚´ 모습 변경시 ì¹´ë©”ë¼ ìžë™ 설정" name="appearance_camera_movement" tool_tip="편집 ëª¨ë“œì¼ ë•Œ ì¹´ë©”ë¼ ìžë™ 위치 설정 사용"/>
28 <text name="text2"> 28 <text name="text2">
29 아바타 ë””ìŠ¤í”Œë ˆì´ ì˜µì…˜: 29 아바타 ë””ìŠ¤í”Œë ˆì´ ì˜µì…˜:
30 </text> 30 </text>
31 <check_box label="1ì¸ì¹­ 시ì ìœ¼ë¡œ 시작" name="avfp"/> 31 <check_box label="1ì¸ì¹­ 시ì ìœ¼ë¡œ 시작" name="first_person_avatar_visible"/>
32 <text name="text5"> 32 <text name="text5">
33 ì¡°ì´ìŠ¤í‹± 설정: 33 ì¡°ì´ìŠ¤í‹± 설정:
34 </text> 34 </text>
35 <button label="ì¡°ì´ìŠ¤í‹± 설치" name="joystic_setup_button"/> 35 <button label="ì¡°ì´ìŠ¤í‹± 설치" name="joystick_setup_button"/>
36</panel> 36</panel>
diff --git a/linden/indra/newview/skins/default/xui/pt/alerts.xml b/linden/indra/newview/skins/default/xui/pt/alerts.xml
index caceb16..3464521 100644
--- a/linden/indra/newview/skins/default/xui/pt/alerts.xml
+++ b/linden/indra/newview/skins/default/xui/pt/alerts.xml
@@ -3501,7 +3501,7 @@ s
3501 </alert> 3501 </alert>
3502 <alert name="HelpReportAbuseEmailLL"> 3502 <alert name="HelpReportAbuseEmailLL">
3503 <message name="message"> 3503 <message name="message">
3504 Use esta ferramenta para reportar violações dos Termos de Serviço e Padrões da Comunidade. Veja: -http://secondlife.com/corporate/tos.php http://secondlife.com/corporate/cs.php - Todos os abusos reportados dos Termos de Serviço e Padrões da Comunidade são investigados e resolvidos. Você receberá um e-mail informando-lhe da resolução quando esta ocorrer. Você também pode ver a resolução do incidente no Police Blotter em:- http://secondlife.com/community/blotter.php 3504 Use esta ferramenta para reportar violações dos Termos de Serviço e Padrões da Comunidade. Veja: -http://secondlife.com/corporate/tos.php http://secondlife.com/corporate/cs.php - Todos os abusos reportados dos Termos de Serviço e Padrões da Comunidade são investigados e resolvidos. Você receberá um e-mail informando-lhe da resolução quando esta ocorrer. Você também pode ver a resolução do incidente no Incident Report em:- http://secondlife.com/support/incidentreport.php
3505 </message> 3505 </message>
3506 </alert> 3506 </alert>
3507 <alert name="HelpReportAbuseEmailEO"> 3507 <alert name="HelpReportAbuseEmailEO">
diff --git a/linden/indra/newview/skins/default/xui/zh/alerts.xml b/linden/indra/newview/skins/default/xui/zh/alerts.xml
index 49cf3b2..a8e2b2a 100644
--- a/linden/indra/newview/skins/default/xui/zh/alerts.xml
+++ b/linden/indra/newview/skins/default/xui/zh/alerts.xml
@@ -3967,20 +3967,6 @@ allowed above.
3967 å–æ¶ˆ 3967 å–æ¶ˆ
3968 </option> 3968 </option>
3969 </alert> 3969 </alert>
3970 <alert name="HelpReportAbuse">
3971 <message name="message">
3972 Use this tool to report violations of the Terms of Service and Community Standards. See:
3973http://secondlife.com/corporate/tos.php
3974http://secondlife.com/corporate/cs.php
3975
3976All reported abuses of the Terms of Service and Community Standards
3977are investigated and resolved. You will receive an email informing you
3978of the resolution when it occurs.
3979You can also view the incident resolution on the Police Blotter at:
3980
3981http://secondlife.com/community/blotter.php
3982 </message>
3983 </alert>
3984 <alert name="HelpReportAbuseEmailLL"> 3970 <alert name="HelpReportAbuseEmailLL">
3985 <message name="message"> 3971 <message name="message">
3986 使用这个工具å¯ä»¥æŠ¥å‘Šè¿åæœåŠ¡å’Œç¤¾åŒºæ ‡å‡†æ¡ä¾‹çš„æ“ä½œã€‚è¯¦æƒ…è¯·è§ï¼š 3972 使用这个工具å¯ä»¥æŠ¥å‘Šè¿åæœåŠ¡å’Œç¤¾åŒºæ ‡å‡†æ¡ä¾‹çš„æ“ä½œã€‚è¯¦æƒ…è¯·è§ï¼š
diff --git a/linden/indra/newview/skins/default/xui/zh/floater_about_land.xml b/linden/indra/newview/skins/default/xui/zh/floater_about_land.xml
index 63ac152..cd85615 100644
--- a/linden/indra/newview/skins/default/xui/zh/floater_about_land.xml
+++ b/linden/indra/newview/skins/default/xui/zh/floater_about_land.xml
@@ -128,54 +128,33 @@
128 <text type="string" length="1" name="Simulator primitive usage:"> 128 <text type="string" length="1" name="Simulator primitive usage:">
129 模拟器简å•用法: 129 模拟器简å•用法:
130 </text> 130 </text>
131 <text type="string" length="1" name="0 out of 0 available">
132 0个,总数为14055 (14055个有效)
133 </text>
134 <text type="string" length="1" name="Primitives parcel supports:"> 131 <text type="string" length="1" name="Primitives parcel supports:">
135 原始土地支柱: 132 原始土地支柱:
136 </text> 133 </text>
137 <text type="string" length="1" name="object_contrib_text">
138 926
139 </text>
140 <text type="string" length="1" name="Primitives on parcel:"> 134 <text type="string" length="1" name="Primitives on parcel:">
141 土地上所有的原始建筑: 135 土地上所有的原始建筑:
142 </text> 136 </text>
143 <text type="string" length="1" name="total_objects_text">
144 0
145 </text>
146 <text type="string" length="1" name="Owned by parcel owner:"> 137 <text type="string" length="1" name="Owned by parcel owner:">
147 为土地拥有者所有: 138 为土地拥有者所有:
148 </text> 139 </text>
149 <text type="string" length="1" name="owner_objects_text">
150 0
151 </text>
152 <button label="显示" label_selected="显示" name="ShowOwner" /> 140 <button label="显示" label_selected="显示" name="ShowOwner" />
153 <button label="归还..." label_selected="归还..." name="ReturnOwner..." 141 <button label="归还..." label_selected="归还..." name="ReturnOwner..."
154 tool_tip="将东东归还其主人." /> 142 tool_tip="将东东归还其主人." />
155 <text type="string" length="1" name="Set to group:"> 143 <text type="string" length="1" name="Set to group:">
156 转入社团状æ€: 144 转入社团状æ€:
157 </text> 145 </text>
158 <text type="string" length="1" name="group_objects_text">
159 0
160 </text>
161 <button label="显示" label_selected="显示" name="ShowGroup" /> 146 <button label="显示" label_selected="显示" name="ShowGroup" />
162 <button label="归还..." label_selected="归还..." name="ReturnGroup..." 147 <button label="归还..." label_selected="归还..." name="ReturnGroup..."
163 tool_tip="将东东归还其主人." /> 148 tool_tip="将东东归还其主人." />
164 <text type="string" length="1" name="Owned by others:"> 149 <text type="string" length="1" name="Owned by others:">
165 为其他人所有: 150 为其他人所有:
166 </text> 151 </text>
167 <text type="string" length="1" name="other_objects_text">
168 0
169 </text>
170 <button label="显示" label_selected="显示" name="ShowOther" /> 152 <button label="显示" label_selected="显示" name="ShowOther" />
171 <button label="归还..." label_selected="归还..." name="ReturnOther..." 153 <button label="归还..." label_selected="归还..." name="ReturnOther..."
172 tool_tip="将东东归还其主人." /> 154 tool_tip="将东东归还其主人." />
173 <text type="string" length="1" name="Selected / sat upon:"> 155 <text type="string" length="1" name="Selected / sat upon:">
174 已选的/å上去: 156 已选的/å上去:
175 </text> 157 </text>
176 <text type="string" length="1" name="selected_objects_text">
177 0
178 </text>
179 <text type="string" length="1" name="Autoreturn other resident&amp;apos;s objects (minutes, 0 for off):"> 158 <text type="string" length="1" name="Autoreturn other resident&amp;apos;s objects (minutes, 0 for off):">
180 自动归还其他居民的东东(分钟, 0为关闭): 159 自动归还其他居民的东东(分钟, 0为关闭):
181 </text> 160 </text>
diff --git a/linden/indra/newview/skins/default/xui/zh/need_to_translate.xml b/linden/indra/newview/skins/default/xui/zh/need_to_translate.xml
deleted file mode 100644
index b10fab4..0000000
--- a/linden/indra/newview/skins/default/xui/zh/need_to_translate.xml
+++ /dev/null
@@ -1,908 +0,0 @@
1<?xml version="1.0"?>
2<?mso-application progid="Excel.Sheet"?>
3<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
4 xmlns:o="urn:schemas-microsoft-com:office:office"
5 xmlns:x="urn:schemas-microsoft-com:office:excel"
6 xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
7 xmlns:html="http://www.w3.org/TR/REC-html40">
8 <DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
9 <Created>1996-12-17T01:32:42Z</Created>
10 <LastSaved>2007-05-16T20:09:31Z</LastSaved>
11 <Version>11.6568</Version>
12 </DocumentProperties>
13 <OfficeDocumentSettings xmlns="urn:schemas-microsoft-com:office:office">
14 <RemovePersonalInformation/>
15 </OfficeDocumentSettings>
16 <ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
17 <WindowHeight>10170</WindowHeight>
18 <WindowWidth>19770</WindowWidth>
19 <WindowTopX>480</WindowTopX>
20 <WindowTopY>0</WindowTopY>
21 <AcceptLabelsInFormulas/>
22 <ProtectStructure>False</ProtectStructure>
23 <ProtectWindows>False</ProtectWindows>
24 </ExcelWorkbook>
25 <Styles>
26 <Style ss:ID="Default" ss:Name="Normal">
27 <Alignment ss:Vertical="Bottom"/>
28 <Borders/>
29 <Font ss:FontName="宋体" x:CharSet="134" ss:Size="12"/>
30 <Interior/>
31 <NumberFormat/>
32 <Protection/>
33 </Style>
34 <Style ss:ID="s21">
35 <Font x:Family="Swiss" ss:Bold="1"/>
36 </Style>
37 <Style ss:ID="s22">
38 <Font x:Family="Swiss" ss:Bold="1"/>
39 <Interior ss:Color="#C0C0C0" ss:Pattern="Solid"/>
40 </Style>
41 <Style ss:ID="s23">
42 <Alignment ss:Vertical="Bottom" ss:WrapText="1"/>
43 </Style>
44 </Styles>
45 <Worksheet ss:Name="Sheet1">
46 <Table ss:ExpandedColumnCount="7" ss:ExpandedRowCount="62" x:FullColumns="1"
47 x:FullRows="1" ss:DefaultColumnWidth="60" ss:DefaultRowHeight="17.25">
48 <Column ss:Width="183.75"/>
49 <Column ss:Width="483.75"/>
50 <Column ss:Width="108.75"/>
51 <Column ss:Width="76.5"/>
52 <Column ss:Width="655.5"/>
53 <Column ss:Width="108.75"/>
54 <Column ss:Width="117"/>
55 <Row>
56 <Cell ss:StyleID="s21"><Data ss:Type="String">/strings</Data></Cell>
57 </Row>
58 <Row>
59 <Cell ss:StyleID="s22"><Data ss:Type="String">/string/a_file</Data></Cell>
60 <Cell ss:StyleID="s22"><Data ss:Type="String">/string/b_path</Data></Cell>
61 <Cell ss:StyleID="s22"><Data ss:Type="String">/string/c_attribute</Data></Cell>
62 <Cell ss:StyleID="s22"><Data ss:Type="String">/string/d_old</Data></Cell>
63 <Cell ss:StyleID="s22"><Data ss:Type="String">/string/e_new</Data></Cell>
64 <Cell ss:StyleID="s22"><Data ss:Type="String">/string/f_old_trans</Data></Cell>
65 <Cell ss:StyleID="s22"><Data ss:Type="String">/string/f_translation</Data></Cell>
66 </Row>
67 <Row ss:Height="189.75">
68 <Cell><Data ss:Type="String">alerts.xml</Data></Cell>
69 <Cell><Data ss:Type="String">//GrantModifyRights/message</Data></Cell>
70 <Cell ss:Index="5" ss:StyleID="s23"><Data ss:Type="String">Granting modify rights to another resident allows them to change &#10;ANY objects you may have in-world. Be VERY careful when handing &#10;out this permission.&#10;Do you want to grant modify rights for [FIRST_NAME] [LAST_NAME]?</Data></Cell>
71 <Cell ss:Index="7" ss:StyleID="s23"><Data ss:Type="String">授予å¦å¤–一å居民修改的æƒåˆ©ï¼Œåˆ™æ„味ç€å…许他们修改任何你å†ç¬¬äºŒäººç”Ÿä¸–界里å¯èƒ½æ‹¥æœ‰çš„物å“。请在执行这项许å¯çš„æ—¶å€™æ ¼å¤–å°å¿ƒã€‚ 你真的希望授予[FIRST_NAME] [LAST_NAME]修改æƒåˆ©å—?</Data></Cell>
72 </Row>
73 <Row>
74 <Cell><Data ss:Type="String">alerts.xml</Data></Cell>
75 <Cell><Data ss:Type="String">//GrantModifyRights/Yes</Data></Cell>
76 <Cell ss:Index="5"><Data ss:Type="String">Yes</Data></Cell>
77 <Cell ss:Index="7"><Data ss:Type="String">是的,我愿æ„</Data></Cell>
78 </Row>
79 <Row>
80 <Cell><Data ss:Type="String">alerts.xml</Data></Cell>
81 <Cell><Data ss:Type="String">//GrantModifyRights/No</Data></Cell>
82 <Cell ss:Index="5"><Data ss:Type="String">No</Data></Cell>
83 <Cell ss:Index="7"><Data ss:Type="String">䏿˜¯ï¼Œæˆ‘想å†è€ƒè™‘一下</Data></Cell>
84 </Row>
85 <Row>
86 <Cell><Data ss:Type="String">alerts.xml</Data></Cell>
87 <Cell><Data ss:Type="String">//RevokeModifyRights/message</Data></Cell>
88 <Cell ss:Index="5"><Data ss:Type="String">Do you want to revoke modify rights for [FIRST_NAME] [LAST_NAME]?</Data></Cell>
89 <Cell ss:Index="7"><Data ss:Type="String">你真的希望撤回[FIRST_NAME] [LAST_NAME]的修改æƒåˆ©å—?</Data></Cell>
90 </Row>
91 <Row>
92 <Cell><Data ss:Type="String">alerts.xml</Data></Cell>
93 <Cell><Data ss:Type="String">//RevokeModifyRights/Yes</Data></Cell>
94 <Cell ss:Index="5"><Data ss:Type="String">Yes</Data></Cell>
95 <Cell ss:Index="7"><Data ss:Type="String">是的,我愿æ„</Data></Cell>
96 </Row>
97 <Row>
98 <Cell><Data ss:Type="String">alerts.xml</Data></Cell>
99 <Cell><Data ss:Type="String">//RevokeModifyRights/No</Data></Cell>
100 <Cell ss:Index="5"><Data ss:Type="String">No</Data></Cell>
101 <Cell ss:Index="7"><Data ss:Type="String">䏿˜¯ï¼Œæˆ‘想å†è€ƒè™‘一下</Data></Cell>
102 </Row>
103 <Row>
104 <Cell><Data ss:Type="String">alerts.xml</Data></Cell>
105 <Cell><Data ss:Type="String">//ConfirmNotecardSave/message</Data></Cell>
106 <Cell ss:Index="5"><Data ss:Type="String">This notecard needs to be saved before the item can be copied or viewed. Save notecard?</Data></Cell>
107 <Cell ss:Index="7"><Data ss:Type="String">åªæœ‰ä¿å­˜è¿™å¼ æç¤ºå¡ä¹‹åŽï¼Œæ­¤é¡¹ç‰©å“æ‰å¯ä»¥å¤åˆ¶æˆ–查看。是å¦ä¿å­˜æç¤ºå¡ï¼Ÿ</Data></Cell>
108 </Row>
109 <Row>
110 <Cell><Data ss:Type="String">alerts.xml</Data></Cell>
111 <Cell><Data ss:Type="String">//ConfirmNotecardSave/Save</Data></Cell>
112 <Cell ss:Index="5"><Data ss:Type="String">Save</Data></Cell>
113 <Cell ss:Index="7"><Data ss:Type="String">是的,请ä¿å­˜</Data></Cell>
114 </Row>
115 <Row>
116 <Cell><Data ss:Type="String">alerts.xml</Data></Cell>
117 <Cell><Data ss:Type="String">//ConfirmNotecardSave/Cancel</Data></Cell>
118 <Cell ss:Index="5"><Data ss:Type="String">Cancel</Data></Cell>
119 <Cell ss:Index="7"><Data ss:Type="String">å–æ¶ˆä¿å­˜</Data></Cell>
120 </Row>
121 <Row>
122 <Cell><Data ss:Type="String">alerts.xml</Data></Cell>
123 <Cell><Data ss:Type="String">//RemoveMultipleFromFriends/message</Data></Cell>
124 <Cell ss:Index="5"><Data ss:Type="String">Do you want to remove multiple friends from your friends list?</Data></Cell>
125 <Cell ss:Index="7"><Data ss:Type="String">你希望从好å‹åˆ—表中移除若干好å‹å—?</Data></Cell>
126 </Row>
127 <Row>
128 <Cell><Data ss:Type="String">alerts.xml</Data></Cell>
129 <Cell><Data ss:Type="String">//RemoveMultipleFromFriends/Remove</Data></Cell>
130 <Cell ss:Index="5"><Data ss:Type="String">Remove</Data></Cell>
131 <Cell ss:Index="7"><Data ss:Type="String">是的,我è¦ç§»é™¤</Data></Cell>
132 </Row>
133 <Row>
134 <Cell><Data ss:Type="String">alerts.xml</Data></Cell>
135 <Cell><Data ss:Type="String">//RemoveMultipleFromFriends/Cancel</Data></Cell>
136 <Cell ss:Index="5"><Data ss:Type="String">Cancel</Data></Cell>
137 <Cell ss:Index="7"><Data ss:Type="String">å–æ¶ˆ</Data></Cell>
138 </Row>
139 <Row>
140 <Cell><Data ss:Type="String">alerts.xml</Data></Cell>
141 <Cell><Data ss:Type="String">//GrantedModifyRights/message</Data></Cell>
142 <Cell ss:Index="5"><Data ss:Type="String">You have been granted the privilege to modify [FIRST_NAME] [LAST_NAME]'s objects.</Data></Cell>
143 <Cell ss:Index="7"><Data ss:Type="String">ä½ å·²ç»è¢«æŽˆäºˆç‰¹æƒï¼Œä½ å¯ä»¥ä»»æ„修改[FIRST_NAME] [LAST_NAME]的东东。</Data></Cell>
144 </Row>
145 <Row>
146 <Cell><Data ss:Type="String">alerts.xml</Data></Cell>
147 <Cell><Data ss:Type="String">//RevokedModifyRights/message</Data></Cell>
148 <Cell ss:Index="5"><Data ss:Type="String">Your privilege to modify [FIRST_NAME] [LAST_NAME]'s objects has been revoked</Data></Cell>
149 <Cell ss:Index="7"><Data ss:Type="String">你的特æƒå·²ç»è¢«æ’¤å›žï¼Œä½ ä¸å¯ä»¥å†ä»»æ„修改[FIRST_NAME] [LAST_NAME]的东东。</Data></Cell>
150 </Row>
151 <Row>
152 <Cell><Data ss:Type="String">alerts.xml</Data></Cell>
153 <Cell><Data ss:Type="String">//OnlyCopyContentsOfSingleItem/OK</Data></Cell>
154 <Cell ss:Index="5"><Data ss:Type="String">OK</Data></Cell>
155 <Cell ss:Index="7"><Data ss:Type="String">好的</Data></Cell>
156 </Row>
157 <Row>
158 <Cell><Data ss:Type="String">alerts.xml</Data></Cell>
159 <Cell><Data ss:Type="String">//OnlyCopyContentsOfSingleItem/Cancel</Data></Cell>
160 <Cell ss:Index="5"><Data ss:Type="String">Cancel</Data></Cell>
161 <Cell ss:Index="7"><Data ss:Type="String">å–æ¶ˆ</Data></Cell>
162 </Row>
163 <Row ss:Height="258.75">
164 <Cell><Data ss:Type="String">alerts.xml</Data></Cell>
165 <Cell><Data ss:Type="String">//InvalidTerrainBitDepth/message</Data></Cell>
166 <Cell ss:Index="5" ss:StyleID="s23"><Data ss:Type="String">Couldn't set region textures: &#10; &#10;Terrain texture [TEXTURE_NUM] has an invalid bit depth of [TEXTURE_BIT_DEPTH].&#10; &#10;Replace texture [TEXTURE_NUM] with a 24 bit 512x512 or smaller image&#10;then click &quot;Set&quot; again.</Data></Cell>
167 <Cell ss:Index="7" ss:StyleID="s23"><Data ss:Type="String">无法设定区域的质地: &#10; &#10;目标质地 [TEXTURE_NUM] 的色彩格å¼[TEXTURE_BIT_DEPTH]无效.&#10; &#10;请把目å‰çš„目标质地[TEXTURE_NUM]更替为24比特 512x512分辨率,或者更å°çš„æ˜¾ç¤ºå›¾ç‰‡ï¼Œç„¶åŽç‚¹å‡» &quot;设置&quot;.</Data></Cell>
168 </Row>
169 <Row ss:Height="258.75">
170 <Cell><Data ss:Type="String">alerts.xml</Data></Cell>
171 <Cell><Data ss:Type="String">//InvalidTerrainSize/message</Data></Cell>
172 <Cell ss:Index="5" ss:StyleID="s23"><Data ss:Type="String">Couldn't set region textures: &#10; &#10;Terrain texture [TEXTURE_NUM] is too large at [TEXTURE_SIZE_X]x[TEXTURE_SIZE_Y]. &#10; &#10;Replace texture [TEXTURE_NUM] with a 24 bit 512x512 or smaller image&#10;then click &quot;Set&quot; again.</Data></Cell>
173 <Cell ss:Index="7" ss:StyleID="s23"><Data ss:Type="String">无法设置区域的质地: &#10; &#10;目标质地[TEXTURE_NUM]的尺寸 [TEXTURE_SIZE_X]x[TEXTURE_SIZE_Y]过大. &#10; &#10;请把目å‰çš„目标质地[TEXTURE_NUM]æ›¿æ¢æˆ24比特 512x512分辨率或者更å°çš„æ˜¾ç¤ºå›¾ç‰‡ï¼Œç„¶åŽç‚¹å‡» &quot;设置&quot;.</Data></Cell>
174 </Row>
175 <Row>
176 <Cell><Data ss:Type="String">alerts.xml</Data></Cell>
177 <Cell><Data ss:Type="String">//MaxAllowedGroupsOnRegion/Bake</Data></Cell>
178 <Cell ss:Index="5"><Data ss:Type="String">Bake</Data></Cell>
179 <Cell ss:Index="7"><Data ss:Type="String">执行</Data></Cell>
180 </Row>
181 <Row>
182 <Cell><Data ss:Type="String">alerts.xml</Data></Cell>
183 <Cell><Data ss:Type="String">//MaxAllowedGroupsOnRegion/Cancel</Data></Cell>
184 <Cell ss:Index="5"><Data ss:Type="String">Cancel</Data></Cell>
185 <Cell ss:Index="7"><Data ss:Type="String">å–æ¶ˆ</Data></Cell>
186 </Row>
187 <Row>
188 <Cell><Data ss:Type="String">alerts.xml</Data></Cell>
189 <Cell><Data ss:Type="String">//WebLaunchSupport/message</Data></Cell>
190 <Cell ss:Index="5"><Data ss:Type="String">Contact [SECOND_LIFE] Support.</Data></Cell>
191 <Cell ss:Index="7"><Data ss:Type="String">è”ç³»[SECOND_LIFE]支æŒä¸­å¿ƒ.</Data></Cell>
192 </Row>
193 <Row>
194 <Cell><Data ss:Type="String">alerts.xml</Data></Cell>
195 <Cell><Data ss:Type="String">//WebLaunchSupport/Gotopage</Data></Cell>
196 <Cell ss:Index="5"><Data ss:Type="String">Go to page</Data></Cell>
197 <Cell ss:Index="7"><Data ss:Type="String">翻页</Data></Cell>
198 </Row>
199 <Row>
200 <Cell><Data ss:Type="String">alerts.xml</Data></Cell>
201 <Cell><Data ss:Type="String">//WebLaunchSupport/Cancel</Data></Cell>
202 <Cell ss:Index="5"><Data ss:Type="String">Cancel</Data></Cell>
203 <Cell ss:Index="7"><Data ss:Type="String">å–æ¶ˆ</Data></Cell>
204 </Row>
205 <Row ss:Height="396.75">
206 <Cell><Data ss:Type="String">alerts.xml</Data></Cell>
207 <Cell><Data ss:Type="String">//HelpReportAbuseEmailLL/message</Data></Cell>
208 <Cell ss:Index="5" ss:StyleID="s23"><Data ss:Type="String">Use this tool to report violations of the Terms of Service &#10;and Community Standards. See: &#10;-&#10;http://secondlife.com/corporate/tos.php &#10;http://secondlife.com/corporate/cs.php &#10;-&#10;All reported abuses of the Terms of Service and Community Standards &#10;are investigated and resolved. You will receive an email informing you&#10;of the resolution when it occurs. You can also view the incident &#10;resolution on the Police Blotter at:&#10;- &#10;http://secondlife.com/community/blotter.php</Data></Cell>
209 <Cell ss:Index="7" ss:StyleID="s23"><Data ss:Type="String">使用这个工具å¯ä»¥æŠ¥å‘Šè¿åæœåŠ¡å’Œç¤¾åŒºæ ‡å‡†æ¡ä¾‹çš„æ“ä½œã€‚è¯¦æƒ…è¯·è§ï¼š &#10;-&#10;http://secondlife.com/corporate/tos.php &#10;http://secondlife.com/corporate/cs.php &#10;-&#10;所有对è¿åæœåŠ¡å’Œç¤¾åŒºæ ‡å‡†æ¡ä¾‹çš„æŠ¥å‘Šéƒ½ä¼šè¢«è°ƒæŸ¥å¹¶è§£å†³ã€‚你会收到一å°é‚®ä»¶æç¤ºä½ è§£å†³çš„è¿›å±•æƒ…å†µã€‚åŒæ—¶ï¼Œä½ å¯ä»¥åœ¨çº¿æŸ¥çœ‹ç§©åºæœ¬ï¼ŒåŠæ—¶èŽ·å¾—äº‹ä»¶çš„è§£å†³æƒ…å†µã€‚åœ¨çº¿ç§©åºæœ¬çš„åœ°å€æ˜¯:&#10;- &#10;http://secondlife.com/community/blotter.php</Data></Cell>
210 </Row>
211 <Row ss:Height="409.5">
212 <Cell><Data ss:Type="String">alerts.xml</Data></Cell>
213 <Cell><Data ss:Type="String">//HelpReportAbuseEmailEO/message</Data></Cell>
214 <Cell ss:Index="5" ss:StyleID="s23"><Data ss:Type="String">IMPORTANT: This report will go to the owner of the &#10;region you are currently in and not to Linden Lab.&#10;-&#10;As a service to residents and visitors, the owner of &#10;the region you are in has elected to receive and resolve &#10;all reports originating in this region. Linden Lab will &#10;not investigate reports you file from this location. &#10;The region owner will resolve reports based on the local &#10;rules of this region as outlined in the estate Covenant. &#10;(View covenants by going to the World menu and selecting &#10;About Land.)&#10;-&#10;The resolution of this report applies only to this Region; &#10;Residents access to other areas of Second Life will not be &#10;affected by the outcome of this report. Only Linden Lab can &#10;restrict access to the entirety of Second Life.</Data></Cell>
215 <Cell ss:Index="7" ss:StyleID="s23"><ss:Data ss:Type="String"
216 xmlns="http://www.w3.org/TR/REC-html40">é‡è¦æç¤º: 这个报告将ä¸ä¼šåˆ°è¾¾æž—登实验室处,而会å‘é€ç»™ä½ ç›®å‰æ‰€åœ¨åŒºåŸŸçš„主人。&#10;-&#10;作为一项针对于居民和游客的æœåŠ¡ï¼Œä½ æ‰€åœ¨è¿™å—åŒºåŸŸçš„ä¸»äººæœ‰è´£ä»»æŽ¥å—æ‰€æœ‰æ¥è‡ªè¿™å—区域的问题报告,并有责任解决它们。林登实验室将ä¸ä¼šè°ƒæŸ¥ä½ ä»Žæ‰€åœ¨åœ°ç‚¹æäº¤çš„问题报告。这å—区域的主人将éµå®ˆåœŸåœ°å¥‘约,解决一些基于此å—区域的本地规则的报告。(查看土地土地契约,å¯ä»¥è¿›å…¥æ¸¸æˆ<B>世界主èœå•</B><Font>,然åŽé€‰æ‹©</Font><B>关于土地</B><Font>。)&#10;-&#10;报告的解决方案åªåœ¨è¿™å—土地适用。其他进入第二人生其他区域的居民将ä¸ä¼šå—到这份报告输出的影å“ã€‚åªæœ‰æž—登实验室å¯ä»¥çº¦æŸæ˜¯å¦å¯ä»¥è¿›å…¥å…¨éƒ¨ç¬¬äºŒäººç”Ÿã€‚</Font></ss:Data></Cell>
217 </Row>
218 <Row ss:Height="51.75">
219 <Cell><Data ss:Type="String">alerts.xml</Data></Cell>
220 <Cell><Data ss:Type="String">//ConfirmEmptyTrash/message</Data></Cell>
221 <Cell ss:Index="5" ss:StyleID="s23"><Data ss:Type="String">Are you sure you want to permanently remove&#10;the contents of your Trash folder?</Data></Cell>
222 <Cell ss:Index="7" ss:StyleID="s23"><Data ss:Type="String">ä½ ç¡®å®šè¦æ°¸ä¹…性删除垃圾文件夹里的内容å—?</Data></Cell>
223 </Row>
224 <Row>
225 <Cell><Data ss:Type="String">alerts.xml</Data></Cell>
226 <Cell><Data ss:Type="String">//ConfirmEmptyTrash/Yes</Data></Cell>
227 <Cell ss:Index="5"><Data ss:Type="String">Yes</Data></Cell>
228 <Cell ss:Index="7"><Data ss:Type="String">使得,我è¦åˆ é™¤</Data></Cell>
229 </Row>
230 <Row>
231 <Cell><Data ss:Type="String">alerts.xml</Data></Cell>
232 <Cell><Data ss:Type="String">//ConfirmEmptyTrash/No</Data></Cell>
233 <Cell ss:Index="5"><Data ss:Type="String">No</Data></Cell>
234 <Cell ss:Index="7"><Data ss:Type="String">䏿˜¯</Data></Cell>
235 </Row>
236 <Row ss:Height="207">
237 <Cell><Data ss:Type="String">alerts.xml</Data></Cell>
238 <Cell><Data ss:Type="String">//CopySLURL/message</Data></Cell>
239 <Cell ss:Index="5" ss:StyleID="s23"><Data ss:Type="String">The following SLURL has been copied to your clipboard:&#10; &#10; [SLURL] &#10; &#10; Put it in a web page to give others easy access to this location or&#10; try it out yourself by pasting it into the address bar of your web browser.</Data></Cell>
240 <Cell ss:Index="7" ss:StyleID="s23"><Data ss:Type="String">以下链接已ç»è¢«å¤åˆ¶åˆ°ä½ çš„剪贴æ¿ä¸­:&#10; &#10; [SLURL] &#10; &#10; 把它加入到网页里,å¯ä»¥è®©åˆ«äººæ›´å®¹æ˜“的进入这个地点,或者直接拉入æµè§ˆå™¨çš„åœ°å€æ ä¸­ï¼Œè®©è‡ªå·±è¿›å…¥è¿™ä¸ªåœ°ç‚¹ã€‚</Data></Cell>
241 </Row>
242 <Row>
243 <Cell><Data ss:Type="String">floater_about_land.xml</Data></Cell>
244 <Cell><Data ss:Type="String">/floaterland/landtab/land_options_panel/allow_label2</Data></Cell>
245 <Cell ss:Index="5"><Data ss:Type="String">Create Objects:</Data></Cell>
246 <Cell ss:Index="7"><Data ss:Type="String">创造东东:</Data></Cell>
247 </Row>
248 <Row>
249 <Cell><Data ss:Type="String">floater_about_land.xml</Data></Cell>
250 <Cell><Data ss:Type="String">/floaterland/landtab/land_options_panel/edit group objects check</Data></Cell>
251 <Cell><Data ss:Type="String">label</Data></Cell>
252 <Cell ss:Index="5"><Data ss:Type="String">Group</Data></Cell>
253 <Cell ss:Index="7"><Data ss:Type="String">社团</Data></Cell>
254 </Row>
255 <Row>
256 <Cell><Data ss:Type="String">floater_about_land.xml</Data></Cell>
257 <Cell><Data ss:Type="String">/floaterland/landtab/land_options_panel/allow_label3</Data></Cell>
258 <Cell ss:Index="5"><Data ss:Type="String">Object Entry:</Data></Cell>
259 <Cell ss:Index="7"><Data ss:Type="String">进入东东:</Data></Cell>
260 </Row>
261 <Row>
262 <Cell><Data ss:Type="String">floater_about_land.xml</Data></Cell>
263 <Cell><Data ss:Type="String">/floaterland/landtab/land_options_panel/all object entry check</Data></Cell>
264 <Cell><Data ss:Type="String">label</Data></Cell>
265 <Cell ss:Index="5"><Data ss:Type="String">All Residents</Data></Cell>
266 <Cell ss:Index="7"><Data ss:Type="String">所有居民</Data></Cell>
267 </Row>
268 <Row>
269 <Cell><Data ss:Type="String">floater_about_land.xml</Data></Cell>
270 <Cell><Data ss:Type="String">/floaterland/landtab/land_options_panel/group object entry check</Data></Cell>
271 <Cell><Data ss:Type="String">label</Data></Cell>
272 <Cell ss:Index="5"><Data ss:Type="String">Group</Data></Cell>
273 <Cell ss:Index="7"><Data ss:Type="String">社团</Data></Cell>
274 </Row>
275 <Row>
276 <Cell><Data ss:Type="String">floater_about_land.xml</Data></Cell>
277 <Cell><Data ss:Type="String">/floaterland/landtab/land_options_panel/allow_label4</Data></Cell>
278 <Cell ss:Index="5"><Data ss:Type="String">Run Scripts:</Data></Cell>
279 <Cell ss:Index="7"><Data ss:Type="String">è¿è¡Œè„šæœ¬:</Data></Cell>
280 </Row>
281 <Row>
282 <Cell><Data ss:Type="String">floater_chat_history.xml</Data></Cell>
283 <Cell><Data ss:Type="String">/chat floater/Chat</Data></Cell>
284 <Cell><Data ss:Type="String">label</Data></Cell>
285 <Cell ss:Index="5"><Data ss:Type="String">Chat</Data></Cell>
286 <Cell ss:Index="7"><Data ss:Type="String">èŠå¤©</Data></Cell>
287 </Row>
288 <Row>
289 <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell>
290 <Cell><Data ss:Type="String">/directory/Directory Tabs/land_sales_panel/type/MainlandSales</Data></Cell>
291 <Cell ss:Index="5"><Data ss:Type="String">For Sale - Mainland</Data></Cell>
292 <Cell ss:Index="7"><Data ss:Type="String">出售 - 大陆</Data></Cell>
293 </Row>
294 <Row>
295 <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell>
296 <Cell><Data ss:Type="String">/directory/Directory Tabs/land_sales_panel/type/EstateSales</Data></Cell>
297 <Cell ss:Index="5"><Data ss:Type="String">For Sale - Estate</Data></Cell>
298 <Cell ss:Index="7"><Data ss:Type="String">出售 - 土地</Data></Cell>
299 </Row>
300 <Row>
301 <Cell><Data ss:Type="String">floater_friends.xml</Data></Cell>
302 <Cell><Data ss:Type="String">/friends/friend_list</Data></Cell>
303 <Cell><Data ss:Type="String">tool_tip</Data></Cell>
304 <Cell ss:Index="5"><Data ss:Type="String">Hold shift or control while clicking to select multiple friends</Data></Cell>
305 <Cell ss:Index="7"><Data ss:Type="String">当点击选择多ä½å¥½å‹æ—¶ï¼ŒæŒ‰ä½shift键或者controlé”®</Data></Cell>
306 </Row>
307 <Row>
308 <Cell><Data ss:Type="String">floater_friends.xml</Data></Cell>
309 <Cell><Data ss:Type="String">/friends/friend_list/friend_name</Data></Cell>
310 <Cell><Data ss:Type="String">label</Data></Cell>
311 <Cell ss:Index="5"><Data ss:Type="String">Name</Data></Cell>
312 <Cell ss:Index="7"><Data ss:Type="String">åå­—</Data></Cell>
313 </Row>
314 <Row>
315 <Cell><Data ss:Type="String">floater_friends.xml</Data></Cell>
316 <Cell><Data ss:Type="String">/friends/rights_container/friend_name_label</Data></Cell>
317 <Cell ss:Index="5"><Data ss:Type="String">Select friend(s) to change rights...</Data></Cell>
318 <Cell ss:Index="7"><Data ss:Type="String">é€‰æ‹©å˜æ›´æƒåˆ©çš„æœ‹å‹...</Data></Cell>
319 </Row>
320 <Row>
321 <Cell><Data ss:Type="String">floater_friends.xml</Data></Cell>
322 <Cell><Data ss:Type="String">/friends/rights_container/online_status_cb</Data></Cell>
323 <Cell><Data ss:Type="String">label</Data></Cell>
324 <Cell ss:Index="5"><Data ss:Type="String">Can see my online status</Data></Cell>
325 <Cell ss:Index="7"><Data ss:Type="String">我的在线状æ€å¯è§</Data></Cell>
326 </Row>
327 <Row>
328 <Cell><Data ss:Type="String">floater_friends.xml</Data></Cell>
329 <Cell><Data ss:Type="String">/friends/rights_container/online_status_cb</Data></Cell>
330 <Cell><Data ss:Type="String">tool_tip</Data></Cell>
331 <Cell ss:Index="5"><Data ss:Type="String">Set whether this friend see my online status in their friends list or calling cards</Data></Cell>
332 <Cell ss:Index="7"><Data ss:Type="String">在朋å‹çš„好å‹åˆ—表或呼å«å¡ä¸­è®¾ç½®æˆ‘çš„åœ¨çº¿çŠ¶æ€æ˜¯å¦å¯¹è¯¥æœ‹å‹å¯è§</Data></Cell>
333 </Row>
334 <Row>
335 <Cell><Data ss:Type="String">floater_friends.xml</Data></Cell>
336 <Cell><Data ss:Type="String">/friends/rights_container/map_status_cb</Data></Cell>
337 <Cell><Data ss:Type="String">label</Data></Cell>
338 <Cell ss:Index="5"><Data ss:Type="String">Can see me on the map</Data></Cell>
339 <Cell ss:Index="7"><Data ss:Type="String">我在地图中的ä½ç½®å¯è§</Data></Cell>
340 </Row>
341 <Row>
342 <Cell><Data ss:Type="String">floater_friends.xml</Data></Cell>
343 <Cell><Data ss:Type="String">/friends/rights_container/map_status_cb</Data></Cell>
344 <Cell><Data ss:Type="String">tool_tip</Data></Cell>
345 <Cell ss:Index="5"><Data ss:Type="String">Set whether this friend see my location on their map</Data></Cell>
346 <Cell ss:Index="7"><Data ss:Type="String">è®¾ç½®è¯¥å¥½å‹æ˜¯å¦å¯¹æˆ‘在地图中的ä½ç½®å¯è§</Data></Cell>
347 </Row>
348 <Row>
349 <Cell><Data ss:Type="String">floater_friends.xml</Data></Cell>
350 <Cell><Data ss:Type="String">/friends/rights_container/modify_status_cb</Data></Cell>
351 <Cell><Data ss:Type="String">label</Data></Cell>
352 <Cell ss:Index="5"><Data ss:Type="String">Can modify my objects</Data></Cell>
353 <Cell ss:Index="7"><Data ss:Type="String">å¯ä»¥ä¿®æ”¹æˆ‘的东东</Data></Cell>
354 </Row>
355 <Row>
356 <Cell><Data ss:Type="String">floater_friends.xml</Data></Cell>
357 <Cell><Data ss:Type="String">/friends/rights_container/modify_status_cb</Data></Cell>
358 <Cell><Data ss:Type="String">tool_tip</Data></Cell>
359 <Cell ss:Index="5"><Data ss:Type="String">Set whether this friend can modify my objects</Data></Cell>
360 <Cell ss:Index="7"><Data ss:Type="String">è®¾ç½®è¯¥å¥½å‹æ˜¯å¦å¯ä»¥ä¿®æ”¹æˆ‘的东东</Data></Cell>
361 </Row>
362 <Row>
363 <Cell><Data ss:Type="String">floater_friends.xml</Data></Cell>
364 <Cell><Data ss:Type="String">/friends/rights_container/process_rights_label</Data></Cell>
365 <Cell ss:Index="5"><Data ss:Type="String">Processing rights change...</Data></Cell>
366 <Cell ss:Index="7"><Data ss:Type="String">æ­£åœ¨å¤„ç†æƒåŠ›å˜æ›´...</Data></Cell>
367 </Row>
368 <Row>
369 <Cell><Data ss:Type="String">floater_inspect.xml</Data></Cell>
370 <Cell><Data ss:Type="String">/inspect</Data></Cell>
371 <Cell><Data ss:Type="String">title</Data></Cell>
372 <Cell ss:Index="5"><Data ss:Type="String">Inspect Objects</Data></Cell>
373 <Cell ss:Index="7"><Data ss:Type="String">检查东东</Data></Cell>
374 </Row>
375 <Row>
376 <Cell><Data ss:Type="String">floater_inspect.xml</Data></Cell>
377 <Cell><Data ss:Type="String">/inspect/object_list</Data></Cell>
378 <Cell><Data ss:Type="String">tool_tip</Data></Cell>
379 <Cell ss:Index="5"><Data ss:Type="String">Select an object from this list to highlight it in-world</Data></Cell>
380 <Cell ss:Index="7"><Data ss:Type="String">从这份列表中选择一项东东,使它在游æˆä¸–ç•Œä¸­è¢«çªæ˜¾</Data></Cell>
381 </Row>
382 <Row>
383 <Cell><Data ss:Type="String">floater_inspect.xml</Data></Cell>
384 <Cell><Data ss:Type="String">/inspect/object_list/object_name</Data></Cell>
385 <Cell><Data ss:Type="String">label</Data></Cell>
386 <Cell ss:Index="5"><Data ss:Type="String">Object Name</Data></Cell>
387 <Cell ss:Index="7"><Data ss:Type="String">东东åç§°</Data></Cell>
388 </Row>
389 <Row>
390 <Cell><Data ss:Type="String">floater_inspect.xml</Data></Cell>
391 <Cell><Data ss:Type="String">/inspect/object_list/owner_name</Data></Cell>
392 <Cell><Data ss:Type="String">label</Data></Cell>
393 <Cell ss:Index="5"><Data ss:Type="String">Owner Name</Data></Cell>
394 <Cell ss:Index="7"><Data ss:Type="String">主人åå­—</Data></Cell>
395 </Row>
396 <Row>
397 <Cell><Data ss:Type="String">floater_inspect.xml</Data></Cell>
398 <Cell><Data ss:Type="String">/inspect/object_list/creator_name</Data></Cell>
399 <Cell><Data ss:Type="String">label</Data></Cell>
400 <Cell ss:Index="5"><Data ss:Type="String">Creator Name</Data></Cell>
401 <Cell ss:Index="7"><Data ss:Type="String">创造者åå­—</Data></Cell>
402 </Row>
403 <Row>
404 <Cell><Data ss:Type="String">floater_inspect.xml</Data></Cell>
405 <Cell><Data ss:Type="String">/inspect/object_list/creation_date</Data></Cell>
406 <Cell><Data ss:Type="String">label</Data></Cell>
407 <Cell ss:Index="5"><Data ss:Type="String">Creation Date</Data></Cell>
408 <Cell ss:Index="7"><Data ss:Type="String">创造时间</Data></Cell>
409 </Row>
410 <Row>
411 <Cell><Data ss:Type="String">floater_inspect.xml</Data></Cell>
412 <Cell><Data ss:Type="String">/inspect/button owner</Data></Cell>
413 <Cell><Data ss:Type="String">label</Data></Cell>
414 <Cell ss:Index="5"><Data ss:Type="String">See Owner Profile...</Data></Cell>
415 <Cell ss:Index="7"><Data ss:Type="String">查看主人档案...</Data></Cell>
416 </Row>
417 <Row>
418 <Cell><Data ss:Type="String">floater_inspect.xml</Data></Cell>
419 <Cell><Data ss:Type="String">/inspect/button owner</Data></Cell>
420 <Cell><Data ss:Type="String">label_selected</Data></Cell>
421 </Row>
422 <Row>
423 <Cell><Data ss:Type="String">floater_inspect.xml</Data></Cell>
424 <Cell><Data ss:Type="String">/inspect/button owner</Data></Cell>
425 <Cell><Data ss:Type="String">tool_tip</Data></Cell>
426 <Cell ss:Index="5"><Data ss:Type="String">See profile of the highlighted object's owner</Data></Cell>
427 <Cell ss:Index="7"><Data ss:Type="String">æŸ¥çœ‹è¢«çªæ˜¾çš„东东的主人åå­—</Data></Cell>
428 </Row>
429 <Row>
430 <Cell><Data ss:Type="String">floater_inspect.xml</Data></Cell>
431 <Cell><Data ss:Type="String">/inspect/button creator</Data></Cell>
432 <Cell><Data ss:Type="String">label</Data></Cell>
433 <Cell ss:Index="5"><Data ss:Type="String">See Creator Profile...</Data></Cell>
434 <Cell ss:Index="7"><Data ss:Type="String">查看创建者档案...</Data></Cell>
435 </Row>
436 <Row>
437 <Cell><Data ss:Type="String">floater_inspect.xml</Data></Cell>
438 <Cell><Data ss:Type="String">/inspect/button creator</Data></Cell>
439 <Cell><Data ss:Type="String">label_selected</Data></Cell>
440 </Row>
441 <Row>
442 <Cell><Data ss:Type="String">floater_inspect.xml</Data></Cell>
443 <Cell><Data ss:Type="String">/inspect/button creator</Data></Cell>
444 <Cell><Data ss:Type="String">tool_tip</Data></Cell>
445 <Cell ss:Index="5"><Data ss:Type="String">See profile of the highlighted object's original creator</Data></Cell>
446 <Cell ss:Index="7"><Data ss:Type="String">æŸ¥çœ‹è¢«çªæ˜¾ä¸œä¸œçš„创造者的档案</Data></Cell>
447 </Row>
448 </Table>
449 <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
450 <Print>
451 <ValidPrinterInfo/>
452 <PaperSizeIndex>9</PaperSizeIndex>
453 <HorizontalResolution>1200</HorizontalResolution>
454 <VerticalResolution>1200</VerticalResolution>
455 </Print>
456 <Selected/>
457 <Panes>
458 <Pane>
459 <Number>3</Number>
460 <ActiveRow>59</ActiveRow>
461 <ActiveCol>1</ActiveCol>
462 </Pane>
463 </Panes>
464 <ProtectObjects>False</ProtectObjects>
465 <ProtectScenarios>False</ProtectScenarios>
466 </WorksheetOptions>
467 </Worksheet>
468 <Worksheet ss:Name="Sheet2">
469 <Table ss:ExpandedColumnCount="7" ss:ExpandedRowCount="56" x:FullColumns="1"
470 x:FullRows="1" ss:DefaultColumnWidth="60" ss:DefaultRowHeight="17.25">
471 <Column ss:Width="221.25"/>
472 <Column ss:Width="1187.25"/>
473 <Column ss:Width="107.25"/>
474 <Column ss:Width="549.75"/>
475 <Column ss:Width="528"/>
476 <Column ss:Width="617.25"/>
477 <Column ss:Width="117"/>
478 <Row>
479 <Cell ss:StyleID="s21"><Data ss:Type="String">/strings</Data></Cell>
480 </Row>
481 <Row>
482 <Cell ss:StyleID="s22"><Data ss:Type="String">/string/a_file</Data></Cell>
483 <Cell ss:StyleID="s22"><Data ss:Type="String">/string/b_path</Data></Cell>
484 <Cell ss:StyleID="s22"><Data ss:Type="String">/string/c_attribute</Data></Cell>
485 <Cell ss:StyleID="s22"><Data ss:Type="String">/string/d_old</Data></Cell>
486 <Cell ss:StyleID="s22"><Data ss:Type="String">/string/e_new</Data></Cell>
487 <Cell ss:StyleID="s22"><Data ss:Type="String">/string/f_old_trans</Data></Cell>
488 <Cell ss:StyleID="s22"><Data ss:Type="String">/string/f_translation</Data></Cell>
489 </Row>
490 <Row ss:Height="51.75">
491 <Cell><Data ss:Type="String">alerts.xml</Data></Cell>
492 <Cell><Data ss:Type="String">//CannotDeedLandNoRegion/message</Data></Cell>
493 <Cell ss:Index="4" ss:StyleID="s23"><Data ss:Type="String">Unable to deed land:&#10;Cannot find the region this land is in.&#10;Please use Help -&gt; Report Bug to report this.</Data></Cell>
494 <Cell ss:StyleID="s23"><Data ss:Type="String">Unable to deed land:&#10;Cannot find the region this land is in.&#10;Please use Tools -&gt; Report Bug to report this.</Data></Cell>
495 <Cell ss:StyleID="s23"><Data ss:Type="String">无法转让土地:&#10;无法找到此土地所属的区域。&#10;请使用帮助 -&gt; æŠ¥å‘Šæ¼æ´žæ¥æŠ¥å‘Šæ­¤é¡¹é”™è¯¯ã€‚</Data></Cell>
496 </Row>
497 <Row ss:Height="51.75">
498 <Cell><Data ss:Type="String">alerts.xml</Data></Cell>
499 <Cell><Data ss:Type="String">//CannotButLandRegionNotFound/message</Data></Cell>
500 <Cell ss:Index="4" ss:StyleID="s23"><Data ss:Type="String">Unable to buy land:&#10;Cannot find the region this land is in.&#10;Please use Help -&gt; Report Bug to report this.</Data></Cell>
501 <Cell ss:StyleID="s23"><Data ss:Type="String">Unable to buy land:&#10;Cannot find the region this land is in.&#10;Please use Tools -&gt; Report Bug to report this.</Data></Cell>
502 <Cell ss:StyleID="s23"><Data ss:Type="String">无法购买土地:&#10;无法找到该土地所在区域。&#10;请使用帮助 -&gt; æŠ¥å‘Šæ¼æ´žæ¥å‘我们报告这项错误。</Data></Cell>
503 </Row>
504 <Row ss:Height="51.75">
505 <Cell><Data ss:Type="String">alerts.xml</Data></Cell>
506 <Cell><Data ss:Type="String">//CannotReleaseLandRegionNotFound/message</Data></Cell>
507 <Cell ss:Index="4" ss:StyleID="s23"><Data ss:Type="String">Unable to abandon land:&#10;Cannot find the region this land is in.&#10;Please use Help -&gt; Report Bug to report this.</Data></Cell>
508 <Cell ss:StyleID="s23"><Data ss:Type="String">Unable to abandon land:&#10;Cannot find the region this land is in.&#10;Please use Tools -&gt; Report Bug to report this.</Data></Cell>
509 <Cell ss:StyleID="s23"><Data ss:Type="String">无法放弃土地:&#10;无法找到此土地所属的区域。&#10;请使用帮助 -&gt; æŠ¥å‘Šæ¼æ´žæ¥æŠ¥å‘Šè¿™ä¸ªé”™è¯¯ã€‚</Data></Cell>
510 </Row>
511 <Row ss:Height="51.75">
512 <Cell><Data ss:Type="String">alerts.xml</Data></Cell>
513 <Cell><Data ss:Type="String">//CannotDivideLandNoRegion/message</Data></Cell>
514 <Cell ss:Index="4" ss:StyleID="s23"><Data ss:Type="String">Unable to divide land:&#10;Cannot find the region this land is in.&#10;Please use Help -&gt; Report Bug to report this.</Data></Cell>
515 <Cell ss:StyleID="s23"><Data ss:Type="String">Unable to divide land:&#10;Cannot find the region this land is in.&#10;Please use Tools -&gt; Report Bug to report this.</Data></Cell>
516 <Cell ss:StyleID="s23"><Data ss:Type="String">无法划分土地:&#10; 无法找到土地所属区域。&#10;请使用帮助 -&gt; æŠ¥å‘Šæ¼æ´žæ¥æŠ¥å‘Šæ­¤é¡¹é”™è¯¯ã€‚</Data></Cell>
517 </Row>
518 <Row ss:Height="51.75">
519 <Cell><Data ss:Type="String">alerts.xml</Data></Cell>
520 <Cell><Data ss:Type="String">//CannotJoinLandNoRegion/message</Data></Cell>
521 <Cell ss:Index="4" ss:StyleID="s23"><Data ss:Type="String">Unable to join land:&#10;Cannot find the region this land is in.&#10;Please use Help -&gt; Report Bug to report this.</Data></Cell>
522 <Cell ss:StyleID="s23"><Data ss:Type="String">Unable to join land:&#10;Cannot find the region this land is in.&#10;Please use Tools -&gt; Report Bug to report this.</Data></Cell>
523 <Cell ss:StyleID="s23"><Data ss:Type="String">无法连接土地:&#10;无法找到该土地所属的区域.&#10;请使用帮助 -&gt; æŠ¥å‘Šç¨‹åºæ¼æ´ž,让我们知é“问题所在.</Data></Cell>
524 </Row>
525 <Row ss:Height="103.5">
526 <Cell><Data ss:Type="String">alerts.xml</Data></Cell>
527 <Cell><Data ss:Type="String">//CannotSaveToAssetStore/message</Data></Cell>
528 <Cell ss:Index="4" ss:StyleID="s23"><Data ss:Type="String">Unable to save [NAME] to central asset store.&#10;This is usually a temporary failure. Please&#10;customize and save the wearable again in a&#10;few minutes. If this problem persists, please&#10;click on the 'Help | Report Bug' pull down menu&#10;and provide details about your network setup.</Data></Cell>
529 <Cell ss:StyleID="s23"><Data ss:Type="String">Unable to save [NAME] to central asset store.&#10;This is usually a temporary failure. Please&#10;customize and save the wearable again in a&#10;few minutes. If this problem persists, please&#10;click on the 'Tools | Report Bug' pull down menu&#10;and provide details about your network setup.</Data></Cell>
530 <Cell ss:StyleID="s23"><Data ss:Type="String">无法储存[NAME]至终属资产存储.&#10;这通常是暂时性功能障ç¢ã€‚请用户化åŽå†æ¬¡ä¿å­˜ã€‚&#10;如果问题ä¾ç„¶å­˜åœ¨ï¼Œè¯·ç‚¹å‡»&#10;帮助/æŠ¥å‘Šæ¼æ´žå¹¶æä¾›&#10;客户网络设置的具体信æ¯ã€‚</Data></Cell>
531 </Row>
532 <Row ss:Height="86.25">
533 <Cell><Data ss:Type="String">alerts.xml</Data></Cell>
534 <Cell><Data ss:Type="String">//AddFriend/message</Data></Cell>
535 <Cell ss:Index="4" ss:StyleID="s23"><Data ss:Type="String">Friends can track each other on the map and &#10;will receive online status updates. &#10; &#10;Offer friendship to [NAME]?</Data></Cell>
536 <Cell ss:StyleID="s23"><Data ss:Type="String">Friends can give permissions to &#10;track each other on the map and &#10;receive online status updates. &#10; &#10;Offer friendship to [NAME]?</Data></Cell>
537 <Cell ss:StyleID="s23"><Data ss:Type="String">好å‹ä»¬å¯ä»¥åœ¨åœ°å›¾ä¸Šäº’相追踪,并å¯ä»¥åœ¨çº¿æŽ¥å—æ›´æ–°ä¿¡æ¯. &#10; &#10;是å¦å‘é€å‹è°Šå¡ç»™[NAME]?</Data></Cell>
538 </Row>
539 <Row ss:Height="103.5">
540 <Cell><Data ss:Type="String">alerts.xml</Data></Cell>
541 <Cell><Data ss:Type="String">//DownloadMacMandatory/message</Data></Cell>
542 <Cell ss:Index="4" ss:StyleID="s23"><Data ss:Type="String">A new version of [SECOND_LIFE] is available.&#10;[MESSAGE]&#10; &#10;You must download this update to use the system.&#10; &#10;Download to your Applications folder?</Data></Cell>
543 <Cell ss:StyleID="s23"><Data ss:Type="String">A new version of [SECOND_LIFE] is available.&#10;[MESSAGE]&#10;&#10;You must download this update to use the system.&#10; &#10;Download to your Applications folder?</Data></Cell>
544 <Cell ss:StyleID="s23"><Data ss:Type="String">[SECOND_LIFE]有新版本å¯ç”¨ã€‚&#10;[MESSAGE]&#10; &#10;ä½ å¿…é¡»ä¸‹å†æ¬¡æ›´æ–°æ‰èƒ½è¿è¡Œç³»ç»Ÿã€‚&#10;是å¦ä¸‹è½½æ›´æ–°è‡³åº”用软件文件夹?</Data></Cell>
545 </Row>
546 <Row ss:Height="155.25">
547 <Cell><Data ss:Type="String">alerts.xml</Data></Cell>
548 <Cell><Data ss:Type="String">//AddClassified/message</Data></Cell>
549 <Cell ss:Index="4" ss:StyleID="s23"><Data ss:Type="String">Classified ads appear in the 'Classified' section of the&#10;Search directory for one week.&#10; &#10;Fill out your ad, then click 'Publish...' to add it to the&#10;directory.&#10; &#10;You'll be asked for a price to pay when clicking Publish.&#10;Paying more makes your ad appear higher in the list, and&#10;also appear higher when people search for keywords.</Data></Cell>
550 <Cell ss:StyleID="s23"><Data ss:Type="String">Classified ads appear in the 'Classified' section of the&#10;Find directory for one week.&#10; &#10;Fill out your ad, then click 'Publish...' to add it to the&#10;directory.&#10; &#10;You'll be asked for a price to pay when clicking Publish.&#10;Paying more makes your ad appear higher in the list, and&#10;also appear higher when people search for keywords.</Data></Cell>
551 <Cell ss:StyleID="s23"><Data ss:Type="String">分类广告会在查找å录的'Classified'æ ç›®é‡Œä¿ç•™ä¸€å‘¨æ—¶é—´ã€‚&#10;&#10; &#10;填写你的广告,ç„¶åŽç‚¹å‡»'å‘布...',既添加广告至广告å录中。&#10;当点击å‘å¸ƒæ—¶ï¼Œä½ å°†è¢«è¦æ±‚支付å‘布广告费用. 大颿”¯ä»˜æ„味ç€ä½ çš„广告会在åå•较å‰çš„åœ°æ–¹å‡ºçŽ°ï¼Œå¹¶ä¸”å½“ç”¨å…³é”®è¯æŸ¥æ‰¾æ—¶ï¼Œä½ çš„广告也出现在查询结果较高的ä½ç½®ä¸Šã€‚</Data></Cell>
552 </Row>
553 <Row>
554 <Cell><Data ss:Type="String">alerts.xml</Data></Cell>
555 <Cell><Data ss:Type="String">//HelpEstateExternallyVisible</Data></Cell>
556 <Cell><Data ss:Type="String">title</Data></Cell>
557 <Cell><Data ss:Type="String">Visible From Mainland</Data></Cell>
558 <Cell><Data ss:Type="String">Public Access</Data></Cell>
559 <Cell><Data ss:Type="String">从大陆å¯è§†</Data></Cell>
560 </Row>
561 <Row ss:Height="69">
562 <Cell><Data ss:Type="String">alerts.xml</Data></Cell>
563 <Cell><Data ss:Type="String">//HelpEstateExternallyVisible/message</Data></Cell>
564 <Cell ss:Index="4" ss:StyleID="s23"><Data ss:Type="String">Sets whether residents who are in the Linden owned 'mainland' &#10;estates can see your estate on the world map. &#10; &#10;Default: on</Data></Cell>
565 <Cell ss:StyleID="s23"><Data ss:Type="String">Sets whether residents who are on other estates can enter this&#10; estate without being on an access list.&#10; &#10;Default: on</Data></Cell>
566 <Cell ss:StyleID="s23"><Data ss:Type="String">设置在林登所拥有的'大陆'领地内的居民 &#10;是å¦èƒ½ä»Žåœ°å›¾ä¸Šçœ‹åˆ°ä½ çš„领地。 &#10; &#10;默认:å¯ä»¥</Data></Cell>
567 </Row>
568 <Row ss:Height="155.25">
569 <Cell><Data ss:Type="String">alerts.xml</Data></Cell>
570 <Cell><Data ss:Type="String">//HelpReportBug/message</Data></Cell>
571 <Cell ss:Index="4" ss:StyleID="s23"><Data ss:Type="String">Use this tool to report technical features that do not perform &#10;as described or expected. All bug reports are investigated and &#10;resolved. No email response will be sent, you may reply to the &#10;auto-response email to add more details to your report. &#10;If you are having a technical difficulty, please contact Support at: &#10; &#10;http://secondlife.com/community/support.php</Data></Cell>
572 <Cell ss:StyleID="s23"><Data ss:Type="String">Use this tool to *only* report technical features that do not perform as &#10;described or expected, please provide as much detail as possible, You &#10;may reply to the auto-response email to add more details to your report.&#10;All bug reports are investigated and assessed. No email response will be sent.&#10;-&#10;If you are having a technical difficulty, please contact Support at: &#10;http://secondlife.com/community/support.php&#10;-&#10;Note: Incomplete reports will not be investigated</Data></Cell>
573 <Cell ss:StyleID="s23"><Data ss:Type="String">使用这个工具报告系统中没有æè¿°è¿‡çš„æ„å¤–çŠ¶æ€ã€‚所有的缺陷报告都会被调查并解决。我们ä¸ä¼šå‘电å­é‚®ä»¶å›žå¤ï¼Œä½†æ˜¯ä½ ä»¬å¯ä»¥åœ¨å›žå¤ç³»ç»Ÿè‡ªåЍå‘出的回å¤é‚®ä»¶ä¸­åŠ ä¸Šå¯¹ä½ çš„æŠ¥å‘Šçš„æ›´å¤šç»†èŠ‚æè¿°ã€‚如果你有技术困难,请跟我们的支æŒä¸­å¿ƒè”系:&#10; &#10;http://secondlife.com/community/support.php</Data></Cell>
574 </Row>
575 <Row ss:Height="207">
576 <Cell><Data ss:Type="String">floater_about.xml</Data></Cell>
577 <Cell><Data ss:Type="String">/floater_about/credits_editor</Data></Cell>
578 <Cell ss:Index="4" ss:StyleID="s23"><Data ss:Type="String">Second Life is brought to you by Philip, Andrew, Tessa, Cory, Frank, James, Doug, Hunter, Richard, John, Eric, Avi, AaronB, AaronY, Ian, Peter, Mark, Robin, Stephen, Tracy, Ryan, Alberto, Haney, Tanya, JimJ, Dan, Ben, Stephanie, Tim, Evan, Catherine, Colin, Chris, Reuben, Charity, Jeska, James, JonHenry, Kelly, Callum, Char, Daniel, DavidF, Don, Jeff, Lauren, Lee, Michael, Ramzi, Vektor, Steve, TomY, Tess, Kona, Brent, Clarissa, PeterP, Jesse, Annette, Cyn, Blue, Ginsu, Jonathan, Karen, Adam, Nova, Deana, Lizzie, Patsy, DavidK, Isaac, Pathfinder, Monroe, Jill, Benny, Altruima, Rheya, Jennifer, Jack, DaveP, Brad, Mick, Babbage, Elisabeth, Brian, Beth, Data, Ethan, Wendy, Nicole, Sky, Jeffrey, Zero, Coffee, Tesla, Kenny, Makiko, Nigel, Teeple, Lucy, Mia, Dee, Guy, Harry, Liana, Branka, Jimbo, Aura, Vasuda, SarahD, bethanye, Torley, Runitai, MikeS, PaulM, Milo, Hermia, JoeM, Melanie, Rejean, DSmith, SMiller, Susan, Jose, DongYun, Justin, Andrey, Syrah, Donovan, Henrik, Nora, Lexie, AC, Donna, ChrisC, Alex, Leyla, Kyle, Mathew, Devin, Joshua, DanC, Jessica, Harmony, Claudia, Tramel, Glenn, Betsy, Fritz, Jun, Adam, Cassandra, Ken, RyanW and many others.&#10;&#10;Thank you to the following residents for helping to ensure that this is the best version yet: Kyrah Abattoir, Icesis Anansi, Clifton Antonelli, Nargus Asturias, Justizin Austinmer, Drake Bacon, Bitzer Balderdash, McWheelie Baldwin, SuezanneC Baskerville, Sweetheart Baskerville, Logan Bauer, Malarthi Behemoth, phoenix Behemoth, Eva Bellambi, Samgame Bertrand, Woody Blair, Tin Bling, Bibi Book, Barney Boomslang, Eric Boyer, Chromal Brodsky, Kerian Bunin, Lara Bunin, BigRick Byrd, Jillian Callahan, Hypatia Callisto, Frans Charming, nathalie Christensen, Francis Chung, pizzaguy Clutterbuck, Evo Commons, Entity Cosmo, Grazel Cosmo, Tiger Crossing, Fremont Cunningham, Jaki Daligdig, Sugar Darling, Todd David, Norman Desmoulins, Gxeremio Dimsum, Happy Dimsum, Kim Dingo, Roy Domela, Cory Edo, Delu Elytis, DBDigital Epsilon, Leeza Everett, Garth FairChang, Snowflake Fairymeadow, Khamon Fate, lex Fitzcarraldo, Kitto Flora, Angel Fluffy, CrystalShard Foo, Raudf Fox, Govindira Galatea, Rizpah Galatea, Tre Giles, Gattz Gilman, Kex Godel, Armandi Goodliffe, Tsu Goodliffe, Nickolas Goodman, Damen Gorilla, Nytemyst Grace, Mhaijik Guillaume, Gleeb Gupte, Ebonfire Harbinger, Bethanee Heaney, Jenny Hicks, Sandling Honey, Victoria Jacques, Adso Krogstad, Travis Lambert, simon Lameth, Duffy Langdon, Aaron Levy, Jade Lily, Gwyneth Llewelyn, Lola Lollipop, Michi Lumin, KaiLastOfTheBrunnenG Macdonald, Jesse Malthus, Herry Maltz, Seth Mandelbrot, Raavi Mann, Shirley Marquez, Dnate Mars, Ima Mechanique, Hawk Mendicant, Mercury Metropolitan, Haravikk Mistral, Trent Mondrian, Nexus Nash, Seraph Nephilim, Lewis Nerd, Aurael Neurocam, Lex Neva, Prokofy Neva, Seagel Neville, Kate Nicholas, Didde Nielsen, Richard Noonan, crevan Nori, Maczter Oddfellow, vanler Odets, Fat Ogre, Hamncheese Omlet, Strife Onizuka, Panthar Orlowski, Jessica Ornitz, Ron Overdrive, OmniCron Overlord, Dargon Pacer, Kar Parks, Eloise Pasteur, Caliandris Pendragon, Julianna Pennyfeather, Iron Perth, Shawk Pertwee, Mera Pixel, Elle Pollack, Phoenix Psaltery, Hank Ramos, Jon Ree, Tam Ree, Zi Ree, Jon Rolland, BamBam Sachertorte, kai Sachertorte, Mily Sartre, ice Semple, Desmond Shang, DigiKatt Shaw, Felix Sholokhov, Rhyph Somme, Rain Soothsayer, Oz Spade, squeekachu Spearmann, Wesley Spengler, Belaya Statosky, eltee Statosky, Khashai Steinbeck, Draco Steinhardt, Hope Stilman, Ashen Stygian, Seifert Surface, Gigs Taggart, Dolmere Talamasca, JayJay Talamasca, Becky Tardis, Fenris Tardis, Cubey Terra, Osprey Therian, Millie Thompson, John Toonie, Charlene Trudeau, Lyr Tuppakaka, Indy Turner, Luthien Unsung, Random Unsung, Huns Valen, Valdemar Virgo, Gordon Wendt, Mike Westerburg, Wayfinder Wishbringer, Lee Wormser, Aimee Xia, nimrod Yaffle, Yiffy Yaffle, Elle74 Zaftig and many others.&#10;&#10;&#10;APR Copyright (C) 2000-2004 The Apache Software Foundation&#10;Cg Copyright (C) 2002, NVIDIA Corporationa.&#10;cURL Copyright (C) 1996-2002, Daniel Stenberg, (daniel@haxx.se)&#10;expat Copyright (C) 1998, 1999, 2000 Thai Open Source Software Center Ltd.&#10;FreeType Copyright (C) 1996-2002, The FreeType Project (www.freetype.org).&#10;GL Copyright (C) 1999-2004 Brian Paul.&#10;Havok.com(TM) Copyright (C) 1999-2001, Telekinesys Research Limited.&#10;jpeg2000 Copyright (C) 2001, David Taubman, The University of New South Wales (UNSW)&#10;jpeglib Copyright (C) 1991-1998, Thomas G. Lane.&#10;ogg/vorbis Copyright (C) 2001, Xiphophorus&#10;OpenSSL Copyright (C) 1998-2002 The OpenSSL Project.&#10;SDL Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga&#10;SSLeay Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)&#10;xmlrpc-epi Copyright (C) 2000 Epinions, Inc.&#10;zlib Copyright (C) 1995-2002 Jean-loup Gailly and Mark Adler.&#10;&#10;All rights reserved. See licenses.txt for details.&#10;&#10;&#10;It's not a glitch, it's a feature.</Data></Cell>
579 <Cell ss:StyleID="s23"><Data ss:Type="String">Second Life is brought to you by Philip, Andrew, Tessa, Cory, Frank, James, Doug, Hunter, Richard, John, Eric, Avi, AaronB, AaronY, Ian, Peter, Mark, Robin, Stephen, Tracy, Ryan, Alberto, Haney, Tanya, JimJ, Dan, Ben, Stephanie, Tim, Evan, Catherine, Colin, Chris, Reuben, Charity, Jeska, James, JonHenry, Kelly, Callum, Char, Daniel, DavidF, Don, Jeff, Lauren, Lee, Michael, Ramzi, Vektor, Steve, TomY, Tess, Kona, Brent, Clarissa, PeterP, Jesse, Annette, Cyn, Blue, Ginsu, Jonathan, Karen, Adam, Nova, Deana, Lizzie, Patsy, DavidK, Isaac, Pathfinder, Monroe, Jill, Benny, Altruima, Rheya, Jennifer, Jack, DaveP, Brad, Mick, Babbage, Elisabeth, Brian, Beth, Data, Ethan, Wendy, Nicole, Sky, Jeffrey, Zero, Coffee, Tesla, Kenny, Makiko, Nigel, Teeple, Lucy, Mia, Dee, Guy, Harry, Liana, Branka, Jimbo, Aura, Vasuda, SarahD, bethanye, Torley, Runitai, MikeS, PaulM, Milo, Hermia, JoeM, Melanie, Rejean, DSmith, SMiller, Susan, Jose, DongYun, Justin, Andrey, Syrah, Donovan, Henrik, Nora, Lexie, AC, Donna, ChrisC, Alex, Leyla, Kyle, Mathew, Devin, Joshua, DanC, Jessica, Harmony, Claudia, Tramel, Glenn, Betsy, Fritz, Jun, Adam, Cassandra, Ken, RyanW, Spike, Varas, Andy, Luke, RobLa, Chiyo, JohnZ, Dustin, George, Del, PeterP, Migyeong, Matthew, RMullane, CChampion, JTurbin, JamesC, Viola, Lightfoot, Jacqui, Sturm, Adrian, Buttercup, Alfred, Sunil, Alfred, Noel, Irfan, JillS, Yool, Jane and many others.&#10;&#10;Thank you to the following residents for helping to ensure that this is the best version yet: Atte Aderdeen, Alise Altman, Doomby Arrow, Rox Arten, Jesse Barnett, Smiley Barry, SuezanneC Baskerville, Glitch Braess, Dorian Caldwell, JuiceBox132 Castro, Aden Christensen, Fremont Cunningham, Zirnitra Demar, Errafel Eccleston, Cory Edo, Kitto Flora, Ashrilyn Hayashida, Elektra Hesse, Friar Jeffries, Samuel Jordan, DeLisa Junot, Howie Lament, Candide LeMay, Michi Lumin, Ikani Mahana, SignpostMarv Martin, Ksathra Mason, Console Mission, Haravikk Mistral, Usagi Musashi, Lex Neva, Jamma Newt, Blaze Nielsen, Destiny Niles, Tateru Nino, Harald Nomad, Nerk Noonan, Stumbelina Ophelia, Fledhyris Proudhon, Londyn Reatequi, Zi Ree, Hank Rucker, BamBam Sachertorte, kai Sachertorte, Sean Sao, Funk Schnook, Magnum Serpentine, Nekosune Smails, Rhyph Somme, Al Sonic, Oz Spade, Wesley Spengler, Steve Steed, Gearsawe Stonecutter, Dirk Talamasca, Dolmere Talamasca, John Taylor, Raymond Tuxing, Churchill Tweak, Huns Valen, windozer Vargas, Sabby Whiplash, Raven Wombat, Beatfox Xevious, Yiffy Yaffle, Alpha Zaius, Hewee Zetkin, Jai Zucker and many others.&#10;&#10;&#10;APR Copyright (C) 2000-2004 The Apache Software Foundation&#10;Cg Copyright (C) 2002, NVIDIA Corporationa.&#10;cURL Copyright (C) 1996-2002, Daniel Stenberg, (daniel@haxx.se)&#10;expat Copyright (C) 1998, 1999, 2000 Thai Open Source Software Center Ltd.&#10;FreeType Copyright (C) 1996-2002, The FreeType Project (www.freetype.org).&#10;GL Copyright (C) 1999-2004 Brian Paul.&#10;Havok.com(TM) Copyright (C) 1999-2001, Telekinesys Research Limited.&#10;jpeg2000 Copyright (C) 2001, David Taubman, The University of New South Wales (UNSW)&#10;jpeglib Copyright (C) 1991-1998, Thomas G. Lane.&#10;ogg/vorbis Copyright (C) 2001, Xiphophorus&#10;OpenSSL Copyright (C) 1998-2002 The OpenSSL Project.&#10;SDL Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga&#10;SSLeay Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)&#10;xmlrpc-epi Copyright (C) 2000 Epinions, Inc.&#10;zlib Copyright (C) 1995-2002 Jean-loup Gailly and Mark Adler.&#10;&#10;All rights reserved. See licenses.txt for details.&#10;&#10;&#10;Don't hassle the hoff.</Data></Cell>
580 <Cell ss:StyleID="s23"><Data ss:Type="String">第二人生的推出应感谢以下人物的贡献: Philip, Andrew, Tessa, Cory, Frank, James, Doug, Hunter, Richard, John, Eric, Avi, AaronB, AaronY, Ian, Peter, Mark, Robin, Stephen, Tracy, Ryan, Alberto, Haney, Tanya, JimJ, Dan, Ben, Stephanie, Tim, Evan, Catherine, Colin, Chris, Reuben, Charity, Jeska, James, JonHenry, Kelly, Callum, Char, Daniel, DavidF, Don, Jeff, Lauren, Lee, Michael, Ramzi, Vektor, Steve, TomY, Tess, Kona, Brent, Clarissa, PeterP, Jesse, Annette, Cyn, Blue, Ginsu, Jonathan, Karen, Adam, Nova, Deana, Lizzie, Patsy, DavidK, Isaac, Pathfinder, Monroe, Jill, Benny, Altruima, Rheya, Jennifer, Jack, DaveP, Brad, Mick, Babbage, Elisabeth, Brian, Beth, Data, Ethan, Wendy, Nicole, Sky, Jeffrey, Zero, Coffee, Tesla, Kenny, Makiko, Nigel, Teeple, Lucy, Mia, Dee, Guy, Harry, Liana, Branka, Jimbo, Aura, Vasuda, SarahD, bethanye, Torley, Runitai, MikeS, PaulM, Milo, Hermia, JoeM, Melanie, Rejean, DSmith, SMiller, Susan, Jose, DongYun, Justin, Andrey, Syrah, Donovan, Henrik, Nora, Lexie, AC, Donna, ChrisC, Alex, Leyla, Kyle, Mathew, Devin, Joshua, DanC, Jessica, Harmony, Claudia, Tramel, Glenn, Betsy, Fritz, Jun, Adam, Cassandra, Ken, RyanW and many others.&#10;&#10;感谢以下居民,他们的帮助ä¿è¯äº†è¿™æ¬¡ç¬¬äºŒäººç”Ÿçš„版本是有å²ä»¥æ¥æœ€å‡ºè‰²çš„: Kyrah Abattoir, Icesis Anansi, Clifton Antonelli, Nargus Asturias, Justizin Austinmer, Drake Bacon, Bitzer Balderdash, McWheelie Baldwin, SuezanneC Baskerville, Sweetheart Baskerville, Logan Bauer, Malarthi Behemoth, phoenix Behemoth, Eva Bellambi, Samgame Bertrand, Woody Blair, Tin Bling, Bibi Book, Barney Boomslang, Eric Boyer, Chromal Brodsky, Kerian Bunin, Lara Bunin, BigRick Byrd, Jillian Callahan, Hypatia Callisto, Frans Charming, nathalie Christensen, Francis Chung, pizzaguy Clutterbuck, Evo Commons, Entity Cosmo, Grazel Cosmo, Tiger Crossing, Fremont Cunningham, Jaki Daligdig, Sugar Darling, Todd David, Norman Desmoulins, Gxeremio Dimsum, Happy Dimsum, Kim Dingo, Roy Domela, Cory Edo, Delu Elytis, DBDigital Epsilon, Leeza Everett, Garth FairChang, Snowflake Fairymeadow, Khamon Fate, lex Fitzcarraldo, Kitto Flora, Angel Fluffy, CrystalShard Foo, Raudf Fox, Govindira Galatea, Rizpah Galatea, Tre Giles, Gattz Gilman, Kex Godel, Armandi Goodliffe, Tsu Goodliffe, Nickolas Goodman, Damen Gorilla, Nytemyst Grace, Mhaijik Guillaume, Gleeb Gupte, Ebonfire Harbinger, Bethanee Heaney, Jenny Hicks, Sandling Honey, Victoria Jacques, Adso Krogstad, Travis Lambert, simon Lameth, Duffy Langdon, Aaron Levy, Jade Lily, Gwyneth Llewelyn, Lola Lollipop, Michi Lumin, KaiLastOfTheBrunnenG Macdonald, Jesse Malthus, Herry Maltz, Seth Mandelbrot, Raavi Mann, Shirley Marquez, Dnate Mars, Ima Mechanique, Hawk Mendicant, Mercury Metropolitan, Haravikk Mistral, Trent Mondrian, Nexus Nash, Seraph Nephilim, Lewis Nerd, Aurael Neurocam, Lex Neva, Prokofy Neva, Seagel Neville, Kate Nicholas, Didde Nielsen, Richard Noonan, crevan Nori, Maczter Oddfellow, vanler Odets, Fat Ogre, Hamncheese Omlet, Strife Onizuka, Panthar Orlowski, Jessica Ornitz, Ron Overdrive, OmniCron Overlord, Dargon Pacer, Kar Parks, Eloise Pasteur, Caliandris Pendragon, Julianna Pennyfeather, Iron Perth, Shawk Pertwee, Mera Pixel, Elle Pollack, Phoenix Psaltery, Hank Ramos, Jon Ree, Tam Ree, Zi Ree, Jon Rolland, BamBam Sachertorte, kai Sachertorte, Mily Sartre, ice Semple, Desmond Shang, DigiKatt Shaw, Felix Sholokhov, Rhyph Somme, Rain Soothsayer, Oz Spade, squeekachu Spearmann, Wesley Spengler, Belaya Statosky, eltee Statosky, Khashai Steinbeck, Draco Steinhardt, Hope Stilman, Ashen Stygian, Seifert Surface, Gigs Taggart, Dolmere Talamasca, JayJay Talamasca, Becky Tardis, Fenris Tardis, Cubey Terra, Osprey Therian, Millie Thompson, John Toonie, Charlene Trudeau, Lyr Tuppakaka, Indy Turner, Luthien Unsung, Random Unsung, Huns Valen, Valdemar Virgo, Gordon Wendt, Mike Westerburg, Wayfinder Wishbringer, Lee Wormser, Aimee Xia, nimrod Yaffle, Yiffy Yaffle, Elle74 Zaftig and many others.&#10;&#10;&#10;APR Copyright (C) 2000-2004 The Apache Software Foundation&#10;Cg Copyright (C) 2002, NVIDIA Corporationa.&#10;cURL Copyright (C) 1996-2002, Daniel Stenberg, (daniel@haxx.se)&#10;expat Copyright (C) 1998, 1999, 2000 Thai Open Source Software Center Ltd.&#10;FreeType Copyright (C) 1996-2002, The FreeType Project (www.freetype.org).&#10;GL Copyright (C) 1999-2004 Brian Paul.&#10;Havok.com(TM) Copyright (C) 1999-2001, Telekinesys Research Limited.&#10;jpeg2000 Copyright (C) 2001, David Taubman, The University of New South Wales (UNSW)&#10;jpeglib Copyright (C) 1991-1998, Thomas G. Lane.&#10;ogg/vorbis Copyright (C) 2001, Xiphophorus&#10;OpenSSL Copyright (C) 1998-2002 The OpenSSL Project.&#10;SDL Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga&#10;SSLeay Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)&#10;xmlrpc-epi Copyright (C) 2000 Epinions, Inc.&#10;zlib Copyright (C) 1995-2002 Jean-loup Gailly and Mark Adler.&#10;&#10;All rights reserved. 查看licenses.txt获å–细节.&#10;&#10;&#10;è¿™ä¸æ˜¯ä¸€æ¬¡æ•…障,而是一个特性.</Data></Cell>
581 </Row>
582 <Row>
583 <Cell><Data ss:Type="String">floater_about_land.xml</Data></Cell>
584 <Cell><Data ss:Type="String">/floaterland/landtab/land_options_panel/edit objects check</Data></Cell>
585 <Cell><Data ss:Type="String">label</Data></Cell>
586 <Cell><Data ss:Type="String">Create Objects</Data></Cell>
587 <Cell><Data ss:Type="String">All Residents</Data></Cell>
588 <Cell><Data ss:Type="String">创造东东</Data></Cell>
589 </Row>
590 <Row>
591 <Cell><Data ss:Type="String">floater_about_land.xml</Data></Cell>
592 <Cell><Data ss:Type="String">/floaterland/landtab/land_options_panel/check other scripts</Data></Cell>
593 <Cell><Data ss:Type="String">label</Data></Cell>
594 <Cell><Data ss:Type="String">Run Other Scripts</Data></Cell>
595 <Cell><Data ss:Type="String">All Residents</Data></Cell>
596 <Cell><Data ss:Type="String">è¿è¡Œå…¶å®ƒè„šæœ¬</Data></Cell>
597 </Row>
598 <Row>
599 <Cell><Data ss:Type="String">floater_about_land.xml</Data></Cell>
600 <Cell><Data ss:Type="String">/floaterland/landtab/land_options_panel/check group scripts</Data></Cell>
601 <Cell><Data ss:Type="String">label</Data></Cell>
602 <Cell><Data ss:Type="String">Run Group Scripts</Data></Cell>
603 <Cell><Data ss:Type="String">Group</Data></Cell>
604 <Cell><Data ss:Type="String">è¿è¡Œç¤¾å›¢è„šæœ¬</Data></Cell>
605 </Row>
606 <Row>
607 <Cell><Data ss:Type="String">floater_chat_history.xml</Data></Cell>
608 <Cell><Data ss:Type="String">/chat floater/Mute resident</Data></Cell>
609 <Cell><Data ss:Type="String">label</Data></Cell>
610 <Cell><Data ss:Type="String">Mute resident</Data></Cell>
611 <Cell><Data ss:Type="String">Mute</Data></Cell>
612 <Cell><Data ss:Type="String">å±è”½å±…æ°‘</Data></Cell>
613 </Row>
614 <Row ss:Height="34.5">
615 <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell>
616 <Cell><Data ss:Type="String">/directory/Directory Tabs/popular_panel/These are the most popular places in the world, as measured by traffic, the amount of time people spend there.</Data></Cell>
617 <Cell ss:Index="4" ss:StyleID="s23"><Data ss:Type="String">These are the most popular places in the world, as measured by traffic,&#10; the amount of time people spend there.</Data></Cell>
618 <Cell ss:StyleID="s23"><Data ss:Type="String">These are the most popular places in the world, as measured by traffic,&#10;the amount of time people spend there.</Data></Cell>
619 <Cell><Data ss:Type="String">这里有在第二人生世界里最æµè¡Œçš„场所,由交通状况,和人们在那里花费的时间长短æ¥è¡¡é‡ã€‚</Data></Cell>
620 </Row>
621 <Row>
622 <Cell><Data ss:Type="String">floater_friends.xml</Data></Cell>
623 <Cell><Data ss:Type="String">/friends/im_btn</Data></Cell>
624 <Cell><Data ss:Type="String">label</Data></Cell>
625 <Cell><Data ss:Type="String">IM...</Data></Cell>
626 <Cell><Data ss:Type="String">IM</Data></Cell>
627 <Cell><Data ss:Type="String">峿—¶é€š...</Data></Cell>
628 </Row>
629 <Row>
630 <Cell><Data ss:Type="String">floater_friends.xml</Data></Cell>
631 <Cell><Data ss:Type="String">/friends/offer_teleport_btn</Data></Cell>
632 <Cell><Data ss:Type="String">label</Data></Cell>
633 <Cell><Data ss:Type="String">Offer Teleport...</Data></Cell>
634 <Cell><Data ss:Type="String">Teleport...</Data></Cell>
635 <Cell><Data ss:Type="String">æä¾›é—ªç”µä¼ é€...</Data></Cell>
636 </Row>
637 <Row>
638 <Cell><Data ss:Type="String">floater_friends.xml</Data></Cell>
639 <Cell><Data ss:Type="String">/friends/profile_btn</Data></Cell>
640 <Cell><Data ss:Type="String">label</Data></Cell>
641 <Cell><Data ss:Type="String">Profile...</Data></Cell>
642 <Cell><Data ss:Type="String">Profile</Data></Cell>
643 <Cell><Data ss:Type="String">档案...</Data></Cell>
644 </Row>
645 <Row ss:Height="155.25">
646 <Cell><Data ss:Type="String">floater_instant_message.xml</Data></Cell>
647 <Cell><Data ss:Type="String">/im_floater/live_help_dialog</Data></Cell>
648 <Cell ss:Index="4" ss:StyleID="s23"><Data ss:Type="String">*** Welcome to Live Help, where our wonderful volunteers assist their fellow Residents with Second Life! *** &#10;Please first check our SL Help Pages by pressing F1. &#10;If your answer isn't there, please enter your question to begin, then allow a few moments for available helpers to respond. &#10;Please don't close Live Help until you're finished. If you don't hear back, you can always try again later. &#10;NOTE: Live Helpers aren't Linden employees, so unless a person responding has the last name 'Linden', answers should be considered unofficial.</Data></Cell>
649 <Cell ss:StyleID="s23"><Data ss:Type="String">*** Welcome to Help Request *** &#10;Please first check our SL Help Pages by pressing F1, or by accessing the Knowledge Base http://secondlife.com/knowledgebase/ &#10;If your answer is not there, please enter your question to begin, then allow a few moments for available helpers to respond.&#10;-=-=- Response times will vary, especially during peak times -=-=-</Data></Cell>
650 <Cell ss:StyleID="s23"><Data ss:Type="String">*** 欢迎æ¥åˆ°åœ¨çº¿å¸®åŠ©ç«™,在这里,我们出色的志愿者们会å助他们的第二人生居民朋å‹ä»¬åœ¨ç¬¬äºŒäººç”Ÿé‡Œç²¾å½©çš„ç”Ÿæ´»ï¼ *** &#10;请先按F1键,进入第二人生帮助页é¢ã€‚如果你想è¦çš„答案ä¸åœ¨è¿™é‡Œï¼Œè¯·é”®å…¥ä½ çš„问题,点击开始,等候若干分钟åŽï¼Œåœ¨çº¿çš„帮助者会给你回å¤ã€‚&#10;如果您的处ç†è¿‡ç¨‹æ²¡æœ‰ç»“æŸï¼Œè¯·ä¸è¦å…³é—­åœ¨çº¿å¸®åŠ©ç«™çš„é¡µé¢ã€‚如果您没有得到回应,你å¯ä»¥ä¸€ç›´é€‰æ‹©é‡æ–°å°è¯•一é。 &#10;注æ„: åœ¨çº¿å¸®åŠ©è€…å¹¶ä¸æ˜¯æž—登实验室的雇员, 所以,除éžå›žåº”人的姓æ°ä¸º'Linden',å¦åˆ™å›žå¤éƒ½åº”è§†ä¸ºéžæ­£å¼çš„.</Data></Cell>
651 </Row>
652 <Row>
653 <Cell><Data ss:Type="String">floater_preview_notecard.xml</Data></Cell>
654 <Cell><Data ss:Type="String">/preview notecard/Notecard Editor</Data></Cell>
655 <Cell ss:Index="4"><Data ss:Type="String">Loading...</Data></Cell>
656 <Cell><Data ss:Type="String">Loading...</Data></Cell>
657 <Cell><Data ss:Type="String">请等待...</Data></Cell>
658 </Row>
659 <Row>
660 <Cell><Data ss:Type="String">floater_report_abuse.xml</Data></Cell>
661 <Cell><Data ss:Type="String">/floater_report_abuse/sim_title</Data></Cell>
662 <Cell ss:Index="4"><Data ss:Type="String">Simulator:</Data></Cell>
663 <Cell><Data ss:Type="String">Region:</Data></Cell>
664 <Cell><Data ss:Type="String">模拟器:</Data></Cell>
665 </Row>
666 <Row>
667 <Cell><Data ss:Type="String">floater_report_bug.xml</Data></Cell>
668 <Cell><Data ss:Type="String">/bug_reporter/dscr_title</Data></Cell>
669 <Cell ss:Index="4"><Data ss:Type="String">Details:</Data></Cell>
670 <Cell><Data ss:Type="String">Details: (Please provide as much information as possible)</Data></Cell>
671 <Cell><Data ss:Type="String">详细:</Data></Cell>
672 </Row>
673 <Row ss:Height="86.25">
674 <Cell><Data ss:Type="String">floater_report_bug.xml</Data></Cell>
675 <Cell><Data ss:Type="String">/bug_reporter/details_edit</Data></Cell>
676 <Cell ss:Index="4" ss:StyleID="s23"><Data ss:Type="String">Steps to reproduce the bug:&#10;&#10;Observed results:&#10;&#10;Expected results:</Data></Cell>
677 <Cell ss:StyleID="s23"><Data ss:Type="String">Steps to reproduce the bug:&#10;&#10;Observed results:&#10;&#10;Expected results:</Data></Cell>
678 <Cell ss:StyleID="s23"><Data ss:Type="String">ä¿®å¤æ¼æ´žçš„途径::&#10;&#10;观察的结果::</Data></Cell>
679 </Row>
680 <Row ss:Height="69">
681 <Cell><Data ss:Type="String">floater_report_bug.xml</Data></Cell>
682 <Cell><Data ss:Type="String">/bug_reporter/bug_aviso</Data></Cell>
683 <Cell ss:Index="4" ss:StyleID="s23"><Data ss:Type="String">If this bug allows you to do something you should not be able &#10;to do, especially if it impacts performance or security, please &#10;select the 'Exploit' category. Thank you!</Data></Cell>
684 <Cell ss:StyleID="s23"><Data ss:Type="String">Note: Incomplete reports will not be investigated&#10;If this bug allows you to do something you should not be able &#10;to do, especially if it impacts performance or security, please &#10;select the 'Exploit' category. Thank you!</Data></Cell>
685 <Cell ss:StyleID="s23"><Data ss:Type="String">如果这个缺陷å…è®¸ä½ æ‰§è¡Œä½ æ²¡æœ‰èƒ½åŠ›æ‰§è¡Œçš„åŠ¨ä½œï¼Œç‰¹åˆ«æ˜¯ä¸€äº›ä¼šå½±å“æ¸¸æˆè¡¨çŽ°å’Œå®‰å…¨æ€§èƒ½çš„æ—¶å€™ï¼Œè¯·é€‰æ‹©'å¼€å‘' 类别. éžå¸¸æ„Ÿè°¢!</Data></Cell>
686 </Row>
687 <Row>
688 <Cell><Data ss:Type="String">floater_script_ed_panel.xml</Data></Cell>
689 <Cell><Data ss:Type="String">/script panel/Script Editor</Data></Cell>
690 <Cell ss:Index="4"><Data ss:Type="String">Loading...</Data></Cell>
691 <Cell><Data ss:Type="String">Loading...</Data></Cell>
692 <Cell><Data ss:Type="String">请等待...</Data></Cell>
693 </Row>
694 <Row>
695 <Cell><Data ss:Type="String">floater_top_objects.xml</Data></Cell>
696 <Cell><Data ss:Type="String">/top_objects/id_text</Data></Cell>
697 <Cell ss:Index="4"><Data ss:Type="String">Object ID:</Data></Cell>
698 <Cell><Data ss:Type="String">Object ID:</Data></Cell>
699 <Cell><Data ss:Type="String">东东ID:</Data></Cell>
700 </Row>
701 <Row>
702 <Cell><Data ss:Type="String">floater_world_map.xml</Data></Cell>
703 <Cell><Data ss:Type="String">/worldmap/location</Data></Cell>
704 <Cell ss:Index="4"><Data ss:Type="String">Search by Region Name</Data></Cell>
705 <Cell ss:Index="6"><Data ss:Type="String">æŒ‰åœ°åŒºåæœç´¢</Data></Cell>
706 </Row>
707 <Row ss:Height="86.25">
708 <Cell><Data ss:Type="String">notify.xml</Data></Cell>
709 <Cell><Data ss:Type="String">//OfferFriendship/message</Data></Cell>
710 <Cell ss:Index="4" ss:StyleID="s23"><Data ss:Type="String">[NAME] is offering friendship.&#10; &#10;You will be able to track each other on&#10;the map and will receive online status&#10;updates.</Data></Cell>
711 <Cell ss:StyleID="s23"><Data ss:Type="String">[NAME] is offering friendship.&#10; &#10; By default, you will be able to &#10;see each other's online status.</Data></Cell>
712 <Cell ss:StyleID="s23"><Data ss:Type="String">[NAME]正在å‘é€å¥½å‹é‚€è¯·.&#10; &#10;ä½ å¯ä»¥é€šè¿‡åœ°å›¾è¿½è¸ªå½¼æ­¤ï¼Œå¹¶å°†æ”¶åˆ°å¥½å‹åœ¨çº¿çŠ¶æ€æ›´æ–°ã€‚</Data></Cell>
713 </Row>
714 <Row ss:Height="103.5">
715 <Cell><Data ss:Type="String">notify.xml</Data></Cell>
716 <Cell><Data ss:Type="String">//FirstSandbox/message</Data></Cell>
717 <Cell ss:Index="4" ss:StyleID="s23"><Data ss:Type="String">This is a sandbox region.&#10;Objects you build here may be deleted after you &#10;leave the area, and the region will be wiped &#10;every [HOURS] hours starting at [TIME] AM Pacific Time.&#10; &#10;Sandbox regions are uncommon, and are marked with signs.</Data></Cell>
718 <Cell ss:StyleID="s23"><Data ss:Type="String">This is a sandbox region.&#10;Objects you build here may be deleted after&#10;you leave the area, Sandboxes clean on a regular basis, please refer to the information at the top of the screen next to the region name.&#10; &#10;Sandbox regions are uncommon, and are marked with signs.</Data></Cell>
719 <Cell ss:StyleID="s23"><Data ss:Type="String">è¿™æ˜¯ä¸€å—æ²™ç›’区域。&#10;在这里创建的东东将在其离开这里åŽè¢«åˆ é™¤ï¼Œä¸”此区域将æ¯[HOURS]å°æ—¶æŠ¹åŽ»ä¸€æ¬¡æ‰€åˆ›å»ºä¸œä¸œï¼Œå§‹äºŽå¤ªå¹³æ´‹æ—¶é—´æ—©ä¸Š[TIME].&#10; &#10;沙盒区域并ä¸å¸¸è§, 并会有特殊标识标出。</Data></Cell>
720 </Row>
721 <Row>
722 <Cell><Data ss:Type="String">panel_avatar.xml</Data></Cell>
723 <Cell><Data ss:Type="String">/Panel Avatar/tab/2nd Life/online_yes</Data></Cell>
724 <Cell ss:Index="4"><Data ss:Type="String">Online: Yes</Data></Cell>
725 <Cell><Data ss:Type="String">Currently Online</Data></Cell>
726 <Cell><Data ss:Type="String">是å¦åœ¨çº¿: 是</Data></Cell>
727 </Row>
728 <Row>
729 <Cell><Data ss:Type="String">panel_media_remote.xml</Data></Cell>
730 <Cell><Data ss:Type="String">/music_remote/text</Data></Cell>
731 <Cell ss:Index="4"><Data ss:Type="String">Movie control</Data></Cell>
732 <Cell><Data ss:Type="String">Movies</Data></Cell>
733 <Cell><Data ss:Type="String">电影控制</Data></Cell>
734 </Row>
735 <Row>
736 <Cell><Data ss:Type="String">panel_music_remote.xml</Data></Cell>
737 <Cell><Data ss:Type="String">/music_remote/text</Data></Cell>
738 <Cell ss:Index="4"><Data ss:Type="String">Music control</Data></Cell>
739 <Cell><Data ss:Type="String">Music</Data></Cell>
740 <Cell><Data ss:Type="String">éŸ³ä¹æŽ§åˆ¶</Data></Cell>
741 </Row>
742 <Row>
743 <Cell><Data ss:Type="String">panel_preferences_chat.xml</Data></Cell>
744 <Cell><Data ss:Type="String">/chat/arrow_keys_move_avatar_check</Data></Cell>
745 <Cell><Data ss:Type="String">label</Data></Cell>
746 <Cell><Data ss:Type="String">Arrow keys move avatar when chatting</Data></Cell>
747 <Cell><Data ss:Type="String">Arrow keys always move avatar when chatting</Data></Cell>
748 <Cell><Data ss:Type="String">èŠå¤©æ—¶å¯ç”¨ç®­å¤´é”®ç§»åŠ¨ä½ çš„åŒ–èº«</Data></Cell>
749 </Row>
750 <Row>
751 <Cell><Data ss:Type="String">panel_preferences_general.xml</Data></Cell>
752 <Cell><Data ss:Type="String">/general_panel/language_combobox/Chinese</Data></Cell>
753 <Cell ss:Index="4"><Data ss:Type="String">Chinese</Data></Cell>
754 <Cell><Data ss:Type="String">Chinese - Beta</Data></Cell>
755 <Cell><Data ss:Type="String">中文</Data></Cell>
756 </Row>
757 <Row>
758 <Cell><Data ss:Type="String">panel_preferences_general.xml</Data></Cell>
759 <Cell><Data ss:Type="String">/general_panel/language_combobox/Deutsch(German)</Data></Cell>
760 <Cell ss:Index="4"><Data ss:Type="String">Deutsch (German)</Data></Cell>
761 <Cell><Data ss:Type="String">Deutsch (German) - Beta</Data></Cell>
762 <Cell><Data ss:Type="String">Deutsch (German)</Data></Cell>
763 </Row>
764 <Row>
765 <Cell><Data ss:Type="String">panel_preferences_general.xml</Data></Cell>
766 <Cell><Data ss:Type="String">/general_panel/language_combobox/(Japanese)</Data></Cell>
767 <Cell ss:Index="4"><Data ss:Type="String">日本語 (Japanese)</Data></Cell>
768 <Cell><Data ss:Type="String">日本語 (Japanese) - Beta</Data></Cell>
769 <Cell><Data ss:Type="String">日本語 (Japanese)</Data></Cell>
770 </Row>
771 <Row>
772 <Cell><Data ss:Type="String">panel_preferences_general.xml</Data></Cell>
773 <Cell><Data ss:Type="String">/general_panel/language_combobox/(Korean)</Data></Cell>
774 <Cell ss:Index="4"><Data ss:Type="String">한국어 (Korean)</Data></Cell>
775 <Cell><Data ss:Type="String">한국어 (Korean) - Beta</Data></Cell>
776 <Cell><Data ss:Type="String">한국어 (Korean)</Data></Cell>
777 </Row>
778 <Row>
779 <Cell><Data ss:Type="String">panel_preferences_im.xml</Data></Cell>
780 <Cell><Data ss:Type="String">/im</Data></Cell>
781 <Cell><Data ss:Type="String">label</Data></Cell>
782 <Cell><Data ss:Type="String">IM</Data></Cell>
783 <Cell><Data ss:Type="String">Communication</Data></Cell>
784 <Cell><Data ss:Type="String">峿—¶é€š</Data></Cell>
785 </Row>
786 <Row>
787 <Cell><Data ss:Type="String">panel_preferences_im.xml</Data></Cell>
788 <Cell><Data ss:Type="String">/im/text_box</Data></Cell>
789 <Cell ss:Index="4"><Data ss:Type="String">IM Options:</Data></Cell>
790 <Cell><Data ss:Type="String">Profile Online Status:</Data></Cell>
791 <Cell><Data ss:Type="String">峿—¶é€šé€‰é¡¹:</Data></Cell>
792 </Row>
793 <Row>
794 <Cell><Data ss:Type="String">panel_preferences_im.xml</Data></Cell>
795 <Cell><Data ss:Type="String">/im/text_box2</Data></Cell>
796 <Cell ss:Index="4"><Data ss:Type="String">Busy Mode Response:</Data></Cell>
797 <Cell><Data ss:Type="String">IM Options:</Data></Cell>
798 <Cell><Data ss:Type="String">忙碌模å¼çš„自动回å¤:</Data></Cell>
799 </Row>
800 <Row>
801 <Cell><Data ss:Type="String">panel_region_estate.xml</Data></Cell>
802 <Cell><Data ss:Type="String">/Estate/externally_visible_check</Data></Cell>
803 <Cell><Data ss:Type="String">label</Data></Cell>
804 <Cell><Data ss:Type="String">Visible From Mainland</Data></Cell>
805 <Cell><Data ss:Type="String">Public Access</Data></Cell>
806 <Cell><Data ss:Type="String">从大陆å¯è§†</Data></Cell>
807 </Row>
808 <Row>
809 <Cell><Data ss:Type="String">panel_region_texture.xml</Data></Cell>
810 <Cell><Data ss:Type="String">/Textures/detail_texture_text</Data></Cell>
811 <Cell ss:Index="4"><Data ss:Type="String">Detail Textures (requires 512x512, 24 bit .tga files)</Data></Cell>
812 <Cell><Data ss:Type="String">Terrain Textures (requires 512x512, 24 bit .tga files)</Data></Cell>
813 <Cell><Data ss:Type="String">è¯¦ç»†è´¨åœ°ï¼ˆè¦æ±‚512*512(分辨率),24bit.tga文件格å¼ã€‚</Data></Cell>
814 </Row>
815 <Row>
816 <Cell><Data ss:Type="String">panel_region_texture.xml</Data></Cell>
817 <Cell><Data ss:Type="String">/Textures/height_text_lbl5</Data></Cell>
818 <Cell ss:Index="4"><Data ss:Type="String">1 (Low)</Data></Cell>
819 <Cell><Data ss:Type="String">Texture Elevation Ranges</Data></Cell>
820 <Cell><Data ss:Type="String">1 (低)</Data></Cell>
821 </Row>
822 <Row>
823 <Cell><Data ss:Type="String">panel_region_texture.xml</Data></Cell>
824 <Cell><Data ss:Type="String">/Textures/height_text_lbl6</Data></Cell>
825 <Cell ss:Index="4"><Data ss:Type="Number">2</Data></Cell>
826 <Cell><Data ss:Type="String">Southwest</Data></Cell>
827 <Cell><Data ss:Type="Number">2</Data></Cell>
828 </Row>
829 <Row>
830 <Cell><Data ss:Type="String">panel_region_texture.xml</Data></Cell>
831 <Cell><Data ss:Type="String">/Textures/height_text_lbl7</Data></Cell>
832 <Cell ss:Index="4"><Data ss:Type="Number">3</Data></Cell>
833 <Cell><Data ss:Type="String">Northwest</Data></Cell>
834 <Cell><Data ss:Type="Number">3</Data></Cell>
835 </Row>
836 <Row>
837 <Cell><Data ss:Type="String">panel_region_texture.xml</Data></Cell>
838 <Cell><Data ss:Type="String">/Textures/height_text_lbl8</Data></Cell>
839 <Cell ss:Index="4"><Data ss:Type="String">4 (High)</Data></Cell>
840 <Cell><Data ss:Type="String">Southeast</Data></Cell>
841 <Cell><Data ss:Type="String">4 (高)</Data></Cell>
842 </Row>
843 <Row>
844 <Cell><Data ss:Type="String">panel_region_texture.xml</Data></Cell>
845 <Cell><Data ss:Type="String">/Textures/height_text_lbl9</Data></Cell>
846 <Cell ss:Index="4"><Data ss:Type="String">Texture Elevation Ranges</Data></Cell>
847 <Cell><Data ss:Type="String">Northeast</Data></Cell>
848 <Cell><Data ss:Type="String">æè´¨èŒƒå›´</Data></Cell>
849 </Row>
850 <Row>
851 <Cell><Data ss:Type="String">panel_region_texture.xml</Data></Cell>
852 <Cell><Data ss:Type="String">/Textures/height_text_lbl10</Data></Cell>
853 <Cell ss:Index="4"><Data ss:Type="String">Southwest</Data></Cell>
854 <Cell><Data ss:Type="String">These values represent the blend range for the textures above.</Data></Cell>
855 <Cell><Data ss:Type="String">西å—</Data></Cell>
856 </Row>
857 <Row>
858 <Cell><Data ss:Type="String">panel_region_texture.xml</Data></Cell>
859 <Cell><Data ss:Type="String">/Textures/height_text_lbl11</Data></Cell>
860 <Cell ss:Index="4"><Data ss:Type="String">Northwest</Data></Cell>
861 <Cell><Data ss:Type="String">Measured in meters, the LOW value is the MAXIMUM height of Texture #1,</Data></Cell>
862 <Cell><Data ss:Type="String">西北</Data></Cell>
863 </Row>
864 <Row>
865 <Cell><Data ss:Type="String">panel_region_texture.xml</Data></Cell>
866 <Cell><Data ss:Type="String">/Textures/height_text_lbl12</Data></Cell>
867 <Cell ss:Index="4"><Data ss:Type="String">Southeast</Data></Cell>
868 <Cell><Data ss:Type="String">and the HIGH value is the MINIMUM height of Texture #4.</Data></Cell>
869 <Cell><Data ss:Type="String">东å—</Data></Cell>
870 </Row>
871 <Row>
872 <Cell><Data ss:Type="String">panel_toolbar.xml</Data></Cell>
873 <Cell><Data ss:Type="String">/panel_toolbar/chat_btn</Data></Cell>
874 <Cell><Data ss:Type="String">tool_tip</Data></Cell>
875 <Cell><Data ss:Type="String">Talk to people nearby. Click Chat then History to see what has been said.</Data></Cell>
876 <Cell><Data ss:Type="String">Talk to people nearby. (Enter)</Data></Cell>
877 <Cell><Data ss:Type="String">与附近的人交谈.点击交谈之åŽç‚¹å‡»åކå²åŽ»æŸ¥æ‰¾äº¤è°ˆè®°å½•ã€‚</Data></Cell>
878 </Row>
879 </Table>
880 <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
881 <Print>
882 <ValidPrinterInfo/>
883 <PaperSizeIndex>9</PaperSizeIndex>
884 <HorizontalResolution>1200</HorizontalResolution>
885 <VerticalResolution>1200</VerticalResolution>
886 </Print>
887 <TopRowVisible>33</TopRowVisible>
888 <LeftColumnVisible>5</LeftColumnVisible>
889 <Panes>
890 <Pane>
891 <Number>3</Number>
892 <ActiveRow>46</ActiveRow>
893 <ActiveCol>5</ActiveCol>
894 </Pane>
895 </Panes>
896 <ProtectObjects>False</ProtectObjects>
897 <ProtectScenarios>False</ProtectScenarios>
898 </WorksheetOptions>
899 </Worksheet>
900 <Worksheet ss:Name="Sheet3">
901 <Table ss:ExpandedColumnCount="0" ss:ExpandedRowCount="0" x:FullColumns="1"
902 x:FullRows="1" ss:DefaultColumnWidth="60" ss:DefaultRowHeight="17.25"/>
903 <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
904 <ProtectObjects>False</ProtectObjects>
905 <ProtectScenarios>False</ProtectScenarios>
906 </WorksheetOptions>
907 </Worksheet>
908</Workbook>
diff --git a/linden/indra/newview/skins/silver/xui/en-us/floater_about_land.xml b/linden/indra/newview/skins/silver/xui/en-us/floater_about_land.xml
index d7a6540..e6034df 100644
--- a/linden/indra/newview/skins/silver/xui/en-us/floater_about_land.xml
+++ b/linden/indra/newview/skins/silver/xui/en-us/floater_about_land.xml
@@ -481,13 +481,17 @@ Go to World menu > About Land or select another parcel to show its details.
481 </text> 481 </text>
482 <check_box bottom="-40" enabled="true" follows="left|top" font="SansSerifSmall" 482 <check_box bottom="-40" enabled="true" follows="left|top" font="SansSerifSmall"
483 height="16" initial_value="false" label="Edit Terrain" left="14" 483 height="16" initial_value="false" label="Edit Terrain" left="14"
484 mouse_opaque="true" name="edit land check" radio_style="false" width="268" /> 484 mouse_opaque="true" name="edit land check" radio_style="false"
485 tool_tip="If checked, anyone can terraform your land. It is best to leave this unchecked, as you can always edit your own land."
486 width="268" />
485 <check_box bottom="-60" enabled="true" follows="left|top" font="SansSerifSmall" 487 <check_box bottom="-60" enabled="true" follows="left|top" font="SansSerifSmall"
486 height="16" initial_value="false" label="Create Landmarks" left="14" 488 height="16" initial_value="false" label="Create Landmarks" left="14"
487 mouse_opaque="true" name="check landmark" radio_style="false" width="268" /> 489 mouse_opaque="true" name="check landmark" radio_style="false" width="268" />
488 <check_box bottom="-80" enabled="true" follows="left|top" font="SansSerifSmall" 490 <check_box bottom="-80" enabled="true" follows="left|top" font="SansSerifSmall"
489 height="16" initial_value="false" label="Fly" left="14" mouse_opaque="true" 491 height="16" initial_value="false" label="Fly" left="14" mouse_opaque="true"
490 name="check fly" radio_style="false" width="268" /> 492 name="check fly" radio_style="false"
493 tool_tip="If checked, Residents can fly on your land. If unchecked, they can only fly into and over your land."
494 width="268" />
491 <text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false" 495 <text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
492 bottom="-40" drop_shadow_visible="true" enabled="true" follows="left|top" 496 bottom="-40" drop_shadow_visible="true" enabled="true" follows="left|top"
493 font="SansSerifSmall" h_pad="0" halign="left" height="16" left="178" 497 font="SansSerifSmall" h_pad="0" halign="left" height="16" left="178"
@@ -538,11 +542,13 @@ Go to World menu > About Land or select another parcel to show its details.
538 </text> 542 </text>
539 <check_box bottom="-120" enabled="true" follows="left|top" font="SansSerifSmall" 543 <check_box bottom="-120" enabled="true" follows="left|top" font="SansSerifSmall"
540 height="16" initial_value="false" label="Safe (no damage)" left="14" 544 height="16" initial_value="false" label="Safe (no damage)" left="14"
541 mouse_opaque="true" name="check safe" radio_style="false" width="268" /> 545 mouse_opaque="true" name="check safe" radio_style="false"
546 tool_tip="If checked, sets the land to Safe, disabling damage combat. If cleared, damage combat is enabled."
547 width="268" />
542 <check_box bottom="-120" enabled="true" follows="left|top" font="SansSerifSmall" 548 <check_box bottom="-120" enabled="true" follows="left|top" font="SansSerifSmall"
543 height="16" initial_value="false" label="Restrict Pushing" left="178" 549 height="16" initial_value="false" label="No Pushing" left="178"
544 mouse_opaque="true" name="PushRestrictCheck" radio_style="false" 550 mouse_opaque="true" name="PushRestrictCheck" radio_style="false"
545 tool_tip="llPushObject will only work through parcel owner scripts or on scripts where the pushee is the script owner." 551 tool_tip="Prevents scripts from pushing. Checking this option may be useful for preventing disruptive behavior on your land."
546 width="119" /> 552 width="119" />
547 <check_box bottom="-140" enabled="true" follows="left|top" font="SansSerifSmall" 553 <check_box bottom="-140" enabled="true" follows="left|top" font="SansSerifSmall"
548 height="16" initial_value="false" 554 height="16" initial_value="false"
@@ -622,7 +628,7 @@ Go to World menu > About Land or select another parcel to show its details.
622 <button bottom="-303" enabled="true" follows="left|top" font="SansSerifSmall" 628 <button bottom="-303" enabled="true" follows="left|top" font="SansSerifSmall"
623 halign="center" height="16" label="Set" label_selected="Set" left="236" 629 halign="center" height="16" label="Set" label_selected="Set" left="236"
624 mouse_opaque="true" name="Set" scale_image="true" 630 mouse_opaque="true" name="Set" scale_image="true"
625 tool_tip="Set the landing point to your avatar&apos;s location. It must be inside this land parcel." 631 tool_tip="Sets the landing point where visitors arrive. Sets to your avatar&apos;s location inside this parcel."
626 width="50" /> 632 width="50" />
627 <button bottom="-303" enabled="true" follows="left|top" font="SansSerifSmall" 633 <button bottom="-303" enabled="true" follows="left|top" font="SansSerifSmall"
628 halign="center" height="16" label="Clear" label_selected="Clear" left="291" 634 halign="center" height="16" label="Clear" label_selected="Clear" left="291"
@@ -650,10 +656,10 @@ Go to World menu > About Land or select another parcel to show its details.
650 </combo_item> 656 </combo_item>
651 </combo_box> 657 </combo_box>
652 <string name="push_restrict_text"> 658 <string name="push_restrict_text">
653 Restrict Pushing 659 No Pushing
654 </string> 660 </string>
655 <string name="push_restrict_region_text"> 661 <string name="push_restrict_region_text">
656 Restrict Pushing (Region Override) 662 No Pushing (Region Override)
657 </string> 663 </string>
658 </panel> 664 </panel>
659 <panel border="true" bottom="-349" enabled="true" follows="left|top|right|bottom" 665 <panel border="true" bottom="-349" enabled="true" follows="left|top|right|bottom"
diff --git a/linden/indra/newview/skins/silver/xui/en-us/panel_status_bar.xml b/linden/indra/newview/skins/silver/xui/en-us/panel_status_bar.xml
index 3387566..a8e0f2e 100644
--- a/linden/indra/newview/skins/silver/xui/en-us/panel_status_bar.xml
+++ b/linden/indra/newview/skins/silver/xui/en-us/panel_status_bar.xml
@@ -75,7 +75,7 @@
75 halign="center" height="18" image_selected="status_no_push.tga" 75 halign="center" height="18" image_selected="status_no_push.tga"
76 image_unselected="status_no_push.tga" label="" label_selected="" left="521" 76 image_unselected="status_no_push.tga" label="" label_selected="" left="521"
77 mouse_opaque="true" name="restrictpush" scale_image="false" 77 mouse_opaque="true" name="restrictpush" scale_image="false"
78 tool_tip="llPushObject restricted" visible="false" width="24" /> 78 tool_tip="No Pushing" visible="false" width="24" />
79 <button bottom="-22" enabled="true" follows="right|bottom" font="SansSerif" 79 <button bottom="-22" enabled="true" follows="right|bottom" font="SansSerif"
80 halign="center" height="18" image_selected="status_no_voice.tga" 80 halign="center" height="18" image_selected="status_no_voice.tga"
81 image_unselected="status_no_voice.tga" label="" label_selected="" 81 image_unselected="status_no_voice.tga" label="" label_selected=""
diff --git a/linden/indra/newview/viewer_manifest.py b/linden/indra/newview/viewer_manifest.py
index 429e564..d97befb 100755
--- a/linden/indra/newview/viewer_manifest.py
+++ b/linden/indra/newview/viewer_manifest.py
@@ -51,7 +51,6 @@ class ViewerManifest(LLManifest):
51 self.path("*.pem") 51 self.path("*.pem")
52 self.path("*.ini") 52 self.path("*.ini")
53 self.path("*.xml") 53 self.path("*.xml")
54 self.path("*.vp")
55 self.path("*.db2") 54 self.path("*.db2")
56 55
57 # include the entire shaders directory recursively 56 # include the entire shaders directory recursively
@@ -66,35 +65,35 @@ class ViewerManifest(LLManifest):
66 self.path("*.tga") 65 self.path("*.tga")
67 self.end_prefix("character") 66 self.end_prefix("character")
68 67
69
70 # Include our fonts 68 # Include our fonts
71 if self.prefix(src="fonts"): 69 if self.prefix(src="fonts"):
72 self.path("*.ttf") 70 self.path("*.ttf")
73 self.path("*.txt") 71 self.path("*.txt")
74 self.end_prefix("fonts") 72 self.end_prefix("fonts")
75 73
76 # skins 74 # skins
77 if self.prefix(src="skins"): 75 if self.prefix(src="skins"):
78 self.path("paths.xml") 76 self.path("paths.xml")
79 # include the entire textures directory recursively 77 # include the entire textures directory recursively
80 if self.prefix(src="*/textures"): 78 if self.prefix(src="*/textures"):
81 self.path("*.tga") 79 self.path("*.tga")
82 self.path("*.j2c") 80 self.path("*.j2c")
83 self.path("*.jpg") 81 self.path("*.jpg")
84 self.path("*.png") 82 self.path("*.png")
85 self.path("textures.xml") 83 self.path("textures.xml")
86 self.end_prefix("*/textures") 84 self.end_prefix("*/textures")
87 self.path("*/xui/*/*.xml") 85 self.path("*/xui/*/*.xml")
88 self.path("*/*.xml") 86 self.path("*/*.xml")
89 87
90 # Local HTML files (e.g. loading screen) 88 # Local HTML files (e.g. loading screen)
91 if self.prefix(src="*/html"): 89 if self.prefix(src="*/html"):
92 self.path("*.png") 90 self.path("*.png")
93 self.path("*/*/*.html") 91 self.path("*/*/*.html")
94 self.path("*/*/*.gif") 92 self.path("*/*/*.gif")
95 self.end_prefix("*/html") 93 self.end_prefix("*/html")
96 self.end_prefix("skins") 94 self.end_prefix("skins")
97 self.path("lsl_guide.html") 95
96 # Files in the newview/ directory
98 self.path("gpu_table.txt") 97 self.path("gpu_table.txt")
99 98
100 def login_channel(self): 99 def login_channel(self):
@@ -105,6 +104,8 @@ class ViewerManifest(LLManifest):
105 # whether or not this is present 104 # whether or not this is present
106 return self.args.get('login_channel') 105 return self.args.get('login_channel')
107 106
107 def grid(self):
108 return self.args['grid']
108 def channel(self): 109 def channel(self):
109 return self.args['channel'] 110 return self.args['channel']
110 def channel_unique(self): 111 def channel_unique(self):
@@ -117,22 +118,33 @@ class ViewerManifest(LLManifest):
117 def flags_list(self): 118 def flags_list(self):
118 """ Convenience function that returns the command-line flags 119 """ Convenience function that returns the command-line flags
119 for the grid""" 120 for the grid"""
120 channel_flags = '' 121
122 # Set command line flags relating to the target grid
121 grid_flags = '' 123 grid_flags = ''
122 if not self.default_grid(): 124 if not self.default_grid():
123 if self.default_channel(): 125 grid_flags = "--grid %(grid)s "\
124 # beta grid viewer 126 "--helperuri http://preview-%(grid)s.secondlife.com/helpers/" %\
125 channel_flags = '--settings settings_beta.xml' 127 {'grid':self.grid()}
126 grid_flags = "--grid %(grid)s --helperuri http://preview-%(grid)s.secondlife.com/helpers/" % {'grid':self.args['grid']}
127 128
128 if not self.default_channel(): 129 # set command line flags for channel
129 # some channel on some grid 130 channel_flags = ''
130 channel_flags = '--settings settings_%s.xml --channel "%s"' % (self.channel_lowerword(), self.channel()) 131 if self.login_channel() and self.login_channel() != self.channel():
131 elif self.login_channel():
132 # Report a special channel during login, but use default 132 # Report a special channel during login, but use default
133 channel_flags = '--channel "%s"' % (self.login_channel()) 133 channel_flags = '--channel "%s"' % (self.login_channel())
134 134 elif not self.default_channel():
135 return " ".join((channel_flags, grid_flags)).strip() 135 channel_flags = '--channel "%s"' % self.channel()
136
137 # Deal with settings
138 setting_flags = ''
139 if not self.default_channel() or not self.default_grid():
140 if self.default_grid():
141 setting_flags = '--settings settings_%s.xml'\
142 % self.channel_lowerword()
143 else:
144 setting_flags = '--settings settings_%s_%s.xml'\
145 % (self.grid(), self.channel_lowerword())
146
147 return " ".join((channel_flags, grid_flags, setting_flags)).strip()
136 148
137 149
138class WindowsManifest(ViewerManifest): 150class WindowsManifest(ViewerManifest):
@@ -153,10 +165,7 @@ class WindowsManifest(ViewerManifest):
153 self.path(self.find_existing_file('debug/secondlife-bin.exe', 'release/secondlife-bin.exe', 'relwithdebinfo/secondlife-bin.exe'), dst=self.final_exe()) 165 self.path(self.find_existing_file('debug/secondlife-bin.exe', 'release/secondlife-bin.exe', 'relwithdebinfo/secondlife-bin.exe'), dst=self.final_exe())
154 # need to get the kdu dll from any of the build directories as well 166 # need to get the kdu dll from any of the build directories as well
155 self.path(self.find_existing_file( 167 self.path(self.find_existing_file(
156 # *FIX:Mani we need to add support for packaging specific targets. 168 '../llkdu/%s/llkdu.dll' % self.args['configuration'],
157 #'../llkdu/debug/llkdu.dll',
158 '../llkdu/release/llkdu.dll',
159 '../llkdu/relwithdebinfo/llkdu.dll',
160 '../../libraries/i686-win32/lib/release/llkdu.dll'), 169 '../../libraries/i686-win32/lib/release/llkdu.dll'),
161 dst='llkdu.dll') 170 dst='llkdu.dll')
162 self.path(src="licenses-win32.txt", dst="licenses.txt") 171 self.path(src="licenses-win32.txt", dst="licenses.txt")
@@ -174,9 +183,19 @@ class WindowsManifest(ViewerManifest):
174 self.path("openjpeg.dll") 183 self.path("openjpeg.dll")
175 self.end_prefix() 184 self.end_prefix()
176 185
177 # Mozilla appears to force a dependency on these files so we need to ship it (CP) 186 # Mozilla appears to force a dependency on these files so we need to ship it (CP) - updated to vc8 versions (nyx)
178 self.path("msvcr71.dll") 187 # These need to be installed as a SxS assembly, currently a 'private' assembly.
179 self.path("msvcp71.dll") 188 # See http://msdn.microsoft.com/en-us/library/ms235291(VS.80).aspx
189 if self.prefix(src=self.args['configuration'], dst=""):
190 if self.args['configuration'] == 'Debug':
191 self.path("msvcr80d.dll")
192 self.path("msvcp80d.dll")
193 self.path("Microsoft.VC80.DebugCRT.manifest")
194 else:
195 self.path("msvcr80.dll")
196 self.path("msvcp80.dll")
197 self.path("Microsoft.VC80.CRT.manifest")
198 self.end_prefix()
180 199
181 # Mozilla runtime DLLs (CP) 200 # Mozilla runtime DLLs (CP)
182 if self.prefix(src="../../libraries/i686-win32/lib/release", dst=""): 201 if self.prefix(src="../../libraries/i686-win32/lib/release", dst=""):
@@ -205,6 +224,11 @@ class WindowsManifest(ViewerManifest):
205 self.path("res/*/*") 224 self.path("res/*/*")
206 self.end_prefix() 225 self.end_prefix()
207 226
227 # Mozilla hack to get it to accept newer versions of msvc*80.dll than are listed in manifest
228 # necessary as llmozlib2-vc80.lib refers to an old version of msvc*80.dll - can be removed when new version of llmozlib is built - Nyx
229 # The config file name needs to match the exe's name.
230 self.path("SecondLife.exe.config", dst=self.final_exe() + ".config")
231
208 # Vivox runtimes 232 # Vivox runtimes
209 if self.prefix(src="vivox-runtime/i686-win32", dst=""): 233 if self.prefix(src="vivox-runtime/i686-win32", dst=""):
210 self.path("SLVoice.exe") 234 self.path("SLVoice.exe")
@@ -348,7 +372,7 @@ class WindowsManifest(ViewerManifest):
348 "%%INSTALL_FILES%%":self.nsi_file_commands(True), 372 "%%INSTALL_FILES%%":self.nsi_file_commands(True),
349 "%%DELETE_FILES%%":self.nsi_file_commands(False)}) 373 "%%DELETE_FILES%%":self.nsi_file_commands(False)})
350 374
351 NSIS_path = 'C:\\Program Files\\NSIS\\makensis.exe' 375 NSIS_path = 'C:\\Program Files\\NSIS\\Unicode\\makensis.exe'
352 self.run_command('"' + proper_windows_path(NSIS_path) + '" ' + self.dst_path_of(tempfile)) 376 self.run_command('"' + proper_windows_path(NSIS_path) + '" ' + self.dst_path_of(tempfile))
353 # self.remove(self.dst_path_of(tempfile)) 377 # self.remove(self.dst_path_of(tempfile))
354 self.created_path(self.dst_path_of(installer_file)) 378 self.created_path(self.dst_path_of(installer_file))
@@ -394,6 +418,7 @@ class DarwinManifest(ViewerManifest):
394 self.path("secondlife.icns") 418 self.path("secondlife.icns")
395 else: 419 else:
396 self.path("secondlife_firstlook.icns", "secondlife.icns") 420 self.path("secondlife_firstlook.icns", "secondlife.icns")
421 self.path("SecondLife.nib")
397 422
398 # Translations 423 # Translations
399 self.path("English.lproj") 424 self.path("English.lproj")
@@ -492,9 +517,6 @@ class DarwinManifest(ViewerManifest):
492 if not os.path.exists (self.src_path_of(dmg_template)): 517 if not os.path.exists (self.src_path_of(dmg_template)):
493 dmg_template = os.path.join ('installers', 'darwin', 'release-dmg') 518 dmg_template = os.path.join ('installers', 'darwin', 'release-dmg')
494 519
495 # To reinstate the linden scripting guide, add this to the list below:
496 # "lsl_guide.html":"Linden Scripting Language Guide.html",
497
498 for s,d in {self.get_dst_prefix():app_name + ".app", 520 for s,d in {self.get_dst_prefix():app_name + ".app",
499 os.path.join(dmg_template, "_VolumeIcon.icns"): ".VolumeIcon.icns", 521 os.path.join(dmg_template, "_VolumeIcon.icns"): ".VolumeIcon.icns",
500 os.path.join(dmg_template, "background.jpg"): "background.jpg", 522 os.path.join(dmg_template, "background.jpg"): "background.jpg",
diff --git a/linden/indra/test/CMakeLists.txt b/linden/indra/test/CMakeLists.txt
index 3d085a7..acb571b 100644
--- a/linden/indra/test/CMakeLists.txt
+++ b/linden/indra/test/CMakeLists.txt
@@ -41,6 +41,7 @@ set(test_SOURCE_FILES
41 lljoint_tut.cpp 41 lljoint_tut.cpp
42 llmime_tut.cpp 42 llmime_tut.cpp
43 llmessageconfig_tut.cpp 43 llmessageconfig_tut.cpp
44 llmodularmath_tut.cpp
44 llnamevalue_tut.cpp 45 llnamevalue_tut.cpp
45 llpermissions_tut.cpp 46 llpermissions_tut.cpp
46 llpipeutil.cpp 47 llpipeutil.cpp
@@ -88,6 +89,11 @@ if (NOT WINDOWS)
88 ) 89 )
89endif (NOT WINDOWS) 90endif (NOT WINDOWS)
90 91
92if (NOT DARWIN)
93 list(APPEND test_SOURCE_FILES
94 )
95endif (NOT DARWIN)
96
91set_source_files_properties(${test_HEADER_FILES} 97set_source_files_properties(${test_HEADER_FILES}
92 PROPERTIES HEADER_FILE_ONLY TRUE) 98 PROPERTIES HEADER_FILE_ONLY TRUE)
93 99
@@ -105,6 +111,7 @@ target_link_libraries(test
105 ${LLCOMMON_LIBRARIES} 111 ${LLCOMMON_LIBRARIES}
106 ${PTHREAD_LIBRARY} 112 ${PTHREAD_LIBRARY}
107 ${WINDOWS_LIBRARIES} 113 ${WINDOWS_LIBRARIES}
114 ${DL_LIBRARY}
108 ) 115 )
109 116
110if (WINDOWS) 117if (WINDOWS)
@@ -142,6 +149,7 @@ if (EXISTS /etc/debian_version_FAIL)
142 --mode=static 149 --mode=static
143 --output=${CMAKE_CURRENT_BINARY_DIR}/py_test_results.txt 150 --output=${CMAKE_CURRENT_BINARY_DIR}/py_test_results.txt
144 --touch=${CMAKE_CURRENT_BINARY_DIR}/py_tests_ok.txt 151 --touch=${CMAKE_CURRENT_BINARY_DIR}/py_tests_ok.txt
152 --mode=static
145 DEPENDS test.py 153 DEPENDS test.py
146 WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} 154 WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
147 COMMENT "Python unit tests" 155 COMMENT "Python unit tests"
diff --git a/linden/indra/test/llapp_tut.cpp b/linden/indra/test/llapp_tut.cpp
index 6efced4..650d03c 100644
--- a/linden/indra/test/llapp_tut.cpp
+++ b/linden/indra/test/llapp_tut.cpp
@@ -69,7 +69,7 @@ namespace tut
69 LLSD defaults; 69 LLSD defaults;
70 defaults["template"] = "../../../scripts/messages/message_template.msg"; 70 defaults["template"] = "../../../scripts/messages/message_template.msg";
71 defaults["configdir"] = "."; 71 defaults["configdir"] = ".";
72 defaults["db_host"] = "mysql.mitra.lindenlab.com"; 72 defaults["db_host"] = "mysql.shakti.lindenlab.com";
73 defaults["db_user"] = "linden"; 73 defaults["db_user"] = "linden";
74 defaults["db_password"] = "gomez"; 74 defaults["db_password"] = "gomez";
75 defaults["datadir"] = "data"; 75 defaults["datadir"] = "data";
diff --git a/linden/indra/test/llblowfish_tut.cpp b/linden/indra/test/llblowfish_tut.cpp
index ac40896..98deff5 100644
--- a/linden/indra/test/llblowfish_tut.cpp
+++ b/linden/indra/test/llblowfish_tut.cpp
@@ -93,7 +93,7 @@ namespace tut
93 template<> template<> 93 template<> template<>
94 void blowfish_object::test<1>() 94 void blowfish_object::test<1>()
95 { 95 {
96#if !LL_LINUX 96#if LL_WINDOWS
97 skip_fail("Blowfish only supported on Linux."); 97 skip_fail("Blowfish only supported on Linux.");
98#else 98#else
99 LLUUID blank; 99 LLUUID blank;
@@ -108,13 +108,13 @@ namespace tut
108 dst_len = cipher.requiredEncryptionSpace(8); 108 dst_len = cipher.requiredEncryptionSpace(8);
109 ensure("encryption space 8", 109 ensure("encryption space 8",
110 (dst_len == 16) ); 110 (dst_len == 16) );
111#endif // !LL_LINUX 111#endif // LL_WINDOWS
112 } 112 }
113 113
114 template<> template<> 114 template<> template<>
115 void blowfish_object::test<2>() 115 void blowfish_object::test<2>()
116 { 116 {
117#if !LL_LINUX 117#if LL_WINDOWS
118 skip_fail("Blowfish only supported on Linux."); 118 skip_fail("Blowfish only supported on Linux.");
119#else 119#else
120 LLUUID blank; 120 LLUUID blank;
@@ -130,13 +130,13 @@ namespace tut
130 result.resize(count); 130 result.resize(count);
131 131
132 ensure("encrypt null key", matchFile("blowfish.1.bin", result)); 132 ensure("encrypt null key", matchFile("blowfish.1.bin", result));
133#endif // !LL_LINUX 133#endif // LL_WINDOWS
134 } 134 }
135 135
136 template<> template<> 136 template<> template<>
137 void blowfish_object::test<3>() 137 void blowfish_object::test<3>()
138 { 138 {
139#if !LL_LINUX 139#if LL_WINDOWS
140 skip_fail("Blowfish only supported on Linux."); 140 skip_fail("Blowfish only supported on Linux.");
141#else 141#else
142 // same as base64 test id 142 // same as base64 test id
@@ -153,6 +153,6 @@ namespace tut
153 result.resize(count); 153 result.resize(count);
154 154
155 ensure("encrypt real key", matchFile("blowfish.2.bin", result)); 155 ensure("encrypt real key", matchFile("blowfish.2.bin", result));
156#endif // !LL_LINUX 156#endif // LL_WINDOWS
157 } 157 }
158} 158}
diff --git a/linden/indra/test/lliohttpserver_tut.cpp b/linden/indra/test/lliohttpserver_tut.cpp
index e450cc4..38ba787 100644
--- a/linden/indra/test/lliohttpserver_tut.cpp
+++ b/linden/indra/test/lliohttpserver_tut.cpp
@@ -191,7 +191,7 @@ namespace tut
191 "HTTP/1.0 200 OK\r\n"); 191 "HTTP/1.0 200 OK\r\n");
192 192
193 ensure_contains("web/hello content type", result, 193 ensure_contains("web/hello content type", result,
194 "Content-Type: application/xml\r\n"); 194 "Content-Type: application/llsd+xml\r\n");
195 195
196 ensure_contains("web/hello content length", result, 196 ensure_contains("web/hello content length", result,
197 "Content-Length: 36\r\n"); 197 "Content-Length: 36\r\n");
@@ -232,7 +232,7 @@ namespace tut
232 "HTTP/1.0 200 OK\r\n"); 232 "HTTP/1.0 200 OK\r\n");
233 233
234 ensure_contains("web/echo content type", result, 234 ensure_contains("web/echo content type", result,
235 "Content-Type: application/xml\r\n"); 235 "Content-Type: application/llsd+xml\r\n");
236 236
237 ensure_contains("web/echo content length", result, 237 ensure_contains("web/echo content length", result,
238 "Content-Length: 35\r\n"); 238 "Content-Length: 35\r\n");
diff --git a/linden/indra/test/llmodularmath_tut.cpp b/linden/indra/test/llmodularmath_tut.cpp
new file mode 100644
index 0000000..190ca47
--- /dev/null
+++ b/linden/indra/test/llmodularmath_tut.cpp
@@ -0,0 +1,80 @@
1/**
2 * @file modularmath_tut.cpp
3 * @author babbage
4 * @date 2008-09
5 * @brief llcircuit tests
6 *
7 * $LicenseInfo:firstyear=2007&license=viewergpl$
8 *
9 * Copyright (c) 2007-2008, Linden Research, Inc.
10 *
11 * Second Life Viewer Source Code
12 * The source code in this file ("Source Code") is provided by Linden Lab
13 * to you under the terms of the GNU General Public License, version 2.0
14 * ("GPL"), unless you have obtained a separate licensing agreement
15 * ("Other License"), formally executed by you and Linden Lab. Terms of
16 * the GPL can be found in doc/GPL-license.txt in this distribution, or
17 * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
18 *
19 * There are special exceptions to the terms and conditions of the GPL as
20 * it is applied to this Source Code. View the full text of the exception
21 * in the file doc/FLOSS-exception.txt in this software distribution, or
22 * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception
23 *
24 * By copying, modifying or distributing this software, you acknowledge
25 * that you have read and understood your obligations described above,
26 * and agree to abide by those obligations.
27 *
28 * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
29 * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
30 * COMPLETENESS OR PERFORMANCE.
31 * $/LicenseInfo$
32 */
33
34#include <tut/tut.h>
35#include "linden_common.h"
36#include "lltut.h"
37#include "llmodularmath.h"
38
39namespace tut
40{
41 struct modularmath_data
42 {
43 };
44 typedef test_group<modularmath_data> modularmath_test;
45 typedef modularmath_test::object modularmath_object;
46 tut::modularmath_test modularmath_testcase("modularmath");
47
48 template<> template<>
49 void modularmath_object::test<1>()
50 {
51 // lhs < rhs
52 const U32 lhs = 0x000001;
53 const U32 rhs = 0xFFFFFF;
54 const U32 width = 24;
55 U32 result = LLModularMath::subtract<width>(lhs, rhs);
56 ensure_equals("diff(0x000001, 0xFFFFFF, 24)", result, 2);
57 }
58
59 template<> template<>
60 void modularmath_object::test<2>()
61 {
62 // lhs > rhs
63 const U32 lhs = 0x000002;
64 const U32 rhs = 0x000001;
65 const U32 width = 24;
66 U32 result = LLModularMath::subtract<width>(lhs, rhs);
67 ensure_equals("diff(0x000002, 0x000001, 24)", result, 1);
68 }
69
70 template<> template<>
71 void modularmath_object::test<3>()
72 {
73 // lhs == rhs
74 const U32 lhs = 0xABCDEF;
75 const U32 rhs = 0xABCDEF;
76 const U32 width = 24;
77 U32 result = LLModularMath::subtract<width>(lhs, rhs);
78 ensure_equals("diff(0xABCDEF, 0xABCDEF, 24)", result, 0);
79 }
80}
diff --git a/linden/indra/test/llsd_new_tut.cpp b/linden/indra/test/llsd_new_tut.cpp
index 6c8d96a..8a24dab 100644
--- a/linden/indra/test/llsd_new_tut.cpp
+++ b/linden/indra/test/llsd_new_tut.cpp
@@ -108,7 +108,7 @@ namespace tut
108 SDCleanupCheck check; 108 SDCleanupCheck check;
109 109
110 LLSD v; 110 LLSD v;
111 111
112 v = true; ensureTypeAndValue("set true", v, true); 112 v = true; ensureTypeAndValue("set true", v, true);
113 v = false; ensureTypeAndValue("set false", v, false); 113 v = false; ensureTypeAndValue("set false", v, false);
114 v = true; ensureTypeAndValue("set true again", v, true); 114 v = true; ensureTypeAndValue("set true again", v, true);
@@ -749,6 +749,15 @@ namespace tut
749 } 749 }
750 } 750 }
751 751
752 template<> template<>
753 void SDTestObject::test<14>()
754 // make sure that assignment of char* NULL in a string does not crash.
755 {
756 LLSD v;
757 v = (const char*)NULL;
758 ensure("type is a string", v.isString());
759 }
760
752 /* TO DO: 761 /* TO DO:
753 conversion of undefined to UUID, Date, URI and Binary 762 conversion of undefined to UUID, Date, URI and Binary
754 conversion of undefined to map and array 763 conversion of undefined to map and array
diff --git a/linden/indra/test/llstring_tut.cpp b/linden/indra/test/llstring_tut.cpp
index ba6ac7c..a0fbfd1 100644
--- a/linden/indra/test/llstring_tut.cpp
+++ b/linden/indra/test/llstring_tut.cpp
@@ -344,13 +344,8 @@ namespace tut
344 str_val = "0"; 344 str_val = "0";
345 ensure("2: convertToU32 failed", LLStringUtil::convertToU32(str_val, value) && value == 0); 345 ensure("2: convertToU32 failed", LLStringUtil::convertToU32(str_val, value) && value == 0);
346 346
347#ifndef LL_DARWIN
348 str_val = "-1";
349 ensure("3: convertToU32 failed", LLStringUtil::convertToU32(str_val, value) && value == 4294967295UL);
350#endif
351
352 str_val = "4294967296"; 347 str_val = "4294967296";
353 ensure("4: convertToU32 failed", !LLStringUtil::convertToU32(str_val, value)); 348 ensure("3: convertToU32 failed", !LLStringUtil::convertToU32(str_val, value));
354 } 349 }
355 350
356 template<> template<> 351 template<> template<>
diff --git a/linden/indra/test/math.cpp b/linden/indra/test/math.cpp
index 405b8a3..dd35e21 100644
--- a/linden/indra/test/math.cpp
+++ b/linden/indra/test/math.cpp
@@ -517,6 +517,10 @@ namespace tut
517 template<> template<> 517 template<> template<>
518 void line_object::test<2>() 518 void line_object::test<2>()
519 { 519 {
520 /*
521 These tests fail intermittently on all platforms - see DEV-16600
522 Commenting this out until dev has time to investigate.
523
520 // this is a test for LLLine::nearestApproach(LLLIne) method 524 // this is a test for LLLine::nearestApproach(LLLIne) method
521 // which computes the point on a line nearest another line 525 // which computes the point on a line nearest another line
522 526
@@ -612,11 +616,13 @@ namespace tut
612 //} 616 //}
613 617
614 // test that the errors are small 618 // test that the errors are small
619
615 ensure("first line should accurately compute its closest approach", 620 ensure("first line should accurately compute its closest approach",
616 first_relative_error <= allowable_relative_error); 621 first_relative_error <= allowable_relative_error);
617 ensure("second line should accurately compute its closest approach", 622 ensure("second line should accurately compute its closest approach",
618 second_relative_error <= allowable_relative_error); 623 second_relative_error <= allowable_relative_error);
619 } 624 }
625 */
620 } 626 }
621 627
622 F32 ALMOST_PARALLEL = 0.99f; 628 F32 ALMOST_PARALLEL = 0.99f;
diff --git a/linden/indra/test/v4math_tut.cpp b/linden/indra/test/v4math_tut.cpp
index 07b4797..8169a2b 100644
--- a/linden/indra/test/v4math_tut.cpp
+++ b/linden/indra/test/v4math_tut.cpp
@@ -166,14 +166,13 @@ namespace tut
166 template<> template<> 166 template<> template<>
167 void v4math_object::test<8>() 167 void v4math_object::test<8>()
168 { 168 {
169#if LL_DEBUG && LL_WINDOWS && _MSC_VER >= 1400
170 skip_fail("This fails on VS2005 debug builds!");
171#else
172#if LL_WINDOWS && _MSC_VER < 1400
173 skip_fail("This fails on VS2003!");
174#else
175 F32 x = 10.f, y = -2.3f, z = -.023f, w = -2.0f; 169 F32 x = 10.f, y = -2.3f, z = -.023f, w = -2.0f;
176 const F32 val[10] = {1.f,2.f,3.f,.34f,.1f,-.5f,2.f,1.23f,1.234f,.89f}; 170 const F32 val[16] = {
171 1.f, 2.f, 3.f, 0.f,
172 .34f, .1f, -.5f, 0.f,
173 2.f, 1.23f, 1.234f, 0.f,
174 .89f, 0.f, 0.f, 0.f
175 };
177 LLMatrix4 mat(val); 176 LLMatrix4 mat(val);
178 LLVector4 vec4(x,y,z,w),vec4a; 177 LLVector4 vec4(x,y,z,w),vec4a;
179 vec4.rotVec(mat); 178 vec4.rotVec(mat);
@@ -187,8 +186,6 @@ namespace tut
187 vec4c.setVec(a, b, c, d); 186 vec4c.setVec(a, b, c, d);
188 vec4c.rotVec(q); 187 vec4c.rotVec(q);
189 ensure_equals("2:rotVec: Fail " ,vec4b, vec4c); 188 ensure_equals("2:rotVec: Fail " ,vec4b, vec4c);
190#endif
191#endif
192 } 189 }
193 190
194 template<> template<> 191 template<> template<>
diff --git a/linden/indra/win_crash_logger/llcrashloggerwindows.cpp b/linden/indra/win_crash_logger/llcrashloggerwindows.cpp
index 03f2394..89581f1 100644
--- a/linden/indra/win_crash_logger/llcrashloggerwindows.cpp
+++ b/linden/indra/win_crash_logger/llcrashloggerwindows.cpp
@@ -322,7 +322,7 @@ bool LLCrashLoggerWindows::mainLoop()
322 { 322 {
323 gHwndReport = CreateDialog(hInst, MAKEINTRESOURCE(IDD_PREVREPORTBOX), 0, NULL); 323 gHwndReport = CreateDialog(hInst, MAKEINTRESOURCE(IDD_PREVREPORTBOX), 0, NULL);
324 // Ignore result 324 // Ignore result
325 (void) SendDlgItemMessage(gHwndReport, IDC_CHECK_AUTO, BM_SETCHECK, 1, 0); 325 (void) SendDlgItemMessage(gHwndReport, IDC_CHECK_AUTO, BM_SETCHECK, 0, 0);
326 // Include the product name in the caption and various dialog items. 326 // Include the product name in the caption and various dialog items.
327 ProcessCaption(gHwndReport); 327 ProcessCaption(gHwndReport);
328 ProcessDlgItemText(gHwndReport, IDC_STATIC_MSG); 328 ProcessDlgItemText(gHwndReport, IDC_STATIC_MSG);
diff --git a/linden/indra/win_crash_logger/win_crash_logger.cpp b/linden/indra/win_crash_logger/win_crash_logger.cpp
index 773aa68..3056094 100644
--- a/linden/indra/win_crash_logger/win_crash_logger.cpp
+++ b/linden/indra/win_crash_logger/win_crash_logger.cpp
@@ -54,56 +54,9 @@ int APIENTRY WinMain(HINSTANCE hInstance,
54{ 54{
55 llinfos << "Starting crash reporter" << llendl; 55 llinfos << "Starting crash reporter" << llendl;
56 56
57 // In Win32, we need to generate argc and argv ourselves...
58 // Note: GetCommandLine() returns a potentially return a LPTSTR
59 // which can resolve to a LPWSTR (unicode string).
60 // (That's why it's different from lpCmdLine which is a LPSTR.)
61 // We don't currently do unicode, so call the non-unicode version
62 // directly.
63 llinfos << "Processing command line" << llendl;
64 LPSTR cmd_line_including_exe_name = GetCommandLineA();
65
66 const S32 MAX_ARGS = 100;
67 int argc = 0;
68 char *argv[MAX_ARGS];
69
70 char *token = NULL;
71 if( cmd_line_including_exe_name[0] == '\"' )
72 {
73 // Exe name is enclosed in quotes
74 token = strtok( cmd_line_including_exe_name, "\"" );
75 argv[argc++] = token;
76 token = strtok( NULL, " \t," );
77 }
78 else
79 {
80 // Exe name is not enclosed in quotes
81 token = strtok( cmd_line_including_exe_name, " \t," );
82 }
83
84 while( (token != NULL) && (argc < MAX_ARGS) )
85 {
86 argv[argc++] = token;
87 /* Get next token: */
88 if (*(token + strlen(token) + 1) == '\"')
89 {
90 token = strtok( NULL, "\"");
91 }
92 else
93 {
94 token = strtok( NULL, " \t," );
95 }
96 }
97
98 LLCrashLoggerWindows app; 57 LLCrashLoggerWindows app;
99 bool ok = app.parseCommandOptions(argc, argv);
100 if(!ok)
101 {
102 llwarns << "Unable to parse command line." << llendl;
103 }
104
105 app.setHandle(hInstance); 58 app.setHandle(hInstance);
106 ok = app.init(); 59 bool ok = app.init();
107 if(!ok) 60 if(!ok)
108 { 61 {
109 llwarns << "Unable to initialize application." << llendl; 62 llwarns << "Unable to initialize application." << llendl;
diff --git a/linden/indra/win_updater/updater.cpp b/linden/indra/win_updater/updater.cpp
index 5ea4695..bea45d1 100644
--- a/linden/indra/win_updater/updater.cpp
+++ b/linden/indra/win_updater/updater.cpp
@@ -30,7 +30,7 @@
30 */ 30 */
31 31
32// 32//
33// Usage: updater -url <url> [-name <window_title>] [-program <program_name>] [-silent] 33// Usage: updater -url <url>
34// 34//
35 35
36#include "linden_common.h" 36#include "linden_common.h"
@@ -45,9 +45,6 @@ DWORD gTotalBytes = -1;
45HWND gWindow = NULL; 45HWND gWindow = NULL;
46WCHAR gProgress[256]; 46WCHAR gProgress[256];
47char* gUpdateURL; 47char* gUpdateURL;
48char* gProgramName;
49char* gProductName;
50bool gIsSilent;
51 48
52#if _DEBUG 49#if _DEBUG
53FILE* logfile = 0; 50FILE* logfile = 0;
@@ -217,7 +214,7 @@ int WINAPI get_url_into_file(WCHAR *uri, char *path, int *cancelled)
217 fprintf(logfile,"Calling PeekMessage\n"); 214 fprintf(logfile,"Calling PeekMessage\n");
218 fflush(logfile); 215 fflush(logfile);
219#endif 216#endif
220 if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) 217 while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
221 { 218 {
222 TranslateMessage(&msg); 219 TranslateMessage(&msg);
223 DispatchMessage(&msg); 220 DispatchMessage(&msg);
@@ -279,26 +276,14 @@ int parse_args(int argc, char **argv)
279 276
280 for (j = 1; j < argc; j++) 277 for (j = 1; j < argc; j++)
281 { 278 {
282 if ((!strcmp(argv[j], "-name")) && (++j < argc)) 279 if ((!strcmp(argv[j], "-url")) && (++j < argc))
283 {
284 gProductName = argv[j];
285 }
286 else if ((!strcmp(argv[j], "-url")) && (++j < argc))
287 { 280 {
288 gUpdateURL = argv[j]; 281 gUpdateURL = argv[j];
289 } 282 }
290 else if ((!strcmp(argv[j], "-program")) && (++j < argc))
291 {
292 gProgramName = argv[j];
293 }
294 else if (!strcmp(argv[j], "-silent"))
295 {
296 gIsSilent = true;
297 }
298 } 283 }
299 284
300 // If nothing was set, let the caller know. 285 // If nothing was set, let the caller know.
301 if (!gProductName && !gProgramName && !gIsSilent && !gUpdateURL) 286 if (!gUpdateURL)
302 { 287 {
303 return 1; 288 return 1;
304 } 289 }
@@ -350,9 +335,6 @@ WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nSho
350 } 335 }
351 336
352 gUpdateURL = NULL; 337 gUpdateURL = NULL;
353 gProgramName = NULL;
354 gProductName = NULL;
355 gIsSilent = false;
356 338
357 ///////////////////////////////////////// 339 /////////////////////////////////////////
358 // 340 //
@@ -368,21 +350,10 @@ WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nSho
368 // Parse the command line arguments 350 // Parse the command line arguments
369 // 351 //
370 int parse_args_result = parse_args(argc, argv); 352 int parse_args_result = parse_args(argc, argv);
371 WCHAR window_title[2048];
372 if (gProductName)
373 {
374 mbstowcs(window_title, gProductName, 2048);
375 wcscat(window_title, L" Updater"); /* Flawfinder: ignore */
376 }
377 else
378 {
379 mbstowcs(window_title, "Second Life Updater", 2048);
380 }
381 353
382 WNDCLASSEX wndclassex = { 0 }; 354 WNDCLASSEX wndclassex = { 0 };
383 DEVMODE dev_mode = { 0 }; 355 DEVMODE dev_mode = { 0 };
384 char update_exec_path[MAX_PATH]; /* Flawfinder: ignore */ 356 char update_exec_path[MAX_PATH]; /* Flawfinder: ignore */
385 char *ptr;
386 357
387 const int WINDOW_WIDTH = 250; 358 const int WINDOW_WIDTH = 250;
388 const int WINDOW_HEIGHT = 100; 359 const int WINDOW_HEIGHT = 100;
@@ -403,7 +374,7 @@ WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nSho
403 EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &dev_mode); 374 EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &dev_mode);
404 375
405 gWindow = CreateWindowEx(NULL, win_class_name, 376 gWindow = CreateWindowEx(NULL, win_class_name,
406 window_title, 377 L"Second Life Updater",
407 WS_OVERLAPPEDWINDOW, 378 WS_OVERLAPPEDWINDOW,
408 CW_USEDEFAULT, 379 CW_USEDEFAULT,
409 CW_USEDEFAULT, 380 CW_USEDEFAULT,
@@ -437,24 +408,13 @@ WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nSho
437 L"Error", MB_OK); 408 L"Error", MB_OK);
438 return 1; 409 return 1;
439 } 410 }
440 if (0 == GetTempFileNameA(update_exec_path, NULL, 0, update_exec_path)) 411 strcat(update_exec_path, "Second_Life_Updater.exe");
441 {
442 MessageBox(gWindow, L"Problem with GetTempFileName()",
443 L"Error", MB_OK);
444 return 1;
445 }
446 // Hack hack hack
447 ptr = strrchr(update_exec_path, '.');
448 *(ptr + 1) = 'e';
449 *(ptr + 2) = 'x';
450 *(ptr + 3) = 'e';
451 *(ptr + 4) = 0;
452 412
453 WCHAR update_uri[4096]; 413 WCHAR update_uri[4096];
454 mbstowcs(update_uri, gUpdateURL, 4096); 414 mbstowcs(update_uri, gUpdateURL, 4096);
455 415
456 int success; 416 int success = 0;
457 int cancelled; 417 int cancelled = 0;
458 418
459 // Actually do the download 419 // Actually do the download
460#if _DEBUG 420#if _DEBUG
@@ -493,47 +453,24 @@ WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nSho
493 return 1; 453 return 1;
494 } 454 }
495 455
496 // Construct some parameters. 456 // TODO: Make updates silent (with /S to NSIS)
497 char params[2048]; /* Flawfinder: ignore */ 457 //char params[256]; /* Flawfinder: ignore */
498 if (gIsSilent && gProgramName) 458 //sprintf(params, "/S"); /* Flawfinder: ignore */
499 { 459 //MessageBox(gWindow,
500 _snprintf(params, sizeof(params), "/S /P=\"%s\"", gProgramName); /* Flawfinder: ignore */ 460 // L"Updating Second Life.\n\nSecond Life will automatically start once the update is complete. This may take a minute...",
501 params[2047] = '\0'; 461 // L"Download Complete",
502 } 462 // MB_OK);
503 else if (gProgramName)
504 {
505 _snprintf(params, sizeof(params), "/P=\"%s\"", gProgramName); /* Flawfinder: ignore */
506 params[2047] = '\0';
507 }
508 else if (gIsSilent)
509 {
510 sprintf(params, "/S"); /* Flawfinder: ignore */
511 }
512 else
513 {
514 params[0] = '\0';
515 }
516 463
517 if (32 >= (int) ShellExecuteA(gWindow, "open", update_exec_path, params, 464 if (32 >= (int) ShellExecuteA(gWindow, "open", update_exec_path, NULL,
518 "C:\\", SW_SHOWDEFAULT)) 465 "C:\\", SW_SHOWDEFAULT))
519 { 466 {
520 // No shit: less than or equal to 32 means failure 467 // Less than or equal to 32 means failure
521 MessageBox(gWindow, L"ShellExecute failed. Please try again later.", NULL, MB_OK); 468 MessageBox(gWindow, L"Update failed. Please try again later.", NULL, MB_OK);
522 return 1; 469 return 1;
523 } 470 }
524 471
525 if (gIsSilent && gProductName) 472 // Give installer some time to open a window
526 { 473 Sleep(1000);
527 WCHAR message[2048];
528 WCHAR wproduct[2048];
529 mbstowcs(wproduct, gProductName, 2048);
530
531 wsprintf(message,
532 L"Updating %s. %s will automatically start once the update is complete. This may take a minute...",
533 wproduct, wproduct);
534
535 MessageBox(gWindow, message, L"Download Complete", MB_OK);
536 }
537 474
538 return 0; 475 return 0;
539} 476}
diff --git a/linden/install.xml b/linden/install.xml
index 216c854..928bdd8 100644
--- a/linden/install.xml
+++ b/linden/install.xml
@@ -23,9 +23,23 @@
23 <key>linux</key> 23 <key>linux</key>
24 <map> 24 <map>
25 <key>md5sum</key> 25 <key>md5sum</key>
26 <string>85f2ed989f853beb3d6cc94413b35f1a</string> 26 <string>2ab29212a7f3acdaebf10059af816be0</string>
27 <key>url</key> 27 <key>url</key>
28 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/GL-linux-20080613.tar.bz2</uri> 28 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/GL-linux-20080812.tar.bz2</uri>
29 </map>
30 <key>linux32</key>
31 <map>
32 <key>md5sum</key>
33 <string>301c05472d5d6f3303cfa1f9e4b78660</string>
34 <key>url</key>
35 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/GL-linux-i686-gcc-4.1-20080915.tar.bz2</uri>
36 </map>
37 <key>linux64</key>
38 <map>
39 <key>md5sum</key>
40 <string>9c3dff3817f1105f9054401fdef1fe50</string>
41 <key>url</key>
42 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/GL-linux64-20080909.tar.bz2</uri>
29 </map> 43 </map>
30 <key>windows</key> 44 <key>windows</key>
31 <map> 45 <map>
@@ -49,16 +63,23 @@
49 <key>darwin</key> 63 <key>darwin</key>
50 <map> 64 <map>
51 <key>md5sum</key> 65 <key>md5sum</key>
52 <string>025bb5e76fd964b89c508d88d37bb802</string> 66 <string>7b07e7121a3623b2553ed36fb9024b40</string>
53 <key>url</key> 67 <key>url</key>
54 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/SDL-1.2.5-darwin-20080613.tar.bz2</uri> 68 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/SDL-1.2.5-darwin-20080818.tar.bz2</uri>
55 </map> 69 </map>
56 <key>linux</key> 70 <key>linux</key>
57 <map> 71 <map>
58 <key>md5sum</key> 72 <key>md5sum</key>
59 <string>a28fe914d3f3241c824aabba69f1d946</string> 73 <string>ce71bd658c3fa9fd7f46b7c5adacef1c</string>
74 <key>url</key>
75 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/SDL-1.2.5-linux-20080818.tar.bz2</uri>
76 </map>
77 <key>linux32</key>
78 <map>
79 <key>md5sum</key>
80 <string>45e8fca9a6e7ae7d36b0c5a21dfbe3b9</string>
60 <key>url</key> 81 <key>url</key>
61 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/SDL-1.2.5-linux-20080613.tar.bz2</uri> 82 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/SDL-1.2.5-linux-i686-gcc-4.1-20080915.tar.bz2</uri>
62 </map> 83 </map>
63 <key>windows</key> 84 <key>windows</key>
64 <map> 85 <map>
@@ -78,16 +99,30 @@
78 <key>darwin</key> 99 <key>darwin</key>
79 <map> 100 <map>
80 <key>md5sum</key> 101 <key>md5sum</key>
81 <string>10b11783907b72712daef3ed5803d56d</string> 102 <string>abd07d760cdc7d23da3b861f34b09c92</string>
82 <key>url</key> 103 <key>url</key>
83 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/apr_suite-1.2.8-darwin-20080618.tar.bz2</uri> 104 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/apr_suite-1.2.8-darwin-20080812.tar.bz2</uri>
84 </map> 105 </map>
85 <key>linux</key> 106 <key>linux</key>
86 <map> 107 <map>
87 <key>md5sum</key> 108 <key>md5sum</key>
88 <string>b99f6bd3548c4f4613fe95320e14dbf3</string> 109 <string>7b84cd6a3c601a104d9c09e58ef2f50c</string>
89 <key>url</key> 110 <key>url</key>
90 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/apr_suite-1.2.8-linux-20080618.tar.bz2</uri> 111 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/apr_suite-1.2.8-linux-20080812.tar.bz2</uri>
112 </map>
113 <key>linux32</key>
114 <map>
115 <key>md5sum</key>
116 <string>e97eb40a283165e3ddc7556f698b4e01</string>
117 <key>url</key>
118 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/apr_suite-1.2.8-linux-i686-gcc-4.1-20080915.tar.bz2</uri>
119 </map>
120 <key>linux64</key>
121 <map>
122 <key>md5sum</key>
123 <string>1a7e1186855d48d8316ce86803095f70</string>
124 <key>url</key>
125 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/apr_suite-1.2.8-linux64-20080909a.tar.bz2</uri>
91 </map> 126 </map>
92 <key>windows</key> 127 <key>windows</key>
93 <map> 128 <map>
@@ -122,6 +157,20 @@
122 <key>url</key> 157 <key>url</key>
123 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/ares-1.4.0-linux-20080729.tar.bz2</uri> 158 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/ares-1.4.0-linux-20080729.tar.bz2</uri>
124 </map> 159 </map>
160 <key>linux32</key>
161 <map>
162 <key>md5sum</key>
163 <string>247987b147e1c856d96e97d685e5b666</string>
164 <key>url</key>
165 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/ares-1.3.0-linux-i686-gcc-4.1-20080915.tar.bz2</uri>
166 </map>
167 <key>linux64</key>
168 <map>
169 <key>md5sum</key>
170 <string>c4242416e0b2e642c0bf062a19a250e4</string>
171 <key>url</key>
172 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/ares-1.3.0-linux64-20080909.tar.bz2</uri>
173 </map>
125 <key>windows</key> 174 <key>windows</key>
126 <map> 175 <map>
127 <key>md5sum</key> 176 <key>md5sum</key>
@@ -153,16 +202,30 @@
153 <key>darwin</key> 202 <key>darwin</key>
154 <map> 203 <map>
155 <key>md5sum</key> 204 <key>md5sum</key>
156 <string>792601ce1f38067c086394842852fa11</string> 205 <string>279834a12a0ed4531fd602594eac8509</string>
157 <key>url</key> 206 <key>url</key>
158 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/boost-1.32.0-darwin-20080613.tar.bz2</uri> 207 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/boost-1.32.0-darwin-20080812.tar.bz2</uri>
159 </map> 208 </map>
160 <key>linux</key> 209 <key>linux</key>
161 <map> 210 <map>
162 <key>md5sum</key> 211 <key>md5sum</key>
163 <string>e65f06e2500db0bbc34506194ac49f6a</string> 212 <string>b9a943052e5525da5417d6f471d70bc5</string>
213 <key>url</key>
214 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/boost-1.32.0-linux-20080812.tar.bz2</uri>
215 </map>
216 <key>linux32</key>
217 <map>
218 <key>md5sum</key>
219 <string>cdc0cb3e9bfb90517507a0df591f5c0b</string>
164 <key>url</key> 220 <key>url</key>
165 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/boost-1.32.0-linux-20080613.tar.bz2</uri> 221 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/boost-1.34.0-linux-i686-gcc-4.1-20080915.tar.bz2</uri>
222 </map>
223 <key>linux64</key>
224 <map>
225 <key>md5sum</key>
226 <string>b97ae0855e77cc25b37ca63df093bb9b</string>
227 <key>url</key>
228 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/boost-1.34.0-linux64-20080909.tar.bz2</uri>
166 </map> 229 </map>
167 <key>windows</key> 230 <key>windows</key>
168 <map> 231 <map>
@@ -186,16 +249,30 @@
186 <key>darwin</key> 249 <key>darwin</key>
187 <map> 250 <map>
188 <key>md5sum</key> 251 <key>md5sum</key>
189 <string>73965ddba50e5c4d46d50a966b472626</string> 252 <string>c426dfaad3b662405e49ed3701a55d38</string>
190 <key>url</key> 253 <key>url</key>
191 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/curl-7.16.0-darwin-20080613.tar.bz2</uri> 254 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/curl-7.16.0-darwin-20080812.tar.bz2</uri>
192 </map> 255 </map>
193 <key>linux</key> 256 <key>linux</key>
194 <map> 257 <map>
195 <key>md5sum</key> 258 <key>md5sum</key>
196 <string>a7791ee5ca19f208808f71730c3c2feb</string> 259 <string>e6d4cd23f5df4c74072d5d0437ca999b</string>
260 <key>url</key>
261 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/curl-7.16.0-linux-20080812.tar.bz2</uri>
262 </map>
263 <key>linux32</key>
264 <map>
265 <key>md5sum</key>
266 <string>3a8475b8990d17d8c9dc2a32980d2968</string>
267 <key>url</key>
268 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/curl-7.16.4-linux-i686-gcc-4.1-20080915.tar.bz2</uri>
269 </map>
270 <key>linux64</key>
271 <map>
272 <key>md5sum</key>
273 <string>6e9242d11d785f643f34d925a29967e7</string>
197 <key>url</key> 274 <key>url</key>
198 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/curl-7.16.0-linux-20080613.tar.bz2</uri> 275 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/curl-7.16.4-linux64-20080909.tar.bz2</uri>
199 </map> 276 </map>
200 <key>windows</key> 277 <key>windows</key>
201 <map> 278 <map>
@@ -206,6 +283,25 @@
206 </map> 283 </map>
207 </map> 284 </map>
208 </map> 285 </map>
286 <key>dbusglib</key>
287 <map>
288 <key>copyright</key>
289 <string>Copyright (C) 2002, 2003 CodeFactory AB / Copyright (C) 2003, 2004 Red Hat, Inc.</string>
290 <key>description</key>
291 <string>dbus/dbus-glib: headers only</string>
292 <key>license</key>
293 <string>AFL2.1</string>
294 <key>packages</key>
295 <map>
296 <key>linux</key>
297 <map>
298 <key>md5sum</key>
299 <string>eb25444142d4102b0ce1b7ffaadb071e</string>
300 <key>url</key>
301 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/dbusglib-linux-20080707.tar.bz2</uri>
302 </map>
303 </map>
304 </map>
209 <key>elfio</key> 305 <key>elfio</key>
210 <map> 306 <map>
211 <key>license</key> 307 <key>license</key>
@@ -215,9 +311,16 @@
215 <key>linux</key> 311 <key>linux</key>
216 <map> 312 <map>
217 <key>md5sum</key> 313 <key>md5sum</key>
218 <string>feb9d72c373c5dd4c6b88ed02e2b2bf0</string> 314 <string>82ea408af2f968cfe5f013ab241323ef</string>
315 <key>url</key>
316 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/elfio-1.0.3-linux-20080812.tar.bz2</uri>
317 </map>
318 <key>linux32</key>
319 <map>
320 <key>md5sum</key>
321 <string>3576f904306fba0edc659eaaa1a1159e</string>
219 <key>url</key> 322 <key>url</key>
220 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/elfio-1.0.3-linux-20080613.tar.bz2</uri> 323 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/elfio-1.0.3-linux-i686-gcc-4.1-20080915.tar.bz2</uri>
221 </map> 324 </map>
222 </map> 325 </map>
223 </map> 326 </map>
@@ -234,16 +337,30 @@
234 <key>darwin</key> 337 <key>darwin</key>
235 <map> 338 <map>
236 <key>md5sum</key> 339 <key>md5sum</key>
237 <string>7b9380e6bac8d9ba5e6ff20da5cad91a</string> 340 <string>9c5603e328e9f543e0a599d6b25be973</string>
238 <key>url</key> 341 <key>url</key>
239 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/expat-1.95.8-darwin-20080617.tar.bz2</uri> 342 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/expat-1.95.8-darwin-20080812.tar.bz2</uri>
240 </map> 343 </map>
241 <key>linux</key> 344 <key>linux</key>
242 <map> 345 <map>
243 <key>md5sum</key> 346 <key>md5sum</key>
244 <string>e59d8314185e3d87d72ff90d6cff0d30</string> 347 <string>67b470fd446b08c9831d1039674eae4e</string>
348 <key>url</key>
349 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/expat-1.95.8-linux-20080812.tar.bz2</uri>
350 </map>
351 <key>linux32</key>
352 <map>
353 <key>md5sum</key>
354 <string>af1f225afe6cd0c5d2e08ff578839794</string>
355 <key>url</key>
356 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/expat-1.95.8-linux-i686-gcc-4.1-20080915.tar.bz2</uri>
357 </map>
358 <key>linux64</key>
359 <map>
360 <key>md5sum</key>
361 <string>278c61871419b9a4d50a4f88b7922403</string>
245 <key>url</key> 362 <key>url</key>
246 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/expat-1.95.8-linux-20080613.tar.bz2</uri> 363 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/expat-1.95.8-linux64-20080909.tar.bz2</uri>
247 </map> 364 </map>
248 <key>windows</key> 365 <key>windows</key>
249 <map> 366 <map>
@@ -267,16 +384,23 @@
267 <key>darwin</key> 384 <key>darwin</key>
268 <map> 385 <map>
269 <key>md5sum</key> 386 <key>md5sum</key>
270 <string>d13cc275db503492fc87c7b36c1c49d3</string> 387 <string>c7e317bec481b7efa2a0319e163dcc65</string>
271 <key>url</key> 388 <key>url</key>
272 <uri>scp:install-packages.lindenlab.com:/local/www/install-packages/doc/fmod-3.75-darwin-20080610.tar.bz2</uri> 389 <uri>scp:install-packages.lindenlab.com:/local/www/install-packages/doc/fmod-3.75-darwin-20080818.tar.bz2</uri>
273 </map> 390 </map>
274 <key>linux</key> 391 <key>linux</key>
275 <map> 392 <map>
276 <key>md5sum</key> 393 <key>md5sum</key>
277 <string>85caf188852f2cfede49ff12a3d928d5</string> 394 <string>abd2b4ba4ac993f19d82804af387eb7c</string>
278 <key>url</key> 395 <key>url</key>
279 <uri>scp:install-packages.lindenlab.com:/local/www/install-packages/doc/fmod-3.75-linux-20080610.tar.bz2</uri> 396 <uri>scp:install-packages.lindenlab.com:/local/www/install-packages/doc/fmod-3.75-linux-20080818.tar.bz2</uri>
397 </map>
398 <key>linux32</key>
399 <map>
400 <key>md5sum</key>
401 <string>96eea0855dffefcbbd98e9e629b81275</string>
402 <key>url</key>
403 <uri>scp:install-packages.lindenlab.com:/local/www/install-packages/doc/fmod-3.75-linux-i686-gcc-4.1-20080915.tar.bz2</uri>
280 </map> 404 </map>
281 <key>windows</key> 405 <key>windows</key>
282 <map> 406 <map>
@@ -300,6 +424,13 @@
300 <key>url</key> 424 <key>url</key>
301 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/fontconfig-2.2.3-linux-20080613.tar.bz2</uri> 425 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/fontconfig-2.2.3-linux-20080613.tar.bz2</uri>
302 </map> 426 </map>
427 <key>linux32</key>
428 <map>
429 <key>md5sum</key>
430 <string>53b09eee725de92b715b898388e06115</string>
431 <key>url</key>
432 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/fontconfig-2.2.3-linux-i686-gcc-4.1-20080915.tar.bz2</uri>
433 </map>
303 </map> 434 </map>
304 </map> 435 </map>
305 <key>freetype</key> 436 <key>freetype</key>
@@ -315,16 +446,30 @@
315 <key>darwin</key> 446 <key>darwin</key>
316 <map> 447 <map>
317 <key>md5sum</key> 448 <key>md5sum</key>
318 <string>cd8a8f8af5a01fac015e5b0325daa2ae</string> 449 <string>694173293a483c01472a30cc7d895c5a</string>
319 <key>url</key> 450 <key>url</key>
320 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/freetype-2.1.5-darwin-20080613.tar.bz2</uri> 451 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/freetype-2.1.5-darwin-20080812.tar.bz2</uri>
321 </map> 452 </map>
322 <key>linux</key> 453 <key>linux</key>
323 <map> 454 <map>
324 <key>md5sum</key> 455 <key>md5sum</key>
325 <string>83e7aafe0807c2adec68f67b5738d856</string> 456 <string>07665d74d37c56fd884610ec80a1d19f</string>
457 <key>url</key>
458 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/freetype-2.1.5-linux-20080812.tar.bz2</uri>
459 </map>
460 <key>linux32</key>
461 <map>
462 <key>md5sum</key>
463 <string>c22a667d4b6b518cc7f942e2c861ca77</string>
326 <key>url</key> 464 <key>url</key>
327 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/freetype-2.1.5-linux-20080613.tar.bz2</uri> 465 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/freetype-2.1.5-linux-i686-gcc-4.1-20080915.tar.bz2</uri>
466 </map>
467 <key>linux64</key>
468 <map>
469 <key>md5sum</key>
470 <string>35f6fa557ba90f9cda0a18d1af2055a4</string>
471 <key>url</key>
472 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/freetype-2.1.5-linux64-20080909.tar.bz2</uri>
328 </map> 473 </map>
329 <key>windows</key> 474 <key>windows</key>
330 <map> 475 <map>
@@ -355,6 +500,20 @@
355 <key>linux</key> 500 <key>linux</key>
356 <map> 501 <map>
357 <key>md5sum</key> 502 <key>md5sum</key>
503 <string>23bd9a75e5a2365a827461e6c324f52b</string>
504 <key>url</key>
505 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/glh_linear-linux-20080812.tar.bz2</uri>
506 </map>
507 <key>linux32</key>
508 <map>
509 <key>md5sum</key>
510 <string>865d10ce141cdc7e07334486441d3e30</string>
511 <key>url</key>
512 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/glh_linear-linux-i686-gcc-4.1-20080915.tar.bz2</uri>
513 </map>
514 <key>linux64</key>
515 <map>
516 <key>md5sum</key>
358 <string>2965646aea1d2a6aec1fbc431c02733f</string> 517 <string>2965646aea1d2a6aec1fbc431c02733f</string>
359 <key>url</key> 518 <key>url</key>
360 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/glh_linear-linux-20080613.tar.bz2</uri> 519 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/glh_linear-linux-20080613.tar.bz2</uri>
@@ -368,6 +527,37 @@
368 </map> 527 </map>
369 </map> 528 </map>
370 </map> 529 </map>
530 <key>glib</key>
531 <map>
532 <key>description</key>
533 <string>GLib is a library containing many useful C routines for things such as trees, hashes, and lists.</string>
534 <key>license</key>
535 <string>gpl</string>
536 <key>packages</key>
537 <map>
538 <key>darwin</key>
539 <map>
540 <key>md5sum</key>
541 <string>6cc5ce1fafd10299fdb890b3d4c3cf53</string>
542 <key>url</key>
543 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/glib-2.0-darwin-20080817.tar.bz2</uri>
544 </map>
545 <key>linux</key>
546 <map>
547 <key>md5sum</key>
548 <string>2f1a9e14f9213c2c9564c1c1cfdd6d47</string>
549 <key>url</key>
550 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/glib-2.0-linux-20080817.tar.bz2</uri>
551 </map>
552 <key>windows</key>
553 <map>
554 <key>md5sum</key>
555 <string>3d5e29d444dde4815b36082eedfc775a</string>
556 <key>url</key>
557 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/glib-2.0-windows-20080817.tar.bz2</uri>
558 </map>
559 </map>
560 </map>
371 <key>google</key> 561 <key>google</key>
372 <map> 562 <map>
373 <key>license</key> 563 <key>license</key>
@@ -377,9 +567,9 @@
377 <key>linux</key> 567 <key>linux</key>
378 <map> 568 <map>
379 <key>md5sum</key> 569 <key>md5sum</key>
380 <string>f1161282d7fc11fbe17d0aa077ee054b</string> 570 <string>40db900872612615e849f17cbdfd2c27</string>
381 <key>url</key> 571 <key>url</key>
382 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/google-linux-20080617.tar.bz2</uri> 572 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/google-linux-20080812.tar.bz2</uri>
383 </map> 573 </map>
384 </map> 574 </map>
385 </map> 575 </map>
@@ -396,6 +586,20 @@
396 <key>url</key> 586 <key>url</key>
397 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/gstreamer-linux-20080613.tar.bz2</uri> 587 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/gstreamer-linux-20080613.tar.bz2</uri>
398 </map> 588 </map>
589 <key>linux32</key>
590 <map>
591 <key>md5sum</key>
592 <string>45eaa378465831e114a7406aa4d2ef35</string>
593 <key>url</key>
594 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/gstreamer-linux-i686-gcc-4.1-20080915.tar.bz2</uri>
595 </map>
596 <key>linux64</key>
597 <map>
598 <key>md5sum</key>
599 <string>befc7520fe01250f39458f65c29bc584</string>
600 <key>url</key>
601 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/gstreamer-linux64-20080909.tar.bz2</uri>
602 </map>
399 </map> 603 </map>
400 </map> 604 </map>
401 <key>gtk-atk-pango-glib</key> 605 <key>gtk-atk-pango-glib</key>
@@ -415,6 +619,13 @@
415 <key>url</key> 619 <key>url</key>
416 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/gtk-atk-pango-glib-linux-20080616.tar.bz</uri> 620 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/gtk-atk-pango-glib-linux-20080616.tar.bz</uri>
417 </map> 621 </map>
622 <key>linux32</key>
623 <map>
624 <key>md5sum</key>
625 <string>21c16a74f8fc9a62e3ab944a6eb7403d</string>
626 <key>url</key>
627 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/gtk-atk-pango-glib-linux-20080616.tar.bz</uri>
628 </map>
418 <key>windows</key> 629 <key>windows</key>
419 <map> 630 <map>
420 <key>md5sum</key> 631 <key>md5sum</key>
@@ -437,23 +648,37 @@
437 <key>darwin</key> 648 <key>darwin</key>
438 <map> 649 <map>
439 <key>md5sum</key> 650 <key>md5sum</key>
440 <string>7d3d2d71c08729fe881a059af1d9b938</string> 651 <string>f64c08771a4fc456db2a55b47302078b</string>
441 <key>url</key> 652 <key>url</key>
442 <uri>scp:install-packages.lindenlab.com:/local/www/install-packages/doc/havok-4.6-darwin-20080610.tar.bz2</uri> 653 <uri>scp:install-packages.lindenlab.com:/local/www/install-packages/doc/havok-4.6-darwin-20080812.tar.bz2</uri>
443 </map> 654 </map>
444 <key>linux</key> 655 <key>linux</key>
445 <map> 656 <map>
446 <key>md5sum</key> 657 <key>md5sum</key>
447 <string>36a892b451b5cbc8f72d6f1153f55cf8</string> 658 <string>e398a04adb84796072dcc1f5efc69f4a</string>
659 <key>url</key>
660 <uri>scp:install-packages.lindenlab.com:/local/www/install-packages/doc/havok-4.6.1-linux-20080912.tar.bz2</uri>
661 </map>
662 <key>linux32</key>
663 <map>
664 <key>md5sum</key>
665 <string>5a7821cb8aa471051e0361a74d115613</string>
448 <key>url</key> 666 <key>url</key>
449 <uri>scp:install-packages.lindenlab.com:/local/www/install-packages/doc/havok-4.6-linux-20080610.tar.bz2</uri> 667 <uri>scp:install-packages.lindenlab.com:/local/www/install-packages/doc/havok-4.6.1-linux-i686-gcc-4.1-20080915.tar.bz2</uri>
668 </map>
669 <key>linux64</key>
670 <map>
671 <key>md5sum</key>
672 <string>b2095827a940c791240339dac677ef2d</string>
673 <key>url</key>
674 <uri>scp:install-packages.lindenlab.com:/local/www/install-packages/doc/havok-4.6.1-linux64-20080909.tar.bz2</uri>
450 </map> 675 </map>
451 <key>windows</key> 676 <key>windows</key>
452 <map> 677 <map>
453 <key>md5sum</key> 678 <key>md5sum</key>
454 <string>b63a2f20df43c68062c6b8e77a2da455</string> 679 <string>f25fbb29c2275267233c79f0c68ca37f</string>
455 <key>url</key> 680 <key>url</key>
456 <uri>scp:install-packages.lindenlab.com:/local/www/install-packages/doc/havok-4.6-windows-20080611.tar.bz2</uri> 681 <uri>scp:install-packages.lindenlab.com:/local/www/install-packages/doc/havok-4.6.1-windows-20081010.tar.bz2</uri>
457 </map> 682 </map>
458 </map> 683 </map>
459 </map> 684 </map>
@@ -470,16 +695,30 @@
470 <key>darwin</key> 695 <key>darwin</key>
471 <map> 696 <map>
472 <key>md5sum</key> 697 <key>md5sum</key>
473 <string>30b12debc3efce275a335b824dda22d2</string> 698 <string>8d38d74c481e9aab4518c8f2a7d52800</string>
474 <key>url</key> 699 <key>url</key>
475 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/jpeglib-6b-darwin-20080613.tar.bz2</uri> 700 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/jpeglib-6b-darwin-20080812.tar.bz2</uri>
476 </map> 701 </map>
477 <key>linux</key> 702 <key>linux</key>
478 <map> 703 <map>
479 <key>md5sum</key> 704 <key>md5sum</key>
480 <string>9297565a09754fdf2b58cefef60450c7</string> 705 <string>41085a9915598bba0e6bcb0da23ff929</string>
706 <key>url</key>
707 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/jpeglib-6b-linux-20080812.tar.bz2</uri>
708 </map>
709 <key>linux32</key>
710 <map>
711 <key>md5sum</key>
712 <string>3896cfbf5e44450532101f9ab833be61</string>
713 <key>url</key>
714 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/jpeglib-6b-linux-i686-gcc-4.1-20080915.tar.bz2</uri>
715 </map>
716 <key>linux64</key>
717 <map>
718 <key>md5sum</key>
719 <string>0e7facf7d48531d20c0cd6a3c3f04021</string>
481 <key>url</key> 720 <key>url</key>
482 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/jpeglib-6b-linux-20080613.tar.bz2</uri> 721 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/jpeglib-6b-linux64-20080909.tar.bz2</uri>
483 </map> 722 </map>
484 <key>windows</key> 723 <key>windows</key>
485 <map> 724 <map>
@@ -503,23 +742,37 @@
503 <key>darwin</key> 742 <key>darwin</key>
504 <map> 743 <map>
505 <key>md5sum</key> 744 <key>md5sum</key>
506 <string>9a91ecd80203a24fb347b1436155b013</string> 745 <string>3b40e7170dea82c1443e8d90cd44a13d</string>
507 <key>url</key> 746 <key>url</key>
508 <uri>scp:install-packages.lindenlab.com:/local/www/install-packages/doc/kdu-5.2.1-darwin-20080716.tar.bz2</uri> 747 <uri>scp:install-packages.lindenlab.com:/local/www/install-packages/doc/kdu-4.2.1-darwin-20080926.tar.bz2</uri>
509 </map> 748 </map>
510 <key>linux</key> 749 <key>linux</key>
511 <map> 750 <map>
512 <key>md5sum</key> 751 <key>md5sum</key>
513 <string>daadd8c268e16f8c5f6145be8596b8b8</string> 752 <string>a6d2f0995c25d7f53bd12b8ec0d6b462</string>
514 <key>url</key> 753 <key>url</key>
515 <uri>scp:install-packages.lindenlab.com:/local/www/install-packages/doc/kdu-5.2.1-linux-20080716.tar.bz2</uri> 754 <uri>scp:install-packages.lindenlab.com:/local/www/install-packages/doc/kdu-4.2.1-linux-20080930.tar.bz2</uri>
755 </map>
756 <key>linux32</key>
757 <map>
758 <key>md5sum</key>
759 <string>0f4f1eb22ea6a4d242614d146fd176a1</string>
760 <key>url</key>
761 <uri>scp:install-packages.lindenlab.com:/local/www/install-packages/doc/kdu-4.2.1-linux32-20080926.tar.bz2</uri>
762 </map>
763 <key>linux64</key>
764 <map>
765 <key>md5sum</key>
766 <string>f4e2e2b3440594527729a8c85119e508</string>
767 <key>url</key>
768 <uri>scp:install-packages.lindenlab.com:/local/www/install-packages/doc/kdu-5.2.1-linux64-20080926.tar.bz2</uri>
516 </map> 769 </map>
517 <key>windows</key> 770 <key>windows</key>
518 <map> 771 <map>
519 <key>md5sum</key> 772 <key>md5sum</key>
520 <string>15528c24ca657b524d9ab3ccbb33c766</string> 773 <string>1b9f61140f8b599cdae5e00d21dbb177</string>
521 <key>url</key> 774 <key>url</key>
522 <uri>scp:install-packages.lindenlab.com:/local/www/install-packages/doc/kdu-5.2.1-windows-20080613.tar.bz2</uri> 775 <uri>scp:install-packages.lindenlab.com:/local/www/install-packages/doc/kdu-4.2.1-windows-20080926.tar.bz2</uri>
523 </map> 776 </map>
524 </map> 777 </map>
525 </map> 778 </map>
@@ -547,6 +800,13 @@
547 <key>url</key> 800 <key>url</key>
548 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/kdu-binaries-5.2.1-linux-20080617.tar.bz2</uri> 801 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/kdu-binaries-5.2.1-linux-20080617.tar.bz2</uri>
549 </map> 802 </map>
803 <key>linux32</key>
804 <map>
805 <key>md5sum</key>
806 <string>ca87644e377a6cf16db4ba6dbd2f8689</string>
807 <key>url</key>
808 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/kdu-binaries-5.2.1-linux-20080617.tar.bz2</uri>
809 </map>
550 <key>windows</key> 810 <key>windows</key>
551 <map> 811 <map>
552 <key>md5sum</key> 812 <key>md5sum</key>
@@ -577,16 +837,30 @@ anguage Infrstructure (CLI) international standard</string>
577 <key>linux</key> 837 <key>linux</key>
578 <map> 838 <map>
579 <key>md5sum</key> 839 <key>md5sum</key>
580 <string>df73b95b0980e631ba1ecd930120699f</string> 840 <string>9bc0f8b7d5e0ff194b6d5635daf9ae3a</string>
841 <key>url</key>
842 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/libmono-1.2.6-linux-20080816a.tar.bz2</uri>
843 </map>
844 <key>linux32</key>
845 <map>
846 <key>md5sum</key>
847 <string>8b5810b9b40e8ce4243487fe33b62f56</string>
581 <key>url</key> 848 <key>url</key>
582 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/libmono-linux-20080722.tar.bz2</uri> 849 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/libmono-1.2.6-linux32-20080926.tar.bz2</uri>
850 </map>
851 <key>linux64</key>
852 <map>
853 <key>md5sum</key>
854 <string>451521b4cb57c35caf3efb8dcf99b99e</string>
855 <key>url</key>
856 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/libmono-1.2.6-linux64-20080926.tar.bz2</uri>
583 </map> 857 </map>
584 <key>windows</key> 858 <key>windows</key>
585 <map> 859 <map>
586 <key>md5sum</key> 860 <key>md5sum</key>
587 <string>7293312a6c76e5a38ec1b58ff87828d9</string> 861 <string>6712a09311a914752f47d5d62562a239</string>
588 <key>url</key> 862 <key>url</key>
589 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/libmono-windows-20080723.tar.bz2</uri> 863 <uri>https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/libmono-1.2.6-windows-20080903.tar.bz2</uri>
590 </map> 864 </map>
591 </map> 865 </map>
592 </map> 866 </map>
@@ -603,16 +877,30 @@ anguage Infrstructure (CLI) international standard</string>
603 <key>darwin</key> 877 <key>darwin</key>
604 <map> 878 <map>
605 <key>md5sum</key> 879 <key>md5sum</key>
606 <string>90488b309856a82a152348db177a44c5</string> 880 <string>edd0877544dab4c521473279ed237dcc</string>
607 <key>url</key> 881 <key>url</key>
608 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/libpng-1.2.18-darwin-20080613.tar.bz2</uri> 882 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/libpng-1.2.18-darwin-20080812.tar.bz2</uri>
609 </map> 883 </map>
610 <key>linux</key> 884 <key>linux</key>
611 <map> 885 <map>
612 <key>md5sum</key> 886 <key>md5sum</key>
613 <string>b47eca741c218e13e6838583c9169b64</string> 887 <string>0878662f8c1c695a82477f7b0c57a7af</string>
888 <key>url</key>
889 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/libpng-1.2.18-linux-20080812.tar.bz2</uri>
890 </map>
891 <key>linux32</key>
892 <map>
893 <key>md5sum</key>
894 <string>3c631ee1a4556c3a28b5490a53d86603</string>
614 <key>url</key> 895 <key>url</key>
615 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/libpng-1.2.18-linux-20080613.tar.bz2</uri> 896 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/libpng-1.2.15-linux-i686-gcc-4.1-20080915.tar.bz2</uri>
897 </map>
898 <key>linux64</key>
899 <map>
900 <key>md5sum</key>
901 <string>fbc162f986c869d158633ccdba6ee6e4</string>
902 <key>url</key>
903 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/libpng-1.2.18-linux64-20080909.tar.bz2</uri>
616 </map> 904 </map>
617 <key>windows</key> 905 <key>windows</key>
618 <map> 906 <map>
@@ -636,9 +924,23 @@ anguage Infrstructure (CLI) international standard</string>
636 <key>linux</key> 924 <key>linux</key>
637 <map> 925 <map>
638 <key>md5sum</key> 926 <key>md5sum</key>
639 <string>0591314df0293ba948b0445b0215a18d</string> 927 <string>1464a75ec87ee28e3b4f7840e9af41e3</string>
640 <key>url</key> 928 <key>url</key>
641 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/libstdc++-6.0-linux-20080613.tar.bz2</uri> 929 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/libstdc++-6.0-linux-20080812.tar.bz2</uri>
930 </map>
931 <key>linux32</key>
932 <map>
933 <key>md5sum</key>
934 <string>1218347dd70c3b471530793d0fc09b69</string>
935 <key>url</key>
936 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/libstdc++-6.4.1-linux-i686-gcc-4.1-20080915.tar.bz2</uri>
937 </map>
938 <key>linux64</key>
939 <map>
940 <key>md5sum</key>
941 <string>9a191dc453017b19c5803b046d82f32a</string>
942 <key>url</key>
943 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/libstdc++-6.4.1-linux64-20080909.tar.bz2</uri>
642 </map> 944 </map>
643 </map> 945 </map>
644 </map> 946 </map>
@@ -655,9 +957,16 @@ anguage Infrstructure (CLI) international standard</string>
655 <key>linux</key> 957 <key>linux</key>
656 <map> 958 <map>
657 <key>md5sum</key> 959 <key>md5sum</key>
658 <string>495f01afa67ed1ae59b7b8005cfa55ff</string> 960 <string>b5cc6062bd2f7421f606f7e1a5228829</string>
961 <key>url</key>
962 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/libuuid-linux-20080812.tar.bz2</uri>
963 </map>
964 <key>linux32</key>
965 <map>
966 <key>md5sum</key>
967 <string>cdc0778d924c6162c1f553274b72ba15</string>
659 <key>url</key> 968 <key>url</key>
660 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/libuuid-linux-20080613.tar.bz2</uri> 969 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/libuuid-linux-i686-gcc-4.1-20080915.tar.bz2</uri>
661 </map> 970 </map>
662 </map> 971 </map>
663 </map> 972 </map>
@@ -674,6 +983,20 @@ anguage Infrstructure (CLI) international standard</string>
674 <key>url</key> 983 <key>url</key>
675 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/libxml-2.6.24-linux-20080613.tar.bz2</uri> 984 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/libxml-2.6.24-linux-20080613.tar.bz2</uri>
676 </map> 985 </map>
986 <key>linux32</key>
987 <map>
988 <key>md5sum</key>
989 <string>0e16b7794811407c387d360282c5d7b3</string>
990 <key>url</key>
991 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/libxml-2.6.24-linux-i686-gcc-4.1-20080915.tar.bz2</uri>
992 </map>
993 <key>linux64</key>
994 <map>
995 <key>md5sum</key>
996 <string>921d7f980519101afb74623e29e9d175</string>
997 <key>url</key>
998 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/libxml-2.6.24-linux64-20080909.tar.bz2</uri>
999 </map>
677 </map> 1000 </map>
678 </map> 1001 </map>
679 <key>llmozlib</key> 1002 <key>llmozlib</key>
@@ -685,9 +1008,9 @@ anguage Infrstructure (CLI) international standard</string>
685 <key>darwin</key> 1008 <key>darwin</key>
686 <map> 1009 <map>
687 <key>md5sum</key> 1010 <key>md5sum</key>
688 <string>056ad496f0ec2bf386d50f694f6bade3</string> 1011 <string>6995c99b4855c4bf9301267c334aedc3</string>
689 <key>url</key> 1012 <key>url</key>
690 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/llmozlib-darwin-20080613.tar.bz2</uri> 1013 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/llmozlib-darwin-20080812.tar.bz2</uri>
691 </map> 1014 </map>
692 <key>linux</key> 1015 <key>linux</key>
693 <map> 1016 <map>
@@ -696,12 +1019,26 @@ anguage Infrstructure (CLI) international standard</string>
696 <key>url</key> 1019 <key>url</key>
697 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/llmozlib-linux-20080922.tar.bz2</uri> 1020 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/llmozlib-linux-20080922.tar.bz2</uri>
698 </map> 1021 </map>
1022 <key>linux32</key>
1023 <map>
1024 <key>md5sum</key>
1025 <string>0af042c01975df3b127b742f4aad0c5c</string>
1026 <key>url</key>
1027 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/llmozlib-linux-i686-gcc-4.1-20080915.tar.bz2</uri>
1028 </map>
1029 <key>linux64</key>
1030 <map>
1031 <key>md5sum</key>
1032 <string>c2ae53462b56e0999ba386774ab0b789</string>
1033 <key>url</key>
1034 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/llmozlib-linux64-20080909.tar.bz2</uri>
1035 </map>
699 <key>windows</key> 1036 <key>windows</key>
700 <map> 1037 <map>
701 <key>md5sum</key> 1038 <key>md5sum</key>
702 <string>8c1b8881285631eb32ba541e10d07b07</string> 1039 <string>42cb780c595d25881b4967292a4a0f40</string>
703 <key>url</key> 1040 <key>url</key>
704 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/llmozlib-windows-20080922.tar.bz2</uri> 1041 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/llmozlib-windows-20080828.tar.bz2</uri>
705 </map> 1042 </map>
706 </map> 1043 </map>
707 </map> 1044 </map>
@@ -718,9 +1055,23 @@ anguage Infrstructure (CLI) international standard</string>
718 <key>linux</key> 1055 <key>linux</key>
719 <map> 1056 <map>
720 <key>md5sum</key> 1057 <key>md5sum</key>
721 <string>13802606c5f6e98af7cfa72cc85e3a92</string> 1058 <string>70d0bbe1145fff29a0131349c898260e</string>
722 <key>url</key> 1059 <key>url</key>
723 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/mesa-7.0-linux-20080613.tar.bz2</uri> 1060 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/mesa-7.0-linux-20080812.tar.bz2</uri>
1061 </map>
1062 <key>linux32</key>
1063 <map>
1064 <key>md5sum</key>
1065 <string>854f3dae9e048305a0fe77eaee0195d6</string>
1066 <key>url</key>
1067 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/mesa-6.2.1-linux-i686-gcc-4.1-20080915.tar.bz2</uri>
1068 </map>
1069 <key>linux64</key>
1070 <map>
1071 <key>md5sum</key>
1072 <string>56630977f9261bd82039b0da08a0685c</string>
1073 <key>url</key>
1074 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/mesa-6.2.1-linux64-20081016.tar.bz2</uri>
724 </map> 1075 </map>
725 <key>windows</key> 1076 <key>windows</key>
726 <map> 1077 <map>
@@ -740,9 +1091,9 @@ anguage Infrstructure (CLI) international standard</string>
740 <key>darwin</key> 1091 <key>darwin</key>
741 <map> 1092 <map>
742 <key>md5sum</key> 1093 <key>md5sum</key>
743 <string>a60de9d31aa3dfab8851f8c2dfa3f8dc</string> 1094 <string>df27f2db244ea2762759a06cd75ada4e</string>
744 <key>url</key> 1095 <key>url</key>
745 <uri>scp:install-packages.lindenlab.com:/local/www/install-packages/doc/mysql-darwin-20080610.tar.bz2</uri> 1096 <uri>scp:install-packages.lindenlab.com:/local/www/install-packages/doc/mysql-darwin-20080812.tar.bz2</uri>
746 </map> 1097 </map>
747 <key>windows</key> 1098 <key>windows</key>
748 <map> 1099 <map>
@@ -766,9 +1117,9 @@ anguage Infrstructure (CLI) international standard</string>
766 <key>darwin</key> 1117 <key>darwin</key>
767 <map> 1118 <map>
768 <key>md5sum</key> 1119 <key>md5sum</key>
769 <string>15df716b66bd83e2198450eed93197cd</string> 1120 <string>17999c47e17f2dd9e12a22372ce8ff14</string>
770 <key>url</key> 1121 <key>url</key>
771 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/ndofdev-darwin-20080618.tar.bz2</uri> 1122 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/ndofdev-darwin-20080812.tar.bz2</uri>
772 </map> 1123 </map>
773 <key>linux</key> 1124 <key>linux</key>
774 <map> 1125 <map>
@@ -777,6 +1128,13 @@ anguage Infrstructure (CLI) international standard</string>
777 <key>url</key> 1128 <key>url</key>
778 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/ndofdev-linux-20080618.tar.bz2</uri> 1129 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/ndofdev-linux-20080618.tar.bz2</uri>
779 </map> 1130 </map>
1131 <key>linux32</key>
1132 <map>
1133 <key>md5sum</key>
1134 <string>c980300c14dddf47ba0c46608b29a027</string>
1135 <key>url</key>
1136 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/ndofdev-linux-i686-gcc-4.1-20080915.tar.bz2</uri>
1137 </map>
780 <key>windows</key> 1138 <key>windows</key>
781 <map> 1139 <map>
782 <key>md5sum</key> 1140 <key>md5sum</key>
@@ -799,16 +1157,23 @@ anguage Infrstructure (CLI) international standard</string>
799 <key>darwin</key> 1157 <key>darwin</key>
800 <map> 1158 <map>
801 <key>md5sum</key> 1159 <key>md5sum</key>
802 <string>8d9bb71c06f6494cc767965145f31c63</string> 1160 <string>a6843398b780645c4897c9776c688926</string>
803 <key>url</key> 1161 <key>url</key>
804 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/ogg-vorbis-1.03-1.1.2-darwin-20080613.tar.bz2</uri> 1162 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/ogg-vorbis-1.03-1.1.2-darwin-20080812.tar.bz2</uri>
805 </map> 1163 </map>
806 <key>linux</key> 1164 <key>linux</key>
807 <map> 1165 <map>
808 <key>md5sum</key> 1166 <key>md5sum</key>
809 <string>1e912aef160c1d8f46f4194942922654</string> 1167 <string>df1809565b87b1dc28e3ca70db6e7d46</string>
1168 <key>url</key>
1169 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/ogg-vorbis-1.03-1.1.2-linux-20080812.tar.bz2</uri>
1170 </map>
1171 <key>linux64</key>
1172 <map>
1173 <key>md5sum</key>
1174 <string>964c71e6ee22be1bcaf6d480e74cdd14</string>
810 <key>url</key> 1175 <key>url</key>
811 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/ogg-vorbis-1.03-1.1.2-linux-20080613.tar.bz2</uri> 1176 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/ogg-vorbis-1.2.0-linux64-20080909.tar.bz2</uri>
812 </map> 1177 </map>
813 <key>windows</key> 1178 <key>windows</key>
814 <map> 1179 <map>
@@ -828,16 +1193,30 @@ anguage Infrstructure (CLI) international standard</string>
828 <key>darwin</key> 1193 <key>darwin</key>
829 <map> 1194 <map>
830 <key>md5sum</key> 1195 <key>md5sum</key>
831 <string>a708e7b41b91852b060bb3d62112b4d7</string> 1196 <string>a7b49e0f3eedbd5de117a3524c414b3a</string>
832 <key>url</key> 1197 <key>url</key>
833 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openSSL-0.9.7c-darwin-20080613.tar.bz2</uri> 1198 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openSSL-0.9.7c-darwin-20080812.tar.bz2</uri>
834 </map> 1199 </map>
835 <key>linux</key> 1200 <key>linux</key>
836 <map> 1201 <map>
837 <key>md5sum</key> 1202 <key>md5sum</key>
838 <string>727f2a9399b7f414260a03fdf700aef4</string> 1203 <string>f219ef07b02e2abb9282345c3a8f2b39</string>
1204 <key>url</key>
1205 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openSSL-0.9.7c-linux-20080812.tar.bz2</uri>
1206 </map>
1207 <key>linux32</key>
1208 <map>
1209 <key>md5sum</key>
1210 <string>1037114c5b7ad906daca2b4820080b5b</string>
1211 <key>url</key>
1212 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openSSL-0.9.8g-linux-i686-gcc-4.1-20080915.tar.bz2</uri>
1213 </map>
1214 <key>linux64</key>
1215 <map>
1216 <key>md5sum</key>
1217 <string>00b23f28a2457d9dabbaff0b29ee7323</string>
839 <key>url</key> 1218 <key>url</key>
840 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openSSL-0.9.7c-linux-20080613.tar.bz2</uri> 1219 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openSSL-0.9.8g-linux64-20080909.tar.bz2</uri>
841 </map> 1220 </map>
842 <key>windows</key> 1221 <key>windows</key>
843 <map> 1222 <map>
@@ -861,16 +1240,30 @@ anguage Infrstructure (CLI) international standard</string>
861 <key>darwin</key> 1240 <key>darwin</key>
862 <map> 1241 <map>
863 <key>md5sum</key> 1242 <key>md5sum</key>
864 <string>85b34723ab22591ebbc51c474588c2e0</string> 1243 <string>ac3e0218287e084709afea06b82ae03b</string>
865 <key>url</key> 1244 <key>url</key>
866 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openjpeg-1.2-darwin-20080613.tar.bz2</uri> 1245 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openjpeg-1.2-darwin-20080812.tar.bz2</uri>
867 </map> 1246 </map>
868 <key>linux</key> 1247 <key>linux</key>
869 <map> 1248 <map>
870 <key>md5sum</key> 1249 <key>md5sum</key>
871 <string>406ceca1c85b64df18deed95f3b7854c</string> 1250 <string>c333219c88462b8b22c815cd2b700218</string>
1251 <key>url</key>
1252 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openjpeg-1.2-linux-20080812.tar.bz2</uri>
1253 </map>
1254 <key>linux32</key>
1255 <map>
1256 <key>md5sum</key>
1257 <string>dc1f50c6570cef2d45d40ccc7ac76013</string>
872 <key>url</key> 1258 <key>url</key>
873 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openjpeg-1.2-linux-20080613.tar.bz2</uri> 1259 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openjpeg-1.2.0-linux-i686-gcc-4.1-20080919.tar.bz2</uri>
1260 </map>
1261 <key>linux64</key>
1262 <map>
1263 <key>md5sum</key>
1264 <string>44f1bc9d47e4a54fc274c213f2cb565f</string>
1265 <key>url</key>
1266 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openjpeg-1.2.0-linux64-20080909.tar.bz2</uri>
874 </map> 1267 </map>
875 <key>windows</key> 1268 <key>windows</key>
876 <map> 1269 <map>
@@ -924,6 +1317,13 @@ anguage Infrstructure (CLI) international standard</string>
924 <key>url</key> 1317 <key>url</key>
925 <uri>scp:install-packages.lindenlab.com:/local/www/install-packages/doc/smartheap-6.0.2-linux-20080610.tar.bz2</uri> 1318 <uri>scp:install-packages.lindenlab.com:/local/www/install-packages/doc/smartheap-6.0.2-linux-20080610.tar.bz2</uri>
926 </map> 1319 </map>
1320 <key>linux32</key>
1321 <map>
1322 <key>md5sum</key>
1323 <string>499208522bf7d7843e1d014d64214e06</string>
1324 <key>url</key>
1325 <uri>scp:install-packages.lindenlab.com:/local/www/install-packages/doc/smartheap-6.0.2-linux-20080610.tar.bz2</uri>
1326 </map>
927 <key>windows</key> 1327 <key>windows</key>
928 <map> 1328 <map>
929 <key>md5sum</key> 1329 <key>md5sum</key>
@@ -953,9 +1353,23 @@ anguage Infrstructure (CLI) international standard</string>
953 <key>linux</key> 1353 <key>linux</key>
954 <map> 1354 <map>
955 <key>md5sum</key> 1355 <key>md5sum</key>
956 <string>da7872a8a5cfe5d14ceeeebe73e58d6b</string> 1356 <string>1116d9ba0c34c042788421d4e520e747</string>
957 <key>url</key> 1357 <key>url</key>
958 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/tut-linux-20080613.tar.bz2</uri> 1358 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/tut-linux-20080812.tar.bz2</uri>
1359 </map>
1360 <key>linux32</key>
1361 <map>
1362 <key>md5sum</key>
1363 <string>f410e4acdf4696c90d3fc708c41e6226</string>
1364 <key>url</key>
1365 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/tut-2006-06-22-linux-i686-gcc-4.1-20080915.tar.bz2</uri>
1366 </map>
1367 <key>linux64</key>
1368 <map>
1369 <key>md5sum</key>
1370 <string>728f4d8f74df8e84d0781b9ee9fc47ed</string>
1371 <key>url</key>
1372 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/tut-2006-06-22-linux64-20080909.tar.bz2</uri>
959 </map> 1373 </map>
960 <key>windows</key> 1374 <key>windows</key>
961 <map> 1375 <map>
@@ -1007,6 +1421,13 @@ anguage Infrstructure (CLI) international standard</string>
1007 <key>url</key> 1421 <key>url</key>
1008 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/vivox-linux-20080613.tar.bz2</uri> 1422 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/vivox-linux-20080613.tar.bz2</uri>
1009 </map> 1423 </map>
1424 <key>linux32</key>
1425 <map>
1426 <key>md5sum</key>
1427 <string>7d6e9727edba3556015edf492d35e394</string>
1428 <key>url</key>
1429 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/vivox-linux-i686-gcc-4.1-20080915.tar.bz2</uri>
1430 </map>
1010 <key>windows</key> 1431 <key>windows</key>
1011 <map> 1432 <map>
1012 <key>md5sum</key> 1433 <key>md5sum</key>
@@ -1029,16 +1450,30 @@ anguage Infrstructure (CLI) international standard</string>
1029 <key>darwin</key> 1450 <key>darwin</key>
1030 <map> 1451 <map>
1031 <key>md5sum</key> 1452 <key>md5sum</key>
1032 <string>f3e2f3428913bf8b8d70d28a3d079811</string> 1453 <string>2d3a918c88d756422c1a8139ebe15f56</string>
1033 <key>url</key> 1454 <key>url</key>
1034 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/xmlrpc-epi-0.51-darwin-20080613.tar.bz2</uri> 1455 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/xmlrpc-epi-0.51-darwin-20080812.tar.bz2</uri>
1035 </map> 1456 </map>
1036 <key>linux</key> 1457 <key>linux</key>
1037 <map> 1458 <map>
1038 <key>md5sum</key> 1459 <key>md5sum</key>
1039 <string>0cc87341785bf23c253e6e69a7c16ca0</string> 1460 <string>84a219199240ea70f54439c02acef0cd</string>
1461 <key>url</key>
1462 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/xmlrpc-epi-0.51-linux-20080812.tar.bz2</uri>
1463 </map>
1464 <key>linux32</key>
1465 <map>
1466 <key>md5sum</key>
1467 <string>06ad9cbb166b89dcc0c62fd987cc34ce</string>
1040 <key>url</key> 1468 <key>url</key>
1041 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/xmlrpc-epi-0.51-linux-20080618.tar.bz2</uri> 1469 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/xmlrpc-epi-0.51-linux-i686-gcc-4.1-20080915.tar.bz2</uri>
1470 </map>
1471 <key>linux64</key>
1472 <map>
1473 <key>md5sum</key>
1474 <string>dc67b896c56116df8e18f2d1bbd07031</string>
1475 <key>url</key>
1476 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/xmlrpc-epi-0.51-linux64-20080909.tar.bz2</uri>
1042 </map> 1477 </map>
1043 <key>windows</key> 1478 <key>windows</key>
1044 <map> 1479 <map>
@@ -1062,16 +1497,30 @@ anguage Infrstructure (CLI) international standard</string>
1062 <key>darwin</key> 1497 <key>darwin</key>
1063 <map> 1498 <map>
1064 <key>md5sum</key> 1499 <key>md5sum</key>
1065 <string>6f5d1799ffacaec4b61d53051443c672</string> 1500 <string>c844e1b05723ce078dbbd5aea9cdd3ad</string>
1066 <key>url</key> 1501 <key>url</key>
1067 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/zlib-1.1.4-darwin-20080618.tar.bz2</uri> 1502 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/zlib-1.1.4-darwin-20080818.tar.bz2</uri>
1068 </map> 1503 </map>
1069 <key>linux</key> 1504 <key>linux</key>
1070 <map> 1505 <map>
1071 <key>md5sum</key> 1506 <key>md5sum</key>
1072 <string>4140bc104e828c5c33f251a2d5bfe144</string> 1507 <string>806637b1834825ab8888d5e487085df8</string>
1073 <key>url</key> 1508 <key>url</key>
1074 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/zlib-1.1.4-linux-20080618.tar.bz2</uri> 1509 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/zlib-1.1.4-linux-20080818.tar.bz2</uri>
1510 </map>
1511 <key>linux32</key>
1512 <map>
1513 <key>md5sum</key>
1514 <string>cb800ce00f9a5bdeff3371f14481fa38</string>
1515 <key>url</key>
1516 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/zlib-1.2.3-linux-i686-gcc-4.1-20080915.tar.bz2</uri>
1517 </map>
1518 <key>linux64</key>
1519 <map>
1520 <key>md5sum</key>
1521 <string>4bddfb2c6dd7b1470a3ed675ac14bd9a</string>
1522 <key>url</key>
1523 <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/zlib-1.2.3-linux64-20080909.tar.bz2</uri>
1075 </map> 1524 </map>
1076 <key>windows</key> 1525 <key>windows</key>
1077 <map> 1526 <map>
@@ -1085,6 +1534,11 @@ anguage Infrstructure (CLI) international standard</string>
1085 </map> 1534 </map>
1086 <key>licenses</key> 1535 <key>licenses</key>
1087 <map> 1536 <map>
1537 <key>AFL2.1</key>
1538 <map>
1539 <key>url</key>
1540 <string>http://opensource-definition.org/licenses/afl-2.1.html</string>
1541 </map>
1088 <key>GL</key> 1542 <key>GL</key>
1089 <map> 1543 <map>
1090 <key>url</key> 1544 <key>url</key>
diff --git a/linden/scripts/install.py b/linden/scripts/install.py
index 0cc2fad..3e8f9bb 100755
--- a/linden/scripts/install.py
+++ b/linden/scripts/install.py
@@ -37,6 +37,7 @@ import copy
37import md5 37import md5
38import optparse 38import optparse
39import os 39import os
40import platform
40import pprint 41import pprint
41import shutil 42import shutil
42import sys 43import sys
@@ -308,6 +309,13 @@ class Installer(object):
308 "Return a list of installed packages." 309 "Return a list of installed packages."
309 return self._installed.keys() 310 return self._installed.keys()
310 311
312 def detail_installed(self, name):
313 "Return file list for specific installed package."
314 filelist = []
315 for url in self._installed[name]._installed.keys():
316 filelist.extend(self._installed[name].files_in(url))
317 return filelist
318
311 def _update_field(self, description, field, value, multiline=False): 319 def _update_field(self, description, field, value, multiline=False):
312 """Given a block and a field name, add or update it. 320 """Given a block and a field name, add or update it.
313 @param description a dict containing all the details of a description. 321 @param description a dict containing all the details of a description.
@@ -458,7 +466,12 @@ windows/i686/vs/2003 -- specify a windows visual studio 2003 package"""
458 if not self._dryrun: 466 if not self._dryrun:
459 if os.path.exists(filename): 467 if os.path.exists(filename):
460 remove_dir_set.add(os.path.dirname(filename)) 468 remove_dir_set.add(os.path.dirname(filename))
461 os.remove(filename) 469 try:
470 os.remove(filename)
471 except OSError:
472 # This is just for cleanup, so we don't care
473 # about normal failures.
474 pass
462 for dirname in remove_dir_set: 475 for dirname in remove_dir_set:
463 try: 476 try:
464 os.removedirs(dirname) 477 os.removedirs(dirname)
@@ -730,7 +743,23 @@ def _get_platform():
730 'cygwin' : 'windows', 743 'cygwin' : 'windows',
731 'solaris' : 'solaris' 744 'solaris' : 'solaris'
732 } 745 }
733 return platform_map[sys.platform] 746 this_platform = platform_map[sys.platform]
747 if this_platform == 'linux':
748 if platform.architecture()[0] == '64bit':
749 # TODO -- someday when install.py accepts a platform of the form
750 # os/arch/compiler/compiler_version then we can replace the
751 # 'linux64' platform with 'linux/x86_64/gcc/4.1'
752 this_platform = 'linux64'
753 else:
754 gcc_version = os.popen("g++ -dumpversion", 'r').read()[:-3]
755 if gcc_version == '4.1':
756 # the 'linux32' platform is a HACK until we can figure
757 # out how to make the install.py script accept a platform of
758 # the form os/arch/compiler/compiler_version for the download
759 # and extract stage
760 #this_platform = 'linux/i686/gcc/4.1'
761 this_platform = 'linux32'
762 return this_platform
734 763
735def _getuser(): 764def _getuser():
736 "Get the user" 765 "Get the user"
@@ -971,6 +1000,12 @@ Ignored if --add-installable or --add-installable-package is not specified.""")
971 dest='detail_installable', 1000 dest='detail_installable',
972 help="Get detailed information on specified installable and exit.") 1001 help="Get detailed information on specified installable and exit.")
973 parser.add_option( 1002 parser.add_option(
1003 '--detail-installed',
1004 type='string',
1005 default=None,
1006 dest='detail_installed',
1007 help="Get list of files for specified installed installable and exit.")
1008 parser.add_option(
974 '--uninstall', 1009 '--uninstall',
975 action='store_true', 1010 action='store_true',
976 default=False, 1011 default=False,
@@ -1012,6 +1047,17 @@ def main():
1012 print "Installable '"+options.detail_installable+"' not found in", 1047 print "Installable '"+options.detail_installable+"' not found in",
1013 print "install file." 1048 print "install file."
1014 return 0 1049 return 0
1050 if options.detail_installed:
1051 try:
1052 detail = installer.detail_installed(options.detail_installed)
1053 #print "Detail on installed",options.detail_installed+":"
1054 for line in detail:
1055 print line
1056 except:
1057 raise
1058 print "Installable '"+options.detail_installed+"' not found in ",
1059 print "install file."
1060 return 0
1015 if options.list_licenses: 1061 if options.list_licenses:
1016 print "license list:", installer.list_licenses() 1062 print "license list:", installer.list_licenses()
1017 return 0 1063 return 0
diff --git a/linden/scripts/template_verifier.py b/linden/scripts/template_verifier.py
index f1f3953..d451cbf 100755
--- a/linden/scripts/template_verifier.py
+++ b/linden/scripts/template_verifier.py
@@ -38,13 +38,35 @@ If [FILE] [FILE] is specified, two local files will be checked against
38each other. 38each other.
39""" 39"""
40 40
41from os.path import realpath, dirname, join, exists 41import sys
42setup_path = join(dirname(realpath(__file__)), "setup-path.py") 42import os.path
43if exists(setup_path): 43
44 execfile(setup_path) 44# Look for indra/lib/python in all possible parent directories ...
45# This is an improvement over the setup-path.py method used previously:
46# * the script may blocated anywhere inside the source tree
47# * it doesn't depend on the current directory
48# * it doesn't depend on another file being present.
49
50root = os.path.abspath(__file__)
51# always insert the directory of the script in the search path
52dir = os.path.dirname(root)
53if dir not in sys.path:
54 sys.path.insert(0, dir)
55
56# Now go look for indra/lib/python in the parent dies
57while root != os.path.sep:
58 root = os.path.dirname(root)
59 dir = os.path.join(root, 'indra', 'lib', 'python')
60 if os.path.isdir(dir):
61 if dir not in sys.path:
62 sys.path.insert(0, dir)
63 break
64else:
65 print >>sys.stderr, "This script is not inside a valid installation."
66 sys.exit(1)
67
45import optparse 68import optparse
46import os 69import os
47import sys
48import urllib 70import urllib
49 71
50from indra.ipc import compatibility 72from indra.ipc import compatibility