diff --git a/.hgtags b/.hgtags index 05ef9ce9bcd5037a98b222097497a11b49e1045a..d5726615d243aa51bbeb1b2da1849316c95bb89c 100644 --- a/.hgtags +++ b/.hgtags @@ -122,12 +122,22 @@ dac76a711da5f1489a01c1fa62ec97d99c25736d 2.6.6-release 8f2da1701c81a62352df2b8d413d27fb2cade9a6 DRTVWR-46_2.6.3-release 8f2da1701c81a62352df2b8d413d27fb2cade9a6 2.6.3-release 77e5a08344c95738ab879f9671b7758cddd712a3 DRTVWR-56_2.6.9-release +77e5a08344c95738ab879f9671b7758cddd712a3 2.6.9-release 8835e0e3c0d3a48244c287bc05811dfc2fba43ec 2.7.0-start 43c7ee846b7eed80786acbbf35d03bd016a3e85d DRTVWR-59_2.7.0-beta1 43c7ee846b7eed80786acbbf35d03bd016a3e85d 2.7.0-beta1 -77e5a08344c95738ab879f9671b7758cddd712a3 2.6.9-release 54fd44ac92e4c61435ea33effe093a3527e18d98 2.7.1-start 0c4d0c24278074f219e5a32e72b449e78301d11b DRTVWR-61_2.7.1-beta1 0c4d0c24278074f219e5a32e72b449e78301d11b 2.7.1-beta1 9f79a6ed8fdcd2f3dac33ea6b3236eeb278dccfe 2.7.2-start +e0dc8b741eaa27dcdfbc9e956bb2579b954d15eb DRTVWR-63_2.7.2-beta1 +e0dc8b741eaa27dcdfbc9e956bb2579b954d15eb 2.7.2-beta1 6a3e7e403bd19e45fdfc2fcc716867af3ab80861 2.7.3-start +6af10678de4736222b2c3f7e010e984fb5b327de 2.7.4-start +be963a4eef635542f9617d7f5fd22ba48fb71958 DRTVWR-67_2.7.4-beta1 +be963a4eef635542f9617d7f5fd22ba48fb71958 2.7.4-beta1 +a9abb9633a266c8d2fe62411cfd1c86d32da72bf DRTVWR-60_2.7.1-release +be963a4eef635542f9617d7f5fd22ba48fb71958 DRTVWR-67_2.7.4-beta1 +be963a4eef635542f9617d7f5fd22ba48fb71958 2.7.4-beta1 +a9abb9633a266c8d2fe62411cfd1c86d32da72bf 2.7.1-release +19a498fa62570f352d7d246f17e3c81cc1d82d8b 2.7.5-start diff --git a/BuildParams b/BuildParams index c303bd2e5ef364e5147821aad537de508266ee6f..88d2c02780027d477730c8db4b586565cb7f68ff 100644 --- a/BuildParams +++ b/BuildParams @@ -69,29 +69,9 @@ viewer-pre-release.viewer_channel = "Second Life Release" viewer-pre-release.login_channel = "Second Life Release" viewer-pre-release.build_debug_release_separately = true viewer-pre-release.build_viewer_update_version_manager = true -#viewer-pre-release.release-viewer.jira = DRTVWR-13 -viewer-pre-release.release-viewer.jira = DRTVWR-46 +#viewer-pre-release.release-viewer.jira = DRTVWR-46 -# ======================================= -# brad -# ======================================== -debug-halting.email = cg@lindenlab.com -debug-halting.build_server = false -debug-halting.build_server_tests = false -debug-halting.build_Darwin = false -debug-halting.build_Linux = false -debug-halting.build_CYGWIN_Debug = false -debug-halting.build_CYGWIN_RelWithDebInfo = false - -# ======================================== -# brad -# ======================================== - -brad-parabuild.email = brad@lindenlab.com -brad-parabuild.build_server = false -brad-parabuild.build_server_tests = false - # ======================================== # mesh-development # ======================================== @@ -102,6 +82,16 @@ mesh-development.build_debug_release_separately = true mesh-development.build_CYGWIN_Debug = false mesh-development.build_viewer_update_version_manager = false +# ======================================== +# mesh-asset-deprecation +# ======================================== +mesh-asset-deprecation.viewer_channel = "Project Viewer - Mesh Asset Deprecation" +mesh-asset-deprecation.login_channel = "Project Viewer - Mesh Asset Deprecation" +mesh-asset-deprecation.viewer_grid = aditi +mesh-asset-deprecation.build_debug_release_separately = true +mesh-asset-deprecation.build_CYGWIN_Debug = false +mesh-asset-deprecation.build_viewer_update_version_manager = false + # ======================================== # viewer-mesh # ======================================== @@ -123,73 +113,31 @@ viewer-mesh.email = shining@lists.lindenlab.com # CG # ======================================== -cg_viewer-development_lenny.collect_metrics = true cg_viewer-development_lenny.show_changes_since = 4b140ce7839d cg_viewer-development_lenny.email = cg@lindenlab.com -# ======================================== -# gooey -# ======================================== - -#gooey.email = james@lindenlab.com -gooey.build_Debug = false -gooey.build_RelWithDebInfo = false -gooey.build_server = false -gooey.build_server_tests = false -gooey.viewer_channel = "Second Life Alpha" -gooey.login_channel = "Second Life Alpha" -gooey.viewer_grid = agni -gooey.build_viewer_update_version_manager = false - -# ======================================== -# Search Project -# ======================================== - -search_project-viewer.build_debug_release_separately = true -search_project-viewer.viewer_channel = "Second Life Project Viewer - Search" -search_project-viewer.login_channel = "Second Life Project Viewer - Search" - -# ======================================== -# palange -# ======================================== - -palange_viewer-2-0.email = palange@lindenlab.com -palange_viewer-2-0.build_server = false -palange_viewer-2-0.build_server_tests = false -palange_viewer-2-0.build_CYGWIN_Debug = false - -# ======================================== -# media -# ======================================== - -media.email = skolb@lindenlab.com -media.build_server = false -media.build_server_tests = false -media.viewer_channel = "Second Life Alpha" -media.login_channel = "Second Life Alpha" -media.viewer_grid = agni -media.build_viewer_update_version_manager = false - # ================ # oz # ================ oz_viewer-devreview.build_debug_release_separately = true +oz_viewer-devreview.codeticket_add_context = false + oz_project-1.build_debug_release_separately = true +oz_project-1.codeticket_add_context = false oz_project-2.build_debug_release_separately = true -oz-project-3.build_debug_release_separately = true +oz_project-2.codeticket_add_context = false +oz_project-3.build_debug_release_separately = true +oz_project-3.codeticket_add_context = false +oz_project-4.build_debug_release_separately = true +oz_project-4.codeticket_add_context = false + oz_viewer-beta-review.build_debug_release_separately = true +oz_viewer-beta-review.codeticket_add_context = false + oz_viewer-poreview.build_debug_release_separately = true oz_viewer-poreview.codeticket_add_context = false -# ======================================== -# enus -# ======================================== - -viewer-tut-teamcity.email = enus@lindenlab.com -viewer-tut-teamcity.build_server = false -viewer-tut-teamcity.build_server_tests = false - # ================================================================= # asset delivery 2010 projects # ================================================================= @@ -207,23 +155,4 @@ viewer-asset-delivery-metrics.email = monty@lindenlab.com viewer-asset-delivery-metrics.build_server = false viewer-asset-delivery-metrics.build_server_tests = false -#============================================================================== -# autobuild viewers -#============================================================================== -viewer-autobuild2010.build_debug_release_separately = true -viewer-autobuild2010.viewer_channel = "Project Viewer - VS2010" -viewer-autobuild2010.login_channel = "Project Viewer - VS2010" -viewer-autobuild2010.viewer_grid = agni -viewer-autobuild2010.build_link_parallel = false - -#======================================== -# VS2010 -#======================================== -viewer-vs2010.viewer_channel = "Project Viewer - VS2010" -viewer-vs2010.login_channel = "Project Viewer - VS2010" -viewer-vs2010.viewer_grid = agni -viewer-vs2010.build_debug_release_separately = true -viewer-vs2010.build_viewer_update_version_manager = false -viewer-vs2010.build_link_parallel = false - # eof diff --git a/autobuild.xml b/autobuild.xml index ec52d6e33156d7670b496f52df4aa0884e064937..63701dae790b44836b7ff56166d2db069affd987 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -18,9 +18,9 @@ <key>archive</key> <map> <key>hash</key> - <string>930bdd987a321eda1838caba8cd6098f</string> + <string>b2fe1c860613a68e74d4384be418ffee</string> <key>url</key> - <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-glod/rev/230348/arch/Darwin/installer/glod-1.0pre4-darwin-20110519.tar.bz2</string> + <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-glod/rev/232684/arch/Darwin/installer/glod-1.0pre4-darwin-20110610.tar.bz2</string> </map> <key>name</key> <string>darwin</string> @@ -30,9 +30,9 @@ <key>archive</key> <map> <key>hash</key> - <string>fb33b6cac2e6b98f93c5efa2af2e5a00</string> + <string>c0c64dae149d0892343e2ff300fd06b9</string> <key>url</key> - <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-glod/rev/230348/arch/Linux/installer/glod-1.0pre4-linux-20110519.tar.bz2</string> + <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-glod/rev/232684/arch/Linux/installer/glod-1.0pre4-linux-20110611.tar.bz2</string> </map> <key>name</key> <string>linux</string> @@ -42,9 +42,9 @@ <key>archive</key> <map> <key>hash</key> - <string>388cf0e292f756b4bb37696622f0bbc5</string> + <string>842208365f5b108dac4c7c733b99da9c</string> <key>url</key> - <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-glod/rev/230348/arch/CYGWIN/installer/glod-1.0pre4-windows-20110519.tar.bz2</string> + <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-glod/rev/232684/arch/CYGWIN/installer/glod-1.0pre4-windows-20110610.tar.bz2</string> </map> <key>name</key> <string>windows</string> @@ -1290,9 +1290,9 @@ <key>archive</key> <map> <key>hash</key> - <string>c81bacf922bb3b540d92b660364c48ce</string> + <string>9bf7a96c1d2fadb180fda91740c945c6</string> <key>url</key> - <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/ndofdev-linux-0.2-20101013.tar.bz2</string> + <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-libndofdev-linux/rev/233137/arch/Linux/installer/libndofdev-0.3-linux-20110617.tar.bz2</string> </map> <key>name</key> <string>linux</string> @@ -1524,7 +1524,7 @@ <key>hash</key> <string>bb0abe962b3b8208ed2dab0424aab33d</string> <key>url</key> - <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-pcre/rev/228822/arch/Linux/installer/pcre-7.6-linux-20110504.tar.bz2</string> + <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-pcre/rev/228822/arch/Linux/installer/pcre-7.6-linux-20110504.tar.bz2</string> </map> <key>name</key> <string>linux</string> diff --git a/doc/contributions.txt b/doc/contributions.txt index daaffe2dee29668fff45de00afd806e32446c3be..729c73f7778e88d5f887246391488eb361ef2d12 100644 --- a/doc/contributions.txt +++ b/doc/contributions.txt @@ -158,6 +158,7 @@ Ann Congrejo CT-193 Ansariel Hiller STORM-1101 + VWR-25480 Ardy Lay STORM-859 VWR-19499 @@ -442,6 +443,15 @@ Jonathan Yap STORM-1095 STORM-1236 STORM-1259 + STORM-787 + VWR-25480 + STORM-1334 + STORM-1313 + STORM-899 + STORM-1273 + STORM-1292 + STORM-1302 + STORM-1326 Kage Pixel VWR-11 Ken March @@ -851,6 +861,7 @@ Twisted Laws STORM-844 STORM-643 STORM-954 + STORM-1103 Vadim Bigbear VWR-2681 Vector Hastings @@ -905,6 +916,7 @@ WolfPup Lowenhar STORM-825 STORM-859 STORM-1098 + STORM-1393 VWR-20741 VWR-20933 Zai Lynch diff --git a/indra/llcommon/llaccountingquota.h b/indra/llcommon/llaccountingquota.h index 3401cb57b636d3cef36e3c04e4dbe8bb11c5282a..140333de07535a12d5fbe667ed1833b6cb055dd4 100644 --- a/indra/llcommon/llaccountingquota.h +++ b/indra/llcommon/llaccountingquota.h @@ -29,30 +29,38 @@ struct ParcelQuota { - ParcelQuota( F32 ownerRenderCost, F32 ownerPhysicsCost, F32 ownerNetworkCost, F32 ownerSimulationCost, - F32 groupRenderCost, F32 groupPhysicsCost, F32 groupNetworkCost, F32 groupSimulationCost, - F32 otherRenderCost, F32 otherPhysicsCost, F32 otherNetworkCost, F32 otherSimulationCost, - F32 totalRenderCost, F32 totalPhysicsCost, F32 totalNetworkCost, F32 totalSimulationCost) + ParcelQuota( F32 ownerRenderCost, F32 ownerPhysicsCost, F32 ownerNetworkCost, F32 ownerSimulationCost, + F32 groupRenderCost, F32 groupPhysicsCost, F32 groupNetworkCost, F32 groupSimulationCost, + F32 otherRenderCost, F32 otherPhysicsCost, F32 otherNetworkCost, F32 otherSimulationCost, + F32 tempRenderCost, F32 tempPhysicsCost, F32 tempNetworkCost, F32 tempSimulationCost, + F32 selectedRenderCost, F32 selectedPhysicsCost, F32 selectedNetworkCost, F32 selectedSimulationCost, + F32 parcelCapacity ) : mOwnerRenderCost( ownerRenderCost ), mOwnerPhysicsCost( ownerPhysicsCost ) , mOwnerNetworkCost( ownerNetworkCost ), mOwnerSimulationCost( ownerSimulationCost ) , mGroupRenderCost( groupRenderCost ), mGroupPhysicsCost( groupPhysicsCost ) , mGroupNetworkCost( groupNetworkCost ), mGroupSimulationCost( groupSimulationCost ) , mOtherRenderCost( otherRenderCost ), mOtherPhysicsCost( otherPhysicsCost ) , mOtherNetworkCost( otherNetworkCost ), mOtherSimulationCost( otherSimulationCost ) - , mTotalRenderCost( totalRenderCost ), mTotalPhysicsCost( totalPhysicsCost ) - , mTotalNetworkCost( totalNetworkCost ), mTotalSimulationCost( totalSimulationCost ) + , mTempRenderCost( tempRenderCost ), mTempPhysicsCost( tempPhysicsCost ) + , mTempNetworkCost( tempNetworkCost ), mTempSimulationCost( tempSimulationCost ) + , mSelectedRenderCost( tempRenderCost ), mSelectedPhysicsCost( tempPhysicsCost ) + , mSelectedNetworkCost( tempNetworkCost ), mSelectedSimulationCost( selectedSimulationCost ) + , mParcelCapacity( parcelCapacity ) { } + ParcelQuota(){} F32 mOwnerRenderCost, mOwnerPhysicsCost, mOwnerNetworkCost, mOwnerSimulationCost; F32 mGroupRenderCost, mGroupPhysicsCost, mGroupNetworkCost, mGroupSimulationCost; F32 mOtherRenderCost, mOtherPhysicsCost, mOtherNetworkCost, mOtherSimulationCost; - F32 mTotalRenderCost, mTotalPhysicsCost, mTotalNetworkCost, mTotalSimulationCost; + F32 mTempRenderCost, mTempPhysicsCost, mTempNetworkCost, mTempSimulationCost; + F32 mSelectedRenderCost, mSelectedPhysicsCost, mSelectedNetworkCost, mSelectedSimulationCost; + F32 mParcelCapacity; }; struct SelectionQuota { - SelectionQuota( S32 localId, F32 renderCost, F32 physicsCost, F32 networkCost, F32 simulationCost ) + SelectionQuota( LLUUID localId, F32 renderCost, F32 physicsCost, F32 networkCost, F32 simulationCost ) : mLocalId( localId) , mRenderCost( renderCost ) , mPhysicsCost( physicsCost ) @@ -63,7 +71,7 @@ struct SelectionQuota SelectionQuota() {} F32 mRenderCost, mPhysicsCost, mNetworkCost, mSimulationCost; - S32 mLocalId; + LLUUID mLocalId; }; #endif diff --git a/indra/llcommon/llsdserialize.cpp b/indra/llcommon/llsdserialize.cpp index 5be5ecc492f6795e91e13660f49f677232e0110e..bf626005143565b67d42fdf45ddec516cc743067 100644 --- a/indra/llcommon/llsdserialize.cpp +++ b/indra/llcommon/llsdserialize.cpp @@ -2036,7 +2036,9 @@ std::string zip_llsd(LLSD& data) { //copy result into output if (strm.avail_out >= CHUNK) { - llerrs << "WTF?" << llendl; + free(output); + llwarns << "Failed to compress LLSD block." << llendl; + return std::string(); } have = CHUNK-strm.avail_out; diff --git a/indra/llcommon/llstat.cpp b/indra/llcommon/llstat.cpp index 8ba97d7730e9ed29856a94d74788ee5255125dc3..b2c495d093ebdbcb3fab98262f91ad0fd4114761 100644 --- a/indra/llcommon/llstat.cpp +++ b/indra/llcommon/llstat.cpp @@ -737,7 +737,7 @@ void LLPerfBlock::addStatsToLLSDandReset( LLSD & stats, } } else - { // WTF? Shouldn't have a NULL pointer in the map. + { // Shouldn't have a NULL pointer in the map. llwarns << "Unexpected NULL dynamic stat at '" << stats_full_path << "'" << llendl; } } diff --git a/indra/llcommon/llversionviewer.h b/indra/llcommon/llversionviewer.h index cfafbf0470fdbb47bf331185922d13447b7bdac4..69720bb903224757c1113b8eed6bb612bae88602 100644 --- a/indra/llcommon/llversionviewer.h +++ b/indra/llcommon/llversionviewer.h @@ -29,7 +29,7 @@ const S32 LL_VERSION_MAJOR = 2; const S32 LL_VERSION_MINOR = 7; -const S32 LL_VERSION_PATCH = 4; +const S32 LL_VERSION_PATCH = 6; const S32 LL_VERSION_BUILD = 0; const char * const LL_CHANNEL = "Second Life Developer"; diff --git a/indra/llmath/lloctree.h b/indra/llmath/lloctree.h index fdfc24f8b7fbe14c676904d914652f4acb03d213..e5ca47da698efca948d96cc28998790c0b6e9185 100644 --- a/indra/llmath/lloctree.h +++ b/indra/llmath/lloctree.h @@ -35,12 +35,14 @@ #define OCT_ERRS LL_WARNS("OctreeErrors") -#define LL_OCTREE_PARANOIA_CHECK 0 + +extern U32 gOctreeMaxCapacity; +/*#define LL_OCTREE_PARANOIA_CHECK 0 #if LL_DARWIN #define LL_OCTREE_MAX_CAPACITY 32 #else #define LL_OCTREE_MAX_CAPACITY 128 -#endif +#endif*/ template <class T> class LLOctreeNode; @@ -74,6 +76,7 @@ template <class T> class LLOctreeNode : public LLTreeNode<T> { public: + typedef LLOctreeTraveler<T> oct_traveler; typedef LLTreeTraveler<T> tree_traveler; typedef typename std::set<LLPointer<T> > element_list; @@ -294,8 +297,8 @@ class LLOctreeNode : public LLTreeNode<T> //is it here? if (isInside(data->getPositionGroup())) { - if ((getElementCount() < LL_OCTREE_MAX_CAPACITY && contains(data->getBinRadius()) || - (data->getBinRadius() > getSize()[0] && parent && parent->getElementCount() >= LL_OCTREE_MAX_CAPACITY))) + if ((getElementCount() < gOctreeMaxCapacity && contains(data->getBinRadius()) || + (data->getBinRadius() > getSize()[0] && parent && parent->getElementCount() >= gOctreeMaxCapacity))) { //it belongs here #if LL_OCTREE_PARANOIA_CHECK //if this is a redundant insertion, error out (should never happen) diff --git a/indra/llmath/llvolume.cpp b/indra/llmath/llvolume.cpp index c504215ee5252f9c7ccf315395e4b721ef5b1bbe..8c81f2778495e12a2a6fd3e7e7a329a407c981a1 100644 --- a/indra/llmath/llvolume.cpp +++ b/indra/llmath/llvolume.cpp @@ -100,7 +100,7 @@ void assert_aligned(void* ptr, uintptr_t alignment) uintptr_t t = (uintptr_t) ptr; if (t%alignment != 0) { - llerrs << "WTF?" << llendl; + llerrs << "Alignment check failed." << llendl; } #endif } @@ -361,7 +361,7 @@ class LLVolumeOctreeRebound : public LLOctreeTravelerDepthFirst<LLVolumeTriangle } else { - llerrs << "WTF? Empty leaf" << llendl; + llerrs << "Empty leaf" << llendl; } for (S32 i = 0; i < branch->getChildCount(); ++i) @@ -416,6 +416,70 @@ LLProfile::Face* LLProfile::addFace(S32 i, S32 count, F32 scaleU, S16 faceID, BO return face; } +//static +S32 LLProfile::getNumNGonPoints(const LLProfileParams& params, S32 sides, F32 offset, F32 bevel, F32 ang_scale, S32 split) +{ // this is basically LLProfile::genNGon stripped down to only the operations that influence the number of points + LLMemType m1(LLMemType::MTYPE_VOLUME); + S32 np = 0; + + // Generate an n-sided "circular" path. + // 0 is (1,0), and we go counter-clockwise along a circular path from there. + F32 t, t_step, t_first, t_fraction; + + F32 begin = params.getBegin(); + F32 end = params.getEnd(); + + t_step = 1.0f / sides; + + t_first = floor(begin * sides) / (F32)sides; + + // pt1 is the first point on the fractional face. + // Starting t and ang values for the first face + t = t_first; + + // Increment to the next point. + // pt2 is the end point on the fractional face + t += t_step; + + t_fraction = (begin - t_first)*sides; + + // Only use if it's not almost exactly on an edge. + if (t_fraction < 0.9999f) + { + np++; + } + + // There's lots of potential here for floating point error to generate unneeded extra points - DJS 04/05/02 + while (t < end) + { + // Iterate through all the integer steps of t. + np++; + + t += t_step; + } + + t_fraction = (end - (t - t_step))*sides; + + // Find the fraction that we need to add to the end point. + t_fraction = (end - (t - t_step))*sides; + if (t_fraction > 0.0001f) + { + np++; + } + + // If we're sliced, the profile is open. + if ((end - begin)*ang_scale < 0.99f) + { + if (params.getHollow() <= 0) + { + // put center point if not hollow. + np++; + } + } + + return np; +} + // What is the bevel parameter used for? - DJS 04/05/02 // Bevel parameter is currently unused but presumedly would support // filleted and chamfered corners @@ -672,6 +736,117 @@ LLProfile::Face* LLProfile::addHole(const LLProfileParams& params, BOOL flat, F3 return face; } +//static +S32 LLProfile::getNumPoints(const LLProfileParams& params, BOOL path_open,F32 detail, S32 split, + BOOL is_sculpted, S32 sculpt_size) +{ // this is basically LLProfile::generate stripped down to only operations that influence the number of points + LLMemType m1(LLMemType::MTYPE_VOLUME); + + if (detail < MIN_LOD) + { + detail = MIN_LOD; + } + + // Generate the face data + F32 hollow = params.getHollow(); + + S32 np = 0; + + switch (params.getCurveType() & LL_PCODE_PROFILE_MASK) + { + case LL_PCODE_PROFILE_SQUARE: + { + np = getNumNGonPoints(params, 4,-0.375, 0, 1, split); + + if (hollow) + { + np *= 2; + } + } + break; + case LL_PCODE_PROFILE_ISOTRI: + case LL_PCODE_PROFILE_RIGHTTRI: + case LL_PCODE_PROFILE_EQUALTRI: + { + np = getNumNGonPoints(params, 3,0, 0, 1, split); + + if (hollow) + { + np *= 2; + } + } + break; + case LL_PCODE_PROFILE_CIRCLE: + { + // If this has a square hollow, we should adjust the + // number of faces a bit so that the geometry lines up. + U8 hole_type=0; + F32 circle_detail = MIN_DETAIL_FACES * detail; + if (hollow) + { + hole_type = params.getCurveType() & LL_PCODE_HOLE_MASK; + if (hole_type == LL_PCODE_HOLE_SQUARE) + { + // Snap to the next multiple of four sides, + // so that corners line up. + circle_detail = llceil(circle_detail / 4.0f) * 4.0f; + } + } + + S32 sides = (S32)circle_detail; + + if (is_sculpted) + sides = sculpt_size; + + np = getNumNGonPoints(params, sides); + + if (hollow) + { + np *= 2; + } + } + break; + case LL_PCODE_PROFILE_CIRCLE_HALF: + { + // If this has a square hollow, we should adjust the + // number of faces a bit so that the geometry lines up. + U8 hole_type=0; + // Number of faces is cut in half because it's only a half-circle. + F32 circle_detail = MIN_DETAIL_FACES * detail * 0.5f; + if (hollow) + { + hole_type = params.getCurveType() & LL_PCODE_HOLE_MASK; + if (hole_type == LL_PCODE_HOLE_SQUARE) + { + // Snap to the next multiple of four sides (div 2), + // so that corners line up. + circle_detail = llceil(circle_detail / 2.0f) * 2.0f; + } + } + np = getNumNGonPoints(params, llfloor(circle_detail), 0.5f, 0.f, 0.5f); + + if (hollow) + { + np *= 2; + } + + // Special case for openness of sphere + if ((params.getEnd() - params.getBegin()) < 1.f) + { + } + else if (!hollow) + { + np++; + } + } + break; + default: + break; + }; + + + return np; +} BOOL LLProfile::generate(const LLProfileParams& params, BOOL path_open,F32 detail, S32 split, @@ -1133,6 +1308,32 @@ LLPath::~LLPath() { } +S32 LLPath::getNumNGonPoints(const LLPathParams& params, S32 sides, F32 startOff, F32 end_scale, F32 twist_scale) +{ //this is basically LLPath::genNGon stripped down to only operations that influence the number of points added + S32 ret = 0; + + F32 step= 1.0f / sides; + F32 t = params.getBegin(); + ret = 1; + + t+=step; + + // Snap to a quantized parameter, so that cut does not + // affect most sample points. + t = ((S32)(t * sides)) / (F32)sides; + + // Run through the non-cut dependent points. + while (t < params.getEnd()) + { + ret++; + t+=step; + } + + ret++; + + return ret; +} + void LLPath::genNGon(const LLPathParams& params, S32 sides, F32 startOff, F32 end_scale, F32 twist_scale) { // Generates a circular path, starting at (1, 0, 0), counterclockwise along the xz plane. @@ -1310,6 +1511,56 @@ const LLVector2 LLPathParams::getEndScale() const return end_scale; } +S32 LLPath::getNumPoints(const LLPathParams& params, F32 detail) +{ // this is basically LLPath::generate stripped down to only the operations that influence the number of points + LLMemType m1(LLMemType::MTYPE_VOLUME); + + if (detail < MIN_LOD) + { + detail = MIN_LOD; + } + + S32 np = 2; // hardcode for line + + // Is this 0xf0 mask really necessary? DK 03/02/05 + + switch (params.getCurveType() & 0xf0) + { + default: + case LL_PCODE_PATH_LINE: + { + // Take the begin/end twist into account for detail. + np = llfloor(fabs(params.getTwistBegin() - params.getTwist()) * 3.5f * (detail-0.5f)) + 2; + } + break; + + case LL_PCODE_PATH_CIRCLE: + { + // Increase the detail as the revolutions and twist increase. + F32 twist_mag = fabs(params.getTwistBegin() - params.getTwist()); + + S32 sides = (S32)llfloor(llfloor((MIN_DETAIL_FACES * detail + twist_mag * 3.5f * (detail-0.5f))) * params.getRevolutions()); + + np = sides; + } + break; + + case LL_PCODE_PATH_CIRCLE2: + { + //genNGon(params, llfloor(MIN_DETAIL_FACES * detail), 4.f, 0.f); + np = getNumNGonPoints(params, llfloor(MIN_DETAIL_FACES * detail)); + } + break; + + case LL_PCODE_PATH_TEST: + + np = 5; + break; + }; + + return np; +} + BOOL LLPath::generate(const LLPathParams& params, F32 detail, S32 split, BOOL is_sculpted, S32 sculpt_size) { @@ -2159,27 +2410,41 @@ bool LLVolume::unpackVolumeFaces(std::istream& is, S32 size) U32 face_count = mdl.size(); if (face_count == 0) - { - llerrs << "WTF?" << llendl; + { //no faces unpacked, treat as failed decode + llwarns << "found no faces!" << llendl; + return false; } mVolumeFaces.resize(face_count); for (U32 i = 0; i < face_count; ++i) { + LLVolumeFace& face = mVolumeFaces[i]; + + if (mdl[i].has("NoGeometry")) + { //face has no geometry, continue + face.resizeIndices(3); + face.resizeVertices(1); + memset(face.mPositions, 0, sizeof(LLVector4a)); + memset(face.mNormals, 0, sizeof(LLVector4a)); + memset(face.mTexCoords, 0, sizeof(LLVector2)); + memset(face.mIndices, 0, sizeof(U16)*3); + continue; + } + LLSD::Binary pos = mdl[i]["Position"]; LLSD::Binary norm = mdl[i]["Normal"]; LLSD::Binary tc = mdl[i]["TexCoord0"]; LLSD::Binary idx = mdl[i]["TriangleList"]; - LLVolumeFace& face = mVolumeFaces[i]; + //copy out indices face.resizeIndices(idx.size()/2); if (idx.empty() || face.mNumIndices < 3) { //why is there an empty index list? - llerrs <<"WTF?" << llendl; + llwarns <<"Empty face present!" << llendl; continue; } @@ -2377,14 +2642,20 @@ bool LLVolume::unpackVolumeFaces(std::istream& is, S32 size) LLVector4a& min = face.mExtents[0]; LLVector4a& max = face.mExtents[1]; - min.clear(); - max.clear(); - min = max = face.mPositions[0]; - - for (S32 i = 1; i < face.mNumVertices; ++i) + if (face.mNumVertices < 3) + { //empty face, use a dummy 1cm (at 1m scale) bounding box + min.splat(-0.005f); + max.splat(0.005f); + } + else { - min.setMin(min, face.mPositions[i]); - max.setMax(max, face.mPositions[i]); + min = max = face.mPositions[0]; + + for (S32 i = 1; i < face.mNumVertices; ++i) + { + min.setMin(min, face.mPositions[i]); + max.setMax(max, face.mPositions[i]); + } } } } @@ -2980,7 +3251,11 @@ void LLVolume::sculpt(U16 sculpt_width, U16 sculpt_height, S8 sculpt_components, // don't test lowest LOD to support legacy content DEV-33670 if (mDetail > SCULPT_MIN_AREA_DETAIL) { - if (sculptGetSurfaceArea() < SCULPT_MIN_AREA) + F32 area = sculptGetSurfaceArea(); + + const F32 SCULPT_MAX_AREA = 32.f; + + if (area < SCULPT_MIN_AREA || area > SCULPT_MAX_AREA) { data_is_empty = TRUE; } @@ -4064,6 +4339,23 @@ S32 *LLVolume::getTriangleIndices(U32 &num_indices) const return index; } +void LLVolume::getLoDTriangleCounts(const LLVolumeParams& params, S32* counts) +{ //attempt to approximate the number of triangles that will result from generating a volume LoD set for the + //supplied LLVolumeParams -- inaccurate, but a close enough approximation for determining streaming cost + F32 detail[] = {1.f, 1.5f, 2.5f, 4.f}; + for (S32 i = 0; i < 4; i++) + { + S32 count = 0; + S32 path_points = LLPath::getNumPoints(params.getPathParams(), detail[i]); + S32 profile_points = LLProfile::getNumPoints(params.getProfileParams(), false, detail[i]); + + count = (profile_points-1)*2*(path_points-1); + count += profile_points*2; + + counts[i] = count; + } +} + S32 LLVolume::getNumTriangleIndices() const { BOOL profile_open = getProfile().isOpen(); @@ -5220,6 +5512,8 @@ LLVolumeFace::LLVolumeFace() : mOctree(NULL) { mExtents = (LLVector4a*) ll_aligned_malloc_16(sizeof(LLVector4a)*3); + mExtents[0].splat(-0.5f); + mExtents[1].splat(0.5f); mCenter = mExtents+2; } @@ -5741,6 +6035,11 @@ void LLVolumeFace::cacheOptimize() LLVCacheLRU cache; + if (mNumVertices < 3) + { //nothing to do + return; + } + //mapping of vertices to triangles and indices std::vector<LLVCacheVertexData> vertex_data; diff --git a/indra/llmath/llvolume.h b/indra/llmath/llvolume.h index 01bfbd858be72fd6badd82b8e0e335f68b682eba..f67f8f644dfa44185df04ee40361e681f3b15e37 100644 --- a/indra/llmath/llvolume.h +++ b/indra/llmath/llvolume.h @@ -690,6 +690,9 @@ class LLProfile BOOL isFlat(S32 face) const { return (mFaces[face].mCount == 2); } BOOL isOpen() const { return mOpen; } void setDirty() { mDirty = TRUE; } + + static S32 getNumPoints(const LLProfileParams& params, BOOL path_open, F32 detail = 1.0f, S32 split = 0, + BOOL is_sculpted = FALSE, S32 sculpt_size = 0); BOOL generate(const LLProfileParams& params, BOOL path_open, F32 detail = 1.0f, S32 split = 0, BOOL is_sculpted = FALSE, S32 sculpt_size = 0); BOOL isConcave() const { return mConcave; } @@ -714,6 +717,7 @@ class LLProfile protected: void genNormals(const LLProfileParams& params); + static S32 getNumNGonPoints(const LLProfileParams& params, S32 sides, F32 offset=0.0f, F32 bevel = 0.0f, F32 ang_scale = 1.f, S32 split = 0); void genNGon(const LLProfileParams& params, S32 sides, F32 offset=0.0f, F32 bevel = 0.0f, F32 ang_scale = 1.f, S32 split = 0); Face* addHole(const LLProfileParams& params, BOOL flat, F32 sides, F32 offset, F32 box_hollow, F32 ang_scale, S32 split = 0); @@ -756,6 +760,9 @@ class LLPath virtual ~LLPath(); + static S32 getNumPoints(const LLPathParams& params, F32 detail); + static S32 getNumNGonPoints(const LLPathParams& params, S32 sides, F32 offset=0.0f, F32 end_scale = 1.f, F32 twist_scale = 1.f); + void genNGon(const LLPathParams& params, S32 sides, F32 offset=0.0f, F32 end_scale = 1.f, F32 twist_scale = 1.f); virtual BOOL generate(const LLPathParams& params, F32 detail=1.0f, S32 split = 0, BOOL is_sculpted = FALSE, S32 sculpt_size = 0); @@ -981,6 +988,7 @@ class LLVolume : public LLRefCount // returns number of triangle indeces required for path/profile mesh S32 getNumTriangleIndices() const; + static void getLoDTriangleCounts(const LLVolumeParams& params, S32* counts); S32 getNumTriangles() const; diff --git a/indra/llmessage/message_prehash.cpp b/indra/llmessage/message_prehash.cpp index 5d03615e5333bdef27d8873ea92b6e48c872e0ec..6133f506376224648965b7e404139a74195aa118 100644 --- a/indra/llmessage/message_prehash.cpp +++ b/indra/llmessage/message_prehash.cpp @@ -742,6 +742,7 @@ char const* const _PREHASH_MoneyData = LLMessageStringTable::getInstance()->getS char const* const _PREHASH_ObjectDeselect = LLMessageStringTable::getInstance()->getString("ObjectDeselect"); char const* const _PREHASH_NewAssetID = LLMessageStringTable::getInstance()->getString("NewAssetID"); char const* const _PREHASH_ObjectAdd = LLMessageStringTable::getInstance()->getString("ObjectAdd"); +char const* const _PREHASH_SimulatorFeatures = LLMessageStringTable::getInstance()->getString("SimulatorFeatures"); char const* const _PREHASH_RayEndIsIntersection = LLMessageStringTable::getInstance()->getString("RayEndIsIntersection"); char const* const _PREHASH_CompleteAuction = LLMessageStringTable::getInstance()->getString("CompleteAuction"); char const* const _PREHASH_CircuitCode = LLMessageStringTable::getInstance()->getString("CircuitCode"); diff --git a/indra/llmessage/message_prehash.h b/indra/llmessage/message_prehash.h index 8dc86601e6815093a99ea0ffb008f134187ebf42..f94ee1ed22bc7dadb42dc537ed63d2a4fb28950c 100644 --- a/indra/llmessage/message_prehash.h +++ b/indra/llmessage/message_prehash.h @@ -742,6 +742,7 @@ extern char const* const _PREHASH_MoneyData; extern char const* const _PREHASH_ObjectDeselect; extern char const* const _PREHASH_NewAssetID; extern char const* const _PREHASH_ObjectAdd; +extern char const* const _PREHASH_SimulatorFeatures; extern char const* const _PREHASH_RayEndIsIntersection; extern char const* const _PREHASH_CompleteAuction; extern char const* const _PREHASH_CircuitCode; diff --git a/indra/llprimitive/llmodel.cpp b/indra/llprimitive/llmodel.cpp index 57ac7a143f3f6206e192f264378b580d4cc0aaad..0463d5364bd6af6490e4751bb1995315a75b35dc 100644 --- a/indra/llprimitive/llmodel.cpp +++ b/indra/llprimitive/llmodel.cpp @@ -50,7 +50,7 @@ std::string model_names[] = "low_lod", "medium_lod", "high_lod", - "physics_shape" + "physics_mesh" }; const int MODEL_NAMES_LENGTH = sizeof(model_names) / sizeof(std::string); @@ -84,7 +84,7 @@ void load_face_from_dom_inputs(LLVolumeFace& face, const domInputLocalOffset_Arr domInputLocal_Array& v_inp = vertices->getInput_array(); if (inputs[j]->getOffset() != 0) { - llerrs << "WTF?" << llendl; + llerrs << "Vertex array offset MUST be zero." << llendl; } for (U32 k = 0; k < v_inp.getCount(); ++k) @@ -98,7 +98,7 @@ void load_face_from_dom_inputs(LLVolumeFace& face, const domInputLocalOffset_Arr if (src->getTechnique_common()->getAccessor()->getStride() != 3) { - llerrs << "WTF?" << llendl; + llerrs << "Vertex array stride MUST be three." << llendl; } domListOfFloats& v = src->getFloat_array()->getValue(); @@ -149,9 +149,10 @@ void load_face_from_dom_inputs(LLVolumeFace& face, const domInputLocalOffset_Arr } } -void get_dom_sources(const domInputLocalOffset_Array& inputs, S32& pos_offset, S32& tc_offset, S32& norm_offset, S32 &idx_stride, +bool get_dom_sources(const domInputLocalOffset_Array& inputs, S32& pos_offset, S32& tc_offset, S32& norm_offset, S32 &idx_stride, domSource* &pos_source, domSource* &tc_source, domSource* &norm_source) { + idx_stride = 0; for (U32 j = 0; j < inputs.getCount(); ++j) @@ -163,7 +164,11 @@ void get_dom_sources(const domInputLocalOffset_Array& inputs, S32& pos_offset, S const domURIFragmentType& uri = inputs[j]->getSource(); daeElementRef elem = uri.getElement(); domVertices* vertices = (domVertices*) elem.cast(); - + if ( !vertices ) + { + return false; + } + domInputLocal_Array& v_inp = vertices->getInput_array(); @@ -207,6 +212,8 @@ void get_dom_sources(const domInputLocalOffset_Array& inputs, S32& pos_offset, S } idx_stride += 1; + + return true; } LLModel::EModelStatus load_face_from_dom_triangles(std::vector<LLVolumeFace>& face_list, std::vector<std::string>& materials, domTrianglesRef& tri) @@ -227,8 +234,12 @@ LLModel::EModelStatus load_face_from_dom_triangles(std::vector<LLVolumeFace>& fa S32 idx_stride = 0; - get_dom_sources(inputs, pos_offset, tc_offset, norm_offset, idx_stride, pos_source, tc_source, norm_source); + if ( !get_dom_sources(inputs, pos_offset, tc_offset, norm_offset, idx_stride, pos_source, tc_source, norm_source) || !pos_source ) + { + return LLModel::BAD_ELEMENT; + } + domPRef p = tri->getP(); domListOfUInts& idx = p->getValue(); @@ -367,7 +378,10 @@ LLModel::EModelStatus load_face_from_dom_polylist(std::vector<LLVolumeFace>& fac S32 idx_stride = 0; - get_dom_sources(inputs, pos_offset, tc_offset, norm_offset, idx_stride, pos_source, tc_source, norm_source); + if (!get_dom_sources(inputs, pos_offset, tc_offset, norm_offset, idx_stride, pos_source, tc_source, norm_source)) + { + return LLModel::BAD_ELEMENT; + } LLVolumeFace face; @@ -564,7 +578,10 @@ LLModel::EModelStatus load_face_from_dom_polygons(std::vector<LLVolumeFace>& fac const domURIFragmentType& uri = inputs[i]->getSource(); daeElementRef elem = uri.getElement(); domVertices* vertices = (domVertices*) elem.cast(); - + if (!vertices) + { + return LLModel::BAD_ELEMENT; + } domInputLocal_Array& v_inp = vertices->getInput_array(); for (U32 k = 0; k < v_inp.getCount(); ++k) @@ -574,6 +591,10 @@ LLModel::EModelStatus load_face_from_dom_polygons(std::vector<LLVolumeFace>& fac const domURIFragmentType& uri = v_inp[k]->getSource(); daeElementRef elem = uri.getElement(); domSource* src = (domSource*) elem.cast(); + if (!src) + { + return LLModel::BAD_ELEMENT; + } v = &(src->getFloat_array()->getValue()); } } @@ -585,6 +606,10 @@ LLModel::EModelStatus load_face_from_dom_polygons(std::vector<LLVolumeFace>& fac const domURIFragmentType& uri = inputs[i]->getSource(); daeElementRef elem = uri.getElement(); domSource* src = (domSource*) elem.cast(); + if (!src) + { + return LLModel::BAD_ELEMENT; + } n = &(src->getFloat_array()->getValue()); } else if (strcmp(COMMON_PROFILE_INPUT_TEXCOORD, inputs[i]->getSemantic()) == 0 && inputs[i]->getSet() == 0) @@ -593,6 +618,10 @@ LLModel::EModelStatus load_face_from_dom_polygons(std::vector<LLVolumeFace>& fac const domURIFragmentType& uri = inputs[i]->getSource(); daeElementRef elem = uri.getElement(); domSource* src = (domSource*) elem.cast(); + if (!src) + { + return LLModel::BAD_ELEMENT; + } t = &(src->getFloat_array()->getValue()); } } @@ -667,11 +696,6 @@ LLModel::EModelStatus load_face_from_dom_polygons(std::vector<LLVolumeFace>& fac } } - if (cur_idx != vert_idx.size()) - { - llerrs << "WTF?" << llendl; - } - //build vertex array from map std::vector<LLVolumeFace::VertexData> new_verts; new_verts.resize(vert_idx.size()); @@ -717,7 +741,7 @@ LLModel::EModelStatus load_face_from_dom_polygons(std::vector<LLVolumeFace>& fac //static std::string LLModel::getStatusString(U32 status) { - const static std::string status_strings[(S32)INVALID_STATUS] = {"status_no_error", "status_vertex_number_overflow"}; + const static std::string status_strings[(S32)INVALID_STATUS] = {"status_no_error", "status_vertex_number_overflow","bad_element"}; if(status < INVALID_STATUS) { @@ -755,7 +779,6 @@ void LLModel::addVolumeFacesFromDomMesh(domMesh* mesh) for (U32 i = 0; i < polys.getCount(); ++i) { domPolylistRef& poly = polys.get(i); - mStatus = load_face_from_dom_polylist(mVolumeFaces, mMaterialList, poly); if(mStatus != NO_ERRORS) @@ -765,12 +788,12 @@ void LLModel::addVolumeFacesFromDomMesh(domMesh* mesh) return ; //abort } } - + domPolygons_Array& polygons = mesh->getPolygons_array(); + for (U32 i = 0; i < polygons.getCount(); ++i) { domPolygonsRef& poly = polygons.get(i); - mStatus = load_face_from_dom_polygons(mVolumeFaces, mMaterialList, poly); if(mStatus != NO_ERRORS) @@ -780,7 +803,7 @@ void LLModel::addVolumeFacesFromDomMesh(domMesh* mesh) return ; //abort } } - + } BOOL LLModel::createVolumeFacesFromDomMesh(domMesh* mesh) @@ -926,11 +949,6 @@ void LLModel::normalizeVolumeFaces() { LLVector4a min, max; - if (mVolumeFaces[0].mNumVertices <= 0) - { - llerrs << "WTF?" << llendl; - } - // For all of the volume faces // in the model, loop over // them and see what the extents @@ -942,11 +960,6 @@ void LLModel::normalizeVolumeFaces() { LLVolumeFace& face = mVolumeFaces[i]; - if (face.mNumVertices <= 0) - { - llerrs << "WTF?" << llendl; - } - update_min_max(min, max, face.mExtents[0]); update_min_max(min, max, face.mExtents[1]); } @@ -1289,11 +1302,6 @@ void LLModel::generateNormals(F32 angle_cutoff) { LLVector4a& n = iter->second[k].getNormal(); - if (!iter->second[k].getPosition().equals3(new_face.mPositions[i])) - { - llerrs << "WTF?" << llendl; - } - F32 cur = n.dot3(ref_norm).getF32(); if (cur > best) @@ -1410,7 +1418,11 @@ LLSD LLModel::writeModel( if (!decomp.mBaseHull.empty() || !decomp.mHull.empty()) { - mdl["decomposition"] = decomp.asLLSD(); + mdl["physics_convex"] = decomp.asLLSD(); + if (!decomp.mHull.empty()) + { //convex decomposition exists, physics mesh will not be used + model[LLModel::LOD_PHYSICS] = NULL; + } } for (U32 idx = 0; idx < MODEL_NAMES_LENGTH; ++idx) @@ -1435,8 +1447,9 @@ LLSD LLModel::writeModel( for (S32 i = 0; i < model[idx]->getNumVolumeFaces(); ++i) { //for each face const LLVolumeFace& face = model[idx]->getVolumeFace(i); - if (!face.mNumVertices) + if (face.mNumVertices < 3) { //don't export an empty face + mdl[model_names[idx]][i]["NoGeometry"] = true; continue; } LLSD::Binary verts(face.mNumVertices*3*2); @@ -1469,7 +1482,6 @@ LLSD LLModel::writeModel( //position + normal for (U32 k = 0; k < 3; ++k) { //for each component - //convert to 16-bit normalized across domain U16 val = (U16) (((pos[k]-min_pos.mV[k])/pos_range.mV[k])*65535); @@ -1513,7 +1525,6 @@ LLSD LLModel::writeModel( //write out face data mdl[model_names[idx]][i]["PositionDomain"]["Min"] = min_pos.getValue(); mdl[model_names[idx]][i]["PositionDomain"]["Max"] = max_pos.getValue(); - mdl[model_names[idx]][i]["TexCoord0Domain"]["Min"] = min_tc.getValue(); mdl[model_names[idx]][i]["TexCoord0Domain"]["Max"] = max_tc.getValue(); @@ -1539,11 +1550,6 @@ LLSD LLModel::writeModel( weight_list& weights = high->getJointInfluences(pos); - if (weights.size() > 4) - { - llerrs << "WTF?" << llendl; - } - S32 count = 0; for (weight_list::iterator iter = weights.begin(); iter != weights.end(); ++iter) { @@ -1607,23 +1613,19 @@ LLSD LLModel::writeModelToStream(std::ostream& ostr, LLSD& mdl, BOOL nowrite) cur_offset += size; bytes += size; } - else - { - llerrs << "WTF?" << llendl; - } } std::string decomposition; - if (mdl.has("decomposition")) + if (mdl.has("physics_convex")) { //write out convex decomposition - decomposition = zip_llsd(mdl["decomposition"]); + decomposition = zip_llsd(mdl["physics_convex"]); U32 size = decomposition.size(); if (size > 0) { - header["decomposition"]["offset"] = (LLSD::Integer) cur_offset; - header["decomposition"]["size"] = (LLSD::Integer) size; + header["physics_convex"]["offset"] = (LLSD::Integer) cur_offset; + header["physics_convex"]["size"] = (LLSD::Integer) size; cur_offset += size; bytes += size; } @@ -1644,11 +1646,6 @@ LLSD LLModel::writeModelToStream(std::ostream& ostr, LLSD& mdl, BOOL nowrite) cur_offset += size; bytes += size; } - else - { - header[model_names[i]]["offset"] = -1; - header[model_names[i]]["size"] = 0; - } } if (!nowrite) @@ -1662,7 +1659,7 @@ LLSD LLModel::writeModelToStream(std::ostream& ostr, LLSD& mdl, BOOL nowrite) if (!decomposition.empty()) { //write decomposition block - ostr.write((const char*) decomposition.data(), header["decomposition"]["size"].asInteger()); + ostr.write((const char*) decomposition.data(), header["physics_convex"]["size"].asInteger()); } for (S32 i = 0; i < MODEL_NAMES_LENGTH; i++) @@ -1685,7 +1682,7 @@ LLModel::weight_list& LLModel::getJointInfluences(const LLVector3& pos) { if ((iter->first - pos).magVec() > 0.1f) { - llerrs << "WTF?" << llendl; + llerrs << "Couldn't find weight list." << llendl; } return iter->second; @@ -1778,7 +1775,7 @@ void LLModel::updateHullCenters() if (mHullPoints > 0) { mCenterOfHullCenters *= 1.f / mHullPoints; - llassert(mPhysics.asLLSD().has("HullList")); + llassert(mPhysics.hasHullList()); } } @@ -1801,7 +1798,7 @@ bool LLModel::loadModel(std::istream& is) "low_lod", "medium_lod", "high_lod", - "physics_shape", + "physics_mesh", }; const S32 MODEL_LODS = 5; @@ -1900,8 +1897,8 @@ bool LLModel::loadSkinInfo(LLSD& header, std::istream &is) bool LLModel::loadDecomposition(LLSD& header, std::istream& is) { - S32 offset = header["decomposition"]["offset"].asInteger(); - S32 size = header["decomposition"]["size"].asInteger(); + S32 offset = header["physics_convex"]["offset"].asInteger(); + S32 size = header["physics_convex"]["size"].asInteger(); if (offset >= 0 && size > 0) { @@ -2041,7 +2038,7 @@ void LLModel::Decomposition::fromLLSD(LLSD& decomp) { // updated for const-correctness. gcc is picky about this type of thing - Nyx const LLSD::Binary& hulls = decomp["HullList"].asBinary(); - const LLSD::Binary& position = decomp["Position"].asBinary(); + const LLSD::Binary& position = decomp["Positions"].asBinary(); U16* p = (U16*) &position[0]; @@ -2051,11 +2048,19 @@ void LLModel::Decomposition::fromLLSD(LLSD& decomp) LLVector3 max; LLVector3 range; - min.setValue(decomp["Min"]); - max.setValue(decomp["Max"]); + if (decomp.has("Min")) + { + min.setValue(decomp["Min"]); + max.setValue(decomp["Max"]); + } + else + { + min.set(-0.5f, -0.5f, -0.5f); + max.set(0.5f, 0.5f, 0.5f); + } + range = max-min; - for (U32 i = 0; i < hulls.size(); ++i) { U16 count = (hulls[i] == 0) ? 256 : hulls[i]; @@ -2071,6 +2076,7 @@ void LLModel::Decomposition::fromLLSD(LLSD& decomp) //point must be unique //llassert(valid.find(test) == valid.end()); valid.insert(test); + mHull[i].push_back(LLVector3( (F32) p[0]/65535.f*range.mV[0]+min.mV[0], (F32) p[1]/65535.f*range.mV[1]+min.mV[1], @@ -2085,9 +2091,9 @@ void LLModel::Decomposition::fromLLSD(LLSD& decomp) } } - if (decomp.has("Hull")) + if (decomp.has("BoundingVerts")) { - const LLSD::Binary& position = decomp["Hull"].asBinary(); + const LLSD::Binary& position = decomp["BoundingVerts"].asBinary(); U16* p = (U16*) &position[0]; @@ -2123,10 +2129,15 @@ void LLModel::Decomposition::fromLLSD(LLSD& decomp) { //empty base hull mesh to indicate decomposition has been loaded //but contains no base hull - mBaseHullMesh.clear();; + mBaseHullMesh.clear(); } } +bool LLModel::Decomposition::hasHullList() const +{ + return !mHull.empty() ; +} + LLSD LLModel::Decomposition::asLLSD() const { LLSD ret; @@ -2137,11 +2148,9 @@ LLSD LLModel::Decomposition::asLLSD() const } //write decomposition block - // ["decomposition"]["HullList"] -- list of 8 bit integers, each entry represents a hull with specified number of points - // ["decomposition"]["PositionDomain"]["Min"/"Max"] - // ["decomposition"]["Position"] -- list of 16-bit integers to be decoded to given domain, encoded 3D points - // ["decomposition"]["Hull"] -- list of 16-bit integers to be decoded to given domain, encoded 3D points representing a single hull approximation of given shape - + // ["physics_convex"]["HullList"] -- list of 8 bit integers, each entry represents a hull with specified number of points + // ["physics_convex"]["Position"] -- list of 16-bit integers to be decoded to given domain, encoded 3D points + // ["physics_convex"]["BoundingVerts"] -- list of 16-bit integers to be decoded to given domain, encoded 3D points representing a single hull approximation of given shape //get minimum and maximum LLVector3 min; @@ -2190,6 +2199,8 @@ LLSD LLModel::Decomposition::asLLSD() const { LLSD::Binary p(total*3*2); + LLVector3 min(-0.5f, -0.5f, -0.5f); + LLVector3 max(0.5f, 0.5f, 0.5f); LLVector3 range = max-min; U32 vert_idx = 0; @@ -2205,17 +2216,24 @@ LLSD LLModel::Decomposition::asLLSD() const U64 test = 0; for (U32 k = 0; k < 3; k++) { + F32* src = (F32*) (mHull[i][j].mV); + + llassert(src[k] <= 0.501f && src[k] >= -0.501f); + //convert to 16-bit normalized across domain - U16 val = (U16) (((mHull[i][j].mV[k]-min.mV[k])/range.mV[k])*65535); + U16 val = (U16) (((src[k]-min.mV[k])/range.mV[k])*65535); - switch (k) + if(valid.size() < 3) { - case 0: test = test | (U64) val; break; - case 1: test = test | ((U64) val << 16); break; - case 2: test = test | ((U64) val << 32); break; - }; + switch (k) + { + case 0: test = test | (U64) val; break; + case 1: test = test | ((U64) val << 16); break; + case 2: test = test | ((U64) val << 32); break; + }; - valid.insert(test); + valid.insert(test); + } U8* buff = (U8*) &val; //write to binary buffer @@ -2227,17 +2245,21 @@ LLSD LLModel::Decomposition::asLLSD() const } } - //must have at least 4 unique points - llassert(valid.size() > 3); + //must have at least 3 unique points + llassert(valid.size() > 2); } - ret["Position"] = p; + ret["Positions"] = p; } + //llassert(!mBaseHull.empty()); + if (!mBaseHull.empty()) { LLSD::Binary p(mBaseHull.size()*3*2); + LLVector3 min(-0.5f, -0.5f, -0.5f); + LLVector3 max(0.5f, 0.5f, 0.5f); LLVector3 range = max-min; U32 vert_idx = 0; @@ -2245,6 +2267,8 @@ LLSD LLModel::Decomposition::asLLSD() const { for (U32 k = 0; k < 3; k++) { + llassert(mBaseHull[j].mV[k] <= 0.51f && mBaseHull[j].mV[k] >= -0.51f); + //convert to 16-bit normalized across domain U16 val = (U16) (((mBaseHull[j].mV[k]-min.mV[k])/range.mV[k])*65535); @@ -2255,12 +2279,12 @@ LLSD LLModel::Decomposition::asLLSD() const if (vert_idx > p.size()) { - llerrs << "WTF?" << llendl; + llerrs << "Index out of bounds" << llendl; } } } - ret["Hull"] = p; + ret["BoundingVerts"] = p; } return ret; @@ -2290,10 +2314,5 @@ void LLModel::Decomposition::merge(const LLModel::Decomposition* rhs) { //take physics shape mesh from rhs mPhysicsShapeMesh = rhs->mPhysicsShapeMesh; } - - if (!mHull.empty()) - { //verify - llassert(asLLSD().has("HullList")); - } } diff --git a/indra/llprimitive/llmodel.h b/indra/llprimitive/llmodel.h index 23f4b5cb42733a0565fc4d15d19f9976266d4595..cd9f76fcb740026fd1239bc73f904ac3a4eeed9b 100644 --- a/indra/llprimitive/llmodel.h +++ b/indra/llprimitive/llmodel.h @@ -73,6 +73,7 @@ class LLModel : public LLVolume { NO_ERRORS = 0, VERTEX_NUMBER_OVERFLOW, //vertex number is >= 65535. + BAD_ELEMENT, INVALID_STATUS } ; @@ -106,6 +107,7 @@ class LLModel : public LLVolume Decomposition(LLSD& data); void fromLLSD(LLSD& data); LLSD asLLSD() const; + bool hasHullList() const; void merge(const Decomposition* rhs); diff --git a/indra/llrender/llgl.cpp b/indra/llrender/llgl.cpp index a460912e70d080b98d97416f9ce308d3aebd2f61..a3aed4dd8abba758d7247fcbe436ed77b4f3faad 100644 --- a/indra/llrender/llgl.cpp +++ b/indra/llrender/llgl.cpp @@ -127,6 +127,11 @@ PFNGLUNMAPBUFFERARBPROC glUnmapBufferARB = NULL; PFNGLGETBUFFERPARAMETERIVARBPROC glGetBufferParameterivARB = NULL; PFNGLGETBUFFERPOINTERVARBPROC glGetBufferPointervARB = NULL; +// GL_ARB_map_buffer_range +PFNGLMAPBUFFERRANGEPROC glMapBufferRange; +PFNGLFLUSHMAPPEDBUFFERRANGEPROC glFlushMappedBufferRange; + + // vertex object prototypes PFNGLNEWOBJECTBUFFERATIPROC glNewObjectBufferATI = NULL; PFNGLISOBJECTBUFFERATIPROC glIsObjectBufferATI = NULL; @@ -178,6 +183,12 @@ PFNGLBLITFRAMEBUFFERPROC glBlitFramebuffer = NULL; PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC glRenderbufferStorageMultisample = NULL; PFNGLFRAMEBUFFERTEXTURELAYERPROC glFramebufferTextureLayer = NULL; +//GL_ARB_texture_multisample +PFNGLTEXIMAGE2DMULTISAMPLEPROC glTexImage2DMultisample; +PFNGLTEXIMAGE3DMULTISAMPLEPROC glTexImage3DMultisample; +PFNGLGETMULTISAMPLEFVPROC glGetMultisamplefv; +PFNGLSAMPLEMASKIPROC glSampleMaski; + // GL_EXT_blend_func_separate PFNGLBLENDFUNCSEPARATEEXTPROC glBlendFuncSeparateEXT = NULL; @@ -321,9 +332,11 @@ LLGLManager::LLGLManager() : mHasMipMapGeneration(FALSE), mHasCompressedTextures(FALSE), mHasFramebufferObject(FALSE), + mMaxSamples(0), mHasBlendFuncSeparate(FALSE), mHasVertexBufferObject(FALSE), + mHasMapBufferRange(FALSE), mHasPBuffer(FALSE), mHasShaderObjects(FALSE), mHasVertexShader(FALSE), @@ -334,6 +347,11 @@ LLGLManager::LLGLManager() : mHasPointParameters(FALSE), mHasDrawBuffers(FALSE), mHasTextureRectangle(FALSE), + mHasTextureMultisample(FALSE), + mMaxSampleMaskWords(0), + mMaxColorTextureSamples(0), + mMaxDepthTextureSamples(0), + mMaxIntegerSamples(0), mHasAnisotropic(FALSE), mHasARBEnvCombine(FALSE), @@ -539,7 +557,20 @@ bool LLGLManager::initGL() { GLint num_tex_image_units; glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS_ARB, &num_tex_image_units); - mNumTextureImageUnits = num_tex_image_units; + mNumTextureImageUnits = llmin(num_tex_image_units, 32); + } + + if (mHasTextureMultisample) + { + glGetIntegerv(GL_MAX_COLOR_TEXTURE_SAMPLES, &mMaxColorTextureSamples); + glGetIntegerv(GL_MAX_DEPTH_TEXTURE_SAMPLES, &mMaxDepthTextureSamples); + glGetIntegerv(GL_MAX_INTEGER_SAMPLES, &mMaxIntegerSamples); + glGetIntegerv(GL_MAX_SAMPLE_MASK_WORDS, &mMaxSampleMaskWords); + } + + if (mHasFramebufferObject) + { + glGetIntegerv(GL_MAX_SAMPLES, &mMaxSamples); } setToDebugGPU(); @@ -648,6 +679,14 @@ std::string LLGLManager::getRawGLString() return gl_string; } +U32 LLGLManager::getNumFBOFSAASamples(U32 samples) +{ + samples = llmin(samples, (U32) mMaxColorTextureSamples); + samples = llmin(samples, (U32) mMaxDepthTextureSamples); + samples = llmin(samples, (U32) 4); + return samples; +} + void LLGLManager::shutdownGL() { if (mInited) @@ -728,6 +767,7 @@ void LLGLManager::initExtensions() mHasOcclusionQuery = ExtensionExists("GL_ARB_occlusion_query", gGLHExts.mSysExts); mHasOcclusionQuery2 = ExtensionExists("GL_ARB_occlusion_query2", gGLHExts.mSysExts); mHasVertexBufferObject = ExtensionExists("GL_ARB_vertex_buffer_object", gGLHExts.mSysExts); + mHasMapBufferRange = ExtensionExists("GL_ARB_map_buffer_range", gGLHExts.mSysExts); mHasDepthClamp = ExtensionExists("GL_ARB_depth_clamp", gGLHExts.mSysExts) || ExtensionExists("GL_NV_depth_clamp", gGLHExts.mSysExts); // mask out FBO support when packed_depth_stencil isn't there 'cause we need it for LLRenderTarget -Brad #ifdef GL_ARB_framebuffer_object @@ -742,6 +782,7 @@ void LLGLManager::initExtensions() mHasDrawBuffers = ExtensionExists("GL_ARB_draw_buffers", gGLHExts.mSysExts); mHasBlendFuncSeparate = ExtensionExists("GL_EXT_blend_func_separate", gGLHExts.mSysExts); mHasTextureRectangle = ExtensionExists("GL_ARB_texture_rectangle", gGLHExts.mSysExts); + mHasTextureMultisample = ExtensionExists("GL_ARB_texture_multisample", gGLHExts.mSysExts); #if !LL_DARWIN mHasPointParameters = !mIsATI && ExtensionExists("GL_ARB_point_parameters", gGLHExts.mSysExts); #endif @@ -921,6 +962,11 @@ void LLGLManager::initExtensions() mHasVertexBufferObject = FALSE; } } + if (mHasMapBufferRange) + { + glMapBufferRange = (PFNGLMAPBUFFERRANGEPROC) GLH_EXT_GET_PROC_ADDRESS("glMapBufferRange"); + glFlushMappedBufferRange = (PFNGLFLUSHMAPPEDBUFFERRANGEPROC) GLH_EXT_GET_PROC_ADDRESS("glFlushMappedBufferRange"); + } if (mHasFramebufferObject) { llinfos << "initExtensions() FramebufferObject-related procs..." << llendl; @@ -953,6 +999,13 @@ void LLGLManager::initExtensions() { glBlendFuncSeparateEXT = (PFNGLBLENDFUNCSEPARATEEXTPROC) GLH_EXT_GET_PROC_ADDRESS("glBlendFuncSeparateEXT"); } + if (mHasTextureMultisample) + { + glTexImage2DMultisample = (PFNGLTEXIMAGE2DMULTISAMPLEPROC) GLH_EXT_GET_PROC_ADDRESS("glTexImage2DMultisample"); + glTexImage3DMultisample = (PFNGLTEXIMAGE3DMULTISAMPLEPROC) GLH_EXT_GET_PROC_ADDRESS("glTexImage3DMultisample"); + glGetMultisamplefv = (PFNGLGETMULTISAMPLEFVPROC) GLH_EXT_GET_PROC_ADDRESS("glGetMultisamplefv"); + glSampleMaski = (PFNGLSAMPLEMASKIPROC) GLH_EXT_GET_PROC_ADDRESS("glSampleMaski"); + } #if (!LL_LINUX && !LL_SOLARIS) || LL_LINUX_NV_GL_HEADERS // This is expected to be a static symbol on Linux GL implementations, except if we use the nvidia headers - bah glDrawRangeElements = (PFNGLDRAWRANGEELEMENTSPROC)GLH_EXT_GET_PROC_ADDRESS("glDrawRangeElements"); @@ -1370,10 +1423,6 @@ void LLGLState::checkTextureChannels(const std::string& msg) } } - GLint maxTextureUnits = 0; - glGetIntegerv(GL_MAX_TEXTURE_UNITS_ARB, &maxTextureUnits); - stop_glerror(); - static const char* label[] = { "GL_TEXTURE_2D", @@ -1384,7 +1433,8 @@ void LLGLState::checkTextureChannels(const std::string& msg) "GL_TEXTURE_GEN_T", "GL_TEXTURE_GEN_Q", "GL_TEXTURE_GEN_R", - "GL_TEXTURE_RECTANGLE_ARB" + "GL_TEXTURE_RECTANGLE_ARB", + "GL_TEXTURE_2D_MULTISAMPLE" }; static GLint value[] = @@ -1397,7 +1447,8 @@ void LLGLState::checkTextureChannels(const std::string& msg) GL_TEXTURE_GEN_T, GL_TEXTURE_GEN_Q, GL_TEXTURE_GEN_R, - GL_TEXTURE_RECTANGLE_ARB + GL_TEXTURE_RECTANGLE_ARB, + GL_TEXTURE_2D_MULTISAMPLE }; GLint stackDepth = 0; @@ -1406,68 +1457,96 @@ void LLGLState::checkTextureChannels(const std::string& msg) glh::matrix4f identity; identity.identity(); - for (GLint i = 1; i < maxTextureUnits; i++) + for (GLint i = 1; i < gGLManager.mNumTextureUnits; i++) { gGL.getTexUnit(i)->activate(); - glClientActiveTextureARB(GL_TEXTURE0_ARB+i); - stop_glerror(); - glGetIntegerv(GL_TEXTURE_STACK_DEPTH, &stackDepth); - stop_glerror(); - if (stackDepth != 1) + if (i < gGLManager.mNumTextureUnits) { - error = TRUE; - LL_WARNS("RenderState") << "Texture matrix stack corrupted." << LL_ENDL; + glClientActiveTextureARB(GL_TEXTURE0_ARB+i); + stop_glerror(); + glGetIntegerv(GL_TEXTURE_STACK_DEPTH, &stackDepth); + stop_glerror(); - if (gDebugSession) + if (stackDepth != 1) { - gFailLog << "Texture matrix stack corrupted." << std::endl; + error = TRUE; + LL_WARNS("RenderState") << "Texture matrix stack corrupted." << LL_ENDL; + + if (gDebugSession) + { + gFailLog << "Texture matrix stack corrupted." << std::endl; + } } - } - glGetFloatv(GL_TEXTURE_MATRIX, (GLfloat*) mat.m); - stop_glerror(); + glGetFloatv(GL_TEXTURE_MATRIX, (GLfloat*) mat.m); + stop_glerror(); - if (mat != identity) - { - error = TRUE; - LL_WARNS("RenderState") << "Texture matrix in channel " << i << " corrupt." << LL_ENDL; - if (gDebugSession) + if (mat != identity) { - gFailLog << "Texture matrix in channel " << i << " corrupt." << std::endl; + error = TRUE; + LL_WARNS("RenderState") << "Texture matrix in channel " << i << " corrupt." << LL_ENDL; + if (gDebugSession) + { + gFailLog << "Texture matrix in channel " << i << " corrupt." << std::endl; + } + } + + for (S32 j = (i == 0 ? 1 : 0); + j < 9; j++) + { + if (j == 8 && !gGLManager.mHasTextureRectangle || + j == 9 && !gGLManager.mHasTextureMultisample) + { + continue; + } + + if (glIsEnabled(value[j])) + { + error = TRUE; + LL_WARNS("RenderState") << "Texture channel " << i << " still has " << label[j] << " enabled." << LL_ENDL; + if (gDebugSession) + { + gFailLog << "Texture channel " << i << " still has " << label[j] << " enabled." << std::endl; + } + } + stop_glerror(); } - } - - for (S32 j = (i == 0 ? 1 : 0); - j < (gGLManager.mHasTextureRectangle ? 9 : 8); j++) - { - if (glIsEnabled(value[j])) + glGetFloatv(GL_TEXTURE_MATRIX, mat.m); + stop_glerror(); + + if (mat != identity) { error = TRUE; - LL_WARNS("RenderState") << "Texture channel " << i << " still has " << label[j] << " enabled." << LL_ENDL; + LL_WARNS("RenderState") << "Texture matrix " << i << " is not identity." << LL_ENDL; if (gDebugSession) { - gFailLog << "Texture channel " << i << " still has " << label[j] << " enabled." << std::endl; + gFailLog << "Texture matrix " << i << " is not identity." << std::endl; } } - stop_glerror(); } - glGetFloatv(GL_TEXTURE_MATRIX, mat.m); - stop_glerror(); - - if (mat != identity) { - error = TRUE; - LL_WARNS("RenderState") << "Texture matrix " << i << " is not identity." << LL_ENDL; - if (gDebugSession) + GLint tex = 0; + stop_glerror(); + glGetIntegerv(GL_TEXTURE_BINDING_2D, &tex); + stop_glerror(); + + if (tex != 0) { - gFailLog << "Texture matrix " << i << " is not identity." << std::endl; + error = TRUE; + LL_WARNS("RenderState") << "Texture channel " << i << " still has texture " << tex << " bound." << llendl; + + if (gDebugSession) + { + gFailLog << "Texture channel " << i << " still has texture " << tex << " bound." << std::endl; + } } } } + stop_glerror(); gGL.getTexUnit(0)->activate(); glClientActiveTextureARB(GL_TEXTURE0_ARB); stop_glerror(); diff --git a/indra/llrender/llgl.h b/indra/llrender/llgl.h index 1d7ab188fcef1991a22e8e38342cdd20041433d7..d1bee001617b33f0c3447b6571c50cefeff5949b 100644 --- a/indra/llrender/llgl.h +++ b/indra/llrender/llgl.h @@ -83,10 +83,12 @@ class LLGLManager BOOL mHasMipMapGeneration; BOOL mHasCompressedTextures; BOOL mHasFramebufferObject; + S32 mMaxSamples; BOOL mHasBlendFuncSeparate; - + // ARB Extensions BOOL mHasVertexBufferObject; + BOOL mHasMapBufferRange; BOOL mHasPBuffer; BOOL mHasShaderObjects; BOOL mHasVertexShader; @@ -98,6 +100,11 @@ class LLGLManager BOOL mHasDrawBuffers; BOOL mHasDepthClamp; BOOL mHasTextureRectangle; + BOOL mHasTextureMultisample; + S32 mMaxSampleMaskWords; + S32 mMaxColorTextureSamples; + S32 mMaxDepthTextureSamples; + S32 mMaxIntegerSamples; // Other extensions. BOOL mHasAnisotropic; @@ -139,6 +146,7 @@ class LLGLManager void printGLInfoString(); void getGLInfo(LLSD& info); + U32 getNumFBOFSAASamples(U32 desired_samples = 32); // In ALL CAPS std::string mGLVendor; std::string mGLVendorShort; diff --git a/indra/llrender/llglheaders.h b/indra/llrender/llglheaders.h index d8140a124db1d5a02b3cf07518d07031ce2896ff..f35f329f002488b8b8ce61cd2149f462b253be47 100644 --- a/indra/llrender/llglheaders.h +++ b/indra/llrender/llglheaders.h @@ -68,6 +68,10 @@ extern PFNGLUNMAPBUFFERARBPROC glUnmapBufferARB; extern PFNGLGETBUFFERPARAMETERIVARBPROC glGetBufferParameterivARB; extern PFNGLGETBUFFERPOINTERVARBPROC glGetBufferPointervARB; +// GL_ARB_map_buffer_range +extern PFNGLMAPBUFFERRANGEPROC glMapBufferRange; +extern PFNGLFLUSHMAPPEDBUFFERRANGEPROC glFlushMappedBufferRange; + // GL_ATI_vertex_array_object extern PFNGLNEWOBJECTBUFFERATIPROC glNewObjectBufferATI; extern PFNGLISOBJECTBUFFERATIPROC glIsObjectBufferATI; @@ -306,6 +310,10 @@ extern PFNGLUNMAPBUFFERARBPROC glUnmapBufferARB; extern PFNGLGETBUFFERPARAMETERIVARBPROC glGetBufferParameterivARB; extern PFNGLGETBUFFERPOINTERVARBPROC glGetBufferPointervARB; +// GL_ARB_map_buffer_range +extern PFNGLMAPBUFFERRANGEPROC glMapBufferRange; +extern PFNGLFLUSHMAPPEDBUFFERRANGEPROC glFlushMappedBufferRange; + // GL_ATI_vertex_array_object extern PFNGLNEWOBJECTBUFFERATIPROC glNewObjectBufferATI; extern PFNGLISOBJECTBUFFERATIPROC glIsObjectBufferATI; @@ -474,6 +482,11 @@ extern PFNGLFRAMEBUFFERTEXTURELAYERPROC glFramebufferTextureLayer; //GL_ARB_draw_buffers extern PFNGLDRAWBUFFERSARBPROC glDrawBuffersARB; +//GL_ARB_texture_multisample +extern PFNGLTEXIMAGE2DMULTISAMPLEPROC glTexImage2DMultisample; +extern PFNGLTEXIMAGE3DMULTISAMPLEPROC glTexImage3DMultisample; +extern PFNGLGETMULTISAMPLEFVPROC glGetMultisamplefv; +extern PFNGLSAMPLEMASKIPROC glSampleMaski; #elif LL_WINDOWS //---------------------------------------------------------------------------- @@ -506,6 +519,10 @@ extern PFNGLUNMAPBUFFERARBPROC glUnmapBufferARB; extern PFNGLGETBUFFERPARAMETERIVARBPROC glGetBufferParameterivARB; extern PFNGLGETBUFFERPOINTERVARBPROC glGetBufferPointervARB; +// GL_ARB_map_buffer_range +extern PFNGLMAPBUFFERRANGEPROC glMapBufferRange; +extern PFNGLFLUSHMAPPEDBUFFERRANGEPROC glFlushMappedBufferRange; + // GL_ATI_vertex_array_object extern PFNGLNEWOBJECTBUFFERATIPROC glNewObjectBufferATI; extern PFNGLISOBJECTBUFFERATIPROC glIsObjectBufferATI; @@ -673,6 +690,11 @@ extern PFNGLFRAMEBUFFERTEXTURELAYERPROC glFramebufferTextureLayer; //GL_ARB_draw_buffers extern PFNGLDRAWBUFFERSARBPROC glDrawBuffersARB; +//GL_ARB_texture_multisample +extern PFNGLTEXIMAGE2DMULTISAMPLEPROC glTexImage2DMultisample; +extern PFNGLTEXIMAGE3DMULTISAMPLEPROC glTexImage3DMultisample; +extern PFNGLGETMULTISAMPLEFVPROC glGetMultisamplefv; +extern PFNGLSAMPLEMASKIPROC glSampleMaski; #elif LL_DARWIN //---------------------------------------------------------------------------- @@ -714,13 +736,55 @@ extern void glGenerateMipmapEXT(GLenum target) AVAILABLE_MAC_OS_X_VERSION_10_4_A #ifndef GL_ARB_framebuffer_object #define glGenerateMipmap glGenerateMipmapEXT +#define GL_MAX_SAMPLES 0x8D57 #endif + // GL_ARB_draw_buffers extern void glDrawBuffersARB(GLsizei n, const GLenum* bufs) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER; #ifdef __cplusplus extern "C" { #endif + +// +// Define map buffer range headers on Mac +// +#ifndef GL_ARB_map_buffer_range +#define GL_MAP_READ_BIT 0x0001 +#define GL_MAP_WRITE_BIT 0x0002 +#define GL_MAP_INVALIDATE_RANGE_BIT 0x0004 +#define GL_MAP_INVALIDATE_BUFFER_BIT 0x0008 +#define GL_MAP_FLUSH_EXPLICIT_BIT 0x0010 +#define GL_MAP_UNSYNCHRONIZED_BIT 0x0020 +#endif + +// +// Define multisample headers on Mac +// +#ifndef GL_ARB_texture_multisample +#define GL_SAMPLE_POSITION 0x8E50 +#define GL_SAMPLE_MASK 0x8E51 +#define GL_SAMPLE_MASK_VALUE 0x8E52 +#define GL_MAX_SAMPLE_MASK_WORDS 0x8E59 +#define GL_TEXTURE_2D_MULTISAMPLE 0x9100 +#define GL_PROXY_TEXTURE_2D_MULTISAMPLE 0x9101 +#define GL_TEXTURE_2D_MULTISAMPLE_ARRAY 0x9102 +#define GL_PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY 0x9103 +#define GL_TEXTURE_BINDING_2D_MULTISAMPLE 0x9104 +#define GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY 0x9105 +#define GL_TEXTURE_SAMPLES 0x9106 +#define GL_TEXTURE_FIXED_SAMPLE_LOCATIONS 0x9107 +#define GL_SAMPLER_2D_MULTISAMPLE 0x9108 +#define GL_INT_SAMPLER_2D_MULTISAMPLE 0x9109 +#define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE 0x910A +#define GL_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910B +#define GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910C +#define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910D +#define GL_MAX_COLOR_TEXTURE_SAMPLES 0x910E +#define GL_MAX_DEPTH_TEXTURE_SAMPLES 0x910F +#define GL_MAX_INTEGER_SAMPLES 0x9110 +#endif + // // Define vertex buffer object headers on Mac // @@ -757,7 +821,7 @@ extern "C" { #define GL_DYNAMIC_READ_ARB 0x88E9 #define GL_DYNAMIC_COPY_ARB 0x88EA #endif - + #ifndef GL_ARB_vertex_buffer_object diff --git a/indra/llrender/llglslshader.cpp b/indra/llrender/llglslshader.cpp index 257bcd93802883dec2c2ca149a89fb7008ad110a..8e99f62de680ead157709bd7a895724d2b995153 100644 --- a/indra/llrender/llglslshader.cpp +++ b/indra/llrender/llglslshader.cpp @@ -48,6 +48,8 @@ using std::pair; using std::make_pair; using std::string; +GLhandleARB LLGLSLShader::sCurBoundShader = 0; + BOOL shouldChange(const LLVector4& v1, const LLVector4& v2) { return v1 != v2; @@ -56,7 +58,7 @@ BOOL shouldChange(const LLVector4& v1, const LLVector4& v2) LLShaderFeatures::LLShaderFeatures() : calculatesLighting(false), isShiny(false), isFullbright(false), hasWaterFog(false), hasTransport(false), hasSkinning(false), hasObjectSkinning(false), hasAtmospherics(false), isSpecular(false), -hasGamma(false), hasLighting(false), calculatesAtmospherics(false) +hasGamma(false), hasLighting(false), calculatesAtmospherics(false), mIndexedTextureChannels(0), disableTextureIndex(false) { } @@ -107,16 +109,11 @@ BOOL LLGLSLShader::createShader(vector<string> * attributes, // Create program mProgramObject = glCreateProgramObjectARB(); - // Attach existing objects - if (!LLShaderMgr::instance()->attachShaderFeatures(this)) - { - return FALSE; - } - + //compile new source vector< pair<string,GLenum> >::iterator fileIter = mShaderFiles.begin(); for ( ; fileIter != mShaderFiles.end(); fileIter++ ) { - GLhandleARB shaderhandle = LLShaderMgr::instance()->loadShaderFile((*fileIter).first, mShaderLevel, (*fileIter).second); + GLhandleARB shaderhandle = LLShaderMgr::instance()->loadShaderFile((*fileIter).first, mShaderLevel, (*fileIter).second, mFeatures.mIndexedTextureChannels); LL_DEBUGS("ShaderLoading") << "SHADER FILE: " << (*fileIter).first << " mShaderLevel=" << mShaderLevel << LL_ENDL; if (shaderhandle > 0) { @@ -128,6 +125,12 @@ BOOL LLGLSLShader::createShader(vector<string> * attributes, } } + // Attach existing objects + if (!LLShaderMgr::instance()->attachShaderFeatures(this)) + { + return FALSE; + } + // Map attributes and uniforms if (success) { @@ -149,6 +152,29 @@ BOOL LLGLSLShader::createShader(vector<string> * attributes, return createShader(attributes,uniforms); } } + else if (mFeatures.mIndexedTextureChannels > 0) + { //override texture channels for indexed texture rendering + bind(); + S32 channel_count = mFeatures.mIndexedTextureChannels; + + for (S32 i = 0; i < channel_count; i++) + { + uniform1i(llformat("tex%d", i), i); + } + + S32 cur_tex = channel_count; //adjust any texture channels that might have been overwritten + for (U32 i = 0; i < mTexture.size(); i++) + { + if (mTexture[i] > -1 && mTexture[i] < channel_count) + { + llassert(cur_tex < gGLManager.mNumTextureImageUnits); + uniform1i(i, cur_tex); + mTexture[i] = cur_tex++; + } + } + unbind(); + } + return success; } @@ -293,7 +319,8 @@ void LLGLSLShader::mapUniform(GLint index, const vector<string> * uniforms) GLint LLGLSLShader::mapUniformTextureChannel(GLint location, GLenum type) { - if (type >= GL_SAMPLER_1D_ARB && type <= GL_SAMPLER_2D_RECT_SHADOW_ARB) + if (type >= GL_SAMPLER_1D_ARB && type <= GL_SAMPLER_2D_RECT_SHADOW_ARB || + type == GL_SAMPLER_2D_MULTISAMPLE) { //this here is a texture glUniform1iARB(location, mActiveTextureChannels); LL_DEBUGS("ShaderLoading") << "Assigned to texture channel " << mActiveTextureChannels << LL_ENDL; @@ -342,7 +369,7 @@ void LLGLSLShader::bind() if (gGLManager.mHasShaderObjects) { glUseProgramObjectARB(mProgramObject); - + sCurBoundShader = mProgramObject; if (mUniformsDirty) { LLShaderMgr::instance()->updateShaderUniforms(this); @@ -365,6 +392,7 @@ void LLGLSLShader::unbind() } } glUseProgramObjectARB(0); + sCurBoundShader = 0; stop_glerror(); } } @@ -372,6 +400,7 @@ void LLGLSLShader::unbind() void LLGLSLShader::bindNoShader(void) { glUseProgramObjectARB(0); + sCurBoundShader = 0; } S32 LLGLSLShader::enableTexture(S32 uniform, LLTexUnit::eTextureType mode) diff --git a/indra/llrender/llglslshader.h b/indra/llrender/llglslshader.h index d46ddbbe183992ab791626a227e8792b67c82912..4922eb6d6725bd0eee38177a2d776231c9e27ed1 100644 --- a/indra/llrender/llglslshader.h +++ b/indra/llrender/llglslshader.h @@ -45,6 +45,8 @@ class LLShaderFeatures bool hasObjectSkinning; bool hasAtmospherics; bool hasGamma; + S32 mIndexedTextureChannels; + bool disableTextureIndex; // char numLights; @@ -64,6 +66,8 @@ class LLGLSLShader LLGLSLShader(); + static GLhandleARB sCurBoundShader; + void unload(); BOOL createShader(std::vector<std::string> * attributes, std::vector<std::string> * uniforms); diff --git a/indra/llrender/llimagegl.cpp b/indra/llrender/llimagegl.cpp index d408077c683d48f97cd042b8bb366061ebacd432..60a5962234054aa34b64ea9d543759f54113beb6 100644 --- a/indra/llrender/llimagegl.cpp +++ b/indra/llrender/llimagegl.cpp @@ -1083,12 +1083,17 @@ void LLImageGL::generateTextures(S32 numTextures, U32 *textures) } // static -void LLImageGL::deleteTextures(S32 numTextures, U32 *textures) +void LLImageGL::deleteTextures(S32 numTextures, U32 *textures, bool immediate) { for (S32 i = 0; i < numTextures; i++) { sDeadTextureList.push_back(textures[i]); } + + if (immediate) + { + LLImageGL::deleteDeadTextures(); + } } // static @@ -1413,11 +1418,13 @@ void LLImageGL::deleteDeadTextures() { GLuint tex = sDeadTextureList.front(); sDeadTextureList.pop_front(); - for (int i = 0; i < gGLManager.mNumTextureUnits; i++) + for (int i = 0; i < gGLManager.mNumTextureImageUnits; i++) { - if (sCurrentBoundTextures[i] == tex) + LLTexUnit* tex_unit = gGL.getTexUnit(i); + + if (tex_unit->getCurrTexture() == tex) { - gGL.getTexUnit(i)->unbind(LLTexUnit::TT_TEXTURE); + tex_unit->unbind(tex_unit->getCurrType()); stop_glerror(); } } diff --git a/indra/llrender/llimagegl.h b/indra/llrender/llimagegl.h index 6c980984c0a5facb3433480f363b3414d10b257f..2cfb15b0d9d4d03c30efa2e8de9f1be2fcafedf4 100644 --- a/indra/llrender/llimagegl.h +++ b/indra/llrender/llimagegl.h @@ -98,7 +98,7 @@ class LLImageGL : public LLRefCount // These 3 functions currently wrap glGenTextures(), glDeleteTextures(), and glTexImage2D() // for tracking purposes and will be deprecated in the future static void generateTextures(S32 numTextures, U32 *textures); - static void deleteTextures(S32 numTextures, U32 *textures); + static void deleteTextures(S32 numTextures, U32 *textures, bool immediate = false); static void setManualImage(U32 target, S32 miplevel, S32 intformat, S32 width, S32 height, U32 pixformat, U32 pixtype, const void *pixels); BOOL createGLTexture() ; diff --git a/indra/llrender/llrender.cpp b/indra/llrender/llrender.cpp index c37139ac4c41a32da4ea4aaf364ac7a3bb40edfa..6a3f1865316fc5992809049e348e91b242e60c94 100644 --- a/indra/llrender/llrender.cpp +++ b/indra/llrender/llrender.cpp @@ -30,6 +30,7 @@ #include "llvertexbuffer.h" #include "llcubemap.h" +#include "llglslshader.h" #include "llimagegl.h" #include "llrendertarget.h" #include "lltexture.h" @@ -46,14 +47,15 @@ S32 gGLViewport[4]; U32 LLRender::sUICalls = 0; U32 LLRender::sUIVerts = 0; -static const U32 LL_NUM_TEXTURE_LAYERS = 16; +static const U32 LL_NUM_TEXTURE_LAYERS = 32; static const U32 LL_NUM_LIGHT_UNITS = 8; static GLenum sGLTextureType[] = { GL_TEXTURE_2D, GL_TEXTURE_RECTANGLE_ARB, - GL_TEXTURE_CUBE_MAP_ARB + GL_TEXTURE_CUBE_MAP_ARB, + GL_TEXTURE_2D_MULTISAMPLE }; static GLint sGLAddressMode[] = @@ -124,7 +126,7 @@ void LLTexUnit::refreshState(void) // Per apple spec, don't call glEnable/glDisable when index exceeds max texture units // http://www.mailinglistarchive.com/html/mac-opengl@lists.apple.com/2008-07/msg00653.html // - bool enableDisable = (mIndex < gGLManager.mNumTextureUnits); + bool enableDisable = (mIndex < gGLManager.mNumTextureUnits) && mCurrTexType != LLTexUnit::TT_MULTISAMPLE_TEXTURE; if (mCurrTexType != TT_NONE) { @@ -182,8 +184,8 @@ void LLTexUnit::enable(eTextureType type) mCurrTexType = type; gGL.flush(); - - if (mIndex < gGLManager.mNumTextureUnits) + if (type != LLTexUnit::TT_MULTISAMPLE_TEXTURE && + mIndex < gGLManager.mNumTextureUnits) { glEnable(sGLTextureType[type]); } @@ -199,8 +201,8 @@ void LLTexUnit::disable(void) activate(); unbind(mCurrTexType); gGL.flush(); - - if (mIndex < gGLManager.mNumTextureUnits) + if (mCurrTexType != LLTexUnit::TT_MULTISAMPLE_TEXTURE && + mIndex < gGLManager.mNumTextureUnits) { glDisable(sGLTextureType[mCurrTexType]); } @@ -292,7 +294,7 @@ bool LLTexUnit::bind(LLImageGL* texture, bool for_rendering, bool forceBind) glBindTexture(sGLTextureType[texture->getTarget()], mCurrTexture); texture->updateBindStats(texture->mTextureMemory); mHasMipMaps = texture->mHasMipMaps; - if (texture->mTexOptionsDirty) + if (mIndex == 0 && texture->mTexOptionsDirty) { texture->mTexOptionsDirty = false; setTextureAddressMode(texture->mAddressMode); @@ -402,6 +404,7 @@ void LLTexUnit::unbind(eTextureType type) activate(); mCurrTexture = 0; glBindTexture(sGLTextureType[type], 0); + stop_glerror(); } } @@ -423,7 +426,7 @@ void LLTexUnit::setTextureAddressMode(eTextureAddressMode mode) void LLTexUnit::setTextureFilteringOption(LLTexUnit::eTextureFilterOptions option) { - if (mIndex < 0 || mCurrTexture == 0) return; + if (mIndex < 0 || mCurrTexture == 0 || mCurrTexType == LLTexUnit::TT_MULTISAMPLE_TEXTURE) return; gGL.flush(); diff --git a/indra/llrender/llrender.h b/indra/llrender/llrender.h index 7ba14f7b405376f77060bfb331ca18b0bb31b27a..41e7b35341d17f27b77ccd761d44bca95463e399 100644 --- a/indra/llrender/llrender.h +++ b/indra/llrender/llrender.h @@ -57,6 +57,7 @@ class LLTexUnit TT_TEXTURE = 0, // Standard 2D Texture TT_RECT_TEXTURE, // Non power of 2 texture TT_CUBE_MAP, // 6-sided cube map texture + TT_MULTISAMPLE_TEXTURE, // see GL_ARB_texture_multisample TT_NONE // No texture type is currently enabled } eTextureType; diff --git a/indra/llrender/llrendertarget.cpp b/indra/llrender/llrendertarget.cpp index da1e94df64e5e0546a1f9fec67b8272bc67a1c5f..b6463309e111f81db4805915fe472577ec435f20 100644 --- a/indra/llrender/llrendertarget.cpp +++ b/indra/llrender/llrendertarget.cpp @@ -63,8 +63,7 @@ LLRenderTarget::LLRenderTarget() : mUseDepth(false), mRenderDepth(false), mUsage(LLTexUnit::TT_TEXTURE), - mSamples(0), - mSampleBuffer(NULL) + mSamples(0) { } @@ -73,23 +72,32 @@ LLRenderTarget::~LLRenderTarget() release(); } - -void LLRenderTarget::setSampleBuffer(LLMultisampleBuffer* buffer) -{ - mSampleBuffer = buffer; -} - -void LLRenderTarget::allocate(U32 resx, U32 resy, U32 color_fmt, bool depth, bool stencil, LLTexUnit::eTextureType usage, bool use_fbo) +void LLRenderTarget::allocate(U32 resx, U32 resy, U32 color_fmt, bool depth, bool stencil, LLTexUnit::eTextureType usage, bool use_fbo, S32 samples) { stop_glerror(); + + release(); + mResX = resx; mResY = resy; mStencil = stencil; mUsage = usage; mUseDepth = depth; + mSamples = samples; - release(); + mSamples = gGLManager.getNumFBOFSAASamples(mSamples); + + if (mSamples > 1 && gGLManager.mHasTextureMultisample) + { + mUsage = LLTexUnit::TT_MULTISAMPLE_TEXTURE; + //no support for multisampled stencil targets yet + mStencil = false; + } + else + { + mSamples = 0; + } if ((sUseFBO || use_fbo) && gGLManager.mHasFramebufferObject) { @@ -146,29 +154,51 @@ void LLRenderTarget::addColorAttachment(U32 color_fmt) stop_glerror(); - LLImageGL::setManualImage(LLTexUnit::getInternalType(mUsage), 0, color_fmt, mResX, mResY, GL_RGBA, GL_UNSIGNED_BYTE, NULL); - - stop_glerror(); - if (offset == 0) +#ifdef GL_ARB_texture_multisample + if (mSamples > 1) { - gGL.getTexUnit(0)->setTextureFilteringOption(LLTexUnit::TFO_BILINEAR); + glTexImage2DMultisample(LLTexUnit::getInternalType(mUsage), mSamples, color_fmt, mResX, mResY, GL_TRUE); } else - { //don't filter data attachments - gGL.getTexUnit(0)->setTextureFilteringOption(LLTexUnit::TFO_POINT); - } - if (mUsage != LLTexUnit::TT_RECT_TEXTURE) +#else + llassert_always(mSamples <= 1); +#endif { - gGL.getTexUnit(0)->setTextureAddressMode(LLTexUnit::TAM_MIRROR); + LLImageGL::setManualImage(LLTexUnit::getInternalType(mUsage), 0, color_fmt, mResX, mResY, GL_RGBA, GL_UNSIGNED_BYTE, NULL); } - else - { - // ATI doesn't support mirrored repeat for rectangular textures. - gGL.getTexUnit(0)->setTextureAddressMode(LLTexUnit::TAM_CLAMP); + + stop_glerror(); + + if (mSamples == 0) + { + if (offset == 0) + { //use bilinear filtering on single texture render targets that aren't multisampled + gGL.getTexUnit(0)->setTextureFilteringOption(LLTexUnit::TFO_BILINEAR); + stop_glerror(); + } + else + { //don't filter data attachments + gGL.getTexUnit(0)->setTextureFilteringOption(LLTexUnit::TFO_POINT); + stop_glerror(); + } + + if (mUsage != LLTexUnit::TT_RECT_TEXTURE) + { + gGL.getTexUnit(0)->setTextureAddressMode(LLTexUnit::TAM_MIRROR); + stop_glerror(); + } + else + { + // ATI doesn't support mirrored repeat for rectangular textures. + gGL.getTexUnit(0)->setTextureAddressMode(LLTexUnit::TAM_CLAMP); + stop_glerror(); + } } + if (mFBO) { + stop_glerror(); glBindFramebuffer(GL_FRAMEBUFFER, mFBO); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0+offset, LLTexUnit::getInternalType(mUsage), tex, 0); @@ -181,6 +211,12 @@ void LLRenderTarget::addColorAttachment(U32 color_fmt) mTex.push_back(tex); + if (gDebugGL) + { //bind and unbind to validate target + bindTarget(); + flush(); + } + } void LLRenderTarget::allocateDepth() @@ -197,9 +233,20 @@ void LLRenderTarget::allocateDepth() { LLImageGL::generateTextures(1, &mDepth); gGL.getTexUnit(0)->bindManual(mUsage, mDepth); - U32 internal_type = LLTexUnit::getInternalType(mUsage); - gGL.getTexUnit(0)->setTextureFilteringOption(LLTexUnit::TFO_POINT); - LLImageGL::setManualImage(internal_type, 0, GL_DEPTH_COMPONENT32, mResX, mResY, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, NULL); + if (mSamples == 0) + { + U32 internal_type = LLTexUnit::getInternalType(mUsage); + gGL.getTexUnit(0)->setTextureFilteringOption(LLTexUnit::TFO_POINT); + LLImageGL::setManualImage(internal_type, 0, GL_DEPTH_COMPONENT32, mResX, mResY, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, NULL); + } +#ifdef GL_ARB_texture_multisample + else + { + glTexImage2DMultisample(LLTexUnit::getInternalType(mUsage), mSamples, GL_DEPTH_COMPONENT32, mResX, mResY, GL_TRUE); + } +#else + llassert_always(mSamples <= 1); +#endif } } @@ -239,6 +286,9 @@ void LLRenderTarget::shareDepthBuffer(LLRenderTarget& target) glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, LLTexUnit::getInternalType(mUsage), mDepth, 0); stop_glerror(); } + + check_framebuffer_status(); + glBindFramebuffer(GL_FRAMEBUFFER, 0); target.mUseDepth = true; @@ -256,7 +306,7 @@ void LLRenderTarget::release() } else { - LLImageGL::deleteTextures(1, &mDepth); + LLImageGL::deleteTextures(1, &mDepth, true); stop_glerror(); } mDepth = 0; @@ -285,11 +335,12 @@ void LLRenderTarget::release() if (mTex.size() > 0) { - LLImageGL::deleteTextures(mTex.size(), &mTex[0]); + LLImageGL::deleteTextures(mTex.size(), &mTex[0], true); mTex.clear(); } + + mResX = mResY = 0; - mSampleBuffer = NULL; sBoundTarget = NULL; } @@ -298,34 +349,27 @@ void LLRenderTarget::bindTarget() if (mFBO) { stop_glerror(); - if (mSampleBuffer) - { - mSampleBuffer->bindTarget(this); - stop_glerror(); + + glBindFramebuffer(GL_FRAMEBUFFER, mFBO); + stop_glerror(); + if (gGLManager.mHasDrawBuffers) + { //setup multiple render targets + GLenum drawbuffers[] = {GL_COLOR_ATTACHMENT0, + GL_COLOR_ATTACHMENT1, + GL_COLOR_ATTACHMENT2, + GL_COLOR_ATTACHMENT3}; + glDrawBuffersARB(mTex.size(), drawbuffers); } - else - { - glBindFramebuffer(GL_FRAMEBUFFER, mFBO); - stop_glerror(); - if (gGLManager.mHasDrawBuffers) - { //setup multiple render targets - GLenum drawbuffers[] = {GL_COLOR_ATTACHMENT0, - GL_COLOR_ATTACHMENT1, - GL_COLOR_ATTACHMENT2, - GL_COLOR_ATTACHMENT3}; - glDrawBuffersARB(mTex.size(), drawbuffers); - } - if (mTex.empty()) - { //no color buffer to draw to - glDrawBuffer(GL_NONE); - glReadBuffer(GL_NONE); - } + if (mTex.empty()) + { //no color buffer to draw to + glDrawBuffer(GL_NONE); + glReadBuffer(GL_NONE); + } - check_framebuffer_status(); + check_framebuffer_status(); - stop_glerror(); - } + stop_glerror(); } glViewport(0, 0, mResX, mResY); @@ -407,50 +451,8 @@ void LLRenderTarget::flush(bool fetch_depth) else { stop_glerror(); - glBindFramebuffer(GL_FRAMEBUFFER, 0); - stop_glerror(); - - if (mSampleBuffer) - { - LLGLEnable multisample(GL_MULTISAMPLE); - stop_glerror(); - glBindFramebuffer(GL_FRAMEBUFFER, mFBO); - stop_glerror(); - check_framebuffer_status(); - glBindFramebuffer(GL_READ_FRAMEBUFFER, mSampleBuffer->mFBO); - check_framebuffer_status(); - - stop_glerror(); - glBlitFramebuffer(0, 0, mResX, mResY, 0, 0, mResX, mResY, GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT, GL_NEAREST); - stop_glerror(); - - if (mTex.size() > 1) - { - for (U32 i = 1; i < mTex.size(); ++i) - { - glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, - LLTexUnit::getInternalType(mUsage), mTex[i], 0); - stop_glerror(); - glFramebufferRenderbuffer(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, mSampleBuffer->mTex[i]); - stop_glerror(); - glBlitFramebuffer(0, 0, mResX, mResY, 0, 0, mResX, mResY, GL_COLOR_BUFFER_BIT, GL_NEAREST); - stop_glerror(); - } - - for (U32 i = 0; i < mTex.size(); ++i) - { - glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0+i, - LLTexUnit::getInternalType(mUsage), mTex[i], 0); - stop_glerror(); - glFramebufferRenderbuffer(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0+i, GL_RENDERBUFFER, mSampleBuffer->mTex[i]); - stop_glerror(); - } - } - } - - glBindFramebuffer(GL_FRAMEBUFFER, 0); } } @@ -467,37 +469,36 @@ void LLRenderTarget::copyContents(LLRenderTarget& source, S32 srcX0, S32 srcY0, llerrs << "Cannot copy framebuffer contents for non FBO render targets." << llendl; } - if (mSampleBuffer) + + if (mask == GL_DEPTH_BUFFER_BIT && source.mStencil != mStencil) { - mSampleBuffer->copyContents(source, srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter); + stop_glerror(); + + glBindFramebuffer(GL_FRAMEBUFFER, source.mFBO); + check_framebuffer_status(); + gGL.getTexUnit(0)->bind(this, true); + stop_glerror(); + glCopyTexSubImage2D(LLTexUnit::getInternalType(mUsage), 0, srcX0, srcY0, dstX0, dstY0, dstX1, dstY1); + stop_glerror(); + glBindFramebuffer(GL_FRAMEBUFFER, 0); + stop_glerror(); } else { - if (mask == GL_DEPTH_BUFFER_BIT && source.mStencil != mStencil) - { - stop_glerror(); - - glBindFramebuffer(GL_FRAMEBUFFER, source.mFBO); - gGL.getTexUnit(0)->bind(this, true); - stop_glerror(); - glCopyTexSubImage2D(LLTexUnit::getInternalType(mUsage), 0, srcX0, srcY0, dstX0, dstY0, dstX1, dstY1); - stop_glerror(); - glBindFramebuffer(GL_FRAMEBUFFER, 0); - stop_glerror(); - } - else - { - glBindFramebuffer(GL_READ_FRAMEBUFFER, source.mFBO); - stop_glerror(); - glBindFramebuffer(GL_DRAW_FRAMEBUFFER, mFBO); - stop_glerror(); - check_framebuffer_status(); - stop_glerror(); - glBlitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter); - stop_glerror(); - glBindFramebuffer(GL_FRAMEBUFFER, 0); - stop_glerror(); - } + glBindFramebuffer(GL_READ_FRAMEBUFFER, source.mFBO); + stop_glerror(); + glBindFramebuffer(GL_DRAW_FRAMEBUFFER, mFBO); + stop_glerror(); + check_framebuffer_status(); + stop_glerror(); + glBlitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter); + stop_glerror(); + glBindFramebuffer(GL_READ_FRAMEBUFFER, 0); + stop_glerror(); + glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); + stop_glerror(); + glBindFramebuffer(GL_FRAMEBUFFER, 0); + stop_glerror(); } } @@ -540,179 +541,3 @@ void LLRenderTarget::getViewport(S32* viewport) viewport[3] = mResY; } -//================================================== -// LLMultisampleBuffer implementation -//================================================== -LLMultisampleBuffer::LLMultisampleBuffer() -{ - -} - -LLMultisampleBuffer::~LLMultisampleBuffer() -{ - release(); -} - -void LLMultisampleBuffer::release() -{ - if (mFBO) - { - glDeleteFramebuffers(1, (GLuint *) &mFBO); - mFBO = 0; - } - - if (mTex.size() > 0) - { - glDeleteRenderbuffers(mTex.size(), (GLuint *) &mTex[0]); - mTex.clear(); - } - - if (mDepth) - { - glDeleteRenderbuffers(1, (GLuint *) &mDepth); - mDepth = 0; - } -} - -void LLMultisampleBuffer::bindTarget() -{ - bindTarget(this); -} - -void LLMultisampleBuffer::bindTarget(LLRenderTarget* ref) -{ - if (!ref) - { - ref = this; - } - - glBindFramebuffer(GL_FRAMEBUFFER, mFBO); - if (gGLManager.mHasDrawBuffers) - { //setup multiple render targets - GLenum drawbuffers[] = {GL_COLOR_ATTACHMENT0, - GL_COLOR_ATTACHMENT1, - GL_COLOR_ATTACHMENT2, - GL_COLOR_ATTACHMENT3}; - glDrawBuffersARB(ref->mTex.size(), drawbuffers); - } - - check_framebuffer_status(); - - glViewport(0, 0, mResX, mResY); - - sBoundTarget = this; -} - -void LLMultisampleBuffer::allocate(U32 resx, U32 resy, U32 color_fmt, bool depth, bool stencil, LLTexUnit::eTextureType usage, bool use_fbo ) -{ - allocate(resx,resy,color_fmt,depth,stencil,usage,use_fbo,2); -} - -void LLMultisampleBuffer::allocate(U32 resx, U32 resy, U32 color_fmt, bool depth, bool stencil, LLTexUnit::eTextureType usage, bool use_fbo, U32 samples ) -{ - stop_glerror(); - mResX = resx; - mResY = resy; - - mUsage = usage; - mUseDepth = depth; - mStencil = stencil; - - release(); - - mSamples = samples; - - if (mSamples <= 1) - { - llerrs << "Cannot create a multisample buffer with less than 2 samples." << llendl; - } - - stop_glerror(); - - if ((sUseFBO || use_fbo) && gGLManager.mHasFramebufferObject) - { - - if (depth) - { - stop_glerror(); - allocateDepth(); - stop_glerror(); - } - - glGenFramebuffers(1, (GLuint *) &mFBO); - - glBindFramebuffer(GL_FRAMEBUFFER, mFBO); - - if (mDepth) - { - glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, mDepth); - if (mStencil) - { - glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, mDepth); - } - } - - stop_glerror(); - glBindFramebuffer(GL_FRAMEBUFFER, 0); - stop_glerror(); - } - - addColorAttachment(color_fmt); -} - -void LLMultisampleBuffer::addColorAttachment(U32 color_fmt) -{ - if (color_fmt == 0) - { - return; - } - - U32 offset = mTex.size(); - if (offset >= 4 || - (offset > 0 && (mFBO == 0 || !gGLManager.mHasDrawBuffers))) - { - llerrs << "Too many color attachments!" << llendl; - } - - U32 tex; - glGenRenderbuffers(1, &tex); - - glBindRenderbuffer(GL_RENDERBUFFER, tex); - glRenderbufferStorageMultisample(GL_RENDERBUFFER, mSamples, color_fmt, mResX, mResY); - stop_glerror(); - - if (mFBO) - { - glBindFramebuffer(GL_FRAMEBUFFER, mFBO); - glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0+offset, GL_RENDERBUFFER, tex); - stop_glerror(); - GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER); - switch (status) - { - case GL_FRAMEBUFFER_COMPLETE: - break; - default: - llerrs << "WTF? " << std::hex << status << llendl; - break; - } - - glBindFramebuffer(GL_FRAMEBUFFER, 0); - } - - mTex.push_back(tex); -} - -void LLMultisampleBuffer::allocateDepth() -{ - glGenRenderbuffers(1, (GLuint* ) &mDepth); - glBindRenderbuffer(GL_RENDERBUFFER, mDepth); - if (mStencil) - { - glRenderbufferStorageMultisample(GL_RENDERBUFFER, mSamples, GL_DEPTH24_STENCIL8, mResX, mResY); - } - else - { - glRenderbufferStorageMultisample(GL_RENDERBUFFER, mSamples, GL_DEPTH_COMPONENT16, mResX, mResY); - } -} - diff --git a/indra/llrender/llrendertarget.h b/indra/llrender/llrendertarget.h index 12dd1c8b90f85a734e9a108226a4e85552588798..094b58b562cabcab805cbfc7415c7805714d9940 100644 --- a/indra/llrender/llrendertarget.h +++ b/indra/llrender/llrendertarget.h @@ -71,10 +71,7 @@ class LLRenderTarget //allocate resources for rendering //must be called before use //multiple calls will release previously allocated resources - void allocate(U32 resx, U32 resy, U32 color_fmt, bool depth, bool stencil, LLTexUnit::eTextureType usage = LLTexUnit::TT_TEXTURE, bool use_fbo = FALSE); - - //provide this render target with a multisample resource. - void setSampleBuffer(LLMultisampleBuffer* buffer); + void allocate(U32 resx, U32 resy, U32 color_fmt, bool depth, bool stencil, LLTexUnit::eTextureType usage = LLTexUnit::TT_TEXTURE, bool use_fbo = false, S32 samples = 0); //add color buffer attachment //limit of 4 color attachments per render target @@ -141,7 +138,6 @@ class LLRenderTarget static LLRenderTarget* getCurrentBoundTarget() { return sBoundTarget; } protected: - friend class LLMultisampleBuffer; U32 mResX; U32 mResY; std::vector<U32> mTex; @@ -152,26 +148,8 @@ class LLRenderTarget bool mRenderDepth; LLTexUnit::eTextureType mUsage; U32 mSamples; - LLMultisampleBuffer* mSampleBuffer; - - static LLRenderTarget* sBoundTarget; -}; - -class LLMultisampleBuffer : public LLRenderTarget -{ -public: - LLMultisampleBuffer(); - virtual ~LLMultisampleBuffer(); - - virtual void release(); - - virtual void bindTarget(); - void bindTarget(LLRenderTarget* ref); - virtual void allocate(U32 resx, U32 resy, U32 color_fmt, bool depth, bool stencil, LLTexUnit::eTextureType usage, bool use_fbo); - void allocate(U32 resx, U32 resy, U32 color_fmt, bool depth, bool stencil, LLTexUnit::eTextureType usage, bool use_fbo, U32 samples); - virtual void addColorAttachment(U32 color_fmt); - virtual void allocateDepth(); + static LLRenderTarget* sBoundTarget; }; #endif //!LL_MESA_HEADLESS diff --git a/indra/llrender/llshadermgr.cpp b/indra/llrender/llshadermgr.cpp index 98a0a93084e1762281ba02da11ec5daff2490b6e..bdc103b9170526602ae58aca40cd0dca6cb855a5 100644 --- a/indra/llrender/llshadermgr.cpp +++ b/indra/llrender/llshadermgr.cpp @@ -209,17 +209,39 @@ BOOL LLShaderMgr::attachShaderFeatures(LLGLSLShader * shader) if (features->hasWaterFog) { - if (!shader->attachObject("lighting/lightWaterF.glsl")) + if (features->disableTextureIndex) { - return FALSE; + if (!shader->attachObject("lighting/lightWaterNonIndexedF.glsl")) + { + return FALSE; + } + } + else + { + if (!shader->attachObject("lighting/lightWaterF.glsl")) + { + return FALSE; + } + shader->mFeatures.mIndexedTextureChannels = gGLManager.mNumTextureImageUnits-1; } } else { - if (!shader->attachObject("lighting/lightF.glsl")) + if (features->disableTextureIndex) { - return FALSE; + if (!shader->attachObject("lighting/lightNonIndexedF.glsl")) + { + return FALSE; + } + } + else + { + if (!shader->attachObject("lighting/lightF.glsl")) + { + return FALSE; + } + shader->mFeatures.mIndexedTextureChannels = gGLManager.mNumTextureImageUnits-1; } } } @@ -230,32 +252,76 @@ BOOL LLShaderMgr::attachShaderFeatures(LLGLSLShader * shader) if (features->isShiny && features->hasWaterFog) { - if (!shader->attachObject("lighting/lightFullbrightShinyWaterF.glsl")) + if (features->disableTextureIndex) { - return FALSE; + if (!shader->attachObject("lighting/lightFullbrightShinyWaterNonIndexedF.glsl")) + { + return FALSE; + } + } + else + { + if (!shader->attachObject("lighting/lightFullbrightShinyWaterF.glsl")) + { + return FALSE; + } + shader->mFeatures.mIndexedTextureChannels = gGLManager.mNumTextureImageUnits-1; } } else if (features->hasWaterFog) { - if (!shader->attachObject("lighting/lightFullbrightWaterF.glsl")) + if (features->disableTextureIndex) { - return FALSE; + if (!shader->attachObject("lighting/lightFullbrightWaterNonIndexedF.glsl")) + { + return FALSE; + } + } + else + { + if (!shader->attachObject("lighting/lightFullbrightWaterF.glsl")) + { + return FALSE; + } + shader->mFeatures.mIndexedTextureChannels = gGLManager.mNumTextureImageUnits-1; } } else if (features->isShiny) { - if (!shader->attachObject("lighting/lightFullbrightShinyF.glsl")) + if (features->disableTextureIndex) { - return FALSE; + if (!shader->attachObject("lighting/lightFullbrightShinyNonIndexedF.glsl")) + { + return FALSE; + } + } + else + { + if (!shader->attachObject("lighting/lightFullbrightShinyF.glsl")) + { + return FALSE; + } + shader->mFeatures.mIndexedTextureChannels = gGLManager.mNumTextureImageUnits-1; } } else { - if (!shader->attachObject("lighting/lightFullbrightF.glsl")) + if (features->disableTextureIndex) { - return FALSE; + if (!shader->attachObject("lighting/lightFullbrightNonIndexedF.glsl")) + { + return FALSE; + } + } + else + { + if (!shader->attachObject("lighting/lightFullbrightF.glsl")) + { + return FALSE; + } + shader->mFeatures.mIndexedTextureChannels = gGLManager.mNumTextureImageUnits-1; } } } @@ -266,17 +332,39 @@ BOOL LLShaderMgr::attachShaderFeatures(LLGLSLShader * shader) if (features->hasWaterFog) { - if (!shader->attachObject("lighting/lightShinyWaterF.glsl")) + if (features->disableTextureIndex) { - return FALSE; + if (!shader->attachObject("lighting/lightShinyWaterNonIndexedF.glsl")) + { + return FALSE; + } + } + else + { + if (!shader->attachObject("lighting/lightShinyWaterF.glsl")) + { + return FALSE; + } + shader->mFeatures.mIndexedTextureChannels = gGLManager.mNumTextureImageUnits-1; } } else { - if (!shader->attachObject("lighting/lightShinyF.glsl")) + if (features->disableTextureIndex) { - return FALSE; + if (!shader->attachObject("lighting/lightShinyNonIndexedF.glsl")) + { + return FALSE; + } + } + else + { + if (!shader->attachObject("lighting/lightShinyF.glsl")) + { + return FALSE; + } + shader->mFeatures.mIndexedTextureChannels = gGLManager.mNumTextureImageUnits-1; } } } @@ -315,12 +403,12 @@ void LLShaderMgr::dumpObjectLog(GLhandleARB ret, BOOL warns) } else { - LL_INFOS("ShaderLoading") << log << LL_ENDL; + LL_DEBUGS("ShaderLoading") << log << LL_ENDL; } } } -GLhandleARB LLShaderMgr::loadShaderFile(const std::string& filename, S32 & shader_level, GLenum type) +GLhandleARB LLShaderMgr::loadShaderFile(const std::string& filename, S32 & shader_level, GLenum type, S32 texture_index_channels) { GLenum error = GL_NO_ERROR; if (gDebugGL) @@ -374,6 +462,106 @@ GLhandleARB LLShaderMgr::loadShaderFile(const std::string& filename, S32 & shade GLcharARB* text[1024]; GLuint count = 0; + if (gGLManager.mGLVersion < 3.f) + { + //set version to 1.20 + text[count++] = strdup("#version 120\n"); + } + else + { //set version to 1.30 + text[count++] = strdup("#version 130\n"); + } + + //copy preprocessor definitions into buffer + for (std::map<std::string,std::string>::iterator iter = mDefinitions.begin(); iter != mDefinitions.end(); ++iter) + { + std::string define = "#define " + iter->first + " " + iter->second + "\n"; + text[count++] = (GLcharARB *) strdup(define.c_str()); + } + + if (texture_index_channels > 0 && type == GL_FRAGMENT_SHADER_ARB) + { + //use specified number of texture channels for indexed texture rendering + + /* prepend shader code that looks like this: + + uniform sampler2D tex0; + uniform sampler2D tex1; + uniform sampler2D tex2; + . + . + . + uniform sampler2D texN; + + varying float vary_texture_index; + + vec4 diffuseLookup(vec2 texcoord) + { + switch (int(vary_texture_index+0.25)) + { + case 0: return texture2D(tex0, texcoord); + case 1: return texture2D(tex1, texcoord); + case 2: return texture2D(tex2, texcoord); + . + . + . + case N: return texture2D(texN, texcoord); + } + + return vec4(0,0,0,0); + } + */ + + //uniform declartion + for (S32 i = 0; i < texture_index_channels; ++i) + { + std::string decl = llformat("uniform sampler2D tex%d;\n", i); + text[count++] = strdup(decl.c_str()); + } + + text[count++] = strdup("varying float vary_texture_index;\n"); + text[count++] = strdup("vec4 diffuseLookup(vec2 texcoord)\n"); + text[count++] = strdup("{\n"); + + + if (gGLManager.mGLVersion >= 3.f) + { + text[count++] = strdup("\tswitch (int(vary_texture_index+0.25))\n"); + text[count++] = strdup("\t{\n"); + + //switch body + for (S32 i = 0; i < texture_index_channels; ++i) + { + std::string case_str = llformat("\t\tcase %d: return texture2D(tex%d, texcoord);\n", i, i); + text[count++] = strdup(case_str.c_str()); + } + + text[count++] = strdup("\t}\n"); + } + else + { + //switches aren't supported, make block that looks like: + /* + int ti = int(vary_texture_index+0.25); + if (ti == 0) return texture2D(tex0, texcoord); + if (ti == 1) return texture2D(tex1, texcoord); + . + . + . + if (ti == N) return texture2D(texN, texcoord); + */ + + text[count++] = strdup("int ti = int(vary_texture_index+0.25);\n"); + for (S32 i = 0; i < texture_index_channels; ++i) + { + std::string if_str = llformat("if (ti == %d) return texture2D(tex%d, texcoord);\n", i, i); + text[count++] = strdup(if_str.c_str()); + } + } + + text[count++] = strdup("\treturn vec4(0,0,0,0);\n"); + text[count++] = strdup("}\n"); + } //copy file into memory while( fgets((char *)buff, 1024, file) != NULL && count < LL_ARRAY_SIZE(buff) ) @@ -457,7 +645,7 @@ GLhandleARB LLShaderMgr::loadShaderFile(const std::string& filename, S32 & shade if (shader_level > 1) { shader_level--; - return loadShaderFile(filename,shader_level,type); + return loadShaderFile(filename,shader_level,type,texture_index_channels); } LL_WARNS("ShaderLoading") << "Failed to load " << filename << LL_ENDL; } diff --git a/indra/llrender/llshadermgr.h b/indra/llrender/llshadermgr.h index c54c4608d7f043a9822b35272291d294569ffe15..2f3010381127f281d78f3bdf5c2739865a9ba65c 100644 --- a/indra/llrender/llshadermgr.h +++ b/indra/llrender/llshadermgr.h @@ -43,7 +43,7 @@ class LLShaderMgr void dumpObjectLog(GLhandleARB ret, BOOL warns = TRUE); BOOL linkProgramObject(GLhandleARB obj, BOOL suppress_errors = FALSE); BOOL validateProgramObject(GLhandleARB obj); - GLhandleARB loadShaderFile(const std::string& filename, S32 & shader_level, GLenum type); + GLhandleARB loadShaderFile(const std::string& filename, S32 & shader_level, GLenum type, S32 texture_index_channels = -1); // Implemented in the application to actually point to the shader directory. virtual std::string getShaderDirPrefix(void) = 0; // Pure Virtual @@ -60,6 +60,9 @@ class LLShaderMgr std::vector<std::string> mReservedUniforms; + //preprocessor definitions (name/value) + std::map<std::string, std::string> mDefinitions; + protected: // our parameter manager singleton instance diff --git a/indra/llrender/llvertexbuffer.cpp b/indra/llrender/llvertexbuffer.cpp index 8c9171ccf45cedbb24fe1cb3890948f17093f190..4a0b964e616bb06644ed4bbe6b5f011ca2fdb021 100644 --- a/indra/llrender/llvertexbuffer.cpp +++ b/indra/llrender/llvertexbuffer.cpp @@ -934,8 +934,26 @@ void LLVertexBuffer::allocateClientIndexBuffer() } } +bool expand_region(LLVertexBuffer::MappedRegion& region, S32 index, S32 count) +{ + S32 end = index+count; + S32 region_end = region.mIndex+region.mCount; + + if (end < region.mIndex || + index > region_end) + { //gap exists, do not merge + return false; + } + + S32 new_end = llmax(end, region_end); + S32 new_index = llmin(index, region.mIndex); + region.mIndex = new_index; + region.mCount = new_end-new_index; + return true; +} + // Map for data access -U8* LLVertexBuffer::mapVertexBuffer(S32 type, S32 access) +U8* LLVertexBuffer::mapVertexBuffer(S32 type, S32 index, S32 count, bool map_range) { LLMemType mt2(LLMemType::MTYPE_VERTEX_MAP_BUFFER); if (mFinal) @@ -947,8 +965,45 @@ U8* LLVertexBuffer::mapVertexBuffer(S32 type, S32 access) llerrs << "LLVertexBuffer::mapVertexBuffer() called on unallocated buffer." << llendl; } - if (!mVertexLocked && useVBOs()) + if (useVBOs()) { + + if (sDisableVBOMapping || gGLManager.mHasMapBufferRange) + { + if (count == -1) + { + count = mNumVerts-index; + } + + bool mapped = false; + //see if range is already mapped + for (U32 i = 0; i < mMappedVertexRegions.size(); ++i) + { + MappedRegion& region = mMappedVertexRegions[i]; + if (region.mType == type) + { + if (expand_region(region, index, count)) + { + mapped = true; + break; + } + } + } + + if (!mapped) + { + //not already mapped, map new region + MappedRegion region(type, !sDisableVBOMapping && map_range ? -1 : index, count); + mMappedVertexRegions.push_back(region); + } + } + + if (mVertexLocked && map_range) + { + llerrs << "Attempted to map a specific range of a buffer that was already mapped." << llendl; + } + + if (!mVertexLocked) { LLMemType mt_v(LLMemType::MTYPE_VERTEX_MAP_BUFFER_VERTICES); setBuffer(0, type); @@ -957,61 +1012,95 @@ U8* LLVertexBuffer::mapVertexBuffer(S32 type, S32 access) if(sDisableVBOMapping) { + map_range = false; allocateClientVertexBuffer() ; } else { - U8* src = (U8*) glMapBufferARB(GL_ARRAY_BUFFER_ARB, GL_WRITE_ONLY_ARB); + U8* src = NULL; +#ifdef GL_ARB_map_buffer_range + if (gGLManager.mHasMapBufferRange) + { + if (map_range) + { + S32 offset = mOffsets[type] + sTypeSize[type]*index; + S32 length = (sTypeSize[type]*count+0xF) & ~0xF; + src = (U8*) glMapBufferRange(GL_ARRAY_BUFFER_ARB, offset, length, GL_MAP_WRITE_BIT | GL_MAP_FLUSH_EXPLICIT_BIT | GL_MAP_INVALIDATE_RANGE_BIT); + } + else + { + src = (U8*) glMapBufferRange(GL_ARRAY_BUFFER_ARB, 0, mSize, GL_MAP_WRITE_BIT | GL_MAP_FLUSH_EXPLICIT_BIT); + } + } + else +#else + llassert_always(!gGLManager.mHasMapBufferRange); +#endif + { + map_range = false; + src = (U8*) glMapBufferARB(GL_ARRAY_BUFFER_ARB, GL_WRITE_ONLY_ARB); + } + mMappedData = LL_NEXT_ALIGNED_ADDRESS<U8>(src); mAlignedOffset = mMappedData - src; stop_glerror(); } - } - - - if (!mMappedData) - { - log_glerror(); - - //check the availability of memory - U32 avail_phy_mem, avail_vir_mem; - LLMemoryInfo::getAvailableMemoryKB(avail_phy_mem, avail_vir_mem) ; - llinfos << "Available physical mwmory(KB): " << avail_phy_mem << llendl ; - llinfos << "Available virtual memory(KB): " << avail_vir_mem << llendl; - - if(!sDisableVBOMapping) - { - //-------------------- - //print out more debug info before crash - llinfos << "vertex buffer size: (num verts : num indices) = " << getNumVerts() << " : " << getNumIndices() << llendl ; - GLint size ; - glGetBufferParameterivARB(GL_ARRAY_BUFFER_ARB, GL_BUFFER_SIZE_ARB, &size) ; - llinfos << "GL_ARRAY_BUFFER_ARB size is " << size << llendl ; - //-------------------- + + if (!mMappedData) + { + log_glerror(); + + //check the availability of memory + U32 avail_phy_mem, avail_vir_mem; + LLMemoryInfo::getAvailableMemoryKB(avail_phy_mem, avail_vir_mem) ; + llinfos << "Available physical mwmory(KB): " << avail_phy_mem << llendl ; + llinfos << "Available virtual memory(KB): " << avail_vir_mem << llendl; + + if(!sDisableVBOMapping) + { + //-------------------- + //print out more debug info before crash + llinfos << "vertex buffer size: (num verts : num indices) = " << getNumVerts() << " : " << getNumIndices() << llendl ; + GLint size ; + glGetBufferParameterivARB(GL_ARRAY_BUFFER_ARB, GL_BUFFER_SIZE_ARB, &size) ; + llinfos << "GL_ARRAY_BUFFER_ARB size is " << size << llendl ; + //-------------------- + + GLint buff; + glGetIntegerv(GL_ARRAY_BUFFER_BINDING_ARB, &buff); + if ((GLuint)buff != mGLBuffer) + { + llerrs << "Invalid GL vertex buffer bound: " << buff << llendl; + } - GLint buff; - glGetIntegerv(GL_ARRAY_BUFFER_BINDING_ARB, &buff); - if ((GLuint)buff != mGLBuffer) + + llerrs << "glMapBuffer returned NULL (no vertex data)" << llendl; + } + else { - llerrs << "Invalid GL vertex buffer bound: " << buff << llendl; + llerrs << "memory allocation for vertex data failed." << llendl ; } - - - llerrs << "glMapBuffer returned NULL (no vertex data)" << llendl; - } - else - { - llerrs << "memory allocation for vertex data failed." << llendl ; } + sMappedCount++; } - sMappedCount++; + } + else + { + map_range = false; } - return mMappedData; + if (map_range && !sDisableVBOMapping) + { + return mMappedData; + } + else + { + return mMappedData+mOffsets[type]+sTypeSize[type]*index; + } } -U8* LLVertexBuffer::mapIndexBuffer(S32 access) +U8* LLVertexBuffer::mapIndexBuffer(S32 index, S32 count, bool map_range) { LLMemType mt2(LLMemType::MTYPE_VERTEX_MAP_BUFFER); if (mFinal) @@ -1023,8 +1112,41 @@ U8* LLVertexBuffer::mapIndexBuffer(S32 access) llerrs << "LLVertexBuffer::mapIndexBuffer() called on unallocated buffer." << llendl; } - if (!mIndexLocked && useVBOs()) + if (useVBOs()) { + if (sDisableVBOMapping || gGLManager.mHasMapBufferRange) + { + if (count == -1) + { + count = mNumIndices-index; + } + + bool mapped = false; + //see if range is already mapped + for (U32 i = 0; i < mMappedIndexRegions.size(); ++i) + { + MappedRegion& region = mMappedIndexRegions[i]; + if (expand_region(region, index, count)) + { + mapped = true; + break; + } + } + + if (!mapped) + { + //not already mapped, map new region + MappedRegion region(TYPE_INDEX, !sDisableVBOMapping && map_range ? -1 : index, count); + mMappedIndexRegions.push_back(region); + } + } + + if (mIndexLocked && map_range) + { + llerrs << "Attempted to map a specific range of a buffer that was already mapped." << llendl; + } + + if (!mIndexLocked) { LLMemType mt_v(LLMemType::MTYPE_VERTEX_MAP_BUFFER_INDICES); @@ -1034,12 +1156,36 @@ U8* LLVertexBuffer::mapIndexBuffer(S32 access) if(sDisableVBOMapping) { + map_range = false; allocateClientIndexBuffer() ; } else { - U8* src = (U8*) glMapBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, GL_WRITE_ONLY_ARB); - mMappedIndexData = LL_NEXT_ALIGNED_ADDRESS<U8>(src); + U8* src = NULL; +#ifdef GL_ARB_map_buffer_range + if (gGLManager.mHasMapBufferRange) + { + if (map_range) + { + S32 offset = sizeof(U16)*index; + S32 length = sizeof(U16)*count; + src = (U8*) glMapBufferRange(GL_ELEMENT_ARRAY_BUFFER_ARB, offset, length, GL_MAP_WRITE_BIT | GL_MAP_FLUSH_EXPLICIT_BIT | GL_MAP_INVALIDATE_RANGE_BIT); + } + else + { + src = (U8*) glMapBufferRange(GL_ELEMENT_ARRAY_BUFFER_ARB, 0, sizeof(U16)*mNumIndices, GL_MAP_WRITE_BIT | GL_MAP_FLUSH_EXPLICIT_BIT); + } + } + else +#else + llassert_always(!gGLManager.mHasMapBufferRange); +#endif + { + map_range = false; + src = (U8*) glMapBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, GL_WRITE_ONLY_ARB); + } + + mMappedIndexData = src; //LL_NEXT_ALIGNED_ADDRESS<U8>(src); mAlignedIndexOffset = mMappedIndexData - src; stop_glerror(); } @@ -1068,31 +1214,81 @@ U8* LLVertexBuffer::mapIndexBuffer(S32 access) sMappedCount++; } + else + { + map_range = false; + } - return mMappedIndexData ; + if (map_range && !sDisableVBOMapping) + { + return mMappedIndexData; + } + else + { + return mMappedIndexData + sizeof(U16)*index; + } } void LLVertexBuffer::unmapBuffer(S32 type) { LLMemType mt2(LLMemType::MTYPE_VERTEX_UNMAP_BUFFER); - if (!useVBOs()) + if (!useVBOs() || type == -2) { return ; //nothing to unmap } bool updated_all = false ; + if (mMappedData && mVertexLocked && type != TYPE_INDEX) { updated_all = (mIndexLocked && type < 0) ; //both vertex and index buffers done updating if(sDisableVBOMapping) { - stop_glerror(); - glBufferSubDataARB(GL_ARRAY_BUFFER_ARB, 0, getSize(), mMappedData); - stop_glerror(); + if (!mMappedVertexRegions.empty()) + { + stop_glerror(); + for (U32 i = 0; i < mMappedVertexRegions.size(); ++i) + { + const MappedRegion& region = mMappedVertexRegions[i]; + S32 offset = region.mIndex >= 0 ? mOffsets[region.mType]+sTypeSize[region.mType]*region.mIndex : 0; + S32 length = sTypeSize[region.mType]*region.mCount; + glBufferSubDataARB(GL_ARRAY_BUFFER_ARB, offset, length, mMappedData+offset); + stop_glerror(); + } + + mMappedVertexRegions.clear(); + } + else + { + stop_glerror(); + glBufferSubDataARB(GL_ARRAY_BUFFER_ARB, 0, getSize(), mMappedData); + stop_glerror(); + } } else { +#ifdef GL_ARB_map_buffer_range + if (gGLManager.mHasMapBufferRange) + { + if (!mMappedVertexRegions.empty()) + { + stop_glerror(); + for (U32 i = 0; i < mMappedVertexRegions.size(); ++i) + { + const MappedRegion& region = mMappedVertexRegions[i]; + S32 offset = region.mIndex >= 0 ? mOffsets[region.mType]+sTypeSize[region.mType]*region.mIndex : 0; + S32 length = sTypeSize[region.mType]*region.mCount; + glFlushMappedBufferRange(GL_ARRAY_BUFFER_ARB, offset, length); + stop_glerror(); + } + + mMappedVertexRegions.clear(); + } + } +#else + llassert_always(!gGLManager.mHasMapBufferRange); +#endif stop_glerror(); glUnmapBufferARB(GL_ARRAY_BUFFER_ARB); stop_glerror(); @@ -1103,17 +1299,53 @@ void LLVertexBuffer::unmapBuffer(S32 type) mVertexLocked = FALSE ; sMappedCount--; } - - if(mMappedIndexData && mIndexLocked && (type < 0 || type == TYPE_INDEX)) + + if (mMappedIndexData && mIndexLocked && (type < 0 || type == TYPE_INDEX)) { if(sDisableVBOMapping) { - stop_glerror(); - glBufferSubDataARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0, getIndicesSize(), mMappedIndexData); - stop_glerror(); + if (!mMappedIndexRegions.empty()) + { + for (U32 i = 0; i < mMappedIndexRegions.size(); ++i) + { + const MappedRegion& region = mMappedIndexRegions[i]; + S32 offset = region.mIndex >= 0 ? sizeof(U16)*region.mIndex : 0; + S32 length = sizeof(U16)*region.mCount; + glBufferSubDataARB(GL_ELEMENT_ARRAY_BUFFER_ARB, offset, length, mMappedIndexData+offset); + stop_glerror(); + } + + mMappedIndexRegions.clear(); + } + else + { + stop_glerror(); + glBufferSubDataARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0, getIndicesSize(), mMappedIndexData); + stop_glerror(); + } } else { +#ifdef GL_ARB_map_buffer_range + if (gGLManager.mHasMapBufferRange) + { + if (!mMappedIndexRegions.empty()) + { + for (U32 i = 0; i < mMappedIndexRegions.size(); ++i) + { + const MappedRegion& region = mMappedIndexRegions[i]; + S32 offset = region.mIndex >= 0 ? sizeof(U16)*region.mIndex : 0; + S32 length = sizeof(U16)*region.mCount; + glFlushMappedBufferRange(GL_ELEMENT_ARRAY_BUFFER_ARB, offset, length); + stop_glerror(); + } + + mMappedIndexRegions.clear(); + } + } +#else + llassert_always(!gGLManager.mHasMapBufferRange); +#endif stop_glerror(); glUnmapBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB); stop_glerror(); @@ -1152,19 +1384,19 @@ template <class T,S32 type> struct VertexBufferStrider typedef LLStrider<T> strider_t; static bool get(LLVertexBuffer& vbo, strider_t& strider, - S32 index) + S32 index, S32 count, bool map_range) { if (type == LLVertexBuffer::TYPE_INDEX) { - S32 stride = sizeof(T); + U8* ptr = vbo.mapIndexBuffer(index, count, map_range); - if (vbo.mapIndexBuffer() == NULL) + if (ptr == NULL) { llwarns << "mapIndexBuffer failed!" << llendl; return FALSE; } - strider = (T*)(vbo.getMappedIndices() + index*stride); + strider = (T*)ptr; strider.setStride(0); return TRUE; } @@ -1172,13 +1404,15 @@ template <class T,S32 type> struct VertexBufferStrider { S32 stride = LLVertexBuffer::sTypeSize[type]; - if (vbo.mapVertexBuffer(type) == NULL) + U8* ptr = vbo.mapVertexBuffer(type, index, count, map_range); + + if (ptr == NULL) { llwarns << "mapVertexBuffer failed!" << llendl; return FALSE; } - strider = (T*)(vbo.getMappedData() + vbo.getOffset(type)+index*stride); + strider = (T*)ptr; strider.setStride(stride); return TRUE; } @@ -1190,55 +1424,48 @@ template <class T,S32 type> struct VertexBufferStrider } }; -bool LLVertexBuffer::getVertexStrider(LLStrider<LLVector3>& strider, S32 index) -{ - return VertexBufferStrider<LLVector3,TYPE_VERTEX>::get(*this, strider, index); -} -bool LLVertexBuffer::getIndexStrider(LLStrider<U16>& strider, S32 index) +bool LLVertexBuffer::getVertexStrider(LLStrider<LLVector3>& strider, S32 index, S32 count, bool map_range) { - return VertexBufferStrider<U16,TYPE_INDEX>::get(*this, strider, index); + return VertexBufferStrider<LLVector3,TYPE_VERTEX>::get(*this, strider, index, count, map_range); } -bool LLVertexBuffer::getTexCoord0Strider(LLStrider<LLVector2>& strider, S32 index) +bool LLVertexBuffer::getIndexStrider(LLStrider<U16>& strider, S32 index, S32 count, bool map_range) { - return VertexBufferStrider<LLVector2,TYPE_TEXCOORD0>::get(*this, strider, index); + return VertexBufferStrider<U16,TYPE_INDEX>::get(*this, strider, index, count, map_range); } -bool LLVertexBuffer::getTexCoord1Strider(LLStrider<LLVector2>& strider, S32 index) +bool LLVertexBuffer::getTexCoord0Strider(LLStrider<LLVector2>& strider, S32 index, S32 count, bool map_range) { - return VertexBufferStrider<LLVector2,TYPE_TEXCOORD1>::get(*this, strider, index); + return VertexBufferStrider<LLVector2,TYPE_TEXCOORD0>::get(*this, strider, index, count, map_range); } -/*bool LLVertexBuffer::getTexCoord2Strider(LLStrider<LLVector2>& strider, S32 index) +bool LLVertexBuffer::getTexCoord1Strider(LLStrider<LLVector2>& strider, S32 index, S32 count, bool map_range) { - return VertexBufferStrider<LLVector2,TYPE_TEXCOORD2>::get(*this, strider, index); + return VertexBufferStrider<LLVector2,TYPE_TEXCOORD1>::get(*this, strider, index, count, map_range); } -bool LLVertexBuffer::getTexCoord3Strider(LLStrider<LLVector2>& strider, S32 index) -{ - return VertexBufferStrider<LLVector2,TYPE_TEXCOORD3>::get(*this, strider, index); -}*/ -bool LLVertexBuffer::getNormalStrider(LLStrider<LLVector3>& strider, S32 index) + +bool LLVertexBuffer::getNormalStrider(LLStrider<LLVector3>& strider, S32 index, S32 count, bool map_range) { - return VertexBufferStrider<LLVector3,TYPE_NORMAL>::get(*this, strider, index); + return VertexBufferStrider<LLVector3,TYPE_NORMAL>::get(*this, strider, index, count, map_range); } -bool LLVertexBuffer::getBinormalStrider(LLStrider<LLVector3>& strider, S32 index) +bool LLVertexBuffer::getBinormalStrider(LLStrider<LLVector3>& strider, S32 index, S32 count, bool map_range) { - return VertexBufferStrider<LLVector3,TYPE_BINORMAL>::get(*this, strider, index); + return VertexBufferStrider<LLVector3,TYPE_BINORMAL>::get(*this, strider, index, count, map_range); } -bool LLVertexBuffer::getColorStrider(LLStrider<LLColor4U>& strider, S32 index) +bool LLVertexBuffer::getColorStrider(LLStrider<LLColor4U>& strider, S32 index, S32 count, bool map_range) { - return VertexBufferStrider<LLColor4U,TYPE_COLOR>::get(*this, strider, index); + return VertexBufferStrider<LLColor4U,TYPE_COLOR>::get(*this, strider, index, count, map_range); } -bool LLVertexBuffer::getWeightStrider(LLStrider<F32>& strider, S32 index) +bool LLVertexBuffer::getWeightStrider(LLStrider<F32>& strider, S32 index, S32 count, bool map_range) { - return VertexBufferStrider<F32,TYPE_WEIGHT>::get(*this, strider, index); + return VertexBufferStrider<F32,TYPE_WEIGHT>::get(*this, strider, index, count, map_range); } -bool LLVertexBuffer::getWeight4Strider(LLStrider<LLVector4>& strider, S32 index) +bool LLVertexBuffer::getWeight4Strider(LLStrider<LLVector4>& strider, S32 index, S32 count, bool map_range) { - return VertexBufferStrider<LLVector4,TYPE_WEIGHT4>::get(*this, strider, index); + return VertexBufferStrider<LLVector4,TYPE_WEIGHT4>::get(*this, strider, index, count, map_range); } -bool LLVertexBuffer::getClothWeightStrider(LLStrider<LLVector4>& strider, S32 index) +bool LLVertexBuffer::getClothWeightStrider(LLStrider<LLVector4>& strider, S32 index, S32 count, bool map_range) { - return VertexBufferStrider<LLVector4,TYPE_CLOTHWEIGHT>::get(*this, strider, index); + return VertexBufferStrider<LLVector4,TYPE_CLOTHWEIGHT>::get(*this, strider, index, count, map_range); } //---------------------------------------------------------------------------- @@ -1497,17 +1724,16 @@ void LLVertexBuffer::setupVertexBuffer(U32 data_mask) const } if (data_mask & MAP_VERTEX) { - glVertexPointer(3,GL_FLOAT, LLVertexBuffer::sTypeSize[TYPE_VERTEX], (void*)(base + 0)); + if (data_mask & MAP_TEXTURE_INDEX) + { + glVertexPointer(4,GL_FLOAT, LLVertexBuffer::sTypeSize[TYPE_VERTEX], (void*)(base + 0)); + } + else + { + glVertexPointer(3,GL_FLOAT, LLVertexBuffer::sTypeSize[TYPE_VERTEX], (void*)(base + 0)); + } } llglassertok(); } -void LLVertexBuffer::markDirty(U32 vert_index, U32 vert_count, U32 indices_index, U32 indices_count) -{ - // TODO: use GL_APPLE_flush_buffer_range here - /*if (useVBOs() && !mFilthy) - { - - }*/ -} diff --git a/indra/llrender/llvertexbuffer.h b/indra/llrender/llvertexbuffer.h index a9f22193f87a4601aa25b94da85ad4fdb7ded85b..aa5df305a66f0eda5bf8b31caa304311f454e4d1 100644 --- a/indra/llrender/llvertexbuffer.h +++ b/indra/llrender/llvertexbuffer.h @@ -77,6 +77,18 @@ class LLVBOPool : public LLGLNamePool class LLVertexBuffer : public LLRefCount { public: + class MappedRegion + { + public: + S32 mType; + S32 mIndex; + S32 mCount; + + MappedRegion(S32 type, S32 index, S32 count) + : mType(type), mIndex(index), mCount(count) + { } + }; + LLVertexBuffer(const LLVertexBuffer& rhs) { *this = rhs; @@ -130,6 +142,9 @@ class LLVertexBuffer : public LLRefCount TYPE_CLOTHWEIGHT, TYPE_MAX, TYPE_INDEX, + + //no actual additional data, but indicates position.w is texture index + TYPE_TEXTURE_INDEX, }; enum { MAP_VERTEX = (1<<TYPE_VERTEX), @@ -144,6 +159,7 @@ class LLVertexBuffer : public LLRefCount MAP_WEIGHT = (1<<TYPE_WEIGHT), MAP_WEIGHT4 = (1<<TYPE_WEIGHT4), MAP_CLOTHWEIGHT = (1<<TYPE_CLOTHWEIGHT), + MAP_TEXTURE_INDEX = (1<<TYPE_TEXTURE_INDEX), }; protected: @@ -173,8 +189,8 @@ class LLVertexBuffer : public LLRefCount LLVertexBuffer(U32 typemask, S32 usage); // map for data access - U8* mapVertexBuffer(S32 type = -1, S32 access = -1); - U8* mapIndexBuffer(S32 access = -1); + U8* mapVertexBuffer(S32 type, S32 index, S32 count, bool map_range); + U8* mapIndexBuffer(S32 index, S32 count, bool map_range); // set for rendering virtual void setBuffer(U32 data_mask, S32 type = -1); // calls setupVertexBuffer() if data_mask is not 0 @@ -189,16 +205,16 @@ class LLVertexBuffer : public LLRefCount // vb->getNormalStrider(norms); // setVertsNorms(verts, norms); // vb->unmapBuffer(); - bool getVertexStrider(LLStrider<LLVector3>& strider, S32 index=0); - bool getIndexStrider(LLStrider<U16>& strider, S32 index=0); - bool getTexCoord0Strider(LLStrider<LLVector2>& strider, S32 index=0); - bool getTexCoord1Strider(LLStrider<LLVector2>& strider, S32 index=0); - bool getNormalStrider(LLStrider<LLVector3>& strider, S32 index=0); - bool getBinormalStrider(LLStrider<LLVector3>& strider, S32 index=0); - bool getColorStrider(LLStrider<LLColor4U>& strider, S32 index=0); - bool getWeightStrider(LLStrider<F32>& strider, S32 index=0); - bool getWeight4Strider(LLStrider<LLVector4>& strider, S32 index=0); - bool getClothWeightStrider(LLStrider<LLVector4>& strider, S32 index=0); + bool getVertexStrider(LLStrider<LLVector3>& strider, S32 index=0, S32 count = -1, bool map_range = false); + bool getIndexStrider(LLStrider<U16>& strider, S32 index=0, S32 count = -1, bool map_range = false); + bool getTexCoord0Strider(LLStrider<LLVector2>& strider, S32 index=0, S32 count = -1, bool map_range = false); + bool getTexCoord1Strider(LLStrider<LLVector2>& strider, S32 index=0, S32 count = -1, bool map_range = false); + bool getNormalStrider(LLStrider<LLVector3>& strider, S32 index=0, S32 count = -1, bool map_range = false); + bool getBinormalStrider(LLStrider<LLVector3>& strider, S32 index=0, S32 count = -1, bool map_range = false); + bool getColorStrider(LLStrider<LLColor4U>& strider, S32 index=0, S32 count = -1, bool map_range = false); + bool getWeightStrider(LLStrider<F32>& strider, S32 index=0, S32 count = -1, bool map_range = false); + bool getWeight4Strider(LLStrider<LLVector4>& strider, S32 index=0, S32 count = -1, bool map_range = false); + bool getClothWeightStrider(LLStrider<LLVector4>& strider, S32 index=0, S32 count = -1, bool map_range = false); BOOL isEmpty() const { return mEmpty; } BOOL isLocked() const { return mVertexLocked || mIndexLocked; } @@ -218,8 +234,6 @@ class LLVertexBuffer : public LLRefCount S32 getOffset(S32 type) const { return mOffsets[type]; } S32 getUsage() const { return mUsage; } - void markDirty(U32 vert_index, U32 vert_count, U32 indices_index, U32 indices_count); - void draw(U32 mode, U32 count, U32 indices_offset) const; void drawArrays(U32 mode, U32 offset, U32 count) const; void drawRange(U32 mode, U32 start, U32 end, U32 count, U32 indices_offset) const; @@ -253,20 +267,8 @@ class LLVertexBuffer : public LLRefCount BOOL mDynamicSize; // if TRUE, buffer has been resized at least once (and should be padded) S32 mOffsets[TYPE_MAX]; - class DirtyRegion - { - public: - U32 mIndex; - U32 mCount; - U32 mIndicesIndex; - U32 mIndicesCount; - - DirtyRegion(U32 vi, U32 vc, U32 ii, U32 ic) - : mIndex(vi), mCount(vc), mIndicesIndex(ii), mIndicesCount(ic) - { } - }; - - std::vector<DirtyRegion> mDirtyRegions; //vector of dirty regions to rebuild + std::vector<MappedRegion> mMappedVertexRegions; + std::vector<MappedRegion> mMappedIndexRegions; public: static S32 sCount; diff --git a/indra/llui/llconsole.cpp b/indra/llui/llconsole.cpp index 06bad1f3712ff174d303598560da730869848bcb..04040200d053f7d727c16c5958d08a6e123e375b 100644 --- a/indra/llui/llconsole.cpp +++ b/indra/llui/llconsole.cpp @@ -132,6 +132,9 @@ void LLConsole::setFontSize(S32 size_index) void LLConsole::draw() { + // Units in pixels + static const F32 padding_horizontal = 10; + static const F32 padding_vertical = 3; LLGLSUIDefault gls_ui; // skip lines added more than mLinePersistTime ago @@ -176,11 +179,9 @@ void LLConsole::draw() // draw remaining lines F32 y_pos = 0.f; - LLUIImagePtr imagep = LLUI::getUIImage("Rounded_Square"); + LLUIImagePtr imagep = LLUI::getUIImage("transparent"); -// F32 console_opacity = llclamp(gSavedSettings.getF32("ConsoleBackgroundOpacity"), 0.f, 1.f); F32 console_opacity = llclamp(LLUI::sSettingGroups["config"]->getF32("ConsoleBackgroundOpacity"), 0.f, 1.f); -// LLColor4 color = LLUIColorTable::instance().getColor("ConsoleBackground"); LLColor4 color = LLUIColorTable::instance().getColor("ConsoleBackground"); color.mV[VALPHA] *= console_opacity; @@ -188,8 +189,8 @@ void LLConsole::draw() for(paragraph_it = mParagraphs.rbegin(); paragraph_it != mParagraphs.rend(); paragraph_it++) { - S32 target_height = llfloor( (*paragraph_it).mLines.size() * line_height + 8); - S32 target_width = llfloor( (*paragraph_it).mMaxWidth +15); + S32 target_height = llfloor( (*paragraph_it).mLines.size() * line_height + padding_vertical); + S32 target_width = llfloor( (*paragraph_it).mMaxWidth + padding_horizontal); y_pos += ((*paragraph_it).mLines.size()) * line_height; imagep->drawSolid(-14, (S32)(y_pos + line_height - target_height), target_width, target_height, color); @@ -234,7 +235,7 @@ void LLConsole::draw() y_off += line_height; } } - y_pos += 8; + y_pos += padding_vertical; } } diff --git a/indra/llui/llresmgr.cpp b/indra/llui/llresmgr.cpp index 39385786bc826ee2f7552d8086794dda6767fa62..820e7cb26af36021a92d63c11645700fab644a1c 100644 --- a/indra/llui/llresmgr.cpp +++ b/indra/llui/llresmgr.cpp @@ -337,7 +337,7 @@ LLLocale::LLLocale(const std::string& locale_string) char* new_locale_string = setlocale( LC_ALL, locale_string.c_str()); if ( new_locale_string == NULL) { - llwarns << "Failed to set locale " << locale_string << llendl; + LL_WARNS_ONCE("LLLocale") << "Failed to set locale " << locale_string << LL_ENDL; setlocale(LC_ALL, SYSTEM_LOCALE.c_str()); } //else diff --git a/indra/llui/llspinctrl.cpp b/indra/llui/llspinctrl.cpp index 6b4e9cf923f86c94fc805274144087775dc6e19b..15a7438ec956796567cfcbcfe427c6e8e009d70d 100644 --- a/indra/llui/llspinctrl.cpp +++ b/indra/llui/llspinctrl.cpp @@ -52,6 +52,7 @@ LLSpinCtrl::Params::Params() : label_width("label_width"), decimal_digits("decimal_digits"), allow_text_entry("allow_text_entry", true), + label_wrap("label_wrap", false), text_enabled_color("text_enabled_color"), text_disabled_color("text_disabled_color"), up_button("up_button"), @@ -80,6 +81,7 @@ LLSpinCtrl::LLSpinCtrl(const LLSpinCtrl::Params& p) { LLRect label_rect( 0, centered_top, label_width, centered_bottom ); LLTextBox::Params params; + params.wrap(p.label_wrap); params.name("SpinCtrl Label"); params.rect(label_rect); params.initial_value(p.label()); diff --git a/indra/llui/llspinctrl.h b/indra/llui/llspinctrl.h index 8960971594d84b737bda01d907057584d09eba6e..d197084e38fac9c3c572a012d8577daf6e64e333 100644 --- a/indra/llui/llspinctrl.h +++ b/indra/llui/llspinctrl.h @@ -44,6 +44,7 @@ class LLSpinCtrl Optional<S32> label_width; Optional<U32> decimal_digits; Optional<bool> allow_text_entry; + Optional<bool> label_wrap; Optional<LLUIColor> text_enabled_color; Optional<LLUIColor> text_disabled_color; diff --git a/indra/llvfs/CMakeLists.txt b/indra/llvfs/CMakeLists.txt index b6d1ce61e5ff5d15aeec971205a78611796f91d7..2c581cf8d6e55e74dbc0d81df3ef64d842397398 100644 --- a/indra/llvfs/CMakeLists.txt +++ b/indra/llvfs/CMakeLists.txt @@ -62,11 +62,15 @@ list(APPEND llvfs_SOURCE_FILES ${llvfs_HEADER_FILES}) add_library (llvfs ${llvfs_SOURCE_FILES}) -target_link_libraries(llvfs +set(vfs_BOOST_LIBRARIES ${BOOST_FILESYSTEM_LIBRARY} ${BOOST_SYSTEM_LIBRARY} ) +target_link_libraries(llvfs + ${vfs_BOOST_LIBRARIES} + ) + if (DARWIN) include(CMakeFindFrameworks) find_library(CARBON_LIBRARY Carbon) @@ -76,15 +80,21 @@ endif (DARWIN) # Add tests if (LL_TESTS) - include(LLAddBuildTest) - # UNIT TESTS - SET(llvfs_TEST_SOURCE_FILES - # none so far - ) - LL_ADD_PROJECT_UNIT_TESTS(llvfs "${llvfs_TEST_SOURCE_FILES}") - - # INTEGRATION TESTS - set(test_libs llmath llcommon llvfs ${LLCOMMON_LIBRARIES} ${WINDOWS_LIBRARIES}) - # TODO: Some of these need refactoring to be proper Unit tests rather than Integration tests. - LL_ADD_INTEGRATION_TEST(lldir "" "${test_libs}") + include(LLAddBuildTest) + # UNIT TESTS + SET(llvfs_TEST_SOURCE_FILES + lldiriterator.cpp + ) + + set_source_files_properties(lldiriterator.cpp + PROPERTIES + LL_TEST_ADDITIONAL_LIBRARIES "${vfs_BOOST_LIBRARIES}" + ) + LL_ADD_PROJECT_UNIT_TESTS(llvfs "${llvfs_TEST_SOURCE_FILES}") + + # INTEGRATION TESTS + set(test_libs llmath llcommon llvfs ${LLCOMMON_LIBRARIES} ${WINDOWS_LIBRARIES}) + + # TODO: Some of these need refactoring to be proper Unit tests rather than Integration tests. + LL_ADD_INTEGRATION_TEST(lldir "" "${test_libs}") endif (LL_TESTS) diff --git a/indra/llvfs/lldiriterator.cpp b/indra/llvfs/lldiriterator.cpp index 041436ed92f24ade177358ca0db1aca687d15cf4..25550321f0218f93a931e5d2448c4ceb057a9481 100644 --- a/indra/llvfs/lldiriterator.cpp +++ b/indra/llvfs/lldiriterator.cpp @@ -121,6 +121,14 @@ bool LLDirIterator::Impl::next(std::string &fname) return found; } +/** +Converts the incoming glob into a regex. This involves +converting incoming glob expressions to regex equivilents and +at the same time, escaping any regex meaningful characters which +do not have glob meaning, i.e. + .()+|^$ +in the input. +*/ std::string glob_to_regex(const std::string& glob) { std::string regex; @@ -135,9 +143,6 @@ std::string glob_to_regex(const std::string& glob) switch (c) { - case '.': - regex+="\\."; - break; case '*': if (glob.begin() == i) { @@ -170,8 +175,16 @@ std::string glob_to_regex(const std::string& glob) case '!': regex+= square_brace_open ? '^' : c; break; + case '.': // This collection have different regex meaning + case '^': // and so need escaping. + case '(': + case ')': + case '+': + case '|': + case '$': + regex += '\\'; default: - regex+=c; + regex += c; break; } diff --git a/indra/llvfs/tests/lldiriterator_test.cpp b/indra/llvfs/tests/lldiriterator_test.cpp new file mode 100644 index 0000000000000000000000000000000000000000..505d86faa7d45ed61b873e1b7e5f6bf362693b82 --- /dev/null +++ b/indra/llvfs/tests/lldiriterator_test.cpp @@ -0,0 +1,65 @@ +/** + * @file lldiriterator_test.cpp + * @date 2011-06 + * @brief LLDirIterator test cases. + * + * $LicenseInfo:firstyear=2011&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2011, Linden Research, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only., + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA + * $/LicenseInfo$ + */ + +#include "linden_common.h" +#include "lltut.h" +#include "../lldiriterator.h" + + +namespace tut +{ + + struct LLDirIteratorFixture + { + LLDirIteratorFixture() + { + } + }; + typedef test_group<LLDirIteratorFixture> LLDirIteratorTest_factory; + typedef LLDirIteratorTest_factory::object LLDirIteratorTest_t; + LLDirIteratorTest_factory tf("LLDirIterator"); + + /* + CHOP-662 was originally introduced to deal with crashes deleting files from + a directory (VWR-25500). However, this introduced a crash looking for + old chat logs as the glob_to_regex function in lldiriterator wasn't escaping lots of regexp characters + */ + void test_chop_662(void) + { + // Check a selection of bad group names from the crash reports + LLDirIterator iter(".","+bad-group-name]+??-??.*"); + LLDirIterator iter1(".","))--@---bad-group-name2((??-??.*\\.txt"); + LLDirIterator iter2(".","__^v--x)Cuide d sua vida(x--v^__??-??.*"); + } + + template<> template<> + void LLDirIteratorTest_t::test<1>() + { + test_chop_662(); + } + +} diff --git a/indra/newview/app_settings/logcontrol.xml b/indra/newview/app_settings/logcontrol.xml index 937c4e4c6a02e8bb764527a8e2ea407c6f3b7631..9f4e89691f1ba3dc5628c63dcbce4a028983d77c 100644 --- a/indra/newview/app_settings/logcontrol.xml +++ b/indra/newview/app_settings/logcontrol.xml @@ -20,6 +20,7 @@ <key>tags</key> <array> <string>AppInit</string> + <string>Capabilities</string> <string>SystemInfo</string> <string>TextureCache</string> <string>AppCache</string> @@ -43,6 +44,7 @@ <array> <!-- sample entry for debugging a specific item --> <!-- <string>Voice</string> --> + <string>Capabilities</string> </array> </map> </array> diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index fc7fd2dd8a03b7b853d76b07e4cd1f8ef1176154..594285b92b35c46dde6137c7818e000745d455a3 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -3058,6 +3058,17 @@ <key>Value</key> <integer>1</integer> </map> + <key>EnableGestureSounds</key> + <map> + <key>Comment</key> + <string>Play sounds from gestures</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>1</integer> + </map> <key>EnableMouselook</key> <map> <key>Comment</key> @@ -3256,17 +3267,6 @@ <key>Value</key> <integer>1</integer> </map> - <key>FirstLoginThisInstall</key> - <map> - <key>Comment</key> - <string>Specifies that you have not successfully logged in since you installed the latest update</string> - <key>Persist</key> - <integer>1</integer> - <key>Type</key> - <string>Boolean</string> - <key>Value</key> - <integer>1</integer> - </map> <key>FirstName</key> <map> <key>Comment</key> @@ -5576,7 +5576,7 @@ <key>Type</key> <string>Boolean</string> <key>Value</key> - <real>1</real> + <real>0</real> </map> <key>MeshImportUseSLM</key> <map> @@ -5589,10 +5589,10 @@ <key>Value</key> <real>0</real> </map> - <key>MeshUseWholeModelUpload</key> + <key>MeshUploadLogXML</key> <map> <key>Comment</key> - <string>Upload model in its entirety instead of mesh-by-mesh (new caps)</string> + <string>Verbose XML logging on mesh upload</string> <key>Persist</key> <integer>1</integer> <key>Type</key> @@ -5600,6 +5600,17 @@ <key>Value</key> <real>0</real> </map> + <key>MeshUploadFakeErrors</key> + <map> + <key>Comment</key> + <string>Force upload errors (for testing)</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>S32</string> + <key>Value</key> + <real>0</real> + </map> <key>MigrateCacheDirectory</key> <map> <key>Comment</key> @@ -7102,7 +7113,76 @@ <key>Value</key> <integer>1</integer> </map> - <key>RenderAnisotropic</key> + + <key>OctreeMaxNodeCapacity</key> + <map> + <key>Comment</key> + <string>Maximum number of elements to store in a single octree node</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>U32</string> + <key>Value</key> + <integer>128</integer> + </map> + + <key>OctreeStaticObjectSizeFactor</key> + <map> + <key>Comment</key> + <string>Multiplier on static object size for determining octree node size </string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>S32</string> + <key>Value</key> + <integer>4</integer> + </map> + + <key>OctreeAlphaDistanceFactor</key> + <map> + <key>Comment</key> + <string>Multiplier on alpha object distance for determining octree node size </string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Vector3</string> + <key>Value</key> + <array> + <real>0.1</real> + <real>0.0</real> + <real>0.0</real> + </array> + </map> + + <key>OctreeAttachmentSizeFactor</key> + <map> + <key>Comment</key> + <string>Multiplier on attachment size for determining octree node size </string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>S32</string> + <key>Value</key> + <integer>4</integer> + </map> + + <key>OctreeDistanceFactor</key> + <map> + <key>Comment</key> + <string>Multiplier on distance for determining octree node size </string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Vector3</string> + <key>Value</key> + <array> + <real>0.01</real> + <real>0.0</real> + <real>0.0</real> + </array> + </map> + + <key>RenderAnisotropic</key> <map> <key>Comment</key> <string>Render textures using anisotropic filtering</string> @@ -7199,7 +7279,7 @@ <key>Type</key> <string>F32</string> <key>Value</key> - <integer>1.0</integer> + <real>1.0</real> </map> <key>RenderAvatarVP</key> <map> @@ -7455,6 +7535,17 @@ <key>Value</key> <integer>0</integer> </map> + <key>RenderMaxTextureIndex</key> + <map> + <key>Comment</key> + <string>Maximum texture index to use for indexed texture rendering.</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>U32</string> + <key>Value</key> + <integer>6</integer> + </map> <key>RenderDebugTextureBind</key> <map> <key>Comment</key> @@ -8600,7 +8691,7 @@ <key>Type</key> <string>S32</string> <key>Value</key> - <integer>8192</integer> + <integer>65536</integer> </map> <key>RenderMaxVBOSize</key> <map> @@ -8868,17 +8959,6 @@ <integer>0</integer> </map> <key>RenderUseTriStrips</key> - <map> - <key>Comment</key> - <string>Use triangle strips for rendering prims.</string> - <key>Persist</key> - <integer>1</integer> - <key>Type</key> - <string>Boolean</string> - <key>Value</key> - <integer>0</integer> - </map> - <key>RenderUseTriStrips</key> <map> <key>Comment</key> <string>Use triangle strips for rendering prims.</string> @@ -8953,7 +9033,7 @@ <key>Type</key> <string>Boolean</string> <key>Value</key> - <integer>1</integer> + <integer>0</integer> </map> <key>RenderUseStreamVBO</key> <map> @@ -9063,7 +9143,7 @@ <key>Type</key> <string>F32</string> <key>Value</key> - <real>3.0</real> + <real>2.0</real> </map> <key>MeshThreadCount</key> <map> @@ -9659,6 +9739,17 @@ <key>Value</key> <integer>1</integer> </map> + <key>NearbyListShowMap</key> + <map> + <key>Comment</key> + <string>Show/hide map above nearby people list</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>1</integer> + </map> <key>NearbyListShowIcons</key> <map> <key>Comment</key> @@ -12406,7 +12497,7 @@ <key>Type</key> <string>S32</string> <key>Value</key> - <integer>-1</integer> + <integer>20</integer> </map> <key>WaterEditPresets</key> <map> diff --git a/indra/newview/app_settings/shaders/class1/avatar/avatarF.glsl b/indra/newview/app_settings/shaders/class1/avatar/avatarF.glsl index 3f6b8b33238fc1fd4b228575109fdd4eac825552..b0fa0ddd3ed7b3fc2f5a1a7a81d49b413c924e2d 100644 --- a/indra/newview/app_settings/shaders/class1/avatar/avatarF.glsl +++ b/indra/newview/app_settings/shaders/class1/avatar/avatarF.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + void default_lighting(); diff --git a/indra/newview/app_settings/shaders/class1/avatar/avatarSkinV.glsl b/indra/newview/app_settings/shaders/class1/avatar/avatarSkinV.glsl index 1ad87badfe17dfe8b21a8beecdbbe25a9d911c9d..d9f29ced4fd1a90b66f5b1775bce85ae036c74b5 100644 --- a/indra/newview/app_settings/shaders/class1/avatar/avatarSkinV.glsl +++ b/indra/newview/app_settings/shaders/class1/avatar/avatarSkinV.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + attribute vec4 weight; //1 diff --git a/indra/newview/app_settings/shaders/class1/avatar/avatarV.glsl b/indra/newview/app_settings/shaders/class1/avatar/avatarV.glsl index a15846f192f66b5356bec88cc4f3a38bf6100eb4..2796222c68d74e577ba584fb93068e6cb1474476 100644 --- a/indra/newview/app_settings/shaders/class1/avatar/avatarV.glsl +++ b/indra/newview/app_settings/shaders/class1/avatar/avatarV.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + vec4 calcLighting(vec3 pos, vec3 norm, vec4 color, vec4 baseCol); mat4 getSkinnedTransform(); diff --git a/indra/newview/app_settings/shaders/class1/avatar/eyeballF.glsl b/indra/newview/app_settings/shaders/class1/avatar/eyeballF.glsl index 05fe10037227c1826e430b14ec3af7cbb877ee7d..d86ef19a0466e90f9f50dcaac93d50599dfafef6 100644 --- a/indra/newview/app_settings/shaders/class1/avatar/eyeballF.glsl +++ b/indra/newview/app_settings/shaders/class1/avatar/eyeballF.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + void default_lighting(); diff --git a/indra/newview/app_settings/shaders/class1/avatar/eyeballV.glsl b/indra/newview/app_settings/shaders/class1/avatar/eyeballV.glsl index 4b8a7604a1b6ffdaa45b6077fc20b14bab0ad861..2eb814bd91e1bb4a8fd603e9085ef8b26a2156c2 100644 --- a/indra/newview/app_settings/shaders/class1/avatar/eyeballV.glsl +++ b/indra/newview/app_settings/shaders/class1/avatar/eyeballV.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + vec4 calcLightingSpecular(vec3 pos, vec3 norm, vec4 color, inout vec4 specularColor, vec4 baseCol); void calcAtmospherics(vec3 inPositionEye); diff --git a/indra/newview/app_settings/shaders/class1/avatar/objectSkinV.glsl b/indra/newview/app_settings/shaders/class1/avatar/objectSkinV.glsl index ef823c28b1c48693e7e8151fefe8baade88988cf..7613e50dca936c87195d4cc5bc8101737ef70dad 100644 --- a/indra/newview/app_settings/shaders/class1/avatar/objectSkinV.glsl +++ b/indra/newview/app_settings/shaders/class1/avatar/objectSkinV.glsl @@ -5,7 +5,7 @@ * $License$ */ -#version 120 + attribute vec4 object_weight; diff --git a/indra/newview/app_settings/shaders/class1/avatar/pickAvatarF.glsl b/indra/newview/app_settings/shaders/class1/avatar/pickAvatarF.glsl index 27ac59a840f53adf2bb805c9c324f2a5afd097b9..2638351e962adfcb7ade3f413959e97c22dd569f 100644 --- a/indra/newview/app_settings/shaders/class1/avatar/pickAvatarF.glsl +++ b/indra/newview/app_settings/shaders/class1/avatar/pickAvatarF.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + uniform sampler2D diffuseMap; diff --git a/indra/newview/app_settings/shaders/class1/avatar/pickAvatarV.glsl b/indra/newview/app_settings/shaders/class1/avatar/pickAvatarV.glsl index f1aa549a478c7798b99ae7088db26840ff07c232..86b189b282cd9997bc3f65f76d5d133d1011ce06 100644 --- a/indra/newview/app_settings/shaders/class1/avatar/pickAvatarV.glsl +++ b/indra/newview/app_settings/shaders/class1/avatar/pickAvatarV.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + mat4 getSkinnedTransform(); diff --git a/indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl b/indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl index 3b12a07a27df958a59de4e0dcc10e488b9bdb9ce..4a0815a163867fe5482b5d412bc15287970e5774 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl @@ -5,13 +5,14 @@ * $/LicenseInfo$ */ -#version 120 + #extension GL_ARB_texture_rectangle : enable -uniform sampler2D diffuseMap; uniform sampler2DRect depthMap; +vec4 diffuseLookup(vec2 texcoord); + uniform mat4 shadow_matrix[6]; uniform vec4 shadow_clip; uniform vec2 screen_res; @@ -47,7 +48,7 @@ void main() vec4 pos = vec4(vary_position, 1.0); - vec4 diff= texture2D(diffuseMap, gl_TexCoord[0].xy); + vec4 diff= diffuseLookup(gl_TexCoord[0].xy); vec4 col = vec4(vary_ambient + vary_directional.rgb, gl_Color.a); vec4 color = diff * col; diff --git a/indra/newview/app_settings/shaders/class1/deferred/alphaNonIndexedF.glsl b/indra/newview/app_settings/shaders/class1/deferred/alphaNonIndexedF.glsl new file mode 100644 index 0000000000000000000000000000000000000000..b0d029dbf41b129df3b62f310683c7ddc7465ffc --- /dev/null +++ b/indra/newview/app_settings/shaders/class1/deferred/alphaNonIndexedF.glsl @@ -0,0 +1,67 @@ +/** + * @file alphaF.glsl + * + * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * $/LicenseInfo$ + */ + + + +#extension GL_ARB_texture_rectangle : enable + +uniform sampler2DRect depthMap; +uniform sampler2D diffuseMap; + + +uniform mat4 shadow_matrix[6]; +uniform vec4 shadow_clip; +uniform vec2 screen_res; + +vec3 atmosLighting(vec3 light); +vec3 scaleSoftClip(vec3 light); + +varying vec3 vary_ambient; +varying vec3 vary_directional; +varying vec3 vary_fragcoord; +varying vec3 vary_position; +varying vec3 vary_pointlight_col; + +uniform mat4 inv_proj; + +vec4 getPosition(vec2 pos_screen) +{ + float depth = texture2DRect(depthMap, pos_screen.xy).a; + vec2 sc = pos_screen.xy*2.0; + sc /= screen_res; + sc -= vec2(1.0,1.0); + vec4 ndc = vec4(sc.x, sc.y, 2.0*depth-1.0, 1.0); + vec4 pos = inv_proj * ndc; + pos /= pos.w; + pos.w = 1.0; + return pos; +} + +void main() +{ + vec2 frag = vary_fragcoord.xy/vary_fragcoord.z*0.5+0.5; + frag *= screen_res; + + vec4 pos = vec4(vary_position, 1.0); + + vec4 diff= texture2D(diffuseMap,gl_TexCoord[0].xy); + + vec4 col = vec4(vary_ambient + vary_directional.rgb, gl_Color.a); + vec4 color = diff * col; + + color.rgb = atmosLighting(color.rgb); + + color.rgb = scaleSoftClip(color.rgb); + + color.rgb += diff.rgb * vary_pointlight_col.rgb; + + gl_FragColor = color; + //gl_FragColor = vec4(1,0,1,1); + //gl_FragColor = vec4(1,0,1,1)*shadow; + +} + diff --git a/indra/newview/app_settings/shaders/class1/deferred/alphaSkinnedV.glsl b/indra/newview/app_settings/shaders/class1/deferred/alphaSkinnedV.glsl index 65d9209983e74e5ea677ede25935b472b4484cf2..ac3f7189c2f79b0f4f3629e980682f3c22465a67 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/alphaSkinnedV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/alphaSkinnedV.glsl @@ -5,7 +5,7 @@ * $License$ */ -#version 120 + vec4 calcLighting(vec3 pos, vec3 norm, vec4 color, vec4 baseCol); mat4 getObjectSkinnedTransform(); diff --git a/indra/newview/app_settings/shaders/class1/deferred/alphaV.glsl b/indra/newview/app_settings/shaders/class1/deferred/alphaV.glsl index 2691fc8dedb64b85a8cc3ecac5660e3c842fc23b..44cb78e9147dcd50df06f50799f4d0ef17b284ae 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/alphaV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/alphaV.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + vec4 calcLighting(vec3 pos, vec3 norm, vec4 color, vec4 baseCol); void calcAtmospherics(vec3 inPositionEye); @@ -23,6 +23,7 @@ varying vec3 vary_fragcoord; varying vec3 vary_position; varying vec3 vary_light; varying vec3 vary_pointlight_col; +varying float vary_texture_index; uniform float near_clip; uniform float shadow_offset; @@ -61,11 +62,13 @@ float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, floa void main() { //transform vertex - gl_Position = ftransform(); + vec4 vert = vec4(gl_Vertex.xyz, 1.0); + vary_texture_index = gl_Vertex.w; + gl_Position = gl_ModelViewProjectionMatrix * vert; gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0; - vec4 pos = (gl_ModelViewMatrix * gl_Vertex); + vec4 pos = (gl_ModelViewMatrix * vert); vec3 norm = normalize(gl_NormalMatrix * gl_Normal); float dp_directional_light = max(0.0, dot(norm, gl_LightSource[0].position.xyz)); @@ -102,7 +105,7 @@ void main() gl_FogFragCoord = pos.z; - pos = gl_ModelViewProjectionMatrix * gl_Vertex; + pos = gl_ModelViewProjectionMatrix * vert; vary_fragcoord.xyz = pos.xyz + vec3(0,0,near_clip); } diff --git a/indra/newview/app_settings/shaders/class1/deferred/attachmentShadowF.glsl b/indra/newview/app_settings/shaders/class1/deferred/attachmentShadowF.glsl index 164322c3a732a87e16d84edd104876370e095931..870d593311f5a34d66bff7aedd3583f2252eaecc 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/attachmentShadowF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/attachmentShadowF.glsl @@ -5,7 +5,7 @@ * $License$ */ -#version 120 + uniform sampler2D diffuseMap; diff --git a/indra/newview/app_settings/shaders/class1/deferred/attachmentShadowV.glsl b/indra/newview/app_settings/shaders/class1/deferred/attachmentShadowV.glsl index 5ae41cb73093d99f0e6c5ba60f3c109729057c6d..c7a4f86727178f55ff1b66bc4e0ef20eac070887 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/attachmentShadowV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/attachmentShadowV.glsl @@ -5,7 +5,7 @@ * $License$ */ -#version 120 + mat4 getObjectSkinnedTransform(); diff --git a/indra/newview/app_settings/shaders/class1/deferred/avatarAlphaV.glsl b/indra/newview/app_settings/shaders/class1/deferred/avatarAlphaV.glsl index a012cb50304c7283716ca09638d5c3ef6bda7b23..68e4055cf228188145d6519e273d93990e7cc387 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/avatarAlphaV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/avatarAlphaV.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + vec4 calcLighting(vec3 pos, vec3 norm, vec4 color, vec4 baseCol); mat4 getSkinnedTransform(); diff --git a/indra/newview/app_settings/shaders/class1/deferred/avatarEyesV.glsl b/indra/newview/app_settings/shaders/class1/deferred/avatarEyesV.glsl new file mode 100644 index 0000000000000000000000000000000000000000..7bc78fe407408575b036c1e4bb235c9de19fb654 --- /dev/null +++ b/indra/newview/app_settings/shaders/class1/deferred/avatarEyesV.glsl @@ -0,0 +1,21 @@ +/** + * @file avatarEyesV.glsl + * + * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * $/LicenseInfo$ + */ + + + +varying vec3 vary_normal; + +void main() +{ + //transform vertex + gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; + gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0; + + vary_normal = normalize(gl_NormalMatrix * gl_Normal); + + gl_FrontColor = gl_Color; +} diff --git a/indra/newview/app_settings/shaders/class1/deferred/avatarF.glsl b/indra/newview/app_settings/shaders/class1/deferred/avatarF.glsl index 9748727147d62107ee9ed3f708852446d785cacc..326861809313b7e2d7fd9c21b5a15b241a5dcffa 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/avatarF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/avatarF.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + uniform sampler2D diffuseMap; diff --git a/indra/newview/app_settings/shaders/class1/deferred/avatarShadowF.glsl b/indra/newview/app_settings/shaders/class1/deferred/avatarShadowF.glsl index 1b7ae0688841b60691e279a18efd5f6d3baa9ec8..78986ab12efd65784a256b0fcf3406388e60e0ea 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/avatarShadowF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/avatarShadowF.glsl @@ -5,14 +5,17 @@ * $/LicenseInfo$ */ -#version 120 + uniform sampler2D diffuseMap; +varying vec4 post_pos; void main() { //gl_FragColor = vec4(1,1,1,gl_Color.a * texture2D(diffuseMap, gl_TexCoord[0].xy).a); gl_FragColor = vec4(1,1,1,1); + + gl_FragDepth = max(post_pos.z/post_pos.w*0.5+0.5, 0.0); } diff --git a/indra/newview/app_settings/shaders/class1/deferred/avatarShadowV.glsl b/indra/newview/app_settings/shaders/class1/deferred/avatarShadowV.glsl index cf6579a40d4c608193da404644ad33ba1594fa9c..f177fcd8f11b6fc0d9463126c6dd54641c5b277c 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/avatarShadowV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/avatarShadowV.glsl @@ -5,12 +5,14 @@ * $/LicenseInfo$ */ -#version 120 + mat4 getSkinnedTransform(); attribute vec4 weight; +varying vec4 post_pos; + void main() { gl_TexCoord[0] = gl_MultiTexCoord0; @@ -30,8 +32,9 @@ void main() norm = normalize(norm); pos = gl_ProjectionMatrix * pos; - pos.z = max(pos.z, -pos.w+0.01); - gl_Position = pos; + post_pos = pos; + + gl_Position = vec4(pos.x, pos.y, pos.w*0.5, pos.w); gl_FrontColor = gl_Color; } diff --git a/indra/newview/app_settings/shaders/class1/deferred/avatarV.glsl b/indra/newview/app_settings/shaders/class1/deferred/avatarV.glsl index 69c93799b5d358b612c5be0a18150c6b193fb777..7eac11287a2b7e2f7666f90b10a5a137cfdeb8f7 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/avatarV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/avatarV.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + mat4 getSkinnedTransform(); diff --git a/indra/newview/app_settings/shaders/class1/deferred/blurLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/blurLightF.glsl index d9f021b114f4919327c70f62c967750f98887d22..8c75c8045af71835637efb9be7fff0db707ad34f 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/blurLightF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/blurLightF.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + #extension GL_ARB_texture_rectangle : enable @@ -26,7 +26,7 @@ uniform vec2 screen_res; vec4 getPosition(vec2 pos_screen) { - float depth = texture2DRect(depthMap, pos_screen.xy).a; + float depth = texture2DRect(depthMap, pos_screen.xy).r; vec2 sc = pos_screen.xy*2.0; sc /= screen_res; sc -= vec2(1.0,1.0); @@ -39,7 +39,7 @@ vec4 getPosition(vec2 pos_screen) void main() { - vec2 tc = vary_fragcoord.xy; + vec2 tc = vary_fragcoord.xy; vec3 norm = texture2DRect(normalMap, tc).xyz; norm = vec3((norm.xy-0.5)*2.0,norm.z); // unpack norm vec3 pos = getPosition(tc).xyz; diff --git a/indra/newview/app_settings/shaders/class1/deferred/blurLightMSF.glsl b/indra/newview/app_settings/shaders/class1/deferred/blurLightMSF.glsl new file mode 100644 index 0000000000000000000000000000000000000000..6ca51377c167fade71505ece7e3f9729a5e70557 --- /dev/null +++ b/indra/newview/app_settings/shaders/class1/deferred/blurLightMSF.glsl @@ -0,0 +1,113 @@ +/** + * @file blurLightF.glsl + * + * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * $/LicenseInfo$ + */ + + + +#extension GL_ARB_texture_rectangle : enable +#extension GL_ARB_texture_multisample : enable + +uniform sampler2DMS depthMap; +uniform sampler2DMS normalMap; +uniform sampler2DRect lightMap; + +uniform float dist_factor; +uniform float blur_size; +uniform vec2 delta; +uniform vec3 kern[4]; +uniform float kern_scale; + +varying vec2 vary_fragcoord; + +uniform mat4 inv_proj; +uniform vec2 screen_res; + +vec3 texture2DMS3(sampler2DMS tex, ivec2 tc) +{ + vec3 ret = vec3(0,0,0); + for (int i = 0; i < samples; i++) + { + ret += texelFetch(tex, tc, i).rgb; + } + + return ret/samples; +} + +float texture2DMS1(sampler2DMS tex, ivec2 tc) +{ + float ret = 0; + for (int i = 0; i < samples; i++) + { + ret += texelFetch(tex, tc, i).r; + } + + return ret/samples; +} + +vec4 getPosition(ivec2 pos_screen) +{ + float depth = texture2DMS1(depthMap, pos_screen.xy); + vec2 sc = pos_screen.xy*2.0; + sc /= screen_res; + sc -= vec2(1.0,1.0); + vec4 ndc = vec4(sc.x, sc.y, 2.0*depth-1.0, 1.0); + vec4 pos = inv_proj * ndc; + pos /= pos.w; + pos.w = 1.0; + return pos; +} + +void main() +{ + vec2 tc = vary_fragcoord.xy; + ivec2 itc = ivec2(tc); + + vec3 norm = texture2DMS3(normalMap, itc).xyz; + norm = vec3((norm.xy-0.5)*2.0,norm.z); // unpack norm + vec3 pos = getPosition(itc).xyz; + vec4 ccol = texture2DRect(lightMap, tc).rgba; + + vec2 dlt = kern_scale * delta / (1.0+norm.xy*norm.xy); + dlt /= max(-pos.z*dist_factor, 1.0); + + vec2 defined_weight = kern[0].xy; // special case the first (centre) sample's weight in the blur; we have to sample it anyway so we get it for 'free' + vec4 col = defined_weight.xyxx * ccol; + + // relax tolerance according to distance to avoid speckling artifacts, as angles and distances are a lot more abrupt within a small screen area at larger distances + float pointplanedist_tolerance_pow2 = pos.z*pos.z*0.00005; + + // perturb sampling origin slightly in screen-space to hide edge-ghosting artifacts where smoothing radius is quite large + tc += ( (mod(tc.x+tc.y,2) - 0.5) * kern[1].z * dlt * 0.5 ); + + for (int i = 1; i < 4; i++) + { + vec2 samptc = tc + kern[i].z*dlt; + vec3 samppos = getPosition(ivec2(samptc)).xyz; + float d = dot(norm.xyz, samppos.xyz-pos.xyz);// dist from plane + if (d*d <= pointplanedist_tolerance_pow2) + { + col += texture2DRect(lightMap, samptc)*kern[i].xyxx; + defined_weight += kern[i].xy; + } + } + for (int i = 1; i < 4; i++) + { + vec2 samptc = vec2(tc - kern[i].z*dlt); + vec3 samppos = getPosition(ivec2(samptc)).xyz; + float d = dot(norm.xyz, samppos.xyz-pos.xyz);// dist from plane + if (d*d <= pointplanedist_tolerance_pow2) + { + col += texture2DRect(lightMap, samptc)*kern[i].xyxx; + defined_weight += kern[i].xy; + } + } + + col /= defined_weight.xyxx; + col.y *= col.y; + + gl_FragColor = col; +} + diff --git a/indra/newview/app_settings/shaders/class1/deferred/blurLightV.glsl b/indra/newview/app_settings/shaders/class1/deferred/blurLightV.glsl index c2d05c601a8cf9b760c5c0d4bdbc302619000055..862f809de5387f197ae38d5dd4ad02a8078d02d0 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/blurLightV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/blurLightV.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + varying vec2 vary_fragcoord; uniform vec2 screen_res; diff --git a/indra/newview/app_settings/shaders/class1/deferred/bumpF.glsl b/indra/newview/app_settings/shaders/class1/deferred/bumpF.glsl index 37bfaac32cbf49f49aec497f0aee6d689010f5ff..75b4dc624a9f33035a971ac68260d3dd62cf3144 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/bumpF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/bumpF.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + uniform sampler2D diffuseMap; uniform sampler2D bumpMap; diff --git a/indra/newview/app_settings/shaders/class1/deferred/bumpSkinnedV.glsl b/indra/newview/app_settings/shaders/class1/deferred/bumpSkinnedV.glsl index d884f2e4a5de3b066518ddba72758c0bd05b912a..dc69519a8596c41468a96523f5514c9dc5a160bc 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/bumpSkinnedV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/bumpSkinnedV.glsl @@ -5,7 +5,7 @@ * $License$ */ -#version 120 + varying vec3 vary_mat0; varying vec3 vary_mat1; diff --git a/indra/newview/app_settings/shaders/class1/deferred/bumpV.glsl b/indra/newview/app_settings/shaders/class1/deferred/bumpV.glsl index 9b109b2db67ec589d752f18cd8c3103e67df2138..5b6726488bdce1ee127b9c9da5c4e237eb892f40 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/bumpV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/bumpV.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + varying vec3 vary_mat0; varying vec3 vary_mat1; diff --git a/indra/newview/app_settings/shaders/class1/deferred/cloudsF.glsl b/indra/newview/app_settings/shaders/class1/deferred/cloudsF.glsl new file mode 100644 index 0000000000000000000000000000000000000000..ef300d5631da9be354f6f9ec0d7dbd813235f126 --- /dev/null +++ b/indra/newview/app_settings/shaders/class1/deferred/cloudsF.glsl @@ -0,0 +1,79 @@ +/** + * @file WLCloudsF.glsl + * + * $LicenseInfo:firstyear=2005&license=viewerlgpl$ + * $/LicenseInfo$ + */ + + + +///////////////////////////////////////////////////////////////////////// +// The fragment shader for the sky +///////////////////////////////////////////////////////////////////////// + +varying vec4 vary_CloudColorSun; +varying vec4 vary_CloudColorAmbient; +varying float vary_CloudDensity; + +uniform sampler2D cloud_noise_texture; +uniform vec4 cloud_pos_density1; +uniform vec4 cloud_pos_density2; +uniform vec4 gamma; + +/// Soft clips the light with a gamma correction +vec3 scaleSoftClip(vec3 light) { + //soft clip effect: + light = 1. - clamp(light, vec3(0.), vec3(1.)); + light = 1. - pow(light, gamma.xxx); + + return light; +} + +void main() +{ + // Set variables + vec2 uv1 = gl_TexCoord[0].xy; + vec2 uv2 = gl_TexCoord[1].xy; + + vec4 cloudColorSun = vary_CloudColorSun; + vec4 cloudColorAmbient = vary_CloudColorAmbient; + float cloudDensity = vary_CloudDensity; + vec2 uv3 = gl_TexCoord[2].xy; + vec2 uv4 = gl_TexCoord[3].xy; + + // Offset texture coords + uv1 += cloud_pos_density1.xy; //large texture, visible density + uv2 += cloud_pos_density1.xy; //large texture, self shadow + uv3 += cloud_pos_density2.xy; //small texture, visible density + uv4 += cloud_pos_density2.xy; //small texture, self shadow + + + // Compute alpha1, the main cloud opacity + float alpha1 = (texture2D(cloud_noise_texture, uv1).x - 0.5) + (texture2D(cloud_noise_texture, uv3).x - 0.5) * cloud_pos_density2.z; + alpha1 = min(max(alpha1 + cloudDensity, 0.) * 10. * cloud_pos_density1.z, 1.); + + // And smooth + alpha1 = 1. - alpha1 * alpha1; + alpha1 = 1. - alpha1 * alpha1; + + + // Compute alpha2, for self shadowing effect + // (1 - alpha2) will later be used as percentage of incoming sunlight + float alpha2 = (texture2D(cloud_noise_texture, uv2).x - 0.5); + alpha2 = min(max(alpha2 + cloudDensity, 0.) * 2.5 * cloud_pos_density1.z, 1.); + + // And smooth + alpha2 = 1. - alpha2; + alpha2 = 1. - alpha2 * alpha2; + + // Combine + vec4 color; + color = (cloudColorSun*(1.-alpha2) + cloudColorAmbient); + color *= 2.; + + /// Gamma correct for WL (soft clip effect). + gl_FragData[0] = vec4(scaleSoftClip(color.rgb), alpha1); + gl_FragData[1] = vec4(0.0,0.0,0.0,0.0); + gl_FragData[2] = vec4(0,0,1,0); +} + diff --git a/indra/newview/app_settings/shaders/class1/deferred/cloudsV.glsl b/indra/newview/app_settings/shaders/class1/deferred/cloudsV.glsl new file mode 100644 index 0000000000000000000000000000000000000000..3eac63076c19119a7e0f78e4c0d68f20e2dcf26e --- /dev/null +++ b/indra/newview/app_settings/shaders/class1/deferred/cloudsV.glsl @@ -0,0 +1,165 @@ +/** + * @file WLCloudsV.glsl + * + * $LicenseInfo:firstyear=2005&license=viewerlgpl$ + * $/LicenseInfo$ + */ + + + +////////////////////////////////////////////////////////////////////////// +// The vertex shader for creating the atmospheric sky +/////////////////////////////////////////////////////////////////////////////// + +// Output parameters +varying vec4 vary_CloudColorSun; +varying vec4 vary_CloudColorAmbient; +varying float vary_CloudDensity; + +// Inputs +uniform vec3 camPosLocal; + +uniform vec4 lightnorm; +uniform vec4 sunlight_color; +uniform vec4 ambient; +uniform vec4 blue_horizon; +uniform vec4 blue_density; +uniform vec4 haze_horizon; +uniform vec4 haze_density; + +uniform vec4 cloud_shadow; +uniform vec4 density_multiplier; +uniform vec4 max_y; + +uniform vec4 glow; + +uniform vec4 cloud_color; + +uniform vec4 cloud_scale; + +void main() +{ + + // World / view / projection + gl_Position = ftransform(); + + gl_TexCoord[0] = gl_MultiTexCoord0; + + // Get relative position + vec3 P = gl_Vertex.xyz - camPosLocal.xyz + vec3(0,50,0); + + // Set altitude + if (P.y > 0.) + { + P *= (max_y.x / P.y); + } + else + { + P *= (-32000. / P.y); + } + + // Can normalize then + vec3 Pn = normalize(P); + float Plen = length(P); + + // Initialize temp variables + vec4 temp1 = vec4(0.); + vec4 temp2 = vec4(0.); + vec4 blue_weight; + vec4 haze_weight; + vec4 sunlight = sunlight_color; + vec4 light_atten; + + + // Sunlight attenuation effect (hue and brightness) due to atmosphere + // this is used later for sunlight modulation at various altitudes + light_atten = (blue_density * 1.0 + haze_density.x * 0.25) * (density_multiplier.x * max_y.x); + + // Calculate relative weights + temp1 = blue_density + haze_density.x; + blue_weight = blue_density / temp1; + haze_weight = haze_density.x / temp1; + + // Compute sunlight from P & lightnorm (for long rays like sky) + temp2.y = max(0., max(0., Pn.y) * 1.0 + lightnorm.y ); + temp2.y = 1. / temp2.y; + sunlight *= exp( - light_atten * temp2.y); + + // Distance + temp2.z = Plen * density_multiplier.x; + + // Transparency (-> temp1) + // ATI Bugfix -- can't store temp1*temp2.z in a variable because the ati + // compiler gets confused. + temp1 = exp(-temp1 * temp2.z); + + + // Compute haze glow + temp2.x = dot(Pn, lightnorm.xyz); + temp2.x = 1. - temp2.x; + // temp2.x is 0 at the sun and increases away from sun + temp2.x = max(temp2.x, .001); + // Set a minimum "angle" (smaller glow.y allows tighter, brighter hotspot) + temp2.x *= glow.x; + // Higher glow.x gives dimmer glow (because next step is 1 / "angle") + temp2.x = pow(temp2.x, glow.z); + // glow.z should be negative, so we're doing a sort of (1 / "angle") function + + // Add "minimum anti-solar illumination" + temp2.x += .25; + + // Increase ambient when there are more clouds + vec4 tmpAmbient = ambient; + tmpAmbient += (1. - tmpAmbient) * cloud_shadow.x * 0.5; + + // Dim sunlight by cloud shadow percentage + sunlight *= (1. - cloud_shadow.x); + + // Haze color below cloud + vec4 additiveColorBelowCloud = ( blue_horizon * blue_weight * (sunlight + tmpAmbient) + + (haze_horizon.r * haze_weight) * (sunlight * temp2.x + tmpAmbient) + ); + + // CLOUDS + + sunlight = sunlight_color; + temp2.y = max(0., lightnorm.y * 2.); + temp2.y = 1. / temp2.y; + sunlight *= exp( - light_atten * temp2.y); + + // Cloud color out + vary_CloudColorSun = (sunlight * temp2.x) * cloud_color; + vary_CloudColorAmbient = tmpAmbient * cloud_color; + + // Attenuate cloud color by atmosphere + temp1 = sqrt(temp1); //less atmos opacity (more transparency) below clouds + vary_CloudColorSun *= temp1; + vary_CloudColorAmbient *= temp1; + vec4 oHazeColorBelowCloud = additiveColorBelowCloud * (1. - temp1); + + // Make a nice cloud density based on the cloud_shadow value that was passed in. + vary_CloudDensity = 2. * (cloud_shadow.x - 0.25); + + + // Texture coords + gl_TexCoord[0] = gl_MultiTexCoord0; + gl_TexCoord[0].xy -= 0.5; + gl_TexCoord[0].xy /= cloud_scale.x; + gl_TexCoord[0].xy += 0.5; + + gl_TexCoord[1] = gl_TexCoord[0]; + gl_TexCoord[1].x += lightnorm.x * 0.0125; + gl_TexCoord[1].y += lightnorm.z * 0.0125; + + gl_TexCoord[2] = gl_TexCoord[0] * 16.; + gl_TexCoord[3] = gl_TexCoord[1] * 16.; + + // Combine these to minimize register use + vary_CloudColorAmbient += oHazeColorBelowCloud; + + // needs this to compile on mac + //vary_AtmosAttenuation = vec3(0.0,0.0,0.0); + + // END CLOUDS +} + diff --git a/indra/newview/app_settings/shaders/class1/deferred/diffuseF.glsl b/indra/newview/app_settings/shaders/class1/deferred/diffuseF.glsl index 35cfb80c93882795211bd29c2834427513ac0a2b..43af480c5046aae8576c01844cd8ef1a033bdf93 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/diffuseF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/diffuseF.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + uniform sampler2D diffuseMap; @@ -20,3 +20,4 @@ void main() vec3 nvn = normalize(vary_normal); gl_FragData[2] = vec4(nvn.xy * 0.5 + 0.5, nvn.z, 0.0); } + diff --git a/indra/newview/app_settings/shaders/class1/deferred/diffuseIndexedF.glsl b/indra/newview/app_settings/shaders/class1/deferred/diffuseIndexedF.glsl new file mode 100644 index 0000000000000000000000000000000000000000..e7b5dcce7f95bc643bf16c50068789af1743d154 --- /dev/null +++ b/indra/newview/app_settings/shaders/class1/deferred/diffuseIndexedF.glsl @@ -0,0 +1,19 @@ +/** + * @file diffuseIndexedF.glsl + * + * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * $/LicenseInfo$ + */ + +varying vec3 vary_normal; + +void main() +{ + vec3 col = gl_Color.rgb * diffuseLookup(gl_TexCoord[0].xy).rgb; + + gl_FragData[0] = vec4(col, 0.0); + gl_FragData[1] = gl_Color.aaaa; // spec + //gl_FragData[1] = vec4(vec3(gl_Color.a), gl_Color.a+(1.0-gl_Color.a)*gl_Color.a); // spec - from former class3 - maybe better, but not so well tested + vec3 nvn = normalize(vary_normal); + gl_FragData[2] = vec4(nvn.xy * 0.5 + 0.5, nvn.z, 0.0); +} diff --git a/indra/newview/app_settings/shaders/class1/deferred/diffuseSkinnedV.glsl b/indra/newview/app_settings/shaders/class1/deferred/diffuseSkinnedV.glsl index 9a45c03237a885a54958c239dafbc473f9ec56e9..2c4caea1090dddb78cb0c236370e50d1682abc7e 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/diffuseSkinnedV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/diffuseSkinnedV.glsl @@ -5,7 +5,7 @@ * $License$ */ -#version 120 + varying vec3 vary_normal; diff --git a/indra/newview/app_settings/shaders/class1/deferred/diffuseV.glsl b/indra/newview/app_settings/shaders/class1/deferred/diffuseV.glsl index 03d3322cb68855adfc5a7c9fe0de09b73ae96a19..b56d1493c3a84d3f61e7c457406f7b3e4922d23c 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/diffuseV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/diffuseV.glsl @@ -5,16 +5,18 @@ * $/LicenseInfo$ */ -#version 120 + varying vec3 vary_normal; +varying float vary_texture_index; void main() { //transform vertex - gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; + gl_Position = gl_ModelViewProjectionMatrix * vec4(gl_Vertex.xyz, 1.0); gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0; + vary_texture_index = gl_Vertex.w; vary_normal = normalize(gl_NormalMatrix * gl_Normal); gl_FrontColor = gl_Color; diff --git a/indra/newview/app_settings/shaders/class1/deferred/fullbrightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/fullbrightF.glsl index 34298773974b2d35ea7396dceaebf3b7e1d363b9..d781e08548ccf229e331c74d8ac1889816db7d0d 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/fullbrightF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/fullbrightF.glsl @@ -5,60 +5,24 @@ * $/LicenseInfo$ */ -#version 120 -#extension GL_ARB_texture_rectangle : enable - -uniform sampler2D diffuseMap; -uniform sampler2DRect depthMap; -uniform sampler2D noiseMap; -uniform vec4 shadow_clip; -uniform vec2 screen_res; +#extension GL_ARB_texture_rectangle : enable vec3 fullbrightAtmosTransport(vec3 light); vec3 fullbrightScaleSoftClip(vec3 light); -varying vec3 vary_ambient; -varying vec3 vary_directional; -varying vec4 vary_position; -varying vec3 vary_normal; -varying vec3 vary_fragcoord; - -uniform mat4 inv_proj; - -vec4 getPosition(vec2 pos_screen) -{ - float depth = texture2DRect(depthMap, pos_screen.xy).a; - vec2 sc = pos_screen.xy*2.0; - sc /= screen_res; - sc -= vec2(1.0,1.0); - vec4 ndc = vec4(sc.x, sc.y, 2.0*depth-1.0, 1.0); - vec4 pos = inv_proj * ndc; - pos /= pos.w; - pos.w = 1.0; - return pos; -} void main() { - vec2 frag = vary_fragcoord.xy/vary_fragcoord.z*0.5+0.5; - frag *= screen_res; - - vec3 samp_pos = getPosition(frag).xyz; - float shadow = 1.0; - vec4 pos = vary_position; - vec4 color = texture2D(diffuseMap, gl_TexCoord[0].xy)*gl_Color; + vec4 color = diffuseLookup(gl_TexCoord[0].xy)*gl_Color; color.rgb = fullbrightAtmosTransport(color.rgb); color.rgb = fullbrightScaleSoftClip(color.rgb); - //gl_FragColor = gl_Color; gl_FragColor = color; - //gl_FragColor = vec4(1,0,1,1); - } diff --git a/indra/newview/app_settings/shaders/class1/deferred/fullbrightV.glsl b/indra/newview/app_settings/shaders/class1/deferred/fullbrightV.glsl index 6c38d220e26962bf7ad251ca51fcc3f7e456c0d0..2eed044b7cc7db24521f785f70cce0fbae16fb92 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/fullbrightV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/fullbrightV.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + void calcAtmospherics(vec3 inPositionEye); @@ -14,30 +14,23 @@ vec3 atmosAffectDirectionalLight(float lightIntensity); vec3 scaleDownLight(vec3 light); vec3 scaleUpLight(vec3 light); -varying vec3 vary_ambient; -varying vec3 vary_directional; -varying vec3 vary_normal; -varying vec3 vary_fragcoord; -uniform float near_clip; -varying vec4 vary_position; +varying float vary_texture_index; void main() { //transform vertex - gl_Position = ftransform(); + vec4 vert = vec4(gl_Vertex.xyz, 1.0); + vary_texture_index = gl_Vertex.w; + + gl_Position = gl_ModelViewProjectionMatrix*vert; gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0; - vec4 pos = (gl_ModelViewMatrix * gl_Vertex); - vary_position = pos; - + vec4 pos = (gl_ModelViewMatrix * vert); + calcAtmospherics(pos.xyz); gl_FrontColor = gl_Color; gl_FogFragCoord = pos.z; - - pos = gl_ModelViewProjectionMatrix * gl_Vertex; - vary_fragcoord.xyz = pos.xyz + vec3(0,0,near_clip); - } diff --git a/indra/newview/app_settings/shaders/class1/deferred/giF.glsl b/indra/newview/app_settings/shaders/class1/deferred/giF.glsl index 75b555e8ae35eb709428304f60e9a16836938f6d..41c149e7744775d182ffb67a01330c25da722bef 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/giF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/giF.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + #extension GL_ARB_texture_rectangle : enable diff --git a/indra/newview/app_settings/shaders/class1/deferred/giV.glsl b/indra/newview/app_settings/shaders/class1/deferred/giV.glsl index 8dc1410ea5ad90d05d8bad4c485238550fd4cdd7..e86f2896da5fbc006f817a4f03a256599a7a69e3 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/giV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/giV.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + varying vec2 vary_fragcoord; diff --git a/indra/newview/app_settings/shaders/class1/deferred/impostorF.glsl b/indra/newview/app_settings/shaders/class1/deferred/impostorF.glsl index e3c15a2ab2d668bc15bdc2649c0f98ae1d585222..fa811f0d559e0510adea7eb4be98df4235032488 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/impostorF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/impostorF.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + uniform sampler2D diffuseMap; uniform sampler2D normalMap; diff --git a/indra/newview/app_settings/shaders/class1/deferred/impostorV.glsl b/indra/newview/app_settings/shaders/class1/deferred/impostorV.glsl index 37148b3f1a8c48c036290a9b2edc431ab5e61a9e..723777bd3a3329a69af2fa8d2012672115ba7df3 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/impostorV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/impostorV.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + void main() { diff --git a/indra/newview/app_settings/shaders/class1/deferred/luminanceF.glsl b/indra/newview/app_settings/shaders/class1/deferred/luminanceF.glsl index 78df54d5dc2b3726ad28daa881f3ceb1b9eebc8f..25e93ae266e99d1794c7f16dfd80e0c3aea010f2 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/luminanceF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/luminanceF.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + uniform sampler2DRect diffuseMap; diff --git a/indra/newview/app_settings/shaders/class1/deferred/luminanceV.glsl b/indra/newview/app_settings/shaders/class1/deferred/luminanceV.glsl index 0c820bfc6cf314aed20c9049b255953aac8b7f4f..4baf1fc65aa7836a423f60b869dbfdc9870a5773 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/luminanceV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/luminanceV.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + varying vec2 vary_fragcoord; diff --git a/indra/newview/app_settings/shaders/class1/deferred/multiPointLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/multiPointLightF.glsl index 609fc4f14ffa68aa634e0356d88891d022131ed7..3c5c780d944238b2add8962d7e20e4f200a92053 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/multiPointLightF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/multiPointLightF.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + #extension GL_ARB_texture_rectangle : enable @@ -36,7 +36,7 @@ uniform mat4 inv_proj; vec4 getPosition(vec2 pos_screen) { - float depth = texture2DRect(depthMap, pos_screen.xy).a; + float depth = texture2DRect(depthMap, pos_screen.xy).r; vec2 sc = pos_screen.xy*2.0; sc /= screen_res; sc -= vec2(1.0,1.0); diff --git a/indra/newview/app_settings/shaders/class1/deferred/multiPointLightMSF.glsl b/indra/newview/app_settings/shaders/class1/deferred/multiPointLightMSF.glsl new file mode 100644 index 0000000000000000000000000000000000000000..6c43679acf281c28485f9802d0a2a9bf16bb21d0 --- /dev/null +++ b/indra/newview/app_settings/shaders/class1/deferred/multiPointLightMSF.glsl @@ -0,0 +1,137 @@ +/** + * @file multiPointLightF.glsl + * + * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * $/LicenseInfo$ + */ + + + +#extension GL_ARB_texture_rectangle : enable +#extension GL_ARB_texture_multisample : enable + +uniform sampler2DMS depthMap; +uniform sampler2DMS diffuseRect; +uniform sampler2DMS specularRect; +uniform sampler2DMS normalMap; +uniform sampler2D noiseMap; +uniform sampler2D lightFunc; + + +uniform vec3 env_mat[3]; +uniform float sun_wash; + +uniform int light_count; + +#define MAX_LIGHT_COUNT 16 +uniform vec4 light[MAX_LIGHT_COUNT]; +uniform vec4 light_col[MAX_LIGHT_COUNT]; + +varying vec4 vary_fragcoord; +uniform vec2 screen_res; + +uniform float far_z; + +uniform mat4 inv_proj; + +vec4 getPosition(ivec2 pos_screen, int sample) +{ + float depth = texelFetch(depthMap, pos_screen, sample).r; + vec2 sc = vec2(pos_screen.xy)*2.0; + sc /= screen_res; + sc -= vec2(1.0,1.0); + vec4 ndc = vec4(sc.x, sc.y, 2.0*depth-1.0, 1.0); + vec4 pos = inv_proj * ndc; + pos /= pos.w; + pos.w = 1.0; + return pos; +} + +void main() +{ + vec2 frag = (vary_fragcoord.xy*0.5+0.5)*screen_res; + ivec2 itc = ivec2(frag); + + int wght = 0; + vec3 fcol = vec3(0,0,0); + + for (int s = 0; s < samples; ++s) + { + vec3 pos = getPosition(itc, s).xyz; + if (pos.z >= far_z) + { + vec3 norm = texelFetch(normalMap, itc, s).xyz; + norm = vec3((norm.xy-0.5)*2.0,norm.z); // unpack norm + norm = normalize(norm); + vec4 spec = texelFetch(specularRect, itc, s); + vec3 diff = texelFetch(diffuseRect, itc, s).rgb; + float noise = texture2D(noiseMap, frag.xy/128.0).b; + vec3 out_col = vec3(0,0,0); + vec3 npos = normalize(-pos); + + // As of OSX 10.6.7 ATI Apple's crash when using a variable size loop + for (int i = 0; i < MAX_LIGHT_COUNT; ++i) + { + bool light_contrib = (i < light_count); + + vec3 lv = light[i].xyz-pos; + float dist2 = dot(lv,lv); + dist2 /= light[i].w; + if (dist2 > 1.0) + { + light_contrib = false; + } + + float da = dot(norm, lv); + if (da < 0.0) + { + light_contrib = false; + } + + if (light_contrib) + { + lv = normalize(lv); + da = dot(norm, lv); + + float fa = light_col[i].a+1.0; + float dist_atten = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0); + dist_atten *= noise; + + float lit = da * dist_atten; + + vec3 col = light_col[i].rgb*lit*diff; + //vec3 col = vec3(dist2, light_col[i].a, lit); + + if (spec.a > 0.0) + { + //vec3 ref = dot(pos+lv, norm); + + float sa = dot(normalize(lv+npos),norm); + + if (sa > 0.0) + { + sa = texture2D(lightFunc,vec2(sa, spec.a)).a * min(dist_atten*4.0, 1.0); + sa *= noise; + col += da*sa*light_col[i].rgb*spec.rgb; + } + } + + out_col += col; + } + } + + fcol += out_col; + ++wght; + } + } + + if (wght <= 0) + { + discard; + } + + gl_FragColor.rgb = fcol/samples; + gl_FragColor.a = 0.0; + + +} diff --git a/indra/newview/app_settings/shaders/class1/deferred/multiPointLightV.glsl b/indra/newview/app_settings/shaders/class1/deferred/multiPointLightV.glsl index 2e3e84dd156fd62563fbd241cd02d38f9236fb50..434fb6f53462bbb23a585f2ae339f12efb907c85 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/multiPointLightV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/multiPointLightV.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + varying vec4 vary_fragcoord; diff --git a/indra/newview/app_settings/shaders/class1/deferred/multiSpotLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/multiSpotLightF.glsl index a9f03f76151d014db77e7b46d4f5a20e805f8eaf..0d25d7792da169da6a9e9917543c00622b6b2df7 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/multiSpotLightF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/multiSpotLightF.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + //class 1 -- no shadows diff --git a/indra/newview/app_settings/shaders/class1/deferred/multiSpotLightMSF.glsl b/indra/newview/app_settings/shaders/class1/deferred/multiSpotLightMSF.glsl new file mode 100644 index 0000000000000000000000000000000000000000..c80a54346e4cb78cdb5c666327d8d32524e23784 --- /dev/null +++ b/indra/newview/app_settings/shaders/class1/deferred/multiSpotLightMSF.glsl @@ -0,0 +1,232 @@ +/** + * @file multiSpotLightF.glsl + * + * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * $/LicenseInfo$ + */ + + + +//class 1 -- no shadows + +#extension GL_ARB_texture_rectangle : enable +#extension GL_ARB_texture_multisample : enable + +uniform sampler2DMS diffuseRect; +uniform sampler2DMS specularRect; +uniform sampler2DMS depthMap; +uniform sampler2DMS normalMap; +uniform sampler2D noiseMap; +uniform sampler2D lightFunc; +uniform sampler2D projectionMap; + +uniform mat4 proj_mat; //screen space to light space +uniform float proj_near; //near clip for projection +uniform vec3 proj_p; //plane projection is emitting from (in screen space) +uniform vec3 proj_n; +uniform float proj_focus; //distance from plane to begin blurring +uniform float proj_lod; //(number of mips in proj map) +uniform float proj_range; //range between near clip and far clip plane of projection +uniform float proj_ambient_lod; +uniform float proj_ambiance; +uniform float near_clip; +uniform float far_clip; + +uniform vec3 proj_origin; //origin of projection to be used for angular attenuation +uniform float sun_wash; +uniform float shadow_fade; + +varying vec4 vary_light; + +varying vec4 vary_fragcoord; +uniform vec2 screen_res; + +uniform mat4 inv_proj; + +vec4 texture2DLodSpecular(sampler2D projectionMap, vec2 tc, float lod) +{ + vec4 ret = texture2DLod(projectionMap, tc, lod); + + vec2 dist = tc-vec2(0.5); + + float det = max(1.0-lod/(proj_lod*0.5), 0.0); + + float d = dot(dist,dist); + + ret *= min(clamp((0.25-d)/0.25, 0.0, 1.0)+det, 1.0); + + return ret; +} + +vec4 texture2DLodDiffuse(sampler2D projectionMap, vec2 tc, float lod) +{ + vec4 ret = texture2DLod(projectionMap, tc, lod); + + vec2 dist = vec2(0.5) - abs(tc-vec2(0.5)); + + float det = min(lod/(proj_lod*0.5), 1.0); + + float d = min(dist.x, dist.y); + + float edge = 0.25*det; + + ret *= clamp(d/edge, 0.0, 1.0); + + return ret; +} + +vec4 texture2DLodAmbient(sampler2D projectionMap, vec2 tc, float lod) +{ + vec4 ret = texture2DLod(projectionMap, tc, lod); + + vec2 dist = tc-vec2(0.5); + + float d = dot(dist,dist); + + ret *= min(clamp((0.25-d)/0.25, 0.0, 1.0), 1.0); + + return ret; +} + + +vec4 getPosition(ivec2 pos_screen, int sample) +{ + float depth = texelFetch(depthMap, pos_screen, sample).r; + vec2 sc = vec2(pos_screen.xy)*2.0; + sc /= screen_res; + sc -= vec2(1.0,1.0); + vec4 ndc = vec4(sc.x, sc.y, 2.0*depth-1.0, 1.0); + vec4 pos = inv_proj * ndc; + pos /= pos.w; + pos.w = 1.0; + return pos; +} + +void main() +{ + int wght = 0; + + vec3 fcol = vec3(0,0,0); + + vec2 frag = (vary_fragcoord.xy*0.5+0.5)*screen_res; + + ivec2 itc = ivec2(frag.xy); + + for (int i = 0; i < samples; ++i) + { + vec3 pos = getPosition(itc, i).xyz; + vec3 lv = vary_light.xyz-pos.xyz; + float dist2 = dot(lv,lv); + dist2 /= vary_light.w; + if (dist2 <= 1.0) + { + vec3 norm = texelFetch(normalMap, itc, i).xyz*2.0-1.0; + + norm = normalize(norm); + float l_dist = -dot(lv, proj_n); + + vec4 proj_tc = (proj_mat * vec4(pos.xyz, 1.0)); + if (proj_tc.z >= 0.0) + { + proj_tc.xyz /= proj_tc.w; + + float fa = gl_Color.a+1.0; + float dist_atten = min(1.0-(dist2-1.0*(1.0-fa))/fa, 1.0); + if (dist_atten > 0.0) + { + lv = proj_origin-pos.xyz; + lv = normalize(lv); + float da = dot(norm, lv); + + vec3 col = vec3(0,0,0); + + vec3 diff_tex = texelFetch(diffuseRect, itc, i).rgb; + + float noise = texture2D(noiseMap, frag.xy/128.0).b; + if (proj_tc.z > 0.0 && + proj_tc.x < 1.0 && + proj_tc.y < 1.0 && + proj_tc.x > 0.0 && + proj_tc.y > 0.0) + { + float lit = 0.0; + float amb_da = proj_ambiance; + + if (da > 0.0) + { + float diff = clamp((l_dist-proj_focus)/proj_range, 0.0, 1.0); + float lod = diff * proj_lod; + + vec4 plcol = texture2DLodDiffuse(projectionMap, proj_tc.xy, lod); + + vec3 lcol = gl_Color.rgb * plcol.rgb * plcol.a; + + lit = da * dist_atten * noise; + + col = lcol*lit*diff_tex; + amb_da += (da*0.5)*proj_ambiance; + } + + //float diff = clamp((proj_range-proj_focus)/proj_range, 0.0, 1.0); + vec4 amb_plcol = texture2DLodAmbient(projectionMap, proj_tc.xy, proj_lod); + + amb_da += (da*da*0.5+0.5)*proj_ambiance; + + amb_da *= dist_atten * noise; + + amb_da = min(amb_da, 1.0-lit); + + col += amb_da*gl_Color.rgb*diff_tex.rgb*amb_plcol.rgb*amb_plcol.a; + } + + + vec4 spec = texelFetch(specularRect, itc, i); + if (spec.a > 0.0) + { + vec3 ref = reflect(normalize(pos), norm); + + //project from point pos in direction ref to plane proj_p, proj_n + vec3 pdelta = proj_p-pos; + float ds = dot(ref, proj_n); + + if (ds < 0.0) + { + vec3 pfinal = pos + ref * dot(pdelta, proj_n)/ds; + + vec4 stc = (proj_mat * vec4(pfinal.xyz, 1.0)); + + if (stc.z > 0.0) + { + stc.xy /= stc.w; + + float fatten = clamp(spec.a*spec.a+spec.a*0.5, 0.25, 1.0); + + stc.xy = (stc.xy - vec2(0.5)) * fatten + vec2(0.5); + + if (stc.x < 1.0 && + stc.y < 1.0 && + stc.x > 0.0 && + stc.y > 0.0) + { + vec4 scol = texture2DLodSpecular(projectionMap, stc.xy, proj_lod-spec.a*proj_lod); + col += dist_atten*scol.rgb*gl_Color.rgb*scol.a*spec.rgb; + } + } + } + } + + fcol += col; + ++wght; + } + } + } + } + + if (wght <= 0) + { + discard; + } + + gl_FragColor.rgb = fcol/samples; + gl_FragColor.a = 0.0; +} diff --git a/indra/newview/app_settings/shaders/class1/deferred/pointLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/pointLightF.glsl index 22ed9dcd40ec25f456f91c5dc0e92333e41dfb27..5efa3200d4ab93057ab80c3fecbe17d87e391d69 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/pointLightF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/pointLightF.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ - #version 120 + #extension GL_ARB_texture_rectangle : enable @@ -30,7 +30,7 @@ uniform vec4 viewport; vec4 getPosition(vec2 pos_screen) { - float depth = texture2DRect(depthMap, pos_screen.xy).a; + float depth = texture2DRect(depthMap, pos_screen.xy).r; vec2 sc = (pos_screen.xy-viewport.xy)*2.0; sc /= viewport.zw; sc -= vec2(1.0,1.0); diff --git a/indra/newview/app_settings/shaders/class1/deferred/pointLightMSF.glsl b/indra/newview/app_settings/shaders/class1/deferred/pointLightMSF.glsl new file mode 100644 index 0000000000000000000000000000000000000000..feaf38115d1c3904249eeb6028c5b25169fce6ed --- /dev/null +++ b/indra/newview/app_settings/shaders/class1/deferred/pointLightMSF.glsl @@ -0,0 +1,108 @@ +/** + * @file pointLightF.glsl + * + * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * $/LicenseInfo$ + */ + + + +#extension GL_ARB_texture_rectangle : enable +#extension GL_ARB_texture_multisample : enable + +uniform sampler2DMS depthMap; +uniform sampler2DMS diffuseRect; +uniform sampler2DMS specularRect; +uniform sampler2DMS normalMap; +uniform sampler2D noiseMap; +uniform sampler2D lightFunc; + + +uniform vec3 env_mat[3]; +uniform float sun_wash; + +varying vec4 vary_light; + +varying vec4 vary_fragcoord; +uniform vec2 screen_res; + +uniform mat4 inv_proj; +uniform vec4 viewport; + +vec4 getPosition(ivec2 pos_screen, int sample) +{ + float depth = texelFetch(depthMap, pos_screen, sample).r; + vec2 sc = (vec2(pos_screen.xy)-viewport.xy)*2.0; + sc /= viewport.zw; + sc -= vec2(1.0,1.0); + vec4 ndc = vec4(sc.x, sc.y, 2.0*depth-1.0, 1.0); + vec4 pos = inv_proj * ndc; + pos /= pos.w; + pos.w = 1.0; + return pos; +} + +void main() +{ + vec4 frag = vary_fragcoord; + frag.xyz /= frag.w; + frag.xyz = frag.xyz*0.5+0.5; + frag.xy *= screen_res; + + ivec2 itc = ivec2(frag.xy); + + int wght = 0; + vec3 fcol = vec3(0,0,0); + + for (int s = 0; s < samples; ++s) + { + vec3 pos = getPosition(itc, s).xyz; + vec3 lv = vary_light.xyz-pos; + float dist2 = dot(lv,lv); + dist2 /= vary_light.w; + if (dist2 <= 1.0) + { + vec3 norm = texelFetch(normalMap, itc, s).xyz; + norm = vec3((norm.xy-0.5)*2.0,norm.z); // unpack norm + float da = dot(norm, lv); + if (da >= 0.0) + { + norm = normalize(norm); + lv = normalize(lv); + da = dot(norm, lv); + + float noise = texture2D(noiseMap, frag.xy/128.0).b; + + vec3 col = texelFetch(diffuseRect, itc, s).rgb; + float fa = gl_Color.a+1.0; + float dist_atten = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0); + float lit = da * dist_atten * noise; + + col = gl_Color.rgb*lit*col; + + vec4 spec = texelFetch(specularRect, itc, s); + if (spec.a > 0.0) + { + float sa = dot(normalize(lv-normalize(pos)),norm); + if (sa > 0.0) + { + sa = texture2D(lightFunc, vec2(sa, spec.a)).a * min(dist_atten*4.0, 1.0); + sa *= noise; + col += da*sa*gl_Color.rgb*spec.rgb; + } + } + + fcol += col; + ++wght; + } + } + } + + if (wght <= 0) + { + discard; + } + + gl_FragColor.rgb = fcol/samples; + gl_FragColor.a = 0.0; +} diff --git a/indra/newview/app_settings/shaders/class1/deferred/pointLightV.glsl b/indra/newview/app_settings/shaders/class1/deferred/pointLightV.glsl index 8e74feb61565cac9f6d4736bc04c72909a293867..c510d8ad7794f040a107416ef400c01458b3bcf6 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/pointLightV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/pointLightV.glsl @@ -5,19 +5,14 @@ * $/LicenseInfo$ */ -#version 120 + varying vec4 vary_light; varying vec4 vary_fragcoord; -uniform vec2 screen_res; -uniform float near_clip; - void main() { //transform vertex - gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; - vec4 pos = gl_ModelViewProjectionMatrix * gl_Vertex; vary_fragcoord = pos; @@ -25,6 +20,8 @@ void main() tex.w = 1.0; vary_light = gl_MultiTexCoord0; + + gl_Position = pos; gl_FrontColor = gl_Color; } diff --git a/indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl b/indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl index 77f1b2224c20f04f66b79b948fc5be3a3844f6ea..f6b0402bb9c532e7def229313671079828281f3a 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + #extension GL_ARB_texture_rectangle : enable @@ -29,7 +29,7 @@ varying vec2 vary_fragcoord; float getDepth(vec2 pos_screen) { - float z = texture2DRect(depthMap, pos_screen.xy).a; + float z = texture2DRect(depthMap, pos_screen.xy).r; z = z*2.0-1.0; vec4 ndc = vec4(0.0, 0.0, z, 1.0); vec4 p = inv_proj*ndc; diff --git a/indra/newview/app_settings/shaders/class1/deferred/postDeferredMSF.glsl b/indra/newview/app_settings/shaders/class1/deferred/postDeferredMSF.glsl new file mode 100644 index 0000000000000000000000000000000000000000..62ae5f917a2f5645f323a58a621178ebe1019525 --- /dev/null +++ b/indra/newview/app_settings/shaders/class1/deferred/postDeferredMSF.glsl @@ -0,0 +1,133 @@ +/** + * @file postDeferredF.glsl + * + * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * $/LicenseInfo$ + */ + + + +#extension GL_ARB_texture_rectangle : enable +#extension GL_ARB_texture_multisample : enable + +uniform sampler2DMS diffuseRect; +uniform sampler2DMS edgeMap; +uniform sampler2DMS depthMap; +uniform sampler2DMS normalMap; +uniform sampler2D bloomMap; + +uniform float depth_cutoff; +uniform float norm_cutoff; +uniform float focal_distance; +uniform float blur_constant; +uniform float tan_pixel_angle; +uniform float magnification; + +uniform mat4 inv_proj; +uniform vec2 screen_res; + +varying vec2 vary_fragcoord; + +vec4 texture2DMS(sampler2DMS tex, ivec2 tc) +{ + vec4 ret = vec4(0,0,0,0); + for (int i = 0; i < samples; ++i) + { + ret += texelFetch(tex, tc, i); + } + + return ret/samples; +} + +float getDepth(ivec2 pos_screen) +{ + float z = texture2DMS(depthMap, pos_screen.xy).r; + z = z*2.0-1.0; + vec4 ndc = vec4(0.0, 0.0, z, 1.0); + vec4 p = inv_proj*ndc; + return p.z/p.w; +} + +float calc_cof(float depth) +{ + float sc = abs(depth-focal_distance)/-depth*blur_constant; + + sc /= magnification; + + // tan_pixel_angle = pixel_length/-depth; + float pixel_length = tan_pixel_angle*-focal_distance; + + sc = sc/pixel_length; + sc *= 1.414; + + return sc; +} + +void dofSample(inout vec4 diff, inout float w, float min_sc, float cur_depth, ivec2 tc) +{ + float d = getDepth(tc); + + float sc = calc_cof(d); + + if (sc > min_sc //sampled pixel is more "out of focus" than current sample radius + || d < cur_depth) //sampled pixel is further away than current pixel + { + float wg = 0.25; + + vec4 s = texture2DMS(diffuseRect, tc); + // de-weight dull areas to make highlights 'pop' + wg += s.r+s.g+s.b; + + diff += wg*s; + + w += wg; + } +} + + +void main() +{ + ivec2 itc = ivec2(vary_fragcoord.xy); + + vec3 norm = texture2DMS(normalMap, itc).xyz; + norm = vec3((norm.xy-0.5)*2.0,norm.z); // unpack norm + + float depth = getDepth(itc); + + vec4 diff = texture2DMS(diffuseRect, itc); + + { + float w = 1.0; + + float sc = calc_cof(depth); + sc = min(abs(sc), 10.0); + + float fd = depth*0.5f; + + float PI = 3.14159265358979323846264; + + int isc = int(sc); + + // sample quite uniformly spaced points within a circle, for a circular 'bokeh' + //if (depth < focal_distance) + { + for (int x = -isc; x <= isc; x+=2) + { + for (int y = -isc; y <= isc; y+=2) + { + ivec2 cur_samp = ivec2(x,y); + float cur_sc = length(vec2(cur_samp)); + if (cur_sc < sc) + { + dofSample(diff, w, cur_sc, depth, itc+cur_samp); + } + } + } + } + + diff /= w; + } + + vec4 bloom = texture2D(bloomMap, vary_fragcoord.xy/screen_res); + gl_FragColor = diff + bloom; +} diff --git a/indra/newview/app_settings/shaders/class1/deferred/postDeferredNoDoFF.glsl b/indra/newview/app_settings/shaders/class1/deferred/postDeferredNoDoFF.glsl index ab48d08bbb070342a2f48402b32859c8aaedf01a..bf829bfc560e94ca413183588fc71382a1100634 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/postDeferredNoDoFF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/postDeferredNoDoFF.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + #extension GL_ARB_texture_rectangle : enable diff --git a/indra/newview/app_settings/shaders/class1/deferred/postDeferredNoDoFMSF.glsl b/indra/newview/app_settings/shaders/class1/deferred/postDeferredNoDoFMSF.glsl new file mode 100644 index 0000000000000000000000000000000000000000..bf35dfe11cb928c7a874504689dded0ed1e2a08d --- /dev/null +++ b/indra/newview/app_settings/shaders/class1/deferred/postDeferredNoDoFMSF.glsl @@ -0,0 +1,37 @@ +/** + * @file postDeferredF.glsl + * + * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * $/LicenseInfo$ + */ + + + +#extension GL_ARB_texture_rectangle : enable +#extension GL_ARB_texture_multisample : enable + +uniform sampler2DMS diffuseRect; +uniform sampler2D bloomMap; + +uniform vec2 screen_res; +varying vec2 vary_fragcoord; + +vec4 texture2DMS(sampler2DMS tex, ivec2 tc) +{ + vec4 ret = vec4(0,0,0,0); + + for (int i = 0; i < samples; ++i) + { + ret += texelFetch(tex,tc,i); + } + + return ret/samples; +} + +void main() +{ + vec4 diff = texture2DMS(diffuseRect, ivec2(vary_fragcoord.xy)); + + vec4 bloom = texture2D(bloomMap, vary_fragcoord.xy/screen_res); + gl_FragColor = diff + bloom; +} diff --git a/indra/newview/app_settings/shaders/class1/deferred/postDeferredV.glsl b/indra/newview/app_settings/shaders/class1/deferred/postDeferredV.glsl index 12983baa94882bfc3f58349847dd7bec1b3aadca..876f65ee3adc86302c81426f8ce576b67ae96a95 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/postDeferredV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/postDeferredV.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + varying vec2 vary_fragcoord; uniform vec2 screen_res; diff --git a/indra/newview/app_settings/shaders/class1/deferred/postgiF.glsl b/indra/newview/app_settings/shaders/class1/deferred/postgiF.glsl index 63b3c9f20527dae3364ede4002f395aedf798ae4..fa3f04bcc81b9912fd7a0dcf094cab4f7c893649 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/postgiF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/postgiF.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + uniform sampler2DRect depthMap; uniform sampler2DRect normalMap; diff --git a/indra/newview/app_settings/shaders/class1/deferred/postgiV.glsl b/indra/newview/app_settings/shaders/class1/deferred/postgiV.glsl index ae57227fe528b03b5e2a0d216c9a8b97a5ddfb39..eebe930666a60742bb73b063f384b32d99d4f726 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/postgiV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/postgiV.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + varying vec2 vary_fragcoord; uniform vec2 screen_res; diff --git a/indra/newview/app_settings/shaders/class1/deferred/shadowF.glsl b/indra/newview/app_settings/shaders/class1/deferred/shadowF.glsl index 6674c4a5aa275a379c2bab374801a9b38ebe51f9..e0c540648307f784156647f5a1463d740e96c8de 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/shadowF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/shadowF.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + uniform sampler2D diffuseMap; diff --git a/indra/newview/app_settings/shaders/class1/deferred/shadowV.glsl b/indra/newview/app_settings/shaders/class1/deferred/shadowV.glsl index db3bddc6bea4b635bb834b2a59b29f00001ba503..9271a5115c5277925f61e0c9fa3ec61c79082a92 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/shadowV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/shadowV.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + varying vec4 post_pos; diff --git a/indra/newview/app_settings/shaders/class1/deferred/skyF.glsl b/indra/newview/app_settings/shaders/class1/deferred/skyF.glsl new file mode 100644 index 0000000000000000000000000000000000000000..820c82ffd7f964318e467c579840411de836aaec --- /dev/null +++ b/indra/newview/app_settings/shaders/class1/deferred/skyF.glsl @@ -0,0 +1,44 @@ +/** + * @file WLSkyF.glsl + * + * $LicenseInfo:firstyear=2005&license=viewerlgpl$ + * $/LicenseInfo$ + */ + + + +///////////////////////////////////////////////////////////////////////// +// The fragment shader for the sky +///////////////////////////////////////////////////////////////////////// + +varying vec4 vary_HazeColor; + +uniform sampler2D cloud_noise_texture; +uniform vec4 gamma; + +/// Soft clips the light with a gamma correction +vec3 scaleSoftClip(vec3 light) { + //soft clip effect: + light = 1. - clamp(light, vec3(0.), vec3(1.)); + light = 1. - pow(light, gamma.xxx); + + return light; +} + +void main() +{ + // Potential Fill-rate optimization. Add cloud calculation + // back in and output alpha of 0 (so that alpha culling kills + // the fragment) if the sky wouldn't show up because the clouds + // are fully opaque. + + vec4 color; + color = vary_HazeColor; + color *= 2.; + + /// Gamma correct for WL (soft clip effect). + gl_FragData[0] = vec4(scaleSoftClip(color.rgb), 1.0); + gl_FragData[1] = vec4(0.0,0.0,0.0,0.0); + gl_FragData[2] = vec4(0,0,1,0); +} + diff --git a/indra/newview/app_settings/shaders/class1/deferred/skyV.glsl b/indra/newview/app_settings/shaders/class1/deferred/skyV.glsl new file mode 100644 index 0000000000000000000000000000000000000000..1ea00f723afcab0ed9f5f746f194f1ab2e5e7dde --- /dev/null +++ b/indra/newview/app_settings/shaders/class1/deferred/skyV.glsl @@ -0,0 +1,140 @@ +/** + * @file WLSkyV.glsl + * + * $LicenseInfo:firstyear=2005&license=viewerlgpl$ + * $/LicenseInfo$ + */ + + + +// SKY //////////////////////////////////////////////////////////////////////// +// The vertex shader for creating the atmospheric sky +/////////////////////////////////////////////////////////////////////////////// + +// Output parameters +varying vec4 vary_HazeColor; + +// Inputs +uniform vec3 camPosLocal; + +uniform vec4 lightnorm; +uniform vec4 sunlight_color; +uniform vec4 ambient; +uniform vec4 blue_horizon; +uniform vec4 blue_density; +uniform vec4 haze_horizon; +uniform vec4 haze_density; + +uniform vec4 cloud_shadow; +uniform vec4 density_multiplier; +uniform vec4 max_y; + +uniform vec4 glow; + +uniform vec4 cloud_color; + +uniform vec4 cloud_scale; + +void main() +{ + + // World / view / projection + gl_Position = ftransform(); + gl_TexCoord[0] = gl_MultiTexCoord0; + + // Get relative position + vec3 P = gl_Vertex.xyz - camPosLocal.xyz + vec3(0,50,0); + //vec3 P = gl_Vertex.xyz + vec3(0,50,0); + + // Set altitude + if (P.y > 0.) + { + P *= (max_y.x / P.y); + } + else + { + P *= (-32000. / P.y); + } + + // Can normalize then + vec3 Pn = normalize(P); + float Plen = length(P); + + // Initialize temp variables + vec4 temp1 = vec4(0.); + vec4 temp2 = vec4(0.); + vec4 blue_weight; + vec4 haze_weight; + vec4 sunlight = sunlight_color; + vec4 light_atten; + + + // Sunlight attenuation effect (hue and brightness) due to atmosphere + // this is used later for sunlight modulation at various altitudes + light_atten = (blue_density * 1.0 + haze_density.x * 0.25) * (density_multiplier.x * max_y.x); + + // Calculate relative weights + temp1 = blue_density + haze_density.x; + blue_weight = blue_density / temp1; + haze_weight = haze_density.x / temp1; + + // Compute sunlight from P & lightnorm (for long rays like sky) + temp2.y = max(0., max(0., Pn.y) * 1.0 + lightnorm.y ); + temp2.y = 1. / temp2.y; + sunlight *= exp( - light_atten * temp2.y); + + // Distance + temp2.z = Plen * density_multiplier.x; + + // Transparency (-> temp1) + // ATI Bugfix -- can't store temp1*temp2.z in a variable because the ati + // compiler gets confused. + temp1 = exp(-temp1 * temp2.z); + + + // Compute haze glow + temp2.x = dot(Pn, lightnorm.xyz); + temp2.x = 1. - temp2.x; + // temp2.x is 0 at the sun and increases away from sun + temp2.x = max(temp2.x, .001); + // Set a minimum "angle" (smaller glow.y allows tighter, brighter hotspot) + temp2.x *= glow.x; + // Higher glow.x gives dimmer glow (because next step is 1 / "angle") + temp2.x = pow(temp2.x, glow.z); + // glow.z should be negative, so we're doing a sort of (1 / "angle") function + + // Add "minimum anti-solar illumination" + temp2.x += .25; + + + // Haze color above cloud + vary_HazeColor = ( blue_horizon * blue_weight * (sunlight + ambient) + + (haze_horizon.r * haze_weight) * (sunlight * temp2.x + ambient) + ); + + + // Increase ambient when there are more clouds + vec4 tmpAmbient = ambient; + tmpAmbient += (1. - tmpAmbient) * cloud_shadow.x * 0.5; + + // Dim sunlight by cloud shadow percentage + sunlight *= (1. - cloud_shadow.x); + + // Haze color below cloud + vec4 additiveColorBelowCloud = ( blue_horizon * blue_weight * (sunlight + tmpAmbient) + + (haze_horizon.r * haze_weight) * (sunlight * temp2.x + tmpAmbient) + ); + + // Final atmosphere additive + vary_HazeColor *= (1. - temp1); + + // Attenuate cloud color by atmosphere + temp1 = sqrt(temp1); //less atmos opacity (more transparency) below clouds + + // At horizon, blend high altitude sky color towards the darker color below the clouds + vary_HazeColor += (additiveColorBelowCloud - vary_HazeColor) * (1. - sqrt(temp1)); + + // won't compile on mac without this being set + //vary_AtmosAttenuation = vec3(0.0,0.0,0.0); +} + diff --git a/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl index 29340c7e9f01bc8d44ad910fe56c4d0e243a6a4d..60082f40d691feee85946a50b180123a28c6b45a 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + #extension GL_ARB_texture_rectangle : enable @@ -259,7 +259,7 @@ vec3 scaleSoftClip(vec3 light) void main() { vec2 tc = vary_fragcoord.xy; - float depth = texture2DRect(depthMap, tc.xy).a; + float depth = texture2DRect(depthMap, tc.xy).r; vec3 pos = getPosition_d(tc, depth).xyz; vec3 norm = texture2DRect(normalMap, tc).xyz; norm = vec3((norm.xy-0.5)*2.0,norm.z); // unpack norm diff --git a/indra/newview/app_settings/shaders/class1/deferred/softenLightMSF.glsl b/indra/newview/app_settings/shaders/class1/deferred/softenLightMSF.glsl new file mode 100644 index 0000000000000000000000000000000000000000..9dfacfb520cd8638b252a2845d3560f5806a4a7e --- /dev/null +++ b/indra/newview/app_settings/shaders/class1/deferred/softenLightMSF.glsl @@ -0,0 +1,318 @@ +/** + * @file softenLightF.glsl + * + * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * $/LicenseInfo$ + */ + + + +#extension GL_ARB_texture_rectangle : enable +#extension GL_ARB_texture_multisample : enable + +uniform sampler2DMS diffuseRect; +uniform sampler2DMS specularRect; +uniform sampler2DMS normalMap; +uniform sampler2DMS depthMap; +uniform sampler2D noiseMap; +uniform samplerCube environmentMap; +uniform sampler2D lightFunc; + +uniform float blur_size; +uniform float blur_fidelity; + +// Inputs +uniform vec4 morphFactor; +uniform vec3 camPosLocal; +//uniform vec4 camPosWorld; +uniform vec4 gamma; +uniform vec4 lightnorm; +uniform vec4 sunlight_color; +uniform vec4 ambient; +uniform vec4 blue_horizon; +uniform vec4 blue_density; +uniform vec4 haze_horizon; +uniform vec4 haze_density; +uniform vec4 cloud_shadow; +uniform vec4 density_multiplier; +uniform vec4 distance_multiplier; +uniform vec4 max_y; +uniform vec4 glow; +uniform float scene_light_strength; +uniform vec3 env_mat[3]; +//uniform mat4 shadow_matrix[3]; +//uniform vec4 shadow_clip; +uniform mat3 ssao_effect_mat; + +varying vec4 vary_light; +varying vec2 vary_fragcoord; + +vec3 vary_PositionEye; + +vec3 vary_SunlitColor; +vec3 vary_AmblitColor; +vec3 vary_AdditiveColor; +vec3 vary_AtmosAttenuation; + +uniform mat4 inv_proj; +uniform vec2 screen_res; + +vec4 getPosition_d(vec2 pos_screen, float depth) +{ + vec2 sc = pos_screen.xy*2.0; + sc /= screen_res; + sc -= vec2(1.0,1.0); + vec4 ndc = vec4(sc.x, sc.y, 2.0*depth-1.0, 1.0); + vec4 pos = inv_proj * ndc; + pos /= pos.w; + pos.w = 1.0; + return pos; +} + +vec3 getPositionEye() +{ + return vary_PositionEye; +} +vec3 getSunlitColor() +{ + return vary_SunlitColor; +} +vec3 getAmblitColor() +{ + return vary_AmblitColor; +} +vec3 getAdditiveColor() +{ + return vary_AdditiveColor; +} +vec3 getAtmosAttenuation() +{ + return vary_AtmosAttenuation; +} + + +void setPositionEye(vec3 v) +{ + vary_PositionEye = v; +} + +void setSunlitColor(vec3 v) +{ + vary_SunlitColor = v; +} + +void setAmblitColor(vec3 v) +{ + vary_AmblitColor = v; +} + +void setAdditiveColor(vec3 v) +{ + vary_AdditiveColor = v; +} + +void setAtmosAttenuation(vec3 v) +{ + vary_AtmosAttenuation = v; +} + +void calcAtmospherics(vec3 inPositionEye, float ambFactor) { + + vec3 P = inPositionEye; + setPositionEye(P); + + //(TERRAIN) limit altitude + if (P.y > max_y.x) P *= (max_y.x / P.y); + if (P.y < -max_y.x) P *= (-max_y.x / P.y); + + vec3 tmpLightnorm = lightnorm.xyz; + + vec3 Pn = normalize(P); + float Plen = length(P); + + vec4 temp1 = vec4(0); + vec3 temp2 = vec3(0); + vec4 blue_weight; + vec4 haze_weight; + vec4 sunlight = sunlight_color; + vec4 light_atten; + + //sunlight attenuation effect (hue and brightness) due to atmosphere + //this is used later for sunlight modulation at various altitudes + light_atten = (blue_density * 1.0 + vec4(haze_density.r) * 0.25) * (density_multiplier.x * max_y.x); + //I had thought blue_density and haze_density should have equal weighting, + //but attenuation due to haze_density tends to seem too strong + + temp1 = blue_density + vec4(haze_density.r); + blue_weight = blue_density / temp1; + haze_weight = vec4(haze_density.r) / temp1; + + //(TERRAIN) compute sunlight from lightnorm only (for short rays like terrain) + temp2.y = max(0.0, tmpLightnorm.y); + temp2.y = 1. / temp2.y; + sunlight *= exp( - light_atten * temp2.y); + + // main atmospheric scattering line integral + temp2.z = Plen * density_multiplier.x; + + // Transparency (-> temp1) + // ATI Bugfix -- can't store temp1*temp2.z*distance_multiplier.x in a variable because the ati + // compiler gets confused. + temp1 = exp(-temp1 * temp2.z * distance_multiplier.x); + + //final atmosphere attenuation factor + setAtmosAttenuation(temp1.rgb); + + //compute haze glow + //(can use temp2.x as temp because we haven't used it yet) + temp2.x = dot(Pn, tmpLightnorm.xyz); + temp2.x = 1. - temp2.x; + //temp2.x is 0 at the sun and increases away from sun + temp2.x = max(temp2.x, .03); //was glow.y + //set a minimum "angle" (smaller glow.y allows tighter, brighter hotspot) + temp2.x *= glow.x; + //higher glow.x gives dimmer glow (because next step is 1 / "angle") + temp2.x = pow(temp2.x, glow.z); + //glow.z should be negative, so we're doing a sort of (1 / "angle") function + + //add "minimum anti-solar illumination" + temp2.x += .25; + + //increase ambient when there are more clouds + vec4 tmpAmbient = ambient + (vec4(1.) - ambient) * cloud_shadow.x * 0.5; + + /* decrease value and saturation (that in HSV, not HSL) for occluded areas + * // for HSV color/geometry used here, see http://gimp-savvy.com/BOOK/index.html?node52.html + * // The following line of code performs the equivalent of: + * float ambAlpha = tmpAmbient.a; + * float ambValue = dot(vec3(tmpAmbient), vec3(0.577)); // projection onto <1/rt(3), 1/rt(3), 1/rt(3)>, the neutral white-black axis + * vec3 ambHueSat = vec3(tmpAmbient) - vec3(ambValue); + * tmpAmbient = vec4(RenderSSAOEffect.valueFactor * vec3(ambValue) + RenderSSAOEffect.saturationFactor *(1.0 - ambFactor) * ambHueSat, ambAlpha); + */ + tmpAmbient = vec4(mix(ssao_effect_mat * tmpAmbient.rgb, tmpAmbient.rgb, ambFactor), tmpAmbient.a); + + //haze color + setAdditiveColor( + vec3(blue_horizon * blue_weight * (sunlight*(1.-cloud_shadow.x) + tmpAmbient) + + (haze_horizon.r * haze_weight) * (sunlight*(1.-cloud_shadow.x) * temp2.x + + tmpAmbient))); + + //brightness of surface both sunlight and ambient + setSunlitColor(vec3(sunlight * .5)); + setAmblitColor(vec3(tmpAmbient * .25)); + setAdditiveColor(getAdditiveColor() * vec3(1.0 - temp1)); +} + +vec3 atmosLighting(vec3 light) +{ + light *= getAtmosAttenuation().r; + light += getAdditiveColor(); + return (2.0 * light); +} + +vec3 atmosTransport(vec3 light) { + light *= getAtmosAttenuation().r; + light += getAdditiveColor() * 2.0; + return light; +} +vec3 atmosGetDiffuseSunlightColor() +{ + return getSunlitColor(); +} + +vec3 scaleDownLight(vec3 light) +{ + return (light / scene_light_strength ); +} + +vec3 scaleUpLight(vec3 light) +{ + return (light * scene_light_strength); +} + +vec3 atmosAmbient(vec3 light) +{ + return getAmblitColor() + light / 2.0; +} + +vec3 atmosAffectDirectionalLight(float lightIntensity) +{ + return getSunlitColor() * lightIntensity; +} + +vec3 scaleSoftClip(vec3 light) +{ + //soft clip effect: + light = 1. - clamp(light, vec3(0.), vec3(1.)); + light = 1. - pow(light, gamma.xxx); + + return light; +} + +vec4 texture2DMS(sampler2DMS tex, ivec2 tc) +{ + vec4 ret = vec4(0,0,0,0); + + for (int i = 0; i < samples; ++i) + { + ret += texelFetch(tex,tc,i); + } + + return ret/samples; +} + +void main() +{ + vec2 tc = vary_fragcoord.xy; + ivec2 itc = ivec2(tc); + + vec3 fcol = vec3(0,0,0); + + for (int i = 0; i < samples; ++i) + { + float depth = texelFetch(depthMap, itc, i).r; + vec3 pos = getPosition_d(tc, depth).xyz; + vec3 norm = texelFetch(normalMap, itc, i).xyz; + + norm = vec3((norm.xy-0.5)*2.0,norm.z); // unpack norm + //vec3 nz = texture2D(noiseMap, vary_fragcoord.xy/128.0).xyz; + + float da = max(dot(norm.xyz, vary_light.xyz), 0.0); + + vec4 diffuse = texelFetch(diffuseRect, itc, i); + if (diffuse.a >= 1.0) + { + fcol += diffuse.rgb; + } + else + { + vec4 spec = texelFetch(specularRect, itc, i); + + calcAtmospherics(pos.xyz, 1.0); + + vec3 col = atmosAmbient(vec3(0)); + col += atmosAffectDirectionalLight(max(min(da, 1.0), diffuse.a)); + + col *= diffuse.rgb; + + if (spec.a > 0.0) // specular reflection + { + // the old infinite-sky shiny reflection + // + vec3 refnormpersp = normalize(reflect(pos.xyz, norm.xyz)); + float sa = dot(refnormpersp, vary_light.xyz); + vec3 dumbshiny = vary_SunlitColor*texture2D(lightFunc, vec2(sa, spec.a)).a; + + // add the two types of shiny together + col += dumbshiny * spec.rgb; + } + + col = atmosLighting(col); + col = scaleSoftClip(col); + fcol += col; + } + } + + gl_FragColor.rgb = fcol.rgb/samples; + gl_FragColor.a = 0.0; +} diff --git a/indra/newview/app_settings/shaders/class1/deferred/softenLightV.glsl b/indra/newview/app_settings/shaders/class1/deferred/softenLightV.glsl index 8f0bcca76b86a22f32101d0c81b3631110fff0c9..745cc0199236aeff1ade125a59f78bd48b15d382 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/softenLightV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/softenLightV.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + uniform vec2 screen_res; diff --git a/indra/newview/app_settings/shaders/class1/deferred/spotLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/spotLightF.glsl index 29fac46bfe2dc022fb812455d3d7b072a9155c4d..9aaffc15bf3acbeb7ba94cd120d819742a00ce83 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/spotLightF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/spotLightF.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + #extension GL_ARB_texture_rectangle : enable diff --git a/indra/newview/app_settings/shaders/class1/deferred/spotLightMSF.glsl b/indra/newview/app_settings/shaders/class1/deferred/spotLightMSF.glsl new file mode 100644 index 0000000000000000000000000000000000000000..4bb9bad2751bfc9c1da2352464aef5ba92c93245 --- /dev/null +++ b/indra/newview/app_settings/shaders/class1/deferred/spotLightMSF.glsl @@ -0,0 +1,234 @@ +/** + * @file multiSpotLightF.glsl + * + * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * $/LicenseInfo$ + */ + + + +//class 1 -- no shadows + +#extension GL_ARB_texture_rectangle : enable +#extension GL_ARB_texture_multisample : enable + +uniform sampler2DMS diffuseRect; +uniform sampler2DMS specularRect; +uniform sampler2DMS depthMap; +uniform sampler2DMS normalMap; +uniform sampler2D noiseMap; +uniform sampler2D lightFunc; +uniform sampler2D projectionMap; + +uniform mat4 proj_mat; //screen space to light space +uniform float proj_near; //near clip for projection +uniform vec3 proj_p; //plane projection is emitting from (in screen space) +uniform vec3 proj_n; +uniform float proj_focus; //distance from plane to begin blurring +uniform float proj_lod; //(number of mips in proj map) +uniform float proj_range; //range between near clip and far clip plane of projection +uniform float proj_ambient_lod; +uniform float proj_ambiance; +uniform float near_clip; +uniform float far_clip; + +uniform vec3 proj_origin; //origin of projection to be used for angular attenuation +uniform float sun_wash; +uniform int proj_shadow_idx; +uniform float shadow_fade; + +varying vec4 vary_light; + +varying vec4 vary_fragcoord; +uniform vec2 screen_res; + +uniform mat4 inv_proj; + +vec4 texture2DLodSpecular(sampler2D projectionMap, vec2 tc, float lod) +{ + vec4 ret = texture2DLod(projectionMap, tc, lod); + + vec2 dist = tc-vec2(0.5); + + float det = max(1.0-lod/(proj_lod*0.5), 0.0); + + float d = dot(dist,dist); + + ret *= min(clamp((0.25-d)/0.25, 0.0, 1.0)+det, 1.0); + + return ret; +} + +vec4 texture2DLodDiffuse(sampler2D projectionMap, vec2 tc, float lod) +{ + vec4 ret = texture2DLod(projectionMap, tc, lod); + + vec2 dist = vec2(0.5) - abs(tc-vec2(0.5)); + + float det = min(lod/(proj_lod*0.5), 1.0); + + float d = min(dist.x, dist.y); + + float edge = 0.25*det; + + ret *= clamp(d/edge, 0.0, 1.0); + + return ret; +} + +vec4 texture2DLodAmbient(sampler2D projectionMap, vec2 tc, float lod) +{ + vec4 ret = texture2DLod(projectionMap, tc, lod); + + vec2 dist = tc-vec2(0.5); + + float d = dot(dist,dist); + + ret *= min(clamp((0.25-d)/0.25, 0.0, 1.0), 1.0); + + return ret; +} + + +vec4 getPosition(ivec2 pos_screen, int sample) +{ + float depth = texelFetch(depthMap, pos_screen, sample).r; + vec2 sc = vec2(pos_screen.xy)*2.0; + sc /= screen_res; + sc -= vec2(1.0,1.0); + vec4 ndc = vec4(sc.x, sc.y, 2.0*depth-1.0, 1.0); + vec4 pos = inv_proj * ndc; + pos /= pos.w; + pos.w = 1.0; + return pos; +} + +void main() +{ + vec4 frag = vary_fragcoord; + frag.xyz /= frag.w; + frag.xyz = frag.xyz*0.5+0.5; + frag.xy *= screen_res; + ivec2 itc = ivec2(frag.xy); + + vec3 fcol = vec3(0,0,0); + int wght = 0; + + for (int i = 0; i < samples; ++i) + { + vec3 pos = getPosition(itc, i).xyz; + vec3 lv = vary_light.xyz-pos.xyz; + float dist2 = dot(lv,lv); + dist2 /= vary_light.w; + if (dist2 <= 1.0) + { + vec3 norm = texelFetch(normalMap, itc, i).xyz*2.0-1.0; + + norm = normalize(norm); + float l_dist = -dot(lv, proj_n); + + vec4 proj_tc = (proj_mat * vec4(pos.xyz, 1.0)); + if (proj_tc.z >= 0.0) + { + proj_tc.xyz /= proj_tc.w; + + float fa = gl_Color.a+1.0; + float dist_atten = min(1.0-(dist2-1.0*(1.0-fa))/fa, 1.0); + if (dist_atten > 0.0) + { + lv = proj_origin-pos.xyz; + lv = normalize(lv); + float da = dot(norm, lv); + + vec3 col = vec3(0,0,0); + + vec3 diff_tex = texelFetch(diffuseRect, itc, i).rgb; + + float noise = texture2D(noiseMap, frag.xy/128.0).b; + if (proj_tc.z > 0.0 && + proj_tc.x < 1.0 && + proj_tc.y < 1.0 && + proj_tc.x > 0.0 && + proj_tc.y > 0.0) + { + float lit = 0.0; + float amb_da = proj_ambiance; + + if (da > 0.0) + { + float diff = clamp((l_dist-proj_focus)/proj_range, 0.0, 1.0); + float lod = diff * proj_lod; + + vec4 plcol = texture2DLodDiffuse(projectionMap, proj_tc.xy, lod); + + vec3 lcol = gl_Color.rgb * plcol.rgb * plcol.a; + + lit = da * dist_atten * noise; + + col = lcol*lit*diff_tex; + amb_da += (da*0.5)*proj_ambiance; + } + + //float diff = clamp((proj_range-proj_focus)/proj_range, 0.0, 1.0); + vec4 amb_plcol = texture2DLodAmbient(projectionMap, proj_tc.xy, proj_lod); + + amb_da += (da*da*0.5+0.5)*proj_ambiance; + + amb_da *= dist_atten * noise; + + amb_da = min(amb_da, 1.0-lit); + + col += amb_da*gl_Color.rgb*diff_tex.rgb*amb_plcol.rgb*amb_plcol.a; + } + + + vec4 spec = texelFetch(specularRect, itc, i); + if (spec.a > 0.0) + { + vec3 ref = reflect(normalize(pos), norm); + + //project from point pos in direction ref to plane proj_p, proj_n + vec3 pdelta = proj_p-pos; + float ds = dot(ref, proj_n); + + if (ds < 0.0) + { + vec3 pfinal = pos + ref * dot(pdelta, proj_n)/ds; + + vec4 stc = (proj_mat * vec4(pfinal.xyz, 1.0)); + + if (stc.z > 0.0) + { + stc.xy /= stc.w; + + float fatten = clamp(spec.a*spec.a+spec.a*0.5, 0.25, 1.0); + + stc.xy = (stc.xy - vec2(0.5)) * fatten + vec2(0.5); + + if (stc.x < 1.0 && + stc.y < 1.0 && + stc.x > 0.0 && + stc.y > 0.0) + { + vec4 scol = texture2DLodSpecular(projectionMap, stc.xy, proj_lod-spec.a*proj_lod); + col += dist_atten*scol.rgb*gl_Color.rgb*scol.a*spec.rgb; + } + } + } + } + + fcol += col; + ++wght; + } + } + } + } + + if (wght <= 0) + { + discard; + } + + gl_FragColor.rgb = fcol/samples; + gl_FragColor.a = 0.0; +} diff --git a/indra/newview/app_settings/shaders/class1/deferred/starsF.glsl b/indra/newview/app_settings/shaders/class1/deferred/starsF.glsl new file mode 100644 index 0000000000000000000000000000000000000000..2cf7d194cc7926a2f6a2de96a6b1ccb5367733af --- /dev/null +++ b/indra/newview/app_settings/shaders/class1/deferred/starsF.glsl @@ -0,0 +1,19 @@ +/** + * @file starsF.glsl + * + * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * $/LicenseInfo$ + */ + + + +uniform sampler2D diffuseMap; + +void main() +{ + vec4 col = gl_Color * texture2D(diffuseMap, gl_TexCoord[0].xy); + + gl_FragData[0] = col; + gl_FragData[1] = vec4(0,0,0,0); + gl_FragData[2] = vec4(0,0,1,0); +} diff --git a/indra/newview/app_settings/shaders/class1/deferred/starsV.glsl b/indra/newview/app_settings/shaders/class1/deferred/starsV.glsl new file mode 100644 index 0000000000000000000000000000000000000000..c43125dad9c4ccc76d324eca14e4572e405fce20 --- /dev/null +++ b/indra/newview/app_settings/shaders/class1/deferred/starsV.glsl @@ -0,0 +1,17 @@ +/** + * @file starsV.glsl + * + * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * $/LicenseInfo$ + */ + + + + +void main() +{ + //transform vertex + gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; + gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0; + gl_FrontColor = gl_Color; +} diff --git a/indra/newview/app_settings/shaders/class1/deferred/sunLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/sunLightF.glsl index 00093836a25472d9a1fa6ee545d04451d37c6e73..f20886565a196be01bbc88e5b2fedbbc4eb42a87 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/sunLightF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/sunLightF.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + //class 1, no shadow, no SSAO, should never be called diff --git a/indra/newview/app_settings/shaders/class1/deferred/sunLightMSF.glsl b/indra/newview/app_settings/shaders/class1/deferred/sunLightMSF.glsl new file mode 100644 index 0000000000000000000000000000000000000000..f20886565a196be01bbc88e5b2fedbbc4eb42a87 --- /dev/null +++ b/indra/newview/app_settings/shaders/class1/deferred/sunLightMSF.glsl @@ -0,0 +1,17 @@ +/** + * @file sunLightF.glsl + * + * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * $/LicenseInfo$ + */ + + + +//class 1, no shadow, no SSAO, should never be called + +#extension GL_ARB_texture_rectangle : enable + +void main() +{ + gl_FragColor = vec4(0,0,0,0); +} diff --git a/indra/newview/app_settings/shaders/class1/deferred/sunLightSSAOF.glsl b/indra/newview/app_settings/shaders/class1/deferred/sunLightSSAOF.glsl index cd91351ad411e91b425f478e65f6123f583ea01b..665d8126a07683c7aa4c156a99341ead53a930b7 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/sunLightSSAOF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/sunLightSSAOF.glsl @@ -5,7 +5,7 @@ * $License$ */ -#version 120 + #extension GL_ARB_texture_rectangle : enable @@ -35,7 +35,7 @@ uniform float shadow_offset; vec4 getPosition(vec2 pos_screen) { - float depth = texture2DRect(depthMap, pos_screen.xy).a; + float depth = texture2DRect(depthMap, pos_screen.xy).r; vec2 sc = pos_screen.xy*2.0; sc /= screen_res; sc -= vec2(1.0,1.0); diff --git a/indra/newview/app_settings/shaders/class1/deferred/sunLightSSAOMSF.glsl b/indra/newview/app_settings/shaders/class1/deferred/sunLightSSAOMSF.glsl new file mode 100644 index 0000000000000000000000000000000000000000..32d1b2149a4ce5a1ef002592c4b4c7fda38f9d6d --- /dev/null +++ b/indra/newview/app_settings/shaders/class1/deferred/sunLightSSAOMSF.glsl @@ -0,0 +1,123 @@ +/** + * @file sunLightSSAOF.glsl + * + * Copyright (c) 2007-$CurrentYear$, Linden Research, Inc. + * $License$ + */ + + + +#extension GL_ARB_texture_rectangle : enable +#extension GL_ARB_texture_multisample : enable + +//class 1 -- no shadow, SSAO only + +uniform sampler2DMS depthMap; +uniform sampler2DMS normalMap; +uniform sampler2D noiseMap; + + +// Inputs +uniform mat4 shadow_matrix[6]; +uniform vec4 shadow_clip; +uniform float ssao_radius; +uniform float ssao_max_radius; +uniform float ssao_factor; +uniform float ssao_factor_inv; + +varying vec2 vary_fragcoord; +varying vec4 vary_light; + +uniform mat4 inv_proj; +uniform vec2 screen_res; + +uniform float shadow_bias; +uniform float shadow_offset; + +vec4 getPosition(ivec2 pos_screen, int sample) +{ + float depth = texelFetch(depthMap, pos_screen, sample).r; + vec2 sc = pos_screen.xy*2.0; + sc /= screen_res; + sc -= vec2(1.0,1.0); + vec4 ndc = vec4(sc.x, sc.y, 2.0*depth-1.0, 1.0); + vec4 pos = inv_proj * ndc; + pos /= pos.w; + pos.w = 1.0; + return pos; +} + +//calculate decreases in ambient lighting when crowded out (SSAO) +float calcAmbientOcclusion(vec4 pos, vec3 norm, int sample) +{ + float ret = 1.0; + + vec2 kern[8]; + // exponentially (^2) distant occlusion samples spread around origin + kern[0] = vec2(-1.0, 0.0) * 0.125*0.125; + kern[1] = vec2(1.0, 0.0) * 0.250*0.250; + kern[2] = vec2(0.0, 1.0) * 0.375*0.375; + kern[3] = vec2(0.0, -1.0) * 0.500*0.500; + kern[4] = vec2(0.7071, 0.7071) * 0.625*0.625; + kern[5] = vec2(-0.7071, -0.7071) * 0.750*0.750; + kern[6] = vec2(-0.7071, 0.7071) * 0.875*0.875; + kern[7] = vec2(0.7071, -0.7071) * 1.000*1.000; + + vec2 pos_screen = vary_fragcoord.xy; + vec3 pos_world = pos.xyz; + vec2 noise_reflect = texture2D(noiseMap, vary_fragcoord.xy/128.0).xy; + + float angle_hidden = 0.0; + int points = 0; + + float scale = min(ssao_radius / -pos_world.z, ssao_max_radius); + + // it was found that keeping # of samples a constant was the fastest, probably due to compiler optimizations unrolling?) + for (int i = 0; i < 8; i++) + { + ivec2 samppos_screen = ivec2(pos_screen + scale * reflect(kern[i], noise_reflect)); + vec3 samppos_world = getPosition(samppos_screen, sample).xyz; + + vec3 diff = pos_world - samppos_world; + float dist2 = dot(diff, diff); + + // assume each sample corresponds to an occluding sphere with constant radius, constant x-sectional area + // --> solid angle shrinking by the square of distance + //radius is somewhat arbitrary, can approx with just some constant k * 1 / dist^2 + //(k should vary inversely with # of samples, but this is taken care of later) + + angle_hidden = angle_hidden + float(dot((samppos_world - 0.05*norm - pos_world), norm) > 0.0) * min(1.0/dist2, ssao_factor_inv); + + // 'blocked' samples (significantly closer to camera relative to pos_world) are "no data", not "no occlusion" + points = points + int(diff.z > -1.0); + } + + angle_hidden = min(ssao_factor*angle_hidden/float(points), 1.0); + + ret = (1.0 - (float(points != 0) * angle_hidden)); + + return min(ret, 1.0); +} + +void main() +{ + vec2 pos_screen = vary_fragcoord.xy; + ivec2 itc = ivec2(pos_screen); + + float col = 0; + + for (int i = 0; i < samples; i++) + { + vec4 pos = getPosition(itc, i); + vec3 norm = texelFetch(normalMap, itc, i).xyz; + norm = vec3((norm.xy-0.5)*2.0,norm.z); // unpack norm + col += calcAmbientOcclusion(pos,norm,i); + } + + col /= samples; + + gl_FragColor[0] = 1.0; + gl_FragColor[1] = col; + gl_FragColor[2] = 1.0; + gl_FragColor[3] = 1.0; +} diff --git a/indra/newview/app_settings/shaders/class1/deferred/sunLightV.glsl b/indra/newview/app_settings/shaders/class1/deferred/sunLightV.glsl index 9beb513ad8a63a129b231381cb010e69c58b9510..814deb3677ab6489c305175878b9b905911996b5 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/sunLightV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/sunLightV.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + varying vec4 vary_light; varying vec2 vary_fragcoord; diff --git a/indra/newview/app_settings/shaders/class1/deferred/terrainF.glsl b/indra/newview/app_settings/shaders/class1/deferred/terrainF.glsl index 0edae4791826e05939f027c54e6e2d64f05b6a7f..d005f67bf6c96c22f7d32b6a06e64a1fba0fca25 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/terrainF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/terrainF.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + uniform sampler2D detail_0; uniform sampler2D detail_1; diff --git a/indra/newview/app_settings/shaders/class1/deferred/terrainV.glsl b/indra/newview/app_settings/shaders/class1/deferred/terrainV.glsl index a6163063bebecc5c23d812122b66c7b6b7ef52e8..3038fd296681900d004e67754beadfc18eeaccfd 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/terrainV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/terrainV.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + varying vec3 vary_normal; diff --git a/indra/newview/app_settings/shaders/class1/deferred/treeF.glsl b/indra/newview/app_settings/shaders/class1/deferred/treeF.glsl index c54d9a1e3e80dcf0bc9ba20d70c92b346d4fa3dc..de7e038402235d2a6044aa200d102923b210ed78 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/treeF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/treeF.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + uniform sampler2D diffuseMap; diff --git a/indra/newview/app_settings/shaders/class1/deferred/treeV.glsl b/indra/newview/app_settings/shaders/class1/deferred/treeV.glsl index 29689ecbafea503e78ef8c2413ed027c1e357885..a9bef4292de33cf182268663562bd8372d587cdd 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/treeV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/treeV.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + varying vec3 vary_normal; diff --git a/indra/newview/app_settings/shaders/class1/deferred/waterF.glsl b/indra/newview/app_settings/shaders/class1/deferred/waterF.glsl index e76f598d09de4cd973e867dd439901954cc4475b..2710422d32bad10dd52eb1e52263886dd534af84 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/waterF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/waterF.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + #extension GL_ARB_texture_rectangle : enable diff --git a/indra/newview/app_settings/shaders/class1/deferred/waterV.glsl b/indra/newview/app_settings/shaders/class1/deferred/waterV.glsl index 649e3926300d27cf2a547230910f5a8dfba0c172..5397290b116b76b017854c3c37c84658a6931c90 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/waterV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/waterV.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + void calcAtmospherics(vec3 inPositionEye); diff --git a/indra/newview/app_settings/shaders/class1/effects/glowExtractF.glsl b/indra/newview/app_settings/shaders/class1/effects/glowExtractF.glsl index f2023fa5ea1a76d510ffdaaa19e70acfa63078e8..32f5f5f236043bd6f40fb5cff98d7b1a0de5dabd 100644 --- a/indra/newview/app_settings/shaders/class1/effects/glowExtractF.glsl +++ b/indra/newview/app_settings/shaders/class1/effects/glowExtractF.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + #extension GL_ARB_texture_rectangle : enable diff --git a/indra/newview/app_settings/shaders/class1/effects/glowExtractMSF.glsl b/indra/newview/app_settings/shaders/class1/effects/glowExtractMSF.glsl new file mode 100644 index 0000000000000000000000000000000000000000..9267a8585dadcc7ea88ea753dad066da2cd8a905 --- /dev/null +++ b/indra/newview/app_settings/shaders/class1/effects/glowExtractMSF.glsl @@ -0,0 +1,38 @@ +/** + * @file glowExtractF.glsl + * + * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * $/LicenseInfo$ + */ + + + +#extension GL_ARB_texture_rectangle : enable +#extension GL_ARB_texture_multisample : enable + +uniform sampler2DMS diffuseMap; +uniform float minLuminance; +uniform float maxExtractAlpha; +uniform vec3 lumWeights; +uniform vec3 warmthWeights; +uniform float warmthAmount; + +void main() +{ + ivec2 itc = ivec2(gl_TexCoord[0].xy); + vec4 fcol = vec4(0,0,0,0); + + for (int i = 0; i < samples; i++) + { + vec4 col = texelFetch(diffuseMap, itc, i); + + /// CALCULATING LUMINANCE (Using NTSC lum weights) + /// http://en.wikipedia.org/wiki/Luma_%28video%29 + float lum = smoothstep(minLuminance, minLuminance+1.0, dot(col.rgb, lumWeights ) ); + float warmth = smoothstep(minLuminance, minLuminance+1.0, max(col.r * warmthWeights.r, max(col.g * warmthWeights.g, col.b * warmthWeights.b)) ); + + fcol += vec4(col.rgb, max(col.a, mix(lum, warmth, warmthAmount) * maxExtractAlpha)); + } + + gl_FragColor = fcol/samples; +} diff --git a/indra/newview/app_settings/shaders/class1/effects/glowExtractV.glsl b/indra/newview/app_settings/shaders/class1/effects/glowExtractV.glsl index 0ca0608b45aefebae7f54ce1016af2ead16223a5..76736fed53be470fc93969babe3cdc41516474d6 100644 --- a/indra/newview/app_settings/shaders/class1/effects/glowExtractV.glsl +++ b/indra/newview/app_settings/shaders/class1/effects/glowExtractV.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + void main() { diff --git a/indra/newview/app_settings/shaders/class1/effects/glowF.glsl b/indra/newview/app_settings/shaders/class1/effects/glowF.glsl index 65fc2e9f99bc9b3bc9036c3658dfb93a51498467..d3225546b3041d2d5a7e68f2c417e06af37c17f0 100644 --- a/indra/newview/app_settings/shaders/class1/effects/glowF.glsl +++ b/indra/newview/app_settings/shaders/class1/effects/glowF.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + uniform sampler2D diffuseMap; uniform float glowStrength; diff --git a/indra/newview/app_settings/shaders/class1/effects/glowV.glsl b/indra/newview/app_settings/shaders/class1/effects/glowV.glsl index 0bd44cec903643cb7715b843524663886912e073..9bb41626ae6183ab6d1cd524697151cae7101d82 100644 --- a/indra/newview/app_settings/shaders/class1/effects/glowV.glsl +++ b/indra/newview/app_settings/shaders/class1/effects/glowV.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + uniform vec2 glowDelta; diff --git a/indra/newview/app_settings/shaders/class1/environment/terrainF.glsl b/indra/newview/app_settings/shaders/class1/environment/terrainF.glsl index ac00f15b35b830f63cf6f11975994f261a08461d..cdc2ca3da2f832b2ef53666ef442f5febd7f27cd 100644 --- a/indra/newview/app_settings/shaders/class1/environment/terrainF.glsl +++ b/indra/newview/app_settings/shaders/class1/environment/terrainF.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + uniform sampler2D detail0; uniform sampler2D detail1; diff --git a/indra/newview/app_settings/shaders/class1/environment/terrainV.glsl b/indra/newview/app_settings/shaders/class1/environment/terrainV.glsl index 1e19ee7699f4e97fa046b6092ea1e700f582b53b..8af981915bceea719f62cda3153a9ae3368befbf 100644 --- a/indra/newview/app_settings/shaders/class1/environment/terrainV.glsl +++ b/indra/newview/app_settings/shaders/class1/environment/terrainV.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + vec4 calcLighting(vec3 pos, vec3 norm, vec4 color, vec4 baseCol); diff --git a/indra/newview/app_settings/shaders/class1/environment/terrainWaterF.glsl b/indra/newview/app_settings/shaders/class1/environment/terrainWaterF.glsl index 34f78565a5c3746d5de909709da4b918249d46a3..d94d986581bbbbb8044e0e8391cfc72ac95deed8 100644 --- a/indra/newview/app_settings/shaders/class1/environment/terrainWaterF.glsl +++ b/indra/newview/app_settings/shaders/class1/environment/terrainWaterF.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + // this class1 shader is just a copy of terrainF diff --git a/indra/newview/app_settings/shaders/class1/environment/underWaterF.glsl b/indra/newview/app_settings/shaders/class1/environment/underWaterF.glsl index 0dfac84a6e1928590de0cb72dc218f877c8ebb7f..06854fcc0a0a874d1e4aafed94697b07242d3a63 100644 --- a/indra/newview/app_settings/shaders/class1/environment/underWaterF.glsl +++ b/indra/newview/app_settings/shaders/class1/environment/underWaterF.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + uniform sampler2D diffuseMap; uniform sampler2D bumpMap; diff --git a/indra/newview/app_settings/shaders/class1/environment/waterF.glsl b/indra/newview/app_settings/shaders/class1/environment/waterF.glsl index 4e9c09b1ea7a6dcf13fe07d22e24bb4311329dd5..0f24e3c35afff6d019ce8b1f425d02c40027aae1 100644 --- a/indra/newview/app_settings/shaders/class1/environment/waterF.glsl +++ b/indra/newview/app_settings/shaders/class1/environment/waterF.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + vec3 scaleSoftClip(vec3 inColor); vec3 atmosTransport(vec3 inColor); diff --git a/indra/newview/app_settings/shaders/class1/environment/waterFogF.glsl b/indra/newview/app_settings/shaders/class1/environment/waterFogF.glsl index a34cf23790d5bf57abdfa2c1ecaa64cc5d1ee8be..630459b3245b1880d44d48e6d924c5d05ebd9f7b 100644 --- a/indra/newview/app_settings/shaders/class1/environment/waterFogF.glsl +++ b/indra/newview/app_settings/shaders/class1/environment/waterFogF.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + vec4 applyWaterFog(vec4 color) { diff --git a/indra/newview/app_settings/shaders/class1/environment/waterV.glsl b/indra/newview/app_settings/shaders/class1/environment/waterV.glsl index 161c794c68f7883207ae8227d43179e21b28ce8f..831d6a761c75dec5b9fbfb2072adac0e68a7320c 100644 --- a/indra/newview/app_settings/shaders/class1/environment/waterV.glsl +++ b/indra/newview/app_settings/shaders/class1/environment/waterV.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + void calcAtmospherics(vec3 inPositionEye); diff --git a/indra/newview/app_settings/shaders/class1/interface/highlightF.glsl b/indra/newview/app_settings/shaders/class1/interface/highlightF.glsl index 6f821f893d6faab36e2d78c2ce054574aee3c3a6..f6c6d945de38d72189664b29b34b4252cbac5d39 100644 --- a/indra/newview/app_settings/shaders/class1/interface/highlightF.glsl +++ b/indra/newview/app_settings/shaders/class1/interface/highlightF.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + uniform sampler2D diffuseMap; diff --git a/indra/newview/app_settings/shaders/class1/interface/highlightV.glsl b/indra/newview/app_settings/shaders/class1/interface/highlightV.glsl index d1c98bf70cbfc39b54e6e28e96e266de3828a4a0..f114f766bf66bb82d9d959ea9718dc4f21250aeb 100644 --- a/indra/newview/app_settings/shaders/class1/interface/highlightV.glsl +++ b/indra/newview/app_settings/shaders/class1/interface/highlightV.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + void main() { diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightF.glsl index 9c59e8c3ad719d3f9d298c849354098b0b1d619d..1796730c923d907aac4a9ac14eb1ca43f1ab6057 100644 --- a/indra/newview/app_settings/shaders/class1/lighting/lightF.glsl +++ b/indra/newview/app_settings/shaders/class1/lighting/lightF.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + uniform sampler2D diffuseMap; diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightF.glsl index 1fee99c446f214a9237d1225b86cd5906613a46f..bfe0be9fdf5c29f97aaa5852e96ac12f35e89d40 100644 --- a/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightF.glsl +++ b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightF.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + uniform sampler2D diffuseMap; diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightShinyF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightShinyF.glsl index fb5da21c72227b8ce91e757fa23a39d6904d1a61..6f1fe9100707f7a4af9e019ce57d1826f2e207be 100644 --- a/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightShinyF.glsl +++ b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightShinyF.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + uniform sampler2D diffuseMap; diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightShinyWaterF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightShinyWaterF.glsl index 1bdaccf9b8f2598666b19a1780626949ea71cf2b..19072cd052198bcd76719ea233279a6bf18db0e3 100644 --- a/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightShinyWaterF.glsl +++ b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightShinyWaterF.glsl @@ -6,7 +6,7 @@ */ -#version 120 + uniform sampler2D diffuseMap; uniform samplerCube environmentMap; diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightWaterF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightWaterF.glsl index 2e94d3bbf1955bea23c80c08691f7de8af140150..0ae6dc89e25a4c5ecb4bdcb557f1651b4717a4eb 100644 --- a/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightWaterF.glsl +++ b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightWaterF.glsl @@ -6,7 +6,7 @@ */ -#version 120 + uniform sampler2D diffuseMap; diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightFuncSpecularV.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightFuncSpecularV.glsl index 714f9a2551005f78c2a88bdd869b8163299236f8..5d4bf2c33e8a0095007f818ac719078df14a8e0d 100644 --- a/indra/newview/app_settings/shaders/class1/lighting/lightFuncSpecularV.glsl +++ b/indra/newview/app_settings/shaders/class1/lighting/lightFuncSpecularV.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + float calcDirectionalLight(vec3 n, vec3 l) { diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightFuncV.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightFuncV.glsl index 65b45f80818c376fe9d8ca1fd16fb73a1189e327..574252af12f4464161ea4d16f3aeffb068a98a2d 100644 --- a/indra/newview/app_settings/shaders/class1/lighting/lightFuncV.glsl +++ b/indra/newview/app_settings/shaders/class1/lighting/lightFuncV.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + float calcDirectionalLight(vec3 n, vec3 l) diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightShinyF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightShinyF.glsl index 7f65ea76f71c156fbbfc3119e3f791c69b782bfe..29f575b7e5d29ceef8af80f2d35fca62c0a2074e 100644 --- a/indra/newview/app_settings/shaders/class1/lighting/lightShinyF.glsl +++ b/indra/newview/app_settings/shaders/class1/lighting/lightShinyF.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + uniform sampler2D diffuseMap; diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightShinyWaterF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightShinyWaterF.glsl index 8f13e6dc0447138b2d4cf8afa8008b07e3a91e0f..65da5a68255311dcb0184e7847e0d573ef76e09f 100644 --- a/indra/newview/app_settings/shaders/class1/lighting/lightShinyWaterF.glsl +++ b/indra/newview/app_settings/shaders/class1/lighting/lightShinyWaterF.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + uniform sampler2D diffuseMap; diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightSpecularV.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightSpecularV.glsl index 56f31f6a79b2f7c8ae0feb748178e31efd771caf..d491f1102ea7cec45fe88cf74987c765e1d7ac34 100644 --- a/indra/newview/app_settings/shaders/class1/lighting/lightSpecularV.glsl +++ b/indra/newview/app_settings/shaders/class1/lighting/lightSpecularV.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + float calcDirectionalLight(vec3 n, vec3 l); diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightV.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightV.glsl index 64d549ff5299d898a385ec6c6062227a65c38f38..ef38ee9699faca4b47b5d8615b7e3256f78e52af 100644 --- a/indra/newview/app_settings/shaders/class1/lighting/lightV.glsl +++ b/indra/newview/app_settings/shaders/class1/lighting/lightV.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + float calcDirectionalLight(vec3 n, vec3 l); diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightWaterF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightWaterF.glsl index c5d084c1323509ced287ea0bae5a2e4ce8f782da..286c92326b965074212497634f35524fa4f021e7 100644 --- a/indra/newview/app_settings/shaders/class1/lighting/lightWaterF.glsl +++ b/indra/newview/app_settings/shaders/class1/lighting/lightWaterF.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + uniform sampler2D diffuseMap; diff --git a/indra/newview/app_settings/shaders/class1/lighting/sumLightsSpecularV.glsl b/indra/newview/app_settings/shaders/class1/lighting/sumLightsSpecularV.glsl index 732d2464719fa82dee191028f128d9668297f8bd..772a420e33335fd683ab053e8b59c3dac092fd50 100644 --- a/indra/newview/app_settings/shaders/class1/lighting/sumLightsSpecularV.glsl +++ b/indra/newview/app_settings/shaders/class1/lighting/sumLightsSpecularV.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + float calcDirectionalLightSpecular(inout vec4 specular, vec3 view, vec3 n, vec3 l, vec3 lightCol, float da); vec3 atmosAmbient(vec3 light); diff --git a/indra/newview/app_settings/shaders/class1/lighting/sumLightsV.glsl b/indra/newview/app_settings/shaders/class1/lighting/sumLightsV.glsl index 73e1a1ec26eaa41c3b1adfbd625b23707e0fced5..da60a3ddf51e3cde2d691ba0d55442b483a4acc4 100644 --- a/indra/newview/app_settings/shaders/class1/lighting/sumLightsV.glsl +++ b/indra/newview/app_settings/shaders/class1/lighting/sumLightsV.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + float calcDirectionalLight(vec3 n, vec3 l); diff --git a/indra/newview/app_settings/shaders/class1/objects/fullbrightF.glsl b/indra/newview/app_settings/shaders/class1/objects/fullbrightF.glsl index afc3dc89bf457484f050ff0771bedc3af5a202a7..c0b72115dd08974aa5dd550712255ac3bf5317ae 100644 --- a/indra/newview/app_settings/shaders/class1/objects/fullbrightF.glsl +++ b/indra/newview/app_settings/shaders/class1/objects/fullbrightF.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + void fullbright_lighting(); diff --git a/indra/newview/app_settings/shaders/class1/objects/fullbrightShinyF.glsl b/indra/newview/app_settings/shaders/class1/objects/fullbrightShinyF.glsl index 3dc4294f6781d11bf7a86ead0232a3a2430b0451..391c06edc87bd6d4a77d0c2d866d2f8f8def21d1 100644 --- a/indra/newview/app_settings/shaders/class1/objects/fullbrightShinyF.glsl +++ b/indra/newview/app_settings/shaders/class1/objects/fullbrightShinyF.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + void fullbright_shiny_lighting(); diff --git a/indra/newview/app_settings/shaders/class1/objects/fullbrightShinySkinnedV.glsl b/indra/newview/app_settings/shaders/class1/objects/fullbrightShinySkinnedV.glsl index f0baeeeee58c787e65ec53f65d4cd4ffe4fb0de1..f44a5ce32e5ab4760f27269a464b65a7ee5f9121 100644 --- a/indra/newview/app_settings/shaders/class1/objects/fullbrightShinySkinnedV.glsl +++ b/indra/newview/app_settings/shaders/class1/objects/fullbrightShinySkinnedV.glsl @@ -5,7 +5,7 @@ * $License$ */ -#version 120 + void calcAtmospherics(vec3 inPositionEye); mat4 getObjectSkinnedTransform(); diff --git a/indra/newview/app_settings/shaders/class1/objects/fullbrightShinyV.glsl b/indra/newview/app_settings/shaders/class1/objects/fullbrightShinyV.glsl index 02367b94393739692337d0740827c8246924ee80..31e0f0a429a6eb300b53ebb5d5c5416aa10d6638 100644 --- a/indra/newview/app_settings/shaders/class1/objects/fullbrightShinyV.glsl +++ b/indra/newview/app_settings/shaders/class1/objects/fullbrightShinyV.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + void calcAtmospherics(vec3 inPositionEye); diff --git a/indra/newview/app_settings/shaders/class1/objects/fullbrightShinyWaterF.glsl b/indra/newview/app_settings/shaders/class1/objects/fullbrightShinyWaterF.glsl index 5daf66fb3108400b3613858b3c2f2139f14f0acd..8ffb252f57a86bc452853ce800f0a65561999053 100644 --- a/indra/newview/app_settings/shaders/class1/objects/fullbrightShinyWaterF.glsl +++ b/indra/newview/app_settings/shaders/class1/objects/fullbrightShinyWaterF.glsl @@ -5,7 +5,7 @@ * $License$ */ -#version 120 + void fullbright_shiny_lighting_water(); diff --git a/indra/newview/app_settings/shaders/class1/objects/fullbrightSkinnedV.glsl b/indra/newview/app_settings/shaders/class1/objects/fullbrightSkinnedV.glsl index 02ff3cc2a96382d969bc020b3f87604cc9e462e7..e5dafa8c789e07ee9069ba1ae34ec30718888004 100644 --- a/indra/newview/app_settings/shaders/class1/objects/fullbrightSkinnedV.glsl +++ b/indra/newview/app_settings/shaders/class1/objects/fullbrightSkinnedV.glsl @@ -5,7 +5,7 @@ * $License$ */ -#version 120 + void calcAtmospherics(vec3 inPositionEye); mat4 getObjectSkinnedTransform(); diff --git a/indra/newview/app_settings/shaders/class1/objects/fullbrightV.glsl b/indra/newview/app_settings/shaders/class1/objects/fullbrightV.glsl index 38e07dbd80c545f3413f3ca3c5913ebd9a6bc040..3382384c995bf3a33792b19755b33115bd649895 100644 --- a/indra/newview/app_settings/shaders/class1/objects/fullbrightV.glsl +++ b/indra/newview/app_settings/shaders/class1/objects/fullbrightV.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + void calcAtmospherics(vec3 inPositionEye); diff --git a/indra/newview/app_settings/shaders/class1/objects/fullbrightWaterF.glsl b/indra/newview/app_settings/shaders/class1/objects/fullbrightWaterF.glsl index afaac4f69c524555118bb5029a45e8dcf914161e..220f26614f3259e6b173e6abf798018e7d5054b0 100644 --- a/indra/newview/app_settings/shaders/class1/objects/fullbrightWaterF.glsl +++ b/indra/newview/app_settings/shaders/class1/objects/fullbrightWaterF.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + void fullbright_lighting_water(); diff --git a/indra/newview/app_settings/shaders/class1/objects/shinyF.glsl b/indra/newview/app_settings/shaders/class1/objects/shinyF.glsl index 2cf7a69baac7ae157088045d51fb6fe19bc886d1..d079de53773baac4981fa9e016c758c8b4bf0310 100644 --- a/indra/newview/app_settings/shaders/class1/objects/shinyF.glsl +++ b/indra/newview/app_settings/shaders/class1/objects/shinyF.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + void shiny_lighting(); diff --git a/indra/newview/app_settings/shaders/class1/objects/shinySimpleSkinnedV.glsl b/indra/newview/app_settings/shaders/class1/objects/shinySimpleSkinnedV.glsl index 4146646058de4abbfb34a057243967421f838f7b..cd655f3bb51cde3cf018f6cfa20cef2f5efa5416 100644 --- a/indra/newview/app_settings/shaders/class1/objects/shinySimpleSkinnedV.glsl +++ b/indra/newview/app_settings/shaders/class1/objects/shinySimpleSkinnedV.glsl @@ -5,7 +5,7 @@ * $License$ */ -#version 120 + vec4 calcLighting(vec3 pos, vec3 norm, vec4 color, vec4 baseCol); void calcAtmospherics(vec3 inPositionEye); diff --git a/indra/newview/app_settings/shaders/class1/objects/shinyV.glsl b/indra/newview/app_settings/shaders/class1/objects/shinyV.glsl index 6ea83b721defd91a9cf7cf46d665f5eed8ce517a..68a086dbc1a5da2c567e7e0ddc6fb63186858f21 100644 --- a/indra/newview/app_settings/shaders/class1/objects/shinyV.glsl +++ b/indra/newview/app_settings/shaders/class1/objects/shinyV.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + void calcAtmospherics(vec3 inPositionEye); diff --git a/indra/newview/app_settings/shaders/class1/objects/shinyWaterF.glsl b/indra/newview/app_settings/shaders/class1/objects/shinyWaterF.glsl index e3babe2210f6c10fcb7f5347448893d409cefb16..4649d1c47c10175c9fc26516bdda4edace36a91a 100644 --- a/indra/newview/app_settings/shaders/class1/objects/shinyWaterF.glsl +++ b/indra/newview/app_settings/shaders/class1/objects/shinyWaterF.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + void shiny_lighting_water(); diff --git a/indra/newview/app_settings/shaders/class1/objects/simpleF.glsl b/indra/newview/app_settings/shaders/class1/objects/simpleF.glsl index d449d37c0c7f499b1ccce65b25d0d39af2c20060..b4e4dcfbbf14fa7a59f49add2de3521a31a919ee 100644 --- a/indra/newview/app_settings/shaders/class1/objects/simpleF.glsl +++ b/indra/newview/app_settings/shaders/class1/objects/simpleF.glsl @@ -5,8 +5,6 @@ * $/LicenseInfo$ */ -#version 120 - void default_lighting(); void main() diff --git a/indra/newview/app_settings/shaders/class1/objects/simpleSkinnedV.glsl b/indra/newview/app_settings/shaders/class1/objects/simpleSkinnedV.glsl index be38a14d527c7eb5d588a6d3780e3dd3b4e14aab..900448035c44a78a29fde95f33dff7b05852efe8 100644 --- a/indra/newview/app_settings/shaders/class1/objects/simpleSkinnedV.glsl +++ b/indra/newview/app_settings/shaders/class1/objects/simpleSkinnedV.glsl @@ -5,7 +5,7 @@ * $License$ */ -#version 120 + vec4 calcLighting(vec3 pos, vec3 norm, vec4 color, vec4 baseCol); void calcAtmospherics(vec3 inPositionEye); diff --git a/indra/newview/app_settings/shaders/class1/objects/simpleV.glsl b/indra/newview/app_settings/shaders/class1/objects/simpleV.glsl index 0d8e14e2e38ee1f3eafd858b2db37a208680c227..b493f76fcc60ce17619dbb09a46fbde93e2fa63d 100644 --- a/indra/newview/app_settings/shaders/class1/objects/simpleV.glsl +++ b/indra/newview/app_settings/shaders/class1/objects/simpleV.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + vec4 calcLighting(vec3 pos, vec3 norm, vec4 color, vec4 baseCol); void calcAtmospherics(vec3 inPositionEye); diff --git a/indra/newview/app_settings/shaders/class1/objects/simpleWaterF.glsl b/indra/newview/app_settings/shaders/class1/objects/simpleWaterF.glsl index 68bd81e029328495ea7350222507de43257b9fdc..4ec5ee43b416d95b8937d398c2c3abfbc4ced9dd 100644 --- a/indra/newview/app_settings/shaders/class1/objects/simpleWaterF.glsl +++ b/indra/newview/app_settings/shaders/class1/objects/simpleWaterF.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + void default_lighting_water(); diff --git a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsF.glsl b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsF.glsl index f337bde32922bf4b183ec7a8288f10830c0f4d3a..3d05850ab3d0e3da1b5e99c3f5489cad3adcbf92 100644 --- a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsF.glsl +++ b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsF.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + vec3 atmosLighting(vec3 light) { diff --git a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsHelpersV.glsl b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsHelpersV.glsl index 4b402a70287c6fe1580983b0d39a599fbe783346..f1a0af21afe7315a6dc9175b35df48ab4b5c8410 100644 --- a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsHelpersV.glsl +++ b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsHelpersV.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + vec3 atmosAmbient(vec3 light) { diff --git a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsV.glsl b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsV.glsl index 20948b1e468d07d6a6bd402c09cdf9a5623cde59..73bbd57315af369b277d5303652540829935c5a2 100644 --- a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsV.glsl +++ b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsV.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + void setPositionEye(vec3 v); diff --git a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsVarsF.glsl b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsVarsF.glsl index 8a2c2a71862fb7402c313f95af0e03248262e8c4..e0eb7b37672e3c9dd242feb3195231ab3103568e 100644 --- a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsVarsF.glsl +++ b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsVarsF.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + varying vec3 vary_PositionEye; diff --git a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsVarsV.glsl b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsVarsV.glsl index a1dd4ed5fedefd11993c77b5fa129a1815093d98..a251213ff535eaa4121ec9926ebbb83387aefecb 100644 --- a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsVarsV.glsl +++ b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsVarsV.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + varying vec3 vary_PositionEye; diff --git a/indra/newview/app_settings/shaders/class1/windlight/gammaF.glsl b/indra/newview/app_settings/shaders/class1/windlight/gammaF.glsl index 7aed1fd3b5cd52c82194cc5b751d832e9259bb99..4958cb2f72a4ce2b421096e64f4f0e1facf8951c 100644 --- a/indra/newview/app_settings/shaders/class1/windlight/gammaF.glsl +++ b/indra/newview/app_settings/shaders/class1/windlight/gammaF.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + uniform vec4 gamma; diff --git a/indra/newview/app_settings/shaders/class1/windlight/transportF.glsl b/indra/newview/app_settings/shaders/class1/windlight/transportF.glsl index 6780dc4d3e1249c3eca244acc7e5fe4ced295851..75929bc6090ba10fc69e3f2765c70a946e7f6ac0 100644 --- a/indra/newview/app_settings/shaders/class1/windlight/transportF.glsl +++ b/indra/newview/app_settings/shaders/class1/windlight/transportF.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + vec3 atmosTransport(vec3 light) { diff --git a/indra/newview/app_settings/shaders/class2/avatar/eyeballV.glsl b/indra/newview/app_settings/shaders/class2/avatar/eyeballV.glsl index 172c2ca078ad4a7f5402a8b882d4f18877c23013..3e8b719f9392bc800651c762621924063e6392b9 100644 --- a/indra/newview/app_settings/shaders/class2/avatar/eyeballV.glsl +++ b/indra/newview/app_settings/shaders/class2/avatar/eyeballV.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + vec4 calcLightingSpecular(vec3 pos, vec3 norm, vec4 color, inout vec4 specularColor, vec4 baseCol); void calcAtmospherics(vec3 inPositionEye); diff --git a/indra/newview/app_settings/shaders/class2/deferred/alphaF.glsl b/indra/newview/app_settings/shaders/class2/deferred/alphaF.glsl index 6dfc1b952c1fc52bb82e8d690228c57d65d13457..681e52de2ab7ac45578dd229cf43c6e1f6a463aa 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/alphaF.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/alphaF.glsl @@ -5,11 +5,10 @@ * $/LicenseInfo$ */ -#version 120 + #extension GL_ARB_texture_rectangle : enable -uniform sampler2D diffuseMap; uniform sampler2DRectShadow shadowMap0; uniform sampler2DRectShadow shadowMap1; uniform sampler2DRectShadow shadowMap2; @@ -105,7 +104,7 @@ void main() } } - vec4 diff= texture2D(diffuseMap, gl_TexCoord[0].xy); + vec4 diff = diffuseLookup(gl_TexCoord[0].xy); vec4 col = vec4(vary_ambient + vary_directional.rgb*shadow, gl_Color.a); vec4 color = diff * col; diff --git a/indra/newview/app_settings/shaders/class2/deferred/alphaNonIndexedF.glsl b/indra/newview/app_settings/shaders/class2/deferred/alphaNonIndexedF.glsl new file mode 100644 index 0000000000000000000000000000000000000000..5350359f750676b104cc741f9b3ad00cd2c2f589 --- /dev/null +++ b/indra/newview/app_settings/shaders/class2/deferred/alphaNonIndexedF.glsl @@ -0,0 +1,125 @@ +/** + * @file alphaF.glsl + * + * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * $/LicenseInfo$ + */ + + + +#extension GL_ARB_texture_rectangle : enable + +uniform sampler2DRectShadow shadowMap0; +uniform sampler2DRectShadow shadowMap1; +uniform sampler2DRectShadow shadowMap2; +uniform sampler2DRectShadow shadowMap3; +uniform sampler2DRect depthMap; +uniform sampler2D diffuseMap; + +uniform mat4 shadow_matrix[6]; +uniform vec4 shadow_clip; +uniform vec2 screen_res; +uniform vec2 shadow_res; + +vec3 atmosLighting(vec3 light); +vec3 scaleSoftClip(vec3 light); + +varying vec3 vary_ambient; +varying vec3 vary_directional; +varying vec3 vary_fragcoord; +varying vec3 vary_position; +varying vec3 vary_pointlight_col; + +uniform float shadow_bias; + +uniform mat4 inv_proj; + +vec4 getPosition(vec2 pos_screen) +{ + float depth = texture2DRect(depthMap, pos_screen.xy).a; + vec2 sc = pos_screen.xy*2.0; + sc /= screen_res; + sc -= vec2(1.0,1.0); + vec4 ndc = vec4(sc.x, sc.y, 2.0*depth-1.0, 1.0); + vec4 pos = inv_proj * ndc; + pos.xyz /= pos.w; + pos.w = 1.0; + return pos; +} + +float pcfShadow(sampler2DRectShadow shadowMap, vec4 stc, float scl) +{ + stc.xyz /= stc.w; + stc.z += shadow_bias; + + float cs = shadow2DRect(shadowMap, stc.xyz).x; + float shadow = cs; + + shadow += max(shadow2DRect(shadowMap, stc.xyz+vec3(scl, scl, 0.0)).x, cs); + shadow += max(shadow2DRect(shadowMap, stc.xyz+vec3(scl, -scl, 0.0)).x, cs); + shadow += max(shadow2DRect(shadowMap, stc.xyz+vec3(-scl, scl, 0.0)).x, cs); + shadow += max(shadow2DRect(shadowMap, stc.xyz+vec3(-scl, -scl, 0.0)).x, cs); + + return shadow/5.0; +} + + +void main() +{ + vec2 frag = vary_fragcoord.xy/vary_fragcoord.z*0.5+0.5; + frag *= screen_res; + + float shadow = 1.0; + vec4 pos = vec4(vary_position, 1.0); + + vec4 spos = pos; + + if (spos.z > -shadow_clip.w) + { + vec4 lpos; + + if (spos.z < -shadow_clip.z) + { + lpos = shadow_matrix[3]*spos; + lpos.xy *= shadow_res; + shadow = pcfShadow(shadowMap3, lpos, 1.5); + shadow += max((pos.z+shadow_clip.z)/(shadow_clip.z-shadow_clip.w)*2.0-1.0, 0.0); + } + else if (spos.z < -shadow_clip.y) + { + lpos = shadow_matrix[2]*spos; + lpos.xy *= shadow_res; + shadow = pcfShadow(shadowMap2, lpos, 1.5); + } + else if (spos.z < -shadow_clip.x) + { + lpos = shadow_matrix[1]*spos; + lpos.xy *= shadow_res; + shadow = pcfShadow(shadowMap1, lpos, 1.5); + } + else + { + lpos = shadow_matrix[0]*spos; + lpos.xy *= shadow_res; + shadow = pcfShadow(shadowMap0, lpos, 1.5); + } + } + + vec4 diff = texture2D(diffuseMap,gl_TexCoord[0].xy); + + vec4 col = vec4(vary_ambient + vary_directional.rgb*shadow, gl_Color.a); + vec4 color = diff * col; + + color.rgb = atmosLighting(color.rgb); + + color.rgb = scaleSoftClip(color.rgb); + + color.rgb += diff.rgb * vary_pointlight_col.rgb; + + //gl_FragColor = gl_Color; + gl_FragColor = color; + //gl_FragColor.r = 0.0; + //gl_FragColor = vec4(1,shadow,1,1); + +} + diff --git a/indra/newview/app_settings/shaders/class2/deferred/alphaSkinnedV.glsl b/indra/newview/app_settings/shaders/class2/deferred/alphaSkinnedV.glsl index dfb36980b006cb6b56ceda38ee0540fbf584e0c3..948a52da5b83f96d9ffe1878dd99154a1bc31fee 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/alphaSkinnedV.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/alphaSkinnedV.glsl @@ -5,7 +5,7 @@ * $License$ */ -#version 120 + vec4 calcLighting(vec3 pos, vec3 norm, vec4 color, vec4 baseCol); void calcAtmospherics(vec3 inPositionEye); diff --git a/indra/newview/app_settings/shaders/class2/deferred/alphaV.glsl b/indra/newview/app_settings/shaders/class2/deferred/alphaV.glsl index f6160815ebb51b5afa5b3720d8cc2702bd041150..f616ecc872389ba7a816d2b0c3fb3ae688b7f368 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/alphaV.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/alphaV.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + vec4 calcLighting(vec3 pos, vec3 norm, vec4 color, vec4 baseCol); void calcAtmospherics(vec3 inPositionEye); @@ -22,6 +22,7 @@ varying vec3 vary_directional; varying vec3 vary_fragcoord; varying vec3 vary_position; varying vec3 vary_pointlight_col; +varying float vary_texture_index; uniform float near_clip; uniform float shadow_offset; @@ -60,11 +61,13 @@ float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, floa void main() { //transform vertex - gl_Position = ftransform(); + vec4 vert = vec4(gl_Vertex.xyz, 1.0); + vary_texture_index = gl_Vertex.w; + gl_Position = gl_ModelViewProjectionMatrix * vert; gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0; - vec4 pos = (gl_ModelViewMatrix * gl_Vertex); + vec4 pos = (gl_ModelViewMatrix * vert); vec3 norm = normalize(gl_NormalMatrix * gl_Normal); float dp_directional_light = max(0.0, dot(norm, gl_LightSource[0].position.xyz)); @@ -99,7 +102,7 @@ void main() gl_FogFragCoord = pos.z; - pos = gl_ModelViewProjectionMatrix * gl_Vertex; + pos = gl_ModelViewProjectionMatrix * vert; vary_fragcoord.xyz = pos.xyz + vec3(0,0,near_clip); } diff --git a/indra/newview/app_settings/shaders/class2/deferred/avatarAlphaV.glsl b/indra/newview/app_settings/shaders/class2/deferred/avatarAlphaV.glsl index 0ae09df0c6d1262e6e475f2e3ef6b566bb2f2fdd..01e40afc4f22150c2f488fcbfac7856b6815a583 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/avatarAlphaV.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/avatarAlphaV.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + vec4 calcLighting(vec3 pos, vec3 norm, vec4 color, vec4 baseCol); mat4 getSkinnedTransform(); diff --git a/indra/newview/app_settings/shaders/class2/deferred/edgeF.glsl b/indra/newview/app_settings/shaders/class2/deferred/edgeF.glsl index 3155f3f9295a3602e8eaa1915910fd58226a48d8..729e4b55435068b2f58ec5e8a41f6f99382bc429 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/edgeF.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/edgeF.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + #extension GL_ARB_texture_rectangle : enable @@ -22,7 +22,7 @@ uniform vec2 screen_res; float getDepth(vec2 pos_screen) { - float z = texture2DRect(depthMap, pos_screen.xy).a; + float z = texture2DRect(depthMap, pos_screen.xy).r; z = z*2.0-1.0; vec4 ndc = vec4(0.0, 0.0, z, 1.0); vec4 p = inv_proj*ndc; diff --git a/indra/newview/app_settings/shaders/class2/deferred/edgeMSF.glsl b/indra/newview/app_settings/shaders/class2/deferred/edgeMSF.glsl new file mode 100644 index 0000000000000000000000000000000000000000..b22bc5b28828f2b7db99f79076cf65a2553af0bc --- /dev/null +++ b/indra/newview/app_settings/shaders/class2/deferred/edgeMSF.glsl @@ -0,0 +1,74 @@ +/** + * @file edgeF.glsl + * + * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * $/LicenseInfo$ + */ + + + +#extension GL_ARB_texture_rectangle : enable +#extension GL_ARB_texture_multisample : enable + +uniform sampler2DMS depthMap; +uniform sampler2DMS normalMap; + +varying vec2 vary_fragcoord; + +uniform float depth_cutoff; +uniform float norm_cutoff; + +uniform mat4 inv_proj; +uniform vec2 screen_res; + +float getDepth(ivec2 pos_screen, int sample) +{ + float z = texelFetch(depthMap, pos_screen, sample).r; + z = z*2.0-1.0; + vec4 ndc = vec4(0.0, 0.0, z, 1.0); + vec4 p = inv_proj*ndc; + return p.z/p.w; +} + +void main() +{ + float e = 0; + + ivec2 itc = ivec2(vary_fragcoord.xy); + + for (int i = 0; i < samples; i++) + { + vec3 norm = texelFetch(normalMap, itc, i).xyz; + norm = vec3((norm.xy-0.5)*2.0,norm.z); // unpack norm + float depth = getDepth(itc, i); + + vec2 tc = vary_fragcoord.xy; + + int sc = 1; + + vec2 de; + de.x = (depth-getDepth(itc+ivec2(sc, sc),i)) + (depth-getDepth(itc+ivec2(-sc, -sc), i)); + de.y = (depth-getDepth(itc+ivec2(-sc, sc),i)) + (depth-getDepth(itc+ivec2(sc, -sc), i)); + de /= depth; + de *= de; + de = step(depth_cutoff, de); + + vec2 ne; + vec3 nexnorm = texelFetch(normalMap, itc+ivec2(-sc,-sc), i).rgb; + nexnorm = vec3((nexnorm.xy-0.5)*2.0,nexnorm.z); // unpack norm + ne.x = dot(nexnorm, norm); + vec3 neynorm = texelFetch(normalMap, itc+ivec2(sc,sc), i).rgb; + neynorm = vec3((neynorm.xy-0.5)*2.0,neynorm.z); // unpack norm + ne.y = dot(neynorm, norm); + + ne = 1.0-ne; + + ne = step(norm_cutoff, ne); + + e += dot(de,de)+dot(ne,ne); + } + + e /= samples; + + gl_FragColor.a = e; +} diff --git a/indra/newview/app_settings/shaders/class2/deferred/edgeV.glsl b/indra/newview/app_settings/shaders/class2/deferred/edgeV.glsl index b3413c301fc442633173347773d2f1c761d489ad..393084a3db72d9535d533e2bbe5090cbad351aa4 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/edgeV.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/edgeV.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + varying vec2 vary_fragcoord; uniform vec2 screen_res; diff --git a/indra/newview/app_settings/shaders/class2/deferred/multiSpotLightF.glsl b/indra/newview/app_settings/shaders/class2/deferred/multiSpotLightF.glsl index d6cd984ebe1bfa037c4a20740c21a4087fc87cf9..f54186ffca369052f2a30023179f65502ab79baa 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/multiSpotLightF.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/multiSpotLightF.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + #extension GL_ARB_texture_rectangle : enable @@ -91,7 +91,7 @@ vec4 texture2DLodAmbient(sampler2D projectionMap, vec2 tc, float lod) vec4 getPosition(vec2 pos_screen) { - float depth = texture2DRect(depthMap, pos_screen.xy).a; + float depth = texture2DRect(depthMap, pos_screen.xy).r; vec2 sc = pos_screen.xy*2.0; sc /= screen_res; sc -= vec2(1.0,1.0); diff --git a/indra/newview/app_settings/shaders/class2/deferred/multiSpotLightMSF.glsl b/indra/newview/app_settings/shaders/class2/deferred/multiSpotLightMSF.glsl new file mode 100644 index 0000000000000000000000000000000000000000..fee32be3e353c660853b648cef66c377c8baee62 --- /dev/null +++ b/indra/newview/app_settings/shaders/class2/deferred/multiSpotLightMSF.glsl @@ -0,0 +1,244 @@ +/** + * @file multiSpotLightF.glsl + * + * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * $/LicenseInfo$ + */ + + + +#extension GL_ARB_texture_rectangle : enable +#extension GL_ARB_texture_multisample : enable + +uniform sampler2DMS diffuseRect; +uniform sampler2DMS specularRect; +uniform sampler2DMS depthMap; +uniform sampler2DMS normalMap; +uniform sampler2DRect lightMap; +uniform sampler2D noiseMap; +uniform sampler2D lightFunc; +uniform sampler2D projectionMap; + +uniform mat4 proj_mat; //screen space to light space +uniform float proj_near; //near clip for projection +uniform vec3 proj_p; //plane projection is emitting from (in screen space) +uniform vec3 proj_n; +uniform float proj_focus; //distance from plane to begin blurring +uniform float proj_lod; //(number of mips in proj map) +uniform float proj_range; //range between near clip and far clip plane of projection +uniform float proj_ambient_lod; +uniform float proj_ambiance; +uniform float near_clip; +uniform float far_clip; + +uniform vec3 proj_origin; //origin of projection to be used for angular attenuation +uniform float sun_wash; +uniform int proj_shadow_idx; +uniform float shadow_fade; + +varying vec4 vary_light; + +varying vec4 vary_fragcoord; +uniform vec2 screen_res; + +uniform mat4 inv_proj; + +vec4 texture2DLodSpecular(sampler2D projectionMap, vec2 tc, float lod) +{ + vec4 ret = texture2DLod(projectionMap, tc, lod); + + vec2 dist = tc-vec2(0.5); + + float det = max(1.0-lod/(proj_lod*0.5), 0.0); + + float d = dot(dist,dist); + + ret *= min(clamp((0.25-d)/0.25, 0.0, 1.0)+det, 1.0); + + return ret; +} + +vec4 texture2DLodDiffuse(sampler2D projectionMap, vec2 tc, float lod) +{ + vec4 ret = texture2DLod(projectionMap, tc, lod); + + vec2 dist = vec2(0.5) - abs(tc-vec2(0.5)); + + float det = min(lod/(proj_lod*0.5), 1.0); + + float d = min(dist.x, dist.y); + + float edge = 0.25*det; + + ret *= clamp(d/edge, 0.0, 1.0); + + return ret; +} + +vec4 texture2DLodAmbient(sampler2D projectionMap, vec2 tc, float lod) +{ + vec4 ret = texture2DLod(projectionMap, tc, lod); + + vec2 dist = tc-vec2(0.5); + + float d = dot(dist,dist); + + ret *= min(clamp((0.25-d)/0.25, 0.0, 1.0), 1.0); + + return ret; +} + + +vec4 getPosition(ivec2 pos_screen, int sample) +{ + float depth = texelFetch(depthMap, pos_screen, sample).r; + vec2 sc = vec2(pos_screen.xy)*2.0; + sc /= screen_res; + sc -= vec2(1.0,1.0); + vec4 ndc = vec4(sc.x, sc.y, 2.0*depth-1.0, 1.0); + vec4 pos = inv_proj * ndc; + pos /= pos.w; + pos.w = 1.0; + return pos; +} + +void main() +{ + int wght = 0; + + vec3 fcol = vec3(0,0,0); + + vec2 frag = (vary_fragcoord.xy*0.5+0.5)*screen_res; + + ivec2 itc = ivec2(frag.xy); + + float shadow = 1.0; + + if (proj_shadow_idx >= 0) + { + vec4 shd = texture2DRect(lightMap, frag); + float sh[2]; + sh[0] = shd.b; + sh[1] = shd.a; + shadow = min(sh[proj_shadow_idx]+shadow_fade, 1.0); + } + + for (int i = 0; i < samples; i++) + { + vec3 pos = getPosition(itc, i).xyz; + vec3 lv = vary_light.xyz-pos.xyz; + float dist2 = dot(lv,lv); + dist2 /= vary_light.w; + if (dist2 <= 1.0) + { + vec3 norm = texelFetch(normalMap, itc, i).xyz; + norm = vec3((norm.xy-0.5)*2.0,norm.z); // unpack norm + + norm = normalize(norm); + float l_dist = -dot(lv, proj_n); + + vec4 proj_tc = (proj_mat * vec4(pos.xyz, 1.0)); + if (proj_tc.z >= 0.0) + { + proj_tc.xyz /= proj_tc.w; + + float fa = gl_Color.a+1.0; + float dist_atten = min(1.0-(dist2-1.0*(1.0-fa))/fa, 1.0); + if (dist_atten > 0.0) + { + lv = proj_origin-pos.xyz; + lv = normalize(lv); + float da = dot(norm, lv); + + vec3 col = vec3(0,0,0); + + vec3 diff_tex = texelFetch(diffuseRect, itc, i).rgb; + + float noise = texture2D(noiseMap, frag.xy/128.0).b; + if (proj_tc.z > 0.0 && + proj_tc.x < 1.0 && + proj_tc.y < 1.0 && + proj_tc.x > 0.0 && + proj_tc.y > 0.0) + { + float lit = 0.0; + float amb_da = proj_ambiance; + + if (da > 0.0) + { + float diff = clamp((l_dist-proj_focus)/proj_range, 0.0, 1.0); + float lod = diff * proj_lod; + + vec4 plcol = texture2DLodDiffuse(projectionMap, proj_tc.xy, lod); + + vec3 lcol = gl_Color.rgb * plcol.rgb * plcol.a; + + lit = da * dist_atten * noise; + + col = lcol*lit*diff_tex*shadow; + amb_da += (da*0.5)*(1.0-shadow)*proj_ambiance; + } + + //float diff = clamp((proj_range-proj_focus)/proj_range, 0.0, 1.0); + vec4 amb_plcol = texture2DLodAmbient(projectionMap, proj_tc.xy, proj_lod); + + amb_da += (da*da*0.5+0.5)*proj_ambiance; + + amb_da *= dist_atten * noise; + + amb_da = min(amb_da, 1.0-lit); + + col += amb_da*gl_Color.rgb*diff_tex.rgb*amb_plcol.rgb*amb_plcol.a; + } + + + vec4 spec = texelFetch(specularRect, itc, i); + if (spec.a > 0.0) + { + vec3 ref = reflect(normalize(pos), norm); + + //project from point pos in direction ref to plane proj_p, proj_n + vec3 pdelta = proj_p-pos; + float ds = dot(ref, proj_n); + + if (ds < 0.0) + { + vec3 pfinal = pos + ref * dot(pdelta, proj_n)/ds; + + vec4 stc = (proj_mat * vec4(pfinal.xyz, 1.0)); + + if (stc.z > 0.0) + { + stc.xy /= stc.w; + + float fatten = clamp(spec.a*spec.a+spec.a*0.5, 0.25, 1.0); + + stc.xy = (stc.xy - vec2(0.5)) * fatten + vec2(0.5); + + if (stc.x < 1.0 && + stc.y < 1.0 && + stc.x > 0.0 && + stc.y > 0.0) + { + vec4 scol = texture2DLodSpecular(projectionMap, stc.xy, proj_lod-spec.a*proj_lod); + col += dist_atten*scol.rgb*gl_Color.rgb*scol.a*spec.rgb*shadow; + } + } + } + } + + fcol += col; + wght++; + } + } + } + } + + if (wght <= 0) + { + discard; + } + + gl_FragColor.rgb = fcol/samples; + gl_FragColor.a = 0.0; +} diff --git a/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl b/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl index 0160e84278fc665f06adde57cda481a1b9d39f52..66a1a8515f257bf4fc7fa610edb12afe455d20cb 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + #extension GL_ARB_texture_rectangle : enable @@ -71,7 +71,7 @@ vec4 getPosition_d(vec2 pos_screen, float depth) vec4 getPosition(vec2 pos_screen) { //get position in screen space (world units) given window coordinate and depth map - float depth = texture2DRect(depthMap, pos_screen.xy).a; + float depth = texture2DRect(depthMap, pos_screen.xy).r; return getPosition_d(pos_screen, depth); } @@ -258,7 +258,7 @@ vec3 scaleSoftClip(vec3 light) void main() { vec2 tc = vary_fragcoord.xy; - float depth = texture2DRect(depthMap, tc.xy).a; + float depth = texture2DRect(depthMap, tc.xy).r; vec3 pos = getPosition_d(tc, depth).xyz; vec3 norm = texture2DRect(normalMap, tc).xyz; norm = vec3((norm.xy-0.5)*2.0,norm.z); // unpack norm @@ -288,54 +288,8 @@ void main() float sa = dot(refnormpersp, vary_light.xyz); vec3 dumbshiny = vary_SunlitColor*scol_ambocc.r*texture2D(lightFunc, vec2(sa, spec.a)).a; - /* - // screen-space cheap fakey reflection map - // - vec3 refnorm = normalize(reflect(vec3(0,0,-1), norm.xyz)); - depth -= 0.5; // unbias depth - // first figure out where we'll make our 2D guess from - vec2 ref2d = (0.25 * screen_res.y) * (refnorm.xy) * abs(refnorm.z) / depth; - // Offset the guess source a little according to a trivial - // checkerboard dither function and spec.a. - // This is meant to be similar to sampling a blurred version - // of the diffuse map. LOD would be better in that regard. - // The goal of the blur is to soften reflections in surfaces - // with low shinyness, and also to disguise our lameness. - float checkerboard = floor(mod(tc.x+tc.y, 2.0)); // 0.0, 1.0 - float checkoffset = (3.0 + (7.0*(1.0-spec.a)))*(checkerboard-0.5); - ref2d += vec2(checkoffset, checkoffset); - ref2d += tc.xy; // use as offset from destination - // Get attributes from the 2D guess point. - // We average two samples of diffuse (not of anything else) per - // pixel to try to reduce aliasing some more. - vec3 refcol = 0.5 * (texture2DRect(diffuseRect, ref2d + vec2(0.0, -checkoffset)).rgb + - texture2DRect(diffuseRect, ref2d + vec2(-checkoffset, 0.0)).rgb); - float refdepth = texture2DRect(depthMap, ref2d).a; - vec3 refpos = getPosition_d(ref2d, refdepth).xyz; - float refshad = texture2DRect(lightMap, ref2d).r; - vec3 refn = texture2DRect(normalMap, ref2d).rgb; - refn = vec3((refn.xy-0.5)*2.0,refn.z); // unpack norm - refn = normalize(refn); - // figure out how appropriate our guess actually was - float refapprop = max(0.0, dot(-refnorm, normalize(pos - refpos))); - // darken reflections from points which face away from the reflected ray - our guess was a back-face - //refapprop *= step(dot(refnorm, refn), 0.0); - refapprop = min(refapprop, max(0.0, -dot(refnorm, refn))); // more conservative variant - // get appropriate light strength for guess-point - // reflect light direction to increase the illusion that - // these are reflections. - vec3 reflight = reflect(lightnorm.xyz, norm.xyz); - float reflit = min(max(dot(refn, reflight.xyz), 0.0), refshad); - // apply sun color to guess-point, dampen according to inappropriateness of guess - float refmod = min(refapprop, reflit); - vec3 refprod = vary_SunlitColor * refcol.rgb * refmod; - vec3 ssshiny = (refprod * spec.a); - ssshiny *= 0.3; // dampen it even more - */ - vec3 ssshiny = vec3(0,0,0); - // add the two types of shiny together - col += (ssshiny + dumbshiny) * spec.rgb; + col += dumbshiny * spec.rgb; } col = atmosLighting(col); diff --git a/indra/newview/app_settings/shaders/class2/deferred/softenLightMSF.glsl b/indra/newview/app_settings/shaders/class2/deferred/softenLightMSF.glsl new file mode 100644 index 0000000000000000000000000000000000000000..0bae10ca7d218a844f7fd4562548a6cb9881fb0d --- /dev/null +++ b/indra/newview/app_settings/shaders/class2/deferred/softenLightMSF.glsl @@ -0,0 +1,307 @@ +/** + * @file softenLightMSF.glsl + * + * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * $/LicenseInfo$ + */ + + + +#extension GL_ARB_texture_rectangle : enable +#extension GL_ARB_texture_multisample : enable + +uniform sampler2DMS diffuseRect; +uniform sampler2DMS specularRect; +uniform sampler2DMS normalMap; +uniform sampler2DRect lightMap; +uniform sampler2DMS depthMap; +uniform sampler2D noiseMap; +uniform samplerCube environmentMap; +uniform sampler2D lightFunc; +uniform vec3 gi_quad; + +uniform float blur_size; +uniform float blur_fidelity; + +// Inputs +uniform vec4 morphFactor; +uniform vec3 camPosLocal; +//uniform vec4 camPosWorld; +uniform vec4 gamma; +uniform vec4 lightnorm; +uniform vec4 sunlight_color; +uniform vec4 ambient; +uniform vec4 blue_horizon; +uniform vec4 blue_density; +uniform vec4 haze_horizon; +uniform vec4 haze_density; +uniform vec4 cloud_shadow; +uniform vec4 density_multiplier; +uniform vec4 distance_multiplier; +uniform vec4 max_y; +uniform vec4 glow; +uniform float scene_light_strength; +uniform vec3 env_mat[3]; +uniform vec4 shadow_clip; +uniform mat3 ssao_effect_mat; + +uniform mat4 inv_proj; +uniform vec2 screen_res; + +varying vec4 vary_light; +varying vec2 vary_fragcoord; + +vec3 vary_PositionEye; + +vec3 vary_SunlitColor; +vec3 vary_AmblitColor; +vec3 vary_AdditiveColor; +vec3 vary_AtmosAttenuation; + +vec4 getPosition_d(vec2 pos_screen, float depth) +{ + vec2 sc = pos_screen.xy*2.0; + sc /= screen_res; + sc -= vec2(1.0,1.0); + vec4 ndc = vec4(sc.x, sc.y, 2.0*depth-1.0, 1.0); + vec4 pos = inv_proj * ndc; + pos /= pos.w; + pos.w = 1.0; + return pos; +} + +vec3 getPositionEye() +{ + return vary_PositionEye; +} +vec3 getSunlitColor() +{ + return vary_SunlitColor; +} +vec3 getAmblitColor() +{ + return vary_AmblitColor; +} +vec3 getAdditiveColor() +{ + return vary_AdditiveColor; +} +vec3 getAtmosAttenuation() +{ + return vary_AtmosAttenuation; +} + + +void setPositionEye(vec3 v) +{ + vary_PositionEye = v; +} + +void setSunlitColor(vec3 v) +{ + vary_SunlitColor = v; +} + +void setAmblitColor(vec3 v) +{ + vary_AmblitColor = v; +} + +void setAdditiveColor(vec3 v) +{ + vary_AdditiveColor = v; +} + +void setAtmosAttenuation(vec3 v) +{ + vary_AtmosAttenuation = v; +} + +void calcAtmospherics(vec3 inPositionEye, float ambFactor) { + + vec3 P = inPositionEye; + setPositionEye(P); + + //(TERRAIN) limit altitude + if (P.y > max_y.x) P *= (max_y.x / P.y); + if (P.y < -max_y.x) P *= (-max_y.x / P.y); + + vec3 tmpLightnorm = lightnorm.xyz; + + vec3 Pn = normalize(P); + float Plen = length(P); + + vec4 temp1 = vec4(0); + vec3 temp2 = vec3(0); + vec4 blue_weight; + vec4 haze_weight; + vec4 sunlight = sunlight_color; + vec4 light_atten; + + //sunlight attenuation effect (hue and brightness) due to atmosphere + //this is used later for sunlight modulation at various altitudes + light_atten = (blue_density * 1.0 + vec4(haze_density.r) * 0.25) * (density_multiplier.x * max_y.x); + //I had thought blue_density and haze_density should have equal weighting, + //but attenuation due to haze_density tends to seem too strong + + temp1 = blue_density + vec4(haze_density.r); + blue_weight = blue_density / temp1; + haze_weight = vec4(haze_density.r) / temp1; + + //(TERRAIN) compute sunlight from lightnorm only (for short rays like terrain) + temp2.y = max(0.0, tmpLightnorm.y); + temp2.y = 1. / temp2.y; + sunlight *= exp( - light_atten * temp2.y); + + // main atmospheric scattering line integral + temp2.z = Plen * density_multiplier.x; + + // Transparency (-> temp1) + // ATI Bugfix -- can't store temp1*temp2.z*distance_multiplier.x in a variable because the ati + // compiler gets confused. + temp1 = exp(-temp1 * temp2.z * distance_multiplier.x); + + //final atmosphere attenuation factor + setAtmosAttenuation(temp1.rgb); + + //compute haze glow + //(can use temp2.x as temp because we haven't used it yet) + temp2.x = dot(Pn, tmpLightnorm.xyz); + temp2.x = 1. - temp2.x; + //temp2.x is 0 at the sun and increases away from sun + temp2.x = max(temp2.x, .03); //was glow.y + //set a minimum "angle" (smaller glow.y allows tighter, brighter hotspot) + temp2.x *= glow.x; + //higher glow.x gives dimmer glow (because next step is 1 / "angle") + temp2.x = pow(temp2.x, glow.z); + //glow.z should be negative, so we're doing a sort of (1 / "angle") function + + //add "minimum anti-solar illumination" + temp2.x += .25; + + //increase ambient when there are more clouds + vec4 tmpAmbient = ambient + (vec4(1.) - ambient) * cloud_shadow.x * 0.5; + + /* decrease value and saturation (that in HSV, not HSL) for occluded areas + * // for HSV color/geometry used here, see http://gimp-savvy.com/BOOK/index.html?node52.html + * // The following line of code performs the equivalent of: + * float ambAlpha = tmpAmbient.a; + * float ambValue = dot(vec3(tmpAmbient), vec3(0.577)); // projection onto <1/rt(3), 1/rt(3), 1/rt(3)>, the neutral white-black axis + * vec3 ambHueSat = vec3(tmpAmbient) - vec3(ambValue); + * tmpAmbient = vec4(RenderSSAOEffect.valueFactor * vec3(ambValue) + RenderSSAOEffect.saturationFactor *(1.0 - ambFactor) * ambHueSat, ambAlpha); + */ + tmpAmbient = vec4(mix(ssao_effect_mat * tmpAmbient.rgb, tmpAmbient.rgb, ambFactor), tmpAmbient.a); + + //haze color + setAdditiveColor( + vec3(blue_horizon * blue_weight * (sunlight*(1.-cloud_shadow.x) + tmpAmbient) + + (haze_horizon.r * haze_weight) * (sunlight*(1.-cloud_shadow.x) * temp2.x + + tmpAmbient))); + + //brightness of surface both sunlight and ambient + setSunlitColor(vec3(sunlight * .5)); + setAmblitColor(vec3(tmpAmbient * .25)); + setAdditiveColor(getAdditiveColor() * vec3(1.0 - temp1)); +} + +vec3 atmosLighting(vec3 light) +{ + light *= getAtmosAttenuation().r; + light += getAdditiveColor(); + return (2.0 * light); +} + +vec3 atmosTransport(vec3 light) { + light *= getAtmosAttenuation().r; + light += getAdditiveColor() * 2.0; + return light; +} +vec3 atmosGetDiffuseSunlightColor() +{ + return getSunlitColor(); +} + +vec3 scaleDownLight(vec3 light) +{ + return (light / scene_light_strength ); +} + +vec3 scaleUpLight(vec3 light) +{ + return (light * scene_light_strength); +} + +vec3 atmosAmbient(vec3 light) +{ + return getAmblitColor() + light / 2.0; +} + +vec3 atmosAffectDirectionalLight(float lightIntensity) +{ + return getSunlitColor() * lightIntensity; +} + +vec3 scaleSoftClip(vec3 light) +{ + //soft clip effect: + light = 1. - clamp(light, vec3(0.), vec3(1.)); + light = 1. - pow(light, gamma.xxx); + + return light; +} + +void main() +{ + vec2 tc = vary_fragcoord.xy; + ivec2 itc = ivec2(tc); + + vec3 fcol = vec3(0,0,0); + + vec2 scol_ambocc = texture2DRect(lightMap, tc).rg; + float ambocc = scol_ambocc.g; + + for (int i = 0; i < samples; ++i) + { + float depth = texelFetch(depthMap, itc.xy, i).r; + vec3 pos = getPosition_d(tc, depth).xyz; + vec3 norm = texelFetch(normalMap, itc, i).xyz; + norm = vec3((norm.xy-0.5)*2.0,norm.z); // unpack norm + + float da = max(dot(norm.xyz, vary_light.xyz), 0.0); + + vec4 diffuse = texelFetch(diffuseRect, itc, i); + vec4 spec = texelFetch(specularRect, itc, i); + + float amb = 0; + + float scol = max(scol_ambocc.r, diffuse.a); + amb += ambocc; + + calcAtmospherics(pos.xyz, ambocc); + + vec3 col = atmosAmbient(vec3(0)); + col += atmosAffectDirectionalLight(max(min(da, scol), diffuse.a)); + + col *= diffuse.rgb; + + if (spec.a > 0.0) // specular reflection + { + // the old infinite-sky shiny reflection + // + vec3 refnormpersp = normalize(reflect(pos.xyz, norm.xyz)); + float sa = dot(refnormpersp, vary_light.xyz); + vec3 dumbshiny = vary_SunlitColor*scol_ambocc.r*texture2D(lightFunc, vec2(sa, spec.a)).a; + + // add the two types of shiny together + col += dumbshiny * spec.rgb; + } + + col = atmosLighting(col); + col = scaleSoftClip(col); + + fcol += col; + } + + gl_FragColor.rgb = fcol/samples; + gl_FragColor.a = 0.0; +} diff --git a/indra/newview/app_settings/shaders/class2/deferred/softenLightV.glsl b/indra/newview/app_settings/shaders/class2/deferred/softenLightV.glsl index 8f0bcca76b86a22f32101d0c81b3631110fff0c9..745cc0199236aeff1ade125a59f78bd48b15d382 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/softenLightV.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/softenLightV.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + uniform vec2 screen_res; diff --git a/indra/newview/app_settings/shaders/class2/deferred/spotLightF.glsl b/indra/newview/app_settings/shaders/class2/deferred/spotLightF.glsl index 50b9ef276e6ab7bb98a51eb5a00dff4ce9afa0d7..cd3828fbd4084d0fd980e65ce8dae2ecca4f9c1b 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/spotLightF.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/spotLightF.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + #extension GL_ARB_texture_rectangle : enable diff --git a/indra/newview/app_settings/shaders/class2/deferred/spotLightMSF.glsl b/indra/newview/app_settings/shaders/class2/deferred/spotLightMSF.glsl new file mode 100644 index 0000000000000000000000000000000000000000..ec9b547a47210ff1d032e9859bc9004de583a55f --- /dev/null +++ b/indra/newview/app_settings/shaders/class2/deferred/spotLightMSF.glsl @@ -0,0 +1,245 @@ +/** + * @file multiSpotLightF.glsl + * + * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * $/LicenseInfo$ + */ + + + +#extension GL_ARB_texture_rectangle : enable +#extension GL_ARB_texture_multisample : enable + +uniform sampler2DMS diffuseRect; +uniform sampler2DMS specularRect; +uniform sampler2DMS depthMap; +uniform sampler2DMS normalMap; +uniform sampler2DRect lightMap; +uniform sampler2D noiseMap; +uniform sampler2D lightFunc; +uniform sampler2D projectionMap; + +uniform mat4 proj_mat; //screen space to light space +uniform float proj_near; //near clip for projection +uniform vec3 proj_p; //plane projection is emitting from (in screen space) +uniform vec3 proj_n; +uniform float proj_focus; //distance from plane to begin blurring +uniform float proj_lod; //(number of mips in proj map) +uniform float proj_range; //range between near clip and far clip plane of projection +uniform float proj_ambient_lod; +uniform float proj_ambiance; +uniform float near_clip; +uniform float far_clip; + +uniform vec3 proj_origin; //origin of projection to be used for angular attenuation +uniform float sun_wash; +uniform int proj_shadow_idx; +uniform float shadow_fade; + +varying vec4 vary_light; + +varying vec4 vary_fragcoord; +uniform vec2 screen_res; + +uniform mat4 inv_proj; + +vec4 texture2DLodSpecular(sampler2D projectionMap, vec2 tc, float lod) +{ + vec4 ret = texture2DLod(projectionMap, tc, lod); + + vec2 dist = tc-vec2(0.5); + + float det = max(1.0-lod/(proj_lod*0.5), 0.0); + + float d = dot(dist,dist); + + ret *= min(clamp((0.25-d)/0.25, 0.0, 1.0)+det, 1.0); + + return ret; +} + +vec4 texture2DLodDiffuse(sampler2D projectionMap, vec2 tc, float lod) +{ + vec4 ret = texture2DLod(projectionMap, tc, lod); + + vec2 dist = vec2(0.5) - abs(tc-vec2(0.5)); + + float det = min(lod/(proj_lod*0.5), 1.0); + + float d = min(dist.x, dist.y); + + float edge = 0.25*det; + + ret *= clamp(d/edge, 0.0, 1.0); + + return ret; +} + +vec4 texture2DLodAmbient(sampler2D projectionMap, vec2 tc, float lod) +{ + vec4 ret = texture2DLod(projectionMap, tc, lod); + + vec2 dist = tc-vec2(0.5); + + float d = dot(dist,dist); + + ret *= min(clamp((0.25-d)/0.25, 0.0, 1.0), 1.0); + + return ret; +} + + +vec4 getPosition(ivec2 pos_screen, int sample) +{ + float depth = texelFetch(depthMap, pos_screen, sample).r; + vec2 sc = vec2(pos_screen.xy)*2.0; + sc /= screen_res; + sc -= vec2(1.0,1.0); + vec4 ndc = vec4(sc.x, sc.y, 2.0*depth-1.0, 1.0); + vec4 pos = inv_proj * ndc; + pos /= pos.w; + pos.w = 1.0; + return pos; +} + +void main() +{ + vec4 frag = vary_fragcoord; + frag.xyz /= frag.w; + frag.xyz = frag.xyz*0.5+0.5; + frag.xy *= screen_res; + ivec2 itc = ivec2(frag.xy); + + vec3 fcol = vec3(0,0,0); + int wght = 0; + + float shadow = 1.0; + + if (proj_shadow_idx >= 0) + { + vec4 shd = texture2DRect(lightMap, frag.xy); + float sh[2]; + sh[0] = shd.b; + sh[1] = shd.a; + shadow = min(sh[proj_shadow_idx]+shadow_fade, 1.0); + } + + for (int i = 0; i < samples; i++) + { + vec3 pos = getPosition(itc, i).xyz; + vec3 lv = vary_light.xyz-pos.xyz; + float dist2 = dot(lv,lv); + dist2 /= vary_light.w; + if (dist2 <= 1.0) + { + vec3 norm = texelFetch(normalMap, itc, i).xyz; + norm = vec3((norm.xy-0.5)*2.0,norm.z); // unpack norm + + norm = normalize(norm); + float l_dist = -dot(lv, proj_n); + + vec4 proj_tc = (proj_mat * vec4(pos.xyz, 1.0)); + if (proj_tc.z >= 0.0) + { + proj_tc.xyz /= proj_tc.w; + + float fa = gl_Color.a+1.0; + float dist_atten = min(1.0-(dist2-1.0*(1.0-fa))/fa, 1.0); + if (dist_atten > 0.0) + { + lv = proj_origin-pos.xyz; + lv = normalize(lv); + float da = dot(norm, lv); + + vec3 col = vec3(0,0,0); + + vec3 diff_tex = texelFetch(diffuseRect, itc, i).rgb; + + float noise = texture2D(noiseMap, frag.xy/128.0).b; + if (proj_tc.z > 0.0 && + proj_tc.x < 1.0 && + proj_tc.y < 1.0 && + proj_tc.x > 0.0 && + proj_tc.y > 0.0) + { + float lit = 0.0; + float amb_da = proj_ambiance; + + if (da > 0.0) + { + float diff = clamp((l_dist-proj_focus)/proj_range, 0.0, 1.0); + float lod = diff * proj_lod; + + vec4 plcol = texture2DLodDiffuse(projectionMap, proj_tc.xy, lod); + + vec3 lcol = gl_Color.rgb * plcol.rgb * plcol.a; + + lit = da * dist_atten * noise; + + col = lcol*lit*diff_tex*shadow; + amb_da += (da*0.5)*(1.0-shadow)*proj_ambiance; + } + + //float diff = clamp((proj_range-proj_focus)/proj_range, 0.0, 1.0); + vec4 amb_plcol = texture2DLodAmbient(projectionMap, proj_tc.xy, proj_lod); + + amb_da += (da*da*0.5+0.5)*proj_ambiance; + + amb_da *= dist_atten * noise; + + amb_da = min(amb_da, 1.0-lit); + + col += amb_da*gl_Color.rgb*diff_tex.rgb*amb_plcol.rgb*amb_plcol.a; + } + + + vec4 spec = texelFetch(specularRect, itc, i); + if (spec.a > 0.0) + { + vec3 ref = reflect(normalize(pos), norm); + + //project from point pos in direction ref to plane proj_p, proj_n + vec3 pdelta = proj_p-pos; + float ds = dot(ref, proj_n); + + if (ds < 0.0) + { + vec3 pfinal = pos + ref * dot(pdelta, proj_n)/ds; + + vec4 stc = (proj_mat * vec4(pfinal.xyz, 1.0)); + + if (stc.z > 0.0) + { + stc.xy /= stc.w; + + float fatten = clamp(spec.a*spec.a+spec.a*0.5, 0.25, 1.0); + + stc.xy = (stc.xy - vec2(0.5)) * fatten + vec2(0.5); + + if (stc.x < 1.0 && + stc.y < 1.0 && + stc.x > 0.0 && + stc.y > 0.0) + { + vec4 scol = texture2DLodSpecular(projectionMap, stc.xy, proj_lod-spec.a*proj_lod); + col += dist_atten*scol.rgb*gl_Color.rgb*scol.a*spec.rgb*shadow; + } + } + } + } + + fcol += col; + wght++; + } + } + } + } + + if (wght <= 0) + { + discard; + } + + gl_FragColor.rgb = fcol/wght; + gl_FragColor.a = 0.0; +} diff --git a/indra/newview/app_settings/shaders/class2/deferred/sunLightF.glsl b/indra/newview/app_settings/shaders/class2/deferred/sunLightF.glsl index 4369b3b34ff8da6af4aabcf4b57e58b02024dd2b..315139b4151e3b5bb260af68e1fac61060b11029 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/sunLightF.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/sunLightF.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + #extension GL_ARB_texture_rectangle : enable @@ -45,7 +45,7 @@ uniform float spot_shadow_offset; vec4 getPosition(vec2 pos_screen) { - float depth = texture2DRect(depthMap, pos_screen.xy).a; + float depth = texture2DRect(depthMap, pos_screen.xy).r; vec2 sc = pos_screen.xy*2.0; sc /= screen_res; sc -= vec2(1.0,1.0); diff --git a/indra/newview/app_settings/shaders/class2/deferred/sunLightMSF.glsl b/indra/newview/app_settings/shaders/class2/deferred/sunLightMSF.glsl new file mode 100644 index 0000000000000000000000000000000000000000..63d13c996d4107ffebededace3462370cf5d4fff --- /dev/null +++ b/indra/newview/app_settings/shaders/class2/deferred/sunLightMSF.glsl @@ -0,0 +1,202 @@ +/** + * @file sunLightMSF.glsl + * + * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * $/LicenseInfo$ + */ + + + +#extension GL_ARB_texture_rectangle : enable +#extension GL_ARB_texture_multisample : enable + +//class 2, shadows, no SSAO + +uniform sampler2DMS depthMap; +uniform sampler2DMS normalMap; +uniform sampler2DRectShadow shadowMap0; +uniform sampler2DRectShadow shadowMap1; +uniform sampler2DRectShadow shadowMap2; +uniform sampler2DRectShadow shadowMap3; +uniform sampler2DShadow shadowMap4; +uniform sampler2DShadow shadowMap5; + + +// Inputs +uniform mat4 shadow_matrix[6]; +uniform vec4 shadow_clip; +uniform float ssao_radius; +uniform float ssao_max_radius; +uniform float ssao_factor; +uniform float ssao_factor_inv; + +varying vec2 vary_fragcoord; +varying vec4 vary_light; + +uniform mat4 inv_proj; +uniform vec2 screen_res; +uniform vec2 shadow_res; +uniform vec2 proj_shadow_res; + +uniform float shadow_bias; +uniform float shadow_offset; + +uniform float spot_shadow_bias; +uniform float spot_shadow_offset; + +vec4 getPosition(ivec2 pos_screen, int sample) +{ + float depth = texelFetch(depthMap, pos_screen.xy, sample).r; + vec2 sc = vec2(pos_screen.xy)*2.0; + sc /= screen_res; + sc -= vec2(1.0,1.0); + vec4 ndc = vec4(sc.x, sc.y, 2.0*depth-1.0, 1.0); + vec4 pos = inv_proj * ndc; + pos /= pos.w; + pos.w = 1.0; + return pos; +} + +float pcfShadow(sampler2DRectShadow shadowMap, vec4 stc, float scl) +{ + stc.xyz /= stc.w; + stc.z += shadow_bias*scl; + + float cs = shadow2DRect(shadowMap, stc.xyz).x; + float shadow = cs; + + shadow += max(shadow2DRect(shadowMap, stc.xyz+vec3(1.5, 1.5, 0.0)).x, cs); + shadow += max(shadow2DRect(shadowMap, stc.xyz+vec3(1.5, -1.5, 0.0)).x, cs); + shadow += max(shadow2DRect(shadowMap, stc.xyz+vec3(-1.5, 1.5, 0.0)).x, cs); + shadow += max(shadow2DRect(shadowMap, stc.xyz+vec3(-1.5, -1.5, 0.0)).x, cs); + + return shadow/5.0; + + //return shadow; +} + +float pcfShadow(sampler2DShadow shadowMap, vec4 stc, float scl) +{ + stc.xyz /= stc.w; + stc.z += spot_shadow_bias*scl; + + float cs = shadow2D(shadowMap, stc.xyz).x; + float shadow = cs; + + vec2 off = 1.5/proj_shadow_res; + + shadow += max(shadow2D(shadowMap, stc.xyz+vec3(off.x, off.y, 0.0)).x, cs); + shadow += max(shadow2D(shadowMap, stc.xyz+vec3(off.x, -off.y, 0.0)).x, cs); + shadow += max(shadow2D(shadowMap, stc.xyz+vec3(-off.x, off.y, 0.0)).x, cs); + shadow += max(shadow2D(shadowMap, stc.xyz+vec3(-off.x, -off.y, 0.0)).x, cs); + + return shadow/5.0; + + //return shadow; +} + +void main() +{ + vec2 pos_screen = vary_fragcoord.xy; + ivec2 itc = ivec2(pos_screen); + + //try doing an unproject here + + vec4 fcol = vec4(0,0,0,0); + + for (int i = 0; i < samples; i++) + { + vec4 pos = getPosition(itc, i); + + vec4 nmap4 = texelFetch(normalMap, itc, i); + nmap4 = vec4((nmap4.xy-0.5)*2.0,nmap4.z,nmap4.w); // unpack norm + float displace = nmap4.w; + vec3 norm = nmap4.xyz; + + /*if (pos.z == 0.0) // do nothing for sky *FIX: REMOVE THIS IF/WHEN THE POSITION MAP IS BEING USED AS A STENCIL + { + gl_FragColor = vec4(0.0); // doesn't matter + return; + }*/ + + float shadow = 1.0; + float dp_directional_light = max(0.0, dot(norm, vary_light.xyz)); + + vec3 shadow_pos = pos.xyz + displace*norm; + vec3 offset = vary_light.xyz * (1.0-dp_directional_light); + + vec4 spos = vec4(shadow_pos+offset*shadow_offset, 1.0); + + if (spos.z > -shadow_clip.w) + { + if (dp_directional_light == 0.0) + { + // if we know this point is facing away from the sun then we know it's in shadow without having to do a squirrelly shadow-map lookup + shadow = 0.0; + } + else + { + vec4 lpos; + + if (spos.z < -shadow_clip.z) + { + lpos = shadow_matrix[3]*spos; + lpos.xy *= shadow_res; + shadow = pcfShadow(shadowMap3, lpos, 0.25); + shadow += max((pos.z+shadow_clip.z)/(shadow_clip.z-shadow_clip.w)*2.0-1.0, 0.0); + } + else if (spos.z < -shadow_clip.y) + { + lpos = shadow_matrix[2]*spos; + lpos.xy *= shadow_res; + shadow = pcfShadow(shadowMap2, lpos, 0.5); + } + else if (spos.z < -shadow_clip.x) + { + lpos = shadow_matrix[1]*spos; + lpos.xy *= shadow_res; + shadow = pcfShadow(shadowMap1, lpos, 0.75); + } + else + { + lpos = shadow_matrix[0]*spos; + lpos.xy *= shadow_res; + shadow = pcfShadow(shadowMap0, lpos, 1.0); + } + + // take the most-shadowed value out of these two: + // * the blurred sun shadow in the light (shadow) map + // * an unblurred dot product between the sun and this norm + // the goal is to err on the side of most-shadow to fill-in shadow holes and reduce artifacting + shadow = min(shadow, dp_directional_light); + + //lpos.xy /= lpos.w*32.0; + //if (fract(lpos.x) < 0.1 || fract(lpos.y) < 0.1) + //{ + // shadow = 0.0; + //} + + } + } + else + { + // more distant than the shadow map covers + shadow = 1.0; + } + + fcol[0] += shadow; + fcol[1] += 1.0; + + spos = vec4(shadow_pos+norm*spot_shadow_offset, 1.0); + + //spotlight shadow 1 + vec4 lpos = shadow_matrix[4]*spos; + fcol[2] += pcfShadow(shadowMap4, lpos, 0.8); + + //spotlight shadow 2 + lpos = shadow_matrix[5]*spos; + fcol[3] += pcfShadow(shadowMap5, lpos, 0.8); + } + + gl_FragColor = fcol/samples; +} diff --git a/indra/newview/app_settings/shaders/class2/deferred/sunLightSSAOF.glsl b/indra/newview/app_settings/shaders/class2/deferred/sunLightSSAOF.glsl index 847b36b1ace5722cf0a4cdec723bc75b2549c177..d53850b489ca0c18763f0a7b839e46964085f1dd 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/sunLightSSAOF.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/sunLightSSAOF.glsl @@ -5,7 +5,7 @@ * $License$ */ -#version 120 + #extension GL_ARB_texture_rectangle : enable @@ -45,7 +45,7 @@ uniform float spot_shadow_offset; vec4 getPosition(vec2 pos_screen) { - float depth = texture2DRect(depthMap, pos_screen.xy).a; + float depth = texture2DRect(depthMap, pos_screen.xy).r; vec2 sc = pos_screen.xy*2.0; sc /= screen_res; sc -= vec2(1.0,1.0); @@ -234,7 +234,7 @@ void main() gl_FragColor[0] = shadow; gl_FragColor[1] = calcAmbientOcclusion(pos, norm); - spos.xyz = shadow_pos+offset*spot_shadow_offset; + spos.xyz = shadow_pos+norm*spot_shadow_offset; //spotlight shadow 1 vec4 lpos = shadow_matrix[4]*spos; diff --git a/indra/newview/app_settings/shaders/class2/deferred/sunLightSSAOMSF.glsl b/indra/newview/app_settings/shaders/class2/deferred/sunLightSSAOMSF.glsl new file mode 100644 index 0000000000000000000000000000000000000000..a2a76eed9fdd22ee8fa79178fd21ec8e7969fd49 --- /dev/null +++ b/indra/newview/app_settings/shaders/class2/deferred/sunLightSSAOMSF.glsl @@ -0,0 +1,241 @@ +/** + * @file sunLightSSAOF.glsl + * + * Copyright (c) 2007-$CurrentYear$, Linden Research, Inc. + * $License$ + */ + + + +#extension GL_ARB_texture_rectangle : enable +#extension GL_ARB_texture_multisample : enable + +//class 2 -- shadows and SSAO + +uniform sampler2DMS depthMap; +uniform sampler2DMS normalMap; +uniform sampler2DRectShadow shadowMap0; +uniform sampler2DRectShadow shadowMap1; +uniform sampler2DRectShadow shadowMap2; +uniform sampler2DRectShadow shadowMap3; +uniform sampler2DShadow shadowMap4; +uniform sampler2DShadow shadowMap5; +uniform sampler2D noiseMap; + +// Inputs +uniform mat4 shadow_matrix[6]; +uniform vec4 shadow_clip; +uniform float ssao_radius; +uniform float ssao_max_radius; +uniform float ssao_factor; +uniform float ssao_factor_inv; + +varying vec2 vary_fragcoord; +varying vec4 vary_light; + +uniform mat4 inv_proj; +uniform vec2 screen_res; +uniform vec2 shadow_res; +uniform vec2 proj_shadow_res; + +uniform float shadow_bias; +uniform float shadow_offset; + +uniform float spot_shadow_bias; +uniform float spot_shadow_offset; + +vec4 getPosition(ivec2 pos_screen, int sample) +{ + float depth = texelFetch(depthMap, pos_screen, sample).r; + vec2 sc = vec2(pos_screen.xy)*2.0; + sc /= screen_res; + sc -= vec2(1.0,1.0); + vec4 ndc = vec4(sc.x, sc.y, 2.0*depth-1.0, 1.0); + vec4 pos = inv_proj * ndc; + pos /= pos.w; + pos.w = 1.0; + return pos; +} + +//calculate decreases in ambient lighting when crowded out (SSAO) +float calcAmbientOcclusion(vec4 pos, vec3 norm, int sample) +{ + float ret = 1.0; + + vec2 kern[8]; + // exponentially (^2) distant occlusion samples spread around origin + kern[0] = vec2(-1.0, 0.0) * 0.125*0.125; + kern[1] = vec2(1.0, 0.0) * 0.250*0.250; + kern[2] = vec2(0.0, 1.0) * 0.375*0.375; + kern[3] = vec2(0.0, -1.0) * 0.500*0.500; + kern[4] = vec2(0.7071, 0.7071) * 0.625*0.625; + kern[5] = vec2(-0.7071, -0.7071) * 0.750*0.750; + kern[6] = vec2(-0.7071, 0.7071) * 0.875*0.875; + kern[7] = vec2(0.7071, -0.7071) * 1.000*1.000; + + vec2 pos_screen = vary_fragcoord.xy; + vec3 pos_world = pos.xyz; + vec2 noise_reflect = texture2D(noiseMap, vary_fragcoord.xy/128.0).xy; + + float angle_hidden = 0.0; + int points = 0; + + float scale = min(ssao_radius / -pos_world.z, ssao_max_radius); + + // it was found that keeping # of samples a constant was the fastest, probably due to compiler optimizations (unrolling?) + for (int i = 0; i < 8; i++) + { + ivec2 samppos_screen = ivec2(pos_screen + scale * reflect(kern[i], noise_reflect)); + vec3 samppos_world = getPosition(samppos_screen, sample).xyz; + + vec3 diff = pos_world - samppos_world; + float dist2 = dot(diff, diff); + + // assume each sample corresponds to an occluding sphere with constant radius, constant x-sectional area + // --> solid angle shrinking by the square of distance + //radius is somewhat arbitrary, can approx with just some constant k * 1 / dist^2 + //(k should vary inversely with # of samples, but this is taken care of later) + + angle_hidden = angle_hidden + float(dot((samppos_world - 0.05*norm - pos_world), norm) > 0.0) * min(1.0/dist2, ssao_factor_inv); + + // 'blocked' samples (significantly closer to camera relative to pos_world) are "no data", not "no occlusion" + points = points + int(diff.z > -1.0); + } + + angle_hidden = min(ssao_factor*angle_hidden/float(points), 1.0); + + ret = (1.0 - (float(points != 0) * angle_hidden)); + + return min(ret, 1.0); +} + +float pcfShadow(sampler2DRectShadow shadowMap, vec4 stc, float scl) +{ + stc.xyz /= stc.w; + stc.z += shadow_bias*scl; + + float cs = shadow2DRect(shadowMap, stc.xyz).x; + float shadow = cs; + + shadow += max(shadow2DRect(shadowMap, stc.xyz+vec3(1.5, 1.5, 0.0)).x, cs); + shadow += max(shadow2DRect(shadowMap, stc.xyz+vec3(1.5, -1.5, 0.0)).x, cs); + shadow += max(shadow2DRect(shadowMap, stc.xyz+vec3(-1.5, 1.5, 0.0)).x, cs); + shadow += max(shadow2DRect(shadowMap, stc.xyz+vec3(-1.5, -1.5, 0.0)).x, cs); + + return shadow/5.0; + + //return shadow; +} + +float pcfShadow(sampler2DShadow shadowMap, vec4 stc, float scl) +{ + stc.xyz /= stc.w; + stc.z += spot_shadow_bias*scl; + + float cs = shadow2D(shadowMap, stc.xyz).x; + float shadow = cs; + + vec2 off = 1.5/proj_shadow_res; + + shadow += max(shadow2D(shadowMap, stc.xyz+vec3(off.x, off.y, 0.0)).x, cs); + shadow += max(shadow2D(shadowMap, stc.xyz+vec3(off.x, -off.y, 0.0)).x, cs); + shadow += max(shadow2D(shadowMap, stc.xyz+vec3(-off.x, off.y, 0.0)).x, cs); + shadow += max(shadow2D(shadowMap, stc.xyz+vec3(-off.x, -off.y, 0.0)).x, cs); + + + return shadow/5.0; + + //return shadow; +} + +void main() +{ + vec2 pos_screen = vary_fragcoord.xy; + ivec2 itc = ivec2(pos_screen); + vec4 fcol = vec4(0,0,0,0); + + for (int i = 0; i < samples; i++) + { + vec4 pos = getPosition(itc, i); + + vec4 nmap4 = texelFetch(normalMap, itc, i); + nmap4 = vec4((nmap4.xy-0.5)*2.0,nmap4.z,nmap4.w); // unpack norm + float displace = nmap4.w; + vec3 norm = nmap4.xyz; + + float shadow = 1.0; + float dp_directional_light = max(0.0, dot(norm, vary_light.xyz)); + + vec3 shadow_pos = pos.xyz + displace*norm; + vec3 offset = vary_light.xyz * (1.0-dp_directional_light); + + vec4 spos = vec4(shadow_pos+offset*shadow_offset, 1.0); + + if (spos.z > -shadow_clip.w) + { + if (dp_directional_light == 0.0) + { + // if we know this point is facing away from the sun then we know it's in shadow without having to do a squirrelly shadow-map lookup + shadow = 0.0; + } + else + { + vec4 lpos; + + if (spos.z < -shadow_clip.z) + { + lpos = shadow_matrix[3]*spos; + lpos.xy *= shadow_res; + shadow = pcfShadow(shadowMap3, lpos, 0.25); + shadow += max((pos.z+shadow_clip.z)/(shadow_clip.z-shadow_clip.w)*2.0-1.0, 0.0); + } + else if (spos.z < -shadow_clip.y) + { + lpos = shadow_matrix[2]*spos; + lpos.xy *= shadow_res; + shadow = pcfShadow(shadowMap2, lpos, 0.5); + } + else if (spos.z < -shadow_clip.x) + { + lpos = shadow_matrix[1]*spos; + lpos.xy *= shadow_res; + shadow = pcfShadow(shadowMap1, lpos, 0.75); + } + else + { + lpos = shadow_matrix[0]*spos; + lpos.xy *= shadow_res; + shadow = pcfShadow(shadowMap0, lpos, 1.0); + } + + // take the most-shadowed value out of these two: + // * the blurred sun shadow in the light (shadow) map + // * an unblurred dot product between the sun and this norm + // the goal is to err on the side of most-shadow to fill-in shadow holes and reduce artifacting + shadow = min(shadow, dp_directional_light); + + } + } + else + { + // more distant than the shadow map covers + shadow = 1.0; + } + + + fcol[0] += shadow; + fcol[1] += calcAmbientOcclusion(pos, norm, i); + + spos.xyz = shadow_pos+offset*spot_shadow_offset; + + //spotlight shadow 1 + vec4 lpos = shadow_matrix[4]*spos; + fcol[2] += pcfShadow(shadowMap4, lpos, 0.8); + + //spotlight shadow 2 + lpos = shadow_matrix[5]*spos; + fcol[3] += pcfShadow(shadowMap5, lpos, 0.8); + } + + gl_FragColor = fcol / samples; +} diff --git a/indra/newview/app_settings/shaders/class2/deferred/sunLightV.glsl b/indra/newview/app_settings/shaders/class2/deferred/sunLightV.glsl index 9beb513ad8a63a129b231381cb010e69c58b9510..814deb3677ab6489c305175878b9b905911996b5 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/sunLightV.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/sunLightV.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + varying vec4 vary_light; varying vec2 vary_fragcoord; diff --git a/indra/newview/app_settings/shaders/class2/effects/blurF.glsl b/indra/newview/app_settings/shaders/class2/effects/blurF.glsl index a4ad0bfa15f1053bc0b8292cfb9c8eb26644ac0a..dff4d4a68f928986d7134688c019de3750db0185 100644 --- a/indra/newview/app_settings/shaders/class2/effects/blurF.glsl +++ b/indra/newview/app_settings/shaders/class2/effects/blurF.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + uniform sampler2DRect RenderTexture; uniform float bloomStrength; diff --git a/indra/newview/app_settings/shaders/class2/effects/blurV.glsl b/indra/newview/app_settings/shaders/class2/effects/blurV.glsl index d471a6c5e59582d536ad1d591462f7c683f3ad11..de469542f98cfec18c6332b5ee82fa75ec4c8ef6 100644 --- a/indra/newview/app_settings/shaders/class2/effects/blurV.glsl +++ b/indra/newview/app_settings/shaders/class2/effects/blurV.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + uniform vec2 texelSize; uniform vec2 blurDirection; diff --git a/indra/newview/app_settings/shaders/class2/effects/colorFilterF.glsl b/indra/newview/app_settings/shaders/class2/effects/colorFilterF.glsl index 66880b958e0c9b1d9e12f59a06b4225ab0d65e8c..8871bb3fc7da685c41206176ae0259443e124e85 100644 --- a/indra/newview/app_settings/shaders/class2/effects/colorFilterF.glsl +++ b/indra/newview/app_settings/shaders/class2/effects/colorFilterF.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + uniform sampler2DRect RenderTexture; uniform float brightness; diff --git a/indra/newview/app_settings/shaders/class2/effects/drawQuadV.glsl b/indra/newview/app_settings/shaders/class2/effects/drawQuadV.glsl index c35c500d62374029b3123963f81185bf44253c10..9c52b8dd5d45f6a926379fe8c0f8b5c04e544f0f 100644 --- a/indra/newview/app_settings/shaders/class2/effects/drawQuadV.glsl +++ b/indra/newview/app_settings/shaders/class2/effects/drawQuadV.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + void main(void) { diff --git a/indra/newview/app_settings/shaders/class2/effects/extractF.glsl b/indra/newview/app_settings/shaders/class2/effects/extractF.glsl index e77baa5bee115ea038138883aacb1c546ddea94a..713f8021de0c636f800e38fec0d8bacc8fc856b4 100644 --- a/indra/newview/app_settings/shaders/class2/effects/extractF.glsl +++ b/indra/newview/app_settings/shaders/class2/effects/extractF.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + uniform sampler2DRect RenderTexture; uniform float extractLow; diff --git a/indra/newview/app_settings/shaders/class2/effects/nightVisionF.glsl b/indra/newview/app_settings/shaders/class2/effects/nightVisionF.glsl index 8e0eec6f5e9a98c5727f73aa929832db345489d5..fd94b2e95f97a6b0d702ec3730d93bc5cef0bacf 100644 --- a/indra/newview/app_settings/shaders/class2/effects/nightVisionF.glsl +++ b/indra/newview/app_settings/shaders/class2/effects/nightVisionF.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + uniform sampler2DRect RenderTexture; uniform sampler2D NoiseTexture; diff --git a/indra/newview/app_settings/shaders/class2/effects/simpleF.glsl b/indra/newview/app_settings/shaders/class2/effects/simpleF.glsl index 98a50e22fc441d72aff3a2e87a77470bc1acc70b..a1a9c9716cc792b2e0f53b41896d16880f7bc613 100644 --- a/indra/newview/app_settings/shaders/class2/effects/simpleF.glsl +++ b/indra/newview/app_settings/shaders/class2/effects/simpleF.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + uniform sampler2DRect RenderTexture; diff --git a/indra/newview/app_settings/shaders/class2/environment/terrainF.glsl b/indra/newview/app_settings/shaders/class2/environment/terrainF.glsl index bbb8951f3a3e9d4cab7c98637195735f196421a3..9527dc469bab812a31ad26a74d7df4b86d52ebac 100644 --- a/indra/newview/app_settings/shaders/class2/environment/terrainF.glsl +++ b/indra/newview/app_settings/shaders/class2/environment/terrainF.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + uniform sampler2D detail_0; uniform sampler2D detail_1; diff --git a/indra/newview/app_settings/shaders/class2/environment/terrainV.glsl b/indra/newview/app_settings/shaders/class2/environment/terrainV.glsl index 84906c16bffd638afc6024c84d4c1bc2c43299c2..2658bee88da1296f48d0c607be49f4493f212d98 100644 --- a/indra/newview/app_settings/shaders/class2/environment/terrainV.glsl +++ b/indra/newview/app_settings/shaders/class2/environment/terrainV.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + void calcAtmospherics(vec3 inPositionEye); diff --git a/indra/newview/app_settings/shaders/class2/environment/terrainWaterF.glsl b/indra/newview/app_settings/shaders/class2/environment/terrainWaterF.glsl index 7590c542ef46cea4a5f3d901ab7809c4b5ebbd4d..974e227b77f1bfb7fd2a03ae560a4119e24543c0 100644 --- a/indra/newview/app_settings/shaders/class2/environment/terrainWaterF.glsl +++ b/indra/newview/app_settings/shaders/class2/environment/terrainWaterF.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + uniform sampler2D detail_0; uniform sampler2D detail_1; diff --git a/indra/newview/app_settings/shaders/class2/environment/underWaterF.glsl b/indra/newview/app_settings/shaders/class2/environment/underWaterF.glsl index 900f1a6cb83668b0ae79622e49861bfd969ae4e0..702e0881acd0d6bcc56cfacc8815e93f381389e1 100644 --- a/indra/newview/app_settings/shaders/class2/environment/underWaterF.glsl +++ b/indra/newview/app_settings/shaders/class2/environment/underWaterF.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + uniform sampler2D diffuseMap; uniform sampler2D bumpMap; diff --git a/indra/newview/app_settings/shaders/class2/environment/waterF.glsl b/indra/newview/app_settings/shaders/class2/environment/waterF.glsl index f4f6b6e90fa0bd80dd494a0482e14b25c7beffc8..c4e4bc08c5138c8cc4fc21687c57da95ddf3fa9e 100644 --- a/indra/newview/app_settings/shaders/class2/environment/waterF.glsl +++ b/indra/newview/app_settings/shaders/class2/environment/waterF.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + vec3 scaleSoftClip(vec3 inColor); vec3 atmosTransport(vec3 inColor); diff --git a/indra/newview/app_settings/shaders/class2/environment/waterFogF.glsl b/indra/newview/app_settings/shaders/class2/environment/waterFogF.glsl index 9f3328cbf0cfe9bb6d019fe20edb90fd899ee91b..b66b72b4015b3e6ce3e679686553c91289df3d2d 100644 --- a/indra/newview/app_settings/shaders/class2/environment/waterFogF.glsl +++ b/indra/newview/app_settings/shaders/class2/environment/waterFogF.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + uniform vec4 lightnorm; uniform vec4 waterPlane; diff --git a/indra/newview/app_settings/shaders/class2/lighting/lightF.glsl b/indra/newview/app_settings/shaders/class2/lighting/lightF.glsl index 342bc2ab6673aaea1d76832502645140401d874e..4c31602736ca019e230c0b17f40b4d56ffe4e47e 100644 --- a/indra/newview/app_settings/shaders/class2/lighting/lightF.glsl +++ b/indra/newview/app_settings/shaders/class2/lighting/lightF.glsl @@ -5,16 +5,14 @@ * $/LicenseInfo$ */ -#version 120 -uniform sampler2D diffuseMap; vec3 atmosLighting(vec3 light); vec3 scaleSoftClip(vec3 light); void default_lighting() { - vec4 color = texture2D(diffuseMap, gl_TexCoord[0].xy) * gl_Color; + vec4 color = diffuseLookup(gl_TexCoord[0].xy) * gl_Color; color.rgb = atmosLighting(color.rgb); diff --git a/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightF.glsl b/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightF.glsl index dad18b588383139379889a453e207972cc1be2e2..95bd052b5d4e2810b7e7871adf9c48fba44d8b57 100644 --- a/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightF.glsl +++ b/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightF.glsl @@ -5,16 +5,14 @@ * $/LicenseInfo$ */ -#version 120 -uniform sampler2D diffuseMap; vec3 fullbrightAtmosTransport(vec3 light); vec3 fullbrightScaleSoftClip(vec3 light); void fullbright_lighting() { - vec4 color = texture2D(diffuseMap, gl_TexCoord[0].xy) * gl_Color; + vec4 color = diffuseLookup(gl_TexCoord[0].xy) * gl_Color; color.rgb = fullbrightAtmosTransport(color.rgb); diff --git a/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightNonIndexedF.glsl b/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightNonIndexedF.glsl new file mode 100644 index 0000000000000000000000000000000000000000..b1e61e1a33afdac4da5f633dc15405489d87e3d7 --- /dev/null +++ b/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightNonIndexedF.glsl @@ -0,0 +1,25 @@ +/** + * @file lightFullbrightF.glsl + * + * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * $/LicenseInfo$ + */ + + + +vec3 fullbrightAtmosTransport(vec3 light); +vec3 fullbrightScaleSoftClip(vec3 light); + +uniform sampler2D diffuseMap; + +void fullbright_lighting() +{ + vec4 color = texture2D(diffuseMap,gl_TexCoord[0].xy) * gl_Color; + + color.rgb = fullbrightAtmosTransport(color.rgb); + + color.rgb = fullbrightScaleSoftClip(color.rgb); + + gl_FragColor = color; +} + diff --git a/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightShinyF.glsl b/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightShinyF.glsl index 73ff81e03a6ffdb2865356b48efde11a54136ae4..26f0ea84e06286e48c6f57f5b7326e0485887722 100644 --- a/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightShinyF.glsl +++ b/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightShinyF.glsl @@ -5,9 +5,8 @@ * $/LicenseInfo$ */ -#version 120 -uniform sampler2D diffuseMap; + uniform samplerCube environmentMap; vec3 fullbrightShinyAtmosTransport(vec3 light); @@ -15,7 +14,7 @@ vec3 fullbrightScaleSoftClip(vec3 light); void fullbright_shiny_lighting() { - vec4 color = texture2D(diffuseMap, gl_TexCoord[0].xy); + vec4 color = diffuseLookup(gl_TexCoord[0].xy); color.rgb *= gl_Color.rgb; vec3 envColor = textureCube(environmentMap, gl_TexCoord[1].xyz).rgb; diff --git a/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightShinyNonIndexedF.glsl b/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightShinyNonIndexedF.glsl new file mode 100644 index 0000000000000000000000000000000000000000..953298da0dae05b25b27971bae4783b02e3d80ab --- /dev/null +++ b/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightShinyNonIndexedF.glsl @@ -0,0 +1,32 @@ +/** + * @file lightFullbrightShinyF.glsl + * + * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * $/LicenseInfo$ + */ + + + +uniform samplerCube environmentMap; +uniform sampler2D diffuseMap; + +vec3 fullbrightShinyAtmosTransport(vec3 light); +vec3 fullbrightScaleSoftClip(vec3 light); + +void fullbright_shiny_lighting() +{ + vec4 color = texture2D(diffuseMap, gl_TexCoord[0].xy); + color.rgb *= gl_Color.rgb; + + vec3 envColor = textureCube(environmentMap, gl_TexCoord[1].xyz).rgb; + color.rgb = mix(color.rgb, envColor.rgb, gl_Color.a); + + color.rgb = fullbrightShinyAtmosTransport(color.rgb); + + color.rgb = fullbrightScaleSoftClip(color.rgb); + + color.a = max(color.a, gl_Color.a); + + gl_FragColor = color; +} + diff --git a/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightShinyWaterF.glsl b/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightShinyWaterF.glsl index 9b4b58436990b10e00a82b031fbcdbc0c061e7f1..a6e10a249d677109dc468ac3139cb88f94acb8cf 100644 --- a/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightShinyWaterF.glsl +++ b/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightShinyWaterF.glsl @@ -5,9 +5,9 @@ * $License$ */ -#version 120 -uniform sampler2D diffuseMap; + + uniform samplerCube environmentMap; vec3 fullbrightShinyAtmosTransport(vec3 light); @@ -16,7 +16,7 @@ vec4 applyWaterFog(vec4 color); void fullbright_shiny_lighting_water() { - vec4 color = texture2D(diffuseMap, gl_TexCoord[0].xy); + vec4 color = diffuseLookup(gl_TexCoord[0].xy); color.rgb *= gl_Color.rgb; vec3 envColor = textureCube(environmentMap, gl_TexCoord[1].xyz).rgb; diff --git a/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightShinyWaterNonIndexedF.glsl b/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightShinyWaterNonIndexedF.glsl new file mode 100644 index 0000000000000000000000000000000000000000..b4bb665a2b1b3f3ba4fdad8c920193c4138b9656 --- /dev/null +++ b/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightShinyWaterNonIndexedF.glsl @@ -0,0 +1,32 @@ +/** + * @file lightFullbrightShinyWaterF.glsl + * + * Copyright (c) 2007-$CurrentYear$, Linden Research, Inc. + * $License$ + */ + + + + +uniform samplerCube environmentMap; +uniform sampler2D diffuseMap; + +vec3 fullbrightShinyAtmosTransport(vec3 light); +vec3 fullbrightScaleSoftClip(vec3 light); +vec4 applyWaterFog(vec4 color); + +void fullbright_shiny_lighting_water() +{ + vec4 color = texture2D(diffuseMap,gl_TexCoord[0].xy); + color.rgb *= gl_Color.rgb; + + vec3 envColor = textureCube(environmentMap, gl_TexCoord[1].xyz).rgb; + color.rgb = mix(color.rgb, envColor.rgb, gl_Color.a); + + color.rgb = fullbrightShinyAtmosTransport(color.rgb); + color.rgb = fullbrightScaleSoftClip(color.rgb); + color.a = max(color.a, gl_Color.a); + + gl_FragColor = applyWaterFog(color); +} + diff --git a/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightWaterF.glsl b/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightWaterF.glsl index 3d46c8d8744271a0a07e9ebfa2bc01a8a1f0bb5e..887d4130e70cd64962e64f7753c653e1a0f706c6 100644 --- a/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightWaterF.glsl +++ b/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightWaterF.glsl @@ -5,16 +5,16 @@ * $/LicenseInfo$ */ -#version 120 -uniform sampler2D diffuseMap; + +vec4 diffuseLookup(vec2 texcoord); vec3 fullbrightAtmosTransport(vec3 light); vec4 applyWaterFog(vec4 color); void fullbright_lighting_water() { - vec4 color = texture2D(diffuseMap, gl_TexCoord[0].xy) * gl_Color; + vec4 color = diffuseLookup(gl_TexCoord[0].xy) * gl_Color; color.rgb = fullbrightAtmosTransport(color.rgb); diff --git a/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightWaterNonIndexedF.glsl b/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightWaterNonIndexedF.glsl new file mode 100644 index 0000000000000000000000000000000000000000..1234682ae978b9d29e6b1d682af2d69e77810da7 --- /dev/null +++ b/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightWaterNonIndexedF.glsl @@ -0,0 +1,23 @@ +/** + * @file lightFullbrightWaterF.glsl + * + * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * $/LicenseInfo$ + */ + + + +uniform sampler2D diffuseMap; + +vec3 fullbrightAtmosTransport(vec3 light); +vec4 applyWaterFog(vec4 color); + +void fullbright_lighting_water() +{ + vec4 color = texture2D(diffuseMap, gl_TexCoord[0].xy) * gl_Color; + + color.rgb = fullbrightAtmosTransport(color.rgb); + + gl_FragColor = applyWaterFog(color); +} + diff --git a/indra/newview/app_settings/shaders/class2/lighting/lightNonIndexedF.glsl b/indra/newview/app_settings/shaders/class2/lighting/lightNonIndexedF.glsl new file mode 100644 index 0000000000000000000000000000000000000000..149cf791f57f0a6c2e81529e19b12386afd3609c --- /dev/null +++ b/indra/newview/app_settings/shaders/class2/lighting/lightNonIndexedF.glsl @@ -0,0 +1,25 @@ +/** + * @file lightF.glsl + * + * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * $/LicenseInfo$ + */ + + + +uniform sampler2D diffuseMap; + +vec3 atmosLighting(vec3 light); +vec3 scaleSoftClip(vec3 light); + +void default_lighting() +{ + vec4 color = texture2D(diffuseMap,gl_TexCoord[0].xy) * gl_Color; + + color.rgb = atmosLighting(color.rgb); + + color.rgb = scaleSoftClip(color.rgb); + + gl_FragColor = color; +} + diff --git a/indra/newview/app_settings/shaders/class2/lighting/lightShinyF.glsl b/indra/newview/app_settings/shaders/class2/lighting/lightShinyF.glsl index ebe21320b43f8a8118623dae5bd7ba8f2fb5e9e9..300fcac0924251f8b30cc7313c205b6211430bc3 100644 --- a/indra/newview/app_settings/shaders/class2/lighting/lightShinyF.glsl +++ b/indra/newview/app_settings/shaders/class2/lighting/lightShinyF.glsl @@ -5,9 +5,9 @@ * $/LicenseInfo$ */ -#version 120 -uniform sampler2D diffuseMap; + + uniform samplerCube environmentMap; vec3 scaleSoftClip(vec3 light); @@ -16,7 +16,7 @@ vec4 applyWaterFog(vec4 color); void shiny_lighting() { - vec4 color = texture2D(diffuseMap, gl_TexCoord[0].xy); + vec4 color = diffuseLookup(gl_TexCoord[0].xy); color.rgb *= gl_Color.rgb; vec3 envColor = textureCube(environmentMap, gl_TexCoord[1].xyz).rgb; diff --git a/indra/newview/app_settings/shaders/class2/lighting/lightShinyNonIndexedF.glsl b/indra/newview/app_settings/shaders/class2/lighting/lightShinyNonIndexedF.glsl new file mode 100644 index 0000000000000000000000000000000000000000..e877c0abb122744c2e161c60a2a65ed1fc7dfa8b --- /dev/null +++ b/indra/newview/app_settings/shaders/class2/lighting/lightShinyNonIndexedF.glsl @@ -0,0 +1,32 @@ +/** + * @file lightShinyF.glsl + * + * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * $/LicenseInfo$ + */ + + + + +uniform samplerCube environmentMap; +uniform sampler2D diffuseMap; + +vec3 scaleSoftClip(vec3 light); +vec3 atmosLighting(vec3 light); +vec4 applyWaterFog(vec4 color); + +void shiny_lighting() +{ + vec4 color = texture2D(diffuseMap,gl_TexCoord[0].xy); + color.rgb *= gl_Color.rgb; + + vec3 envColor = textureCube(environmentMap, gl_TexCoord[1].xyz).rgb; + color.rgb = mix(color.rgb, envColor.rgb, gl_Color.a); + + color.rgb = atmosLighting(color.rgb); + + color.rgb = scaleSoftClip(color.rgb); + color.a = max(color.a, gl_Color.a); + gl_FragColor = color; +} + diff --git a/indra/newview/app_settings/shaders/class2/lighting/lightShinyWaterF.glsl b/indra/newview/app_settings/shaders/class2/lighting/lightShinyWaterF.glsl index 7f48e2cf1d5ec1c5ed586b4101fb5b385545e451..07572fa91542e66acbbb95ba95aa3fd06ab68269 100644 --- a/indra/newview/app_settings/shaders/class2/lighting/lightShinyWaterF.glsl +++ b/indra/newview/app_settings/shaders/class2/lighting/lightShinyWaterF.glsl @@ -5,10 +5,9 @@ * $/LicenseInfo$ */ -#version 120 -uniform sampler2D diffuseMap; + uniform samplerCube environmentMap; vec3 atmosLighting(vec3 light); @@ -16,7 +15,7 @@ vec4 applyWaterFog(vec4 color); void shiny_lighting_water() { - vec4 color = texture2D(diffuseMap, gl_TexCoord[0].xy); + vec4 color = diffuseLookup(gl_TexCoord[0].xy); color.rgb *= gl_Color.rgb; vec3 envColor = textureCube(environmentMap, gl_TexCoord[1].xyz).rgb; diff --git a/indra/newview/app_settings/shaders/class2/lighting/lightShinyWaterNonIndexedF.glsl b/indra/newview/app_settings/shaders/class2/lighting/lightShinyWaterNonIndexedF.glsl new file mode 100644 index 0000000000000000000000000000000000000000..39041794272c65914cc1b587584a09abc4839aef --- /dev/null +++ b/indra/newview/app_settings/shaders/class2/lighting/lightShinyWaterNonIndexedF.glsl @@ -0,0 +1,29 @@ +/** + * @file lightShinyWaterF.glsl + * + * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * $/LicenseInfo$ + */ + + + + +uniform sampler2D diffuseMap; +uniform samplerCube environmentMap; + +vec3 atmosLighting(vec3 light); +vec4 applyWaterFog(vec4 color); + +void shiny_lighting_water() +{ + vec4 color = texture2D(diffuseMap,gl_TexCoord[0].xy); + color.rgb *= gl_Color.rgb; + + vec3 envColor = textureCube(environmentMap, gl_TexCoord[1].xyz).rgb; + color.rgb = mix(color.rgb, envColor.rgb, gl_Color.a); + + color.rgb = atmosLighting(color.rgb); + color.a = max(color.a, gl_Color.a); + gl_FragColor = applyWaterFog(color); +} + diff --git a/indra/newview/app_settings/shaders/class2/lighting/lightSpecularV.glsl b/indra/newview/app_settings/shaders/class2/lighting/lightSpecularV.glsl index ad1dc4da77e17a34c9830f60566770f31cac6a64..3384f64d07a4d293f27e927d251a73e2f04188ec 100644 --- a/indra/newview/app_settings/shaders/class2/lighting/lightSpecularV.glsl +++ b/indra/newview/app_settings/shaders/class2/lighting/lightSpecularV.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + // All lights, no specular highlights diff --git a/indra/newview/app_settings/shaders/class2/lighting/lightV.glsl b/indra/newview/app_settings/shaders/class2/lighting/lightV.glsl index a0f6e019ef12c4779a770c65553db3b44e2a0799..10c770fcc240abc6dd2780fa777e6f67a5f10f66 100644 --- a/indra/newview/app_settings/shaders/class2/lighting/lightV.glsl +++ b/indra/newview/app_settings/shaders/class2/lighting/lightV.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + // All lights, no specular highlights diff --git a/indra/newview/app_settings/shaders/class2/lighting/lightWaterF.glsl b/indra/newview/app_settings/shaders/class2/lighting/lightWaterF.glsl index 97eba92d7b51f463f0e6cd877eb3ed6950855fad..61341a9f1fb08adbf05cbdcd49ff023625898a70 100644 --- a/indra/newview/app_settings/shaders/class2/lighting/lightWaterF.glsl +++ b/indra/newview/app_settings/shaders/class2/lighting/lightWaterF.glsl @@ -5,16 +5,14 @@ * $/LicenseInfo$ */ -#version 120 -uniform sampler2D diffuseMap; vec3 atmosLighting(vec3 light); vec4 applyWaterFog(vec4 color); void default_lighting_water() { - vec4 color = texture2D(diffuseMap, gl_TexCoord[0].xy) * gl_Color; + vec4 color = diffuseLookup(gl_TexCoord[0].xy) * gl_Color; color.rgb = atmosLighting(color.rgb); diff --git a/indra/newview/app_settings/shaders/class2/lighting/lightWaterNonIndexedF.glsl b/indra/newview/app_settings/shaders/class2/lighting/lightWaterNonIndexedF.glsl new file mode 100644 index 0000000000000000000000000000000000000000..ba850b61d0b0bd5b6e05dc52bc14fe32756844f9 --- /dev/null +++ b/indra/newview/app_settings/shaders/class2/lighting/lightWaterNonIndexedF.glsl @@ -0,0 +1,23 @@ +/** + * @file lightWaterF.glsl + * + * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * $/LicenseInfo$ + */ + + + +uniform sampler2D diffuseMap; + +vec3 atmosLighting(vec3 light); +vec4 applyWaterFog(vec4 color); + +void default_lighting_water() +{ + vec4 color = texture2D(diffuseMap,gl_TexCoord[0].xy) * gl_Color; + + color.rgb = atmosLighting(color.rgb); + + gl_FragColor = applyWaterFog(color); +} + diff --git a/indra/newview/app_settings/shaders/class2/lighting/sumLightsSpecularV.glsl b/indra/newview/app_settings/shaders/class2/lighting/sumLightsSpecularV.glsl index fde32ed0358f55c07f8124454c3086f775bb5cd8..8df2e6f222baab4182815ca31545350f60f3d6cc 100644 --- a/indra/newview/app_settings/shaders/class2/lighting/sumLightsSpecularV.glsl +++ b/indra/newview/app_settings/shaders/class2/lighting/sumLightsSpecularV.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + float calcDirectionalLightSpecular(inout vec4 specular, vec3 view, vec3 n, vec3 l, vec3 lightCol, float da); vec3 calcPointLightSpecular(inout vec4 specular, vec3 view, vec3 v, vec3 n, vec3 l, float r, float pw, vec3 lightCol); diff --git a/indra/newview/app_settings/shaders/class2/lighting/sumLightsV.glsl b/indra/newview/app_settings/shaders/class2/lighting/sumLightsV.glsl index 8fe49e3be026cebf056e9d6968361346abdd1465..3d43a1813a53f4329751bc760b0305f93e024d6e 100644 --- a/indra/newview/app_settings/shaders/class2/lighting/sumLightsV.glsl +++ b/indra/newview/app_settings/shaders/class2/lighting/sumLightsV.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + float calcDirectionalLight(vec3 n, vec3 l); float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float is_pointlight); diff --git a/indra/newview/app_settings/shaders/class2/objects/fullbrightShinyV.glsl b/indra/newview/app_settings/shaders/class2/objects/fullbrightShinyV.glsl new file mode 100644 index 0000000000000000000000000000000000000000..f49e74406fd19c5490849e7b3f731acfdd04df36 --- /dev/null +++ b/indra/newview/app_settings/shaders/class2/objects/fullbrightShinyV.glsl @@ -0,0 +1,35 @@ +/** + * @file fullbrightShinyV.glsl + * + * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * $/LicenseInfo$ + */ + + + +void calcAtmospherics(vec3 inPositionEye); + +uniform vec4 origin; + +varying float vary_texture_index; + +void main() +{ + //transform vertex + vec4 vert = vec4(gl_Vertex.xyz,1.0); + vary_texture_index = gl_Vertex.w; + gl_Position = gl_ModelViewProjectionMatrix*vert; + + vec4 pos = (gl_ModelViewMatrix * vert); + vec3 norm = normalize(gl_NormalMatrix * gl_Normal); + vec3 ref = reflect(pos.xyz, -norm); + + gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0; + gl_TexCoord[1] = gl_TextureMatrix[1]*vec4(ref,1.0); + + calcAtmospherics(pos.xyz); + + gl_FrontColor = gl_Color; + + gl_FogFragCoord = pos.z; +} diff --git a/indra/newview/app_settings/shaders/class2/objects/fullbrightV.glsl b/indra/newview/app_settings/shaders/class2/objects/fullbrightV.glsl new file mode 100644 index 0000000000000000000000000000000000000000..3076fa3260035ddd247467927c02fbfe9af19794 --- /dev/null +++ b/indra/newview/app_settings/shaders/class2/objects/fullbrightV.glsl @@ -0,0 +1,29 @@ +/** + * @file fullbrightV.glsl + * + * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * $/LicenseInfo$ + */ + + + +void calcAtmospherics(vec3 inPositionEye); + +varying float vary_texture_index; + +void main() +{ + //transform vertex + vec4 vert = vec4(gl_Vertex.xyz,1.0); + vary_texture_index = gl_Vertex.w; + gl_Position = gl_ModelViewProjectionMatrix*vert; + gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0; + + vec4 pos = (gl_ModelViewMatrix * vert); + + calcAtmospherics(pos.xyz); + + gl_FrontColor = gl_Color; + + gl_FogFragCoord = pos.z; +} diff --git a/indra/newview/app_settings/shaders/class2/objects/shinyV.glsl b/indra/newview/app_settings/shaders/class2/objects/shinyV.glsl index 4cebb06df080e8b289cccaee534789d54d7177aa..49992d353555757efe783be2a3f641dd0b078e17 100644 --- a/indra/newview/app_settings/shaders/class2/objects/shinyV.glsl +++ b/indra/newview/app_settings/shaders/class2/objects/shinyV.glsl @@ -5,20 +5,24 @@ * $/LicenseInfo$ */ -#version 120 + vec4 calcLighting(vec3 pos, vec3 norm, vec4 color, vec4 baseCol); void calcAtmospherics(vec3 inPositionEye); +varying float vary_texture_index; + uniform vec4 origin; void main() { //transform vertex - gl_Position = ftransform(); + vec4 vert = vec4(gl_Vertex.xyz,1.0); + vary_texture_index = gl_Vertex.w; + gl_Position = gl_ModelViewProjectionMatrix*vert; - vec4 pos = (gl_ModelViewMatrix * gl_Vertex); + vec4 pos = (gl_ModelViewMatrix * vert); vec3 norm = normalize(gl_NormalMatrix * gl_Normal); vec3 ref = reflect(pos.xyz, -norm); diff --git a/indra/newview/app_settings/shaders/class2/objects/simpleV.glsl b/indra/newview/app_settings/shaders/class2/objects/simpleV.glsl new file mode 100644 index 0000000000000000000000000000000000000000..5e02391767fefedd416b6fb0a0cd69ae0aaedb68 --- /dev/null +++ b/indra/newview/app_settings/shaders/class2/objects/simpleV.glsl @@ -0,0 +1,33 @@ +/** + * @file simpleV.glsl + * + * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * $/LicenseInfo$ + */ + + + +vec4 calcLighting(vec3 pos, vec3 norm, vec4 color, vec4 baseCol); +void calcAtmospherics(vec3 inPositionEye); + +varying float vary_texture_index; + +void main() +{ + //transform vertex + vec4 vert = vec4(gl_Vertex.xyz,1.0); + vary_texture_index = gl_Vertex.w; + gl_Position = gl_ModelViewProjectionMatrix*vert; + gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0; + + vec4 pos = (gl_ModelViewMatrix * vert); + + vec3 norm = normalize(gl_NormalMatrix * gl_Normal); + + calcAtmospherics(pos.xyz); + + vec4 color = calcLighting(pos.xyz, norm, gl_Color, vec4(0.)); + gl_FrontColor = color; + + gl_FogFragCoord = pos.z; +} diff --git a/indra/newview/app_settings/shaders/class2/windlight/atmosphericsF.glsl b/indra/newview/app_settings/shaders/class2/windlight/atmosphericsF.glsl index 77d15fba9a938989469fcbbf151e0b5f76203f61..21a0812c1b5ce1bd269bf8701c81ccd26ad9351e 100644 --- a/indra/newview/app_settings/shaders/class2/windlight/atmosphericsF.glsl +++ b/indra/newview/app_settings/shaders/class2/windlight/atmosphericsF.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + ////////////////////////////////////////////////////////// // The fragment shader for the terrain atmospherics diff --git a/indra/newview/app_settings/shaders/class2/windlight/atmosphericsHelpersV.glsl b/indra/newview/app_settings/shaders/class2/windlight/atmosphericsHelpersV.glsl index 8c5b864cbef69e49d0e0c71571ebcbcedbd0ac3c..ab4cf4806d36397ba9ebf6d5935f10f635915620 100644 --- a/indra/newview/app_settings/shaders/class2/windlight/atmosphericsHelpersV.glsl +++ b/indra/newview/app_settings/shaders/class2/windlight/atmosphericsHelpersV.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + // Output variables vec3 getSunlitColor(); diff --git a/indra/newview/app_settings/shaders/class2/windlight/atmosphericsV.glsl b/indra/newview/app_settings/shaders/class2/windlight/atmosphericsV.glsl index 8d365c15caf4fedb58ee369ee58a83462703995d..b61b0bb3966db2dd191aec85c47f54254327f2b1 100644 --- a/indra/newview/app_settings/shaders/class2/windlight/atmosphericsV.glsl +++ b/indra/newview/app_settings/shaders/class2/windlight/atmosphericsV.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + // varying param funcs void setSunlitColor(vec3 v); diff --git a/indra/newview/app_settings/shaders/class2/windlight/atmosphericsVarsF.glsl b/indra/newview/app_settings/shaders/class2/windlight/atmosphericsVarsF.glsl index cf9ef306324b1565d17e61496bce1b0da47e7f2c..3a6585bb330bb6c1c8d0c99f960adb1b4c2f7a24 100644 --- a/indra/newview/app_settings/shaders/class2/windlight/atmosphericsVarsF.glsl +++ b/indra/newview/app_settings/shaders/class2/windlight/atmosphericsVarsF.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + varying vec3 vary_PositionEye; diff --git a/indra/newview/app_settings/shaders/class2/windlight/atmosphericsVarsV.glsl b/indra/newview/app_settings/shaders/class2/windlight/atmosphericsVarsV.glsl index 398f1556a06925a21a2e18e15ad8a120af7573ca..0f6e231ca6988c85d0bec99f3cab73242cc4e35a 100644 --- a/indra/newview/app_settings/shaders/class2/windlight/atmosphericsVarsV.glsl +++ b/indra/newview/app_settings/shaders/class2/windlight/atmosphericsVarsV.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + varying vec3 vary_PositionEye; diff --git a/indra/newview/app_settings/shaders/class2/windlight/cloudsF.glsl b/indra/newview/app_settings/shaders/class2/windlight/cloudsF.glsl index 13207997b2f88b2f91842bec4a15a98ddb115804..20f907a006215a630ce250a039974dcda03a6f7d 100644 --- a/indra/newview/app_settings/shaders/class2/windlight/cloudsF.glsl +++ b/indra/newview/app_settings/shaders/class2/windlight/cloudsF.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + ///////////////////////////////////////////////////////////////////////// // The fragment shader for the sky diff --git a/indra/newview/app_settings/shaders/class2/windlight/cloudsV.glsl b/indra/newview/app_settings/shaders/class2/windlight/cloudsV.glsl index 267ef36d4db63e6666d8cbf17a561546497d3eec..3eac63076c19119a7e0f78e4c0d68f20e2dcf26e 100644 --- a/indra/newview/app_settings/shaders/class2/windlight/cloudsV.glsl +++ b/indra/newview/app_settings/shaders/class2/windlight/cloudsV.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + ////////////////////////////////////////////////////////////////////////// // The vertex shader for creating the atmospheric sky diff --git a/indra/newview/app_settings/shaders/class2/windlight/gammaF.glsl b/indra/newview/app_settings/shaders/class2/windlight/gammaF.glsl index a658edd21f82d539bf9235fa27ddd41dc5275459..6570dcb6081d0f95fd6f2f107d01842cd39ce56b 100644 --- a/indra/newview/app_settings/shaders/class2/windlight/gammaF.glsl +++ b/indra/newview/app_settings/shaders/class2/windlight/gammaF.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + uniform vec4 gamma; diff --git a/indra/newview/app_settings/shaders/class2/windlight/skyF.glsl b/indra/newview/app_settings/shaders/class2/windlight/skyF.glsl index 77ca4868a68a81eeeee79cece7cddddfe2cfd004..d14c638130172c95807e6821a5691170f3277ced 100644 --- a/indra/newview/app_settings/shaders/class2/windlight/skyF.glsl +++ b/indra/newview/app_settings/shaders/class2/windlight/skyF.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + ///////////////////////////////////////////////////////////////////////// // The fragment shader for the sky diff --git a/indra/newview/app_settings/shaders/class2/windlight/skyV.glsl b/indra/newview/app_settings/shaders/class2/windlight/skyV.glsl index 03bca8f27e2e2ec9c45cbb4386be0ee70fefc416..1ea00f723afcab0ed9f5f746f194f1ab2e5e7dde 100644 --- a/indra/newview/app_settings/shaders/class2/windlight/skyV.glsl +++ b/indra/newview/app_settings/shaders/class2/windlight/skyV.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + // SKY //////////////////////////////////////////////////////////////////////// // The vertex shader for creating the atmospheric sky diff --git a/indra/newview/app_settings/shaders/class2/windlight/transportF.glsl b/indra/newview/app_settings/shaders/class2/windlight/transportF.glsl index 7f1ad4d5b4d31efb498056e130b7b6aacf6ead14..28381482c135df9b91875775191f2279a1dae708 100644 --- a/indra/newview/app_settings/shaders/class2/windlight/transportF.glsl +++ b/indra/newview/app_settings/shaders/class2/windlight/transportF.glsl @@ -5,8 +5,6 @@ * $/LicenseInfo$ */ -#version 120 - ////////////////////////////////////////////////////////// // The fragment shader for the terrain atmospherics ////////////////////////////////////////////////////////// diff --git a/indra/newview/app_settings/shaders/class3/avatar/avatarV.glsl b/indra/newview/app_settings/shaders/class3/avatar/avatarV.glsl index a003e2a1f10e521eaee6a9188bf5a0a69cc61ddc..3d970d252c6e581b9fbe879fcd8f434df8077337 100644 --- a/indra/newview/app_settings/shaders/class3/avatar/avatarV.glsl +++ b/indra/newview/app_settings/shaders/class3/avatar/avatarV.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + vec4 calcLighting(vec3 pos, vec3 norm, vec4 color, vec4 baseCol); mat4 getSkinnedTransform(); diff --git a/indra/newview/app_settings/shaders/class3/deferred/giDownsampleF.glsl b/indra/newview/app_settings/shaders/class3/deferred/giDownsampleF.glsl index fc370ef367c3f60319f84c0027c5ecb4bf6cf77b..498fee7c66ba3ab9495afb273425a84cc1ac43e6 100644 --- a/indra/newview/app_settings/shaders/class3/deferred/giDownsampleF.glsl +++ b/indra/newview/app_settings/shaders/class3/deferred/giDownsampleF.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + uniform sampler2DRect giLightMap; diff --git a/indra/newview/app_settings/shaders/class3/deferred/giDownsampleV.glsl b/indra/newview/app_settings/shaders/class3/deferred/giDownsampleV.glsl index ae57227fe528b03b5e2a0d216c9a8b97a5ddfb39..eebe930666a60742bb73b063f384b32d99d4f726 100644 --- a/indra/newview/app_settings/shaders/class3/deferred/giDownsampleV.glsl +++ b/indra/newview/app_settings/shaders/class3/deferred/giDownsampleV.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + varying vec2 vary_fragcoord; uniform vec2 screen_res; diff --git a/indra/newview/app_settings/shaders/class3/deferred/giF.glsl b/indra/newview/app_settings/shaders/class3/deferred/giF.glsl index 951e3e97aefc88dee9408e01aad35d701c24d2d5..9896f8dafecbe6438ffc12486fcbdb0a57222477 100644 --- a/indra/newview/app_settings/shaders/class3/deferred/giF.glsl +++ b/indra/newview/app_settings/shaders/class3/deferred/giF.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + #extension GL_ARB_texture_rectangle : enable diff --git a/indra/newview/app_settings/shaders/class3/deferred/giFinalF.glsl b/indra/newview/app_settings/shaders/class3/deferred/giFinalF.glsl index b2f8b2c6338b207c23270e896d50a87f58f6a619..df4c6b3e0a4af0488db7fc977b767b11930a28b8 100644 --- a/indra/newview/app_settings/shaders/class3/deferred/giFinalF.glsl +++ b/indra/newview/app_settings/shaders/class3/deferred/giFinalF.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + #extension GL_ARB_texture_rectangle : enable diff --git a/indra/newview/app_settings/shaders/class3/deferred/giFinalV.glsl b/indra/newview/app_settings/shaders/class3/deferred/giFinalV.glsl index 19c4e07b8b8dffa2791280efcf370e0940e5e306..7e20d71529ea52671fd1a19d10134e93f15adde0 100644 --- a/indra/newview/app_settings/shaders/class3/deferred/giFinalV.glsl +++ b/indra/newview/app_settings/shaders/class3/deferred/giFinalV.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + varying vec2 vary_fragcoord; uniform vec2 screen_res; diff --git a/indra/newview/app_settings/shaders/class3/deferred/giV.glsl b/indra/newview/app_settings/shaders/class3/deferred/giV.glsl index 8dc1410ea5ad90d05d8bad4c485238550fd4cdd7..e86f2896da5fbc006f817a4f03a256599a7a69e3 100644 --- a/indra/newview/app_settings/shaders/class3/deferred/giV.glsl +++ b/indra/newview/app_settings/shaders/class3/deferred/giV.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + varying vec2 vary_fragcoord; diff --git a/indra/newview/app_settings/shaders/class3/deferred/luminanceF.glsl b/indra/newview/app_settings/shaders/class3/deferred/luminanceF.glsl index 5f3bf68b240132fbe301d529805a06c9fa9e7b93..980def6443aba0136bd876eac59877c4acd288a0 100644 --- a/indra/newview/app_settings/shaders/class3/deferred/luminanceF.glsl +++ b/indra/newview/app_settings/shaders/class3/deferred/luminanceF.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + #extension GL_ARB_texture_rectangle : enable diff --git a/indra/newview/app_settings/shaders/class3/deferred/luminanceV.glsl b/indra/newview/app_settings/shaders/class3/deferred/luminanceV.glsl index a24eda35dce7e099240dfc47dd37de2e5a1cb06b..9afeac6ddfa76c4ce00d63f57325d8defc09f166 100644 --- a/indra/newview/app_settings/shaders/class3/deferred/luminanceV.glsl +++ b/indra/newview/app_settings/shaders/class3/deferred/luminanceV.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + varying vec2 vary_fragcoord; diff --git a/indra/newview/app_settings/shaders/class3/deferred/postDeferredF.glsl b/indra/newview/app_settings/shaders/class3/deferred/postDeferredF.glsl index ab99a889718571b597a502d811b8c30551d440ef..6d4c20f68c01e535fb1f62a78c04aa9ba16b1065 100644 --- a/indra/newview/app_settings/shaders/class3/deferred/postDeferredF.glsl +++ b/indra/newview/app_settings/shaders/class3/deferred/postDeferredF.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + #extension GL_ARB_texture_rectangle : enable diff --git a/indra/newview/app_settings/shaders/class3/deferred/postDeferredV.glsl b/indra/newview/app_settings/shaders/class3/deferred/postDeferredV.glsl index 12983baa94882bfc3f58349847dd7bec1b3aadca..876f65ee3adc86302c81426f8ce576b67ae96a95 100644 --- a/indra/newview/app_settings/shaders/class3/deferred/postDeferredV.glsl +++ b/indra/newview/app_settings/shaders/class3/deferred/postDeferredV.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + varying vec2 vary_fragcoord; uniform vec2 screen_res; diff --git a/indra/newview/app_settings/shaders/class3/deferred/postgiF.glsl b/indra/newview/app_settings/shaders/class3/deferred/postgiF.glsl index f037754708726c727f9cff7a43598c3eb4d9e562..fc658816805ccf6236f4b7b93f7909c2513c40c2 100644 --- a/indra/newview/app_settings/shaders/class3/deferred/postgiF.glsl +++ b/indra/newview/app_settings/shaders/class3/deferred/postgiF.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + #extension GL_ARB_texture_rectangle : enable diff --git a/indra/newview/app_settings/shaders/class3/deferred/postgiV.glsl b/indra/newview/app_settings/shaders/class3/deferred/postgiV.glsl index ae57227fe528b03b5e2a0d216c9a8b97a5ddfb39..eebe930666a60742bb73b063f384b32d99d4f726 100644 --- a/indra/newview/app_settings/shaders/class3/deferred/postgiV.glsl +++ b/indra/newview/app_settings/shaders/class3/deferred/postgiV.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + varying vec2 vary_fragcoord; uniform vec2 screen_res; diff --git a/indra/newview/app_settings/shaders/class3/deferred/softenLightF.glsl b/indra/newview/app_settings/shaders/class3/deferred/softenLightF.glsl index ce32f66000f91fa0b67400b931f3da6464d669c7..d38d33cc2193cd64280e863bdd958d8beb595954 100644 --- a/indra/newview/app_settings/shaders/class3/deferred/softenLightF.glsl +++ b/indra/newview/app_settings/shaders/class3/deferred/softenLightF.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + #extension GL_ARB_texture_rectangle : enable diff --git a/indra/newview/app_settings/shaders/class3/deferred/softenLightV.glsl b/indra/newview/app_settings/shaders/class3/deferred/softenLightV.glsl index 8f0bcca76b86a22f32101d0c81b3631110fff0c9..745cc0199236aeff1ade125a59f78bd48b15d382 100644 --- a/indra/newview/app_settings/shaders/class3/deferred/softenLightV.glsl +++ b/indra/newview/app_settings/shaders/class3/deferred/softenLightV.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + uniform vec2 screen_res; diff --git a/indra/newview/app_settings/shaders/class3/deferred/treeF.glsl b/indra/newview/app_settings/shaders/class3/deferred/treeF.glsl index c54d9a1e3e80dcf0bc9ba20d70c92b346d4fa3dc..de7e038402235d2a6044aa200d102923b210ed78 100644 --- a/indra/newview/app_settings/shaders/class3/deferred/treeF.glsl +++ b/indra/newview/app_settings/shaders/class3/deferred/treeF.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + uniform sampler2D diffuseMap; diff --git a/indra/newview/app_settings/shaders/class3/lighting/sumLightsSpecularV.glsl b/indra/newview/app_settings/shaders/class3/lighting/sumLightsSpecularV.glsl index 04533fdce1ac78d75e8d724802d07a4aba5e2d3e..92347a5b4a4fb2172c3679f86035e890bc3669da 100644 --- a/indra/newview/app_settings/shaders/class3/lighting/sumLightsSpecularV.glsl +++ b/indra/newview/app_settings/shaders/class3/lighting/sumLightsSpecularV.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + float calcDirectionalLightSpecular(inout vec4 specular, vec3 view, vec3 n, vec3 l, vec3 lightCol, float da); vec3 calcPointLightSpecular(inout vec4 specular, vec3 view, vec3 v, vec3 n, vec3 l, float r, float pw, vec3 lightCol); diff --git a/indra/newview/app_settings/shaders/class3/lighting/sumLightsV.glsl b/indra/newview/app_settings/shaders/class3/lighting/sumLightsV.glsl index 73bc18b8663aa6de17e17800558da1d7d5e0a50f..24bbc0a1a115c6267ab5948ebc3b23f51de38b88 100644 --- a/indra/newview/app_settings/shaders/class3/lighting/sumLightsV.glsl +++ b/indra/newview/app_settings/shaders/class3/lighting/sumLightsV.glsl @@ -5,7 +5,7 @@ * $/LicenseInfo$ */ -#version 120 + float calcDirectionalLight(vec3 n, vec3 l); float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float is_pointlight); diff --git a/indra/newview/featuretable.txt b/indra/newview/featuretable.txt index dd8a88e5586036e14b46bf6ffbeca97485cd83eb..4da155efdab1c5f9fa7396a4762ba7b4418d27a2 100644 --- a/indra/newview/featuretable.txt +++ b/indra/newview/featuretable.txt @@ -1,4 +1,4 @@ -version 27 +version 29 // NOTE: This is mostly identical to featuretable_mac.txt with a few differences // Should be combined into one table @@ -48,6 +48,7 @@ RenderTransparentWater 1 1 RenderTreeLODFactor 1 1.0 RenderUseImpostors 1 1 RenderVBOEnable 1 1 +RenderVBOMappingDisable 1 1 RenderVolumeLODFactor 1 2.0 UseStartScreen 1 1 UseOcclusion 1 1 @@ -64,6 +65,7 @@ RenderDeferredSSAO 1 1 RenderShadowDetail 1 2 WatchdogDisabled 1 1 RenderUseStreamVBO 1 1 +RenderFSAASamples 1 16 // // Low Graphics Settings @@ -95,6 +97,7 @@ SkyUseClassicClouds 1 0 RenderDeferred 1 0 RenderDeferredSSAO 1 0 RenderShadowDetail 1 0 +RenderFSAASamples 1 0 // // Mid Graphics Settings @@ -124,6 +127,7 @@ WLSkyDetail 1 48 RenderDeferred 1 0 RenderDeferredSSAO 1 0 RenderShadowDetail 1 0 +RenderFSAASamples 1 0 // // High Graphics Settings (purty) @@ -153,6 +157,7 @@ WLSkyDetail 1 48 RenderDeferred 1 0 RenderDeferredSSAO 1 0 RenderShadowDetail 1 0 +RenderFSAASamples 1 4 // // Ultra graphics (REALLY PURTY!) @@ -181,6 +186,8 @@ WLSkyDetail 1 128 RenderDeferred 1 1 RenderDeferredSSAO 1 1 RenderShadowDetail 1 2 +RenderFSAASamples 1 8 + // // Class Unknown Hardware (unknown) @@ -238,6 +245,12 @@ RenderDeferred 0 0 RenderDeferredSSAO 0 0 RenderShadowDetail 0 0 +// +// No GL_ARB_map_buffer_range +// +list NoMapBufferRange +RenderVBOMappingDisable 1 0 + // // "Default" setups for safe, low, medium, high @@ -467,7 +480,6 @@ RenderAvatarCloth 0 0 list ATI RenderUseStreamVBO 1 0 -RenderAvatarVP 1 0 // Disable vertex buffer objects by default for ATI cards with little video memory list ATIVramLT256 diff --git a/indra/newview/featuretable_linux.txt b/indra/newview/featuretable_linux.txt index 058bdcc7308bf9a35709c3304afb724491a06852..dab73dc3d18fd3d5f70d4b45ed26664189d40f76 100644 --- a/indra/newview/featuretable_linux.txt +++ b/indra/newview/featuretable_linux.txt @@ -1,4 +1,4 @@ -version 23 +version 25 // NOTE: This is mostly identical to featuretable_mac.txt with a few differences // Should be combined into one table @@ -48,6 +48,7 @@ RenderTransparentWater 1 1 RenderTreeLODFactor 1 1.0 RenderUseImpostors 1 1 RenderVBOEnable 1 1 +RenderVBOMappingDisable 1 1 RenderVolumeLODFactor 1 2.0 UseStartScreen 1 1 UseOcclusion 1 1 @@ -62,6 +63,7 @@ RenderShaderLightingMaxLevel 1 3 RenderDeferred 1 1 RenderDeferredSSAO 1 1 RenderShadowDetail 1 2 +RenderFSAASamples 1 16 // // Low Graphics Settings @@ -93,6 +95,7 @@ SkyUseClassicClouds 1 0 RenderDeferred 1 0 RenderDeferredSSAO 1 0 RenderShadowDetail 1 0 +RenderFSAASamples 1 0 // // Mid Graphics Settings @@ -122,6 +125,7 @@ WLSkyDetail 1 48 RenderDeferred 1 0 RenderDeferredSSAO 1 0 RenderShadowDetail 1 0 +RenderFSAASamples 1 0 // // High Graphics Settings (purty) @@ -151,6 +155,7 @@ WLSkyDetail 1 48 RenderDeferred 1 0 RenderDeferredSSAO 1 0 RenderShadowDetail 1 0 +RenderFSAASamples 1 4 // // Ultra graphics (REALLY PURTY!) @@ -180,6 +185,7 @@ WLSkyDetail 1 128 RenderDeferred 1 1 RenderDeferredSSAO 1 1 RenderShadowDetail 1 2 +RenderFSAASamples 1 8 // // Class Unknown Hardware (unknown) @@ -237,6 +243,13 @@ RenderDeferred 0 0 RenderDeferredSSAO 0 0 RenderShadowDetail 0 0 +// +// No GL_ARB_map_buffer_range +// +list NoMapBufferRange +RenderVBOMappingDisable 1 0 + + // "Default" setups for safe, low, medium, high // diff --git a/indra/newview/featuretable_mac.txt b/indra/newview/featuretable_mac.txt index e2b979d9e9c235e84bc3e14694e2a86c2eb5748f..a1e25aae0884f7162c78cdb023f3122b77ffe115 100644 --- a/indra/newview/featuretable_mac.txt +++ b/indra/newview/featuretable_mac.txt @@ -1,4 +1,4 @@ -version 23 +version 26 // NOTE: This is mostly identical to featuretable_mac.txt with a few differences // Should be combined into one table @@ -48,6 +48,7 @@ RenderTransparentWater 1 1 RenderTreeLODFactor 1 1.0 RenderUseImpostors 1 1 RenderVBOEnable 1 1 +RenderVBOMappingDisable 1 1 RenderVolumeLODFactor 1 2.0 UseStartScreen 1 1 UseOcclusion 1 1 @@ -64,6 +65,7 @@ RenderDeferredSSAO 1 1 RenderShadowDetail 1 2 WatchdogDisabled 1 1 RenderUseStreamVBO 1 1 +RenderFSAASamples 1 16 // // Low Graphics Settings @@ -95,6 +97,7 @@ SkyUseClassicClouds 1 0 RenderDeferred 1 0 RenderDeferredSSAO 1 0 RenderShadowDetail 1 0 +RenderFSAASamples 1 0 // // Mid Graphics Settings @@ -124,6 +127,7 @@ WLSkyDetail 1 48 RenderDeferred 1 0 RenderDeferredSSAO 1 0 RenderShadowDetail 1 0 +RenderFSAASamples 1 0 // // High Graphics Settings (purty) @@ -153,6 +157,7 @@ WLSkyDetail 1 48 RenderDeferred 1 0 RenderDeferredSSAO 1 0 RenderShadowDetail 1 2 +RenderFSAASamples 1 4 // // Ultra graphics (REALLY PURTY!) @@ -182,6 +187,7 @@ WLSkyDetail 1 128 RenderDeferred 1 0 RenderDeferredSSAO 1 0 RenderShadowDetail 1 2 +RenderFSAASamples 1 8 // // Class Unknown Hardware (unknown) @@ -239,6 +245,13 @@ RenderDeferred 0 0 RenderDeferredSSAO 0 0 RenderShadowDetail 0 0 +// +// No GL_ARB_map_buffer_range +// +list NoMapBufferRange +RenderVBOMappingDisable 1 0 + + // // "Default" setups for safe, low, medium, high // @@ -412,31 +425,6 @@ Disregard128DefaultDrawDistance 1 0 list ATI_Mobility_Radeon_X1xxx Disregard128DefaultDrawDistance 1 0 - - - -// Avatar hardware skinning causes -// invisible avatars on HD 2600... so I masked -// out other possible bad ones till it's fixed - -list ATI_Radeon_HD_2300 -RenderAvatarVP 0 0 -RenderAvatarCloth 0 0 -Disregard128DefaultDrawDistance 1 0 -list ATI_Radeon_HD_2400 -RenderAvatarVP 0 0 -RenderAvatarCloth 0 0 -Disregard128DefaultDrawDistance 1 0 -list ATI_Radeon_HD_2600 -RenderAvatarVP 0 0 -RenderAvatarCloth 0 0 -list ATI_Radeon_HD_2900 -RenderAvatarVP 0 0 -RenderAvatarCloth 0 0 -list ATI_Radeon_HD_3800 -RenderAvatarVP 0 0 -RenderAvatarCloth 0 0 - /// Tweaked NVIDIA list NVIDIA_GeForce_FX_5100 diff --git a/indra/newview/featuretable_xp.txt b/indra/newview/featuretable_xp.txt index 3339172a1a3d49ead0f4562b06c10af0974e05b6..abe4ec99285d9aa3dc4774d963ba90fa3e46ad28 100644 --- a/indra/newview/featuretable_xp.txt +++ b/indra/newview/featuretable_xp.txt @@ -1,4 +1,4 @@ -version 27 +version 29 // NOTE: This is mostly identical to featuretable_mac.txt with a few differences // Should be combined into one table @@ -48,6 +48,7 @@ RenderTransparentWater 1 1 RenderTreeLODFactor 1 1.0 RenderUseImpostors 1 1 RenderVBOEnable 1 1 +RenderVBOMappingDisable 1 1 RenderVolumeLODFactor 1 2.0 UseStartScreen 1 1 UseOcclusion 1 1 @@ -64,6 +65,7 @@ RenderDeferredSSAO 1 0 RenderShadowDetail 1 0 WatchdogDisabled 1 1 RenderUseStreamVBO 1 1 +RenderFSAASamples 1 16 // // Low Graphics Settings @@ -95,6 +97,7 @@ SkyUseClassicClouds 1 0 RenderDeferred 1 0 RenderDeferredSSAO 1 0 RenderShadowDetail 1 0 +RenderFSAASamples 1 0 // // Mid Graphics Settings @@ -124,6 +127,7 @@ WLSkyDetail 1 48 RenderDeferred 1 0 RenderDeferredSSAO 1 0 RenderShadowDetail 1 0 +RenderFSAASamples 1 0 // // High Graphics Settings (purty) @@ -153,6 +157,7 @@ WLSkyDetail 1 48 RenderDeferred 1 0 RenderDeferredSSAO 1 0 RenderShadowDetail 1 2 +RenderFSAASamples 1 4 // // Ultra graphics (REALLY PURTY!) @@ -182,6 +187,7 @@ WLSkyDetail 1 128 RenderDeferred 1 0 RenderDeferredSSAO 1 0 RenderShadowDetail 1 2 +RenderFSAASamples 1 8 // // Class Unknown Hardware (unknown) @@ -239,6 +245,13 @@ RenderDeferred 0 0 RenderDeferredSSAO 0 0 RenderShadowDetail 0 0 +// +// No GL_ARB_map_buffer_range +// +list NoMapBufferRange +RenderVBOMappingDisable 1 0 + + // // "Default" setups for safe, low, medium, high // @@ -466,7 +479,6 @@ RenderAvatarCloth 0 0 list ATI RenderUseStreamVBO 1 0 -RenderAvatarVP 1 0 // Disable vertex buffer objects by default for ATI cards with little video memory list ATIVramLT256 diff --git a/indra/newview/llaccountingquotamanager.cpp b/indra/newview/llaccountingquotamanager.cpp index 0a171959e7a69e8fe5d0feaed9f4a0eb550c6ed1..a4f5de5632fb0e8d54f777235595e8a7bc3543ca 100644 --- a/indra/newview/llaccountingquotamanager.cpp +++ b/indra/newview/llaccountingquotamanager.cpp @@ -71,12 +71,10 @@ class LLAccountingQuotaResponder : public LLCurl::Responder return; } - //Differentiate what the incoming caps could be from the data - //bool VOContent = content.has("Objects"); + //Differentiate what the incoming caps could be from the data bool containsParcel = content.has("parcel"); bool containsSelection = content.has("selected"); - //bool VORegion = content.has("region"); - + //Loop over the stored object ids checking against the incoming data for ( LLSD::array_iterator iter = mObjectIDs.beginArray(); iter != mObjectIDs.endArray(); ++iter ) { @@ -91,16 +89,17 @@ class LLAccountingQuotaResponder : public LLCurl::Responder for(S32 i = 0; i < dataCount; i++) { //prep#todo verify that this is safe, otherwise just add a bool - S32 parcelId = 0; - S32 parcelOwner = 0; + LLUUID parcelId; + //S32 parcelOwner = 0; if ( content["parcel"][i].has("parcel_id") ) { - parcelId = content["parcel"][i]["parcel_id"].asInteger(); - } - if ( content["parcel"][i].has("parcel_owner") ) - { - parcelOwner = content["parcel"][i]["parcel_owner"].asInteger(); + parcelId = content["parcel"][i]["parcel_id"].asUUID(); } + + //if ( content["parcel"][i].has("parcel_owner") ) + //{ + // parcelOwner = content["parcel"][i]["parcel_owner"].asInteger(); + //} F32 ownerRenderCost = 0; F32 ownerPhysicsCost = 0; @@ -117,48 +116,69 @@ class LLAccountingQuotaResponder : public LLCurl::Responder F32 otherNetworkCost = 0; F32 otherSimulationCost = 0; - F32 totalRenderCost = 0; - F32 totalPhysicsCost = 0; - F32 totalNetworkCost = 0; - F32 totalSimulationCost = 0; + F32 tempRenderCost = 0; + F32 tempPhysicsCost = 0; + F32 tempNetworkCost = 0; + F32 tempSimulationCost = 0; + + F32 selectedRenderCost = 0; + F32 selectedPhysicsCost = 0; + F32 selectedNetworkCost = 0; + F32 selectedSimulationCost = 0; + F32 parcelCapacity = 0; + + if ( content["parcel"][i].has("capacity") ) + { + parcelCapacity = content["parcel"][i].has("capacity"); + } + if ( content["parcel"][i].has("owner") ) { - ownerRenderCost = content["parcel"][i]["owner"]["render"].asReal(); + ownerRenderCost = content["parcel"][i]["owner"]["rendering"].asReal(); ownerPhysicsCost = content["parcel"][i]["owner"]["physics"].asReal(); - ownerNetworkCost = content["parcel"][i]["owner"]["network"].asReal(); - ownerSimulationCost = content["parcel"][i]["owner"]["simulation"].asReal(); - + ownerNetworkCost = content["parcel"][i]["owner"]["streaming"].asReal(); + ownerSimulationCost = content["parcel"][i]["owner"]["simulation"].asReal(); } + if ( content["parcel"][i].has("group") ) { - groupRenderCost = content["parcel"][i]["group"]["render"].asReal(); + groupRenderCost = content["parcel"][i]["group"]["rendering"].asReal(); groupPhysicsCost = content["parcel"][i]["group"]["physics"].asReal(); - groupNetworkCost = content["parcel"][i]["group"]["network"].asReal(); + groupNetworkCost = content["parcel"][i]["group"]["streaming"].asReal(); groupSimulationCost = content["parcel"][i]["group"]["simulation"].asReal(); } if ( content["parcel"][i].has("other") ) { - otherRenderCost = content["parcel"][i]["other"]["render"].asReal(); + otherRenderCost = content["parcel"][i]["other"]["rendering"].asReal(); otherPhysicsCost = content["parcel"][i]["other"]["physics"].asReal(); - otherNetworkCost = content["parcel"][i]["other"]["network"].asReal(); + otherNetworkCost = content["parcel"][i]["other"]["streaming"].asReal(); otherSimulationCost = content["parcel"][i]["other"]["simulation"].asReal(); } - if ( content["parcel"][i].has("total") ) + if ( content["parcel"][i].has("temp") ) { - totalRenderCost = content["parcel"][i]["total"]["render"].asReal(); - totalPhysicsCost = content["parcel"][i]["total"]["physics"].asReal(); - totalNetworkCost = content["parcel"][i]["total"]["network"].asReal(); - totalSimulationCost = content["parcel"][i]["total"]["simulation"].asReal(); - + tempRenderCost = content["parcel"][i]["total"]["rendering"].asReal(); + tempPhysicsCost = content["parcel"][i]["total"]["physics"].asReal(); + tempNetworkCost = content["parcel"][i]["total"]["streaming"].asReal(); + tempSimulationCost = content["parcel"][i]["total"]["simulation"].asReal(); + } + + if ( content["parcel"][i].has("selected") ) + { + selectedRenderCost = content["parcel"][i]["total"]["rendering"].asReal(); + selectedPhysicsCost = content["parcel"][i]["total"]["physics"].asReal(); + selectedNetworkCost = content["parcel"][i]["total"]["streaming"].asReal(); + selectedSimulationCost = content["parcel"][i]["total"]["simulation"].asReal(); } - ParcelQuota parcelQuota( ownerRenderCost, ownerPhysicsCost, ownerNetworkCost, ownerSimulationCost, - groupRenderCost, groupPhysicsCost, groupNetworkCost, groupSimulationCost, - otherRenderCost, otherPhysicsCost, otherNetworkCost, otherSimulationCost, - totalRenderCost, totalPhysicsCost, totalNetworkCost, totalSimulationCost ); + ParcelQuota parcelQuota( ownerRenderCost, ownerPhysicsCost, ownerNetworkCost, ownerSimulationCost, + groupRenderCost, groupPhysicsCost, groupNetworkCost, groupSimulationCost, + otherRenderCost, otherPhysicsCost, otherNetworkCost, otherSimulationCost, + tempRenderCost, tempPhysicsCost, tempNetworkCost, tempSimulationCost, + selectedRenderCost, selectedPhysicsCost, selectedNetworkCost, selectedSimulationCost, + parcelCapacity ); //Update the Parcel LLParcel* pParcel = LLViewerParcelMgr::getInstance()->getParcelSelection()->getParcel(); if ( pParcel ) @@ -179,18 +199,18 @@ class LLAccountingQuotaResponder : public LLCurl::Responder F32 networkCost = 0; F32 simulationCost = 0; - S32 localId = 0; + LLUUID objectId; - localId = content["selected"][i]["local_id"].asInteger(); - renderCost = content["selected"][i]["render"].asReal(); + objectId = content["selected"][i]["local_id"].asUUID(); + renderCost = content["selected"][i]["rendering"].asReal(); physicsCost = content["selected"][i]["physics"].asReal(); - networkCost = content["selected"][i]["network"].asReal(); + networkCost = content["selected"][i]["streaming"].asReal(); simulationCost = content["selected"][i]["simulation"].asReal(); - SelectionQuota selectionQuota( localId, renderCost, physicsCost, networkCost, simulationCost ); + SelectionQuota selectionQuota( objectId, renderCost, physicsCost, networkCost, simulationCost ); //Update the objects - //gObjectList.updateQuota( localId, selectionQuota ); + gObjectList.updateQuota( objectId, selectionQuota ); } } diff --git a/indra/newview/llagentcamera.cpp b/indra/newview/llagentcamera.cpp index 80085dad9d2609d53f12cfdc6c7226ca76dec9e3..c30d3b9aa3e5e92a2376176c2d3e48d8ef985342 100644 --- a/indra/newview/llagentcamera.cpp +++ b/indra/newview/llagentcamera.cpp @@ -392,11 +392,9 @@ LLVector3 LLAgentCamera::calcFocusOffset(LLViewerObject *object, LLVector3 origi } LLQuaternion inv_obj_rot = ~obj_rot; // get inverse of rotation - LLVector3 object_extents; + LLVector3 object_extents = object->getScale(); const LLVector4a* oe4 = object->mDrawable->getSpatialExtents(); - LLVector4a size; - size.setSub(oe4[1], oe4[0]); - object_extents.set( size[0], size[1], size[2] ); + object_extents.set( oe4[1][0], oe4[1][1], oe4[1][2] ); // make sure they object extents are non-zero object_extents.clamp(0.001f, F32_MAX); diff --git a/indra/newview/llassetuploadresponders.cpp b/indra/newview/llassetuploadresponders.cpp index c08771c5e7d2352049fa4c56004e6432d182d272..d7ba4ea4706b89604fdbe19faa44acd5d8fb0d17 100644 --- a/indra/newview/llassetuploadresponders.cpp +++ b/indra/newview/llassetuploadresponders.cpp @@ -384,18 +384,18 @@ void LLNewAgentInventoryResponder::uploadComplete(const LLSD& content) // Continuing the horrible hack above, we need to extract the originally requested permissions data, if any, // and use them for each next file to be uploaded. Note the requested perms are not the same as the U32 everyone_perms = - content.has("everyone_mask") ? - content["everyone_mask"].asInteger() : + content.has("new_everyone_mask") ? + content["new_everyone_mask"].asInteger() : PERM_NONE; U32 group_perms = - content.has("group_mask") ? - content["group_mask"].asInteger() : + content.has("new_group_mask") ? + content["new_group_mask"].asInteger() : PERM_NONE; U32 next_owner_perms = - content.has("next_owner_mask") ? - content["next_owner_mask"].asInteger() : + content.has("new_next_owner_mask") ? + content["new_next_owner_mask"].asInteger() : PERM_NONE; std::string display_name = LLStringUtil::null; diff --git a/indra/newview/llavataractions.cpp b/indra/newview/llavataractions.cpp index cbbdcb2983fc6d47b767b23d817f49b5fb2d9ec3..955f19c82c64de7fcd28cae540d3d92a8bff6901 100755 --- a/indra/newview/llavataractions.cpp +++ b/indra/newview/llavataractions.cpp @@ -773,6 +773,10 @@ bool LLAvatarActions::canOfferTeleport(const LLUUID& id) // static bool LLAvatarActions::canOfferTeleport(const uuid_vec_t& ids) { + // We can't send more than 250 lures in a single message, so disable this + // button when there are too many id's selected. + if(ids.size() > 250) return false; + bool result = true; for (uuid_vec_t::const_iterator it = ids.begin(); it != ids.end(); ++it) { diff --git a/indra/newview/llcofwearables.cpp b/indra/newview/llcofwearables.cpp index 84c560639e00961b568c25f1a92f03f039ecfc00..254c0adef16bfffb71c6b0ff955914f795be29cc 100644 --- a/indra/newview/llcofwearables.cpp +++ b/indra/newview/llcofwearables.cpp @@ -317,7 +317,6 @@ BOOL LLCOFWearables::postBuild() mAttachments->setComparator(&WEARABLE_NAME_COMPARATOR); mBodyParts->setComparator(&WEARABLE_NAME_COMPARATOR); - mClothingTab = getChild<LLAccordionCtrlTab>("tab_clothing"); mClothingTab->setDropDownStateChangedCallback(boost::bind(&LLCOFWearables::onAccordionTabStateChanged, this, _1, _2)); @@ -499,6 +498,10 @@ void LLCOFWearables::populateAttachmentsAndBodypartsLists(const LLInventoryModel mAttachments->sort(); mAttachments->notify(REARRANGE); //notifying the parent about the list's size change (cause items were added with rearrange=false) } + else + { + mAttachments->setNoItemsCommentText(LLTrans::getString("no_attachments")); + } if (mBodyParts->size()) { diff --git a/indra/newview/lldebugview.cpp b/indra/newview/lldebugview.cpp index b6d67899f8caab23f7a69923558bbbce6d1de24c..216cc66ef8637c624294fa7b9a85960d53e367d5 100644 --- a/indra/newview/lldebugview.cpp +++ b/indra/newview/lldebugview.cpp @@ -62,7 +62,8 @@ void LLDebugView::init() LLRect r; LLRect rect = getLocalRect(); - r.set(10, rect.getHeight() - 100, rect.getWidth()/2, 100); + // Rectangle to draw debug data in (full height, 3/4 width) + r.set(10, rect.getHeight() - 100, ((rect.getWidth()*3)/4), 100); LLConsole::Params cp; cp.name("debug console"); cp.max_lines(20); diff --git a/indra/newview/lldrawable.cpp b/indra/newview/lldrawable.cpp index bdc12ec0e3c384ca6003dde4477a62c00bf64ba1..ad3710843c60b4f8c821cad0dabc2ac73e84ffdd 100644 --- a/indra/newview/lldrawable.cpp +++ b/indra/newview/lldrawable.cpp @@ -94,7 +94,9 @@ void LLDrawable::init() mRenderType = 0; mCurrentScale = LLVector3(1,1,1); mDistanceWRTCamera = 0.0f; - + mPositionGroup.clear(); + mExtents[0].clear(); + mExtents[1].clear(); mQuietCount = 0; mState = 0; @@ -587,7 +589,10 @@ void LLDrawable::setRadius(F32 radius) void LLDrawable::moveUpdatePipeline(BOOL moved) { - makeActive(); + if (moved) + { + makeActive(); + } // Update the face centers. for (S32 i = 0; i < getNumFaces(); i++) @@ -695,7 +700,8 @@ void LLDrawable::updateDistance(LLCamera& camera, bool force_update) { if (LLViewerCamera::sCurCameraID != LLViewerCamera::CAMERA_WORLD) { - llerrs << "WTF?" << llendl; + llwarns << "Attempted to update distance for non-world camera." << llendl; + return; } //switch LOD with the spatial group to avoid artifacts diff --git a/indra/newview/lldrawable.h b/indra/newview/lldrawable.h index 9ebe1a45b44a12654a9c1ca8afb66da7941d735f..e268640a21cdf806415bd68bea90e9f719da88df 100644 --- a/indra/newview/lldrawable.h +++ b/indra/newview/lldrawable.h @@ -276,6 +276,7 @@ class LLDrawable : public LLRefCount REBUILD_SHADOW = 0x02000000, HAS_ALPHA = 0x04000000, RIGGED = 0x08000000, + PARTITION_MOVE = 0x10000000, } EDrawableFlags; private: //aligned members diff --git a/indra/newview/lldrawpool.cpp b/indra/newview/lldrawpool.cpp index 25e4bc847c253dcfd41423ef3575751c21c073c5..f5483d969d196ce1095d2c54da32a4a6e326ac9e 100644 --- a/indra/newview/lldrawpool.cpp +++ b/indra/newview/lldrawpool.cpp @@ -191,6 +191,16 @@ void LLDrawPool::renderPostDeferred(S32 pass) //virtual void LLDrawPool::endRenderPass( S32 pass ) { + for (U32 i = 0; i < gGLManager.mNumTextureImageUnits; i++) + { //dummy cleanup of any currently bound textures + if (gGL.getTexUnit(i)->getCurrType() != LLTexUnit::TT_NONE) + { + gGL.getTexUnit(i)->unbind(gGL.getTexUnit(i)->getCurrType()); + gGL.getTexUnit(i)->disable(); + } + } + + gGL.getTexUnit(0)->activate(); } //virtual @@ -430,14 +440,14 @@ void LLRenderPass::renderTexture(U32 type, U32 mask) pushBatches(type, mask, TRUE); } -void LLRenderPass::pushBatches(U32 type, U32 mask, BOOL texture) +void LLRenderPass::pushBatches(U32 type, U32 mask, BOOL texture, BOOL batch_textures) { for (LLCullResult::drawinfo_list_t::iterator i = gPipeline.beginRenderMap(type); i != gPipeline.endRenderMap(type); ++i) { LLDrawInfo* pparams = *i; if (pparams) { - pushBatch(*pparams, mask, texture); + pushBatch(*pparams, mask, texture, batch_textures); } } } @@ -456,26 +466,43 @@ void LLRenderPass::applyModelMatrix(LLDrawInfo& params) } } -void LLRenderPass::pushBatch(LLDrawInfo& params, U32 mask, BOOL texture) +void LLRenderPass::pushBatch(LLDrawInfo& params, U32 mask, BOOL texture, BOOL batch_textures) { applyModelMatrix(params); + bool tex_setup = false; + if (texture) { - if (params.mTexture.notNull()) + if (batch_textures && params.mTextureList.size() > 1) { - params.mTexture->addTextureStats(params.mVSize); - gGL.getTexUnit(0)->bind(params.mTexture, TRUE) ; - if (params.mTextureMatrix) + for (U32 i = 0; i < params.mTextureList.size(); ++i) { - glMatrixMode(GL_TEXTURE); - glLoadMatrixf((GLfloat*) params.mTextureMatrix->mMatrix); - gPipeline.mTextureMatrixOps++; + if (params.mTextureList[i].notNull()) + { + gGL.getTexUnit(i)->bind(params.mTextureList[i], TRUE); + } } } else - { - gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); + { //not batching textures or batch has only 1 texture -- might need a texture matrix + if (params.mTexture.notNull()) + { + params.mTexture->addTextureStats(params.mVSize); + gGL.getTexUnit(0)->bind(params.mTexture, TRUE) ; + if (params.mTextureMatrix) + { + tex_setup = true; + gGL.getTexUnit(0)->activate(); + glMatrixMode(GL_TEXTURE); + glLoadMatrixf((GLfloat*) params.mTextureMatrix->mMatrix); + gPipeline.mTextureMatrixOps++; + } + } + else + { + gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); + } } } @@ -490,7 +517,7 @@ void LLRenderPass::pushBatch(LLDrawInfo& params, U32 mask, BOOL texture) gPipeline.addTrianglesDrawn(params.mCount, params.mDrawMode); } - if (params.mTextureMatrix && texture && params.mTexture.notNull()) + if (tex_setup) { glLoadIdentity(); glMatrixMode(GL_MODELVIEW); diff --git a/indra/newview/lldrawpool.h b/indra/newview/lldrawpool.h index d3fd9ead0d4ef42a88f3a0d0230ffc03d8586b2b..c7acbb42c62da2c8aa5a471e7c8f5a5aaddfd536 100644 --- a/indra/newview/lldrawpool.h +++ b/indra/newview/lldrawpool.h @@ -146,8 +146,8 @@ class LLRenderPass : public LLDrawPool void resetDrawOrders() { } static void applyModelMatrix(LLDrawInfo& params); - virtual void pushBatches(U32 type, U32 mask, BOOL texture = TRUE); - virtual void pushBatch(LLDrawInfo& params, U32 mask, BOOL texture); + virtual void pushBatches(U32 type, U32 mask, BOOL texture = TRUE, BOOL batch_textures = FALSE); + virtual void pushBatch(LLDrawInfo& params, U32 mask, BOOL texture, BOOL batch_textures = FALSE); virtual void renderGroup(LLSpatialGroup* group, U32 type, U32 mask, BOOL texture = TRUE); virtual void renderGroups(U32 type, U32 mask, BOOL texture = TRUE); virtual void renderTexture(U32 type, U32 mask); diff --git a/indra/newview/lldrawpoolalpha.cpp b/indra/newview/lldrawpoolalpha.cpp index 8b5a2ce78182d6e4147c73cb09430aaae7453f88..8d46133912e61fd7b0840ef7822041cc46f4375a 100644 --- a/indra/newview/lldrawpoolalpha.cpp +++ b/indra/newview/lldrawpoolalpha.cpp @@ -124,7 +124,10 @@ void LLDrawPoolAlpha::beginPostDeferredPass(S32 pass) if (pass == 0) { simple_shader = &gDeferredAlphaProgram; - fullbright_shader = &gDeferredFullbrightProgram; + fullbright_shader = &gObjectFullbrightProgram; + + //prime simple shader (loads shadow relevant uniforms) + gPipeline.bindDeferredShader(*simple_shader); } else { @@ -228,13 +231,13 @@ void LLDrawPoolAlpha::render(S32 pass) if (!LLPipeline::sRenderDeferred) { simple_shader->bind(); - pushBatches(LLRenderPass::PASS_ALPHA_MASK, getVertexDataMask()); + pushBatches(LLRenderPass::PASS_ALPHA_MASK, getVertexDataMask() | LLVertexBuffer::MAP_TEXTURE_INDEX, TRUE, TRUE); } if (fullbright_shader) { fullbright_shader->bind(); } - pushBatches(LLRenderPass::PASS_FULLBRIGHT_ALPHA_MASK, getVertexDataMask()); + pushBatches(LLRenderPass::PASS_FULLBRIGHT_ALPHA_MASK, getVertexDataMask() | LLVertexBuffer::MAP_TEXTURE_INDEX, TRUE, TRUE); LLGLSLShader::bindNoShader(); } else @@ -273,7 +276,14 @@ void LLDrawPoolAlpha::render(S32 pass) } } - renderAlpha(getVertexDataMask()); + if (mVertexShaderLevel > 0) + { + renderAlpha(getVertexDataMask() | LLVertexBuffer::MAP_TEXTURE_INDEX); + } + else + { + renderAlpha(getVertexDataMask()); + } gGL.setColorMask(true, false); @@ -283,11 +293,6 @@ void LLDrawPoolAlpha::render(S32 pass) gGL.setSceneBlendType(LLRender::BT_ALPHA); } - if (deferred_render && current_shader != NULL) - { - gPipeline.unbindDeferredShader(*current_shader); - } - if (sShowDebugAlpha) { if(gPipeline.canUseWindLightShaders()) @@ -339,12 +344,9 @@ void LLDrawPoolAlpha::renderAlpha(U32 mask) { BOOL initialized_lighting = FALSE; BOOL light_enabled = TRUE; - S32 diffuse_channel = 0; - - BOOL use_shaders = (LLPipeline::sUnderWaterRender && gPipeline.canUseVertexShaders()) - || gPipeline.canUseWindLightShadersOnObjects(); - + BOOL use_shaders = gPipeline.canUseVertexShaders(); + for (LLCullResult::sg_list_t::iterator i = gPipeline.beginAlphaGroups(); i != gPipeline.endAlphaGroups(); ++i) { LLSpatialGroup* group = *i; @@ -368,92 +370,89 @@ void LLDrawPoolAlpha::renderAlpha(U32 mask) LLRenderPass::applyModelMatrix(params); + + if (params.mFullbright) { - if (params.mFullbright) - { - // Turn off lighting if it hasn't already been so. - if (light_enabled || !initialized_lighting) - { - initialized_lighting = TRUE; - if (use_shaders) - { - target_shader = fullbright_shader; - } - else - { - gPipeline.enableLightsFullbright(LLColor4(1,1,1,1)); - } - light_enabled = FALSE; - } - } - // Turn on lighting if it isn't already. - else if (!light_enabled || !initialized_lighting) + // Turn off lighting if it hasn't already been so. + if (light_enabled || !initialized_lighting) { initialized_lighting = TRUE; if (use_shaders) { - target_shader = simple_shader; + target_shader = fullbright_shader; } else { - gPipeline.enableLightsDynamic(); + gPipeline.enableLightsFullbright(LLColor4(1,1,1,1)); } - light_enabled = TRUE; + light_enabled = FALSE; } - - // If we need shaders, and we're not ALREADY using the proper shader, then bind it - // (this way we won't rebind shaders unnecessarily). - if(use_shaders && (current_shader != target_shader)) + } + // Turn on lighting if it isn't already. + else if (!light_enabled || !initialized_lighting) + { + initialized_lighting = TRUE; + if (use_shaders) { - llassert(target_shader != NULL); - if (deferred_render && current_shader != NULL) - { - gPipeline.unbindDeferredShader(*current_shader); - diffuse_channel = 0; - } - current_shader = target_shader; - if (deferred_render) - { - gPipeline.bindDeferredShader(*current_shader); - diffuse_channel = current_shader->enableTexture(LLViewerShaderMgr::DIFFUSE_MAP); - } - else - { - current_shader->bind(); - } + target_shader = simple_shader; } - else if (!use_shaders && current_shader != NULL) + else { - if (deferred_render) - { - gPipeline.unbindDeferredShader(*current_shader); - diffuse_channel = 0; - } - LLGLSLShader::bindNoShader(); - current_shader = NULL; + gPipeline.enableLightsDynamic(); } + light_enabled = TRUE; + } - if (params.mGroup) - { - params.mGroup->rebuildMesh(); - } + // If we need shaders, and we're not ALREADY using the proper shader, then bind it + // (this way we won't rebind shaders unnecessarily). + if(use_shaders && (current_shader != target_shader)) + { + llassert(target_shader != NULL); + current_shader = target_shader; + current_shader->bind(); + } + else if (!use_shaders && current_shader != NULL) + { + LLGLSLShader::bindNoShader(); + current_shader = NULL; + } - - if (params.mTexture.notNull()) + if (params.mGroup) + { + params.mGroup->rebuildMesh(); + } + + bool tex_setup = false; + + if (use_shaders && params.mTextureList.size() > 1) + { + for (U32 i = 0; i < params.mTextureList.size(); ++i) { - gGL.getTexUnit(diffuse_channel)->bind(params.mTexture.get()); - if(params.mTexture.notNull()) + if (params.mTextureList[i].notNull()) { - params.mTexture->addTextureStats(params.mVSize); + gGL.getTexUnit(i)->bind(params.mTextureList[i], TRUE); } + } + } + else + { //not batching textures or batch has only 1 texture -- might need a texture matrix + if (params.mTexture.notNull()) + { + params.mTexture->addTextureStats(params.mVSize); + gGL.getTexUnit(0)->bind(params.mTexture, TRUE) ; if (params.mTextureMatrix) { + tex_setup = true; gGL.getTexUnit(0)->activate(); glMatrixMode(GL_TEXTURE); glLoadMatrixf((GLfloat*) params.mTextureMatrix->mMatrix); gPipeline.mTextureMatrixOps++; } } + else + { + gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); + } } params.mVertexBuffer->setBuffer(mask); @@ -480,7 +479,7 @@ void LLDrawPoolAlpha::renderAlpha(U32 mask) gGL.blendFunc(mColorSFactor, mColorDFactor, mAlphaSFactor, mAlphaDFactor); } - if (params.mTextureMatrix && params.mTexture.notNull()) + if (tex_setup) { gGL.getTexUnit(0)->activate(); glLoadIdentity(); @@ -490,15 +489,8 @@ void LLDrawPoolAlpha::renderAlpha(U32 mask) } } - if (deferred_render && current_shader != NULL) - { - gPipeline.unbindDeferredShader(*current_shader); - LLVertexBuffer::unbind(); - LLGLState::checkStates(); - LLGLState::checkTextureChannels(); - LLGLState::checkClientArrays(); - } - + LLVertexBuffer::unbind(); + if (!light_enabled) { gPipeline.enableLightsDynamic(); diff --git a/indra/newview/lldrawpoolavatar.cpp b/indra/newview/lldrawpoolavatar.cpp index 645c7ebcaeb933d586074da457beb80c55518d3d..9f790d03fe05a3d47ac1728b428a2ba457b7c9cc 100644 --- a/indra/newview/lldrawpoolavatar.cpp +++ b/indra/newview/lldrawpoolavatar.cpp @@ -459,14 +459,6 @@ S32 LLDrawPoolAvatar::getNumPasses() { return 10; } - if (LLPipeline::sImpostorRender) - { - return 1; - } - else - { - return 3; - } } @@ -613,11 +605,11 @@ void LLDrawPoolAvatar::beginRigid() { if (LLPipeline::sUnderWaterRender) { - sVertexProgram = &gObjectSimpleWaterProgram; + sVertexProgram = &gObjectSimpleNonIndexedWaterProgram; } else { - sVertexProgram = &gObjectSimpleProgram; + sVertexProgram = &gObjectSimpleNonIndexedProgram; } if (sVertexProgram != NULL) @@ -669,7 +661,7 @@ void LLDrawPoolAvatar::endDeferredImpostor() void LLDrawPoolAvatar::beginDeferredRigid() { - sVertexProgram = &gDeferredDiffuseProgram; + sVertexProgram = &gDeferredNonIndexedDiffuseProgram; sVertexProgram->bind(); } @@ -700,11 +692,11 @@ void LLDrawPoolAvatar::beginSkinned() { if (LLPipeline::sUnderWaterRender) { - sVertexProgram = &gObjectSimpleWaterProgram; + sVertexProgram = &gObjectSimpleNonIndexedWaterProgram; } else { - sVertexProgram = &gObjectSimpleProgram; + sVertexProgram = &gObjectSimpleNonIndexedProgram; } } @@ -789,11 +781,11 @@ void LLDrawPoolAvatar::beginRiggedSimple() { if (LLPipeline::sUnderWaterRender) { - sVertexProgram = &gObjectSimpleWaterProgram; + sVertexProgram = &gObjectSimpleNonIndexedWaterProgram; } else { - sVertexProgram = &gObjectSimpleProgram; + sVertexProgram = &gObjectSimpleNonIndexedProgram; } } @@ -864,11 +856,11 @@ void LLDrawPoolAvatar::beginRiggedFullbright() { if (LLPipeline::sUnderWaterRender) { - sVertexProgram = &gObjectFullbrightWaterProgram; + sVertexProgram = &gObjectFullbrightNonIndexedWaterProgram; } else { - sVertexProgram = &gObjectFullbrightProgram; + sVertexProgram = &gObjectFullbrightNonIndexedProgram; } } @@ -908,11 +900,11 @@ void LLDrawPoolAvatar::beginRiggedShinySimple() { if (LLPipeline::sUnderWaterRender) { - sVertexProgram = &gObjectShinyWaterProgram; + sVertexProgram = &gObjectShinyNonIndexedWaterProgram; } else { - sVertexProgram = &gObjectShinyProgram; + sVertexProgram = &gObjectShinyNonIndexedProgram; } } @@ -953,11 +945,11 @@ void LLDrawPoolAvatar::beginRiggedFullbrightShiny() { if (LLPipeline::sUnderWaterRender) { - sVertexProgram = &gObjectFullbrightShinyWaterProgram; + sVertexProgram = &gObjectFullbrightShinyNonIndexedWaterProgram; } else { - sVertexProgram = &gObjectFullbrightShinyProgram; + sVertexProgram = &gObjectFullbrightShinyNonIndexedProgram; } } @@ -1419,7 +1411,7 @@ void LLDrawPoolAvatar::updateRiggedFaceVertexBuffer(LLVOAvatar* avatar, LLFace* void LLDrawPoolAvatar::renderRigged(LLVOAvatar* avatar, U32 type, bool glow) { - if (avatar->isSelf() && !gAgent.needsRenderAvatar()) + if (avatar->isSelf() && !gAgent.needsRenderAvatar() || !gMeshRepo.meshRezEnabled()) { return; } @@ -1456,7 +1448,7 @@ void LLDrawPoolAvatar::renderRigged(LLVOAvatar* avatar, U32 type, bool glow) continue; } - const LLMeshSkinInfo* skin = gMeshRepo.getSkinInfo(mesh_id); + const LLMeshSkinInfo* skin = gMeshRepo.getSkinInfo(mesh_id, vobj); if (!skin) { continue; diff --git a/indra/newview/lldrawpoolbump.cpp b/indra/newview/lldrawpoolbump.cpp index 2f76baaaf7eb7f3d6b61aab63db61752df14a62f..813b3820ee8948c05e566754853c8531af581281 100644 --- a/indra/newview/lldrawpoolbump.cpp +++ b/indra/newview/lldrawpoolbump.cpp @@ -316,6 +316,9 @@ void LLDrawPoolBump::endRenderPass(S32 pass) llassert(0); break; } + + //to cleanup texture channels + LLRenderPass::endRenderPass(pass); } //static @@ -354,6 +357,11 @@ void LLDrawPoolBump::beginShiny(bool invisible) } bindCubeMap(shader, mVertexShaderLevel, diffuse_channel, cube_channel, invisible); + + if (mVertexShaderLevel > 1) + { //indexed texture rendering, channel 0 is always diffuse + diffuse_channel = 0; + } } //static @@ -421,16 +429,16 @@ void LLDrawPoolBump::renderShiny(bool invisible) LLGLEnable blend_enable(GL_BLEND); if (!invisible && mVertexShaderLevel > 1) { - LLRenderPass::renderTexture(LLRenderPass::PASS_SHINY, sVertexMask); + LLRenderPass::pushBatches(LLRenderPass::PASS_SHINY, sVertexMask | LLVertexBuffer::MAP_TEXTURE_INDEX, TRUE, TRUE); } else if (!invisible) { renderGroups(LLRenderPass::PASS_SHINY, sVertexMask); } - else // invisible - { - renderGroups(LLRenderPass::PASS_INVISI_SHINY, sVertexMask); - } + //else // invisible (deprecated) + //{ + //renderGroups(LLRenderPass::PASS_INVISI_SHINY, sVertexMask); + //} } } @@ -529,6 +537,12 @@ void LLDrawPoolBump::beginFullbrightShiny() gGL.getTexUnit(cube_channel)->bind(cube_map); gGL.getTexUnit(0)->activate(); } + + if (mVertexShaderLevel > 1) + { //indexed texture rendering, channel 0 is always diffuse + diffuse_channel = 0; + } + mShiny = TRUE; } @@ -543,7 +557,15 @@ void LLDrawPoolBump::renderFullbrightShiny() if( gSky.mVOSkyp->getCubeMap() ) { LLGLEnable blend_enable(GL_BLEND); - LLRenderPass::renderTexture(LLRenderPass::PASS_FULLBRIGHT_SHINY, sVertexMask); + + if (mVertexShaderLevel > 1) + { + LLRenderPass::pushBatches(LLRenderPass::PASS_FULLBRIGHT_SHINY, sVertexMask | LLVertexBuffer::MAP_TEXTURE_INDEX, TRUE, TRUE); + } + else + { + LLRenderPass::renderTexture(LLRenderPass::PASS_FULLBRIGHT_SHINY, sVertexMask); + } } } @@ -843,6 +865,9 @@ void LLDrawPoolBump::endPostDeferredPass(S32 pass) endBump(LLRenderPass::PASS_POST_BUMP); break; } + + //to disable texture channels + LLRenderPass::endRenderPass(pass); } void LLDrawPoolBump::renderPostDeferred(S32 pass) @@ -1300,43 +1325,60 @@ void LLDrawPoolBump::renderBump(U32 type, U32 mask) } } -void LLDrawPoolBump::pushBatch(LLDrawInfo& params, U32 mask, BOOL texture) +void LLDrawPoolBump::pushBatch(LLDrawInfo& params, U32 mask, BOOL texture, BOOL batch_textures) { applyModelMatrix(params); - if (params.mTextureMatrix) + bool tex_setup = false; + + if (batch_textures && params.mTextureList.size() > 1) { - if (mShiny) + for (U32 i = 0; i < params.mTextureList.size(); ++i) { - gGL.getTexUnit(0)->activate(); - glMatrixMode(GL_TEXTURE); + if (params.mTextureList[i].notNull()) + { + gGL.getTexUnit(i)->bind(params.mTextureList[i], TRUE); + } } - else + } + else + { //not batching textures or batch has only 1 texture -- might need a texture matrix + if (params.mTextureMatrix) { - gGL.getTexUnit(1)->activate(); - glMatrixMode(GL_TEXTURE); + if (mShiny) + { + gGL.getTexUnit(0)->activate(); + glMatrixMode(GL_TEXTURE); + } + else + { + gGL.getTexUnit(1)->activate(); + glMatrixMode(GL_TEXTURE); + glLoadMatrixf((GLfloat*) params.mTextureMatrix->mMatrix); + gPipeline.mTextureMatrixOps++; + gGL.getTexUnit(0)->activate(); + } + glLoadMatrixf((GLfloat*) params.mTextureMatrix->mMatrix); gPipeline.mTextureMatrixOps++; - gGL.getTexUnit(0)->activate(); - } - - glLoadMatrixf((GLfloat*) params.mTextureMatrix->mMatrix); - gPipeline.mTextureMatrixOps++; - } - if (mShiny && mVertexShaderLevel > 1 && texture) - { - if (params.mTexture.notNull()) - { - gGL.getTexUnit(diffuse_channel)->bind(params.mTexture) ; - params.mTexture->addTextureStats(params.mVSize); + tex_setup = true; } - else + + if (mShiny && mVertexShaderLevel > 1 && texture) { - gGL.getTexUnit(diffuse_channel)->unbind(LLTexUnit::TT_TEXTURE); + if (params.mTexture.notNull()) + { + gGL.getTexUnit(diffuse_channel)->bind(params.mTexture) ; + params.mTexture->addTextureStats(params.mVSize); + } + else + { + gGL.getTexUnit(diffuse_channel)->unbind(LLTexUnit::TT_TEXTURE); + } } } - + if (params.mGroup) { params.mGroup->rebuildMesh(); @@ -1344,7 +1386,7 @@ void LLDrawPoolBump::pushBatch(LLDrawInfo& params, U32 mask, BOOL texture) params.mVertexBuffer->setBuffer(mask); params.mVertexBuffer->drawRange(params.mDrawMode, params.mStart, params.mEnd, params.mCount, params.mOffset); gPipeline.addTrianglesDrawn(params.mCount, params.mDrawMode); - if (params.mTextureMatrix) + if (tex_setup) { if (mShiny) { diff --git a/indra/newview/lldrawpoolbump.h b/indra/newview/lldrawpoolbump.h index f4702bf61d4ed3ed8d8a2c6545cc36f0fcdaf64a..476b1d41b7d40d85ac08d6fb353cabe18d4773b3 100644 --- a/indra/newview/lldrawpoolbump.h +++ b/indra/newview/lldrawpoolbump.h @@ -55,7 +55,7 @@ protected : virtual void endRenderPass( S32 pass ); virtual S32 getNumPasses(); /*virtual*/ void prerender(); - /*virtual*/ void pushBatch(LLDrawInfo& params, U32 mask, BOOL texture); + /*virtual*/ void pushBatch(LLDrawInfo& params, U32 mask, BOOL texture, BOOL batch_textures = FALSE); void renderBump(U32 type, U32 mask); void renderGroup(LLSpatialGroup* group, U32 type, U32 mask, BOOL texture); diff --git a/indra/newview/lldrawpoolsimple.cpp b/indra/newview/lldrawpoolsimple.cpp index 2e83167851d7abd61941c00da7889d5a386dc7c7..5dbb27cabb84e174b0dcb0b9a7f4c82daa266ec6 100644 --- a/indra/newview/lldrawpoolsimple.cpp +++ b/indra/newview/lldrawpoolsimple.cpp @@ -44,6 +44,36 @@ static LLGLSLShader* fullbright_shader = NULL; static LLFastTimer::DeclareTimer FTM_RENDER_SIMPLE_DEFERRED("Deferred Simple"); static LLFastTimer::DeclareTimer FTM_RENDER_GRASS_DEFERRED("Deferred Grass"); +void LLDrawPoolGlow::beginPostDeferredPass(S32 pass) +{ + gDeferredFullbrightProgram.bind(); +} + +void LLDrawPoolGlow::renderPostDeferred(S32 pass) +{ + LLFastTimer t(FTM_RENDER_GLOW); + LLGLEnable blend(GL_BLEND); + LLGLDisable test(GL_ALPHA_TEST); + gGL.flush(); + /// Get rid of z-fighting with non-glow pass. + LLGLEnable polyOffset(GL_POLYGON_OFFSET_FILL); + glPolygonOffset(-1.0f, -1.0f); + gGL.setSceneBlendType(LLRender::BT_ADD); + + LLGLDepthTest depth(GL_TRUE, GL_FALSE); + gGL.setColorMask(false, true); + pushBatches(LLRenderPass::PASS_GLOW, getVertexDataMask() | LLVertexBuffer::MAP_TEXTURE_INDEX, TRUE, TRUE); + + gGL.setColorMask(true, false); + gGL.setSceneBlendType(LLRender::BT_ALPHA); +} + +void LLDrawPoolGlow::endPostDeferredPass(S32 pass) +{ + gDeferredFullbrightProgram.unbind(); + LLRenderPass::endRenderPass(pass); +} + void LLDrawPoolGlow::render(S32 pass) { LLFastTimer t(FTM_RENDER_GLOW); @@ -68,7 +98,15 @@ void LLDrawPoolGlow::render(S32 pass) LLGLDepthTest depth(GL_TRUE, GL_FALSE); gGL.setColorMask(false, true); - renderTexture(LLRenderPass::PASS_GLOW, getVertexDataMask()); + + if (shader_level > 1) + { + pushBatches(LLRenderPass::PASS_GLOW, getVertexDataMask() | LLVertexBuffer::MAP_TEXTURE_INDEX, TRUE, TRUE); + } + else + { + renderTexture(LLRenderPass::PASS_GLOW, getVertexDataMask()); + } gGL.setColorMask(true, false); gGL.setSceneBlendType(LLRender::BT_ALPHA); @@ -79,10 +117,10 @@ void LLDrawPoolGlow::render(S32 pass) } } -void LLDrawPoolGlow::pushBatch(LLDrawInfo& params, U32 mask, BOOL texture) +void LLDrawPoolGlow::pushBatch(LLDrawInfo& params, U32 mask, BOOL texture, BOOL batch_textures) { glColor4ubv(params.mGlowColor.mV); - LLRenderPass::pushBatch(params, mask, texture); + LLRenderPass::pushBatch(params, mask, texture, batch_textures); } @@ -126,10 +164,11 @@ void LLDrawPoolSimple::beginRenderPass(S32 pass) void LLDrawPoolSimple::endRenderPass(S32 pass) { LLFastTimer t(FTM_RENDER_SIMPLE); + stop_glerror(); LLRenderPass::endRenderPass(pass); - - if (mVertexShaderLevel > 0){ - + stop_glerror(); + if (mVertexShaderLevel > 0) + { simple_shader->unbind(); } } @@ -142,13 +181,24 @@ void LLDrawPoolSimple::render(S32 pass) { //render simple LLFastTimer t(FTM_RENDER_SIMPLE); gPipeline.enableLightsDynamic(); - renderTexture(LLRenderPass::PASS_SIMPLE, getVertexDataMask()); - if (LLPipeline::sRenderDeferred) - { //if deferred rendering is enabled, bump faces aren't registered as simple - //render bump faces here as simple so bump faces will appear under water - renderTexture(LLRenderPass::PASS_BUMP, getVertexDataMask()); + if (mVertexShaderLevel > 0) + { + U32 mask = getVertexDataMask() | LLVertexBuffer::MAP_TEXTURE_INDEX; + + pushBatches(LLRenderPass::PASS_SIMPLE, mask, TRUE, TRUE); + + if (LLPipeline::sRenderDeferred) + { //if deferred rendering is enabled, bump faces aren't registered as simple + //render bump faces here as simple so bump faces will appear under water + pushBatches(LLRenderPass::PASS_BUMP, mask, TRUE, TRUE); + } + } + else + { + renderTexture(LLRenderPass::PASS_SIMPLE, getVertexDataMask()); } + } } @@ -177,7 +227,7 @@ void LLDrawPoolSimple::renderDeferred(S32 pass) { //render simple LLFastTimer t(FTM_RENDER_SIMPLE_DEFERRED); - renderTexture(LLRenderPass::PASS_SIMPLE, getVertexDataMask()); + pushBatches(LLRenderPass::PASS_SIMPLE, getVertexDataMask() | LLVertexBuffer::MAP_TEXTURE_INDEX, TRUE, TRUE); } } @@ -200,11 +250,11 @@ void LLDrawPoolGrass::beginRenderPass(S32 pass) if (LLPipeline::sUnderWaterRender) { - simple_shader = &gObjectSimpleWaterProgram; + simple_shader = &gObjectSimpleNonIndexedWaterProgram; } else { - simple_shader = &gObjectSimpleProgram; + simple_shader = &gObjectSimpleNonIndexedProgram; } if (mVertexShaderLevel > 0) @@ -285,6 +335,26 @@ void LLDrawPoolFullbright::prerender() mVertexShaderLevel = LLViewerShaderMgr::instance()->getVertexShaderLevel(LLViewerShaderMgr::SHADER_OBJECT); } +void LLDrawPoolFullbright::beginPostDeferredPass(S32 pass) +{ + gDeferredFullbrightProgram.bind(); +} + +void LLDrawPoolFullbright::renderPostDeferred(S32 pass) +{ + LLFastTimer t(FTM_RENDER_FULLBRIGHT); + + gGL.setSceneBlendType(LLRender::BT_ALPHA); + U32 fullbright_mask = LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0 | LLVertexBuffer::MAP_COLOR | LLVertexBuffer::MAP_TEXTURE_INDEX; + pushBatches(LLRenderPass::PASS_FULLBRIGHT, fullbright_mask, TRUE, TRUE); +} + +void LLDrawPoolFullbright::endPostDeferredPass(S32 pass) +{ + gDeferredFullbrightProgram.unbind(); + LLRenderPass::endRenderPass(pass); +} + void LLDrawPoolFullbright::beginRenderPass(S32 pass) { LLFastTimer t(FTM_RENDER_FULLBRIGHT); @@ -313,25 +383,21 @@ void LLDrawPoolFullbright::endRenderPass(S32 pass) void LLDrawPoolFullbright::render(S32 pass) { //render fullbright LLFastTimer t(FTM_RENDER_FULLBRIGHT); + gGL.setSceneBlendType(LLRender::BT_ALPHA); + if (mVertexShaderLevel > 0) { fullbright_shader->bind(); fullbright_shader->uniform1f(LLViewerShaderMgr::FULLBRIGHT, 1.f); + U32 fullbright_mask = LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0 | LLVertexBuffer::MAP_COLOR | LLVertexBuffer::MAP_TEXTURE_INDEX; + pushBatches(LLRenderPass::PASS_FULLBRIGHT, fullbright_mask, TRUE, TRUE); } else { gPipeline.enableLightsFullbright(LLColor4(1,1,1,1)); + U32 fullbright_mask = LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0 | LLVertexBuffer::MAP_COLOR; + renderTexture(LLRenderPass::PASS_FULLBRIGHT, fullbright_mask); } - - //gGL.setAlphaRejectSettings(LLRender::CF_GREATER, 0.25f); - - //LLGLEnable test(GL_ALPHA_TEST); - //LLGLEnable blend(GL_BLEND); - gGL.setSceneBlendType(LLRender::BT_ALPHA); - U32 fullbright_mask = LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0 | LLVertexBuffer::MAP_COLOR; - renderTexture(LLRenderPass::PASS_FULLBRIGHT, fullbright_mask); - - //gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT); } S32 LLDrawPoolFullbright::getNumPasses() diff --git a/indra/newview/lldrawpoolsimple.h b/indra/newview/lldrawpoolsimple.h index 5f3bbebbdad5e6df941150e3f387c61ddfc72880..3811b3d398f872193cb6861e63c053f6f926e263 100644 --- a/indra/newview/lldrawpoolsimple.h +++ b/indra/newview/lldrawpoolsimple.h @@ -98,9 +98,9 @@ class LLDrawPoolFullbright : public LLRenderPass LLDrawPoolFullbright(); /*virtual*/ S32 getNumPostDeferredPasses() { return 1; } - /*virtual*/ void beginPostDeferredPass(S32 pass) { beginRenderPass(pass); } - /*virtual*/ void endPostDeferredPass(S32 pass) { endRenderPass(pass); } - /*virtual*/ void renderPostDeferred(S32 pass) { render(pass); } + /*virtual*/ void beginPostDeferredPass(S32 pass); + /*virtual*/ void endPostDeferredPass(S32 pass); + /*virtual*/ void renderPostDeferred(S32 pass); /*virtual*/ void beginRenderPass(S32 pass); /*virtual*/ void endRenderPass(S32 pass); @@ -126,12 +126,12 @@ class LLDrawPoolGlow : public LLRenderPass virtual void prerender() { } /*virtual*/ S32 getNumPostDeferredPasses() { return 1; } - /*virtual*/ void beginPostDeferredPass(S32 pass) { beginRenderPass(pass); } - /*virtual*/ void endPostDeferredPass(S32 pass) { endRenderPass(pass); } - /*virtual*/ void renderPostDeferred(S32 pass) { render(pass); } + /*virtual*/ void beginPostDeferredPass(S32 pass); + /*virtual*/ void endPostDeferredPass(S32 pass); + /*virtual*/ void renderPostDeferred(S32 pass); void render(S32 pass = 0); - void pushBatch(LLDrawInfo& params, U32 mask, BOOL texture = TRUE); + void pushBatch(LLDrawInfo& params, U32 mask, BOOL texture = TRUE, BOOL batch_textures = FALSE); }; diff --git a/indra/newview/lldrawpooltree.cpp b/indra/newview/lldrawpooltree.cpp index 195ee60a2ef164019287c4ccc860d209e0f3a9a7..81c796b14630f19aea34b1fcdaac174baf95688b 100644 --- a/indra/newview/lldrawpooltree.cpp +++ b/indra/newview/lldrawpooltree.cpp @@ -66,11 +66,11 @@ void LLDrawPoolTree::beginRenderPass(S32 pass) if (LLPipeline::sUnderWaterRender) { - shader = &gObjectSimpleWaterProgram; + shader = &gObjectSimpleNonIndexedWaterProgram; } else { - shader = &gObjectSimpleProgram; + shader = &gObjectSimpleNonIndexedProgram; } if (gPipeline.canUseWindLightShadersOnObjects()) diff --git a/indra/newview/lldrawpoolwlsky.cpp b/indra/newview/lldrawpoolwlsky.cpp index 696c2d1abdcf3533f291c2193fdbaa4921d222b6..409b18d5229cb6c2c0cccd8620ce9dad9873f938 100644 --- a/indra/newview/lldrawpoolwlsky.cpp +++ b/indra/newview/lldrawpoolwlsky.cpp @@ -44,6 +44,8 @@ LLPointer<LLViewerTexture> LLDrawPoolWLSky::sCloudNoiseTexture = NULL; LLPointer<LLImageRaw> LLDrawPoolWLSky::sCloudNoiseRawImage = NULL; +static LLGLSLShader* cloud_shader = NULL; +static LLGLSLShader* sky_shader = NULL; LLDrawPoolWLSky::LLDrawPoolWLSky(void) : @@ -83,12 +85,32 @@ LLViewerTexture *LLDrawPoolWLSky::getDebugTexture() void LLDrawPoolWLSky::beginRenderPass( S32 pass ) { + sky_shader = + LLPipeline::sUnderWaterRender ? + &gObjectSimpleWaterProgram : + &gWLSkyProgram; + + cloud_shader = + LLPipeline::sUnderWaterRender ? + &gObjectSimpleWaterProgram : + &gWLCloudProgram; } void LLDrawPoolWLSky::endRenderPass( S32 pass ) { } +void LLDrawPoolWLSky::beginDeferredPass(S32 pass) +{ + sky_shader = &gDeferredWLSkyProgram; + cloud_shader = &gDeferredWLCloudProgram; +} + +void LLDrawPoolWLSky::endDeferredPass(S32 pass) +{ + +} + void LLDrawPoolWLSky::renderDome(F32 camHeightLocal, LLGLSLShader * shader) const { LLVector3 const & origin = LLViewerCamera::getInstance()->getOrigin(); @@ -128,19 +150,14 @@ void LLDrawPoolWLSky::renderSkyHaze(F32 camHeightLocal) const { if (gPipeline.canUseWindLightShaders() && gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_SKY)) { - LLGLSLShader* shader = - LLPipeline::sUnderWaterRender ? - &gObjectSimpleWaterProgram : - &gWLSkyProgram; - LLGLDisable blend(GL_BLEND); - shader->bind(); + sky_shader->bind(); /// Render the skydome - renderDome(camHeightLocal, shader); + renderDome(camHeightLocal, sky_shader); - shader->unbind(); + sky_shader->unbind(); } } @@ -186,23 +203,18 @@ void LLDrawPoolWLSky::renderSkyClouds(F32 camHeightLocal) const { if (gPipeline.canUseWindLightShaders() && gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_CLOUDS)) { - LLGLSLShader* shader = - LLPipeline::sUnderWaterRender ? - &gObjectSimpleWaterProgram : - &gWLCloudProgram; - LLGLEnable blend(GL_BLEND); gGL.setSceneBlendType(LLRender::BT_ALPHA); gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT); gGL.getTexUnit(0)->bind(sCloudNoiseTexture); - shader->bind(); + cloud_shader->bind(); /// Render the skydome - renderDome(camHeightLocal, shader); + renderDome(camHeightLocal, cloud_shader); - shader->unbind(); + cloud_shader->unbind(); } } @@ -246,6 +258,53 @@ void LLDrawPoolWLSky::renderHeavenlyBodies() } } +void LLDrawPoolWLSky::renderDeferred(S32 pass) +{ + if (!gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_SKY)) + { + return; + } + LLFastTimer ftm(FTM_RENDER_WL_SKY); + + const F32 camHeightLocal = LLWLParamManager::instance()->getDomeOffset() * LLWLParamManager::instance()->getDomeRadius(); + + LLGLSNoFog disableFog; + LLGLDepthTest depth(GL_TRUE, GL_FALSE); + LLGLDisable clip(GL_CLIP_PLANE0); + + gGL.setColorMask(true, false); + + LLGLSquashToFarClip far_clip(glh_get_current_projection()); + + renderSkyHaze(camHeightLocal); + + LLVector3 const & origin = LLViewerCamera::getInstance()->getOrigin(); + glPushMatrix(); + + + glTranslatef(origin.mV[0], origin.mV[1], origin.mV[2]); + + gDeferredStarProgram.bind(); + // *NOTE: have to bind a texture here since register combiners blending in + // renderStars() requires something to be bound and we might as well only + // bind the moon's texture once. + gGL.getTexUnit(0)->bind(gSky.mVOSkyp->mFace[LLVOSky::FACE_MOON]->getTexture()); + + renderHeavenlyBodies(); + + renderStars(); + + gDeferredStarProgram.unbind(); + + glPopMatrix(); + + renderSkyClouds(camHeightLocal); + + gGL.setColorMask(true, true); + //gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); + +} + void LLDrawPoolWLSky::render(S32 pass) { if (!gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_SKY)) diff --git a/indra/newview/lldrawpoolwlsky.h b/indra/newview/lldrawpoolwlsky.h index 8ca1ebb94273994f01e72d5c3558ae4394082c35..cd15c991ee091fefb8e4f3f6a7ab452fa77364bb 100644 --- a/indra/newview/lldrawpoolwlsky.h +++ b/indra/newview/lldrawpoolwlsky.h @@ -44,10 +44,10 @@ class LLDrawPoolWLSky : public LLDrawPool { /*virtual*/ BOOL isDead() { return FALSE; } - /*virtual*/ S32 getNumPostDeferredPasses() { return getNumPasses(); } - /*virtual*/ void beginPostDeferredPass(S32 pass) { beginRenderPass(pass); } - /*virtual*/ void endPostDeferredPass(S32 pass) { endRenderPass(pass); } - /*virtual*/ void renderPostDeferred(S32 pass) { render(pass); } + /*virtual*/ S32 getNumDeferredPasses() { return 1; } + /*virtual*/ void beginDeferredPass(S32 pass); + /*virtual*/ void endDeferredPass(S32 pass); + /*virtual*/ void renderDeferred(S32 pass); /*virtual*/ LLViewerTexture *getDebugTexture(); /*virtual*/ void beginRenderPass( S32 pass ); diff --git a/indra/newview/llface.cpp b/indra/newview/llface.cpp index 5398c13c44086aca667eabfac288df518b749807..b6566fcbd094da1b4c887f89ac667fafd942b1ba 100644 --- a/indra/newview/llface.cpp +++ b/indra/newview/llface.cpp @@ -165,6 +165,7 @@ void LLFace::init(LLDrawable* drawablep, LLViewerObject* objp) mIndexInTex = 0; mTexture = NULL; mTEOffset = -1; + mTextureIndex = 255; setDrawable(drawablep); mVObjp = objp; @@ -364,14 +365,7 @@ void LLFace::setSize(S32 num_vertices, S32 num_indices, bool align) //allocate vertices in blocks of 4 for alignment num_vertices = (num_vertices + 0x3) & ~0x3; } - else - { - if (mDrawablep->getVOVolume()) - { - llerrs << "WTF?" << llendl; - } - } - + if (mGeomCount != num_vertices || mIndicesCount != num_indices) { @@ -393,6 +387,26 @@ void LLFace::setGeomIndex(U16 idx) } } +void LLFace::setTextureIndex(U8 index) +{ + if (index != mTextureIndex) + { + mTextureIndex = index; + + if (mTextureIndex != 255) + { + mDrawablep->setState(LLDrawable::REBUILD_POSITION); + } + else + { + if (mDrawInfo && !mDrawInfo->mTextureList.empty()) + { + llerrs << "Face with no texture index references indexed texture draw info." << llendl; + } + } + } +} + void LLFace::setIndicesIndex(S32 idx) { if (mIndicesIndex != idx) @@ -415,11 +429,11 @@ U16 LLFace::getGeometryAvatar( if (mVertexBuffer.notNull()) { - mVertexBuffer->getVertexStrider (vertices, mGeomIndex); - mVertexBuffer->getNormalStrider (normals, mGeomIndex); - mVertexBuffer->getTexCoord0Strider (tex_coords, mGeomIndex); - mVertexBuffer->getWeightStrider(vertex_weights, mGeomIndex); - mVertexBuffer->getClothWeightStrider(clothing_weights, mGeomIndex); + mVertexBuffer->getVertexStrider (vertices, mGeomIndex, mGeomCount); + mVertexBuffer->getNormalStrider (normals, mGeomIndex, mGeomCount); + mVertexBuffer->getTexCoord0Strider (tex_coords, mGeomIndex, mGeomCount); + mVertexBuffer->getWeightStrider(vertex_weights, mGeomIndex, mGeomCount); + mVertexBuffer->getClothWeightStrider(clothing_weights, mGeomIndex, mGeomCount); } return mGeomIndex; @@ -432,17 +446,17 @@ U16 LLFace::getGeometry(LLStrider<LLVector3> &vertices, LLStrider<LLVector3> &no if (mVertexBuffer.notNull()) { - mVertexBuffer->getVertexStrider(vertices, mGeomIndex); + mVertexBuffer->getVertexStrider(vertices, mGeomIndex, mGeomCount); if (mVertexBuffer->hasDataType(LLVertexBuffer::TYPE_NORMAL)) { - mVertexBuffer->getNormalStrider(normals, mGeomIndex); + mVertexBuffer->getNormalStrider(normals, mGeomIndex, mGeomCount); } if (mVertexBuffer->hasDataType(LLVertexBuffer::TYPE_TEXCOORD0)) { - mVertexBuffer->getTexCoord0Strider(tex_coords, mGeomIndex); + mVertexBuffer->getTexCoord0Strider(tex_coords, mGeomIndex, mGeomCount); } - mVertexBuffer->getIndexStrider(indicesp, mIndicesIndex); + mVertexBuffer->getIndexStrider(indicesp, mIndicesIndex, mIndicesCount); } return mGeomIndex; @@ -679,6 +693,19 @@ static void xform(LLVector2 &tex_coord, F32 cosAng, F32 sinAng, F32 offS, F32 of } +bool less_than_max_mag(const LLVector4a& vec) +{ + LLVector4a MAX_MAG; + MAX_MAG.splat(1024.f*1024.f); + + LLVector4a val; + val.setAbs(vec); + + S32 lt = val.lessThan(MAX_MAG).getGatheredBits() & 0x7; + + return lt == 0x7; +} + BOOL LLFace::genVolumeBBoxes(const LLVolume &volume, S32 f, const LLMatrix4& mat_vert_in, const LLMatrix3& mat_normal_in, BOOL global_volume) { @@ -713,6 +740,8 @@ BOOL LLFace::genVolumeBBoxes(const LLVolume &volume, S32 f, min = face.mExtents[0]; max = face.mExtents[1]; + llassert(less_than_max_mag(min)); + llassert(less_than_max_mag(max)); //min, max are in volume space, convert to drawable render space LLVector4a center; @@ -724,6 +753,9 @@ BOOL LLFace::genVolumeBBoxes(const LLVolume &volume, S32 f, size.setSub(max, min); size.mul(0.5f); + llassert(less_than_max_mag(min)); + llassert(less_than_max_mag(max)); + if (!global_volume) { //VECTORIZE THIS @@ -761,6 +793,8 @@ BOOL LLFace::genVolumeBBoxes(const LLVolume &volume, S32 f, newMin = newMax = center; + llassert(less_than_max_mag(center)); + for (U32 i = 0; i < 4; i++) { LLVector4a delta; @@ -772,6 +806,9 @@ BOOL LLFace::genVolumeBBoxes(const LLVolume &volume, S32 f, newMin.setMin(newMin,min); newMax.setMax(newMax,max); + + llassert(less_than_max_mag(newMin)); + llassert(less_than_max_mag(newMax)); } if (!mDrawablep->isActive()) @@ -780,14 +817,22 @@ BOOL LLFace::genVolumeBBoxes(const LLVolume &volume, S32 f, offset.load3(mDrawablep->getRegion()->getOriginAgent().mV); newMin.add(offset); newMax.add(offset); + + llassert(less_than_max_mag(newMin)); + llassert(less_than_max_mag(newMax)); } t.setAdd(newMin, newMax); t.mul(0.5f); + llassert(less_than_max_mag(t)); + //VECTORIZE THIS mCenterLocal.set(t.getF32ptr()); + llassert(less_than_max_mag(newMin)); + llassert(less_than_max_mag(newMax)); + t.setSub(newMax,newMin); mBoundingSphereRadius = t.getLength3().getF32()*0.5f; @@ -1078,27 +1123,6 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume, const LLTextureEntry *tep = mVObjp->getTE(f); const U8 bump_code = tep ? tep->getBumpmap() : 0; - if (rebuild_pos) - { - mVertexBuffer->getVertexStrider(vert, mGeomIndex); - vertices = (LLVector4a*) vert.get(); - } - if (rebuild_normal) - { - mVertexBuffer->getNormalStrider(norm, mGeomIndex); - normals = (LLVector4a*) norm.get(); - } - if (rebuild_binormal) - { - mVertexBuffer->getBinormalStrider(binorm, mGeomIndex); - binormals = (LLVector4a*) binorm.get(); - } - if (rebuild_weights) - { - mVertexBuffer->getWeight4Strider(wght, mGeomIndex); - weights = (LLVector4a*) wght.get(); - } - F32 tcoord_xoffset = 0.f ; F32 tcoord_yoffset = 0.f ; F32 tcoord_xscale = 1.f ; @@ -1107,12 +1131,6 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume, if (rebuild_tcoord) { - mVertexBuffer->getTexCoord0Strider(tex_coords, mGeomIndex); - if (bump_code && mVertexBuffer->hasDataType(LLVertexBuffer::TYPE_TEXCOORD1)) - { - mVertexBuffer->getTexCoord1Strider(tex_coords2, mGeomIndex); - } - in_atlas = isAtlasInUse() ; if(in_atlas) { @@ -1125,11 +1143,7 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume, tcoord_yscale = tmp->mV[1] ; } } - if (rebuild_color) - { - mVertexBuffer->getColorStrider(colors, mGeomIndex); - } - + BOOL is_static = mDrawablep->isStatic(); BOOL is_global = is_static; @@ -1168,7 +1182,8 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume, // INDICES if (full_rebuild) { - mVertexBuffer->getIndexStrider(indicesp, mIndicesIndex); + mVertexBuffer->getIndexStrider(indicesp, mIndicesIndex, mIndicesCount, true); + __m128i* dst = (__m128i*) indicesp.get(); __m128i* src = (__m128i*) vf.mIndices; __m128i offset = _mm_set1_epi16(index_offset); @@ -1185,6 +1200,8 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume, { indicesp[i] = vf.mIndices[i]+index_offset; } + + mVertexBuffer->setBuffer(0); } LLMatrix4a mat_normal; @@ -1330,6 +1347,8 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume, if (!in_atlas && !do_bump) { //not in atlas or not bump mapped, might be able to do a cheap update + mVertexBuffer->getTexCoord0Strider(tex_coords, mGeomIndex, mGeomCount); + if (texgen != LLTextureEntry::TEX_GEN_PLANAR) { if (!do_tex_mat) @@ -1402,9 +1421,15 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume, } } } + + mVertexBuffer->setBuffer(0); } else { //either bump mapped or in atlas, just do the whole expensive loop + mVertexBuffer->getTexCoord0Strider(tex_coords, mGeomIndex, mGeomCount, true); + + std::vector<LLVector2> bump_tc; + for (S32 i = 0; i < num_vertices; i++) { LLVector2 tc(vf.mTexCoords[i]); @@ -1535,8 +1560,20 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume, *tex_coords++ = tc; - - if (bump_code && mVertexBuffer->hasDataType(LLVertexBuffer::TYPE_TEXCOORD1)) + if (do_bump) + { + bump_tc.push_back(tc); + } + } + + mVertexBuffer->setBuffer(0); + + + if (do_bump) + { + mVertexBuffer->getTexCoord1Strider(tex_coords2, mGeomIndex, mGeomCount, true); + + for (S32 i = 0; i < num_vertices; i++) { LLVector4a tangent; tangent.setCross3(vf.mBinormals[i], vf.mNormals[i]); @@ -1558,16 +1595,22 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume, } binormal.normalize3fast(); + LLVector2 tc = bump_tc[i]; tc += LLVector2( bump_s_primary_light_ray.dot3(tangent).getF32(), bump_t_primary_light_ray.dot3(binormal).getF32() ); *tex_coords2++ = tc; - } + } + + mVertexBuffer->setBuffer(0); } } } if (rebuild_pos) { + mVertexBuffer->getVertexStrider(vert, mGeomIndex, mGeomCount, true); + vertices = (LLVector4a*) vert.get(); + LLMatrix4a mat_vert; mat_vert.loadu(mat_vert_in); @@ -1580,10 +1623,28 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume, mat_vert.affineTransform(*src++, *dst++); } while(dst < end); + + F32 index = (F32) (mTextureIndex < 255 ? mTextureIndex : 0); + F32 *index_dst = (F32*) vertices; + F32 *index_end = (F32*) end; + + index_dst += 3; + index_end += 3; + do + { + *index_dst = index; + index_dst += 4; + } + while (index_dst < index_end); + + mVertexBuffer->setBuffer(0); } if (rebuild_normal) { + mVertexBuffer->getNormalStrider(norm, mGeomIndex, mGeomCount, true); + normals = (LLVector4a*) norm.get(); + for (S32 i = 0; i < num_vertices; i++) { LLVector4a normal; @@ -1591,10 +1652,15 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume, normal.normalize3fast(); normals[i] = normal; } + + mVertexBuffer->setBuffer(0); } if (rebuild_binormal) { + mVertexBuffer->getBinormalStrider(binorm, mGeomIndex, mGeomCount, true); + binormals = (LLVector4a*) binorm.get(); + for (S32 i = 0; i < num_vertices; i++) { LLVector4a binormal; @@ -1602,15 +1668,22 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume, binormal.normalize3fast(); binormals[i] = binormal; } + + mVertexBuffer->setBuffer(0); } if (rebuild_weights && vf.mWeights) { + mVertexBuffer->getWeight4Strider(wght, mGeomIndex, mGeomCount, true); + weights = (LLVector4a*) wght.get(); LLVector4a::memcpyNonAliased16((F32*) weights, (F32*) vf.mWeights, num_vertices*4*sizeof(F32)); + mVertexBuffer->setBuffer(0); } if (rebuild_color) { + mVertexBuffer->getColorStrider(colors, mGeomIndex, mGeomCount, true); + LLVector4a src; U32 vec[4]; @@ -1629,6 +1702,8 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume, { dst[i] = src; } + + mVertexBuffer->setBuffer(0); } if (rebuild_tcoord) @@ -2045,13 +2120,13 @@ S32 LLFace::getColors(LLStrider<LLColor4U> &colors) } // llassert(mGeomIndex >= 0); - mVertexBuffer->getColorStrider(colors, mGeomIndex); + mVertexBuffer->getColorStrider(colors, mGeomIndex, mGeomCount); return mGeomIndex; } S32 LLFace::getIndices(LLStrider<U16> &indicesp) { - mVertexBuffer->getIndexStrider(indicesp, mIndicesIndex); + mVertexBuffer->getIndexStrider(indicesp, mIndicesIndex, mIndicesCount); llassert(indicesp[0] != indicesp[1]); return mIndicesIndex; } diff --git a/indra/newview/llface.h b/indra/newview/llface.h index b2170c4cf3fd271c7cfd63ab7006d752892c0c3b..b5eaeecd60ea18c533f441e7c9b04c51386ef85f 100644 --- a/indra/newview/llface.h +++ b/indra/newview/llface.h @@ -94,6 +94,8 @@ class LLFace U16 getGeomCount() const { return mGeomCount; } // vertex count for this face U16 getGeomIndex() const { return mGeomIndex; } // index into draw pool U16 getGeomStart() const { return mGeomIndex; } // index into draw pool + void setTextureIndex(U8 index); + U8 getTextureIndex() const { return mTextureIndex; } void setTexture(LLViewerTexture* tex) ; void switchTexture(LLViewerTexture* new_texture); void dirtyTexture(); @@ -262,6 +264,7 @@ class LLFace U16 mGeomCount; // vertex count for this face U16 mGeomIndex; // index into draw pool + U8 mTextureIndex; // index of texture channel to use for pseudo-atlasing U32 mIndicesCount; U32 mIndicesIndex; // index into draw pool for indices (yeah, I know!) S32 mIndexInTex ; diff --git a/indra/newview/llfloaterauction.cpp b/indra/newview/llfloaterauction.cpp index c95b046707528ec1d7fb01472d00cbd0e6bd481c..c6743ca13b2aae31b2945f9d1869e484c530c846 100644 --- a/indra/newview/llfloaterauction.cpp +++ b/indra/newview/llfloaterauction.cpp @@ -55,6 +55,7 @@ #include "llrender.h" #include "llsdutil.h" #include "llsdutil_math.h" +#include "lltrans.h" ///---------------------------------------------------------------------------- /// Local function declarations, constants, enums, and typedefs @@ -457,7 +458,7 @@ void LLFloaterAuction::onClickSellToAnyone(void* data) LLSD args; args["LAND_SIZE"] = llformat("%d", area); args["SALE_PRICE"] = llformat("%d", sale_price); - args["NAME"] = "Anyone"; + args["NAME"] = LLTrans::getString("Anyone"); LLNotification::Params params("ConfirmLandSaleChange"); // Re-use existing dialog params.substitutions(args) diff --git a/indra/newview/llfloatermodelpreview.cpp b/indra/newview/llfloatermodelpreview.cpp index 9dd5269a6b4811519a3558bc73d966e2d797a6f6..ab6753b4be31b9f4ea0ab1cfc4c98170f2f7f671 100644 --- a/indra/newview/llfloatermodelpreview.cpp +++ b/indra/newview/llfloatermodelpreview.cpp @@ -178,6 +178,80 @@ std::string lod_label_name[NUM_LOD+1] = "I went off the end of the lod_label_name array. Me so smart." }; + +#define LL_DEGENERACY_TOLERANCE 1e-7f + +inline F32 dot3fpu(const LLVector4a& a, const LLVector4a& b) +{ + volatile F32 p0 = a[0] * b[0]; + volatile F32 p1 = a[1] * b[1]; + volatile F32 p2 = a[2] * b[2]; + return p0 + p1 + p2; +} + +bool ll_is_degenerate(const LLVector4a& a, const LLVector4a& b, const LLVector4a& c, F32 tolerance = LL_DEGENERACY_TOLERANCE) +{ + // small area check + { + LLVector4a edge1; edge1.setSub( a, b ); + LLVector4a edge2; edge2.setSub( a, c ); + ////////////////////////////////////////////////////////////////////////// + /// Linden Modified + ////////////////////////////////////////////////////////////////////////// + + // If no one edge is more than 10x longer than any other edge, we weaken + // the tolerance by a factor of 1e-4f. + + LLVector4a edge3; edge3.setSub( c, b ); + const F32 len1sq = edge1.dot3(edge1).getF32(); + const F32 len2sq = edge2.dot3(edge2).getF32(); + const F32 len3sq = edge3.dot3(edge3).getF32(); + bool abOK = (len1sq <= 100.f * len2sq) && (len1sq <= 100.f * len3sq); + bool acOK = (len2sq <= 100.f * len1sq) && (len1sq <= 100.f * len3sq); + bool cbOK = (len3sq <= 100.f * len1sq) && (len1sq <= 100.f * len2sq); + if ( abOK && acOK && cbOK ) + { + tolerance *= 1e-4f; + } + + ////////////////////////////////////////////////////////////////////////// + /// End Modified + ////////////////////////////////////////////////////////////////////////// + + LLVector4a cross; cross.setCross3( edge1, edge2 ); + + LLVector4a edge1b; edge1b.setSub( b, a ); + LLVector4a edge2b; edge2b.setSub( b, c ); + LLVector4a crossb; crossb.setCross3( edge1b, edge2b ); + + if ( ( cross.dot3(cross).getF32() < tolerance ) || ( crossb.dot3(crossb).getF32() < tolerance )) + { + return true; + } + } + + // point triangle distance check + { + LLVector4a Q; Q.setSub(a, b); + LLVector4a R; R.setSub(c, b); + + const F32 QQ = dot3fpu(Q, Q); + const F32 RR = dot3fpu(R, R); + const F32 QR = dot3fpu(R, Q); + + volatile F32 QQRR = QQ * RR; + volatile F32 QRQR = QR * QR; + F32 Det = (QQRR - QRQR); + + if( Det == 0.0f ) + { + return true; + } + } + + return false; +} + bool validate_face(const LLVolumeFace& face) { for (U32 i = 0; i < face.mNumIndices; ++i) @@ -189,6 +263,31 @@ bool validate_face(const LLVolumeFace& face) } } + if (face.mNumIndices % 3 != 0 || face.mNumIndices == 0) + { + llwarns << "Face has invalid number of indices." << llendl; + return false; + } + + /*const LLVector4a scale(0.5f); + + for (U32 i = 0; i < face.mNumIndices; i+=3) + { + U16 idx1 = face.mIndices[i]; + U16 idx2 = face.mIndices[i+1]; + U16 idx3 = face.mIndices[i+2]; + + LLVector4a v1; v1.setMul(face.mPositions[idx1], scale); + LLVector4a v2; v2.setMul(face.mPositions[idx2], scale); + LLVector4a v3; v3.setMul(face.mPositions[idx3], scale); + + if (ll_is_degenerate(v1,v2,v3)) + { + llwarns << "Degenerate face found!" << llendl; + return false; + } + }*/ + return true; } @@ -314,15 +413,17 @@ BOOL LLFloaterModelPreview::postBuild() childSetCommitCallback("pelvis_offset", onPelvisOffsetCommit, this); childSetCommitCallback("lod_file_or_limit", refresh, this); - childSetCommitCallback("physics_load_radio", refresh, this); + childSetCommitCallback("physics_load_radio", onPhysicsLoadRadioCommit, this); //childSetCommitCallback("physics_optimize", refresh, this); //childSetCommitCallback("physics_use_hull", refresh, this); childDisable("upload_skin"); childDisable("upload_joints"); - + childDisable("ok_btn"); + childSetCommitCallback("confirm_checkbox", refresh, this); + mViewOptionMenuButton = getChild<LLMenuButton>("options_gear_btn"); mCommitCallbackRegistrar.add("ModelImport.ViewOption.Action", boost::bind(&LLFloaterModelPreview::onViewOptionChecked, this, _2)); @@ -469,6 +570,29 @@ void LLFloaterModelPreview::onPelvisOffsetCommit( LLUICtrl*, void* userdata ) fp->mModelPreview->refresh(); } +//static +void LLFloaterModelPreview::onPhysicsLoadRadioCommit( LLUICtrl*, void *userdata) +{ + LLFloaterModelPreview* fmp = LLFloaterModelPreview::sInstance; + if (fmp) + { + if (fmp->childGetValue("physics_use_lod").asBoolean()) + { + onPhysicsUseLOD(NULL,NULL); + } + if (fmp->childGetValue("physics_load_from_file").asBoolean()) + { + + } + LLModelPreview *model_preview = fmp->mModelPreview; + if (model_preview) + { + model_preview->refresh(); + model_preview->updateStatusMessages(); + } + } +} + //static void LLFloaterModelPreview::onUploadJointsCommit(LLUICtrl*,void* userdata) { @@ -573,6 +697,11 @@ void LLFloaterModelPreview::draw() childSetTextArg("status", "[STATUS]", getString(LLModel::getStatusString(mModelPreview->getLoadState() - LLModelLoader::ERROR_PARSING))); } else + if ( mModelPreview->getLoadState() == LLModelLoader::ERROR_PARSING ) + { + childSetTextArg("status", "[STATUS]", getString("status_parse_error")); + } + else { childSetTextArg("status", "[STATUS]", getString("status_idle")); } @@ -992,7 +1121,7 @@ LLModelLoader::LLModelLoader( std::string filename, S32 lod, LLModelPreview* pre std::deque<std::string>& jointsFromNodes ) : mJointList( jointMap ) , mJointsFromNode( jointsFromNodes ) -, LLThread("Model Loader"), mFilename(filename), mLod(lod), mPreview(preview), mFirstTransform(TRUE) +, LLThread("Model Loader"), mFilename(filename), mLod(lod), mPreview(preview), mFirstTransform(TRUE), mNumOfFetchingTextures(0) { mJointMap["mPelvis"] = "mPelvis"; mJointMap["mTorso"] = "mTorso"; @@ -1157,11 +1286,7 @@ void stretch_extents(LLModel* model, LLMatrix4& mat, LLVector3& min, LLVector3& void LLModelLoader::run() { - if (!doLoadModel()) - { - mPreview = NULL; - } - + doLoadModel(); doOnIdleOneTime(boost::bind(&LLModelLoader::loadModelCallback,this)); } @@ -1225,6 +1350,23 @@ bool LLModelLoader::doLoadModel() return false; } + //Verify some basic properties of the dae + //1. Basic validity check on controller + U32 controllerCount = (int) db->getElementCount( NULL, "controller" ); + bool result = false; + for ( int i=0; i<controllerCount; ++i ) + { + domController* pController = NULL; + db->getElement( (daeElement**) &pController, i , NULL, "controller" ); + result = mPreview->verifyController( pController ); + if (!result) + { + setLoadState( ERROR_PARSING ); + return true; + } + } + + //get unit scale mTransform.setIdentity(); @@ -1275,7 +1417,7 @@ bool LLModelLoader::doLoadModel() if(model->getStatus() != LLModel::NO_ERRORS) { setLoadState(ERROR_PARSING + model->getStatus()) ; - return true ; //abort + return false; //abort } if (model.notNull() && validate_model(model)) @@ -1634,7 +1776,7 @@ bool LLModelLoader::doLoadModel() { if (pos.getCount() <= j+2) { - llerrs << "WTF?" << llendl; + llerrs << "Invalid position array size." << llendl; } LLVector3 v(pos[j], pos[j+1], pos[j+2]); @@ -1759,11 +1901,19 @@ bool LLModelLoader::doLoadModel() { llwarns << "document has no visual_scene" << llendl; setLoadState( ERROR_PARSING ); - return false; + return true; } + setLoadState( DONE ); - processElement(scene); + bool badElement = false; + + processElement( scene, badElement ); + + if ( badElement ) + { + setLoadState( ERROR_PARSING ); + } return true; } @@ -2124,7 +2274,8 @@ void LLModelLoader::loadTextures() iter->second[i].mMaterial[j].mDiffuseMap = LLViewerTextureManager::getFetchedTextureFromUrl("file://" + iter->second[i].mMaterial[j].mDiffuseMapFilename, TRUE, LLViewerTexture::BOOST_PREVIEW); iter->second[i].mMaterial[j].mDiffuseMap->setLoadedCallback(LLModelPreview::textureLoadedCallback, 0, TRUE, FALSE, mPreview, NULL, FALSE); - iter->second[i].mMaterial[j].mDiffuseMap->forceToSaveRawImage(); + iter->second[i].mMaterial[j].mDiffuseMap->forceToSaveRawImage(0, F32_MAX); + mNumOfFetchingTextures++ ; } } } @@ -2153,6 +2304,90 @@ bool LLModelLoader::isNodeAJoint( domNode* pNode ) return false; } +//----------------------------------------------------------------------------- +// verifyCount +//----------------------------------------------------------------------------- +bool LLModelPreview::verifyCount( int expected, int result ) +{ + if ( expected != result ) + { + llinfos<< "Error: (expected/got)"<<expected<<"/"<<result<<"verts"<<llendl; + return false; + } + return true; +} +//----------------------------------------------------------------------------- +// verifyController +//----------------------------------------------------------------------------- +bool LLModelPreview::verifyController( domController* pController ) +{ + + bool result = true; + + domSkin* pSkin = pController->getSkin(); + + if ( pSkin ) + { + xsAnyURI & uri = pSkin->getSource(); + domElement* pElement = uri.getElement(); + + if ( !pElement ) + { + llinfos<<"Can't resolve skin source"<<llendl; + return false; + } + + daeString type_str = pElement->getTypeName(); + if ( stricmp(type_str, "geometry") == 0 ) + { + //Skin is reference directly by geometry and get the vertex count from skin + domSkin::domVertex_weights* pVertexWeights = pSkin->getVertex_weights(); + U32 vertexWeightsCount = pVertexWeights->getCount(); + domGeometry* pGeometry = (domGeometry*) (domElement*) uri.getElement(); + domMesh* pMesh = pGeometry->getMesh(); + + if ( pMesh ) + { + //Get vertex count from geometry + domVertices* pVertices = pMesh->getVertices(); + if ( !pVertices ) + { + llinfos<<"No vertices!"<<llendl; + return false; + } + + if ( pVertices ) + { + xsAnyURI src = pVertices->getInput_array()[0]->getSource(); + domSource* pSource = (domSource*) (domElement*) src.getElement(); + U32 verticesCount = pSource->getTechnique_common()->getAccessor()->getCount(); + result = verifyCount( verticesCount, vertexWeightsCount ); + if ( !result ) + { + return result; + } + } + } + + U32 vcountCount = (U32) pVertexWeights->getVcount()->getValue().getCount(); + result = verifyCount( vcountCount, vertexWeightsCount ); + if ( !result ) + { + return result; + } + + domInputLocalOffset_Array& inputs = pVertexWeights->getInput_array(); + U32 sum = 0; + for (size_t i=0; i<vcountCount; i++) + { + sum += pVertexWeights->getVcount()->getValue()[i]; + } + result = verifyCount( sum * inputs.getCount(), (domInt) pVertexWeights->getV()->getValue().getCount() ); + } + } + + return result; +} //----------------------------------------------------------------------------- // extractTranslation() @@ -2263,7 +2498,7 @@ daeElement* LLModelLoader::getChildFromElement( daeElement* pElement, std::strin return NULL; } -void LLModelLoader::processElement(daeElement* element) +void LLModelLoader::processElement( daeElement* element, bool& badElement ) { LLMatrix4 saved_transform = mTransform; @@ -2296,8 +2531,11 @@ void LLModelLoader::processElement(daeElement* element) { domFloat3 dom_value = scale->getValue(); + + LLVector3 scale_vector = LLVector3(dom_value[0], dom_value[1], dom_value[2]); + scale_vector.abs(); // Set all values positive, since we don't currently support mirrored meshes LLMatrix4 scaling; - scaling.initScale(LLVector3(dom_value[0], dom_value[1], dom_value[2])); + scaling.initScale(scale_vector); scaling *= mTransform; mTransform = scaling; @@ -2360,6 +2598,12 @@ void LLModelLoader::processElement(daeElement* element) } } } + else + { + llinfos<<"Unable to resolve geometry URL."<<llendl; + badElement = true; + } + } domInstance_node* instance_node = daeSafeCast<domInstance_node>(element); @@ -2368,7 +2612,7 @@ void LLModelLoader::processElement(daeElement* element) daeElement* instance = instance_node->getUrl().getElement(); if (instance) { - processElement(instance); + processElement(instance,badElement); } } @@ -2376,7 +2620,7 @@ void LLModelLoader::processElement(daeElement* element) daeTArray< daeSmartRef<daeElement> > children = element->getChildren(); for (S32 i = 0; i < children.getCount(); i++) { - processElement(children[i]); + processElement(children[i],badElement); } domNode* node = daeSafeCast<domNode>(element); @@ -2660,7 +2904,7 @@ LLModelPreview::~LLModelPreview() { if (mModelLoader) { - delete mModelLoader; + mModelLoader->mPreview = NULL; mModelLoader = NULL; } //*HACK : *TODO : turn this back on when we understand why this crashes @@ -2675,7 +2919,8 @@ U32 LLModelPreview::calcResourceCost() if (mFMP && mModelLoader) { - if ( getLoadState() < LLModelLoader::ERROR_PARSING ) + const BOOL confirmed_checkbox = mFMP->getChild<LLCheckBoxCtrl>("confirm_checkbox")->getValue().asBoolean(); + if ( getLoadState() < LLModelLoader::ERROR_PARSING && confirmed_checkbox ) { mFMP->childEnable("ok_btn"); } @@ -2817,7 +3062,8 @@ void LLModelPreview::rebuildUploadData() F32 max_scale = 0.f; - if ( mBaseScene.size() > 0 ) + const BOOL confirmed_checkbox = mFMP->getChild<LLCheckBoxCtrl>("confirm_checkbox")->getValue().asBoolean(); + if ( mBaseScene.size() > 0 && confirmed_checkbox ) { mFMP->childEnable("ok_btn"); } @@ -3221,6 +3467,8 @@ void LLModelPreview::loadModelCallback(S32 lod) } mLoading = false; + if (mFMP) + mFMP->getChild<LLCheckBoxCtrl>("confirm_checkbox")->set(FALSE); refresh(); mModelLoadedSignal(); @@ -3234,7 +3482,7 @@ void LLModelPreview::resetPreviewTarget() mPreviewScale = (mModelLoader->mExtents[1] - mModelLoader->mExtents[0]) * 0.5f; } - setPreviewTarget(mPreviewScale.magVec()*2.f); + setPreviewTarget(mPreviewScale.magVec()*10.f); } void LLModelPreview::generateNormals() @@ -3752,7 +4000,35 @@ void LLModelPreview::updateStatusMessages() mMaxTriangleLimit = total_tris[LLModel::LOD_HIGH]; } + bool has_degenerate = false; + + {//check for degenerate triangles in physics mesh + U32 lod = LLModel::LOD_PHYSICS; + const LLVector4a scale(0.5f); + for (U32 i = 0; i < mModel[lod].size() && !has_degenerate; ++i) + { //for each model in the lod + if (mModel[lod][i]->mPhysics.mHull.empty()) + { //no decomp exists + S32 cur_submeshes = mModel[lod][i]->getNumVolumeFaces(); + for (S32 j = 0; j < cur_submeshes && !has_degenerate; ++j) + { //for each submesh (face), add triangles and vertices to current total + const LLVolumeFace& face = mModel[lod][i]->getVolumeFace(j); + for (S32 k = 0; k < face.mNumIndices && !has_degenerate; ) + { + LLVector4a v1; v1.setMul(face.mPositions[face.mIndices[k++]], scale); + LLVector4a v2; v2.setMul(face.mPositions[face.mIndices[k++]], scale); + LLVector4a v3; v3.setMul(face.mPositions[face.mIndices[k++]], scale); + if (ll_is_degenerate(v1,v2,v3)) + { + has_degenerate = true; + } + } + } + } + } + } + mFMP->childSetTextArg("submeshes_info", "[SUBMESHES]", llformat("%d", total_submeshes[LLModel::LOD_HIGH])); std::string mesh_status_na = mFMP->getString("mesh_status_na"); @@ -3853,7 +4129,10 @@ void LLModelPreview::updateStatusMessages() for (U32 j = 0; upload_ok && j < mdl->mPhysics.mHull.size(); ++j) { - upload_ok = upload_ok && mdl->mPhysics.mHull[i].size() <= 256; + if (mdl->mPhysics.mHull[j].size() > 256) + { + upload_ok = false; + } } } @@ -3876,7 +4155,16 @@ void LLModelPreview::updateStatusMessages() } } - if ( upload_ok && !errorStateFromLoader && skinAndRigOk ) + if(upload_ok && mModelLoader) + { + if(!mModelLoader->areTexturesReady() && mFMP->childGetValue("upload_textures").asBoolean()) + { + upload_ok = false ; + } + } + + const BOOL confirmed_checkbox = mFMP->getChild<LLCheckBoxCtrl>("confirm_checkbox")->getValue().asBoolean(); + if ( upload_ok && !errorStateFromLoader && skinAndRigOk && !has_degenerate && confirmed_checkbox) { mFMP->childEnable("ok_btn"); } @@ -4238,11 +4526,7 @@ void LLModelPreview::genBuffers(S32 lod, bool include_skin_weights) const LLModel::weight_list& weight_list = base_mdl->getJointInfluences(pos); LLVector4 w(0,0,0,0); - if (weight_list.size() > 4) - { - llerrs << "WTF?" << llendl; - } - + for (U32 i = 0; i < weight_list.size(); ++i) { F32 wght = llmin(weight_list[i].mWeight, 0.999999f); @@ -4455,7 +4739,7 @@ BOOL LLModelPreview::render() LLVector3 target_pos = mPreviewTarget+offset; F32 z_near = 0.001f; - F32 z_far = mCameraDistance+mPreviewScale.magVec()+mCameraOffset.magVec(); + F32 z_far = mCameraDistance*10.0f+mPreviewScale.magVec()+mCameraOffset.magVec(); if (skin_weight) { @@ -4605,39 +4889,43 @@ BOOL LLModelPreview::render() LLModel::Decomposition& physics = model->mPhysics; - if (physics.mMesh.empty()) - { //build vertex buffer for physics mesh - gMeshRepo.buildPhysicsMesh(physics); - } - - if (!physics.mMesh.empty()) - { //render hull instead of mesh + if (!physics.mHull.empty()) + { render_mesh = false; - for (U32 i = 0; i < physics.mMesh.size(); ++i) - { - if (explode > 0.f) + + if (physics.mMesh.empty()) + { //build vertex buffer for physics mesh + gMeshRepo.buildPhysicsMesh(physics); + } + + if (!physics.mMesh.empty()) + { //render hull instead of mesh + for (U32 i = 0; i < physics.mMesh.size(); ++i) { - gGL.pushMatrix(); + if (explode > 0.f) + { + gGL.pushMatrix(); - LLVector3 offset = model->mHullCenter[i]-model->mCenterOfHullCenters; - offset *= explode; + LLVector3 offset = model->mHullCenter[i]-model->mCenterOfHullCenters; + offset *= explode; - gGL.translatef(offset.mV[0], offset.mV[1], offset.mV[2]); - } + gGL.translatef(offset.mV[0], offset.mV[1], offset.mV[2]); + } - static std::vector<LLColor4U> hull_colors; + static std::vector<LLColor4U> hull_colors; - if (i+1 >= hull_colors.size()) - { - hull_colors.push_back(LLColor4U(rand()%128+127, rand()%128+127, rand()%128+127, 255)); - } + if (i+1 >= hull_colors.size()) + { + hull_colors.push_back(LLColor4U(rand()%128+127, rand()%128+127, rand()%128+127, 255)); + } - glColor4ubv(hull_colors[i].mV); - LLVertexBuffer::drawArrays(LLRender::TRIANGLES, physics.mMesh[i].mPositions, physics.mMesh[i].mNormals); + glColor4ubv(hull_colors[i].mV); + LLVertexBuffer::drawArrays(LLRender::TRIANGLES, physics.mMesh[i].mPositions, physics.mMesh[i].mNormals); - if (explode > 0.f) - { - gGL.popMatrix(); + if (explode > 0.f) + { + gGL.popMatrix(); + } } } } @@ -4663,9 +4951,10 @@ BOOL LLModelPreview::render() glColor3f(1.f, 1.f, 0.f); - glLineWidth(3.f); + glLineWidth(2.f); glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); buffer->drawRange(LLRender::TRIANGLES, 0, buffer->getNumVerts()-1, buffer->getNumIndices(), 0); + glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); glLineWidth(1.f); } @@ -4674,6 +4963,80 @@ BOOL LLModelPreview::render() gGL.popMatrix(); } + glLineWidth(3.f); + glPointSize(8.f); + gPipeline.enableLightsFullbright(LLColor4::white); + //show degenerate triangles + LLGLDepthTest depth(GL_TRUE, GL_TRUE, GL_ALWAYS); + LLGLDisable cull(GL_CULL_FACE); + glColor4f(1.f,0.f,0.f,1.f); + const LLVector4a scale(0.5f); + + for (LLMeshUploadThread::instance_list::iterator iter = mUploadData.begin(); iter != mUploadData.end(); ++iter) + { + LLModelInstance& instance = *iter; + + LLModel* model = instance.mLOD[LLModel::LOD_PHYSICS]; + + if (!model) + { + continue; + } + + gGL.pushMatrix(); + LLMatrix4 mat = instance.mTransform; + + glMultMatrixf((GLfloat*) mat.mMatrix); + + + LLPhysicsDecomp* decomp = gMeshRepo.mDecompThread; + if (decomp) + { + LLMutexLock(decomp->mMutex); + + LLModel::Decomposition& physics = model->mPhysics; + + if (physics.mHull.empty()) + { + if (mVertexBuffer[LLModel::LOD_PHYSICS].empty()) + { + genBuffers(LLModel::LOD_PHYSICS, false); + } + + for (U32 i = 0; i < mVertexBuffer[LLModel::LOD_PHYSICS][model].size(); ++i) + { + LLVertexBuffer* buffer = mVertexBuffer[LLModel::LOD_PHYSICS][model][i]; + + buffer->setBuffer(LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_NORMAL | LLVertexBuffer::MAP_TEXCOORD0); + + LLStrider<LLVector3> pos_strider; + buffer->getVertexStrider(pos_strider, 0); + LLVector4a* pos = (LLVector4a*) pos_strider.get(); + + LLStrider<U16> idx; + buffer->getIndexStrider(idx, 0); + + for (U32 i = 0; i < buffer->getNumIndices(); i += 3) + { + LLVector4a v1; v1.setMul(pos[*idx++], scale); + LLVector4a v2; v2.setMul(pos[*idx++], scale); + LLVector4a v3; v3.setMul(pos[*idx++], scale); + + if (ll_is_degenerate(v1,v2,v3)) + { + buffer->draw(LLRender::LINE_LOOP, 3, i); + buffer->draw(LLRender::POINTS, 3, i); + } + } + } + } + } + + gGL.popMatrix(); + } + glLineWidth(1.f); + glPointSize(1.f); + gPipeline.enableLightsPreview(); gGL.setSceneBlendType(LLRender::BT_ALPHA); } } @@ -4938,6 +5301,14 @@ void LLModelPreview::textureLoadedCallback( BOOL success, LLViewerFetchedTexture { LLModelPreview* preview = (LLModelPreview*) userdata; preview->refresh(); + + if(final && preview->mModelLoader) + { + if(preview->mModelLoader->mNumOfFetchingTextures > 0) + { + preview->mModelLoader->mNumOfFetchingTextures-- ; + } + } } void LLModelPreview::onLODParamCommit(bool enforce_tri_limit) @@ -4959,35 +5330,7 @@ LLFloaterModelPreview::DecompRequest::DecompRequest(const std::string& stage, LL mParams = sInstance->mDecompParams; //copy out positions and indices - if (mdl) - { - U16 index_offset = 0; - - mPositions.clear(); - mIndices.clear(); - - //queue up vertex positions and indices - for (S32 i = 0; i < mdl->getNumVolumeFaces(); ++i) - { - const LLVolumeFace& face = mdl->getVolumeFace(i); - if (mPositions.size() + face.mNumVertices > 65535) - { - continue; - } - - for (U32 j = 0; j < face.mNumVertices; ++j) - { - mPositions.push_back(LLVector3(face.mPositions[j].getF32ptr())); - } - - for (U32 j = 0; j < face.mNumIndices; ++j) - { - mIndices.push_back(face.mIndices[j]+index_offset); - } - - index_offset += face.mNumVertices; - } - } + assignData(mdl) ; } void LLFloaterModelPreview::setStatusMessage(const std::string& msg) diff --git a/indra/newview/llfloatermodelpreview.h b/indra/newview/llfloatermodelpreview.h index f6d4a08d1f2af2cb53f5e28b680c7544db2bbf5e..d4f6b4d293d49518ac164aebb797161734e73c8b 100644 --- a/indra/newview/llfloatermodelpreview.h +++ b/indra/newview/llfloatermodelpreview.h @@ -50,6 +50,7 @@ class domProfile_COMMON; class domInstance_geometry; class domNode; class domTranslate; +class domController; class LLMenuButton; class LLToggleableMenu; @@ -107,7 +108,7 @@ class LLModelLoader : public LLThread void loadModelCallback(); void loadTextures() ; //called in the main thread. - void processElement(daeElement* element); + void processElement(daeElement* element, bool& badElement); std::vector<LLImportMaterial> getMaterials(LLModel* model, domInstance_geometry* instance_geo); LLImportMaterial profileToMaterial(domProfile_COMMON* material); std::string getElementLabel(daeElement *element); @@ -131,6 +132,9 @@ class LLModelLoader : public LLThread JointTransformMap& mJointList; std::deque<std::string>& mJointsFromNode; + S32 mNumOfFetchingTextures ; //updated in the main thread + bool areTexturesReady() { return !mNumOfFetchingTextures; } //called in the main thread. + private: static std::list<LLModelLoader*> sActiveLoaderList; static bool isAlive(LLModelLoader* loader) ; @@ -199,6 +203,8 @@ class LLFloaterModelPreview : public LLFloater static void onUploadJointsCommit(LLUICtrl*,void*); static void onUploadSkinCommit(LLUICtrl*,void*); + static void onPhysicsLoadRadioCommit(LLUICtrl*,void *data); + static void onPreviewLODCommit(LLUICtrl*,void*); static void onGenerateNormalsCommit(LLUICtrl*,void*); @@ -309,9 +315,6 @@ class LLModelPreview : public LLViewerDynamicTexture, public LLMutex void setHasPivot( bool val ) { mHasPivot = val; } void setModelPivot( const LLVector3& pivot ) { mModelPivot = pivot; } - //Sets the current avatars joints to new positions - //Makes in world go to shit, however - void changeAvatarsJointPositions( LLModel* pModel ); //Determines the viability of an asset to be used as an avatar rig (w or w/o joint upload caps) void critiqueRigForUploadApplicability( const std::vector<std::string> &jointListFromAsset ); void critiqueJointToNodeMappingFromScene( void ); @@ -325,6 +328,8 @@ class LLModelPreview : public LLViewerDynamicTexture, public LLMutex //Accessors for the legacy rigs const bool isLegacyRigValid( void ) const { return mLegacyRigValid; } void setLegacyRigValid( bool rigValid ) { mLegacyRigValid = rigValid; } + //Verify that a controller matches vertex counts + bool verifyController( domController* pController ); static void textureLoadedCallback( BOOL success, LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* src_aux, S32 discard_level, BOOL final, void* userdata ); @@ -341,7 +346,12 @@ class LLModelPreview : public LLViewerDynamicTexture, public LLMutex LLVector3 getTranslationForJointOffset( std::string joint ); +private: + //Utility function for controller vertex compare + bool verifyCount( int expected, int result ); + //Creates the dummy avatar for the preview window void createPreviewAvatar( void ); + //Accessor for the dummy avatar LLVOAvatar* getPreviewAvatar( void ) { return mPreviewAvatar; } protected: diff --git a/indra/newview/llfloatermodelwizard.cpp b/indra/newview/llfloatermodelwizard.cpp index faf81dbc5c3cef62fb519439de92b04c2c101c41..707c8288dfe5dd43b22b39139d5a03b415b8594f 100644 --- a/indra/newview/llfloatermodelwizard.cpp +++ b/indra/newview/llfloatermodelwizard.cpp @@ -422,8 +422,11 @@ void LLFloaterModelWizard::executePhysicsStage(std::string stage_name) { LLModel* mdl = sInstance->mModelPreview->mModel[LLModel::LOD_PHYSICS][i]; DecompRequest* request = new DecompRequest(stage_name, mdl); - sInstance->mCurRequest.insert(request); - gMeshRepo.mDecompThread->submitRequest(request); + if(request->isValid()) + { + sInstance->mCurRequest.insert(request); + gMeshRepo.mDecompThread->submitRequest(request); + } } } } @@ -438,35 +441,7 @@ LLFloaterModelWizard::DecompRequest::DecompRequest(const std::string& stage, LLM mParams = sInstance->mDecompParams; //copy out positions and indices - if (mdl) - { - U16 index_offset = 0; - - mPositions.clear(); - mIndices.clear(); - - //queue up vertex positions and indices - for (S32 i = 0; i < mdl->getNumVolumeFaces(); ++i) - { - const LLVolumeFace& face = mdl->getVolumeFace(i); - if (mPositions.size() + face.mNumVertices > 65535) - { - continue; - } - - for (U32 j = 0; j < face.mNumVertices; ++j) - { - mPositions.push_back(LLVector3(face.mPositions[j].getF32ptr())); - } - - for (U32 j = 0; j < face.mNumIndices; ++j) - { - mIndices.push_back(face.mIndices[j]+index_offset); - } - - index_offset += face.mNumVertices; - } - } + assignData(mdl) ; } diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp index 60a2f813aaff98a963a38371f4ab8801e7f6e6f3..7848484ac6d34b28cc33727d041f4f643cf146f8 100755 --- a/indra/newview/llfloaterpreference.cpp +++ b/indra/newview/llfloaterpreference.cpp @@ -327,6 +327,7 @@ LLFloaterPreference::LLFloaterPreference(const LLSD& key) mCommitCallbackRegistrar.add("Pref.SelectSkin", boost::bind(&LLFloaterPreference::onSelectSkin, this)); mCommitCallbackRegistrar.add("Pref.VoiceSetKey", boost::bind(&LLFloaterPreference::onClickSetKey, this)); mCommitCallbackRegistrar.add("Pref.VoiceSetMiddleMouse", boost::bind(&LLFloaterPreference::onClickSetMiddleMouse, this)); + mCommitCallbackRegistrar.add("Pref.SetSounds", boost::bind(&LLFloaterPreference::onClickSetSounds, this)); // mCommitCallbackRegistrar.add("Pref.ClickSkipDialogs", boost::bind(&LLFloaterPreference::onClickSkipDialogs, this)); // mCommitCallbackRegistrar.add("Pref.ClickResetDialogs", boost::bind(&LLFloaterPreference::onClickResetDialogs, this)); mCommitCallbackRegistrar.add("Pref.ClickEnablePopup", boost::bind(&LLFloaterPreference::onClickEnablePopup, this)); @@ -1286,6 +1287,14 @@ void LLFloaterPreference::onClickSetMiddleMouse() p2t_line_editor->setValue(advanced_preferences->getString("middle_mouse")); } } + +void LLFloaterPreference::onClickSetSounds() +{ + // Disable Enable gesture sounds checkbox if the master sound is disabled + // or if sound effects are disabled. + getChild<LLCheckBoxCtrl>("gesture_audio_play_btn")->setEnabled(!gSavedSettings.getBOOL("MuteSounds")); +} + /* void LLFloaterPreference::onClickSkipDialogs() { diff --git a/indra/newview/llfloaterpreference.h b/indra/newview/llfloaterpreference.h index ef9257534763f7d29f42012f2fdd5dec6e4fed73..61f2c786401cc02331ba63ca556422835f7ebc7e 100644 --- a/indra/newview/llfloaterpreference.h +++ b/indra/newview/llfloaterpreference.h @@ -129,6 +129,7 @@ class LLFloaterPreference : public LLFloater, public LLAvatarPropertiesObserver void onClickSetKey(); void setKey(KEY key); void onClickSetMiddleMouse(); + void onClickSetSounds(); // void onClickSkipDialogs(); // void onClickResetDialogs(); void onClickEnablePopup(); diff --git a/indra/newview/llfloaterregioninfo.cpp b/indra/newview/llfloaterregioninfo.cpp index 232b8e9096bdae4b68e004a4df9dba8352d883a1..6b3e3088d5b6aed5727f1f8e55dbbac2b3c1cec7 100644 --- a/indra/newview/llfloaterregioninfo.cpp +++ b/indra/newview/llfloaterregioninfo.cpp @@ -82,6 +82,7 @@ #include "llvlcomposition.h" #include "lltrans.h" #include "llagentui.h" +#include "llmeshrepository.h" const S32 TERRAIN_TEXTURE_COUNT = 4; const S32 CORNER_COUNT = 4; @@ -590,10 +591,7 @@ bool LLPanelRegionGeneralInfo::refreshFromRegion(LLViewerRegion* region) getChildView("im_btn")->setEnabled(allow_modify); getChildView("manage_telehub_btn")->setEnabled(allow_modify); - const bool enable_mesh = gSavedSettings.getBOOL("MeshEnabled") && - gAgent.getRegion() && - !gAgent.getRegion()->getCapability("GetMesh").empty() && - !gAgent.getRegion()->getCapability("ObjectAdd").empty(); + const bool enable_mesh = gMeshRepo.meshRezEnabled(); getChildView("mesh_rez_enabled_check")->setVisible(enable_mesh); getChildView("mesh_rez_enabled_check")->setEnabled(getChildView("mesh_rez_enabled_check")->getEnabled() && enable_mesh); // Data gets filled in by processRegionInfo diff --git a/indra/newview/llfloatersellland.cpp b/indra/newview/llfloatersellland.cpp index 8558a1277ce514d691fecc317c4e135eec595e9d..3434841d09b52d3d3e288079b86b9cc715b94b08 100644 --- a/indra/newview/llfloatersellland.cpp +++ b/indra/newview/llfloatersellland.cpp @@ -41,6 +41,7 @@ #include "llviewerparcelmgr.h" #include "lluictrlfactory.h" #include "llviewerwindow.h" +#include "lltrans.h" class LLAvatarName; @@ -451,7 +452,7 @@ void LLFloaterSellLandUI::doSellLand(void *userdata) // Do a confirmation S32 sale_price = self->getChild<LLUICtrl>("price")->getValue(); S32 area = parcel->getArea(); - std::string authorizedBuyerName = "Anyone"; + std::string authorizedBuyerName = LLTrans::getString("Anyone"); bool sell_to_anyone = true; if ("user" == self->getChild<LLUICtrl>("sell_to")->getValue().asString()) { diff --git a/indra/newview/llfloatertools.cpp b/indra/newview/llfloatertools.cpp index edcb96314b238f46a65e183cd085ac62539f2f8b..33b7777d2efbf6b3d9b1102fee5076fbc449c406 100644 --- a/indra/newview/llfloatertools.cpp +++ b/indra/newview/llfloatertools.cpp @@ -86,6 +86,7 @@ #include "llvovolume.h" #include "lluictrlfactory.h" #include "llaccountingquotamanager.h" +#include "llmeshrepository.h" // Globals LLFloaterTools *gFloaterTools = NULL; @@ -423,7 +424,7 @@ void LLFloaterTools::refresh() // Refresh object and prim count labels LLLocale locale(LLLocale::USER_LOCALE); - if ((gAgent.getRegion() && (gAgent.getRegion()->getCapability("GetMesh").empty() || gAgent.getRegion()->getCapability("ObjectAdd").empty())) || !gSavedSettings.getBOOL("MeshEnabled")) + if (!gMeshRepo.meshRezEnabled()) { std::string obj_count_string; LLResMgr::getInstance()->getIntegerString(obj_count_string, LLSelectMgr::getInstance()->getSelection()->getRootObjectCount()); @@ -788,10 +789,7 @@ void LLFloaterTools::updatePopup(LLCoordGL center, MASK mask) getChildView("Strength:")->setVisible( land_visible); } - bool show_mesh_cost = gAgent.getRegion() && - !gAgent.getRegion()->getCapability("GetMesh").empty() && - gSavedSettings.getBOOL("MeshEnabled") && - !gAgent.getRegion()->getCapability("ObjectAdd").empty(); + bool show_mesh_cost = gMeshRepo.meshRezEnabled(); getChildView("obj_count")->setVisible( !land_visible && !show_mesh_cost); getChildView("prim_count")->setVisible( !land_visible && !show_mesh_cost); diff --git a/indra/newview/llfloaterworldmap.cpp b/indra/newview/llfloaterworldmap.cpp index f8a4ce7ad0fc8362fa220666026840dcf9394f19..b3910982d14e66637724d23e6a134ccba6423a88 100755 --- a/indra/newview/llfloaterworldmap.cpp +++ b/indra/newview/llfloaterworldmap.cpp @@ -1527,17 +1527,24 @@ void LLFloaterWorldMap::updateSims(bool found_null_sim) mCompletingRegionName = ""; } - // if match found, highlight it and go - if (!match.isUndefined()) + if (num_results > 0) { - list->selectByValue(match); + // if match found, highlight it and go + if (!match.isUndefined()) + { + list->selectByValue(match); + } + // else select first found item + else + { + list->selectFirstItem(); + } getChild<LLUICtrl>("search_results")->setFocus(TRUE); onCommitSearchResult(); } - - // if we found nothing, say "none" - if (num_results == 0) + else { + // if we found nothing, say "none" list->setCommentText(LLTrans::getString("worldmap_results_none_found")); list->operateOnAll(LLCtrlListInterface::OP_DESELECT); } diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp index b5180854efbe73340b71dd627ba5023b850e0c58..318beafe657a97e1e029c98036468d353a9267f4 100644 --- a/indra/newview/llinventorymodel.cpp +++ b/indra/newview/llinventorymodel.cpp @@ -632,10 +632,12 @@ U32 LLInventoryModel::updateItem(const LLViewerInventoryItem* item) } // We're hiding mesh types +#if 0 if (item->getType() == LLAssetType::AT_MESH) { return mask; } +#endif LLViewerInventoryItem* old_item = getItem(item->getUUID()); LLPointer<LLViewerInventoryItem> new_item; diff --git a/indra/newview/lllogchat.cpp b/indra/newview/lllogchat.cpp index efc4e2383881d2fb5aa57828a7707b7d6d3b4d35..ebb5912ace1647770722937e1abb23a0718af1f7 100644 --- a/indra/newview/lllogchat.cpp +++ b/indra/newview/lllogchat.cpp @@ -230,7 +230,7 @@ std::string LLLogChat::makeLogFileName(std::string filename) std::string LLLogChat::cleanFileName(std::string filename) { - std::string invalidChars = "\"\'\\/?*:.<>|"; + std::string invalidChars = "\"\'\\/?*:.<>|[]{}~"; // Cannot match glob or illegal filename chars std::string::size_type position = filename.find_first_of(invalidChars); while (position != filename.npos) { diff --git a/indra/newview/llmanipscale.cpp b/indra/newview/llmanipscale.cpp index 673f28e01fafa9f125b90da9babe73b0000f1f7b..4eb94dfb8e805997665212b06761bd929675cc30 100644 --- a/indra/newview/llmanipscale.cpp +++ b/indra/newview/llmanipscale.cpp @@ -58,6 +58,7 @@ #include "llworld.h" #include "v2math.h" #include "llvoavatar.h" +#include "llmeshrepository.h" const F32 MAX_MANIP_SELECT_DISTANCE_SQUARED = 11.f * 11.f; @@ -90,10 +91,7 @@ F32 get_default_max_prim_scale(bool is_flora) { // a bit of a hack, but if it's foilage, we don't want to use the // new larger scale which would result in giant trees and grass - if (gSavedSettings.getBOOL("MeshEnabled") && - gAgent.getRegion() && - !gAgent.getRegion()->getCapability("GetMesh").empty() && - !gAgent.getRegion()->getCapability("ObjectAdd").empty() && + if (gMeshRepo.meshRezEnabled() && !is_flora) { return DEFAULT_MAX_PRIM_SCALE; diff --git a/indra/newview/llmeshrepository.cpp b/indra/newview/llmeshrepository.cpp index 55145c6ad7734aa4a95f6763acbbc9591c1587fa..6e0722bcf99fa46771bbbd90fd2c738c654a6c6a 100644 --- a/indra/newview/llmeshrepository.cpp +++ b/indra/newview/llmeshrepository.cpp @@ -61,6 +61,9 @@ #include "pipeline.h" #include "llinventorymodel.h" #include "llfoldertype.h" +#include "llviewerparcelmgr.h" + +#include "boost/lexical_cast.hpp" #ifndef LL_WINDOWS #include "netdb.h" @@ -85,7 +88,14 @@ U32 LLMeshRepository::sPeakKbps = 0; const U32 MAX_TEXTURE_UPLOAD_RETRIES = 5; -void dumpLLSDToFile(const LLSD& content, std::string filename); +static S32 dump_num = 0; +std::string make_dump_name(std::string prefix, S32 num) +{ + return prefix + boost::lexical_cast<std::string>(num) + std::string(".xml"); + +} +void dump_llsd_to_file(const LLSD& content, std::string filename); +LLSD llsd_from_file(std::string filename); std::string header_lod[] = { @@ -459,6 +469,55 @@ class LLMeshPhysicsShapeResponder : public LLCurl::Responder }; +void log_upload_error(S32 status, const LLSD& content, std::string stage, std::string model_name) +{ + // Add notification popup. + LLSD args; + std::string message = content["error"]["message"]; + std::string identifier = content["error"]["identifier"]; + args["MESSAGE"] = message; + args["IDENTIFIER"] = identifier; + args["LABEL"] = model_name; + gMeshRepo.uploadError(args); + + // Log details. + llwarns << "stage: " << stage << " http status: " << status << llendl; + if (content.has("error")) + { + const LLSD& err = content["error"]; + llwarns << "err: " << err << llendl; + llwarns << "mesh upload failed, stage '" << stage + << "' error '" << err["error"].asString() + << "', message '" << err["message"].asString() + << "', id '" << err["identifier"].asString() + << "'" << llendl; + if (err.has("errors")) + { + S32 error_num = 0; + const LLSD& err_list = err["errors"]; + for (LLSD::array_const_iterator it = err_list.beginArray(); + it != err_list.endArray(); + ++it) + { + const LLSD& err_entry = *it; + llwarns << "error[" << error_num << "]:" << llendl; + for (LLSD::map_const_iterator map_it = err_entry.beginMap(); + map_it != err_entry.endMap(); + ++map_it) + { + llwarns << "\t" << map_it->first << ": " + << map_it->second << llendl; + } + error_num++; + } + } + } + else + { + llwarns << "bad mesh, no error information available" << llendl; + } +} + class LLModelObjectUploadResponder: public LLCurl::Responder { LLSD mObjectAsset; @@ -486,40 +545,82 @@ class LLModelObjectUploadResponder: public LLCurl::Responder class LLWholeModelFeeResponder: public LLCurl::Responder { LLMeshUploadThread* mThread; + LLSD mModelData; public: - LLWholeModelFeeResponder(LLMeshUploadThread* thread): - mThread(thread) + LLWholeModelFeeResponder(LLMeshUploadThread* thread, LLSD& model_data): + mThread(thread), + mModelData(model_data) { } virtual void completed(U32 status, const std::string& reason, const LLSD& content) { - //assert_main_thread(); + LLSD cc = content; + if (gSavedSettings.getS32("MeshUploadFakeErrors")&1) + { + cc = llsd_from_file("fake_upload_error.xml"); + } + llinfos << "completed" << llendl; mThread->mPendingUploads--; - dumpLLSDToFile(content,"whole_model_response.xml"); - - mThread->mWholeModelUploadURL = content["uploader"].asString(); + dump_llsd_to_file(cc,make_dump_name("whole_model_fee_response_",dump_num)); + if (isGoodStatus(status) && + cc["state"].asString() == "upload") + { + llinfos << "fee request succeeded" << llendl; + mThread->mWholeModelUploadURL = cc["uploader"].asString(); + } + else + { + llwarns << "fee request failed" << llendl; + log_upload_error(status,cc,"fee",mModelData["name"]); + mThread->mWholeModelUploadURL = ""; + } } + }; class LLWholeModelUploadResponder: public LLCurl::Responder { LLMeshUploadThread* mThread; + LLSD mModelData; + public: - LLWholeModelUploadResponder(LLMeshUploadThread* thread): - mThread(thread) + LLWholeModelUploadResponder(LLMeshUploadThread* thread, LLSD& model_data): + mThread(thread), + mModelData(model_data) { } virtual void completed(U32 status, const std::string& reason, const LLSD& content) { + LLSD cc = content; + if (gSavedSettings.getS32("MeshUploadFakeErrors")&2) + { + cc = llsd_from_file("fake_upload_error.xml"); + } + //assert_main_thread(); - llinfos << "upload completed" << llendl; mThread->mPendingUploads--; - dumpLLSDToFile(content,"whole_model_upload_response.xml"); + dump_llsd_to_file(cc,make_dump_name("whole_model_upload_response_",dump_num)); + llinfos << "LLWholeModelUploadResponder content: " << cc << llendl; + // requested "mesh" asset type isn't actually the type + // of the resultant object, fix it up here. + if (isGoodStatus(status) && + cc["state"].asString() == "complete") + { + llinfos << "upload succeeded" << llendl; + mModelData["asset_type"] = "object"; + gMeshRepo.updateInventory(LLMeshRepository::inventory_data(mModelData,cc)); + } + else + { + llwarns << "upload failed" << llendl; + std::string model_name = mModelData["name"].asString(); + log_upload_error(status,cc,"upload",model_name); + } } }; @@ -694,10 +795,7 @@ void LLMeshRepoThread::loadMeshLOD(const LLVolumeParams& mesh_params, S32 lod) if (pending != mPendingLOD.end()) { //append this lod request to existing header request pending->second.push_back(lod); - if (pending->second.size() > 4) - { - llerrs << "WTF?" << llendl; - } + llassert(pending->second.size() <= LLModel::NUM_LODS) } else { //if no header request is pending, fetch header @@ -817,8 +915,8 @@ bool LLMeshRepoThread::fetchMeshDecomposition(const LLUUID& mesh_id) if (header_size > 0) { - S32 offset = header_size + mMeshHeader[mesh_id]["decomposition"]["offset"].asInteger(); - S32 size = mMeshHeader[mesh_id]["decomposition"]["size"].asInteger(); + S32 offset = header_size + mMeshHeader[mesh_id]["physics_convex"]["offset"].asInteger(); + S32 size = mMeshHeader[mesh_id]["physics_convex"]["size"].asInteger(); mHeaderMutex->unlock(); @@ -889,8 +987,8 @@ bool LLMeshRepoThread::fetchMeshPhysicsShape(const LLUUID& mesh_id) if (header_size > 0) { - S32 offset = header_size + mMeshHeader[mesh_id]["physics_shape"]["offset"].asInteger(); - S32 size = mMeshHeader[mesh_id]["physics_shape"]["size"].asInteger(); + S32 offset = header_size + mMeshHeader[mesh_id]["physics_mesh"]["offset"].asInteger(); + S32 size = mMeshHeader[mesh_id]["physics_mesh"]["size"].asInteger(); mHeaderMutex->unlock(); @@ -1282,8 +1380,6 @@ LLMeshUploadThread::LLMeshUploadThread(LLMeshUploadThread::instance_list& data, mOrigin = gAgent.getPositionAgent(); mHost = gAgent.getRegionHost(); - mUploadObjectAssetCapability = gAgent.getRegion()->getCapability("UploadObjectAsset"); - mNewInventoryCapability = gAgent.getRegion()->getCapability("NewFileAgentInventoryVariablePrice"); mWholeModelFeeCapability = gAgent.getRegion()->getCapability("NewFileAgentInventory"); mOrigin += gAgent.getAtAxis() * scale.magVec(); @@ -1303,35 +1399,7 @@ LLMeshUploadThread::DecompRequest::DecompRequest(LLModel* mdl, LLModel* base_mod mThread = thread; //copy out positions and indices - if (mdl) - { - U16 index_offset = 0; - - mPositions.clear(); - mIndices.clear(); - - //queue up vertex positions and indices - for (S32 i = 0; i < mdl->getNumVolumeFaces(); ++i) - { - const LLVolumeFace& face = mdl->getVolumeFace(i); - if (mPositions.size() + face.mNumVertices > 65535) - { - continue; - } - - for (U32 j = 0; j < face.mNumVertices; ++j) - { - mPositions.push_back(LLVector3(face.mPositions[j].getF32ptr())); - } - - for (U32 j = 0; j < face.mNumIndices; ++j) - { - mIndices.push_back(face.mIndices[j]+index_offset); - } - - index_offset += face.mNumVertices; - } - } + assignData(mdl) ; mThread->mFinalDecomp = this; mThread->mPhysicsComplete = false; @@ -1344,11 +1412,8 @@ void LLMeshUploadThread::DecompRequest::completed() mThread->mPhysicsComplete = true; } - if (mHull.size() != 1) - { - llerrs << "WTF?" << llendl; - } - + llassert(mHull.size() == 1); + mThread->mHullMap[mBaseModel] = mHull[0]; } @@ -1376,148 +1441,199 @@ BOOL LLMeshUploadThread::isDiscarded() void LLMeshUploadThread::run() { - if (gSavedSettings.getBOOL("MeshUseWholeModelUpload")) - { - doWholeModelUpload(); - } - else + doWholeModelUpload(); +} + +void dump_llsd_to_file(const LLSD& content, std::string filename) +{ + if (gSavedSettings.getBOOL("MeshUploadLogXML")) { - doIterativeUpload(); + std::ofstream of(filename.c_str()); + LLSDSerialize::toPrettyXML(content,of); } } -#if 1 -void dumpLLSDToFile(const LLSD& content, std::string filename) +LLSD llsd_from_file(std::string filename) { - std::ofstream of(filename.c_str()); - LLSDSerialize::toPrettyXML(content,of); + std::ifstream ifs(filename.c_str()); + LLSD result; + LLSDSerialize::fromXML(result,ifs); + return result; } -#endif void LLMeshUploadThread::wholeModelToLLSD(LLSD& dest, bool include_textures) { - // TODO where do textures go? - LLSD result; LLSD res; result["folder_id"] = gInventory.findCategoryUUIDForType(LLFolderType::FT_OBJECT); result["asset_type"] = "mesh"; result["inventory_type"] = "object"; - result["name"] = "your name here"; + result["name"] = "mesh model"; result["description"] = "your description here"; - // TODO "optional" fields from the spec - res["mesh_list"] = LLSD::emptyArray(); -// TODO Textures - //res["texture_list"] = LLSD::emptyArray(); + res["texture_list"] = LLSD::emptyArray(); + res["instance_list"] = LLSD::emptyArray(); S32 mesh_num = 0; S32 texture_num = 0; std::set<LLViewerTexture* > textures; + std::map<LLViewerTexture*,S32> texture_index; + + std::map<LLModel*,S32> mesh_index; + S32 instance_num = 0; + for (instance_map::iterator iter = mInstance.begin(); iter != mInstance.end(); ++iter) { LLMeshUploadData data; data.mBaseModel = iter->first; - - LLModelInstance& instance = *(iter->second.begin()); - + LLModelInstance& first_instance = *(iter->second.begin()); for (S32 i = 0; i < 5; i++) { - data.mModel[i] = instance.mLOD[i]; + data.mModel[i] = first_instance.mLOD[i]; } - std::stringstream ostr; - - LLModel::Decomposition& decomp = - data.mModel[LLModel::LOD_PHYSICS].notNull() ? - data.mModel[LLModel::LOD_PHYSICS]->mPhysics : - data.mBaseModel->mPhysics; - - decomp.mBaseHull = mHullMap[data.mBaseModel]; - - LLSD mesh_header = LLModel::writeModel( - ostr, - data.mModel[LLModel::LOD_PHYSICS], - data.mModel[LLModel::LOD_HIGH], - data.mModel[LLModel::LOD_MEDIUM], - data.mModel[LLModel::LOD_LOW], - data.mModel[LLModel::LOD_IMPOSTOR], - decomp, - mUploadSkin, - mUploadJoints); - - data.mAssetData = ostr.str(); + if (mesh_index.find(data.mBaseModel) == mesh_index.end()) + { + // Have not seen this model before - create a new mesh_list entry for it. + std::string model_name = data.mBaseModel->getName(); + if (!model_name.empty()) + { + result["name"] = model_name; + } - LLSD mesh_entry; + std::stringstream ostr; + + LLModel::Decomposition& decomp = + data.mModel[LLModel::LOD_PHYSICS].notNull() ? + data.mModel[LLModel::LOD_PHYSICS]->mPhysics : + data.mBaseModel->mPhysics; - LLVector3 pos, scale; - LLQuaternion rot; - LLMatrix4 transformation = instance.mTransform; - decomposeMeshMatrix(transformation,pos,rot,scale); + decomp.mBaseHull = mHullMap[data.mBaseModel]; -#if 0 - mesh_entry["childpos"] = ll_sd_from_vector3(pos); - mesh_entry["childrot"] = ll_sd_from_quaternion(rot); - mesh_entry["scale"] = ll_sd_from_vector3(scale); -#endif - mesh_entry["position"] = ll_sd_from_vector3(LLVector3()); - mesh_entry["rotation"] = ll_sd_from_quaternion(rot); - mesh_entry["scale"] = ll_sd_from_vector3(scale); + LLSD mesh_header = LLModel::writeModel( + ostr, + data.mModel[LLModel::LOD_PHYSICS], + data.mModel[LLModel::LOD_HIGH], + data.mModel[LLModel::LOD_MEDIUM], + data.mModel[LLModel::LOD_LOW], + data.mModel[LLModel::LOD_IMPOSTOR], + decomp, + mUploadSkin, + mUploadJoints); - // TODO should be binary. - std::string str = ostr.str(); - mesh_entry["mesh_data"] = LLSD::Binary(str.begin(),str.end()); + data.mAssetData = ostr.str(); + std::string str = ostr.str(); - res["mesh_list"][mesh_num] = mesh_entry; + res["mesh_list"][mesh_num] = LLSD::Binary(str.begin(),str.end()); + mesh_index[data.mBaseModel] = mesh_num; + mesh_num++; + } - // TODO how do textures in the list map to textures in the meshes? - if (mUploadTextures) + // For all instances that use this model + for (instance_list::iterator instance_iter = iter->second.begin(); + instance_iter != iter->second.end(); + ++instance_iter) { - for (std::vector<LLImportMaterial>::iterator material_iter = instance.mMaterial.begin(); - material_iter != instance.mMaterial.end(); ++material_iter) - { - if (textures.find(material_iter->mDiffuseMap.get()) == textures.end()) + LLModelInstance& instance = *instance_iter; + + LLSD instance_entry; + + for (S32 i = 0; i < 5; i++) + { + data.mModel[i] = instance.mLOD[i]; + } + + LLVector3 pos, scale; + LLQuaternion rot; + LLMatrix4 transformation = instance.mTransform; + decomposeMeshMatrix(transformation,pos,rot,scale); + instance_entry["position"] = ll_sd_from_vector3(pos); + instance_entry["rotation"] = ll_sd_from_quaternion(rot); + instance_entry["scale"] = ll_sd_from_vector3(scale); + + instance_entry["material"] = LL_MCODE_WOOD; + LLPermissions perm; + perm.setOwnerAndGroup(gAgent.getID(), gAgent.getID(), LLUUID::null, false); + perm.setCreator(gAgent.getID()); + + perm.initMasks(PERM_ITEM_UNRESTRICTED | PERM_MOVE, //base + PERM_ITEM_UNRESTRICTED | PERM_MOVE, //owner + LLFloaterPerms::getEveryonePerms(), + LLFloaterPerms::getGroupPerms(), + LLFloaterPerms::getNextOwnerPerms()); + instance_entry["permissions"] = ll_create_sd_from_permissions(perm); + instance_entry["physics_shape_type"] = (U8)(LLViewerObject::PHYSICS_SHAPE_CONVEX_HULL); + instance_entry["mesh"] = mesh_index[data.mBaseModel]; + + instance_entry["face_list"] = LLSD::emptyArray(); + + for (S32 face_num = 0; face_num < data.mBaseModel->getNumVolumeFaces(); face_num++) + { + LLImportMaterial& material = instance.mMaterial[face_num]; + LLSD face_entry = LLSD::emptyMap(); + LLViewerFetchedTexture *texture = material.mDiffuseMap.get(); + + if ((texture != NULL) && + (textures.find(texture) == textures.end())) { - textures.insert(material_iter->mDiffuseMap.get()); + textures.insert(texture); + } - std::stringstream ostr; - if (include_textures) // otherwise data is blank. - { - LLTextureUploadData data(material_iter->mDiffuseMap.get(), material_iter->mDiffuseMapLabel); - if (!data.mTexture->isRawImageValid()) - { - data.mTexture->reloadRawImage(data.mTexture->getDiscardLevel()); - } - + std::stringstream texture_str; + if (texture != NULL && include_textures && mUploadTextures) + { + if(texture->hasSavedRawImage()) + { LLPointer<LLImageJ2C> upload_file = - LLViewerTextureList::convertToUploadFile(data.mTexture->getRawImage()); - ostr.write((const char*) upload_file->getData(), upload_file->getDataSize()); + LLViewerTextureList::convertToUploadFile(texture->getSavedRawImage()); + texture_str.write((const char*) upload_file->getData(), upload_file->getDataSize()); } - LLSD texture_entry; - texture_entry["texture_data"] = ostr.str(); - res["texture_list"][texture_num] = texture_entry; + } + + if (texture != NULL && + mUploadTextures && + texture_index.find(texture) == texture_index.end()) + { + texture_index[texture] = texture_num; + std::string str = texture_str.str(); + res["texture_list"][texture_num] = LLSD::Binary(str.begin(),str.end()); texture_num++; } - } - } - mesh_num++; + // Subset of TextureEntry fields. + if (texture != NULL && mUploadTextures) + { + face_entry["image"] = texture_index[texture]; + face_entry["scales"] = 1.0; + face_entry["scalet"] = 1.0; + face_entry["offsets"] = 0.0; + face_entry["offsett"] = 0.0; + face_entry["imagerot"] = 0.0; + } + face_entry["diffuse_color"] = ll_sd_from_color4(material.mDiffuseColor); + face_entry["fullbright"] = material.mFullbright; + instance_entry["face_list"][face_num] = face_entry; + } + + res["instance_list"][instance_num] = instance_entry; + instance_num++; + } } result["asset_resources"] = res; -#if 1 - dumpLLSDToFile(result,"whole_model.xml"); -#endif + dump_llsd_to_file(result,make_dump_name("whole_model_",dump_num)); dest = result; } void LLMeshUploadThread::doWholeModelUpload() { + dump_num++; + mCurlRequest = new LLCurlRequest(); // Queue up models for hull generation (viewer-side) @@ -1549,13 +1665,13 @@ void LLMeshUploadThread::doWholeModelUpload() physics = data.mModel[LLModel::LOD_HIGH]; } - if (!physics) - { - llerrs << "WTF?" << llendl; - } - + llassert(physics != NULL); + DecompRequest* request = new DecompRequest(physics, data.mBaseModel, this); - gMeshRepo.mDecompThread->submitRequest(request); + if(request->isValid()) + { + gMeshRepo.mDecompThread->submitRequest(request); + } } while (!mPhysicsComplete) @@ -1563,183 +1679,44 @@ void LLMeshUploadThread::doWholeModelUpload() apr_sleep(100); } - bool do_include_textures = false; // not needed for initial cost/validation check. LLSD model_data; - wholeModelToLLSD(model_data, do_include_textures); + wholeModelToLLSD(model_data,false); + dump_llsd_to_file(model_data,make_dump_name("whole_model_fee_request_",dump_num)); mPendingUploads++; LLCurlRequest::headers_t headers; mCurlRequest->post(mWholeModelFeeCapability, headers, model_data, - new LLWholeModelFeeResponder(this)); + new LLWholeModelFeeResponder(this,model_data)); do { mCurlRequest->process(); } while (mCurlRequest->getQueued() > 0); - mCurlRequest->post(mWholeModelUploadURL, headers, model_data["asset_resources"], new LLWholeModelUploadResponder(this)); - - do - { - mCurlRequest->process(); - } while (mCurlRequest->getQueued() > 0); - - delete mCurlRequest; - mCurlRequest = NULL; - - // Currently a no-op. - mFinished = true; -} - -void LLMeshUploadThread::doIterativeUpload() -{ - if(isDiscarded()) - { - mFinished = true; - return ; - } - - mCurlRequest = new LLCurlRequest(); - - std::set<LLViewerTexture* > textures; - - //populate upload queue with relevant models - for (instance_map::iterator iter = mInstance.begin(); iter != mInstance.end(); ++iter) - { - LLMeshUploadData data; - data.mBaseModel = iter->first; - - LLModelInstance& instance = *(iter->second.begin()); - - for (S32 i = 0; i < 5; i++) - { - data.mModel[i] = instance.mLOD[i]; - } - - uploadModel(data); - - if (mUploadTextures) - { - for (std::vector<LLImportMaterial>::iterator material_iter = instance.mMaterial.begin(); - material_iter != instance.mMaterial.end(); ++material_iter) - { - - if (textures.find(material_iter->mDiffuseMap.get()) == textures.end()) - { - textures.insert(material_iter->mDiffuseMap.get()); - - LLTextureUploadData data(material_iter->mDiffuseMap.get(), material_iter->mDiffuseMapLabel); - uploadTexture(data); - } - } - } - - //queue up models for hull generation - DecompRequest* request = new DecompRequest(data.mModel[LLModel::LOD_HIGH], data.mBaseModel, this); - gMeshRepo.mDecompThread->submitRequest(request); - } - while (!mPhysicsComplete) + if (mWholeModelUploadURL.empty()) { - apr_sleep(100); - } - - //upload textures - bool done = false; - do - { - if (!mTextureQ.empty()) - { - sendCostRequest(mTextureQ.front()); - mTextureQ.pop(); - } - - if (!mConfirmedTextureQ.empty()) - { - doUploadTexture(mConfirmedTextureQ.front()); - mConfirmedTextureQ.pop(); - } - - mCurlRequest->process(); - - done = mTextureQ.empty() && mConfirmedTextureQ.empty(); + llinfos << "unable to upload, fee request failed" << llendl; } - while (!done || mCurlRequest->getQueued() > 0); - - LLSD object_asset; - object_asset["objects"] = LLSD::emptyArray(); - - done = false; - do + else { - static S32 count = 0; - static F32 last_hundred = gFrameTimeSeconds; - if (gFrameTimeSeconds - last_hundred > 1.f) + LLSD full_model_data; + wholeModelToLLSD(full_model_data, true); + LLSD body = full_model_data["asset_resources"]; + dump_llsd_to_file(body,make_dump_name("whole_model_body_",dump_num)); + mCurlRequest->post(mWholeModelUploadURL, headers, body, + new LLWholeModelUploadResponder(this, model_data)); + do { - last_hundred = gFrameTimeSeconds; - count = 0; - } - - //how many requests to push before calling process - const S32 PUSH_PER_PROCESS = 32; - - S32 tcount = llmin(count+PUSH_PER_PROCESS, 100); - - while (!mUploadQ.empty() && count < tcount) - { //send any pending upload requests - mMutex->lock(); - LLMeshUploadData data = mUploadQ.front(); - mUploadQ.pop(); - mMutex->unlock(); - sendCostRequest(data); - count++; - } - - tcount = llmin(count+PUSH_PER_PROCESS, 100); - - while (!mConfirmedQ.empty() && count < tcount) - { //process any meshes that have been confirmed for upload - LLMeshUploadData& data = mConfirmedQ.front(); - doUploadModel(data); - mConfirmedQ.pop(); - count++; - } - - tcount = llmin(count+PUSH_PER_PROCESS, 100); - - while (!mInstanceQ.empty() && count < tcount && !isDiscarded()) - { //create any objects waiting for upload - count++; - object_asset["objects"].append(createObject(mInstanceQ.front())); - mInstanceQ.pop(); - } - - mCurlRequest->process(); - - done = isDiscarded() || (mInstanceQ.empty() && mConfirmedQ.empty() && mUploadQ.empty()); + mCurlRequest->process(); + } while (mCurlRequest->getQueued() > 0); } - while (!done || mCurlRequest->getQueued() > 0); delete mCurlRequest; mCurlRequest = NULL; - // now upload the object asset - std::string url = mUploadObjectAssetCapability; - - if (object_asset["objects"][0].has("permissions")) - { //copy permissions from first available object to be used for coalesced object - object_asset["permissions"] = object_asset["objects"][0]["permissions"]; - } - - if(!isDiscarded()) - { - mPendingUploads++; - LLHTTPClient::post(url, object_asset, new LLModelObjectUploadResponder(this,object_asset)); - } - else - { - mFinished = true; - } + // Currently a no-op. + mFinished = true; } void LLMeshUploadThread::uploadModel(LLMeshUploadData& data) @@ -2170,7 +2147,7 @@ void LLMeshHeaderResponder::completedRaw(U32 status, const std::string& reason, //just in case skin info or decomposition is at the end of the file (which it shouldn't be) lod_bytes = llmax(lod_bytes, header["skin"]["offset"].asInteger() + header["skin"]["size"].asInteger()); - lod_bytes = llmax(lod_bytes, header["decomposition"]["offset"].asInteger() + header["decomposition"]["size"].asInteger()); + lod_bytes = llmax(lod_bytes, header["physics_convex"]["offset"].asInteger() + header["physics_convex"]["size"].asInteger()); S32 header_bytes = (S32) gMeshRepo.mThread->mMeshHeaderSize[mesh_id]; S32 bytes = lod_bytes + header_bytes; @@ -2387,10 +2364,6 @@ S32 LLMeshRepository::loadMesh(LLVOVolume* vobj, const LLVolumeParams& mesh_para group->derefLOD(lod); } } - else - { - llerrs << "WTF?" << llendl; - } } return detail; @@ -2462,7 +2435,6 @@ void LLMeshRepository::notifyLoadedMeshes() if (gAgent.getRegion()->getName() != region_name && gAgent.getRegion()->capabilitiesReceived()) { region_name = gAgent.getRegion()->getName(); - mGetMeshCapability = gAgent.getRegion()->getCapability("GetMesh"); } } @@ -2570,6 +2542,20 @@ void LLMeshRepository::notifyLoadedMeshes() void LLMeshRepository::notifySkinInfoReceived(LLMeshSkinInfo& info) { mSkinMap[info.mMeshID] = info; + + skin_load_map::iterator iter = mLoadingSkins.find(info.mMeshID); + if (iter != mLoadingSkins.end()) + { + for (std::set<LLUUID>::iterator obj_id = iter->second.begin(); obj_id != iter->second.end(); ++obj_id) + { + LLVOVolume* vobj = (LLVOVolume*) gObjectList.findObject(*obj_id); + if (vobj) + { + vobj->notifyMeshLoaded(); + } + } + } + mLoadingSkins.erase(info.mMeshID); } @@ -2685,7 +2671,7 @@ U32 LLMeshRepository::getResourceCost(const LLUUID& mesh_id) return mThread->getResourceCost(mesh_id); } -const LLMeshSkinInfo* LLMeshRepository::getSkinInfo(const LLUUID& mesh_id) +const LLMeshSkinInfo* LLMeshRepository::getSkinInfo(const LLUUID& mesh_id, LLVOVolume* requesting_obj) { if (mesh_id.notNull()) { @@ -2699,12 +2685,12 @@ const LLMeshSkinInfo* LLMeshRepository::getSkinInfo(const LLUUID& mesh_id) { LLMutexLock lock(mMeshMutex); //add volume to list of loading meshes - std::set<LLUUID>::iterator iter = mLoadingSkins.find(mesh_id); + skin_load_map::iterator iter = mLoadingSkins.find(mesh_id); if (iter == mLoadingSkins.end()) { //no request pending for this skin info - mLoadingSkins.insert(mesh_id); mPendingSkinRequests.push(mesh_id); } + mLoadingSkins[mesh_id].insert(requesting_obj->getID()); } } @@ -2786,7 +2772,18 @@ void LLMeshRepository::buildHull(const LLVolumeParams& params, S32 detail) bool LLMeshRepository::hasPhysicsShape(const LLUUID& mesh_id) { LLSD mesh = mThread->getMeshHeader(mesh_id); - return mesh.has("physics_shape") && mesh["physics_shape"].has("size") && (mesh["physics_shape"]["size"].asInteger() > 0); + if (mesh.has("physics_mesh") && mesh["physics_mesh"].has("size") && (mesh["physics_mesh"]["size"].asInteger() > 0)) + { + return true; + } + + LLModel::Decomposition* decomp = getDecomposition(mesh_id); + if (decomp && !decomp->mHull.empty()) + { + return true; + } + + return false; } LLSD& LLMeshRepository::getMeshHeader(const LLUUID& mesh_id) @@ -2842,102 +2839,6 @@ S32 LLMeshRepository::getMeshSize(const LLUUID& mesh_id, S32 lod) } -void LLMeshUploadThread::sendCostRequest(LLMeshUploadData& data) -{ - if(isDiscarded()) - { - return ; - } - - //write model file to memory buffer - std::stringstream ostr; - - LLModel::Decomposition& decomp = - data.mModel[LLModel::LOD_PHYSICS].notNull() ? - data.mModel[LLModel::LOD_PHYSICS]->mPhysics : - data.mBaseModel->mPhysics; - - LLSD header = LLModel::writeModel( - ostr, - data.mModel[LLModel::LOD_PHYSICS], - data.mModel[LLModel::LOD_HIGH], - data.mModel[LLModel::LOD_MEDIUM], - data.mModel[LLModel::LOD_LOW], - data.mModel[LLModel::LOD_IMPOSTOR], - decomp, - mUploadSkin, - mUploadJoints, - true); - - std::string desc = data.mBaseModel->mLabel; - - // Grab the total vertex count of the model - // along with other information for the "asset_resources" map - // to send to the server. - LLSD asset_resources = LLSD::emptyMap(); - - - std::string url = mNewInventoryCapability; - - if (!url.empty()) - { - LLSD body = generate_new_resource_upload_capability_body( - LLAssetType::AT_MESH, - desc, - desc, - LLFolderType::FT_MESH, - LLInventoryType::IT_MESH, - LLFloaterPerms::getNextOwnerPerms(), - LLFloaterPerms::getGroupPerms(), - LLFloaterPerms::getEveryonePerms()); - - body["asset_resources"] = asset_resources; - - mPendingConfirmations++; - LLCurlRequest::headers_t headers; - - data.mPostData = body; - - mCurlRequest->post(url, headers, body, new LLMeshCostResponder(data, this)); - } -} - -void LLMeshUploadThread::sendCostRequest(LLTextureUploadData& data) -{ - if(isDiscarded()) - { - return ; - } - - if (data.mTexture && data.mTexture->getDiscardLevel() >= 0) - { - LLSD asset_resources = LLSD::emptyMap(); - - std::string url = mNewInventoryCapability; - - if (!url.empty()) - { - LLSD body = generate_new_resource_upload_capability_body( - LLAssetType::AT_TEXTURE, - data.mLabel, - data.mLabel, - LLFolderType::FT_TEXTURE, - LLInventoryType::IT_TEXTURE, - LLFloaterPerms::getNextOwnerPerms(), - LLFloaterPerms::getGroupPerms(), - LLFloaterPerms::getEveryonePerms()); - - body["asset_resources"] = asset_resources; - - mPendingConfirmations++; - LLCurlRequest::headers_t headers; - - data.mPostData = body; - mCurlRequest->post(url, headers, body, new LLTextureCostResponder(data, this)); - } - } -} - void LLMeshUploadThread::doUploadModel(LLMeshUploadData& data) { @@ -2993,9 +2894,12 @@ void LLMeshUploadThread::doUploadTexture(LLTextureUploadData& data) data.mTexture->reloadRawImage(data.mTexture->getDiscardLevel()); } - LLPointer<LLImageJ2C> upload_file = LLViewerTextureList::convertToUploadFile(data.mTexture->getRawImage()); + if(data.mTexture->hasSavedRawImage()) + { + LLPointer<LLImageJ2C> upload_file = LLViewerTextureList::convertToUploadFile(data.mTexture->getSavedRawImage()); - ostr.write((const char*) upload_file->getData(), upload_file->getDataSize()); + ostr.write((const char*) upload_file->getData(), upload_file->getDataSize()); + } data.mAssetData = ostr.str(); @@ -3075,11 +2979,8 @@ LLSD LLMeshUploadThread::createObject(LLModelInstance& instance) { LLMatrix4 transformation = instance.mTransform; - if (instance.mMeshID.isNull()) - { - llerrs << "WTF?" << llendl; - } - + llassert(instance.mMeshID.notNull()); + // check for reflection BOOL reflected = (transformation.determinant() < 0); @@ -3243,6 +3144,8 @@ bool LLImportMaterial::operator<(const LLImportMaterial &rhs) const void LLMeshRepository::updateInventory(inventory_data data) { LLMutexLock lock(mMeshMutex); + dump_llsd_to_file(data.mPostData,make_dump_name("update_inventory_post_data_",dump_num)); + dump_llsd_to_file(data.mResponse,make_dump_name("update_inventory_response_",dump_num)); mInventoryQ.push(data); } @@ -3400,15 +3303,18 @@ void LLPhysicsDecomp::setMeshData(LLCDMeshData& mesh) mesh.mNumTriangles = mCurRequest->mIndices.size()/3; - LLCDResult ret = LLCD_OK; - if (LLConvexDecomposition::getInstance() != NULL) + if (mesh.mNumTriangles > 0 && mesh.mNumVertices > 2) { - ret = LLConvexDecomposition::getInstance()->setMeshData(&mesh); - } + LLCDResult ret = LLCD_OK; + if (LLConvexDecomposition::getInstance() != NULL) + { + ret = LLConvexDecomposition::getInstance()->setMeshData(&mesh); + } - if (ret) - { - llerrs << "Convex Decomposition thread valid but could not set mesh data" << llendl; + if (ret) + { + llerrs << "Convex Decomposition thread valid but could not set mesh data" << llendl; + } } } @@ -3472,11 +3378,6 @@ void LLPhysicsDecomp::doDecomposition() { ret = LLConvexDecomposition::getInstance()->setParam(param->mName, value.asBoolean()); } - - if (ret) - { - llerrs << "WTF?" << llendl; - } } mCurRequest->setStatusMessage("Executing."); @@ -3771,6 +3672,81 @@ void LLPhysicsDecomp::run() mDone = true; } +void LLPhysicsDecomp::Request::assignData(LLModel* mdl) +{ + if (!mdl) + { + return ; + } + + U16 index_offset = 0; + U16 tri[3] ; + + mPositions.clear(); + mIndices.clear(); + mBBox[1] = LLVector3(F32_MIN, F32_MIN, F32_MIN) ; + mBBox[0] = LLVector3(F32_MAX, F32_MAX, F32_MAX) ; + + //queue up vertex positions and indices + for (S32 i = 0; i < mdl->getNumVolumeFaces(); ++i) + { + const LLVolumeFace& face = mdl->getVolumeFace(i); + if (mPositions.size() + face.mNumVertices > 65535) + { + continue; + } + + for (U32 j = 0; j < face.mNumVertices; ++j) + { + mPositions.push_back(LLVector3(face.mPositions[j].getF32ptr())); + for(U32 k = 0 ; k < 3 ; k++) + { + mBBox[0].mV[k] = llmin(mBBox[0].mV[k], mPositions[j].mV[k]) ; + mBBox[1].mV[k] = llmax(mBBox[1].mV[k], mPositions[j].mV[k]) ; + } + } + + updateTriangleAreaThreshold() ; + + for (U32 j = 0; j+2 < face.mNumIndices; j += 3) + { + tri[0] = face.mIndices[j] + index_offset ; + tri[1] = face.mIndices[j + 1] + index_offset ; + tri[2] = face.mIndices[j + 2] + index_offset ; + + if(isValidTriangle(tri[0], tri[1], tri[2])) + { + mIndices.push_back(tri[0]); + mIndices.push_back(tri[1]); + mIndices.push_back(tri[2]); + } + } + + index_offset += face.mNumVertices; + } + + return ; +} + +void LLPhysicsDecomp::Request::updateTriangleAreaThreshold() +{ + F32 range = mBBox[1].mV[0] - mBBox[0].mV[0] ; + range = llmin(range, mBBox[1].mV[1] - mBBox[0].mV[1]) ; + range = llmin(range, mBBox[1].mV[2] - mBBox[0].mV[2]) ; + + mTriangleAreaThreshold = llmin(0.0002f, range * 0.000002f) ; +} + +//check if the triangle area is large enough to qualify for a valid triangle +bool LLPhysicsDecomp::Request::isValidTriangle(U16 idx1, U16 idx2, U16 idx3) +{ + LLVector3 a = mPositions[idx2] - mPositions[idx1] ; + LLVector3 b = mPositions[idx3] - mPositions[idx1] ; + F32 c = a * b ; + + return ((a*a) * (b*b) - c * c) > mTriangleAreaThreshold ; +} + void LLPhysicsDecomp::Request::setStatusMessage(const std::string& msg) { mStatusMessage = msg; @@ -3868,3 +3844,27 @@ void LLMeshRepository::buildPhysicsMesh(LLModel::Decomposition& decomp) } } } + + +bool LLMeshRepository::meshUploadEnabled() +{ + LLViewerRegion *region = gAgent.getRegion(); + if(gSavedSettings.getBOOL("MeshEnabled") && + LLViewerParcelMgr::getInstance()->allowAgentBuild() && + region) + { + return region->meshUploadEnabled(); + } + return false; +} + +bool LLMeshRepository::meshRezEnabled() +{ + LLViewerRegion *region = gAgent.getRegion(); + if(gSavedSettings.getBOOL("MeshEnabled") && + region) + { + return region->meshRezEnabled(); + } + return false; +} diff --git a/indra/newview/llmeshrepository.h b/indra/newview/llmeshrepository.h index f859e29c0789778440fdb1158324024348dad163..f237c3a60e6cbdc9ad8134aad4b1c2966ac9b6b6 100644 --- a/indra/newview/llmeshrepository.h +++ b/indra/newview/llmeshrepository.h @@ -152,7 +152,7 @@ class LLPhysicsDecomp : public LLThread std::string mStatusMessage; std::vector<LLModel::PhysicsMesh> mHullMesh; LLModel::convex_hull_decomposition mHull; - + //status message callback, called from decomposition thread virtual S32 statusCallback(const char* status, S32 p1, S32 p2) = 0; @@ -160,6 +160,17 @@ class LLPhysicsDecomp : public LLThread virtual void completed() = 0; virtual void setStatusMessage(const std::string& msg); + + bool isValid() const {return mPositions.size() > 2 && mIndices.size() > 2 ;} + + protected: + //internal use + LLVector3 mBBox[2] ; + F32 mTriangleAreaThreshold ; + + void assignData(LLModel* mdl) ; + void updateTriangleAreaThreshold() ; + bool isValidTriangle(U16 idx1, U16 idx2, U16 idx3) ; }; LLCondition* mSignal; @@ -385,8 +396,6 @@ class LLMeshUploadThread : public LLThread BOOL mDiscarded ; LLHost mHost; - std::string mUploadObjectAssetCapability; - std::string mNewInventoryCapability; std::string mWholeModelFeeCapability; std::string mWholeModelUploadURL; @@ -405,12 +414,10 @@ class LLMeshUploadThread : public LLThread void uploadTexture(LLTextureUploadData& data); void doUploadTexture(LLTextureUploadData& data); - void sendCostRequest(LLTextureUploadData& data); void priceResult(LLTextureUploadData& data, const LLSD& content); void onTextureUploaded(LLTextureUploadData& data); void uploadModel(LLMeshUploadData& data); - void sendCostRequest(LLMeshUploadData& data); void doUploadModel(LLMeshUploadData& data); void onModelUploaded(LLMeshUploadData& data); void createObjects(LLMeshUploadData& data); @@ -424,7 +431,6 @@ class LLMeshUploadThread : public LLThread BOOL isDiscarded(); void doWholeModelUpload(); - void doIterativeUpload(); void wholeModelToLLSD(LLSD& dest, bool include_textures); @@ -467,13 +473,17 @@ class LLMeshRepository static S32 getActualMeshLOD(LLSD& header, S32 lod); U32 calcResourceCost(LLSD& header); U32 getResourceCost(const LLUUID& mesh_params); - const LLMeshSkinInfo* getSkinInfo(const LLUUID& mesh_id); + const LLMeshSkinInfo* getSkinInfo(const LLUUID& mesh_id, LLVOVolume* requesting_obj); LLModel::Decomposition* getDecomposition(const LLUUID& mesh_id); void fetchPhysicsShape(const LLUUID& mesh_id); bool hasPhysicsShape(const LLUUID& mesh_id); void buildHull(const LLVolumeParams& params, S32 detail); void buildPhysicsMesh(LLModel::Decomposition& decomp); + + bool meshUploadEnabled(); + bool meshRezEnabled(); + LLSD& getMeshHeader(const LLUUID& mesh_id); @@ -496,7 +506,8 @@ class LLMeshRepository std::vector<LLMeshRepoThread::LODRequest> mPendingRequests; //list of mesh ids awaiting skin info - std::set<LLUUID> mLoadingSkins; + typedef std::map<LLUUID, std::set<LLUUID> > skin_load_map; + skin_load_map mLoadingSkins; //list of mesh ids that need to send skin info fetch requests std::queue<LLUUID> mPendingSkinRequests; diff --git a/indra/newview/llnearbychathandler.cpp b/indra/newview/llnearbychathandler.cpp index f157b205924343e8410ab3a98799228d68667205..957b6d5f94fc6d8498fd6e4a4dcd441d36da9573 100644 --- a/indra/newview/llnearbychathandler.cpp +++ b/indra/newview/llnearbychathandler.cpp @@ -268,6 +268,9 @@ bool LLNearbyChatScreenChannel::createPoolToast() toast->setOnFadeCallback(boost::bind(&LLNearbyChatScreenChannel::onToastFade, this, _1)); + // If the toast gets somehow prematurely destroyed, deactivate it to prevent crash (STORM-1352). + toast->setOnToastDestroyedCallback(boost::bind(&LLNearbyChatScreenChannel::onToastDestroyed, this, _1, false)); + LL_DEBUGS("NearbyChat") << "Creating and pooling toast" << llendl; m_toast_pool.push_back(toast->getHandle()); return true; @@ -369,8 +372,10 @@ void LLNearbyChatScreenChannel::arrangeToasts() } } -int sort_toasts_predicate(LLHandle<LLToast> first, LLHandle<LLToast> second) +static bool sort_toasts_predicate(LLHandle<LLToast> first, LLHandle<LLToast> second) { + if (!first.get() || !second.get()) return false; // STORM-1352 + F32 v1 = first.get()->getTimeLeftToLive(); F32 v2 = second.get()->getTimeLeftToLive(); return v1 > v2; @@ -396,7 +401,11 @@ void LLNearbyChatScreenChannel::showToastsBottom() for(toast_vec_t::iterator it = m_active_toasts.begin(); it != m_active_toasts.end(); ++it) { LLToast* toast = it->get(); - if (!toast) continue; + if (!toast) + { + llwarns << "NULL found in the active chat toasts list!" << llendl; + continue; + } S32 toast_top = bottom + toast->getRect().getHeight() + margin; diff --git a/indra/newview/llpanellandmarks.cpp b/indra/newview/llpanellandmarks.cpp index 80f68621697fe9487b0529ed1cf5e53b815b795d..c2729fa19bd395d4d3fd5ca936c0eb55911d17e4 100644 --- a/indra/newview/llpanellandmarks.cpp +++ b/indra/newview/llpanellandmarks.cpp @@ -299,7 +299,7 @@ void LLLandmarksPanel::onTeleport() } LLFolderViewEventListener* listenerp = current_item->getListener(); - if (listenerp->getInventoryType() == LLInventoryType::IT_LANDMARK) + if (listenerp && listenerp->getInventoryType() == LLInventoryType::IT_LANDMARK) { listenerp->openItem(); } diff --git a/indra/newview/llpanellogin.cpp b/indra/newview/llpanellogin.cpp index d0810d0772e0b54f29a72dd3976709b8b8608d0b..27f341b4f6d449a9711a506c3bdd27adcaa40cb1 100644 --- a/indra/newview/llpanellogin.cpp +++ b/indra/newview/llpanellogin.cpp @@ -34,7 +34,6 @@ #include "llmd5.h" #include "llsecondlifeurls.h" #include "v4color.h" -#include "llversionviewer.h" #include "llappviewer.h" #include "llbutton.h" @@ -748,20 +747,12 @@ void LLPanelLogin::loadLoginPage() LLVersionInfo::getShortVersion().c_str(), LLVersionInfo::getBuild()); - char* curl_channel ; + char* curl_channel = curl_escape(LLVersionInfo::getChannel().c_str(), 0); char* curl_version = curl_escape(version.c_str(), 0); - if(strcmp(LLVersionInfo::getChannel().c_str(), LL_CHANNEL)) - { - curl_channel = curl_escape(LLVersionInfo::getChannel().c_str(), 0); - } - else //if LL_CHANNEL, direct it to "Second Life Beta Viewer". - { - curl_channel = curl_escape("Second Life Beta Viewer", 0); - } oStr << "&channel=" << curl_channel; oStr << "&version=" << curl_version; - + curl_free(curl_channel); curl_free(curl_version); diff --git a/indra/newview/llpanelobject.cpp b/indra/newview/llpanelobject.cpp index b4d0ada19655a25b5f45ddbf1b9bc435edb13be1..52917ff20b3dfbe5e30fca4c53c52a47cf8496be 100644 --- a/indra/newview/llpanelobject.cpp +++ b/indra/newview/llpanelobject.cpp @@ -1740,26 +1740,11 @@ void LLPanelObject::refresh() mRootObject = NULL; } - bool enable_mesh = gSavedSettings.getBOOL("MeshEnabled") && - gAgent.getRegion() && - !gAgent.getRegion()->getCapability("GetMesh").empty() && - !gAgent.getRegion()->getCapability("ObjectAdd").empty(); - F32 max_scale = get_default_max_prim_scale(LLPickInfo::isFlora(mObject)); getChild<LLSpinCtrl>("Scale X")->setMaxValue(max_scale); getChild<LLSpinCtrl>("Scale Y")->setMaxValue(max_scale); getChild<LLSpinCtrl>("Scale Z")->setMaxValue(max_scale); - - BOOL found = mCtrlSculptType->itemExists("Mesh"); - if (enable_mesh && !found) - { - mCtrlSculptType->add("Mesh"); - } - else if (!enable_mesh && found) - { - mCtrlSculptType->remove("Mesh"); - } } diff --git a/indra/newview/llpanelplaces.cpp b/indra/newview/llpanelplaces.cpp index 46262832dcddf47347fec80ff247abf4b560ee5c..1e510a2d7b424bbe172e7e4c8a4a47726134f54a 100644 --- a/indra/newview/llpanelplaces.cpp +++ b/indra/newview/llpanelplaces.cpp @@ -584,6 +584,13 @@ void LLPanelPlaces::onTeleportButtonClicked() { if (mPlaceInfoType == LANDMARK_INFO_TYPE) { + if (mItem.isNull()) + { + llwarns << "NULL landmark item" << llendl; + llassert(mItem.notNull()); + return; + } + LLSD payload; payload["asset_id"] = mItem->getAssetUUID(); LLSD args; diff --git a/indra/newview/llpanelvolume.cpp b/indra/newview/llpanelvolume.cpp index 7839cdd811141bd20924dea1cd43f409f38359b5..bb87601d2017fd6ef22bcd828d757d2057bc766e 100644 --- a/indra/newview/llpanelvolume.cpp +++ b/indra/newview/llpanelvolume.cpp @@ -530,17 +530,24 @@ void LLPanelVolume::refresh() getChildView("Light Ambiance")->setVisible( visible); getChildView("light texture control")->setVisible( visible); - bool enable_mesh = gSavedSettings.getBOOL("MeshEnabled") && - gAgent.getRegion() && - !gAgent.getRegion()->getCapability("GetMesh").empty() && - !gAgent.getRegion()->getCapability("ObjectAdd").empty(); + bool enable_mesh = false; + LLSD sim_features; + LLViewerRegion *region = gAgent.getRegion(); + if(region) + { + LLSD sim_features; + region->getSimulatorFeatures(sim_features); + enable_mesh = sim_features.has("PhysicsShapeTypes"); + } getChildView("label physicsshapetype")->setVisible(enable_mesh); getChildView("Physics Shape Type Combo Ctrl")->setVisible(enable_mesh); getChildView("Physics Gravity")->setVisible(enable_mesh); getChildView("Physics Friction")->setVisible(enable_mesh); getChildView("Physics Density")->setVisible(enable_mesh); getChildView("Physics Restitution")->setVisible(enable_mesh); + + /* TODO: add/remove individual physics shape types as per the PhysicsShapeTypes simulator features */ } diff --git a/indra/newview/llpreviewnotecard.cpp b/indra/newview/llpreviewnotecard.cpp index 9f3ee6ac5d21fbcd977800aa4158da9ead916597..4974dde282c24044446503e184dbe3fc36ccd76b 100644 --- a/indra/newview/llpreviewnotecard.cpp +++ b/indra/newview/llpreviewnotecard.cpp @@ -401,15 +401,14 @@ struct LLSaveNotecardInfo bool LLPreviewNotecard::saveIfNeeded(LLInventoryItem* copyitem) { - if(!gAssetStorage) + LLViewerTextEditor* editor = getChild<LLViewerTextEditor>("Notecard Editor"); + + if(!editor) { - llwarns << "Not connected to an asset storage system." << llendl; + llwarns << "Cannot get handle to the notecard editor." << llendl; return false; } - - LLViewerTextEditor* editor = getChild<LLViewerTextEditor>("Notecard Editor"); - if(!editor->isPristine()) { // We need to update the asset information @@ -436,8 +435,15 @@ bool LLPreviewNotecard::saveIfNeeded(LLInventoryItem* copyitem) // save it out to database if (item) { - std::string agent_url = gAgent.getRegion()->getCapability("UpdateNotecardAgentInventory"); - std::string task_url = gAgent.getRegion()->getCapability("UpdateNotecardTaskInventory"); + const LLViewerRegion* region = gAgent.getRegion(); + if (!region) + { + llwarns << "Not connected to a region, cannot save notecard." << llendl; + return false; + } + std::string agent_url = region->getCapability("UpdateNotecardAgentInventory"); + std::string task_url = region->getCapability("UpdateNotecardTaskInventory"); + if (mObjectUUID.isNull() && !agent_url.empty()) { // Saving into agent inventory @@ -472,6 +478,11 @@ bool LLPreviewNotecard::saveIfNeeded(LLInventoryItem* copyitem) (void*)info, FALSE); } + else // !gAssetStorage + { + llwarns << "Not connected to an asset storage system." << llendl; + return false; + } } } return true; diff --git a/indra/newview/llspatialpartition.cpp b/indra/newview/llspatialpartition.cpp index fa329eb0ae0271807132e0a46f576214dd5ebbd3..a5b91729e856f1dbb018b8ec53e5917c95c15081 100644 --- a/indra/newview/llspatialpartition.cpp +++ b/indra/newview/llspatialpartition.cpp @@ -35,6 +35,7 @@ #include "llvolumeoctree.h" #include "llviewercamera.h" #include "llface.h" +#include "llfloatertools.h" #include "llviewercontrol.h" #include "llviewerregion.h" #include "llcamera.h" @@ -69,6 +70,7 @@ U32 LLSpatialGroup::sNodeCount = 0; std::set<GLuint> LLSpatialGroup::sPendingQueries; +U32 gOctreeMaxCapacity; BOOL LLSpatialGroup::sNoDelete = FALSE; @@ -630,7 +632,7 @@ BOOL LLSpatialGroup::updateInGroup(LLDrawable *drawablep, BOOL immediate) if (mOctreeNode->isInside(drawablep->getPositionGroup()) && (mOctreeNode->contains(drawablep) || (drawablep->getBinRadius() > mOctreeNode->getSize()[0] && - parent && parent->getElementCount() >= LL_OCTREE_MAX_CAPACITY))) + parent && parent->getElementCount() >= gOctreeMaxCapacity))) { unbound(); setState(OBJECT_DIRTY); @@ -689,17 +691,8 @@ static LLFastTimer::DeclareTimer FTM_REBUILD_VBO("VBO Rebuilt"); void LLSpatialPartition::rebuildGeom(LLSpatialGroup* group) { - /*if (!gPipeline.hasRenderType(mDrawableType)) - { - return; - }*/ - if (group->isDead() || !group->isState(LLSpatialGroup::GEOM_DIRTY)) { - /*if (!group->isState(LLSpatialGroup::GEOM_DIRTY) && mRenderByGroup) - { - llerrs << "WTF?" << llendl; - }*/ return; } @@ -961,21 +954,15 @@ void LLSpatialGroup::setState(U32 state) { mState |= state; - if (state > LLSpatialGroup::STATE_MASK) - { - llerrs << "WTF?" << llendl; - } + llassert(state <= LLSpatialGroup::STATE_MASK); } void LLSpatialGroup::setState(U32 state, S32 mode) { LLMemType mt(LLMemType::MTYPE_SPACE_PARTITION); - if (state > LLSpatialGroup::STATE_MASK) - { - llerrs << "WTF?" << llendl; - } - + llassert(state <= LLSpatialGroup::STATE_MASK); + if (mode > STATE_MODE_SINGLE) { if (mode == STATE_MODE_DIFF) @@ -1021,20 +1008,14 @@ class LLSpatialClearStateDiff : public LLSpatialClearState void LLSpatialGroup::clearState(U32 state) { - if (state > LLSpatialGroup::STATE_MASK) - { - llerrs << "WTF?" << llendl; - } + llassert(state <= LLSpatialGroup::STATE_MASK); mState &= ~state; } void LLSpatialGroup::clearState(U32 state, S32 mode) { - if (state > LLSpatialGroup::STATE_MASK) - { - llerrs << "WTF?" << llendl; - } + llassert(state <= LLSpatialGroup::STATE_MASK); LLMemType mt(LLMemType::MTYPE_SPACE_PARTITION); @@ -1059,10 +1040,7 @@ void LLSpatialGroup::clearState(U32 state, S32 mode) BOOL LLSpatialGroup::isState(U32 state) const { - if (state > LLSpatialGroup::STATE_MASK) - { - llerrs << "WTF?" << llendl; - } + llassert(state <= LLSpatialGroup::STATE_MASK); return mState & state ? TRUE : FALSE; } @@ -1250,7 +1228,8 @@ void LLSpatialGroup::updateDistance(LLCamera &camera) { if (LLViewerCamera::sCurCameraID != LLViewerCamera::CAMERA_WORLD) { - llerrs << "WTF?" << llendl; + llwarns << "Attempted to update distance for camera other than world camera!" << llendl; + return; } #if !LL_RELEASE_FOR_DOWNLOAD @@ -2064,11 +2043,8 @@ class LLOctreeCullVisExtents: public LLOctreeCullShadow virtual void processGroup(LLSpatialGroup* group) { - if (group->isState(LLSpatialGroup::DIRTY) || group->getData().empty()) - { - llerrs << "WTF?" << llendl; - } - + llassert(!group->isState(LLSpatialGroup::DIRTY) && !group->getData().empty()) + if (mRes < 2) { if (mCamera->AABBInFrustum(group->mObjectBounds[0], group->mObjectBounds[1]) > 0) @@ -2541,7 +2517,7 @@ void renderOctree(LLSpatialGroup* group) //coded by buffer usage and activity gGL.setSceneBlendType(LLRender::BT_ADD_WITH_ALPHA); LLVector4 col; - if (group->mBuilt > 0.f) + /*if (group->mBuilt > 0.f) { group->mBuilt -= 2.f * gFrameIntervalSeconds; if (group->mBufferUsage == GL_STATIC_DRAW_ARB) @@ -2610,7 +2586,7 @@ void renderOctree(LLSpatialGroup* group) gGL.color4f(1,1,1,1); } } - else + else*/ { if (group->mBufferUsage == GL_STATIC_DRAW_ARB && !group->getData().empty() && group->mSpatialPartition->mRenderByGroup) @@ -2630,33 +2606,24 @@ void renderOctree(LLSpatialGroup* group) size.mul(1.01f); size.add(fudge); - { - LLGLDepthTest depth(GL_TRUE, GL_FALSE); - drawBox(group->mObjectBounds[0], fudge); - } + //{ + // LLGLDepthTest depth(GL_TRUE, GL_FALSE); + // drawBox(group->mObjectBounds[0], fudge); + //} gGL.setSceneBlendType(LLRender::BT_ALPHA); - if (group->mBuilt <= 0.f) + //if (group->mBuilt <= 0.f) { //draw opaque outline - gGL.color4f(col.mV[0], col.mV[1], col.mV[2], 1.f); - drawBoxOutline(group->mObjectBounds[0], group->mObjectBounds[1]); + //gGL.color4f(col.mV[0], col.mV[1], col.mV[2], 1.f); + //drawBoxOutline(group->mObjectBounds[0], group->mObjectBounds[1]); - if (group->mOctreeNode->isLeaf()) - { - gGL.color4f(1,1,1,1); - } - else - { - gGL.color4f(0,1,1,1); - } - + gGL.color4f(0,1,1,1); drawBoxOutline(group->mBounds[0],group->mBounds[1]); - - + //draw bounding box for draw info - if (group->mSpatialPartition->mRenderByGroup) + /*if (group->mSpatialPartition->mRenderByGroup) { gGL.color4f(1.0f, 0.75f, 0.25f, 0.6f); for (LLSpatialGroup::draw_map_t::iterator i = group->mDrawMap.begin(); i != group->mDrawMap.end(); ++i) @@ -2673,7 +2640,7 @@ void renderOctree(LLSpatialGroup* group) drawBoxOutline(center, size); } } - } + }*/ } // LLSpatialGroup::OctreeNode* node = group->mOctreeNode; @@ -2716,7 +2683,7 @@ void renderVisibility(LLSpatialGroup* group, LLCamera* camera) gGL.color4f(0.f, 0.75f, 0.f, 0.5f); pushBufferVerts(group, LLVertexBuffer::MAP_VERTEX); } - else if (camera && group->mOcclusionVerts.notNull()) + /*else if (camera && group->mOcclusionVerts.notNull()) { LLVertexBuffer::unbind(); group->mOcclusionVerts->setBuffer(LLVertexBuffer::MAP_VERTEX); @@ -2728,7 +2695,7 @@ void renderVisibility(LLSpatialGroup* group, LLCamera* camera) glColor4f(1.0f, 1.f, 1.f, 1.0f); group->mOcclusionVerts->drawRange(LLRender::TRIANGLE_FAN, 0, 7, 8, get_box_fan_indices(camera, group->mBounds[0])); glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); - } + }*/ } } @@ -3002,13 +2969,6 @@ void render_hull(LLModel::PhysicsMesh& mesh, const LLColor4& color, const LLColo void renderPhysicsShape(LLDrawable* drawable, LLVOVolume* volume) { - if (volume->isSelected()) - { - LLVector3 construct_me(5,5,5); - construct_me.normalize(); - } - - U8 physics_type = volume->getPhysicsShapeType(); if (physics_type == LLViewerObject::PHYSICS_SHAPE_NONE || volume->isFlexible()) @@ -3473,6 +3433,8 @@ void renderTextureAnim(LLDrawInfo* params) void renderBatchSize(LLDrawInfo* params) { + LLGLEnable offset(GL_POLYGON_OFFSET_FILL); + glPolygonOffset(-1.f, 1.f); glColor3ubv((GLubyte*) &(params->mDebugColor)); pushVerts(params, LLVertexBuffer::MAP_VERTEX); } @@ -3910,6 +3872,28 @@ class LLOctreeRenderNonOccluded : public LLOctreeTraveler<LLDrawable> renderAgentTarget(avatar); } + if (gDebugGL) + { + for (U32 i = 0; i < drawable->getNumFaces(); ++i) + { + LLFace* facep = drawable->getFace(i); + U8 index = facep->getTextureIndex(); + if (facep->mDrawInfo) + { + if (index < 255) + { + if (facep->mDrawInfo->mTextureList.size() <= index) + { + llerrs << "Face texture index out of bounds." << llendl; + } + else if (facep->mDrawInfo->mTextureList[index] != facep->getTexture()) + { + llerrs << "Face texture index incorrect." << llendl; + } + } + } + } + } } for (LLSpatialGroup::draw_map_t::iterator i = group->mDrawMap.begin(); i != group->mDrawMap.end(); ++i) @@ -4282,7 +4266,29 @@ class LLOctreeIntersect : public LLSpatialGroup::OctreeTraveler if (vobj) { LLVector3 intersection; - if (vobj->lineSegmentIntersect(mStart, mEnd, -1, mPickTransparent, mFaceHit, &intersection, mTexCoord, mNormal, mBinormal)) + bool skip_check = false; + if (vobj->isAvatar()) + { + LLVOAvatar* avatar = (LLVOAvatar*) vobj; + if (avatar->isSelf() && LLFloater::isVisible(gFloaterTools)) + { + LLViewerObject* hit = avatar->lineSegmentIntersectRiggedAttachments(mStart, mEnd, -1, mPickTransparent, mFaceHit, &intersection, mTexCoord, mNormal, mBinormal); + if (hit) + { + mEnd = intersection; + if (mIntersection) + { + *mIntersection = intersection; + } + + mHit = hit->mDrawable; + skip_check = true; + } + + } + } + + if (!skip_check && vobj->lineSegmentIntersect(mStart, mEnd, -1, mPickTransparent, mFaceHit, &intersection, mTexCoord, mNormal, mBinormal)) { mEnd = intersection; // shorten ray so we only find CLOSER hits if (mIntersection) diff --git a/indra/newview/llspatialpartition.h b/indra/newview/llspatialpartition.h index 0d9cad914a55755344cc062719da89ec364a05d7..db8a0c29926a6b7d4356b5813c7c48c163175766 100644 --- a/indra/newview/llspatialpartition.h +++ b/indra/newview/llspatialpartition.h @@ -91,6 +91,8 @@ class LLDrawInfo : public LLRefCount LLPointer<LLVertexBuffer> mVertexBuffer; LLPointer<LLViewerTexture> mTexture; + std::vector<LLPointer<LLViewerTexture> > mTextureList; + LLColor4U mGlowColor; S32 mDebugColor; const LLMatrix4* mTextureMatrix; @@ -207,7 +209,7 @@ class LLSpatialGroup : public LLOctreeListener<LLDrawable> typedef std::vector<LLPointer<LLDrawInfo> > drawmap_elem_t; typedef std::map<U32, drawmap_elem_t > draw_map_t; typedef std::vector<LLPointer<LLVertexBuffer> > buffer_list_t; - typedef std::map<LLPointer<LLViewerTexture>, buffer_list_t> buffer_texture_map_t; + typedef std::map<LLFace*, buffer_list_t> buffer_texture_map_t; typedef std::map<U32, buffer_texture_map_t> buffer_map_t; typedef LLOctreeListener<LLDrawable> BaseType; @@ -399,7 +401,7 @@ class LLSpatialGroup : public LLOctreeListener<LLDrawable> public: bridge_list_t mBridgeList; - buffer_map_t mBufferMap; //used by volume buffers to store unique buffers per texture + buffer_map_t mBufferMap; //used by volume buffers to attempt to reuse vertex buffers F32 mBuilt; OctreeNode* mOctreeNode; @@ -684,7 +686,7 @@ class LLVolumeGeometryManager: public LLGeometryManager virtual void rebuildGeom(LLSpatialGroup* group); virtual void rebuildMesh(LLSpatialGroup* group); virtual void getGeometry(LLSpatialGroup* group); - void genDrawInfo(LLSpatialGroup* group, U32 mask, std::vector<LLFace*>& faces, BOOL distance_sort = FALSE); + void genDrawInfo(LLSpatialGroup* group, U32 mask, std::vector<LLFace*>& faces, BOOL distance_sort = FALSE, BOOL batch_textures = FALSE); void registerFace(LLSpatialGroup* group, LLFace* facep, U32 type); }; diff --git a/indra/newview/lltoolpie.cpp b/indra/newview/lltoolpie.cpp index 9ec4d3303603c49d506b0e66982a44144f8335bb..c38c8bad809b298974309697d40cb0f0d85185ca 100644 --- a/indra/newview/lltoolpie.cpp +++ b/indra/newview/lltoolpie.cpp @@ -639,6 +639,7 @@ BOOL LLToolPie::handleMouseUp(S32 x, S32 y, MASK mask) if (click_action == CLICK_ACTION_NONE // not doing 1-click action && gSavedSettings.getBOOL("ClickToWalk") // click to walk enabled && !gAgent.getFlying() // don't auto-navigate while flying until that works + && gAgentAvatarp && !gAgentAvatarp->isSitting() && !mBlockClickToWalk // another behavior hasn't cancelled click to walk && !mPick.mPosGlobal.isExactlyZero() // valid coordinates for pick diff --git a/indra/newview/llviewercontrol.cpp b/indra/newview/llviewercontrol.cpp index 379bbe614d62161a5d83a0cabd4cca2830c4db84..87ca80260f4337a52e6dc54bceb31c2708651525 100644 --- a/indra/newview/llviewercontrol.cpp +++ b/indra/newview/llviewercontrol.cpp @@ -57,6 +57,7 @@ #include "llworld.h" #include "pipeline.h" #include "llviewerjoystick.h" +#include "llviewerobjectlist.h" #include "llviewerparcelmgr.h" #include "llparcel.h" #include "llkeyboard.h" @@ -183,6 +184,21 @@ static bool handleReleaseGLBufferChanged(const LLSD& newvalue) return true; } +static bool handleFSAASamplesChanged(const LLSD& newvalue) +{ + if (gPipeline.isInit()) + { + gPipeline.releaseGLBuffers(); + gPipeline.createGLBuffers(); + + if (LLPipeline::sRenderDeferred) + { + LLViewerShaderMgr::instance()->setShaders(); + } + } + return true; +} + static bool handleAnisotropicChanged(const LLSD& newvalue) { LLImageGL::sGlobalUseAnisotropic = newvalue.asBoolean(); @@ -357,6 +373,16 @@ static bool handleResetVertexBuffersChanged(const LLSD&) return true; } +static bool handleRepartition(const LLSD&) +{ + if (gPipeline.isInit()) + { + gOctreeMaxCapacity = gSavedSettings.getU32("OctreeMaxNodeCapacity"); + gObjectList.repartitionObjects(); + } + return true; +} + static bool handleRenderDynamicLODChanged(const LLSD& newvalue) { LLPipeline::sDynamicLOD = newvalue.asBoolean(); @@ -560,6 +586,12 @@ void settings_setup_listeners() gSavedSettings.getControl("FirstPersonAvatarVisible")->getSignal()->connect(boost::bind(&handleRenderAvatarMouselookChanged, _2)); gSavedSettings.getControl("RenderFarClip")->getSignal()->connect(boost::bind(&handleRenderFarClipChanged, _2)); gSavedSettings.getControl("RenderTerrainDetail")->getSignal()->connect(boost::bind(&handleTerrainDetailChanged, _2)); + gSavedSettings.getControl("OctreeStaticObjectSizeFactor")->getSignal()->connect(boost::bind(&handleRepartition, _2)); + gSavedSettings.getControl("OctreeDistanceFactor")->getSignal()->connect(boost::bind(&handleRepartition, _2)); + gSavedSettings.getControl("OctreeMaxNodeCapacity")->getSignal()->connect(boost::bind(&handleRepartition, _2)); + gSavedSettings.getControl("OctreeAlphaDistanceFactor")->getSignal()->connect(boost::bind(&handleRepartition, _2)); + gSavedSettings.getControl("OctreeAttachmentSizeFactor")->getSignal()->connect(boost::bind(&handleRepartition, _2)); + gSavedSettings.getControl("RenderMaxTextureIndex")->getSignal()->connect(boost::bind(&handleResetVertexBuffersChanged, _2)); gSavedSettings.getControl("RenderUseTriStrips")->getSignal()->connect(boost::bind(&handleResetVertexBuffersChanged, _2)); gSavedSettings.getControl("RenderAnimateTrees")->getSignal()->connect(boost::bind(&handleResetVertexBuffersChanged, _2)); gSavedSettings.getControl("RenderAvatarVP")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _2)); @@ -568,7 +600,7 @@ void settings_setup_listeners() gSavedSettings.getControl("RenderSpecularResX")->getSignal()->connect(boost::bind(&handleReleaseGLBufferChanged, _2)); gSavedSettings.getControl("RenderSpecularResY")->getSignal()->connect(boost::bind(&handleReleaseGLBufferChanged, _2)); gSavedSettings.getControl("RenderSpecularExponent")->getSignal()->connect(boost::bind(&handleReleaseGLBufferChanged, _2)); - gSavedSettings.getControl("RenderFSAASamples")->getSignal()->connect(boost::bind(&handleReleaseGLBufferChanged, _2)); + gSavedSettings.getControl("RenderFSAASamples")->getSignal()->connect(boost::bind(&handleFSAASamplesChanged, _2)); gSavedSettings.getControl("RenderAnisotropic")->getSignal()->connect(boost::bind(&handleAnisotropicChanged, _2)); gSavedSettings.getControl("RenderShadowResolutionScale")->getSignal()->connect(boost::bind(&handleReleaseGLBufferChanged, _2)); gSavedSettings.getControl("RenderGlow")->getSignal()->connect(boost::bind(&handleReleaseGLBufferChanged, _2)); diff --git a/indra/newview/llviewerdisplay.cpp b/indra/newview/llviewerdisplay.cpp index e41773d27365d3d986fcd7bdb7d805b6adc90d37..f725f0fe86d4e45c19172775b909c186eb474ec2 100644 --- a/indra/newview/llviewerdisplay.cpp +++ b/indra/newview/llviewerdisplay.cpp @@ -582,6 +582,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot) LLMemType mt_ug(LLMemType::MTYPE_DISPLAY_UPDATE_GEOM); const F32 max_geom_update_time = 0.005f*10.f*gFrameIntervalSeconds; // 50 ms/second update time gPipeline.createObjects(max_geom_update_time); + gPipeline.processPartitionQ(); gPipeline.updateGeom(max_geom_update_time); stop_glerror(); } @@ -836,7 +837,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot) if (LLPipeline::sRenderDeferred && !LLPipeline::sUnderWaterRender) { gPipeline.mDeferredScreen.bindTarget(); - glClearColor(0,0,0,0); + glClearColor(1,0,1,1); gPipeline.mDeferredScreen.clear(); } else @@ -995,8 +996,7 @@ void render_hud_attachments() S32 use_occlusion = LLPipeline::sUseOcclusion; LLPipeline::sUseOcclusion = 0; - LLPipeline::sDisableShaders = TRUE; - + //cull, sort, and render hud objects static LLCullResult result; LLSpatialGroup::sNoDelete = TRUE; @@ -1036,7 +1036,6 @@ void render_hud_attachments() gPipeline.toggleRenderDebugFeature((void*) LLPipeline::RENDER_DEBUG_FEATURE_UI); } LLPipeline::sUseOcclusion = use_occlusion; - LLPipeline::sDisableShaders = FALSE; } glMatrixMode(GL_PROJECTION); glPopMatrix(); diff --git a/indra/newview/llviewermenufile.cpp b/indra/newview/llviewermenufile.cpp index 37640ad0d45ea7cd4a62de1b5ecd2b29e3e394e4..b9293b3b3105f8c9a1ebaef7e2752b97df21728a 100644 --- a/indra/newview/llviewermenufile.cpp +++ b/indra/newview/llviewermenufile.cpp @@ -107,9 +107,7 @@ class LLMeshUploadVisible : public view_listener_t { bool handleEvent(const LLSD& userdata) { - return gSavedSettings.getBOOL("MeshEnabled") && - LLViewerParcelMgr::getInstance()->allowAgentBuild() && - !gAgent.getRegion()->getCapability("ObjectAdd").empty(); + return gMeshRepo.meshUploadEnabled(); } }; @@ -1203,78 +1201,6 @@ void upload_new_resource( } } -BOOL upload_new_variable_price_resource( - const LLTransactionID &tid, - LLAssetType::EType asset_type, - std::string name, - std::string desc, - LLFolderType::EType destination_folder_type, - LLInventoryType::EType inv_type, - U32 next_owner_perms, - U32 group_perms, - U32 everyone_perms, - const std::string& display_name, - const LLSD& asset_resources) -{ - LLAssetID uuid = - upload_new_resource_prep( - tid, - asset_type, - inv_type, - name, - display_name, - desc); - - llinfos << "*** Uploading: " << llendl; - llinfos << "Type: " << LLAssetType::lookup(asset_type) << llendl; - llinfos << "UUID: " << uuid << llendl; - llinfos << "Name: " << name << llendl; - llinfos << "Desc: " << desc << llendl; - lldebugs << "Folder: " - << gInventory.findCategoryUUIDForType((destination_folder_type == LLFolderType::FT_NONE) ? (LLFolderType::EType)asset_type : destination_folder_type) << llendl; - lldebugs << "Asset Type: " << LLAssetType::lookup(asset_type) << llendl; - - std::string url = gAgent.getRegion()->getCapability( - "NewFileAgentInventoryVariablePrice"); - - if ( !url.empty() ) - { - lldebugs - << "New Agent Inventory variable price upload" << llendl; - - // Each of the two capabilities has similar data, so - // let's reuse that code - - LLSD body; - - body = generate_new_resource_upload_capability_body( - asset_type, - name, - desc, - destination_folder_type, - inv_type, - next_owner_perms, - group_perms, - everyone_perms); - - body["asset_resources"] = asset_resources; - - LLHTTPClient::post( - url, - body, - new LLNewAgentInventoryVariablePriceResponder( - uuid, - asset_type, - body)); - - return TRUE; - } - else - { - return FALSE; - } -} - LLAssetID generate_asset_id_for_new_upload(const LLTransactionID& tid) { if ( gDisconnected ) diff --git a/indra/newview/llviewermenufile.h b/indra/newview/llviewermenufile.h index 1597821504269e9d752e5621bed2765f2cbf0ab3..3136358b83653e8c1d4d3b6d36482895f73f2729 100644 --- a/indra/newview/llviewermenufile.h +++ b/indra/newview/llviewermenufile.h @@ -68,23 +68,6 @@ void upload_new_resource( S32 expected_upload_cost, void *userdata); -// TODO* : Move all uploads to use this new function -// since at some point, that upload path will be deprecated and no longer -// used - -// We make a new function here to ensure that previous code is not broken -BOOL upload_new_variable_price_resource( - const LLTransactionID& tid, - LLAssetType::EType type, - std::string name, - std::string desc, - LLFolderType::EType destination_folder_type, - LLInventoryType::EType inv_type, - U32 next_owner_perms, - U32 group_perms, - U32 everyone_perms, - const std::string& display_name, - const LLSD& asset_resources); LLAssetID generate_asset_id_for_new_upload(const LLTransactionID& tid); void increase_new_upload_stats(LLAssetType::EType asset_type); diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index 3832be727fcc331af2371065562ceedee33ca792..fc0e6da7a07a679a2a5518d8acbb478f9fb06875 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -96,7 +96,6 @@ #include "llviewerwindow.h" #include "llvlmanager.h" #include "llvoavatarself.h" -#include "llvotextbubble.h" #include "llworld.h" #include "pipeline.h" #include "llfloaterworldmap.h" @@ -1502,7 +1501,7 @@ bool LLOfferInfo::inventory_offer_callback(const LLSD& notification, const LLSD& log_message = chatHistory_string + " " + LLTrans::getString("InvOfferGaveYou") + " " + mDesc + LLTrans::getString("."); LLSD args; args["MESSAGE"] = log_message; - LLNotificationsUtil::add("SystemMessage", args); + LLNotificationsUtil::add("SystemMessageTip", args); } break; @@ -1676,7 +1675,7 @@ bool LLOfferInfo::inventory_task_offer_callback(const LLSD& notification, const log_message = chatHistory_string + " " + LLTrans::getString("InvOfferGaveYou") + " " + mDesc + LLTrans::getString("."); LLSD args; args["MESSAGE"] = log_message; - LLNotificationsUtil::add("SystemMessage", args); + LLNotificationsUtil::add("SystemMessageTip", args); } // we will want to open this item when it comes back. @@ -1727,7 +1726,7 @@ bool LLOfferInfo::inventory_task_offer_callback(const LLSD& notification, const LLSD args; args["MESSAGE"] = log_message; - LLNotificationsUtil::add("SystemMessage", args); + LLNotificationsUtil::add("SystemMessageTip", args); } if (busy && (!mFromGroup && !mFromObject)) @@ -4228,15 +4227,8 @@ void process_kill_object(LLMessageSystem *mesgsys, void **user_data) // Display green bubble on kill if ( gShowObjectUpdates ) { - LLViewerObject* newobject; - newobject = gObjectList.createObjectViewer(LL_PCODE_LEGACY_TEXT_BUBBLE, objectp->getRegion()); - - LLVOTextBubble* bubble = (LLVOTextBubble*) newobject; - - bubble->mColor.setVec(0.f, 1.f, 0.f, 1.f); - bubble->setScale( 2.0f * bubble->getScale() ); - bubble->setPositionGlobal(objectp->getPositionGlobal()); - gPipeline.addObject(bubble); + LLColor4 color(0.f,1.f,0.f,1.f); + gPipeline.addDebugBlip(objectp->getPositionAgent(), color); } // Do the kill @@ -4332,6 +4324,9 @@ void process_sound_trigger(LLMessageSystem *msg, void **) { return; } + + // Don't play sounds from gestures if they are not enabled. + if (!gSavedSettings.getBOOL("EnableGestureSounds")) return; gAudiop->triggerSound(sound_id, owner_id, gain, LLAudioEngine::AUDIO_TYPE_SFX, pos_global); } @@ -6266,6 +6261,18 @@ void send_group_notice(const LLUUID& group_id, bool handle_lure_callback(const LLSD& notification, const LLSD& response) { + static const unsigned OFFER_RECIPIENT_LIMIT = 250; + if(notification["payload"]["ids"].size() > OFFER_RECIPIENT_LIMIT) + { + // More than OFFER_RECIPIENT_LIMIT targets will overload the message + // producing an llerror. + LLSD args; + args["OFFERS"] = notification["payload"]["ids"].size(); + args["LIMIT"] = static_cast<int>(OFFER_RECIPIENT_LIMIT); + LLNotificationsUtil::add("TooManyTeleportOffers", args); + return false; + } + std::string text = response["message"].asString(); LLSLURL slurl; LLAgentUI::buildSLURL(slurl); @@ -6483,10 +6490,14 @@ void process_script_dialog(LLMessageSystem* msg, void**) LLSD payload; LLUUID object_id; - LLUUID owner_id; - msg->getUUID("Data", "ObjectID", object_id); - msg->getUUID("OwnerData", "OwnerID", owner_id); + +// For compability with OS grids first check for presence of extended packet before fetching data. + LLUUID owner_id; + if (gMessageSystem->getNumberOfBlocks("OwnerData") > 0) + { + msg->getUUID("OwnerData", "OwnerID", owner_id); + } if (LLMuteList::getInstance()->isMuted(object_id) || LLMuteList::getInstance()->isMuted(owner_id)) { diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp index e7878d8adfd785dda95ba01d3c8c1be4b5ecc9b3..be9ff872c06d0456f37aa5a6bc42d45bb41c8de2 100644 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp @@ -89,7 +89,6 @@ #include "llvopartgroup.h" #include "llvosky.h" #include "llvosurfacepatch.h" -#include "llvotextbubble.h" #include "llvotree.h" #include "llvovolume.h" #include "llvowater.h" @@ -168,8 +167,6 @@ LLViewerObject *LLViewerObject::createObject(const LLUUID &id, const LLPCode pco // llwarns << "Creating new tree!" << llendl; // res = new LLVOTree(id, pcode, regionp); break; res = NULL; break; - case LL_PCODE_LEGACY_TEXT_BUBBLE: - res = new LLVOTextBubble(id, pcode, regionp); break; case LL_VO_CLOUDS: res = new LLVOClouds(id, pcode, regionp); break; case LL_VO_SURFACE_PATCH: @@ -1894,7 +1891,7 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys, // // - // WTF? If we're going to skip this message, why are we + // If we're going to skip this message, why are we // doing all the parenting, etc above? U32 packet_id = mesgsys->getCurrentRecvPacketID(); if (packet_id < mLatestRecvPacketID && @@ -1973,23 +1970,16 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys, if ( gShowObjectUpdates ) { - if (!((mPrimitiveCode == LL_PCODE_LEGACY_AVATAR) && (((LLVOAvatar *) this)->isSelf())) - && mRegionp) + LLColor4 color; + if (update_type == OUT_TERSE_IMPROVED) { - LLViewerObject* object = gObjectList.createObjectViewer(LL_PCODE_LEGACY_TEXT_BUBBLE, mRegionp); - LLVOTextBubble* bubble = (LLVOTextBubble*) object; - - if (update_type == OUT_TERSE_IMPROVED) - { - bubble->mColor.setVec(0.f, 0.f, 1.f, 1.f); - } - else - { - bubble->mColor.setVec(1.f, 0.f, 0.f, 1.f); - } - object->setPositionGlobal(getPositionGlobal()); - gPipeline.addObject(object); + color.setVec(0.f, 0.f, 1.f, 1.f); + } + else + { + color.setVec(1.f, 0.f, 0.f, 1.f); } + gPipeline.addDebugBlip(getPositionAgent(), color); } if ((0.0f == vel_mag_sq) && diff --git a/indra/newview/llviewerobjectlist.cpp b/indra/newview/llviewerobjectlist.cpp index 007b3416f17a28b04fa67f34e36d8c025b74a0e9..45c6777ae87eaafa6be96cb27d09108d8f0561d7 100644 --- a/indra/newview/llviewerobjectlist.cpp +++ b/indra/newview/llviewerobjectlist.cpp @@ -1418,12 +1418,12 @@ void LLViewerObjectList::onObjectCostFetchFailure(const LLUUID& object_id) mPendingObjectCost.erase(object_id); } -void LLViewerObjectList::updateQuotaCost( const LLUUID& objectId, const SelectionQuota& quota ) +void LLViewerObjectList::updateQuota( const LLUUID& objectId, const SelectionQuota& quota ) { LLViewerObject* pVO = findObject( objectId ); if ( pVO ) { - //pVO->updateQuota( quota ); + pVO->updateQuota( quota ); } } @@ -1497,6 +1497,24 @@ void LLViewerObjectList::shiftObjects(const LLVector3 &offset) LLWorld::getInstance()->shiftRegions(offset); } +void LLViewerObjectList::repartitionObjects() +{ + for (vobj_list_t::iterator iter = mObjects.begin(); iter != mObjects.end(); ++iter) + { + LLViewerObject* objectp = *iter; + if (!objectp->isDead()) + { + LLDrawable* drawable = objectp->mDrawable; + if (drawable && !drawable->isDead()) + { + drawable->updateBinRadius(); + drawable->updateSpatialExtents(); + drawable->movePartition(); + } + } + } +} + //debug code bool LLViewerObjectList::hasMapObjectInRegion(LLViewerRegion* regionp) { diff --git a/indra/newview/llviewerobjectlist.h b/indra/newview/llviewerobjectlist.h index 8e211eaf7380cbab38ccd48f60319a91f4a71dce..9d1b5cb56ff76e13d110e7fb34cf5994c6723fe1 100644 --- a/indra/newview/llviewerobjectlist.h +++ b/indra/newview/llviewerobjectlist.h @@ -102,9 +102,10 @@ class LLViewerObjectList F32 restitution, F32 gravity_multiplier); - void updateQuotaCost( const LLUUID& objectId, const SelectionQuota& costs ); + void updateQuota( const LLUUID& objectId, const SelectionQuota& costs ); void shiftObjects(const LLVector3 &offset); + void repartitionObjects(); bool hasMapObjectInRegion(LLViewerRegion* regionp) ; void clearAllMapObjectsInRegion(LLViewerRegion* regionp) ; diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp index 590c82856dcbc647da26dafeabb23fcde520a2fc..002e0567e4ec7b391e72f91307dc56530953b93c 100644 --- a/indra/newview/llviewerregion.cpp +++ b/indra/newview/llviewerregion.cpp @@ -69,6 +69,7 @@ #include "llspatialpartition.h" #include "stringize.h" #include "llviewercontrol.h" +#include "llsdserialize.h" #ifdef LL_WINDOWS #pragma warning(disable:4355) @@ -1140,6 +1141,20 @@ void LLViewerRegion::getInfo(LLSD& info) info["Region"]["Handle"]["y"] = (LLSD::Integer)y; } +void LLViewerRegion::getSimulatorFeatures(LLSD& sim_features) +{ + sim_features = mSimulatorFeatures; +} + +void LLViewerRegion::setSimulatorFeatures(const LLSD& sim_features) +{ + std::stringstream str; + + LLSDSerialize::toPrettyXML(sim_features, str); + llinfos << str.str() << llendl; + mSimulatorFeatures = sim_features; +} + LLViewerRegion::eCacheUpdateResult LLViewerRegion::cacheFullUpdate(LLViewerObject* objectp, LLDataPackerBinaryBuffer &dp) { U32 local_id = objectp->getLocalID(); @@ -1480,6 +1495,8 @@ void LLViewerRegion::setSeedCapability(const std::string& url) LLSD capabilityNames = LLSD::emptyArray(); + capabilityNames.append("AccountingParcel"); + capabilityNames.append("AccountingSelection"); capabilityNames.append("AttachmentResources"); capabilityNames.append("AvatarPickerSearch"); capabilityNames.append("ChatSessionRequest"); @@ -1509,8 +1526,6 @@ void LLViewerRegion::setSeedCapability(const std::string& url) capabilityNames.append("MapLayer"); capabilityNames.append("MapLayerGod"); capabilityNames.append("NewFileAgentInventory"); - capabilityNames.append("NewFileAgentInventoryVariablePrice"); - capabilityNames.append("ObjectAdd"); capabilityNames.append("ParcelPropertiesUpdate"); capabilityNames.append("ParcelMediaURLFilterList"); capabilityNames.append("ParcelNavigateMedia"); @@ -1541,7 +1556,6 @@ void LLViewerRegion::setSeedCapability(const std::string& url) capabilityNames.append("UpdateNotecardTaskInventory"); capabilityNames.append("UpdateScriptTask"); capabilityNames.append("UploadBakedTexture"); - capabilityNames.append("UploadObjectAsset"); capabilityNames.append("ViewerMetrics"); capabilityNames.append("ViewerStartAuction"); capabilityNames.append("ViewerStats"); @@ -1559,6 +1573,42 @@ void LLViewerRegion::setSeedCapability(const std::string& url) LLHTTPClient::post(url, capabilityNames, mImpl->mHttpResponderPtr); } +class SimulatorFeaturesReceived : public LLHTTPClient::Responder +{ + LOG_CLASS(SimulatorFeaturesReceived); +public: + SimulatorFeaturesReceived(LLViewerRegion* region) + : mRegion(region) + { } + + + void error(U32 statusNum, const std::string& reason) + { + LL_WARNS2("AppInit", "SimulatorFeatures") << statusNum << ": " << reason << LL_ENDL; + } + + void result(const LLSD& content) + { + if(!mRegion) //region is removed or responder is not created. + { + return ; + } + + mRegion->setSimulatorFeatures(content); + } + + static boost::intrusive_ptr<SimulatorFeaturesReceived> build( + LLViewerRegion* region) + { + return boost::intrusive_ptr<SimulatorFeaturesReceived>( + new SimulatorFeaturesReceived(region)); + } + +private: + LLViewerRegion* mRegion; +}; + + void LLViewerRegion::setCapability(const std::string& name, const std::string& url) { if(name == "EventQueueGet") @@ -1571,6 +1621,11 @@ void LLViewerRegion::setCapability(const std::string& name, const std::string& u { LLHTTPSender::setSender(mImpl->mHost, new LLCapHTTPSender(url)); } + else if (name == "SimulatorFeatures") + { + // kick off a request for simulator features + LLHTTPClient::get(url, new SimulatorFeaturesReceived(this)); + } else { mImpl->mCapabilities[name] = url; @@ -1664,3 +1719,16 @@ std::string LLViewerRegion::getDescription() const return stringize(*this); } +bool LLViewerRegion::meshUploadEnabled() const +{ + return (mSimulatorFeatures.has("MeshUploadEnabled") && + mSimulatorFeatures["MeshUploadEnabled"].asBoolean()); +} + +bool LLViewerRegion::meshRezEnabled() const +{ + return (mSimulatorFeatures.has("MeshRezEnabled") && + mSimulatorFeatures["MeshRezEnabled"].asBoolean()); +} + + diff --git a/indra/newview/llviewerregion.h b/indra/newview/llviewerregion.h index a6e5c47b866af8ba36e67eea701e3cd30e3813d1..3811b989e7c88cbdc98bc9ee1a0bce0c6de34713 100644 --- a/indra/newview/llviewerregion.h +++ b/indra/newview/llviewerregion.h @@ -276,6 +276,11 @@ class LLViewerRegion: public LLCapabilityProvider // implements this interface void getInfo(LLSD& info); + bool meshRezEnabled() const; + bool meshUploadEnabled() const; + + void getSimulatorFeatures(LLSD& info); + void setSimulatorFeatures(const LLSD& info); typedef enum { @@ -401,6 +406,8 @@ class LLViewerRegion: public LLCapabilityProvider // implements this interface bool mCapabilitiesReceived; BOOL mReleaseNotesRequested; + + LLSD mSimulatorFeatures; }; inline BOOL LLViewerRegion::getAllowDamage() const diff --git a/indra/newview/llviewershadermgr.cpp b/indra/newview/llviewershadermgr.cpp index 3e85802ba6c630780e6e4cab4676e482e9caa27d..da4d0548d02811699e19ca28df1d2457167253ab 100644 --- a/indra/newview/llviewershadermgr.cpp +++ b/indra/newview/llviewershadermgr.cpp @@ -66,12 +66,20 @@ LLGLSLShader gObjectSimpleProgram; LLGLSLShader gObjectSimpleWaterProgram; LLGLSLShader gObjectFullbrightProgram; LLGLSLShader gObjectFullbrightWaterProgram; - LLGLSLShader gObjectFullbrightShinyProgram; LLGLSLShader gObjectFullbrightShinyWaterProgram; LLGLSLShader gObjectShinyProgram; LLGLSLShader gObjectShinyWaterProgram; +LLGLSLShader gObjectSimpleNonIndexedProgram; +LLGLSLShader gObjectSimpleNonIndexedWaterProgram; +LLGLSLShader gObjectFullbrightNonIndexedProgram; +LLGLSLShader gObjectFullbrightNonIndexedWaterProgram; +LLGLSLShader gObjectFullbrightShinyNonIndexedProgram; +LLGLSLShader gObjectFullbrightShinyNonIndexedWaterProgram; +LLGLSLShader gObjectShinyNonIndexedProgram; +LLGLSLShader gObjectShinyNonIndexedWaterProgram; + //object hardware skinning shaders LLGLSLShader gSkinnedObjectSimpleProgram; LLGLSLShader gSkinnedObjectFullbrightProgram; @@ -113,6 +121,7 @@ LLGLSLShader gDeferredImpostorProgram; LLGLSLShader gDeferredEdgeProgram; LLGLSLShader gDeferredWaterProgram; LLGLSLShader gDeferredDiffuseProgram; +LLGLSLShader gDeferredNonIndexedDiffuseProgram; LLGLSLShader gDeferredSkinnedDiffuseProgram; LLGLSLShader gDeferredSkinnedBumpProgram; LLGLSLShader gDeferredSkinnedAlphaProgram; @@ -132,13 +141,16 @@ LLGLSLShader gDeferredShadowProgram; LLGLSLShader gDeferredAvatarShadowProgram; LLGLSLShader gDeferredAttachmentShadowProgram; LLGLSLShader gDeferredAlphaProgram; +LLGLSLShader gDeferredAvatarEyesProgram; LLGLSLShader gDeferredFullbrightProgram; LLGLSLShader gDeferredGIProgram; LLGLSLShader gDeferredGIFinalProgram; LLGLSLShader gDeferredPostGIProgram; LLGLSLShader gDeferredPostProgram; LLGLSLShader gDeferredPostNoDoFProgram; - +LLGLSLShader gDeferredWLSkyProgram; +LLGLSLShader gDeferredWLCloudProgram; +LLGLSLShader gDeferredStarProgram; LLGLSLShader gLuminanceGatherProgram; @@ -160,6 +172,10 @@ LLViewerShaderMgr::LLViewerShaderMgr() : mShaderList.push_back(&gObjectFullbrightProgram); mShaderList.push_back(&gObjectFullbrightShinyProgram); mShaderList.push_back(&gObjectFullbrightShinyWaterProgram); + mShaderList.push_back(&gObjectSimpleNonIndexedProgram); + mShaderList.push_back(&gObjectFullbrightNonIndexedProgram); + mShaderList.push_back(&gObjectFullbrightShinyNonIndexedProgram); + mShaderList.push_back(&gObjectFullbrightShinyNonIndexedWaterProgram); mShaderList.push_back(&gSkinnedObjectSimpleProgram); mShaderList.push_back(&gSkinnedObjectFullbrightProgram); mShaderList.push_back(&gSkinnedObjectFullbrightShinyProgram); @@ -183,6 +199,7 @@ LLViewerShaderMgr::LLViewerShaderMgr() : mShaderList.push_back(&gDeferredAlphaProgram); mShaderList.push_back(&gDeferredSkinnedAlphaProgram); mShaderList.push_back(&gDeferredFullbrightProgram); + mShaderList.push_back(&gDeferredAvatarEyesProgram); mShaderList.push_back(&gDeferredPostGIProgram); mShaderList.push_back(&gDeferredEdgeProgram); mShaderList.push_back(&gDeferredPostProgram); @@ -190,6 +207,9 @@ LLViewerShaderMgr::LLViewerShaderMgr() : mShaderList.push_back(&gDeferredGIFinalProgram); mShaderList.push_back(&gDeferredWaterProgram); mShaderList.push_back(&gDeferredAvatarAlphaProgram); + mShaderList.push_back(&gDeferredWLSkyProgram); + mShaderList.push_back(&gDeferredWLCloudProgram); + mShaderList.push_back(&gDeferredStarProgram); } LLViewerShaderMgr::~LLViewerShaderMgr() @@ -347,6 +367,10 @@ void LLViewerShaderMgr::setShaders() return; } + //setup preprocessor definitions + LLShaderMgr::instance()->mDefinitions["samples"] = llformat("%d", gGLManager.getNumFBOFSAASamples(gSavedSettings.getU32("RenderFSAASamples"))); + LLShaderMgr::instance()->mDefinitions["NUM_TEX_UNITS"] = llformat("%d", gGLManager.mNumTextureImageUnits); + reentrance = true; // Make sure the compiled shader map is cleared before we recompile shaders. @@ -577,6 +601,16 @@ void LLViewerShaderMgr::unloadShaders() gObjectFullbrightShinyWaterProgram.unload(); gObjectShinyWaterProgram.unload(); + gObjectSimpleNonIndexedProgram.unload(); + gObjectSimpleNonIndexedWaterProgram.unload(); + gObjectFullbrightNonIndexedProgram.unload(); + gObjectFullbrightNonIndexedWaterProgram.unload(); + + gObjectShinyNonIndexedProgram.unload(); + gObjectFullbrightShinyNonIndexedProgram.unload(); + gObjectFullbrightShinyNonIndexedWaterProgram.unload(); + gObjectShinyNonIndexedWaterProgram.unload(); + gSkinnedObjectSimpleProgram.unload(); gSkinnedObjectFullbrightProgram.unload(); gSkinnedObjectFullbrightShinyProgram.unload(); @@ -607,6 +641,7 @@ void LLViewerShaderMgr::unloadShaders() gPostNightVisionProgram.unload(); gDeferredDiffuseProgram.unload(); + gDeferredNonIndexedDiffuseProgram.unload(); gDeferredSkinnedDiffuseProgram.unload(); gDeferredSkinnedBumpProgram.unload(); gDeferredSkinnedAlphaProgram.unload(); @@ -685,24 +720,35 @@ BOOL LLViewerShaderMgr::loadBasicShaders() shaders.clear(); shaders.reserve(13); - shaders.push_back( make_pair( "windlight/atmosphericsVarsF.glsl", mVertexShaderLevel[SHADER_WINDLIGHT] ) ); - shaders.push_back( make_pair( "windlight/gammaF.glsl", mVertexShaderLevel[SHADER_WINDLIGHT]) ); - shaders.push_back( make_pair( "windlight/atmosphericsF.glsl", mVertexShaderLevel[SHADER_WINDLIGHT] ) ); - shaders.push_back( make_pair( "windlight/transportF.glsl", mVertexShaderLevel[SHADER_WINDLIGHT] ) ); - shaders.push_back( make_pair( "environment/waterFogF.glsl", mVertexShaderLevel[SHADER_WATER] ) ); - shaders.push_back( make_pair( "lighting/lightF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) ); - shaders.push_back( make_pair( "lighting/lightFullbrightF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) ); - shaders.push_back( make_pair( "lighting/lightWaterF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) ); - shaders.push_back( make_pair( "lighting/lightFullbrightWaterF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) ); - shaders.push_back( make_pair( "lighting/lightShinyF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) ); - shaders.push_back( make_pair( "lighting/lightFullbrightShinyF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) ); - shaders.push_back( make_pair( "lighting/lightShinyWaterF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) ); - shaders.push_back( make_pair( "lighting/lightFullbrightShinyWaterF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) ); + S32 ch = gGLManager.mNumTextureImageUnits-1; + + std::vector<S32> index_channels; + index_channels.push_back(-1); shaders.push_back( make_pair( "windlight/atmosphericsVarsF.glsl", mVertexShaderLevel[SHADER_WINDLIGHT] ) ); + index_channels.push_back(-1); shaders.push_back( make_pair( "windlight/gammaF.glsl", mVertexShaderLevel[SHADER_WINDLIGHT]) ); + index_channels.push_back(-1); shaders.push_back( make_pair( "windlight/atmosphericsF.glsl", mVertexShaderLevel[SHADER_WINDLIGHT] ) ); + index_channels.push_back(-1); shaders.push_back( make_pair( "windlight/transportF.glsl", mVertexShaderLevel[SHADER_WINDLIGHT] ) ); + index_channels.push_back(-1); shaders.push_back( make_pair( "environment/waterFogF.glsl", mVertexShaderLevel[SHADER_WATER] ) ); + index_channels.push_back(-1); shaders.push_back( make_pair( "lighting/lightNonIndexedF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) ); + index_channels.push_back(-1); shaders.push_back( make_pair( "lighting/lightFullbrightNonIndexedF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) ); + index_channels.push_back(-1); shaders.push_back( make_pair( "lighting/lightWaterNonIndexedF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) ); + index_channels.push_back(-1); shaders.push_back( make_pair( "lighting/lightFullbrightWaterNonIndexedF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) ); + index_channels.push_back(-1); shaders.push_back( make_pair( "lighting/lightShinyNonIndexedF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) ); + index_channels.push_back(-1); shaders.push_back( make_pair( "lighting/lightFullbrightShinyNonIndexedF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) ); + index_channels.push_back(-1); shaders.push_back( make_pair( "lighting/lightShinyWaterNonIndexedF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) ); + index_channels.push_back(-1); shaders.push_back( make_pair( "lighting/lightFullbrightShinyWaterNonIndexedF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) ); + index_channels.push_back(ch); shaders.push_back( make_pair( "lighting/lightF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) ); + index_channels.push_back(ch); shaders.push_back( make_pair( "lighting/lightFullbrightF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) ); + index_channels.push_back(ch); shaders.push_back( make_pair( "lighting/lightWaterF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) ); + index_channels.push_back(ch); shaders.push_back( make_pair( "lighting/lightFullbrightWaterF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) ); + index_channels.push_back(ch); shaders.push_back( make_pair( "lighting/lightShinyF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) ); + index_channels.push_back(ch); shaders.push_back( make_pair( "lighting/lightFullbrightShinyF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) ); + index_channels.push_back(ch); shaders.push_back( make_pair( "lighting/lightShinyWaterF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) ); + index_channels.push_back(ch); shaders.push_back( make_pair( "lighting/lightFullbrightShinyWaterF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) ); for (U32 i = 0; i < shaders.size(); i++) { // Note usage of GL_FRAGMENT_SHADER_ARB - if (loadShaderFile(shaders[i].first, shaders[i].second, GL_FRAGMENT_SHADER_ARB) == 0) + if (loadShaderFile(shaders[i].first, shaders[i].second, GL_FRAGMENT_SHADER_ARB, index_channels[i]) == 0) { return FALSE; } @@ -833,6 +879,9 @@ BOOL LLViewerShaderMgr::loadShadersEffects() { BOOL success = TRUE; + U32 samples = gGLManager.getNumFBOFSAASamples(gSavedSettings.getU32("RenderFSAASamples")); + bool multisample = samples > 1 && LLPipeline::sRenderDeferred && gGLManager.mHasTextureMultisample; + if (mVertexShaderLevel[SHADER_EFFECT] == 0) { gGlowProgram.unload(); @@ -858,10 +907,21 @@ BOOL LLViewerShaderMgr::loadShadersEffects() if (success) { + std::string fragment; + + if (multisample) + { + fragment = "effects/glowExtractMSF.glsl"; + } + else + { + fragment = "effects/glowExtractF.glsl"; + } + gGlowExtractProgram.mName = "Glow Extract Shader (Post)"; gGlowExtractProgram.mShaderFiles.clear(); gGlowExtractProgram.mShaderFiles.push_back(make_pair("effects/glowExtractV.glsl", GL_VERTEX_SHADER_ARB)); - gGlowExtractProgram.mShaderFiles.push_back(make_pair("effects/glowExtractF.glsl", GL_FRAGMENT_SHADER_ARB)); + gGlowExtractProgram.mShaderFiles.push_back(make_pair(fragment, GL_FRAGMENT_SHADER_ARB)); gGlowExtractProgram.mShaderLevel = mVertexShaderLevel[SHADER_EFFECT]; success = gGlowExtractProgram.createShader(NULL, &mGlowExtractUniforms); if (!success) @@ -925,6 +985,7 @@ BOOL LLViewerShaderMgr::loadShadersDeferred() { gDeferredTreeProgram.unload(); gDeferredDiffuseProgram.unload(); + gDeferredNonIndexedDiffuseProgram.unload(); gDeferredSkinnedDiffuseProgram.unload(); gDeferredSkinnedBumpProgram.unload(); gDeferredSkinnedAlphaProgram.unload(); @@ -945,6 +1006,7 @@ BOOL LLViewerShaderMgr::loadShadersDeferred() gDeferredAvatarAlphaProgram.unload(); gDeferredAlphaProgram.unload(); gDeferredFullbrightProgram.unload(); + gDeferredAvatarEyesProgram.unload(); gDeferredPostGIProgram.unload(); gDeferredEdgeProgram.unload(); gDeferredPostProgram.unload(); @@ -952,6 +1014,9 @@ BOOL LLViewerShaderMgr::loadShadersDeferred() gDeferredGIProgram.unload(); gDeferredGIFinalProgram.unload(); gDeferredWaterProgram.unload(); + gDeferredWLSkyProgram.unload(); + gDeferredWLCloudProgram.unload(); + gDeferredStarProgram.unload(); return TRUE; } @@ -959,16 +1024,31 @@ BOOL LLViewerShaderMgr::loadShadersDeferred() BOOL success = TRUE; + U32 samples = gGLManager.getNumFBOFSAASamples(gSavedSettings.getU32("RenderFSAASamples")); + bool multisample = samples > 1 && gGLManager.mHasTextureMultisample; + if (success) { gDeferredDiffuseProgram.mName = "Deferred Diffuse Shader"; gDeferredDiffuseProgram.mShaderFiles.clear(); gDeferredDiffuseProgram.mShaderFiles.push_back(make_pair("deferred/diffuseV.glsl", GL_VERTEX_SHADER_ARB)); - gDeferredDiffuseProgram.mShaderFiles.push_back(make_pair("deferred/diffuseF.glsl", GL_FRAGMENT_SHADER_ARB)); + gDeferredDiffuseProgram.mShaderFiles.push_back(make_pair("deferred/diffuseIndexedF.glsl", GL_FRAGMENT_SHADER_ARB)); + gDeferredDiffuseProgram.mFeatures.mIndexedTextureChannels = gGLManager.mNumTextureImageUnits; gDeferredDiffuseProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED]; success = gDeferredDiffuseProgram.createShader(NULL, NULL); } + if (success) + { + gDeferredNonIndexedDiffuseProgram.mName = "Non Indexed Deferred Diffuse Shader"; + gDeferredNonIndexedDiffuseProgram.mShaderFiles.clear(); + gDeferredNonIndexedDiffuseProgram.mShaderFiles.push_back(make_pair("deferred/diffuseV.glsl", GL_VERTEX_SHADER_ARB)); + gDeferredNonIndexedDiffuseProgram.mShaderFiles.push_back(make_pair("deferred/diffuseF.glsl", GL_FRAGMENT_SHADER_ARB)); + gDeferredNonIndexedDiffuseProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED]; + success = gDeferredNonIndexedDiffuseProgram.createShader(NULL, NULL); + } + + if (success) { gDeferredSkinnedDiffuseProgram.mName = "Deferred Skinned Diffuse Shader"; @@ -1000,9 +1080,10 @@ BOOL LLViewerShaderMgr::loadShadersDeferred() gDeferredSkinnedAlphaProgram.mFeatures.hasGamma = true; gDeferredSkinnedAlphaProgram.mFeatures.hasAtmospherics = true; gDeferredSkinnedAlphaProgram.mFeatures.hasLighting = true; + gDeferredSkinnedAlphaProgram.mFeatures.disableTextureIndex = true; gDeferredSkinnedAlphaProgram.mShaderFiles.clear(); gDeferredSkinnedAlphaProgram.mShaderFiles.push_back(make_pair("deferred/alphaSkinnedV.glsl", GL_VERTEX_SHADER_ARB)); - gDeferredSkinnedAlphaProgram.mShaderFiles.push_back(make_pair("deferred/alphaF.glsl", GL_FRAGMENT_SHADER_ARB)); + gDeferredSkinnedAlphaProgram.mShaderFiles.push_back(make_pair("deferred/alphaNonIndexedF.glsl", GL_FRAGMENT_SHADER_ARB)); gDeferredSkinnedAlphaProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED]; success = gDeferredSkinnedAlphaProgram.createShader(NULL, NULL); } @@ -1039,40 +1120,83 @@ BOOL LLViewerShaderMgr::loadShadersDeferred() if (success) { + std::string fragment; + + if (multisample) + { + fragment = "deferred/pointLightMSF.glsl"; + } + else + { + fragment = "deferred/pointLightF.glsl"; + } + gDeferredLightProgram.mName = "Deferred Light Shader"; gDeferredLightProgram.mShaderFiles.clear(); gDeferredLightProgram.mShaderFiles.push_back(make_pair("deferred/pointLightV.glsl", GL_VERTEX_SHADER_ARB)); - gDeferredLightProgram.mShaderFiles.push_back(make_pair("deferred/pointLightF.glsl", GL_FRAGMENT_SHADER_ARB)); + gDeferredLightProgram.mShaderFiles.push_back(make_pair(fragment, GL_FRAGMENT_SHADER_ARB)); gDeferredLightProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED]; success = gDeferredLightProgram.createShader(NULL, NULL); } if (success) { + std::string fragment; + if (multisample) + { + fragment = "deferred/multiPointLightMSF.glsl"; + } + else + { + fragment = "deferred/multiPointLightF.glsl"; + } + gDeferredMultiLightProgram.mName = "Deferred MultiLight Shader"; gDeferredMultiLightProgram.mShaderFiles.clear(); gDeferredMultiLightProgram.mShaderFiles.push_back(make_pair("deferred/multiPointLightV.glsl", GL_VERTEX_SHADER_ARB)); - gDeferredMultiLightProgram.mShaderFiles.push_back(make_pair("deferred/multiPointLightF.glsl", GL_FRAGMENT_SHADER_ARB)); + gDeferredMultiLightProgram.mShaderFiles.push_back(make_pair(fragment, GL_FRAGMENT_SHADER_ARB)); gDeferredMultiLightProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED]; success = gDeferredMultiLightProgram.createShader(NULL, NULL); } if (success) { + std::string fragment; + + if (multisample) + { + fragment = "deferred/spotLightMSF.glsl"; + } + else + { + fragment = "deferred/multiSpotLightF.glsl"; + } + gDeferredSpotLightProgram.mName = "Deferred SpotLight Shader"; gDeferredSpotLightProgram.mShaderFiles.clear(); gDeferredSpotLightProgram.mShaderFiles.push_back(make_pair("deferred/pointLightV.glsl", GL_VERTEX_SHADER_ARB)); - gDeferredSpotLightProgram.mShaderFiles.push_back(make_pair("deferred/multiSpotLightF.glsl", GL_FRAGMENT_SHADER_ARB)); + gDeferredSpotLightProgram.mShaderFiles.push_back(make_pair(fragment, GL_FRAGMENT_SHADER_ARB)); gDeferredSpotLightProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED]; success = gDeferredSpotLightProgram.createShader(NULL, NULL); } if (success) { + std::string fragment; + + if (multisample) + { + fragment = "deferred/multiSpotLightMSF.glsl"; + } + else + { + fragment = "deferred/multiSpotLightF.glsl"; + } + gDeferredMultiSpotLightProgram.mName = "Deferred MultiSpotLight Shader"; gDeferredMultiSpotLightProgram.mShaderFiles.clear(); gDeferredMultiSpotLightProgram.mShaderFiles.push_back(make_pair("deferred/pointLightV.glsl", GL_VERTEX_SHADER_ARB)); - gDeferredMultiSpotLightProgram.mShaderFiles.push_back(make_pair("deferred/multiSpotLightF.glsl", GL_FRAGMENT_SHADER_ARB)); + gDeferredMultiSpotLightProgram.mShaderFiles.push_back(make_pair(fragment, GL_FRAGMENT_SHADER_ARB)); gDeferredMultiSpotLightProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED]; success = gDeferredMultiSpotLightProgram.createShader(NULL, NULL); } @@ -1083,11 +1207,25 @@ BOOL LLViewerShaderMgr::loadShadersDeferred() if (gSavedSettings.getBOOL("RenderDeferredSSAO")) { - fragment = "deferred/sunLightSSAOF.glsl"; + if (multisample) + { + fragment = "deferred/sunlightSSAOMSF.glsl"; + } + else + { + fragment = "deferred/sunLightSSAOF.glsl"; + } } else { - fragment = "deferred/sunLightF.glsl"; + if (multisample) + { + fragment = "deferred/sunlightMSF.glsl"; + } + else + { + fragment = "deferred/sunLightF.glsl"; + } } gDeferredSunProgram.mName = "Deferred Sun Shader"; @@ -1100,10 +1238,21 @@ BOOL LLViewerShaderMgr::loadShadersDeferred() if (success) { + std::string fragment; + + if (multisample) + { + fragment = "deferred/blurLightMSF.glsl"; + } + else + { + fragment = "deferred/blurLightF.glsl"; + } + gDeferredBlurLightProgram.mName = "Deferred Blur Light Shader"; gDeferredBlurLightProgram.mShaderFiles.clear(); gDeferredBlurLightProgram.mShaderFiles.push_back(make_pair("deferred/blurLightV.glsl", GL_VERTEX_SHADER_ARB)); - gDeferredBlurLightProgram.mShaderFiles.push_back(make_pair("deferred/blurLightF.glsl", GL_FRAGMENT_SHADER_ARB)); + gDeferredBlurLightProgram.mShaderFiles.push_back(make_pair(fragment, GL_FRAGMENT_SHADER_ARB)); gDeferredBlurLightProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED]; success = gDeferredBlurLightProgram.createShader(NULL, NULL); } @@ -1116,6 +1265,16 @@ BOOL LLViewerShaderMgr::loadShadersDeferred() gDeferredAlphaProgram.mFeatures.hasGamma = true; gDeferredAlphaProgram.mFeatures.hasAtmospherics = true; gDeferredAlphaProgram.mFeatures.hasLighting = true; + gDeferredAlphaProgram.mFeatures.disableTextureIndex = true; //hack to disable auto-setup of texture channels + if (mVertexShaderLevel[SHADER_DEFERRED] < 1) + { + gDeferredAlphaProgram.mFeatures.mIndexedTextureChannels = gGLManager.mNumTextureImageUnits; + } + else + { //shave off some texture units for shadow maps + gDeferredAlphaProgram.mFeatures.mIndexedTextureChannels = gGLManager.mNumTextureImageUnits - 6; + } + gDeferredAlphaProgram.mShaderFiles.clear(); gDeferredAlphaProgram.mShaderFiles.push_back(make_pair("deferred/alphaV.glsl", GL_VERTEX_SHADER_ARB)); gDeferredAlphaProgram.mShaderFiles.push_back(make_pair("deferred/alphaF.glsl", GL_FRAGMENT_SHADER_ARB)); @@ -1123,13 +1282,27 @@ BOOL LLViewerShaderMgr::loadShadersDeferred() success = gDeferredAlphaProgram.createShader(NULL, NULL); } + if (success) + { + gDeferredAvatarEyesProgram.mName = "Deferred Avatar Eyes Shader"; + gDeferredAvatarEyesProgram.mFeatures.calculatesAtmospherics = true; + gDeferredAvatarEyesProgram.mFeatures.hasGamma = true; + gDeferredAvatarEyesProgram.mFeatures.hasTransport = true; + gDeferredAvatarEyesProgram.mFeatures.disableTextureIndex = true; + gDeferredAvatarEyesProgram.mShaderFiles.clear(); + gDeferredAvatarEyesProgram.mShaderFiles.push_back(make_pair("deferred/avatarEyesV.glsl", GL_VERTEX_SHADER_ARB)); + gDeferredAvatarEyesProgram.mShaderFiles.push_back(make_pair("deferred/diffuseF.glsl", GL_FRAGMENT_SHADER_ARB)); + gDeferredAvatarEyesProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED]; + success = gDeferredAvatarEyesProgram.createShader(NULL, NULL); + } + if (success) { gDeferredFullbrightProgram.mName = "Deferred Fullbright Shader"; gDeferredFullbrightProgram.mFeatures.calculatesAtmospherics = true; gDeferredFullbrightProgram.mFeatures.hasGamma = true; gDeferredFullbrightProgram.mFeatures.hasTransport = true; - gDeferredFullbrightProgram.mFeatures.isFullbright = true; + gDeferredFullbrightProgram.mFeatures.mIndexedTextureChannels = gGLManager.mNumTextureImageUnits; gDeferredFullbrightProgram.mShaderFiles.clear(); gDeferredFullbrightProgram.mShaderFiles.push_back(make_pair("deferred/fullbrightV.glsl", GL_VERTEX_SHADER_ARB)); gDeferredFullbrightProgram.mShaderFiles.push_back(make_pair("deferred/fullbrightF.glsl", GL_FRAGMENT_SHADER_ARB)); @@ -1153,10 +1326,21 @@ BOOL LLViewerShaderMgr::loadShadersDeferred() if (success) { + std::string fragment; + + if (multisample) + { + fragment = "deferred/softenLightMSF.glsl"; + } + else + { + fragment = "deferred/softenLightF.glsl"; + } + gDeferredSoftenProgram.mName = "Deferred Soften Shader"; gDeferredSoftenProgram.mShaderFiles.clear(); gDeferredSoftenProgram.mShaderFiles.push_back(make_pair("deferred/softenLightV.glsl", GL_VERTEX_SHADER_ARB)); - gDeferredSoftenProgram.mShaderFiles.push_back(make_pair("deferred/softenLightF.glsl", GL_FRAGMENT_SHADER_ARB)); + gDeferredSoftenProgram.mShaderFiles.push_back(make_pair(fragment, GL_FRAGMENT_SHADER_ARB)); gDeferredSoftenProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED]; @@ -1230,41 +1414,106 @@ BOOL LLViewerShaderMgr::loadShadersDeferred() gDeferredAvatarAlphaProgram.mFeatures.hasGamma = true; gDeferredAvatarAlphaProgram.mFeatures.hasAtmospherics = true; gDeferredAvatarAlphaProgram.mFeatures.hasLighting = true; + gDeferredAvatarAlphaProgram.mFeatures.disableTextureIndex = true; gDeferredAvatarAlphaProgram.mShaderFiles.clear(); gDeferredAvatarAlphaProgram.mShaderFiles.push_back(make_pair("deferred/avatarAlphaV.glsl", GL_VERTEX_SHADER_ARB)); - gDeferredAvatarAlphaProgram.mShaderFiles.push_back(make_pair("deferred/alphaF.glsl", GL_FRAGMENT_SHADER_ARB)); + gDeferredAvatarAlphaProgram.mShaderFiles.push_back(make_pair("deferred/alphaNonIndexedF.glsl", GL_FRAGMENT_SHADER_ARB)); gDeferredAvatarAlphaProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED]; success = gDeferredAvatarAlphaProgram.createShader(&mAvatarAttribs, &mAvatarUniforms); } if (success) { + std::string fragment; + if (multisample) + { + fragment = "deferred/postDeferredMSF.glsl"; + } + else + { + fragment = "deferred/postDeferredF.glsl"; + } + gDeferredPostProgram.mName = "Deferred Post Shader"; gDeferredPostProgram.mShaderFiles.clear(); gDeferredPostProgram.mShaderFiles.push_back(make_pair("deferred/postDeferredV.glsl", GL_VERTEX_SHADER_ARB)); - gDeferredPostProgram.mShaderFiles.push_back(make_pair("deferred/postDeferredF.glsl", GL_FRAGMENT_SHADER_ARB)); + gDeferredPostProgram.mShaderFiles.push_back(make_pair(fragment, GL_FRAGMENT_SHADER_ARB)); gDeferredPostProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED]; success = gDeferredPostProgram.createShader(NULL, NULL); } if (success) { + std::string fragment; + if (multisample) + { + fragment = "deferred/postDeferredNoDoFMSF.glsl"; + } + else + { + fragment = "deferred/postDeferredNoDoFF.glsl"; + } + gDeferredPostNoDoFProgram.mName = "Deferred Post Shader"; gDeferredPostNoDoFProgram.mShaderFiles.clear(); gDeferredPostNoDoFProgram.mShaderFiles.push_back(make_pair("deferred/postDeferredV.glsl", GL_VERTEX_SHADER_ARB)); - gDeferredPostNoDoFProgram.mShaderFiles.push_back(make_pair("deferred/postDeferredNoDoFF.glsl", GL_FRAGMENT_SHADER_ARB)); + gDeferredPostNoDoFProgram.mShaderFiles.push_back(make_pair(fragment, GL_FRAGMENT_SHADER_ARB)); gDeferredPostNoDoFProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED]; success = gDeferredPostNoDoFProgram.createShader(NULL, NULL); } + if (success) + { + gDeferredWLSkyProgram.mName = "Deferred Windlight Sky Shader"; + //gWLSkyProgram.mFeatures.hasGamma = true; + gDeferredWLSkyProgram.mShaderFiles.clear(); + gDeferredWLSkyProgram.mShaderFiles.push_back(make_pair("deferred/skyV.glsl", GL_VERTEX_SHADER_ARB)); + gDeferredWLSkyProgram.mShaderFiles.push_back(make_pair("deferred/skyF.glsl", GL_FRAGMENT_SHADER_ARB)); + gDeferredWLSkyProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED]; + gDeferredWLSkyProgram.mShaderGroup = LLGLSLShader::SG_SKY; + success = gDeferredWLSkyProgram.createShader(NULL, &mWLUniforms); + } + + if (success) + { + gDeferredWLCloudProgram.mName = "Deferred Windlight Cloud Program"; + gDeferredWLCloudProgram.mShaderFiles.clear(); + gDeferredWLCloudProgram.mShaderFiles.push_back(make_pair("deferred/cloudsV.glsl", GL_VERTEX_SHADER_ARB)); + gDeferredWLCloudProgram.mShaderFiles.push_back(make_pair("deferred/cloudsF.glsl", GL_FRAGMENT_SHADER_ARB)); + gDeferredWLCloudProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED]; + gDeferredWLCloudProgram.mShaderGroup = LLGLSLShader::SG_SKY; + success = gDeferredWLCloudProgram.createShader(NULL, &mWLUniforms); + } + + if (success) + { + gDeferredStarProgram.mName = "Deferred Star Program"; + gDeferredStarProgram.mShaderFiles.clear(); + gDeferredStarProgram.mShaderFiles.push_back(make_pair("deferred/starsV.glsl", GL_VERTEX_SHADER_ARB)); + gDeferredStarProgram.mShaderFiles.push_back(make_pair("deferred/starsF.glsl", GL_FRAGMENT_SHADER_ARB)); + gDeferredStarProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED]; + gDeferredStarProgram.mShaderGroup = LLGLSLShader::SG_SKY; + success = gDeferredStarProgram.createShader(NULL, &mWLUniforms); + } + if (mVertexShaderLevel[SHADER_DEFERRED] > 1) { if (success) { + std::string fragment; + if (multisample) + { + fragment = "deferred/edgeMSF.glsl"; + } + else + { + fragment = "deferred/edgeF.glsl"; + } + gDeferredEdgeProgram.mName = "Deferred Edge Shader"; gDeferredEdgeProgram.mShaderFiles.clear(); gDeferredEdgeProgram.mShaderFiles.push_back(make_pair("deferred/edgeV.glsl", GL_VERTEX_SHADER_ARB)); - gDeferredEdgeProgram.mShaderFiles.push_back(make_pair("deferred/edgeF.glsl", GL_FRAGMENT_SHADER_ARB)); + gDeferredEdgeProgram.mShaderFiles.push_back(make_pair(fragment, GL_FRAGMENT_SHADER_ARB)); gDeferredEdgeProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED]; success = gDeferredEdgeProgram.createShader(NULL, NULL); } @@ -1272,8 +1521,6 @@ BOOL LLViewerShaderMgr::loadShadersDeferred() if (mVertexShaderLevel[SHADER_DEFERRED] > 2) { - - if (success) { gDeferredPostGIProgram.mName = "Deferred Post GI Shader"; @@ -1321,7 +1568,7 @@ BOOL LLViewerShaderMgr::loadShadersDeferred() BOOL LLViewerShaderMgr::loadShadersObject() { BOOL success = TRUE; - + if (mVertexShaderLevel[SHADER_OBJECT] == 0) { gObjectShinyProgram.unload(); @@ -1332,6 +1579,14 @@ BOOL LLViewerShaderMgr::loadShadersObject() gObjectSimpleWaterProgram.unload(); gObjectFullbrightProgram.unload(); gObjectFullbrightWaterProgram.unload(); + gObjectShinyNonIndexedProgram.unload(); + gObjectFullbrightShinyNonIndexedProgram.unload(); + gObjectFullbrightShinyNonIndexedWaterProgram.unload(); + gObjectShinyNonIndexedWaterProgram.unload(); + gObjectSimpleNonIndexedProgram.unload(); + gObjectSimpleNonIndexedWaterProgram.unload(); + gObjectFullbrightNonIndexedProgram.unload(); + gObjectFullbrightNonIndexedWaterProgram.unload(); gSkinnedObjectSimpleProgram.unload(); gSkinnedObjectFullbrightProgram.unload(); gSkinnedObjectFullbrightShinyProgram.unload(); @@ -1344,6 +1599,137 @@ BOOL LLViewerShaderMgr::loadShadersObject() return TRUE; } + if (success) + { + gObjectSimpleNonIndexedProgram.mName = "Non indexed Shader"; + gObjectSimpleNonIndexedProgram.mFeatures.calculatesLighting = true; + gObjectSimpleNonIndexedProgram.mFeatures.calculatesAtmospherics = true; + gObjectSimpleNonIndexedProgram.mFeatures.hasGamma = true; + gObjectSimpleNonIndexedProgram.mFeatures.hasAtmospherics = true; + gObjectSimpleNonIndexedProgram.mFeatures.hasLighting = true; + gObjectSimpleNonIndexedProgram.mFeatures.disableTextureIndex = true; + gObjectSimpleNonIndexedProgram.mShaderFiles.clear(); + gObjectSimpleNonIndexedProgram.mShaderFiles.push_back(make_pair("objects/simpleV.glsl", GL_VERTEX_SHADER_ARB)); + gObjectSimpleNonIndexedProgram.mShaderFiles.push_back(make_pair("objects/simpleF.glsl", GL_FRAGMENT_SHADER_ARB)); + gObjectSimpleNonIndexedProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT]; + success = gObjectSimpleNonIndexedProgram.createShader(NULL, NULL); + } + + if (success) + { + gObjectSimpleNonIndexedWaterProgram.mName = "Non indexed Water Shader"; + gObjectSimpleNonIndexedWaterProgram.mFeatures.calculatesLighting = true; + gObjectSimpleNonIndexedWaterProgram.mFeatures.calculatesAtmospherics = true; + gObjectSimpleNonIndexedWaterProgram.mFeatures.hasWaterFog = true; + gObjectSimpleNonIndexedWaterProgram.mFeatures.hasAtmospherics = true; + gObjectSimpleNonIndexedWaterProgram.mFeatures.hasLighting = true; + gObjectSimpleNonIndexedWaterProgram.mFeatures.disableTextureIndex = true; + gObjectSimpleNonIndexedWaterProgram.mShaderFiles.clear(); + gObjectSimpleNonIndexedWaterProgram.mShaderFiles.push_back(make_pair("objects/simpleV.glsl", GL_VERTEX_SHADER_ARB)); + gObjectSimpleNonIndexedWaterProgram.mShaderFiles.push_back(make_pair("objects/simpleWaterF.glsl", GL_FRAGMENT_SHADER_ARB)); + gObjectSimpleNonIndexedWaterProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT]; + gObjectSimpleNonIndexedWaterProgram.mShaderGroup = LLGLSLShader::SG_WATER; + success = gObjectSimpleNonIndexedWaterProgram.createShader(NULL, NULL); + } + + if (success) + { + gObjectFullbrightNonIndexedProgram.mName = "Non Indexed Fullbright Shader"; + gObjectFullbrightNonIndexedProgram.mFeatures.calculatesAtmospherics = true; + gObjectFullbrightNonIndexedProgram.mFeatures.hasGamma = true; + gObjectFullbrightNonIndexedProgram.mFeatures.hasTransport = true; + gObjectFullbrightNonIndexedProgram.mFeatures.isFullbright = true; + gObjectFullbrightNonIndexedProgram.mFeatures.disableTextureIndex = true; + gObjectFullbrightNonIndexedProgram.mShaderFiles.clear(); + gObjectFullbrightNonIndexedProgram.mShaderFiles.push_back(make_pair("objects/fullbrightV.glsl", GL_VERTEX_SHADER_ARB)); + gObjectFullbrightNonIndexedProgram.mShaderFiles.push_back(make_pair("objects/fullbrightF.glsl", GL_FRAGMENT_SHADER_ARB)); + gObjectFullbrightNonIndexedProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT]; + success = gObjectFullbrightNonIndexedProgram.createShader(NULL, NULL); + } + + if (success) + { + gObjectFullbrightNonIndexedWaterProgram.mName = "Non Indexed Fullbright Water Shader"; + gObjectFullbrightNonIndexedWaterProgram.mFeatures.calculatesAtmospherics = true; + gObjectFullbrightNonIndexedWaterProgram.mFeatures.isFullbright = true; + gObjectFullbrightNonIndexedWaterProgram.mFeatures.hasWaterFog = true; + gObjectFullbrightNonIndexedWaterProgram.mFeatures.hasTransport = true; + gObjectFullbrightNonIndexedWaterProgram.mFeatures.disableTextureIndex = true; + gObjectFullbrightNonIndexedWaterProgram.mShaderFiles.clear(); + gObjectFullbrightNonIndexedWaterProgram.mShaderFiles.push_back(make_pair("objects/fullbrightV.glsl", GL_VERTEX_SHADER_ARB)); + gObjectFullbrightNonIndexedWaterProgram.mShaderFiles.push_back(make_pair("objects/fullbrightWaterF.glsl", GL_FRAGMENT_SHADER_ARB)); + gObjectFullbrightNonIndexedWaterProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT]; + gObjectFullbrightNonIndexedWaterProgram.mShaderGroup = LLGLSLShader::SG_WATER; + success = gObjectFullbrightNonIndexedWaterProgram.createShader(NULL, NULL); + } + + if (success) + { + gObjectShinyNonIndexedProgram.mName = "Non Indexed Shiny Shader"; + gObjectShinyNonIndexedProgram.mFeatures.calculatesAtmospherics = true; + gObjectShinyNonIndexedProgram.mFeatures.calculatesLighting = true; + gObjectShinyNonIndexedProgram.mFeatures.hasGamma = true; + gObjectShinyNonIndexedProgram.mFeatures.hasAtmospherics = true; + gObjectShinyNonIndexedProgram.mFeatures.isShiny = true; + gObjectShinyNonIndexedProgram.mFeatures.disableTextureIndex = true; + gObjectShinyNonIndexedProgram.mShaderFiles.clear(); + gObjectShinyNonIndexedProgram.mShaderFiles.push_back(make_pair("objects/shinyV.glsl", GL_VERTEX_SHADER_ARB)); + gObjectShinyNonIndexedProgram.mShaderFiles.push_back(make_pair("objects/shinyF.glsl", GL_FRAGMENT_SHADER_ARB)); + gObjectShinyNonIndexedProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT]; + success = gObjectShinyNonIndexedProgram.createShader(NULL, &mShinyUniforms); + } + + if (success) + { + gObjectShinyNonIndexedWaterProgram.mName = "Non Indexed Shiny Water Shader"; + gObjectShinyNonIndexedWaterProgram.mFeatures.calculatesAtmospherics = true; + gObjectShinyNonIndexedWaterProgram.mFeatures.calculatesLighting = true; + gObjectShinyNonIndexedWaterProgram.mFeatures.isShiny = true; + gObjectShinyNonIndexedWaterProgram.mFeatures.hasWaterFog = true; + gObjectShinyNonIndexedWaterProgram.mFeatures.hasAtmospherics = true; + gObjectShinyNonIndexedWaterProgram.mFeatures.disableTextureIndex = true; + gObjectShinyNonIndexedWaterProgram.mShaderFiles.clear(); + gObjectShinyNonIndexedWaterProgram.mShaderFiles.push_back(make_pair("objects/shinyWaterF.glsl", GL_FRAGMENT_SHADER_ARB)); + gObjectShinyNonIndexedWaterProgram.mShaderFiles.push_back(make_pair("objects/shinyV.glsl", GL_VERTEX_SHADER_ARB)); + gObjectShinyNonIndexedWaterProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT]; + gObjectShinyNonIndexedWaterProgram.mShaderGroup = LLGLSLShader::SG_WATER; + success = gObjectShinyNonIndexedWaterProgram.createShader(NULL, &mShinyUniforms); + } + + if (success) + { + gObjectFullbrightShinyNonIndexedProgram.mName = "Non Indexed Fullbright Shiny Shader"; + gObjectFullbrightShinyNonIndexedProgram.mFeatures.calculatesAtmospherics = true; + gObjectFullbrightShinyNonIndexedProgram.mFeatures.isFullbright = true; + gObjectFullbrightShinyNonIndexedProgram.mFeatures.isShiny = true; + gObjectFullbrightShinyNonIndexedProgram.mFeatures.hasGamma = true; + gObjectFullbrightShinyNonIndexedProgram.mFeatures.hasTransport = true; + gObjectFullbrightShinyNonIndexedProgram.mFeatures.disableTextureIndex = true; + gObjectFullbrightShinyNonIndexedProgram.mShaderFiles.clear(); + gObjectFullbrightShinyNonIndexedProgram.mShaderFiles.push_back(make_pair("objects/fullbrightShinyV.glsl", GL_VERTEX_SHADER_ARB)); + gObjectFullbrightShinyNonIndexedProgram.mShaderFiles.push_back(make_pair("objects/fullbrightShinyF.glsl", GL_FRAGMENT_SHADER_ARB)); + gObjectFullbrightShinyNonIndexedProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT]; + success = gObjectFullbrightShinyNonIndexedProgram.createShader(NULL, &mShinyUniforms); + } + + if (success) + { + gObjectFullbrightShinyNonIndexedWaterProgram.mName = "Non Indexed Fullbright Shiny Water Shader"; + gObjectFullbrightShinyNonIndexedWaterProgram.mFeatures.calculatesAtmospherics = true; + gObjectFullbrightShinyNonIndexedWaterProgram.mFeatures.isFullbright = true; + gObjectFullbrightShinyNonIndexedWaterProgram.mFeatures.isShiny = true; + gObjectFullbrightShinyNonIndexedWaterProgram.mFeatures.hasGamma = true; + gObjectFullbrightShinyNonIndexedWaterProgram.mFeatures.hasTransport = true; + gObjectFullbrightShinyNonIndexedWaterProgram.mFeatures.hasWaterFog = true; + gObjectFullbrightShinyNonIndexedWaterProgram.mFeatures.disableTextureIndex = true; + gObjectFullbrightShinyNonIndexedWaterProgram.mShaderFiles.clear(); + gObjectFullbrightShinyNonIndexedWaterProgram.mShaderFiles.push_back(make_pair("objects/fullbrightShinyV.glsl", GL_VERTEX_SHADER_ARB)); + gObjectFullbrightShinyNonIndexedWaterProgram.mShaderFiles.push_back(make_pair("objects/fullbrightShinyWaterF.glsl", GL_FRAGMENT_SHADER_ARB)); + gObjectFullbrightShinyNonIndexedWaterProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT]; + gObjectFullbrightShinyNonIndexedWaterProgram.mShaderGroup = LLGLSLShader::SG_WATER; + success = gObjectFullbrightShinyNonIndexedWaterProgram.createShader(NULL, &mShinyUniforms); + } + if (success) { gObjectSimpleProgram.mName = "Simple Shader"; @@ -1352,6 +1738,7 @@ BOOL LLViewerShaderMgr::loadShadersObject() gObjectSimpleProgram.mFeatures.hasGamma = true; gObjectSimpleProgram.mFeatures.hasAtmospherics = true; gObjectSimpleProgram.mFeatures.hasLighting = true; + gObjectSimpleProgram.mFeatures.mIndexedTextureChannels = 0; gObjectSimpleProgram.mShaderFiles.clear(); gObjectSimpleProgram.mShaderFiles.push_back(make_pair("objects/simpleV.glsl", GL_VERTEX_SHADER_ARB)); gObjectSimpleProgram.mShaderFiles.push_back(make_pair("objects/simpleF.glsl", GL_FRAGMENT_SHADER_ARB)); @@ -1367,6 +1754,7 @@ BOOL LLViewerShaderMgr::loadShadersObject() gObjectSimpleWaterProgram.mFeatures.hasWaterFog = true; gObjectSimpleWaterProgram.mFeatures.hasAtmospherics = true; gObjectSimpleWaterProgram.mFeatures.hasLighting = true; + gObjectSimpleWaterProgram.mFeatures.mIndexedTextureChannels = 0; gObjectSimpleWaterProgram.mShaderFiles.clear(); gObjectSimpleWaterProgram.mShaderFiles.push_back(make_pair("objects/simpleV.glsl", GL_VERTEX_SHADER_ARB)); gObjectSimpleWaterProgram.mShaderFiles.push_back(make_pair("objects/simpleWaterF.glsl", GL_FRAGMENT_SHADER_ARB)); @@ -1382,6 +1770,7 @@ BOOL LLViewerShaderMgr::loadShadersObject() gObjectFullbrightProgram.mFeatures.hasGamma = true; gObjectFullbrightProgram.mFeatures.hasTransport = true; gObjectFullbrightProgram.mFeatures.isFullbright = true; + gObjectFullbrightProgram.mFeatures.mIndexedTextureChannels = 0; gObjectFullbrightProgram.mShaderFiles.clear(); gObjectFullbrightProgram.mShaderFiles.push_back(make_pair("objects/fullbrightV.glsl", GL_VERTEX_SHADER_ARB)); gObjectFullbrightProgram.mShaderFiles.push_back(make_pair("objects/fullbrightF.glsl", GL_FRAGMENT_SHADER_ARB)); @@ -1396,6 +1785,7 @@ BOOL LLViewerShaderMgr::loadShadersObject() gObjectFullbrightWaterProgram.mFeatures.isFullbright = true; gObjectFullbrightWaterProgram.mFeatures.hasWaterFog = true; gObjectFullbrightWaterProgram.mFeatures.hasTransport = true; + gObjectFullbrightWaterProgram.mFeatures.mIndexedTextureChannels = 0; gObjectFullbrightWaterProgram.mShaderFiles.clear(); gObjectFullbrightWaterProgram.mShaderFiles.push_back(make_pair("objects/fullbrightV.glsl", GL_VERTEX_SHADER_ARB)); gObjectFullbrightWaterProgram.mShaderFiles.push_back(make_pair("objects/fullbrightWaterF.glsl", GL_FRAGMENT_SHADER_ARB)); @@ -1412,6 +1802,7 @@ BOOL LLViewerShaderMgr::loadShadersObject() gObjectShinyProgram.mFeatures.hasGamma = true; gObjectShinyProgram.mFeatures.hasAtmospherics = true; gObjectShinyProgram.mFeatures.isShiny = true; + gObjectShinyProgram.mFeatures.mIndexedTextureChannels = 0; gObjectShinyProgram.mShaderFiles.clear(); gObjectShinyProgram.mShaderFiles.push_back(make_pair("objects/shinyV.glsl", GL_VERTEX_SHADER_ARB)); gObjectShinyProgram.mShaderFiles.push_back(make_pair("objects/shinyF.glsl", GL_FRAGMENT_SHADER_ARB)); @@ -1427,6 +1818,7 @@ BOOL LLViewerShaderMgr::loadShadersObject() gObjectShinyWaterProgram.mFeatures.isShiny = true; gObjectShinyWaterProgram.mFeatures.hasWaterFog = true; gObjectShinyWaterProgram.mFeatures.hasAtmospherics = true; + gObjectShinyWaterProgram.mFeatures.mIndexedTextureChannels = 0; gObjectShinyWaterProgram.mShaderFiles.clear(); gObjectShinyWaterProgram.mShaderFiles.push_back(make_pair("objects/shinyWaterF.glsl", GL_FRAGMENT_SHADER_ARB)); gObjectShinyWaterProgram.mShaderFiles.push_back(make_pair("objects/shinyV.glsl", GL_VERTEX_SHADER_ARB)); @@ -1443,6 +1835,7 @@ BOOL LLViewerShaderMgr::loadShadersObject() gObjectFullbrightShinyProgram.mFeatures.isShiny = true; gObjectFullbrightShinyProgram.mFeatures.hasGamma = true; gObjectFullbrightShinyProgram.mFeatures.hasTransport = true; + gObjectFullbrightShinyProgram.mFeatures.mIndexedTextureChannels = 0; gObjectFullbrightShinyProgram.mShaderFiles.clear(); gObjectFullbrightShinyProgram.mShaderFiles.push_back(make_pair("objects/fullbrightShinyV.glsl", GL_VERTEX_SHADER_ARB)); gObjectFullbrightShinyProgram.mShaderFiles.push_back(make_pair("objects/fullbrightShinyF.glsl", GL_FRAGMENT_SHADER_ARB)); @@ -1459,6 +1852,7 @@ BOOL LLViewerShaderMgr::loadShadersObject() gObjectFullbrightShinyWaterProgram.mFeatures.hasGamma = true; gObjectFullbrightShinyWaterProgram.mFeatures.hasTransport = true; gObjectFullbrightShinyWaterProgram.mFeatures.hasWaterFog = true; + gObjectFullbrightShinyWaterProgram.mFeatures.mIndexedTextureChannels = 0; gObjectFullbrightShinyWaterProgram.mShaderFiles.clear(); gObjectFullbrightShinyWaterProgram.mShaderFiles.push_back(make_pair("objects/fullbrightShinyV.glsl", GL_VERTEX_SHADER_ARB)); gObjectFullbrightShinyWaterProgram.mShaderFiles.push_back(make_pair("objects/fullbrightShinyWaterF.glsl", GL_FRAGMENT_SHADER_ARB)); @@ -1478,6 +1872,7 @@ BOOL LLViewerShaderMgr::loadShadersObject() gSkinnedObjectSimpleProgram.mFeatures.hasAtmospherics = true; gSkinnedObjectSimpleProgram.mFeatures.hasLighting = true; gSkinnedObjectSimpleProgram.mFeatures.hasObjectSkinning = true; + gSkinnedObjectSimpleProgram.mFeatures.disableTextureIndex = true; gSkinnedObjectSimpleProgram.mShaderFiles.clear(); gSkinnedObjectSimpleProgram.mShaderFiles.push_back(make_pair("objects/simpleSkinnedV.glsl", GL_VERTEX_SHADER_ARB)); gSkinnedObjectSimpleProgram.mShaderFiles.push_back(make_pair("objects/simpleF.glsl", GL_FRAGMENT_SHADER_ARB)); @@ -1493,6 +1888,7 @@ BOOL LLViewerShaderMgr::loadShadersObject() gSkinnedObjectFullbrightProgram.mFeatures.hasTransport = true; gSkinnedObjectFullbrightProgram.mFeatures.isFullbright = true; gSkinnedObjectFullbrightProgram.mFeatures.hasObjectSkinning = true; + gSkinnedObjectFullbrightProgram.mFeatures.disableTextureIndex = true; gSkinnedObjectFullbrightProgram.mShaderFiles.clear(); gSkinnedObjectFullbrightProgram.mShaderFiles.push_back(make_pair("objects/fullbrightSkinnedV.glsl", GL_VERTEX_SHADER_ARB)); gSkinnedObjectFullbrightProgram.mShaderFiles.push_back(make_pair("objects/fullbrightF.glsl", GL_FRAGMENT_SHADER_ARB)); @@ -1509,6 +1905,7 @@ BOOL LLViewerShaderMgr::loadShadersObject() gSkinnedObjectFullbrightShinyProgram.mFeatures.isShiny = true; gSkinnedObjectFullbrightShinyProgram.mFeatures.isFullbright = true; gSkinnedObjectFullbrightShinyProgram.mFeatures.hasObjectSkinning = true; + gSkinnedObjectFullbrightShinyProgram.mFeatures.disableTextureIndex = true; gSkinnedObjectFullbrightShinyProgram.mShaderFiles.clear(); gSkinnedObjectFullbrightShinyProgram.mShaderFiles.push_back(make_pair("objects/fullbrightShinySkinnedV.glsl", GL_VERTEX_SHADER_ARB)); gSkinnedObjectFullbrightShinyProgram.mShaderFiles.push_back(make_pair("objects/fullbrightShinyF.glsl", GL_FRAGMENT_SHADER_ARB)); @@ -1525,6 +1922,7 @@ BOOL LLViewerShaderMgr::loadShadersObject() gSkinnedObjectShinySimpleProgram.mFeatures.hasAtmospherics = true; gSkinnedObjectShinySimpleProgram.mFeatures.hasObjectSkinning = true; gSkinnedObjectShinySimpleProgram.mFeatures.isShiny = true; + gSkinnedObjectShinySimpleProgram.mFeatures.disableTextureIndex = true; gSkinnedObjectShinySimpleProgram.mShaderFiles.clear(); gSkinnedObjectShinySimpleProgram.mShaderFiles.push_back(make_pair("objects/shinySimpleSkinnedV.glsl", GL_VERTEX_SHADER_ARB)); gSkinnedObjectShinySimpleProgram.mShaderFiles.push_back(make_pair("objects/shinyF.glsl", GL_FRAGMENT_SHADER_ARB)); @@ -1540,9 +1938,11 @@ BOOL LLViewerShaderMgr::loadShadersObject() gSkinnedObjectSimpleWaterProgram.mFeatures.hasGamma = true; gSkinnedObjectSimpleWaterProgram.mFeatures.hasAtmospherics = true; gSkinnedObjectSimpleWaterProgram.mFeatures.hasLighting = true; + gSkinnedObjectSimpleWaterProgram.mFeatures.disableTextureIndex = true; gSkinnedObjectSimpleWaterProgram.mFeatures.hasWaterFog = true; gSkinnedObjectSimpleWaterProgram.mShaderGroup = LLGLSLShader::SG_WATER; gSkinnedObjectSimpleWaterProgram.mFeatures.hasObjectSkinning = true; + gSkinnedObjectSimpleWaterProgram.mFeatures.disableTextureIndex = true; gSkinnedObjectSimpleWaterProgram.mShaderFiles.clear(); gSkinnedObjectSimpleWaterProgram.mShaderFiles.push_back(make_pair("objects/simpleSkinnedV.glsl", GL_VERTEX_SHADER_ARB)); gSkinnedObjectSimpleWaterProgram.mShaderFiles.push_back(make_pair("objects/simpleWaterF.glsl", GL_FRAGMENT_SHADER_ARB)); @@ -1559,6 +1959,7 @@ BOOL LLViewerShaderMgr::loadShadersObject() gSkinnedObjectFullbrightWaterProgram.mFeatures.isFullbright = true; gSkinnedObjectFullbrightWaterProgram.mFeatures.hasObjectSkinning = true; gSkinnedObjectFullbrightWaterProgram.mFeatures.hasWaterFog = true; + gSkinnedObjectFullbrightWaterProgram.mFeatures.disableTextureIndex = true; gSkinnedObjectFullbrightWaterProgram.mShaderGroup = LLGLSLShader::SG_WATER; gSkinnedObjectFullbrightWaterProgram.mShaderFiles.clear(); gSkinnedObjectFullbrightWaterProgram.mShaderFiles.push_back(make_pair("objects/fullbrightSkinnedV.glsl", GL_VERTEX_SHADER_ARB)); @@ -1577,6 +1978,7 @@ BOOL LLViewerShaderMgr::loadShadersObject() gSkinnedObjectFullbrightShinyWaterProgram.mFeatures.isFullbright = true; gSkinnedObjectFullbrightShinyWaterProgram.mFeatures.hasObjectSkinning = true; gSkinnedObjectFullbrightShinyWaterProgram.mFeatures.hasWaterFog = true; + gSkinnedObjectFullbrightShinyWaterProgram.mFeatures.disableTextureIndex = true; gSkinnedObjectFullbrightShinyWaterProgram.mShaderGroup = LLGLSLShader::SG_WATER; gSkinnedObjectFullbrightShinyWaterProgram.mShaderFiles.clear(); gSkinnedObjectFullbrightShinyWaterProgram.mShaderFiles.push_back(make_pair("objects/fullbrightShinySkinnedV.glsl", GL_VERTEX_SHADER_ARB)); @@ -1595,6 +1997,7 @@ BOOL LLViewerShaderMgr::loadShadersObject() gSkinnedObjectShinySimpleWaterProgram.mFeatures.hasObjectSkinning = true; gSkinnedObjectShinySimpleWaterProgram.mFeatures.isShiny = true; gSkinnedObjectShinySimpleWaterProgram.mFeatures.hasWaterFog = true; + gSkinnedObjectShinySimpleWaterProgram.mFeatures.disableTextureIndex = true; gSkinnedObjectShinySimpleWaterProgram.mShaderGroup = LLGLSLShader::SG_WATER; gSkinnedObjectShinySimpleWaterProgram.mShaderFiles.clear(); gSkinnedObjectShinySimpleWaterProgram.mShaderFiles.push_back(make_pair("objects/shinySimpleSkinnedV.glsl", GL_VERTEX_SHADER_ARB)); @@ -1635,6 +2038,7 @@ BOOL LLViewerShaderMgr::loadShadersAvatar() gAvatarProgram.mFeatures.hasGamma = true; gAvatarProgram.mFeatures.hasAtmospherics = true; gAvatarProgram.mFeatures.hasLighting = true; + gAvatarProgram.mFeatures.disableTextureIndex = true; gAvatarProgram.mShaderFiles.clear(); gAvatarProgram.mShaderFiles.push_back(make_pair("avatar/avatarV.glsl", GL_VERTEX_SHADER_ARB)); gAvatarProgram.mShaderFiles.push_back(make_pair("avatar/avatarF.glsl", GL_FRAGMENT_SHADER_ARB)); @@ -1650,6 +2054,7 @@ BOOL LLViewerShaderMgr::loadShadersAvatar() gAvatarWaterProgram.mFeatures.hasWaterFog = true; gAvatarWaterProgram.mFeatures.hasAtmospherics = true; gAvatarWaterProgram.mFeatures.hasLighting = true; + gAvatarWaterProgram.mFeatures.disableTextureIndex = true; gAvatarWaterProgram.mShaderFiles.clear(); gAvatarWaterProgram.mShaderFiles.push_back(make_pair("avatar/avatarV.glsl", GL_VERTEX_SHADER_ARB)); gAvatarWaterProgram.mShaderFiles.push_back(make_pair("objects/simpleWaterF.glsl", GL_FRAGMENT_SHADER_ARB)); @@ -1670,6 +2075,7 @@ BOOL LLViewerShaderMgr::loadShadersAvatar() { gAvatarPickProgram.mName = "Avatar Pick Shader"; gAvatarPickProgram.mFeatures.hasSkinning = true; + gAvatarPickProgram.mFeatures.disableTextureIndex = true; gAvatarPickProgram.mShaderFiles.clear(); gAvatarPickProgram.mShaderFiles.push_back(make_pair("avatar/pickAvatarV.glsl", GL_VERTEX_SHADER_ARB)); gAvatarPickProgram.mShaderFiles.push_back(make_pair("avatar/pickAvatarF.glsl", GL_FRAGMENT_SHADER_ARB)); @@ -1686,6 +2092,7 @@ BOOL LLViewerShaderMgr::loadShadersAvatar() gAvatarEyeballProgram.mFeatures.hasGamma = true; gAvatarEyeballProgram.mFeatures.hasAtmospherics = true; gAvatarEyeballProgram.mFeatures.hasLighting = true; + gAvatarEyeballProgram.mFeatures.disableTextureIndex = true; gAvatarEyeballProgram.mShaderFiles.clear(); gAvatarEyeballProgram.mShaderFiles.push_back(make_pair("avatar/eyeballV.glsl", GL_VERTEX_SHADER_ARB)); gAvatarEyeballProgram.mShaderFiles.push_back(make_pair("avatar/eyeballF.glsl", GL_FRAGMENT_SHADER_ARB)); diff --git a/indra/newview/llviewershadermgr.h b/indra/newview/llviewershadermgr.h index 72ac5e02ee50d0931bfd595128732d201103f5d2..6ecba65470c8705de9424ec8cea924c306c8160d 100644 --- a/indra/newview/llviewershadermgr.h +++ b/indra/newview/llviewershadermgr.h @@ -298,16 +298,25 @@ extern LLVector4 gShinyOrigin; //object shaders extern LLGLSLShader gObjectSimpleProgram; extern LLGLSLShader gObjectSimpleWaterProgram; +extern LLGLSLShader gObjectSimpleNonIndexedProgram; +extern LLGLSLShader gObjectSimpleNonIndexedWaterProgram; extern LLGLSLShader gObjectFullbrightProgram; extern LLGLSLShader gObjectFullbrightWaterProgram; +extern LLGLSLShader gObjectFullbrightNonIndexedProgram; +extern LLGLSLShader gObjectFullbrightNonIndexedWaterProgram; extern LLGLSLShader gObjectSimpleLODProgram; extern LLGLSLShader gObjectFullbrightLODProgram; extern LLGLSLShader gObjectFullbrightShinyProgram; extern LLGLSLShader gObjectFullbrightShinyWaterProgram; +extern LLGLSLShader gObjectFullbrightShinyNonIndexedProgram; +extern LLGLSLShader gObjectFullbrightShinyNonIndexedWaterProgram; + extern LLGLSLShader gObjectShinyProgram; extern LLGLSLShader gObjectShinyWaterProgram; +extern LLGLSLShader gObjectShinyNonIndexedProgram; +extern LLGLSLShader gObjectShinyNonIndexedWaterProgram; extern LLGLSLShader gSkinnedObjectSimpleProgram; extern LLGLSLShader gSkinnedObjectFullbrightProgram; @@ -349,6 +358,7 @@ extern LLGLSLShader gDeferredImpostorProgram; extern LLGLSLShader gDeferredEdgeProgram; extern LLGLSLShader gDeferredWaterProgram; extern LLGLSLShader gDeferredDiffuseProgram; +extern LLGLSLShader gDeferredNonIndexedDiffuseProgram; extern LLGLSLShader gDeferredSkinnedDiffuseProgram; extern LLGLSLShader gDeferredSkinnedBumpProgram; extern LLGLSLShader gDeferredSkinnedAlphaProgram; @@ -373,8 +383,11 @@ extern LLGLSLShader gDeferredAvatarShadowProgram; extern LLGLSLShader gDeferredAttachmentShadowProgram; extern LLGLSLShader gDeferredAlphaProgram; extern LLGLSLShader gDeferredFullbrightProgram; +extern LLGLSLShader gDeferredAvatarEyesProgram; extern LLGLSLShader gDeferredAvatarAlphaProgram; - +extern LLGLSLShader gDeferredWLSkyProgram; +extern LLGLSLShader gDeferredWLCloudProgram; +extern LLGLSLShader gDeferredStarProgram; extern LLGLSLShader gLuminanceGatherProgram; //current avatar shader parameter pointer diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp index af06421bf9db7c1d4686d739fc8df6d9879cc2c6..4da0f80a00281beff887a3fd191d8ebf6cb14942 100644 --- a/indra/newview/llviewertexture.cpp +++ b/indra/newview/llviewertexture.cpp @@ -1168,6 +1168,7 @@ void LLViewerFetchedTexture::init(bool firstinit) mSavedRawDiscardLevel = -1 ; mDesiredSavedRawDiscardLevel = -1 ; mLastReferencedSavedRawImageTime = 0.0f ; + mKeptSavedRawImageTime = 0.f ; mLastCallBackActiveTime = 0.f; } @@ -2696,8 +2697,16 @@ void LLViewerFetchedTexture::saveRawImage() mLastReferencedSavedRawImageTime = sCurrentTime ; } -void LLViewerFetchedTexture::forceToSaveRawImage(S32 desired_discard) +void LLViewerFetchedTexture::forceToSaveRawImage(S32 desired_discard, F32 kept_time) { + mKeptSavedRawImageTime = kept_time ; + mLastReferencedSavedRawImageTime = sCurrentTime ; + + if(mSavedRawDiscardLevel > -1 && mSavedRawDiscardLevel <= desired_discard) + { + return ; //raw imge is ready. + } + if(!mForceToSaveRawImage || mDesiredSavedRawDiscardLevel < 0 || mDesiredSavedRawDiscardLevel > desired_discard) { mForceToSaveRawImage = TRUE ; @@ -2713,11 +2722,16 @@ void LLViewerFetchedTexture::forceToSaveRawImage(S32 desired_discard) mRawImage = NULL ; mRawDiscardLevel = INVALID_DISCARD_LEVEL ; - } + } } } void LLViewerFetchedTexture::destroySavedRawImage() { + if(mLastReferencedSavedRawImageTime < mKeptSavedRawImageTime) + { + return ; //keep the saved raw image. + } + mForceToSaveRawImage = FALSE ; mSaveRawImage = FALSE ; @@ -2729,6 +2743,7 @@ void LLViewerFetchedTexture::destroySavedRawImage() mSavedRawDiscardLevel = -1 ; mDesiredSavedRawDiscardLevel = -1 ; mLastReferencedSavedRawImageTime = 0.0f ; + mKeptSavedRawImageTime = 0.f ; } LLImageRaw* LLViewerFetchedTexture::getSavedRawImage() diff --git a/indra/newview/llviewertexture.h b/indra/newview/llviewertexture.h index d512f8ec3abc4f03a34a20aa4fbc8e4e5f28baf7..c5b8c8923ad52bf6b4eb16b363778221ee106e07 100644 --- a/indra/newview/llviewertexture.h +++ b/indra/newview/llviewertexture.h @@ -465,7 +465,7 @@ class LLViewerFetchedTexture : public LLViewerTexture S32 getCachedRawImageLevel() const {return mCachedRawDiscardLevel;} BOOL isCachedRawImageReady() const {return mCachedRawImageReady ;} BOOL isRawImageValid()const { return mIsRawImageValid ; } - void forceToSaveRawImage(S32 desired_discard = 0) ; + void forceToSaveRawImage(S32 desired_discard = 0, F32 kept_time = 0.f) ; /*virtual*/ void setCachedRawImage(S32 discard_level, LLImageRaw* imageraw) ; void destroySavedRawImage() ; LLImageRaw* getSavedRawImage() ; @@ -550,6 +550,7 @@ class LLViewerFetchedTexture : public LLViewerTexture S32 mSavedRawDiscardLevel; S32 mDesiredSavedRawDiscardLevel; F32 mLastReferencedSavedRawImageTime ; + F32 mKeptSavedRawImageTime ; //a small version of the copy of the raw image (<= 64 * 64) LLPointer<LLImageRaw> mCachedRawImage; diff --git a/indra/newview/llviewertexturelist.cpp b/indra/newview/llviewertexturelist.cpp index 1ffae7ce839c13df5018a803ae5e8dcfcd805764..a1d9434d44e353af5e692fc3f8a277f37b20699e 100644 --- a/indra/newview/llviewertexturelist.cpp +++ b/indra/newview/llviewertexturelist.cpp @@ -281,6 +281,8 @@ void LLViewerTextureList::shutdown() mUUIDMap.clear(); mImageList.clear(); + + mInitialized = FALSE ; //prevent loading textures again. } void LLViewerTextureList::dump() @@ -328,6 +330,11 @@ LLViewerFetchedTexture* LLViewerTextureList::getImageFromFile(const std::string& LLGLenum primary_format, const LLUUID& force_id) { + if(!mInitialized) + { + return NULL ; + } + std::string full_path = gDirUtilp->findSkinnedFilename("textures", filename); if (full_path.empty()) { @@ -348,6 +355,11 @@ LLViewerFetchedTexture* LLViewerTextureList::getImageFromUrl(const std::string& LLGLenum primary_format, const LLUUID& force_id) { + if(!mInitialized) + { + return NULL ; + } + // generate UUID based on hash of filename LLUUID new_id; if (force_id.notNull()) @@ -407,6 +419,11 @@ LLViewerFetchedTexture* LLViewerTextureList::getImage(const LLUUID &image_id, LLGLenum primary_format, LLHost request_from_host) { + if(!mInitialized) + { + return NULL ; + } + // Return the image with ID image_id // If the image is not found, creates new image and // enqueues a request for transmission diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index 34d15a597e99466b91d77678c2fd7635384ebd2b..b1441cc2812341abf558e3d92395b53f0b3bfc52 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -601,7 +601,7 @@ class LLDebugText ypos += y_inc; - if (gSavedSettings.getBOOL("MeshEnabled")) + if (gMeshRepo.meshRezEnabled()) { addText(xpos, ypos, llformat("%.3f MB Mesh Data Received", LLMeshRepository::sBytesReceived/(1024.f*1024.f))); diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index ec2b5a4c9800cc7ac7bd3711bc7984971d04151a..1b53348b43b46836c050c16c1caa84ddbd297253 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -56,6 +56,7 @@ #include "lleditingmotion.h" #include "llemote.h" //#include "llfirstuse.h" +#include "llfloatertools.h" #include "llheadrotmotion.h" #include "llhudeffecttrail.h" #include "llhudmanager.h" @@ -1541,7 +1542,35 @@ BOOL LLVOAvatar::lineSegmentIntersect(const LLVector3& start, const LLVector3& e return TRUE; } } + + if (isSelf()) + { + for (attachment_map_t::iterator iter = mAttachmentPoints.begin(); + iter != mAttachmentPoints.end(); + ++iter) + { + LLViewerJointAttachment* attachment = iter->second; + + for (LLViewerJointAttachment::attachedobjs_vec_t::iterator attachment_iter = attachment->mAttachedObjects.begin(); + attachment_iter != attachment->mAttachedObjects.end(); + ++attachment_iter) + { + LLViewerObject* attached_object = (*attachment_iter); + + if (attached_object && !attached_object->isDead() && attachment->getValid()) + { + LLDrawable* drawable = attached_object->mDrawable; + if (drawable->isState(LLDrawable::RIGGED)) + { //regenerate octree for rigged attachment + gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_RIGGED, TRUE); + } + } + } + } + } } + + LLVector3 position; if (mNameText.notNull() && mNameText->lineSegmentIntersect(start, end, position)) @@ -1557,6 +1586,56 @@ BOOL LLVOAvatar::lineSegmentIntersect(const LLVector3& start, const LLVector3& e return FALSE; } +LLViewerObject* LLVOAvatar::lineSegmentIntersectRiggedAttachments(const LLVector3& start, const LLVector3& end, + S32 face, + BOOL pick_transparent, + S32* face_hit, + LLVector3* intersection, + LLVector2* tex_coord, + LLVector3* normal, + LLVector3* bi_normal) +{ + if (isSelf() && !gAgent.needsRenderAvatar()) + { + return NULL; + } + + LLViewerObject* hit = NULL; + + if (lineSegmentBoundingBox(start, end)) + { + LLVector3 local_end = end; + LLVector3 local_intersection; + + for (attachment_map_t::iterator iter = mAttachmentPoints.begin(); + iter != mAttachmentPoints.end(); + ++iter) + { + LLViewerJointAttachment* attachment = iter->second; + + for (LLViewerJointAttachment::attachedobjs_vec_t::iterator attachment_iter = attachment->mAttachedObjects.begin(); + attachment_iter != attachment->mAttachedObjects.end(); + ++attachment_iter) + { + LLViewerObject* attached_object = (*attachment_iter); + + if (attached_object->lineSegmentIntersect(start, local_end, face, pick_transparent, face_hit, &local_intersection, tex_coord, normal, bi_normal)) + { + local_end = local_intersection; + if (intersection) + { + *intersection = local_intersection; + } + + hit = attached_object; + } + } + } + } + + return hit; +} + //----------------------------------------------------------------------------- // parseSkeletonFile() //----------------------------------------------------------------------------- @@ -4968,19 +5047,6 @@ void LLVOAvatar::resetSpecificJointPosition( const std::string& name ) //----------------------------------------------------------------------------- void LLVOAvatar::resetJointPositionsToDefault( void ) { - const LLVector3& avPos = getCharacterPosition(); - - //Reposition the pelvis - LLJoint* pPelvis = mRoot.findJoint("mPelvis"); - if ( pPelvis ) - { - pPelvis->setPosition( avPos + pPelvis->getPosition() ); - } - else - { - llwarns<<"Can't get pelvis joint."<<llendl; - return; - } //Subsequent joints are relative to pelvis for( S32 i = 0; i < (S32)mNumJoints; ++i ) @@ -4991,7 +5057,7 @@ void LLVOAvatar::resetJointPositionsToDefault( void ) pJoint->setId( LLUUID::null ); //restore joints to default positions, however skip over the pelvis - if ( pJoint && pPelvis != pJoint ) + if ( pJoint ) { pJoint->restoreOldXform(); } @@ -6017,7 +6083,7 @@ void LLVOAvatar::cleanupAttachedMesh( LLViewerObject* pVO ) LLVOVolume* pVObj = pVO->mDrawable->getVOVolume(); if ( pVObj ) { - const LLMeshSkinInfo* pSkinData = gMeshRepo.getSkinInfo( pVObj->getVolume()->getParams().getSculptID() ); + const LLMeshSkinInfo* pSkinData = gMeshRepo.getSkinInfo( pVObj->getVolume()->getParams().getSculptID(), pVObj ); if ( pSkinData ) { const int jointCnt = pSkinData->mJointNames.size(); @@ -6028,6 +6094,14 @@ void LLVOAvatar::cleanupAttachedMesh( LLViewerObject* pVO ) if ( bindCnt > 0 ) { LLVOAvatar::resetJointPositionsToDefault(); + //Need to handle the repositioning of the cam, updating rig data etc during outfit editing + //This handles the case where we detach a replacement rig. + if ( gAgentCamera.cameraCustomizeAvatar() ) + { + gAgent.unpauseAnimation(); + //Still want to refocus on head bone + gAgentCamera.changeCameraToCustomizeAvatar(); + } } } } diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h index 295799fd247bf95a2c86f3bb999484ce2be9d799..03c0498a2ac94c5147e7dc89570b56e6ae9b3eae 100644 --- a/indra/newview/llvoavatar.h +++ b/indra/newview/llvoavatar.h @@ -145,6 +145,14 @@ class LLVOAvatar : LLVector2* tex_coord = NULL, // return the texture coordinates of the intersection point LLVector3* normal = NULL, // return the surface normal at the intersection point LLVector3* bi_normal = NULL); // return the surface bi-normal at the intersection point + LLViewerObject* lineSegmentIntersectRiggedAttachments(const LLVector3& start, const LLVector3& end, + S32 face = -1, // which face to check, -1 = ALL_SIDES + BOOL pick_transparent = FALSE, + S32* face_hit = NULL, // which face was hit + LLVector3* intersection = NULL, // return the intersection point + LLVector2* tex_coord = NULL, // return the texture coordinates of the intersection point + LLVector3* normal = NULL, // return the surface normal at the intersection point + LLVector3* bi_normal = NULL); // return the surface bi-normal at the intersection point //-------------------------------------------------------------------- // LLCharacter interface and related diff --git a/indra/newview/llvocache.cpp b/indra/newview/llvocache.cpp index bbb19a63f1413f5f33deb5d0a7fb9921447e4359..f0b5b50febbe2aecca2c36d3f5a587a806d5b330 100644 --- a/indra/newview/llvocache.cpp +++ b/indra/newview/llvocache.cpp @@ -137,10 +137,6 @@ LLVOCacheEntry::LLVOCacheEntry(LLAPRFile* apr_file) LLVOCacheEntry::~LLVOCacheEntry() { - if(mBuffer != mDP.getBuffer()) - { - delete[] mBuffer ; //just in case - } mDP.freeBuffer(); } diff --git a/indra/newview/llvoclouds.cpp b/indra/newview/llvoclouds.cpp index 78aa6e6ab8a5fa6b4365a5a7b96f98b5a67e9cb5..478708cd7832f522ee4f027e297470f8343e4bd2 100644 --- a/indra/newview/llvoclouds.cpp +++ b/indra/newview/llvoclouds.cpp @@ -244,9 +244,13 @@ void LLVOClouds::getGeometry(S32 te, vtx[2] = puff_pos_agent + right + up; vtx[3] = puff_pos_agent + right - up; + verticesp->mV[3] = 0.f; *verticesp++ = vtx[0]; + verticesp->mV[3] = 0.f; *verticesp++ = vtx[1]; + verticesp->mV[3] = 0.f; *verticesp++ = vtx[2]; + verticesp->mV[3] = 0.f; *verticesp++ = vtx[3]; *texcoordsp++ = uvs[0]; diff --git a/indra/newview/llvopartgroup.cpp b/indra/newview/llvopartgroup.cpp index 6f354b78b1e1fa953e105dc98fd1e6330cd9e3d7..a4b0910c926c0abb839fcc7f4d097e43077cfccf 100644 --- a/indra/newview/llvopartgroup.cpp +++ b/indra/newview/llvopartgroup.cpp @@ -324,10 +324,18 @@ void LLVOPartGroup::getGeometry(S32 idx, LLVector3 normal = -LLViewerCamera::getInstance()->getXAxis(); - + + //HACK -- the verticesp->mV[3] = 0.f here are to set the texture index to 0 (particles don't use texture batching, maybe they should) + // this works because there is actually a 4th float stored after the vertex position which is used as a texture index + // also, somebody please VECTORIZE THIS + + verticesp->mV[3] = 0.f; *verticesp++ = part_pos_agent + up - right; + verticesp->mV[3] = 0.f; *verticesp++ = part_pos_agent - up - right; + verticesp->mV[3] = 0.f; *verticesp++ = part_pos_agent + up + right; + verticesp->mV[3] = 0.f; *verticesp++ = part_pos_agent - up + right; *colorsp++ = part.mColor; @@ -360,7 +368,7 @@ U32 LLVOPartGroup::getPartitionType() const } LLParticlePartition::LLParticlePartition() -: LLSpatialPartition(LLDrawPoolAlpha::VERTEX_DATA_MASK, TRUE, GL_STREAM_DRAW_ARB) +: LLSpatialPartition(LLDrawPoolAlpha::VERTEX_DATA_MASK | LLVertexBuffer::MAP_TEXTURE_INDEX, TRUE, GL_STREAM_DRAW_ARB) { mRenderPass = LLRenderPass::PASS_ALPHA; mDrawableType = LLPipeline::RENDER_TYPE_PARTICLES; @@ -418,6 +426,7 @@ void LLParticlePartition::addGeometryCount(LLSpatialGroup* group, U32& vertex_co mFaceList.push_back(facep); vertex_count += facep->getGeomCount(); index_count += facep->getIndicesCount(); + llassert(facep->getIndicesCount() < 65536); } obj->mDepth /= count; diff --git a/indra/newview/llvosky.cpp b/indra/newview/llvosky.cpp index 6396bc042dba7fc9f4b01559b83adfb9fc25ae99..800af26b698c966f71926005ac293673a62f64fe 100644 --- a/indra/newview/llvosky.cpp +++ b/indra/newview/llvosky.cpp @@ -1483,6 +1483,8 @@ BOOL LLVOSky::updateHeavenlyBodyGeometry(LLDrawable *drawable, const S32 f, cons facep->setVertexBuffer(buff); } + llassert(facep->getVertexBuffer()->getNumIndices() == 6); + index_offset = facep->getGeometry(verticesp,normalsp,texCoordsp, indicesp); if (-1 == index_offset) diff --git a/indra/newview/llvosurfacepatch.cpp b/indra/newview/llvosurfacepatch.cpp index dbcd4f50cadf6549509afcd1aee89ee4dd79601d..510525259f4c9a6f64fee619aafb1785880adf12 100644 --- a/indra/newview/llvosurfacepatch.cpp +++ b/indra/newview/llvosurfacepatch.cpp @@ -375,6 +375,8 @@ void LLVOSurfacePatch::updateMainGeometry(LLFace *facep, S32 num_vertices, num_indices; U32 index; + llassert(mLastStride > 0); + render_stride = mLastStride; patch_size = mPatchp->getSurface()->getGridsPerPatchEdge(); S32 vert_size = patch_size / render_stride; diff --git a/indra/newview/llvotree.cpp b/indra/newview/llvotree.cpp index 8946d4e0b60c2f0f0ba91aa1a827ff5b573f712e..3c7fe708e61e5537d342c72f269567777e426914 100644 --- a/indra/newview/llvotree.cpp +++ b/indra/newview/llvotree.cpp @@ -980,11 +980,6 @@ void LLVOTree::appendMesh(LLStrider<LLVector3>& vertices, for (S32 i = 0; i < index_count; i++) { U16 index = index_offset + i; - if (idx[index] >= vert_start + vert_count || - idx[index] < vert_start) - { - llerrs << "WTF?" << llendl; - } *indices++ = idx[index]-vert_start+cur_idx; } diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp index e9a8c9b80aab16c5feccf7f1834cb8fd97b0d68b..c5e2c56e4b298a8de20d4a09a0c0f525c33160de 100644 --- a/indra/newview/llvovolume.cpp +++ b/indra/newview/llvovolume.cpp @@ -73,6 +73,7 @@ #include "llagent.h" #include "llviewermediafocus.h" #include "lldatapacker.h" +#include "llviewershadermgr.h" #include "llvoavatar.h" #include "llvocache.h" @@ -1095,8 +1096,6 @@ void LLVOVolume::updateSculptTexture() } - - void LLVOVolume::notifyMeshLoaded() { mSculptChanged = TRUE; @@ -1222,7 +1221,7 @@ BOOL LLVOVolume::calcLOD() } //hold onto unmodified distance for debugging - F32 debug_distance = distance; + //F32 debug_distance = distance; distance *= sDistanceFactor; @@ -1245,7 +1244,9 @@ BOOL LLVOVolume::calcLOD() if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_LOD_INFO)) { - setDebugText(llformat("%.2f:%.2f, %d", debug_distance, radius, cur_detail)); + //setDebugText(llformat("%.2f:%.2f, %d", debug_distance, radius, cur_detail)); + + setDebugText(llformat("%d", mDrawable->getFace(0)->getTextureIndex())); } if (cur_detail != mLOD) @@ -1274,6 +1275,15 @@ BOOL LLVOVolume::updateLOD() gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_VOLUME, FALSE); mLODChanged = TRUE; } + else + { + F32 new_radius = getBinRadius(); + F32 old_radius = mDrawable->getBinRadius(); + if (new_radius < old_radius * 0.9f || new_radius > old_radius*1.1f) + { + gPipeline.markPartitionMove(mDrawable); + } + } lod_changed = lod_changed || LLViewerObject::updateLOD(); @@ -3086,16 +3096,28 @@ U32 LLVOVolume::getRenderCost(std::set<LLUUID> &textures) const F32 LLVOVolume::getStreamingCost(S32* bytes, S32* visible_bytes) { + F32 radius = getScale().length(); + if (isMesh()) { LLSD& header = gMeshRepo.getMeshHeader(getVolume()->getParams().getSculptID()); - F32 radius = getScale().length(); - return LLMeshRepository::getStreamingCost(header, radius, bytes, visible_bytes, mLOD); } - - return 0.f; + else + { + LLVolume* volume = getVolume(); + S32 counts[4]; + LLVolume::getLoDTriangleCounts(volume->getParams(), counts); + + LLSD header; + header["lowest_lod"]["size"] = counts[0] * 10; + header["low_lod"]["size"] = counts[1] * 10; + header["medium_lod"]["size"] = counts[2] * 10; + header["high_lod"]["size"] = counts[3] * 10; + + return LLMeshRepository::getStreamingCost(header, radius); + } } U32 LLVOVolume::getTriangleCount() @@ -3187,6 +3209,10 @@ F32 LLVOVolume::getBinRadius() F32 scale = 1.f; + S32 size_factor = llmax(gSavedSettings.getS32("OctreeStaticObjectSizeFactor"), 1); + S32 attachment_size_factor = llmax(gSavedSettings.getS32("OctreeAttachmentSizeFactor"), 1); + LLVector3 distance_factor = gSavedSettings.getVector3("OctreeDistanceFactor"); + LLVector3 alpha_distance_factor = gSavedSettings.getVector3("OctreeAlphaDistanceFactor"); const LLVector4a* ext = mDrawable->getSpatialExtents(); BOOL shrink_wrap = mDrawable->isAnimating(); @@ -3216,6 +3242,8 @@ F32 LLVOVolume::getBinRadius() radius = llmin(bounds.mV[1], bounds.mV[2]); radius = llmin(radius, bounds.mV[0]); radius *= 0.5f; + radius *= 1.f+mDrawable->mDistanceWRTCamera*alpha_distance_factor[1]; + radius += mDrawable->mDistanceWRTCamera*alpha_distance_factor[0]; } else if (shrink_wrap) { @@ -3226,24 +3254,19 @@ F32 LLVOVolume::getBinRadius() } else if (mDrawable->isStatic()) { - /*if (mDrawable->getRadius() < 2.0f) - { - radius = 16.f; - } - else - { - radius = llmax(mDrawable->getRadius(), 32.f); - }*/ - - radius = (((S32) mDrawable->getRadius())/2+1)*8; + radius = llmax((S32) mDrawable->getRadius(), 1)*size_factor; + radius *= 1.f + mDrawable->mDistanceWRTCamera * distance_factor[1]; + radius += mDrawable->mDistanceWRTCamera * distance_factor[0]; } else if (mDrawable->getVObj()->isAttachment()) { - radius = (((S32) (mDrawable->getRadius()*4)+1))*2; + radius = llmax((S32) mDrawable->getRadius(),1)*attachment_size_factor; } else { - radius = 8.f; + radius = mDrawable->getRadius(); + radius *= 1.f + mDrawable->mDistanceWRTCamera * distance_factor[1]; + radius += mDrawable->mDistanceWRTCamera * distance_factor[0]; } return llclamp(radius*scale, 0.5f, 256.f); @@ -3342,7 +3365,8 @@ BOOL LLVOVolume::lineSegmentIntersect(const LLVector3& start, const LLVector3& e { if (LLFloater::isVisible(gFloaterTools) && getAvatar()->isSelf()) { - gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_RIGGED, TRUE); + updateRiggedVolume(); + genBBoxes(FALSE); volume = mRiggedVolume; transform = false; } @@ -3521,7 +3545,7 @@ void LLVOVolume::updateRiggedVolume() LLVolume* volume = getVolume(); - const LLMeshSkinInfo* skin = gMeshRepo.getSkinInfo(volume->getParams().getSculptID()); + const LLMeshSkinInfo* skin = gMeshRepo.getSkinInfo(volume->getParams().getSculptID(), this); if (!skin) { @@ -3712,6 +3736,21 @@ LLVolumeBridge::LLVolumeBridge(LLDrawable* drawablep) mSlopRatio = 0.25f; } +bool can_batch_texture(LLFace* facep) +{ + if (facep->getTextureEntry()->getBumpmap()) + { //bump maps aren't worked into texture batching yet + return false; + } + + if (facep->isState(LLFace::TEXTURE_ANIM) && facep->getVirtualSize() > MIN_TEX_ANIM_SIZE) + { //texture animation breaks batches + return false; + } + + return true; +} + void LLVolumeGeometryManager::registerFace(LLSpatialGroup* group, LLFace* facep, U32 type) { LLMemType mt(LLMemType::MTYPE_SPACE_PARTITION); @@ -3762,12 +3801,36 @@ void LLVolumeGeometryManager::registerFace(LLSpatialGroup* group, LLFace* facep, LLViewerTexture* tex = facep->getTexture(); + U8 index = facep->getTextureIndex(); + + bool batchable = false; + + if (index < 255 && idx >= 0) + { + if (index < draw_vec[idx]->mTextureList.size()) + { + if (draw_vec[idx]->mTextureList[index].isNull()) + { + batchable = true; + draw_vec[idx]->mTextureList[index] = tex; + } + else if (draw_vec[idx]->mTextureList[index] == tex) + { //this face's texture index can be used with this batch + batchable = true; + } + } + else + { //texture list can be expanded to fit this texture index + batchable = true; + } + } + U8 glow = (U8) (facep->getTextureEntry()->getGlow() * 255); if (idx >= 0 && draw_vec[idx]->mVertexBuffer == facep->getVertexBuffer() && draw_vec[idx]->mEnd == facep->getGeomIndex()-1 && - (LLPipeline::sTextureBindTest || draw_vec[idx]->mTexture == tex) && + (LLPipeline::sTextureBindTest || draw_vec[idx]->mTexture == tex || batchable) && #if LL_DARWIN draw_vec[idx]->mEnd - draw_vec[idx]->mStart + facep->getGeomCount() <= (U32) gGLManager.mGLMaxVertexRange && draw_vec[idx]->mCount + facep->getIndicesCount() <= (U32) gGLManager.mGLMaxIndexRange && @@ -3781,6 +3844,12 @@ void LLVolumeGeometryManager::registerFace(LLSpatialGroup* group, LLFace* facep, draw_vec[idx]->mCount += facep->getIndicesCount(); draw_vec[idx]->mEnd += facep->getGeomCount(); draw_vec[idx]->mVSize = llmax(draw_vec[idx]->mVSize, facep->getVirtualSize()); + + if (index >= draw_vec[idx]->mTextureList.size()) + { + draw_vec[idx]->mTextureList.resize(index+1); + draw_vec[idx]->mTextureList[index] = tex; + } draw_vec[idx]->validate(); update_min_max(draw_vec[idx]->mExtents[0], draw_vec[idx]->mExtents[1], facep->mExtents[0]); update_min_max(draw_vec[idx]->mExtents[0], draw_vec[idx]->mExtents[1], facep->mExtents[1]); @@ -3811,6 +3880,11 @@ void LLVolumeGeometryManager::registerFace(LLSpatialGroup* group, LLFace* facep, draw_info->mDrawMode = LLRender::TRIANGLE_STRIP; } + if (index < 255) + { //initialize texture list for texture batching + draw_info->mTextureList.resize(index+1); + draw_info->mTextureList[index] = tex; + } draw_info->validate(); } } @@ -3910,7 +3984,7 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group) LLVOVolume* vobj = drawablep->getVOVolume(); - if (vobj->getVolume() && vobj->getVolume()->isTetrahedron()) + if (vobj->getVolume() && vobj->getVolume()->isTetrahedron() || (vobj->isMesh() && !gMeshRepo.meshRezEnabled())) { continue; } @@ -3923,7 +3997,7 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group) bool rigged = vobj->isAttachment() && vobj->isMesh() && - gMeshRepo.getSkinInfo(vobj->getVolume()->getParams().getSculptID()); + gMeshRepo.getSkinInfo(vobj->getVolume()->getParams().getSculptID(), vobj); bool bake_sunlight = LLPipeline::sBakeSunlight && drawablep->isStatic(); @@ -3965,7 +4039,7 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group) if ( pAvatarVO ) { LLUUID currentId = vobj->getVolume()->getParams().getSculptID(); - const LLMeshSkinInfo* pSkinData = gMeshRepo.getSkinInfo( currentId ); + const LLMeshSkinInfo* pSkinData = gMeshRepo.getSkinInfo( currentId, vobj ); if ( pSkinData ) { @@ -4233,15 +4307,24 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group) U32 bump_mask = LLVertexBuffer::MAP_TEXCOORD0 | LLVertexBuffer::MAP_TEXCOORD1 | LLVertexBuffer::MAP_NORMAL | LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_COLOR; U32 fullbright_mask = LLVertexBuffer::MAP_TEXCOORD0 | LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_COLOR; - if (LLPipeline::sRenderDeferred) + bool batch_textures = LLViewerShaderMgr::instance()->getVertexShaderLevel(LLViewerShaderMgr::SHADER_OBJECT) > 1; + + if (batch_textures) { bump_mask |= LLVertexBuffer::MAP_BINORMAL; + genDrawInfo(group, simple_mask | LLVertexBuffer::MAP_TEXTURE_INDEX, simple_faces, FALSE, TRUE); + genDrawInfo(group, fullbright_mask | LLVertexBuffer::MAP_TEXTURE_INDEX, fullbright_faces, FALSE, TRUE); + genDrawInfo(group, bump_mask | LLVertexBuffer::MAP_TEXTURE_INDEX, bump_faces, FALSE, TRUE); + genDrawInfo(group, alpha_mask | LLVertexBuffer::MAP_TEXTURE_INDEX, alpha_faces, TRUE, TRUE); + } + else + { + genDrawInfo(group, simple_mask, simple_faces); + genDrawInfo(group, fullbright_mask, fullbright_faces); + genDrawInfo(group, bump_mask, bump_faces, FALSE, TRUE); + genDrawInfo(group, alpha_mask, alpha_faces, TRUE); } - genDrawInfo(group, simple_mask, simple_faces); - genDrawInfo(group, bump_mask, bump_faces); - genDrawInfo(group, fullbright_mask, fullbright_faces); - genDrawInfo(group, alpha_mask, alpha_faces, TRUE); if (!LLPipeline::sDelayVBUpdate) { @@ -4297,11 +4380,6 @@ void LLVolumeGeometryManager::rebuildMesh(LLSpatialGroup* group) face->getGeometryVolume(*volume, face->getTEOffset(), vobj->getRelativeXform(), vobj->getRelativeXformInvTrans(), face->getGeomIndex()); } - - if (!face) - { - llerrs << "WTF?" << llendl; - } } drawablep->clearState(LLDrawable::REBUILD_ALL); @@ -4356,13 +4434,37 @@ void LLVolumeGeometryManager::rebuildMesh(LLSpatialGroup* group) group->clearState(LLSpatialGroup::MESH_DIRTY | LLSpatialGroup::NEW_DRAWINFO); } - if (group && group->isState(LLSpatialGroup::NEW_DRAWINFO)) + llassert(!group || !group->isState(LLSpatialGroup::NEW_DRAWINFO)); +} + +struct CompareBatchBreakerModified +{ + bool operator()(const LLFace* const& lhs, const LLFace* const& rhs) { - llerrs << "WTF?" << llendl; + const LLTextureEntry* lte = lhs->getTextureEntry(); + const LLTextureEntry* rte = rhs->getTextureEntry(); + + if (lte->getBumpmap() != rte->getBumpmap()) + { + return lte->getBumpmap() < rte->getBumpmap(); + } + else if (lte->getFullbright() != rte->getFullbright()) + { + return lte->getFullbright() < rte->getFullbright(); + } + else if (lte->getGlow() != rte->getGlow()) + { + return lte->getGlow() < rte->getGlow(); + } + else + { + return lhs->getTexture() < rhs->getTexture(); + } + } -} +}; -void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std::vector<LLFace*>& faces, BOOL distance_sort) +void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std::vector<LLFace*>& faces, BOOL distance_sort, BOOL batch_textures) { //calculate maximum number of vertices to store in a single buffer U32 max_vertices = (gSavedSettings.getS32("RenderMaxVBOSize")*1024)/LLVertexBuffer::calcVertexSize(group->mSpatialPartition->mVertexDataMask); @@ -4371,7 +4473,7 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std:: if (!distance_sort) { //sort faces by things that break batches - std::sort(faces.begin(), faces.end(), LLFace::CompareBatchBreaker()); + std::sort(faces.begin(), faces.end(), CompareBatchBreakerModified()); } else { @@ -4391,6 +4493,16 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std:: buffer_index = -1; } + S32 texture_index_channels = gGLManager.mNumTextureImageUnits-1; //always reserve one for shiny for now just for simplicity + + if (LLPipeline::sRenderDeferred && distance_sort) + { + texture_index_channels = gDeferredAlphaProgram.mFeatures.mIndexedTextureChannels; + } + + texture_index_channels = llmin(texture_index_channels, (S32) gSavedSettings.getU32("RenderMaxTextureIndex")); + + while (face_iter != faces.end()) { //pull off next face @@ -4421,24 +4533,101 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std:: std::vector<LLFace*>::iterator i = face_iter; ++i; - while (i != faces.end() && - (LLPipeline::sTextureBindTest || (distance_sort || (*i)->getTexture() == tex))) + std::vector<LLViewerTexture*> texture_list; + + if (batch_textures) { - facep = *i; - - if (geom_count + facep->getGeomCount() > max_vertices) - { //cut batches on geom count too big - break; + U8 cur_tex = 0; + facep->setTextureIndex(cur_tex); + texture_list.push_back(tex); + + //if (can_batch_texture(facep)) + { + while (i != faces.end()) + { + facep = *i; + if (facep->getTexture() != tex) + { + if (distance_sort) + { //textures might be out of order, see if texture exists in current batch + bool found = false; + for (U32 tex_idx = 0; tex_idx < texture_list.size(); ++tex_idx) + { + if (facep->getTexture() == texture_list[tex_idx]) + { + cur_tex = tex_idx; + found = true; + break; + } + } + + if (!found) + { + cur_tex = texture_list.size(); + } + } + else + { + cur_tex++; + } + + if (!can_batch_texture(facep)) + { //face is bump mapped or has an animated texture matrix -- can't + //batch more than 1 texture at a time + break; + } + + if (cur_tex >= texture_index_channels) + { //cut batches when index channels are depleted + break; + } + + tex = facep->getTexture(); + + texture_list.push_back(tex); + } + + if (geom_count + facep->getGeomCount() > max_vertices) + { //cut batches on geom count too big + break; + } + + ++i; + index_count += facep->getIndicesCount(); + geom_count += facep->getGeomCount(); + + facep->setTextureIndex(cur_tex); + } } - ++i; - index_count += facep->getIndicesCount(); - geom_count += facep->getGeomCount(); + tex = texture_list[0]; + } + else + { + while (i != faces.end() && + (LLPipeline::sTextureBindTest || (distance_sort || (*i)->getTexture() == tex))) + { + facep = *i; + + + //face has no texture index + facep->mDrawInfo = NULL; + facep->setTextureIndex(255); + + if (geom_count + facep->getGeomCount() > max_vertices) + { //cut batches on geom count too big + break; + } + + ++i; + index_count += facep->getIndicesCount(); + geom_count += facep->getGeomCount(); + } } //create/delete/resize vertex buffer if needed LLVertexBuffer* buffer = NULL; - LLSpatialGroup::buffer_texture_map_t::iterator found_iter = group->mBufferMap[mask].find(tex); + LLSpatialGroup::buffer_texture_map_t::iterator found_iter = group->mBufferMap[mask].find(*face_iter); if (found_iter != group->mBufferMap[mask].end()) { @@ -4469,7 +4658,7 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std:: } } - buffer_map[mask][tex].push_back(buffer); + buffer_map[mask][*face_iter].push_back(buffer); //add face geometry @@ -4483,6 +4672,11 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std:: facep->setGeomIndex(index_offset); facep->setVertexBuffer(buffer); + if (batch_textures && facep->getTextureIndex() == 255) + { + llerrs << "Invalid texture index." << llendl; + } + { //for debugging, set last time face was updated vs moved facep->updateRebuildFlags(); @@ -4495,12 +4689,8 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std:: U32 te_idx = facep->getTEOffset(); - if (facep->getGeometryVolume(*volume, te_idx, - vobj->getRelativeXform(), vobj->getRelativeXformInvTrans(), index_offset)) - { - buffer->markDirty(facep->getGeomIndex(), facep->getGeomCount(), - facep->getIndicesStart(), facep->getIndicesCount()); - } + facep->getGeometryVolume(*volume, te_idx, + vobj->getRelativeXform(), vobj->getRelativeXformInvTrans(), index_offset); } } @@ -4681,7 +4871,7 @@ void LLGeometryManager::addGeometryCount(LLSpatialGroup* group, U32 &vertex_coun { vertex_count += facep->getGeomCount(); index_count += facep->getIndicesCount(); - + llassert(facep->getIndicesCount() < 65536); //remember face (for sorting) mFaceList.push_back(facep); } diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index 845a87b8cff49fa020a6f7bcc00f14183c293b0d..e74bf2a6203d46a7ab7470744806d761902e2d47 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -392,6 +392,7 @@ void LLPipeline::init() { LLMemType mt(LLMemType::MTYPE_PIPELINE_INIT); + gOctreeMaxCapacity = gSavedSettings.getU32("OctreeMaxNodeCapacity"); sDynamicLOD = gSavedSettings.getBOOL("RenderDynamicLOD"); sRenderBump = gSavedSettings.getBOOL("RenderObjectBump"); sUseTriStrips = gSavedSettings.getBOOL("RenderUseTriStrips"); @@ -580,11 +581,6 @@ void LLPipeline::allocatePhysicsBuffer() if (mPhysicsDisplay.getWidth() != resX || mPhysicsDisplay.getHeight() != resY) { mPhysicsDisplay.allocate(resX, resY, GL_RGBA, TRUE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE); - if (mSampleBuffer.getWidth() == mPhysicsDisplay.getWidth() && - mSampleBuffer.getHeight() == mPhysicsDisplay.getHeight()) - { - mPhysicsDisplay.setSampleBuffer(&mSampleBuffer); - } } } @@ -594,8 +590,9 @@ void LLPipeline::allocateScreenBuffer(U32 resX, U32 resY) mScreenWidth = resX; mScreenHeight = resY; - //never use more than 4 samples for render targets - U32 samples = llmin(gSavedSettings.getU32("RenderFSAASamples"), (U32) 4); + //cap samples at 4 for render targets to avoid out of memory errors + U32 samples = gGLManager.getNumFBOFSAASamples(gSavedSettings.getU32("RenderFSAASamples")); + if (gGLManager.mIsATI) { //disable multisampling of render targets where ATI is involved samples = 0; @@ -621,11 +618,11 @@ void LLPipeline::allocateScreenBuffer(U32 resX, U32 resY) bool gi = LLViewerShaderMgr::instance()->getVertexShaderLevel(LLViewerShaderMgr::SHADER_DEFERRED); //allocate deferred rendering color buffers - mDeferredScreen.allocate(resX, resY, GL_RGBA, TRUE, TRUE, LLTexUnit::TT_RECT_TEXTURE, FALSE); - mDeferredDepth.allocate(resX, resY, 0, TRUE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE); + mDeferredScreen.allocate(resX, resY, GL_RGBA, TRUE, TRUE, LLTexUnit::TT_RECT_TEXTURE, FALSE, samples); + mDeferredDepth.allocate(resX, resY, 0, TRUE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE, samples); addDeferredAttachments(mDeferredScreen); - mScreen.allocate(resX, resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE); + mScreen.allocate(resX, resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE, samples); #if LL_DARWIN // As of OS X 10.6.7, Apple doesn't support multiple color formats in a single FBO @@ -636,7 +633,7 @@ void LLPipeline::allocateScreenBuffer(U32 resX, U32 resY) if (shadow_detail > 0 || ssao) { //only need mDeferredLight[0] for shadows OR ssao - mDeferredLight[0].allocate(resX, resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE); + mDeferredLight[0].allocate(resX, resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE); } else { @@ -645,7 +642,7 @@ void LLPipeline::allocateScreenBuffer(U32 resX, U32 resY) if (ssao) { //only need mDeferredLight[1] for ssao - mDeferredLight[1].allocate(resX, resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE); + mDeferredLight[1].allocate(resX, resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, false); } else { @@ -654,7 +651,7 @@ void LLPipeline::allocateScreenBuffer(U32 resX, U32 resY) if (gi) { //only need mDeferredLight[2] and mGIMapPost for gi - mDeferredLight[2].allocate(resX, resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE); + mDeferredLight[2].allocate(resX, resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, false); for (U32 i = 0; i < 2; i++) { #if LL_DARWIN @@ -744,35 +741,9 @@ void LLPipeline::allocateScreenBuffer(U32 resX, U32 resY) mScreen.allocate(resX, resY, GL_RGBA, TRUE, TRUE, LLTexUnit::TT_RECT_TEXTURE, FALSE); } - if (LLRenderTarget::sUseFBO && samples > 1) - { - mSampleBuffer.allocate(resX,resY,GL_RGBA,TRUE,TRUE,LLTexUnit::TT_RECT_TEXTURE,FALSE,samples); - if (LLPipeline::sRenderDeferred) - { - addDeferredAttachments(mSampleBuffer); - mDeferredScreen.setSampleBuffer(&mSampleBuffer); - mEdgeMap.setSampleBuffer(&mSampleBuffer); - } - - mScreen.setSampleBuffer(&mSampleBuffer); - - stop_glerror(); - } - else - { - mSampleBuffer.release(); - } - if (LLPipeline::sRenderDeferred) { //share depth buffer between deferred targets mDeferredScreen.shareDepthBuffer(mScreen); - for (U32 i = 0; i < 3; i++) - { //share stencil buffer with screen space lightmap to stencil out sky - if (mDeferredLight[i].getTexture(0)) - { - mDeferredScreen.shareDepthBuffer(mDeferredLight[i]); - } - } } gGL.getTexUnit(0)->disable(); @@ -802,16 +773,7 @@ void LLPipeline::updateRenderDeferred() //static void LLPipeline::refreshRenderDeferred() { - if(gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_PHYSICS_SHAPES)) - { - //turn the deferred rendering and glow off when draw physics shapes. - sRenderDeferred = FALSE ; - sRenderGlow = FALSE ; - } - else - { - updateRenderDeferred() ; - } + updateRenderDeferred(); } void LLPipeline::releaseGLBuffers() @@ -841,7 +803,6 @@ void LLPipeline::releaseGLBuffers() mScreen.release(); mPhysicsDisplay.release(); mUIScreen.release(); - mSampleBuffer.release(); mDeferredScreen.release(); mDeferredDepth.release(); for (U32 i = 0; i < 3; i++) @@ -2550,6 +2511,32 @@ void LLPipeline::markGLRebuild(LLGLUpdate* glu) } } +void LLPipeline::markPartitionMove(LLDrawable* drawable) +{ + if (!drawable->isState(LLDrawable::PARTITION_MOVE) && + !drawable->getPositionGroup().equals3(LLVector4a::getZero())) + { + drawable->setState(LLDrawable::PARTITION_MOVE); + mPartitionQ.push_back(drawable); + } +} + +void LLPipeline::processPartitionQ() +{ + for (LLDrawable::drawable_list_t::iterator iter = mPartitionQ.begin(); iter != mPartitionQ.end(); ++iter) + { + LLDrawable* drawable = *iter; + if (!drawable->isDead()) + { + drawable->updateBinRadius(); + drawable->movePartition(); + } + drawable->clearState(LLDrawable::PARTITION_MOVE); + } + + mPartitionQ.clear(); +} + void LLPipeline::markRebuild(LLSpatialGroup* group, BOOL priority) { LLMemType mt(LLMemType::MTYPE_PIPELINE); @@ -3610,7 +3597,7 @@ void LLPipeline::renderGeom(LLCamera& camera, BOOL forceVBOUpdate) if (gDebugGL) { check_stack_depth(stack_depth); - std::string msg = llformat("%s pass %d", gPoolNames[cur_type].c_str(), i); + std::string msg = llformat("pass %d", i); LLGLState::checkStates(msg); LLGLState::checkTextureChannels(msg); LLGLState::checkClientArrays(msg); @@ -4085,6 +4072,37 @@ void LLPipeline::renderDebug() bool hud_only = hasRenderType(LLPipeline::RENDER_TYPE_HUD); + if (!hud_only && !mDebugBlips.empty()) + { //render debug blips + glPointSize(8.f); + LLGLDepthTest depth(GL_TRUE, GL_TRUE, GL_ALWAYS); + + gGL.begin(LLRender::POINTS); + for (std::list<DebugBlip>::iterator iter = mDebugBlips.begin(); iter != mDebugBlips.end(); ) + { + DebugBlip& blip = *iter; + + blip.mAge += gFrameIntervalSeconds; + if (blip.mAge > 2.f) + { + mDebugBlips.erase(iter++); + } + else + { + iter++; + } + + blip.mPosition.mV[2] += gFrameIntervalSeconds*2.f; + + gGL.color4fv(blip.mColor.mV); + gGL.vertex3fv(blip.mPosition.mV); + } + gGL.end(); + gGL.flush(); + glPointSize(1.f); + } + + // Debug stuff. for (LLWorld::region_list_t::const_iterator iter = LLWorld::getInstance()->getRegionList().begin(); iter != LLWorld::getInstance()->getRegionList().end(); ++iter) @@ -5919,7 +5937,6 @@ LLSpatialPartition* LLPipeline::getSpatialPartition(LLViewerObject* vobj) return NULL; } - void LLPipeline::resetVertexBuffers(LLDrawable* drawable) { if (!drawable || drawable->isDead()) @@ -6065,7 +6082,8 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield) { LLMemType mt_ru(LLMemType::MTYPE_PIPELINE_RENDER_BLOOM); if (!(gPipeline.canUseVertexShaders() && - sRenderGlow)) + sRenderGlow) || + (!sRenderDeferred && hasRenderDebugMask(LLPipeline::RENDER_DEBUG_PHYSICS_SHAPES))) { return; } @@ -6111,67 +6129,7 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield) gGL.setColorMask(true, true); glClearColor(0,0,0,0); - - /*if (for_snapshot) - { - gGL.getTexUnit(0)->bind(&mGlow[1]); - { - //LLGLEnable stencil(GL_STENCIL_TEST); - //glStencilFunc(GL_NOTEQUAL, 255, 0xFFFFFFFF); - //glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); - //LLGLDisable blend(GL_BLEND); - - // If the snapshot is constructed from tiles, calculate which - // tile we're in. - - //from LLViewerCamera::setPerpsective - if (zoom_factor > 1.f) - { - int pos_y = subfield / llceil(zoom_factor); - int pos_x = subfield - (pos_y*llceil(zoom_factor)); - F32 size = 1.f/zoom_factor; - - tc1.set(pos_x*size, pos_y*size); - tc2 = tc1 + LLVector2(size,size); - } - else - { - tc2.set(1,1); - } - - LLGLEnable blend(GL_BLEND); - gGL.setSceneBlendType(LLRender::BT_ADD); - - - gGL.begin(LLRender::TRIANGLE_STRIP); - gGL.color4f(1,1,1,1); - gGL.texCoord2f(tc1.mV[0], tc1.mV[1]); - gGL.vertex2f(-1,-1); - - gGL.texCoord2f(tc1.mV[0], tc2.mV[1]); - gGL.vertex2f(-1,1); - - gGL.texCoord2f(tc2.mV[0], tc1.mV[1]); - gGL.vertex2f(1,-1); - - gGL.texCoord2f(tc2.mV[0], tc2.mV[1]); - gGL.vertex2f(1,1); - - gGL.end(); - - gGL.flush(); - gGL.setSceneBlendType(LLRender::BT_ALPHA); - } - - gGL.flush(); - glMatrixMode(GL_PROJECTION); - glPopMatrix(); - glMatrixMode(GL_MODELVIEW); - glPopMatrix(); - - return; - }*/ - + { { LLFastTimer ftm(FTM_RENDER_BLOOM_FBO); @@ -6195,11 +6153,8 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield) gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT); gGL.setSceneBlendType(LLRender::BT_ADD_WITH_ALPHA); - gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); - gGL.getTexUnit(0)->disable(); - gGL.getTexUnit(0)->enable(LLTexUnit::TT_RECT_TEXTURE); - gGL.getTexUnit(0)->bind(&mScreen); - + mScreen.bindTexture(0, 0); + gGL.color4f(1,1,1,1); gPipeline.enableLightsFullbright(LLColor4(1,1,1,1)); gGL.begin(LLRender::TRIANGLE_STRIP); @@ -6214,7 +6169,7 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield) gGL.end(); - gGL.getTexUnit(0)->enable(LLTexUnit::TT_TEXTURE); + gGL.getTexUnit(0)->unbind(mScreen.getUsage()); mGlow[2].flush(); } @@ -6242,7 +6197,6 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield) for (S32 i = 0; i < kernel; i++) { - gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); { LLFastTimer ftm(FTM_RENDER_BLOOM_FBO); mGlow[i%2].bindTarget(); @@ -6303,9 +6257,9 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield) LLVertexBuffer::unbind(); - if (LLPipeline::sRenderDeferred && !LLViewerCamera::getInstance()->cameraUnderWater()) + if (LLPipeline::sRenderDeferred) { - bool dof_enabled = true; + bool dof_enabled = !LLViewerCamera::getInstance()->cameraUnderWater(); LLGLSLShader* shader = &gDeferredPostProgram; if (LLViewerShaderMgr::instance()->getVertexShaderLevel(LLViewerShaderMgr::SHADER_DEFERRED) > 2) @@ -6313,7 +6267,7 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield) shader = &gDeferredGIFinalProgram; dof_enabled = false; } - else if (LLToolMgr::getInstance()->inBuildMode() || !gSavedSettings.getBOOL("RenderDepthOfField")) + else if (!dof_enabled || LLToolMgr::getInstance()->inBuildMode() || !gSavedSettings.getBOOL("RenderDepthOfField")) { //squish focal length when in build mode (or if DoF is disabled) so DoF doesn't make editing objects difficult shader = &gDeferredPostNoDoFProgram; dof_enabled = false; @@ -6435,11 +6389,10 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield) shader->uniform1f("magnification", magnification); } - S32 channel = shader->enableTexture(LLViewerShaderMgr::DEFERRED_DIFFUSE, LLTexUnit::TT_RECT_TEXTURE); + S32 channel = shader->enableTexture(LLViewerShaderMgr::DEFERRED_DIFFUSE, mScreen.getUsage()); if (channel > -1) { mScreen.bindTexture(0, channel); - gGL.getTexUnit(0)->setTextureFilteringOption(LLTexUnit::TFO_BILINEAR); } //channel = shader->enableTexture(LLViewerShaderMgr::DEFERRED_DEPTH, LLTexUnit::TT_RECT_TEXTURE); //if (channel > -1) @@ -6532,6 +6485,8 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield) if (hasRenderDebugMask(LLPipeline::RENDER_DEBUG_PHYSICS_SHAPES)) { + gGL.setColorMask(true, false); + LLVector2 tc1(0,0); LLVector2 tc2((F32) gViewerWindow->getWorldViewWidthRaw()*2, (F32) gViewerWindow->getWorldViewHeightRaw()*2); @@ -6578,25 +6533,23 @@ void LLPipeline::bindDeferredShader(LLGLSLShader& shader, U32 light_index, LLRen noise_map = mNoiseMap; } - LLGLState::checkTextureChannels(); - shader.bind(); S32 channel = 0; - channel = shader.enableTexture(LLViewerShaderMgr::DEFERRED_DIFFUSE, LLTexUnit::TT_RECT_TEXTURE); + channel = shader.enableTexture(LLViewerShaderMgr::DEFERRED_DIFFUSE, mDeferredScreen.getUsage()); if (channel > -1) { mDeferredScreen.bindTexture(0,channel); gGL.getTexUnit(channel)->setTextureFilteringOption(LLTexUnit::TFO_POINT); } - channel = shader.enableTexture(LLViewerShaderMgr::DEFERRED_SPECULAR, LLTexUnit::TT_RECT_TEXTURE); + channel = shader.enableTexture(LLViewerShaderMgr::DEFERRED_SPECULAR, mDeferredScreen.getUsage()); if (channel > -1) { mDeferredScreen.bindTexture(1, channel); gGL.getTexUnit(channel)->setTextureFilteringOption(LLTexUnit::TFO_POINT); } - channel = shader.enableTexture(LLViewerShaderMgr::DEFERRED_NORMAL, LLTexUnit::TT_RECT_TEXTURE); + channel = shader.enableTexture(LLViewerShaderMgr::DEFERRED_NORMAL, mDeferredScreen.getUsage()); if (channel > -1) { mDeferredScreen.bindTexture(2, channel); @@ -6719,22 +6672,16 @@ void LLPipeline::bindDeferredShader(LLGLSLShader& shader, U32 light_index, LLRen shader.uniformMatrix4fv("gi_norm_mat", 1, FALSE, mGINormalMatrix.m); } } - - /*channel = shader.enableTexture(LLViewerShaderMgr::DEFERRED_POSITION, LLTexUnit::TT_RECT_TEXTURE); - if (channel > -1) - { - mDeferredScreen.bindTexture(3, channel); - }*/ + stop_glerror(); - channel = shader.enableTexture(LLViewerShaderMgr::DEFERRED_DEPTH, LLTexUnit::TT_RECT_TEXTURE); + channel = shader.enableTexture(LLViewerShaderMgr::DEFERRED_DEPTH, mDeferredDepth.getUsage()); if (channel > -1) { gGL.getTexUnit(channel)->bind(&mDeferredDepth, TRUE); - gGL.getTexUnit(channel)->setTextureFilteringOption(LLTexUnit::TFO_POINT); stop_glerror(); - glTexParameteri(LLTexUnit::getInternalType(mDeferredDepth.getUsage()), GL_TEXTURE_COMPARE_MODE_ARB, GL_NONE); - glTexParameteri(LLTexUnit::getInternalType(mDeferredDepth.getUsage()), GL_DEPTH_TEXTURE_MODE_ARB, GL_ALPHA); + //glTexParameteri(LLTexUnit::getInternalType(mDeferredDepth.getUsage()), GL_TEXTURE_COMPARE_MODE_ARB, GL_NONE); + //glTexParameteri(LLTexUnit::getInternalType(mDeferredDepth.getUsage()), GL_DEPTH_TEXTURE_MODE_ARB, GL_ALPHA); stop_glerror(); @@ -6763,7 +6710,7 @@ void LLPipeline::bindDeferredShader(LLGLSLShader& shader, U32 light_index, LLRen stop_glerror(); - channel = shader.enableTexture(LLViewerShaderMgr::DEFERRED_LIGHT, LLTexUnit::TT_RECT_TEXTURE); + channel = shader.enableTexture(LLViewerShaderMgr::DEFERRED_LIGHT, mDeferredLight[light_index].getUsage()); if (channel > -1) { mDeferredLight[light_index].bindTexture(0, channel); @@ -6983,9 +6930,9 @@ void LLPipeline::renderDeferredLighting() } //ati doesn't seem to love actually using the stencil buffer on FBO's - LLGLEnable stencil(GL_STENCIL_TEST); - glStencilFunc(GL_EQUAL, 1, 0xFFFFFFFF); - glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); + LLGLDisable stencil(GL_STENCIL_TEST); + //glStencilFunc(GL_EQUAL, 1, 0xFFFFFFFF); + //glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); gGL.setColorMask(true, true); @@ -7787,33 +7734,41 @@ void LLPipeline::setupSpotLight(LLGLSLShader& shader, LLDrawable* drawablep) LLViewerTexture* img = volume->getLightTexture(); + if (img == NULL) + { + img = LLViewerFetchedTexture::sWhiteImagep; + } + S32 channel = shader.enableTexture(LLViewerShaderMgr::DEFERRED_PROJECTION); - if (channel > -1 && img) + if (channel > -1) { - gGL.getTexUnit(channel)->bind(img); + if (img) + { + gGL.getTexUnit(channel)->bind(img); - F32 lod_range = logf(img->getWidth())/logf(2.f); + F32 lod_range = logf(img->getWidth())/logf(2.f); - shader.uniform1f("proj_focus", focus); - shader.uniform1f("proj_lod", lod_range); - shader.uniform1f("proj_ambient_lod", llclamp((proj_range-focus)/proj_range*lod_range, 0.f, 1.f)); + shader.uniform1f("proj_focus", focus); + shader.uniform1f("proj_lod", lod_range); + shader.uniform1f("proj_ambient_lod", llclamp((proj_range-focus)/proj_range*lod_range, 0.f, 1.f)); + } } + } void LLPipeline::unbindDeferredShader(LLGLSLShader &shader) { stop_glerror(); - shader.disableTexture(LLViewerShaderMgr::DEFERRED_POSITION, LLTexUnit::TT_RECT_TEXTURE); - shader.disableTexture(LLViewerShaderMgr::DEFERRED_NORMAL, LLTexUnit::TT_RECT_TEXTURE); - shader.disableTexture(LLViewerShaderMgr::DEFERRED_DIFFUSE, LLTexUnit::TT_RECT_TEXTURE); - shader.disableTexture(LLViewerShaderMgr::DEFERRED_SPECULAR, LLTexUnit::TT_RECT_TEXTURE); - shader.disableTexture(LLViewerShaderMgr::DEFERRED_DEPTH, LLTexUnit::TT_RECT_TEXTURE); - shader.disableTexture(LLViewerShaderMgr::DEFERRED_LIGHT, LLTexUnit::TT_RECT_TEXTURE); + shader.disableTexture(LLViewerShaderMgr::DEFERRED_NORMAL, mDeferredScreen.getUsage()); + shader.disableTexture(LLViewerShaderMgr::DEFERRED_DIFFUSE, mDeferredScreen.getUsage()); + shader.disableTexture(LLViewerShaderMgr::DEFERRED_SPECULAR, mDeferredScreen.getUsage()); + shader.disableTexture(LLViewerShaderMgr::DEFERRED_DEPTH, mDeferredScreen.getUsage()); + shader.disableTexture(LLViewerShaderMgr::DEFERRED_LIGHT, mDeferredLight[0].getUsage()); shader.disableTexture(LLViewerShaderMgr::DEFERRED_GI_LIGHT, LLTexUnit::TT_RECT_TEXTURE); - shader.disableTexture(LLViewerShaderMgr::DEFERRED_EDGE, LLTexUnit::TT_RECT_TEXTURE); - shader.disableTexture(LLViewerShaderMgr::DEFERRED_SUN_LIGHT, LLTexUnit::TT_RECT_TEXTURE); - shader.disableTexture(LLViewerShaderMgr::DEFERRED_LOCAL_LIGHT, LLTexUnit::TT_RECT_TEXTURE); + shader.disableTexture(LLViewerShaderMgr::DEFERRED_EDGE, mEdgeMap.getUsage()); + shader.disableTexture(LLViewerShaderMgr::DEFERRED_SUN_LIGHT, mDeferredLight[1].getUsage()); + shader.disableTexture(LLViewerShaderMgr::DEFERRED_LOCAL_LIGHT, mDeferredLight[2].getUsage()); shader.disableTexture(LLViewerShaderMgr::DEFERRED_LUMINANCE); shader.disableTexture(LLViewerShaderMgr::DIFFUSE_MAP); shader.disableTexture(LLViewerShaderMgr::DEFERRED_GI_MIP); @@ -7860,8 +7815,6 @@ void LLPipeline::unbindDeferredShader(LLGLSLShader &shader) gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); gGL.getTexUnit(0)->activate(); shader.unbind(); - - LLGLState::checkTextureChannels(); } inline float sgn(float a) @@ -9409,6 +9362,11 @@ void LLPipeline::generateSunShadow(LLCamera& camera) mShadow[i+4].flush(); } } + else + { //no spotlight shadows + mShadowSpotLight[0] = mShadowSpotLight[1] = NULL; + } + if (!gSavedSettings.getBOOL("CameraOffset")) { @@ -9831,4 +9789,9 @@ void LLPipeline::clearRenderTypeMask(U32 type, ...) } } +void LLPipeline::addDebugBlip(const LLVector3& position, const LLColor4& color) +{ + DebugBlip blip(position, color); + mDebugBlips.push_back(blip); +} diff --git a/indra/newview/pipeline.h b/indra/newview/pipeline.h index e9a250cd6d7ba3c7a53d81922e1b25ccd61c7557..e9da25e544b93e9d686e5c90300be610b6021a83 100644 --- a/indra/newview/pipeline.h +++ b/indra/newview/pipeline.h @@ -157,7 +157,8 @@ class LLPipeline void markGLRebuild(LLGLUpdate* glu); void markRebuild(LLSpatialGroup* group, BOOL priority = FALSE); void markRebuild(LLDrawable *drawablep, LLDrawable::EDrawableFlags flag = LLDrawable::REBUILD_ALL, BOOL priority = FALSE); - + void markPartitionMove(LLDrawable* drawablep); + //get the object between start and end that's closest to start. LLViewerObject* lineSegmentIntersectInWorld(const LLVector3& start, const LLVector3& end, BOOL pick_transparent, @@ -211,6 +212,7 @@ class LLPipeline void updateCull(LLCamera& camera, LLCullResult& result, S32 water_clip = 0, LLPlane* plane = NULL); //if water_clip is 0, ignore water plane, 1, cull to above plane, -1, cull to below plane void createObjects(F32 max_dtime); void createObject(LLViewerObject* vobj); + void processPartitionQ(); void updateGeom(F32 max_dtime); void updateGL(); void rebuildPriorityGroups(); @@ -358,6 +360,8 @@ class LLPipeline static void updateRenderDeferred(); static void refreshRenderDeferred(); + void addDebugBlip(const LLVector3& position, const LLColor4& color); + private: void unloadShaders(); void addToQuickLookup( LLDrawPool* new_poolp ); @@ -524,7 +528,6 @@ class LLPipeline LLRenderTarget mEdgeMap; LLRenderTarget mDeferredDepth; LLRenderTarget mDeferredLight[3]; - LLMultisampleBuffer mSampleBuffer; LLRenderTarget mGIMap; LLRenderTarget mGIMapPost[2]; LLRenderTarget mLuminanceMap; @@ -637,6 +640,9 @@ class LLPipeline LLDrawable::drawable_list_t mBuildQ2; // non-priority LLSpatialGroup::sg_vector_t mGroupQ1; //priority LLSpatialGroup::sg_vector_t mGroupQ2; // non-priority + + LLDrawable::drawable_list_t mPartitionQ; //drawables that need to update their spatial partition radius + bool mGroupQ2Locked; bool mGroupQ1Locked; @@ -726,6 +732,20 @@ class LLPipeline protected: std::vector<LLFace*> mSelectedFaces; + class DebugBlip + { + public: + LLColor4 mColor; + LLVector3 mPosition; + F32 mAge; + + DebugBlip(const LLVector3& position, const LLColor4& color) + : mColor(color), mPosition(position), mAge(0.f) + { } + }; + + std::list<DebugBlip> mDebugBlips; + LLPointer<LLViewerFetchedTexture> mFaceSelectImagep; U32 mLightMask; diff --git a/indra/newview/skins/default/xui/da/floater_about.xml b/indra/newview/skins/default/xui/da/floater_about.xml index 9b1df65d1bba9c180987258ec5eb0374a36cbefe..0ccaab73bafb02d312ca3d07dabd073fd8713229 100644 --- a/indra/newview/skins/default/xui/da/floater_about.xml +++ b/indra/newview/skins/default/xui/da/floater_about.xml @@ -56,24 +56,30 @@ Tak til følgende beboere: Drew Dwi, Zai Lynch, Latif Khalifa, Ellla McMahon, Ha <panel label="Licenser" name="licenses_panel"> <text_editor name="credits_editor"> 3Dconnexion SDK Copyright (C) 1992-2007 3Dconnexion - APR Copyright (C) 2000-2004 The Apache Software Foundation - cURL Copyright (C) 1996-2002, Daniel Stenberg, (daniel@haxx.se) - DBus/dbus-glib Copyright (C) 2002, 2003 CodeFactory AB / Copyright (C) 2003, 2004 Red Hat, Inc. - expat Copyright (C) 1998, 1999, 2000 Thai Open Source Software Center Ltd. - FreeType Copyright (C) 1996-2002, The FreeType Project (www.freetype.org). - GL Copyright (C) 1999-2004 Brian Paul. - Havok.com(TM) Copyright (C) 1999-2001, Telekinesys Research Limited. - jpeg2000 Copyright (C) 2001, David Taubman, The University of New South Wales (UNSW) - jpeglib Copyright (C) 1991-1998, Thomas G. Lane. - ogg/vorbis Copyright (C) 2001, Xiphophorus - OpenSSL Copyright (C) 1998-2002 The OpenSSL Project. - SDL Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga - SSLeay Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) - xmlrpc-epi Copyright (C) 2000 Epinions, Inc. - zlib Copyright (C) 1995-2002 Jean-loup Gailly and Mark Adler. - google-perftools Copyright (c) 2005, Google Inc. +APR Copyright (C) 2000-2004 The Apache Software Foundation +Collada DOM Copyright 2005 Sony Computer Entertainment Inc. +cURL Copyright (C) 1996-2002, Daniel Stenberg, (daniel@haxx.se) +DBus/dbus-glib Copyright (C) 2002, 2003 CodeFactory AB / Copyright (C) 2003, 2004 Red Hat, Inc. +expat Copyright (C) 1998, 1999, 2000 Thai Open Source Software Center Ltd. +FreeType Copyright (C) 1996-2002, The FreeType Project (www.freetype.org). +GL Copyright (C) 1999-2004 Brian Paul. +GLOD Copyright (C) 2003-04 Jonathan Cohen, Nat Duca, Chris Niski, Johns Hopkins University and David Luebke, Brenden Schubert, University of Virginia. +google-perftools Copyright (c) 2005, Google Inc. +Havok.com(TM) Copyright (C) 1999-2001, Telekinesys Research Limited. +jpeg2000 Copyright (C) 2001, David Taubman, The University of New South Wales (UNSW) +jpeglib Copyright (C) 1991-1998, Thomas G. Lane. +ogg/vorbis Copyright (C) 2001, Xiphophorus +OpenSSL Copyright (C) 1998-2002 The OpenSSL Project. +PCRE Copyright (c) 1997-2008 University of Cambridge +SDL Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga +SSLeay Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) +xmlrpc-epi Copyright (C) 2000 Epinions, Inc. +zlib Copyright (C) 1995-2002 Jean-loup Gailly and Mark Adler. +google-perftools Copyright (c) 2005, Google Inc. -Alle rettigheder forbeholdes. Se licenses.txt for detaljer. +Second Life Viewer uses Havok (TM) Physics. (c)Copyright 1999-2010 Havok.com Inc. (and its Licensors). All Rights Reserved. See www.havok.com for details. + +All rights reserved. See licenses.txt for details. Voice chat Audio coding: Polycom(R) Siren14(TM) (ITU-T Rec. G.722.1 Annex C) </text_editor> diff --git a/indra/newview/skins/default/xui/da/floater_about_land.xml b/indra/newview/skins/default/xui/da/floater_about_land.xml index 46e1eca126997e88ba0a9ce5782a60ca2a85ec85..5b9e618666e67c47899dc4e14c507f5765fdd418 100644 --- a/indra/newview/skins/default/xui/da/floater_about_land.xml +++ b/indra/newview/skins/default/xui/da/floater_about_land.xml @@ -346,6 +346,7 @@ Kun større parceller kan vises i søgning. <combo_box.item label="Parker & natur" name="item9"/> <combo_box.item label="Beboelse" name="item10"/> <combo_box.item label="Indkøb" name="item11"/> + <combo_box.item label="Leje" name="item13"/> <combo_box.item label="Andet" name="item12"/> </combo_box> <combo_box name="land category"> @@ -360,6 +361,7 @@ Kun større parceller kan vises i søgning. <combo_box.item label="Parker & natur" name="item9"/> <combo_box.item label="Beboelse" name="item10"/> <combo_box.item label="Indkøb" name="item11"/> + <combo_box.item label="Leje" name="item13"/> <combo_box.item label="Andet" name="item12"/> </combo_box> <check_box label="Mature indhold" name="MatureCheck" tool_tip=""/> @@ -426,7 +428,7 @@ Kun større parceller kan vises i søgning. (Defineret via estate) </panel.string> <panel.string name="allow_public_access"> - Tillad adgang for alle ([MATURITY]) + Tillad offentlig adgang ([MATURITY]) (Bemærk: Ellers oprettes blokeringslinier) </panel.string> <panel.string name="estate_override"> En eller flere af disse valg er indstillet pÃ¥ estate niveau diff --git a/indra/newview/skins/default/xui/da/floater_beacons.xml b/indra/newview/skins/default/xui/da/floater_beacons.xml index 8049b072cecb59ef8450a65f70158e0d2f2510a0..5100a6df1fce2bdd2b2bb4eddf94013a9a37310c 100644 --- a/indra/newview/skins/default/xui/da/floater_beacons.xml +++ b/indra/newview/skins/default/xui/da/floater_beacons.xml @@ -17,5 +17,6 @@ <check_box label="Kun berøring" name="touch_only"/> <check_box label="Lydkilder" name="sounds"/> <check_box label="Partikel kilder" name="particles"/> + <check_box label="Medie kilder" name="moapbeacon"/> </panel> </floater> diff --git a/indra/newview/skins/default/xui/da/floater_buy_contents.xml b/indra/newview/skins/default/xui/da/floater_buy_contents.xml index c2b2ccc24468fa3c8a5fd4ac84eeb0f3c60a2cbe..085fa2f9cc7342eb9dbd00671aa21ae4ff4d1707 100644 --- a/indra/newview/skins/default/xui/da/floater_buy_contents.xml +++ b/indra/newview/skins/default/xui/da/floater_buy_contents.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="floater_buy_contents" title="KØB INDHOLD"> <text name="contains_text"> - [NAME] indeholder: + <nolink>[NAME]</nolink> contains: </text> <text name="buy_text"> Køb for L$[AMOUNT] fra [NAME]? diff --git a/indra/newview/skins/default/xui/da/floater_import_collada.xml b/indra/newview/skins/default/xui/da/floater_import_collada.xml new file mode 100644 index 0000000000000000000000000000000000000000..ebc7c8638873c8d57d1dca5ab36b3715eccbab94 --- /dev/null +++ b/indra/newview/skins/default/xui/da/floater_import_collada.xml @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="Import Collada" title="Import Scene"> + <text name="mesh count"> + Meshes: [COUNT] + </text> + <text name="texture count"> + Textures: [COUNT] + </text> + <text name="status"> + Status: [STATUS] + </text> + <button label="Cancel" name="cancel"/> + <button label="OK" name="ok"/> + <string name="status_idle"> + Idle + </string> + <string name="status_uploading"> + Uploading [NAME] + </string> + <string name="status_creating"> + Creating object [NAME] + </string> +</floater> diff --git a/indra/newview/skins/default/xui/da/floater_inventory_view_finder.xml b/indra/newview/skins/default/xui/da/floater_inventory_view_finder.xml index af2910fe589690b40dfefa5086675a4ff3be6ee8..655701bb9624b72a890b51aa6a0ca2cb4c4783e7 100644 --- a/indra/newview/skins/default/xui/da/floater_inventory_view_finder.xml +++ b/indra/newview/skins/default/xui/da/floater_inventory_view_finder.xml @@ -1,24 +1,25 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="Inventory Finder" title="INVENTORY_RECENT_ITEMS"> - <check_box label="Animation" name="check_animation" /> - <check_box label="Visitkort" name="check_calling_card" /> - <check_box label="Tøj" name="check_clothing" /> - <check_box label="Bevægelser" name="check_gesture" /> - <check_box label="Landemærke" name="check_landmark" /> - <check_box label="Note" name="check_notecard" /> - <check_box label="Objekter" name="check_object" /> - <check_box label="Scripts" name="check_script" /> - <check_box label="Lyde" name="check_sound" /> - <check_box label="Teksturer" name="check_texture" /> - <check_box label="Foto's" name="check_snapshot" /> - <button label="Alle" label_selected="Alle" name="All" /> - <button label="Ingen" label_selected="Ingen" name="None" /> - <check_box label="Vis altid mapper" name="check_show_empty" /> - <check_box label="Siden sidste logoff" name="check_since_logoff" /> + <check_box label="Animation" name="check_animation"/> + <check_box label="Visitkort" name="check_calling_card"/> + <check_box label="Tøj" name="check_clothing"/> + <check_box label="Bevægelser" name="check_gesture"/> + <check_box label="Landemærke" name="check_landmark"/> + <check_box label="Meshes" name="check_mesh"/> + <check_box label="Note" name="check_notecard"/> + <check_box label="Objekter" name="check_object"/> + <check_box label="Scripts" name="check_script"/> + <check_box label="Lyde" name="check_sound"/> + <check_box label="Teksturer" name="check_texture"/> + <check_box label="Foto's" name="check_snapshot"/> + <button label="Alle" label_selected="Alle" name="All"/> + <button label="Ingen" label_selected="Ingen" name="None"/> + <check_box label="Vis altid mapper" name="check_show_empty"/> + <check_box label="Siden sidste logoff" name="check_since_logoff"/> <text name="- OR -"> - ELLER - </text> - <spinner label="Timer siden" name="spin_hours_ago" /> - <spinner label="Dage siden" name="spin_days_ago" /> - <button label="Luk" label_selected="Luk" name="Close" /> + <spinner label="Timer siden" name="spin_hours_ago"/> + <spinner label="Dage siden" name="spin_days_ago"/> + <button label="Luk" label_selected="Luk" name="Close"/> </floater> diff --git a/indra/newview/skins/default/xui/da/floater_map.xml b/indra/newview/skins/default/xui/da/floater_map.xml index 5df9bb5f6ea5d0bbe3b4c1bc2d25209ddf146f67..4912d73ba050f5efc77f1eb770937aa3c8d0edff 100644 --- a/indra/newview/skins/default/xui/da/floater_map.xml +++ b/indra/newview/skins/default/xui/da/floater_map.xml @@ -3,6 +3,9 @@ <floater.string name="ToolTipMsg"> [REGION](Dobbeltklik for at Ã¥bne kort, klik-og-træk for at panorere) </floater.string> + <floater.string name="AltToolTipMsg"> + [REGION](Dobbeltklik for at teleportere, træk for at panorere) + </floater.string> <floater.string name="mini_map_caption"> MINIKORT </floater.string> diff --git a/indra/newview/skins/default/xui/da/floater_model_preview.xml b/indra/newview/skins/default/xui/da/floater_model_preview.xml new file mode 100644 index 0000000000000000000000000000000000000000..a98c70ff522475bab4576967636bc53846e83f55 --- /dev/null +++ b/indra/newview/skins/default/xui/da/floater_model_preview.xml @@ -0,0 +1,231 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="Model Preview" title="Upload Model"> + <string name="status_idle"> + Idle + </string> + <string name="status_reading_file"> + Loading... + </string> + <string name="status_generating_meshes"> + Generating Meshes... + </string> + <string name="status_vertex_number_overflow"> + Error: Vertex number is more than 65534, aborted! + </string> + <string name="high"> + High + </string> + <string name="medium"> + Medium + </string> + <string name="low"> + Low + </string> + <string name="lowest"> + Lowest + </string> + <string name="mesh_status_good"> + Ship it! + </string> + <string name="mesh_status_na"> + N/A + </string> + <string name="mesh_status_none"> + None + </string> + <string name="mesh_status_submesh_mismatch"> + Levels of detail have a different number of textureable faces. + </string> + <string name="mesh_status_mesh_mismatch"> + Levels of detail have a different number of mesh instances. + </string> + <string name="mesh_status_too_many_vertices"> + Level of detail has too many vertices. + </string> + <string name="mesh_status_missing_lod"> + Missing required level of detail. + </string> + <string name="layer_all"> + All + </string> + <string name="decomposing"> + Analyzing... + </string> + <string name="simplifying"> + Simplifying... + </string> + <text name="name_label"> + Name: + </text> + <text name="lod_label"> + Preview: + </text> + <combo_box name="preview_lod_combo" tool_tip="LOD to view in preview render"> + <combo_item name="high"> + Level of Detail: High + </combo_item> + <combo_item name="medium"> + Level of Detail: Medium + </combo_item> + <combo_item name="low"> + Level of Detail: Low + </combo_item> + <combo_item name="lowest"> + Level of Detail: Lowest + </combo_item> + </combo_box> + <panel> + <text name="streaming cost"> + Resource Cost: [COST] + </text> + <text name="physics cost"> + Physics Cost: [COST] + </text> + <text name="upload fee"> + Upload Fee: N/A + </text> + </panel> + <text name="status"> + [STATUS] + </text> + <button label="Defaults" name="reset_btn" tool_tip="Reset to defaults"/> + <button label="Upload" name="ok_btn" tool_tip="Upload to simulator"/> + <button label="Cancel" name="cancel_btn"/> + <tab_container name="import_tab"> + <panel label="Level of Detail" name="lod_panel"> + <text name="lod_table_header"> + Select Level of Detail: + </text> + <text name="high_label" value="High"/> + <text name="high_triangles" value="0"/> + <text name="high_vertices" value="0"/> + <text name="medium_label" value="Medium"/> + <text name="medium_triangles" value="0"/> + <text name="medium_vertices" value="0"/> + <text name="low_label" value="Low"/> + <text name="low_triangles" value="0"/> + <text name="low_vertices" value="0"/> + <text name="lowest_label" value="Lowest"/> + <text name="lowest_triangles" value="0"/> + <text name="lowest_vertices" value="0"/> + <text name="lod_table_footer"> + Level of Detail: [DETAIL] + </text> + <radio_group name="lod_file_or_limit" value="lod_from_file"> + <radio_item label="Load from file" name="lod_from_file"/> + <radio_item label="Auto generate" name="lod_auto_generate"/> + <radio_item label="None" name="lod_none"/> + </radio_group> + <button label="Browse..." name="lod_browse"/> + <combo_box name="lod_mode"> + <combo_item name="triangle_limit"> + Triangle Limit + </combo_item> + <combo_item name="error_threshold"> + Error Threshold + </combo_item> + </combo_box> + <text name="build_operator_text"> + Build Operator: + </text> + <text name="queue_mode_text"> + Queue Mode: + </text> + <combo_box name="build_operator"> + <combo_item name="edge_collapse"> + Edge Collapse + </combo_item> + <combo_item name="half_edge_collapse"> + Half Edge Collapse + </combo_item> + </combo_box> + <combo_box name="queue_mode"> + <combo_item name="greedy"> + Greedy + </combo_item> + <combo_item name="lazy"> + Lazy + </combo_item> + <combo_item name="independent"> + Independent + </combo_item> + </combo_box> + <text name="border_mode_text"> + Border Mode: + </text> + <text name="share_tolderance_text"> + Share Tolerance: + </text> + <combo_box name="border_mode"> + <combo_item name="border_unlock"> + Unlock + </combo_item> + <combo_item name="border_lock"> + Lock + </combo_item> + </combo_box> + <text name="crease_label"> + Crease Angle: + </text> + <spinner name="crease_angle" value="75"/> + </panel> + <panel label="Physics" name="physics_panel"> + <panel name="physics geometry"> + <radio_group name="physics_load_radio" value="physics_load_from_file"> + <radio_item label="File:" name="physics_load_from_file"/> + <radio_item label="Use Level of Detail:" name="physics_use_lod"/> + </radio_group> + <combo_box name="physics_lod_combo" tool_tip="LOD to use for physics shape"> + <combo_item name="physics_lowest"> + Lowest + </combo_item> + <combo_item name="physics_low"> + Low + </combo_item> + <combo_item name="physics_medium"> + Medium + </combo_item> + <combo_item name="physics_high"> + High + </combo_item> + </combo_box> + <button label="Browse..." name="physics_browse"/> + </panel> + <panel name="physics analysis"> + <slider label="Smooth:" name="Smooth"/> + <check_box label="Close Holes (slow)" name="Close Holes (Slow)"/> + <button label="Analyze" name="Decompose"/> + <button label="Cancel" name="decompose_cancel"/> + </panel> + <panel name="physics simplification"> + <slider label="Passes:" name="Combine Quality"/> + <slider label="Detail Scale:" name="Detail Scale"/> + <slider label="Retain:" name="Retain%"/> + <button label="Simplify" name="Simplify"/> + <button label="Cancel" name="simplify_cancel"/> + </panel> + <panel name="physics info"> + <slider label="Preview Spread:" name="physics_explode"/> + <text name="physics_triangles"> + Triangles: [TRIANGLES] + </text> + <text name="physics_points"> + Vertices: [POINTS] + </text> + <text name="physics_hulls"> + Hulls: [HULLS] + </text> + </panel> + </panel> + <panel label="Modifiers" name="modifiers_panel"> + <spinner name="import_scale" value="1.0"/> + <text name="import_dimensions"> + [X] x [Y] x [Z] m + </text> + <check_box label="Textures" name="upload_textures"/> + <check_box label="Skin weight" name="upload_skin"/> + <check_box label="Joint positions" name="upload_joints"/> + <spinner name="pelvis_offset" value="0.0"/> + </panel> + </tab_container> +</floater> diff --git a/indra/newview/skins/default/xui/da/floater_model_wizard.xml b/indra/newview/skins/default/xui/da/floater_model_wizard.xml new file mode 100644 index 0000000000000000000000000000000000000000..8ad443581ac6fec32458a258a377392cb3026118 --- /dev/null +++ b/indra/newview/skins/default/xui/da/floater_model_wizard.xml @@ -0,0 +1,241 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="Model Wizard" title="UPLOAD MODEL WIZARD"> + <button label="5. Upload" name="upload_btn"/> + <button label="4. Review" name="review_btn"/> + <button label="3. Physics" name="physics2_btn"/> + <button label="3. Physics" name="physics_btn"/> + <button label="2. Optimize" name="optimize_btn"/> + <button label="1. Choose File" name="choose_file_btn"/> + <panel name="choose_file_panel"> + <panel name="header_panel"> + <text name="header_text"> + Upload Model + </text> + </panel> + <text name="description"> + This wizard will help you import mesh models to Second Life. First specify a file containing the model you wish to import. Second Life supports COLLADA (.dae) files. + </text> + <panel name="content"> + <text name="Cache location"> + Filename: + </text> + <button label="Browse..." label_selected="Browse..." name="browse"/> + <text name="dimensions"> + X: Y: Z: + </text> + <text name="dimension_dividers"> + | | + </text> + </panel> + </panel> + <panel name="optimize_panel"> + <panel name="header_panel"> + <text name="header_text"> + Optimize + </text> + </panel> + <text name="description"> + This wizard has optimized your model to improve performance. You may adjust the results of the optimization process bellow or click Next to continue. + </text> + <panel name="content"> + <text name="high_detail_text"> + Generate Level of Detail: High + </text> + <text name="medium_detail_text"> + Generate Level of Detail: Medium + </text> + <text name="low_detail_text"> + Generate Level of Detail: Low + </text> + <text name="lowest_detail_text"> + Generate Level of Detail: Lowest + </text> + </panel> + <panel name="content2"> + <text name="lod_label"> + Model Preview: + </text> + <combo_box name="preview_lod_combo2" tool_tip="LOD to view in preview render"> + <combo_item name="high"> + High + </combo_item> + <combo_item name="medium"> + Medium + </combo_item> + <combo_item name="low"> + Low + </combo_item> + <combo_item name="lowest"> + Lowest + </combo_item> + </combo_box> + <text name="streaming cost"> + Resource Cost: [COST] + </text> + <text name="dimensions"> + X: Y: Z: + </text> + <text name="dimension_dividers"> + | | + </text> + </panel> + </panel> + <panel name="physics_panel"> + <panel name="header_panel"> + <text name="header_text"> + Physics + </text> + </panel> + <text name="description"> + The wizard will create a physical shape, which determines how the object interacts with other objects and avatars. Set the slider to the detail level most appropriate for how your object will be used: + </text> + <panel name="content"> + <text name="streaming cost"> + Resource Cost: [COST] + </text> + </panel> + </panel> + <panel name="physics2_panel"> + <panel name="header_panel"> + <text name="header_text"> + Physics + </text> + </panel> + <text name="description"> + Preview the physics shape below then click Next to continue. To modify the physics shape, click the Back button. + </text> + <panel name="content"> + <text name="lod_label"> + Model Preview: + </text> + <combo_box name="preview_lod_combo3" tool_tip="LOD to view in preview render"> + <combo_item name="high"> + High + </combo_item> + <combo_item name="medium"> + Medium + </combo_item> + <combo_item name="low"> + Low + </combo_item> + <combo_item name="lowest"> + Lowest + </combo_item> + </combo_box> + <text name="dimensions"> + X: Y: Z: + </text> + <text name="dimension_dividers"> + | | + </text> + <text name="streaming cost"> + Resource Cost: [COST] + </text> + </panel> + </panel> + <panel name="review_panel"> + <panel name="header_panel"> + <text name="header_text"> + Review + </text> + </panel> + <text name="description"> + Review the details below then click. Upload to upload your model. Your L$ balance will be charged when you click Upload. + </text> + <panel name="content"> + <text name="lod_label"> + Model Preview: + </text> + <combo_box name="preview_lod_combo" tool_tip="LOD to view in preview render"> + <combo_item name="high"> + High + </combo_item> + <combo_item name="medium"> + Medium + </combo_item> + <combo_item name="low"> + Low + </combo_item> + <combo_item name="lowest"> + Lowest + </combo_item> + </combo_box> + <text name="dimensions"> + X: Y: Z: + </text> + <text name="dimension_dividers"> + | | + </text> + </panel> + <text name="streaming cost"> + Resource Cost: [COST] + </text> + <text name="physics cost"> + Physics Cost: [COST] + </text> + </panel> + <panel name="upload_panel"> + <panel name="header_panel"> + <text name="header_text"> + Upload Complete! + </text> + </panel> + <text name="description"> + Congratulations! Your model has been sucessfully uploaded. You will find the model in the Objects folder in your inventory. + </text> + </panel> + <button label="<< Back" name="back"/> + <button label="Next >>" name="next"/> + <button label="Upload" name="upload" tool_tip="Upload to simulator"/> + <button label="Cancel" name="cancel"/> + <button label="Close" name="close"/> + <spinner name="import_scale" value="1.0"/> + <string name="status_idle"> + Idle + </string> + <string name="status_reading_file"> + Loading... + </string> + <string name="status_generating_meshes"> + Generating Meshes... + </string> + <string name="status_vertex_number_overflow"> + Error: Vertex number is more than 65534, aborted! + </string> + <string name="high"> + High + </string> + <string name="medium"> + Medium + </string> + <string name="low"> + Low + </string> + <string name="lowest"> + Lowest + </string> + <string name="mesh_status_good"> + Ship it! + </string> + <string name="mesh_status_na"> + N/A + </string> + <string name="mesh_status_none"> + None + </string> + <string name="mesh_status_submesh_mismatch"> + Levels of detail have a different number of textureable faces. + </string> + <string name="mesh_status_mesh_mismatch"> + Levels of detail have a different number of mesh instances. + </string> + <string name="mesh_status_too_many_vertices"> + Level of detail has too many vertices. + </string> + <string name="mesh_status_missing_lod"> + Missing required level of detail. + </string> + <string name="layer_all"> + All + </string> +</floater> diff --git a/indra/newview/skins/default/xui/da/floater_price_for_listing.xml b/indra/newview/skins/default/xui/da/floater_price_for_listing.xml new file mode 100644 index 0000000000000000000000000000000000000000..b091fa09b56523723986d63b7b1e481636a8945b --- /dev/null +++ b/indra/newview/skins/default/xui/da/floater_price_for_listing.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="price_for_listing" title="PUBLISH CLASSIFIED AD"> + <text name="explanation_text"> + Din annonce vil løbe en uge fra udgivelsesdatoen. + +Placeringen af din annonce i listerne er afhængig af hvor meget du har valgt at betale. + +De annoncer der betales mest for vises øverst i lister og højere i søgeresultater. + </text> + <text name="price_text"> + Pris for annonce: + </text> + <text name="price_symbol"> + L$ + </text> + <button label="OK" name="set_price_btn"/> + <button label="Annullér" name="cancel_btn"/> +</floater> diff --git a/indra/newview/skins/default/xui/da/floater_sound_devices.xml b/indra/newview/skins/default/xui/da/floater_sound_devices.xml new file mode 100644 index 0000000000000000000000000000000000000000..cb4cbba57008a431b45bff6b54d96fe97a367ad9 --- /dev/null +++ b/indra/newview/skins/default/xui/da/floater_sound_devices.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_sound_devices" title="Lyd enheder"> + <text name="voice_label"> + Stemme chat + </text> + <check_box label="Aktiveret" name="enable_voice"/> +</floater> diff --git a/indra/newview/skins/default/xui/da/floater_tools.xml b/indra/newview/skins/default/xui/da/floater_tools.xml index 9e673d0d5b958d81c727b2a04bc40f6c30e09453..815bde456e36d499f0de9ea46a2dd2082afcba24 100644 --- a/indra/newview/skins/default/xui/da/floater_tools.xml +++ b/indra/newview/skins/default/xui/da/floater_tools.xml @@ -64,6 +64,8 @@ <radio_item label="Vælg overflade" name="radio select face"/> </radio_group> <check_box label="Redigér lænkede" name="checkbox edit linked parts"/> + <button label="Sammenkæd" name="link_btn"/> + <button label="Adskil" name="unlink_btn"/> <text name="RenderingCost" tool_tip="Hvis beregnede rendering omkostninger for dette objekt"> þ: [COUNT] </text> @@ -120,6 +122,18 @@ <text name="prim_count"> Prims: [COUNT] </text> + <text name="linked_set_count"> + Lænkede sæt: [COUNT] + </text> + <text name="linked_set_cost" tool_tip="Pris for nuværende valgte lænkede sæt som [prims] / [physics complexity]"> + Pris: [COST] / [PHYSICS] + </text> + <text name="object_count"> + Objekter: [COUNT] + </text> + <text name="object_cost" tool_tip="Pris for nuværende valgte objekter som [prims] / [physics complexity]"> + Pris: [COST] / [PHYSICS] + </text> <tab_container name="Object Info Tabs"> <panel label="Generelt" name="General"> <panel.string name="text deed continued"> @@ -264,15 +278,6 @@ <combo_box.item label="Ring" name="Ring"/> <combo_box.item label="Sculpted" name="Sculpted"/> </combo_box> - <combo_box name="material"> - <combo_box.item label="Sten" name="Stone"/> - <combo_box.item label="Metal" name="Metal"/> - <combo_box.item label="Glas" name="Glass"/> - <combo_box.item label="Træ" name="Wood"/> - <combo_box.item label="Kød" name="Flesh"/> - <combo_box.item label="Plastik" name="Plastic"/> - <combo_box.item label="Gummi" name="Rubber"/> - </combo_box> <text name="text cut"> Snit Z-akse (start/slut) </text> @@ -345,9 +350,19 @@ <combo_box.item label="Kuglering" name="Torus"/> <combo_box.item label="Plan" name="Plane"/> <combo_box.item label="Cylinder" name="Cylinder"/> + <combo_box.item label="Mesh" name="Mesh"/> </combo_box> </panel> <panel label="Features" name="Features"> + <panel.string name="None"> + Ingen + </panel.string> + <panel.string name="Prim"> + Prim + </panel.string> + <panel.string name="Convex Hull"> + Konveks skrog + </panel.string> <text name="select_single"> Vælg kun én prim for at ændre egenskaber. </text> @@ -372,6 +387,23 @@ <spinner label="Fokus" name="Light Focus"/> <spinner label="Udfasning" name="Light Falloff"/> <spinner label="Omgivelser" name="Light Ambiance"/> + <text name="label physicsshapetype"> + Fysisk form type: + </text> + <combo_box name="Physics Shape Type Combo Ctrl" tool_tip="Vælg fysisk form type"/> + <combo_box name="material"> + <combo_box.item label="Sten" name="Stone"/> + <combo_box.item label="Metal" name="Metal"/> + <combo_box.item label="Glas" name="Glass"/> + <combo_box.item label="Træ" name="Wood"/> + <combo_box.item label="Kød" name="Flesh"/> + <combo_box.item label="Plastik" name="Plastic"/> + <combo_box.item label="Gummi" name="Rubber"/> + </combo_box> + <spinner label="Tyngde" name="Physics Gravity"/> + <spinner label="Friktion" name="Physics Friction"/> + <spinner label="Tæthed" name="Physics Density"/> + <spinner label="Restitution" name="Physics Restitution"/> </panel> <panel label="Tekstur" name="Texture"> <panel.string name="string repeats per meter"> diff --git a/indra/newview/skins/default/xui/da/menu_attachment_self.xml b/indra/newview/skins/default/xui/da/menu_attachment_self.xml index 1c19435f9050793e1aa18635f0e9e9cc96ae9d89..35ba27f9e23c06730764a83a679c426ab6e9498b 100644 --- a/indra/newview/skins/default/xui/da/menu_attachment_self.xml +++ b/indra/newview/skins/default/xui/da/menu_attachment_self.xml @@ -5,7 +5,7 @@ <menu_item_call label="Tag af" name="Detach"/> <menu_item_call label="Sid ned" name="Sit Down Here"/> <menu_item_call label="StÃ¥ op" name="Stand Up"/> - <menu_item_call label="Skift sæt" name="Change Outfit"/> + <menu_item_call label="Udseende" name="Change Outfit"/> <menu_item_call label="Redigér mit sæt" name="Edit Outfit"/> <menu_item_call label="Redigér min figur" name="Edit My Shape"/> <menu_item_call label="Venner" name="Friends..."/> diff --git a/indra/newview/skins/default/xui/da/menu_avatar_self.xml b/indra/newview/skins/default/xui/da/menu_avatar_self.xml index 5a05a12b4e166132f301160ccad30fd1886ea2b8..4e6b42a7441937e93e3ce47067c254fcf9de3faa 100644 --- a/indra/newview/skins/default/xui/da/menu_avatar_self.xml +++ b/indra/newview/skins/default/xui/da/menu_avatar_self.xml @@ -14,6 +14,7 @@ <menu_item_call label="Undertrøje" name="Self Undershirt"/> <menu_item_call label="Underbukser" name="Self Underpants"/> <menu_item_call label="Tatovering" name="Self Tattoo"/> + <menu_item_call label="Fysik" name="Self Physics"/> <menu_item_call label="Alpha" name="Self Alpha"/> <menu_item_call label="Alt tøj" name="All Clothes"/> </context_menu> @@ -21,7 +22,7 @@ <context_menu label="Tag af" name="Object Detach"/> <menu_item_call label="Tag alt af" name="Detach All"/> </context_menu> - <menu_item_call label="Skift sæt" name="Chenge Outfit"/> + <menu_item_call label="Mit udseende" name="Chenge Outfit"/> <menu_item_call label="Redigér mit sæt" name="Edit Outfit"/> <menu_item_call label="Redigér min form" name="Edit My Shape"/> <menu_item_call label="Venner" name="Friends..."/> diff --git a/indra/newview/skins/default/xui/da/menu_bottomtray.xml b/indra/newview/skins/default/xui/da/menu_bottomtray.xml index e979e35a917916c0d8e13c743b1627e6466030a4..a0d74db36d525feab46d6a65f5941d94b6662eff 100644 --- a/indra/newview/skins/default/xui/da/menu_bottomtray.xml +++ b/indra/newview/skins/default/xui/da/menu_bottomtray.xml @@ -1,10 +1,10 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <menu name="hide_camera_move_controls_menu"> + <menu_item_check label="Tal knap" name="EnableVoiceChat"/> <menu_item_check label="Faste bevægelser" name="ShowGestureButton"/> <menu_item_check label="Bevægelse knap" name="ShowMoveButton"/> <menu_item_check label="Vis knap" name="ShowCameraButton"/> <menu_item_check label="Foto knap" name="ShowSnapshotButton"/> - <menu_item_check label="Sidepanel knap" name="ShowSidebarButton"/> <menu_item_check label="Bygge knap" name="ShowBuildButton"/> <menu_item_check label="Søge knap" name="ShowSearchButton"/> <menu_item_check label="Kort knap" name="ShowWorldMapButton"/> diff --git a/indra/newview/skins/default/xui/da/menu_inspect_avatar_gear.xml b/indra/newview/skins/default/xui/da/menu_inspect_avatar_gear.xml index 89111d49f14c3f9e4d3b1053fe07ca7dba876b30..8da35adb1b3a33cf60f901a9917491db7c6daaab 100644 --- a/indra/newview/skins/default/xui/da/menu_inspect_avatar_gear.xml +++ b/indra/newview/skins/default/xui/da/menu_inspect_avatar_gear.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8"?> -<menu name="Gear Menu"> +<toggleable_menu name="Gear Menu"> <menu_item_call label="Profil" name="view_profile"/> <menu_item_call label="Tilføj ven" name="add_friend"/> <menu_item_call label="Besked" name="im"/> @@ -11,9 +11,11 @@ <menu_item_call label="Rapportér" name="report"/> <menu_item_call label="Frys" name="freeze"/> <menu_item_call label="Smid ud" name="eject"/> + <menu_item_call label="Spark" name="kick"/> + <menu_item_call label="CSR" name="csr"/> <menu_item_call label="Debug teksturer" name="debug"/> <menu_item_call label="Find pÃ¥ kort" name="find_on_map"/> <menu_item_call label="Zoom ind" name="zoom_in"/> <menu_item_call label="Betal" name="pay"/> <menu_item_call label="Del" name="share"/> -</menu> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/da/menu_inspect_self_gear.xml b/indra/newview/skins/default/xui/da/menu_inspect_self_gear.xml index a2ddd116a7deeda27434c9eccad404f3013a6470..887c6484bc3b4d2292f5b8ca5c3d4c8167ee7650 100644 --- a/indra/newview/skins/default/xui/da/menu_inspect_self_gear.xml +++ b/indra/newview/skins/default/xui/da/menu_inspect_self_gear.xml @@ -1,10 +1,31 @@ -<?xml version="1.0" encoding="utf-8"?> -<menu name="Gear Menu"> - <menu_item_call label="Sid ned" name="sit_down_here"/> - <menu_item_call label="StÃ¥ op" name="stand_up"/> - <menu_item_call label="Skift sæt" name="change_outfit"/> - <menu_item_call label="Profil" name="my_profile"/> - <menu_item_call label="Venner" name="my_friends"/> - <menu_item_call label="Grupper" name="my_groups"/> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="Gear Menu"> + <menu_item_call label="Sid ned" name="Sit Down Here"/> + <menu_item_call label="StÃ¥ op" name="Stand Up"/> + <context_menu label="Tag af" name="Take Off >"> + <context_menu label="Tøj" name="Clothes >"> + <menu_item_call label="Trøje" name="Shirt"/> + <menu_item_call label="Bukser" name="Pants"/> + <menu_item_call label="Nederdel" name="Skirt"/> + <menu_item_call label="Sko" name="Shoes"/> + <menu_item_call label="Strømper" name="Socks"/> + <menu_item_call label="Jakke" name="Jacket"/> + <menu_item_call label="Handsker" name="Gloves"/> + <menu_item_call label="Undertrøje" name="Self Undershirt"/> + <menu_item_call label="Underbukser" name="Self Underpants"/> + <menu_item_call label="Tatovering" name="Self Tattoo"/> + <menu_item_call label="Alpha" name="Self Alpha"/> + <menu_item_call label="Alt tøj" name="All Clothes"/> + </context_menu> + <context_menu label="HUD" name="Object Detach HUD"/> + <context_menu label="Tag af" name="Object Detach"/> + <menu_item_call label="Tag alt af" name="Detach All"/> + </context_menu> + <menu_item_call label="Skift sæt" name="Chenge Outfit"/> + <menu_item_call label="Redigér sæt" name="Edit Outfit"/> + <menu_item_call label="Redigér min figur" name="Edit My Shape"/> + <menu_item_call label="Mine venner" name="Friends..."/> + <menu_item_call label="Mine grupper" name="Groups..."/> + <menu_item_call label="Min profil" name="Profile..."/> <menu_item_call label="Debug teksturer" name="Debug..."/> -</menu> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/da/menu_inventory.xml b/indra/newview/skins/default/xui/da/menu_inventory.xml index 35551318d170125a5f1dbe39d7f8ebbf2516c3fe..f9bdf36f1fece9c0a9810de07ba92d34e10ca822 100644 --- a/indra/newview/skins/default/xui/da/menu_inventory.xml +++ b/indra/newview/skins/default/xui/da/menu_inventory.xml @@ -25,6 +25,7 @@ <menu_item_call label="Nye underbukser" name="New Underpants"/> <menu_item_call label="Nyt alpha lag" name="New Alpha Mask"/> <menu_item_call label="Ny tatovering" name="New Tattoo"/> + <menu_item_call label="Ny fysik" name="New Physics"/> </menu> <menu label="Nye kropsdele" name="New Body Parts"> <menu_item_call label="Ny figur" name="New Shape"/> diff --git a/indra/newview/skins/default/xui/da/menu_inventory_add.xml b/indra/newview/skins/default/xui/da/menu_inventory_add.xml index 07f70d7190dcf2a6b5f85d711596cf85be3bc28b..eca03d3ee9c6010abd0e53501bfb61cfded4a482 100644 --- a/indra/newview/skins/default/xui/da/menu_inventory_add.xml +++ b/indra/newview/skins/default/xui/da/menu_inventory_add.xml @@ -4,6 +4,8 @@ <menu_item_call label="Billede (L$[COST])..." name="Upload Image"/> <menu_item_call label="Lyd (L$[COST])..." name="Upload Sound"/> <menu_item_call label="Animation (L$[COST])..." name="Upload Animation"/> + <menu_item_call label="Model..." name="Upload Model"/> + <menu_item_call label="Model Wizard..." name="Upload Model Wizard"/> <menu_item_call label="Hent mange (L$[COST] pr. fil)..." name="Bulk Upload"/> <menu_item_call label="Sæt standardværdier for upload rettigheder" name="perm prefs"/> </menu> @@ -23,6 +25,7 @@ <menu_item_call label="Nye underbukser" name="New Underpants"/> <menu_item_call label="Nyt alpha lag" name="New Alpha"/> <menu_item_call label="Ny tatovering" name="New Tattoo"/> + <menu_item_call label="Ny fysik" name="New Physics"/> </menu> <menu label="Nye kropsdele" name="New Body Parts"> <menu_item_call label="Ny kropsbygning" name="New Shape"/> diff --git a/indra/newview/skins/default/xui/da/menu_inventory_gear_default.xml b/indra/newview/skins/default/xui/da/menu_inventory_gear_default.xml index b359d94f07d2d87e055c7576b4006b5f896b4cb0..4809b2446356463d22dfe64f284a35ee19fe16c8 100644 --- a/indra/newview/skins/default/xui/da/menu_inventory_gear_default.xml +++ b/indra/newview/skins/default/xui/da/menu_inventory_gear_default.xml @@ -3,6 +3,7 @@ <menu_item_call label="Nyt vindue" name="new_window"/> <menu_item_check label="Sortér efter navn" name="sort_by_name"/> <menu_item_check label="Sortér efter nyeste" name="sort_by_recent"/> + <menu_item_check label="Sortér altid mapper efter navn" name="sort_folders_by_name"/> <menu_item_check label="Vis System mapper øverst" name="sort_system_folders_to_top"/> <menu_item_call label="Vis filtre" name="show_filters"/> <menu_item_call label="Nulstil filtre" name="reset_filters"/> diff --git a/indra/newview/skins/default/xui/da/menu_media_ctrl.xml b/indra/newview/skins/default/xui/da/menu_media_ctrl.xml new file mode 100644 index 0000000000000000000000000000000000000000..788b1c4b5904545c701f175edc19ccb3eea2988a --- /dev/null +++ b/indra/newview/skins/default/xui/da/menu_media_ctrl.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="media ctrl context menu"> + <menu_item_call label="Klip" name="Cut"/> + <menu_item_call label="Kopier" name="Copy"/> + <menu_item_call label="Sæt ind" name="Paste"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/da/menu_model_import_gear_default.xml b/indra/newview/skins/default/xui/da/menu_model_import_gear_default.xml new file mode 100644 index 0000000000000000000000000000000000000000..d9626692d58f0d6e8d778ee0bfa8ea28de7ed518 --- /dev/null +++ b/indra/newview/skins/default/xui/da/menu_model_import_gear_default.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="model_menu_gear_default"> + <menu_item_check label="Show edges" name="show_edges"/> + <menu_item_check label="Show physics" name="show_physics"/> + <menu_item_check label="Show textures" name="show_textures"/> + <menu_item_check label="Show skin weight" name="show_skin_weight"/> + <menu_item_check label="Show joint positions" name="show_joint_positions"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/da/menu_object.xml b/indra/newview/skins/default/xui/da/menu_object.xml index bc0cdde86fd868b90d7cfb66db5c548cbda18977..ba62ccf90ce47591ef93d97c37f93f8413a2b37f 100644 --- a/indra/newview/skins/default/xui/da/menu_object.xml +++ b/indra/newview/skins/default/xui/da/menu_object.xml @@ -16,14 +16,14 @@ <context_menu label="Vedhæft" name="Object Attach"/> <context_menu label="Vedhæft HUD" name="Object Attach HUD"/> </context_menu> - <context_menu label="Fjern" name="Remove"> + <context_menu label="Administrér" name="Remove"> <menu_item_call label="Rapportér misbrug" name="Report Abuse..."/> <menu_item_call label="Blokér" name="Object Mute"/> <menu_item_call label="Returnér" name="Return..."/> - <menu_item_call label="Slet" name="Delete"/> </context_menu> <menu_item_call label="Tag" name="Pie Object Take"/> <menu_item_call label="Tag kopi" name="Take Copy"/> <menu_item_call label="Betal" name="Pay..."/> <menu_item_call label="Køb" name="Buy..."/> + <menu_item_call label="Slet" name="Delete"/> </context_menu> diff --git a/indra/newview/skins/default/xui/da/menu_outfit_gear.xml b/indra/newview/skins/default/xui/da/menu_outfit_gear.xml index 8b4c776496f7a549b22bb65c0f1c73804b92cb7d..0b0fff3b937d8d82ac78d7b42c690f97ca14d7da 100644 --- a/indra/newview/skins/default/xui/da/menu_outfit_gear.xml +++ b/indra/newview/skins/default/xui/da/menu_outfit_gear.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<menu name="Gear Outfit"> +<toggleable_menu name="Gear Outfit"> <menu_item_call label="Tag pÃ¥ - Erstat nuværende sæt" name="wear"/> <menu_item_call label="Tag pÃ¥ - Tilføj til nuværende sæt" name="wear_add"/> <menu_item_call label="Tag af - Fjern fra nuværende sæt" name="take_off"/> @@ -14,6 +14,7 @@ <menu_item_call label="Ny undertrøje" name="New Undershirt"/> <menu_item_call label="Nye underbukser" name="New Underpants"/> <menu_item_call label="Ny alpha" name="New Alpha"/> + <menu_item_call label="Ny fysik" name="New Physics"/> <menu_item_call label="Ny tatovering" name="New Tattoo"/> </menu> <menu label="Nye kropsdele" name="New Body Parts"> @@ -24,4 +25,4 @@ </menu> <menu_item_call label="Omdøb sæt" name="rename"/> <menu_item_call label="Slet sæt" name="delete_outfit"/> -</menu> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/da/menu_places_gear_folder.xml b/indra/newview/skins/default/xui/da/menu_places_gear_folder.xml index 3ee3c02fb1a2274b00c1aa95b0e31181ebf6cab5..5f573c2363e97e123c149b063b59491165089bb1 100644 --- a/indra/newview/skins/default/xui/da/menu_places_gear_folder.xml +++ b/indra/newview/skins/default/xui/da/menu_places_gear_folder.xml @@ -1,7 +1,8 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<menu name="menu_folder_gear"> +<toggleable_menu name="menu_folder_gear"> <menu_item_call label="Tilføj landemærke" name="add_landmark"/> <menu_item_call label="Tilføj mappe" name="add_folder"/> + <menu_item_call label="Gendan genstand" name="restore_item"/> <menu_item_call label="Klip" name="cut"/> <menu_item_call label="Kopiér" name="copy_folder"/> <menu_item_call label="Sæt ind" name="paste"/> @@ -12,4 +13,4 @@ <menu_item_call label="Udvid alle mapper" name="expand_all"/> <menu_item_call label="Luk alle mapper" name="collapse_all"/> <menu_item_check label="Sortér efter dato" name="sort_by_date"/> -</menu> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/da/menu_places_gear_landmark.xml b/indra/newview/skins/default/xui/da/menu_places_gear_landmark.xml index 21f425c49d8315f91e1b3756b406b94507af7466..13dbcdd42e2645f8139b129d06c03db340c9b299 100644 --- a/indra/newview/skins/default/xui/da/menu_places_gear_landmark.xml +++ b/indra/newview/skins/default/xui/da/menu_places_gear_landmark.xml @@ -1,10 +1,11 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<menu name="menu_ladmark_gear"> +<toggleable_menu name="menu_ladmark_gear"> <menu_item_call label="Teleportér" name="teleport"/> <menu_item_call label="Mere information" name="more_info"/> <menu_item_call label="Vis pÃ¥ kort" name="show_on_map"/> <menu_item_call label="Tilføj landemærke" name="add_landmark"/> <menu_item_call label="Tilføj mappe" name="add_folder"/> + <menu_item_call label="Gendan genstand" name="restore_item"/> <menu_item_call label="Klip" name="cut"/> <menu_item_call label="Kopiér landemærke" name="copy_landmark"/> <menu_item_call label="Kopiér SLurl" name="copy_slurl"/> @@ -15,4 +16,4 @@ <menu_item_call label="Luk alle mapper" name="collapse_all"/> <menu_item_check label="Sortér efter dato" name="sort_by_date"/> <menu_item_call label="Opret favorit" name="create_pick"/> -</menu> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/da/menu_viewer.xml b/indra/newview/skins/default/xui/da/menu_viewer.xml index fc32be9dc96f5aea3ac9403c1deda6eae7875d81..d352312d1579fe67f817e1822e613169562a552b 100644 --- a/indra/newview/skins/default/xui/da/menu_viewer.xml +++ b/indra/newview/skins/default/xui/da/menu_viewer.xml @@ -5,7 +5,7 @@ <menu_item_call label="Mit instrumentpanel" name="Manage My Account"/> <menu_item_call label="Køb L$" name="Buy and Sell L$"/> <menu_item_call label="Profil" name="Profile"/> - <menu_item_call label="Skift sæt" name="ChangeOutfit"/> + <menu_item_call label="Udseende" name="ChangeOutfit"/> <menu_item_check label="Beholdning" name="Inventory"/> <menu_item_check label="Min beholdning" name="ShowSidetrayInventory"/> <menu_item_check label="Mine bevægelser" name="Gestures"/> @@ -33,6 +33,7 @@ <menu label="Verden" name="World"> <menu_item_check label="Mini-kort" name="Mini-Map"/> <menu_item_check label="Verdenskort" name="World Map"/> + <menu_item_check label="Søg" name="Search"/> <menu_item_call label="Foto" name="Take Snapshot"/> <menu_item_call label="Opret landemærke for dette sted" name="Create Landmark Here"/> <menu label="Profil for sted" name="Land"> @@ -117,6 +118,8 @@ <menu_item_call label="Billede (L$[COST])..." name="Upload Image"/> <menu_item_call label="Lyd (L$[COST])..." name="Upload Sound"/> <menu_item_call label="Animation (L$[COST])..." name="Upload Animation"/> + <menu_item_call label="Model..." name="Upload Model"/> + <menu_item_call label="Model Wizard..." name="Upload Model Wizard"/> <menu_item_call label="Mange (L$[COST] pr. fil)..." name="Bulk Upload"/> </menu> <menu_item_call label="Fortyd" name="Undo"/> @@ -156,7 +159,7 @@ <menu_item_check label="Alpha" name="Alpha"/> <menu_item_check label="Træer" name="Tree"/> <menu_item_check label="Avatarer" name="Character"/> - <menu_item_check label="Overflade" name="SurfacePath"/> + <menu_item_check label="Surface Patch" name="Surface Patch"/> <menu_item_check label="Himmel" name="Sky"/> <menu_item_check label="Vand" name="Water"/> <menu_item_check label="Jord" name="Ground"/> @@ -214,6 +217,7 @@ <menu_item_check label="Konsol med tekstur kategorier" name="Texture Category"/> <menu_item_check label="Hurtig-timere" name="Fast Timers"/> <menu_item_check label="Hukommelse" name="Memory"/> + <menu_item_check label="Scene Statistics" name="Scene Statistics"/> <menu_item_call label="Vis Regionsinfo i debug-konsol" name="Region Info to Debug Console"/> <menu_item_check label="Kamera" name="Camera"/> <menu_item_check label="Vind" name="Wind"/> @@ -221,8 +225,11 @@ </menu> <menu label="Vis info" name="Display Info"> <menu_item_check label="Vis tid" name="Show Time"/> + <menu_item_check label="Show Upload Cost" name="Show Upload Cost"/> <menu_item_check label="Vis gengivelses information" name="Show Render Info"/> + <menu_item_check label="Vis tekstur information" name="Show Texture Info"/> <menu_item_check label="Vis farve under cursor" name="Show Color Under Cursor"/> + <menu_item_check label="Vis memory" name="Show Memory"/> <menu_item_check label="Vis opdateringer pÃ¥ objekter" name="Show Updates"/> </menu> <menu label="Fremtving en fejl" name="Force Errors"> @@ -240,6 +247,14 @@ <menu_item_check label="Tilfældige framerates" name="Randomize Framerate"/> <menu_item_check label="Frame test" name="Frame Test"/> </menu> + <menu label="Render Metadata" name="Render Metadata"> + <menu_item_check label="Normals" name="Normals"/> + <menu_item_check label="Physics Shapes" name="Physics Shapes"/> + <menu_item_check label="Opdatér type" name="Update Type"/> + <menu_item_check label="LOD Info" name="LOD Info"/> + <menu_item_check label="Build Queue" name="Build Queue"/> + <menu_item_check label="Sculpt" name="Sculpt"/> + </menu> <menu label="Gengivelse" name="Rendering"> <menu_item_check label="Akser" name="Axes"/> <menu_item_check label="Wireframe" name="Wireframe"/> @@ -304,6 +319,7 @@ <menu_item_call label="Debug avatar teksturer" name="Debug Avatar Textures"/> </menu> <menu_item_check label="HTTP teksturer" name="HTTP Textures"/> + <menu_item_check label="HTTP Inventory" name="HTTP Inventory"/> <menu_item_check label="Benyt consol vindue ved næste opstart" name="Console Window"/> <menu_item_call label="Anmod om administrator status" name="Request Admin Options"/> <menu_item_call label="Forlad administrationsstatus" name="Leave Admin Options"/> @@ -328,4 +344,9 @@ </menu> <menu_item_call label=""God Tools"" name="God Tools"/> </menu> + <menu label="Admin" name="Deprecated"> + <menu label="Take Off Clothing" name="Take Off Clothing"> + <menu_item_call label="Fysik" name="Physics"/> + </menu> + </menu> </menu_bar> diff --git a/indra/newview/skins/default/xui/da/notifications.xml b/indra/newview/skins/default/xui/da/notifications.xml index 30b54d3eb28367360738be839ecaf06b9e181998..4c0fbd280b394d26eb33bb1695ca6853d5c6e27b 100644 --- a/indra/newview/skins/default/xui/da/notifications.xml +++ b/indra/newview/skins/default/xui/da/notifications.xml @@ -72,9 +72,9 @@ Fejl detaljer: Beskeden kaldet '[_NAME]' blev ikke fundet i notificati <usetemplate name="okbutton" yestext="OK"/> </notification> <notification name="LoginFailedNoNetwork"> - Kunne ikke oprette forbindelse til [SECOND_LIFE_GRID]. -'[DIAGNOSTIC]' -Make sure your Internet connection is working properly. + Kunne ikke tilslutte til [SECOND_LIFE_GRID]. + '[DIAGNOSTIC]' +Check at Internet forbindelsen fungerer korrekt. <usetemplate name="okbutton" yestext="OK"/> </notification> <notification name="MessageTemplateNotFound"> @@ -215,13 +215,6 @@ Du skal bruge en konto for at benytte [SECOND_LIFE]. Ønsker du at oprette en ko <notification name="InvalidCredentialFormat"> Du skal indtaste enten dit brugernavn eller bÃ¥de dit fornavn og efternavn for din avatar i brugernavn feltet, derefter log pÃ¥ igen. </notification> - <notification name="AddClassified"> - Annoncer vil vises i 'Annoncer' sektionen i søge biblioteket og pÃ¥ [http://secondlife.com/community/classifieds secondlife.com] i en uge. -Udfyld din annonce og klik pÃ¥ 'Udgiv...' for at tilf'je den til biblioteket. -Du vil blive spurgt om en pris nÃ¥r du klikker pÃ¥ 'Udgiv'. -Jo mere du betaler, jo højere oppe pÃ¥ listen vises annoncen, og den vil ogsÃ¥ optræde højere oppe nÃ¥r personer søger. - <usetemplate ignoretext="Hvordan man opretter en annonce" name="okcancelignore" notext="Cancel" yestext="OK"/> - </notification> <notification name="DeleteMedia"> Du har valgt at slette media tilknyttet denne overflade. Er du sikker pÃ¥ at du vil fortsætte? @@ -1078,6 +1071,12 @@ Det kan pÃ¥virke din indtastning af password. <notification name="RezItemNoPermissions"> Utilstrækkelige tilladelser til at danne genstanden. </notification> + <notification name="IMAcrossParentEstates"> + Ikke muligt at sende IM over forældre estates. + </notification> + <notification name="TransferInventoryAcrossParentEstates"> + Ikke muligt at overføre din beholdning over forældre parceller. + </notification> <notification name="UnableToLoadNotecard"> Ikke muligt at indlæse note. Prøv venligst igen. @@ -1648,6 +1647,10 @@ De vil blive blokeret nogle fÃ¥ sekunder af sikkerhedsmæssige Ã¥rsager. Din stemme er blevet slukket af moderatoren. <usetemplate name="okbutton" yestext="OK"/> </notification> + <notification name="UploadCostConfirmation"> + Dette upload vil koste L$[PRICE], ønsker du at sende? + <usetemplate name="okcancelbuttons" notext="Annullér" yestext="Send"/> + </notification> <notification name="ConfirmClearTeleportHistory"> Er du sikker pÃ¥ at du vil slette teleport historikken? <usetemplate name="okcancelbuttons" notext="Annullér" yestext="OK"/> @@ -1659,12 +1662,15 @@ Knappen vil blive vist nÃ¥r der er nok plads til den. <notification name="ShareNotification"> Vælg beboere at dele med. </notification> + <notification name="MeshUploadError"> + [LABEL] kunne ikke sendes: [MESSAGE] [IDENTIFIER] [INVALIDITY_IDENTIFIER] + </notification> <notification name="ShareItemsConfirmation"> Er du sikker pÃ¥ at du vil dele følgende genstande: <nolink>[ITEMS]</nolink> -Med følgende beboere: +Me følgende beboere: [RESIDENTS] <usetemplate name="okcancelbuttons" notext="Annullér" yestext="Ok"/> @@ -1675,6 +1681,19 @@ Med følgende beboere: <notification name="DeedToGroupFail"> Dedikering til gruppe fejlede. </notification> + <notification name="ReleaseLandThrottled"> + Parcellen [PARCEL_NAME] kan ikke efterlades pÃ¥ nuværende tidspunkt. + </notification> + <notification name="ReleasedLandWithReclaim"> + [AREA] m² parcellen '[PARCEL_NAME]' er blevet frigivet. + +Du har [RECLAIM_PERIOD] timer til at fÃ¥ den tilbage for L$0 før den udbydes til salg til andre beboere. + </notification> + <notification name="ReleasedLandNoReclaim"> + [AREA] m² parcel '[PARCEL_NAME]' er blevet frigivet. + +Parcellen kan nu købes af enhver beboer. + </notification> <notification name="AvatarRezNotification"> ( [EXISTENCE] sekunder i live ) Avatar '[NAME]' var ikke sky mere, efter [TIME] sekunder. @@ -1753,24 +1772,32 @@ Sluk for alles lyd? <notification label="StÃ¥ op" name="HintSit"> For at rejse dig op og forlad siddeposition, tryk pÃ¥ "StÃ¥ op" knappen. </notification> + <notification label="Tal" name="HintSpeak"> + Klik pÃ¥ tal knappen for at tænde og slukke for din mikrofon. + +Klik pÃ¥ den lille pil-op for at se stemme kontrolpanelet. + +Skjules tale knappen, vil stemmechat ikke være mulig. + </notification> <notification label="Undersøg verden" name="HintDestinationGuide"> Destinationsguiden indeholder tusinder af nye steder der kan opleves. Vælg venligst et sted og vælg Teleport for at komme derhen. </notification> - <notification label="Ændre dit udseende" name="HintAvatarPicker"> - Kunne du tænke dig at prøve et nyt udseende? Klik pÃ¥ knappen nedenfor for at se flere avatarer. - </notification> <notification label="Side panel" name="HintSidePanel"> FÃ¥ hurtig tilgang til din beholdning, sæt, profiler og andet i dette side panel. </notification> <notification label="Flyt" name="HintMove"> For at gÃ¥ eller løbe, Ã¥ben Flyt panelet for neden og brug pilene til at navigere. Du kan ogsÃ¥ bruge pile-tasterne pÃ¥ dit tastatur. </notification> + <notification label="" name="HintMoveClick"> + 1. Klik for at gÃ¥ +Klik et hvorsomhelst pÃ¥ jorden for at gÃ¥ til dette sted. + +2. Klik og træk for at rotere visning +Klik hvorsomhelst i verden for at rotere din visning + </notification> <notification label="Visningsnavn" name="HintDisplayName"> Angiv dit konfigurérbare visningsnavn her. Dette er i tillæg til dit unikke brugernavn, som ikke kan ændres. Du kan ændre hvordan du ser andre beboeres navne i dine indstillinger. </notification> - <notification label="Flyt" name="HintMoveArrows"> - For at gÃ¥, brug piletasterne pÃ¥ tastaturet. Du kan løbe ved at trykke to gange pÃ¥ Pil-Op - </notification> <notification label="Se" name="HintView"> For at ændre dit kamera-view, benyt kredsløbs og panoreringskontrollerne. Nulstil view ved at trykke Esc eller ved at gÃ¥. </notification> @@ -1796,6 +1823,54 @@ Sluk for alles lyd? <button name="cancel" text="Annullér"/> </form> </notification> + <notification label="" name="ModeChange"> + For at skifte tilstand skal du genstarte programmet. + <usetemplate name="okcancelbuttons" notext="Afslut ikke" yestext="Afslut"/> + </notification> + <notification label="" name="NoClassifieds"> + Oprettelse og redigering af annoncer er kun muligt i avanceret tilstand. Ønsker du at logge ud for at skifte tilstand? Valg af tilstand findes pÃ¥ login skærmbilledet. + <usetemplate name="okcancelbuttons" notext="Afslut ikke" yestext="Afslut"/> + </notification> + <notification label="" name="NoGroupInfo"> + Oprettelse og redigering af grupper er kun muligt i avanceret tilstand. Ønsker du at logge ud for at skifte tilstand? Valg af tilstand findes pÃ¥ login skærmbilledet. + <usetemplate name="okcancelbuttons" notext="Afslut ikke" yestext="Afslut"/> + </notification> + <notification label="" name="NoPlaceInfo"> + Det er kun muligt at vise profil for stedet i avanceret opsætning. Ønsker du at logge ud for at skifte tilstand? Valg af tilstand findes pÃ¥ login skærmbilledet. + <usetemplate name="okcancelbuttons" notext="Afslut ikke" yestext="Afslut"/> + </notification> + <notification label="" name="NoPicks"> + Oprettelse og redigering af favoritter er kun mulig i avanceret tilstand. Ønsker du at logge ud for at skifte tilstand? Valg af tilstand findes pÃ¥ login skærmbilledet. + <usetemplate name="okcancelbuttons" notext="Afslut ikke" yestext="Afslut"/> + </notification> + <notification label="" name="NoWorldMap"> + Det er kun muligt at se verdenskortet i avanceret tilstand.Ønsker du at logge ud for at skifte tilstand? Valg af tilstand findes pÃ¥ login skærmbilledet. + <usetemplate name="okcancelbuttons" notext="Afslut ikke" yestext="Afslut"/> + </notification> + <notification label="" name="NoVoiceCall"> + Stemme kald kan kun benttes i avanceret tilstand. Ønsker du at logge ud for at skifte tilstand? + <usetemplate name="okcancelbuttons" notext="Afslut ikke" yestext="Afslut"/> + </notification> + <notification label="" name="NoAvatarShare"> + Det er kun mulig at dele i avanceret tilstand. Ønsker du at logge ud for at skifte tilstand? + <usetemplate name="okcancelbuttons" notext="Afslut ikke" yestext="Afslut"/> + </notification> + <notification label="" name="NoAvatarPay"> + Det er kun muligt at betale andre beboere i avanceret tilstand. Ønsker du at logge ud for at skifte tilstand? + <usetemplate name="okcancelbuttons" notext="Afslut ikke" yestext="Afslut"/> + </notification> + <notification label="" name="NoInventory"> + Det er kun muligt at vise beholdning i avanceret tilstand. Ønsker du at logge ud og logge pÃ¥ i avanceret tilstand. + <usetemplate name="okcancelbuttons" notext="Afslut ikke" yestext="Afslut"/> + </notification> + <notification label="" name="NoAppearance"> + Udseende opsætning er kun tilgængelig i avanceret tilstand. Ønsker du at logge ud og logge pÃ¥ i avanceret tilstand. + <usetemplate name="okcancelbuttons" notext="Afslut ikke" yestext="Afslut"/> + </notification> + <notification label="" name="NoSearch"> + Søgning er kun mulig i avanceret tilstand. Ønsker du at logge ud og logge pÃ¥ i avanceret tilstand. + <usetemplate name="okcancelbuttons" notext="Afslut ikke" yestext="Afslut"/> + </notification> <global name="UnsupportedGLRequirements"> Det ser ikke ud til at din hardware opfylder minimumskravene til [APP_NAME]. [APP_NAME] kræver et OpenGL grafikkort som understøter 'multitexture'. Check eventuelt om du har de nyeste drivere for grafikkortet, og de nyeste service-packs og patches til dit operativsystem. diff --git a/indra/newview/skins/default/xui/da/panel_edit_physics.xml b/indra/newview/skins/default/xui/da/panel_edit_physics.xml new file mode 100644 index 0000000000000000000000000000000000000000..16c9b16fa31607ed9a685bb251717eb07ab8da3d --- /dev/null +++ b/indra/newview/skins/default/xui/da/panel_edit_physics.xml @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="edit_physics_panel"> + <panel label="" name="accordion_panel"> + <accordion name="physics_accordion"> + <accordion_tab name="physics_breasts_updown_tab" title="Bryst fasthed"/> + <accordion_tab name="physics_breasts_inout_tab" title="Kavalergang"/> + <accordion_tab name="physics_breasts_leftright_tab" title="Bryst sving"/> + <accordion_tab name="physics_belly_tab" title="Mave fasthed"/> + <accordion_tab name="physics_butt_tab" title="Bagdel fasthed"/> + <accordion_tab name="physics_butt_leftright_tab" title="Bagdel sving"/> + <accordion_tab name="physics_advanced_tab" title="Avancerede parametre"/> + </accordion> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/da/panel_edit_wearable.xml b/indra/newview/skins/default/xui/da/panel_edit_wearable.xml index 4b9360f0d1569029626bfbed771c1848a5b1d817..906870e6d9d7862a3f2c7b449bb0597e070424b0 100644 --- a/indra/newview/skins/default/xui/da/panel_edit_wearable.xml +++ b/indra/newview/skins/default/xui/da/panel_edit_wearable.xml @@ -45,6 +45,9 @@ <string name="edit_tattoo_title"> Redigerer tatovering </string> + <string name="edit_physics_title"> + Redigering af fysik + </string> <string name="shape_desc_text"> Kropsbygning: </string> @@ -90,6 +93,9 @@ <string name="tattoo_desc_text"> Tatovering: </string> + <string name="physics_desc_text"> + Fysik: + </string> <labeled_back_button label="Gem" name="back_btn" tool_tip="Tilbage til redigering"/> <text name="edit_wearable_title" value="Redigerer kropsbygning"/> <panel label="Trøje" name="wearable_type_panel"> diff --git a/indra/newview/skins/default/xui/da/panel_login.xml b/indra/newview/skins/default/xui/da/panel_login.xml index dc8d9bc432bbce55bb7b3305ce35633e6dcab2ee..2e0f726e1abb826ef9a657713da88a19a35afcac 100644 --- a/indra/newview/skins/default/xui/da/panel_login.xml +++ b/indra/newview/skins/default/xui/da/panel_login.xml @@ -17,6 +17,13 @@ </text> <check_box label="Husk password" name="remember_check"/> <button label="Log pÃ¥" name="connect_btn"/> + <text name="mode_selection_text"> + Tilstand: + </text> + <combo_box name="mode_combo" tool_tip="Vælg ønsket tilstand. Vælg basis for hurtig og nem udforskning og chat. Vælg avanceret for at fÃ¥ adgang til flere muligheder."> + <combo_box.item label="Basis" name="Basic"/> + <combo_box.item label="Avanceret" name="Advanced"/> + </combo_box> <text name="start_location_text"> Start ved: </text> diff --git a/indra/newview/skins/default/xui/da/panel_nearby_media.xml b/indra/newview/skins/default/xui/da/panel_nearby_media.xml index b4be70a22a75592a054f16f8f943f0e8b8632f56..ef8ed3ad072bb302721b954a9c7187b1f8afe824 100644 --- a/indra/newview/skins/default/xui/da/panel_nearby_media.xml +++ b/indra/newview/skins/default/xui/da/panel_nearby_media.xml @@ -19,7 +19,7 @@ <button label="Stop alt" name="all_nearby_media_disable_btn" tool_tip="Stop al media tæt pÃ¥"/> <button label="Start alt" name="all_nearby_media_enable_btn" tool_tip="Tænd al media tæt pÃ¥"/> <button name="open_prefs_btn" tool_tip="Vis media preferencer"/> - <button label="Mere >>" label_selected="Mindre <<" name="more_btn" tool_tip="Advancerede kontroller"/> + <button label="Mere >>" label_selected="<< Mindre" name="more_btn" tool_tip="Advancerede kontroller"/> <button label="Mere >>" label_selected="Mindre <<" name="less_btn" tool_tip="Advancerede kontroller"/> </panel> <panel name="nearby_media_panel"> diff --git a/indra/newview/skins/default/xui/da/panel_people.xml b/indra/newview/skins/default/xui/da/panel_people.xml index b85a33279aa39a5da001981eb19798a567b01fc1..66a128cd13e7924b56795bf17905491654a8bb2f 100644 --- a/indra/newview/skins/default/xui/da/panel_people.xml +++ b/indra/newview/skins/default/xui/da/panel_people.xml @@ -18,6 +18,8 @@ Leder du efter nogen at være sammen med? Prøv [secondlife:///app/worldmap Verd <string name="groups_filter_label" value="Filtrér grupper"/> <string name="no_filtered_groups_msg" value="Fandt du ikke det du søgte? Prøv [secondlife:///app/search/groups/[SEARCH_TERM] Søg]."/> <string name="no_groups_msg" value="Leder du efter grupper at være med i? Prøv [secondlife:///app/search/groups Søg]."/> + <string name="MiniMapToolTipMsg" value="[REGION](Dobbeltklik for at Ã¥bne kort, træk for at panorere)"/> + <string name="AltMiniMapToolTipMsg" value="[REGION](Dobbelt-klik fot at teleportere, træk for at panorere)"/> <filter_editor label="Filtrér" name="filter_input"/> <tab_container name="tabs"> <panel label="TÆT PÃ…" name="nearby_panel"> @@ -64,16 +66,16 @@ Leder du efter nogen at være sammen med? Prøv [secondlife:///app/worldmap Verd <layout_panel name="view_profile_btn_lp"> <button label="Profil" name="view_profile_btn" tool_tip="Vis billeder, grupper og anden beboer information"/> </layout_panel> - <layout_panel name="chat_btn_lp"> + <layout_panel name="im_btn_lp"> <button label="IM" name="im_btn" tool_tip="Ã…ben session med privat besked (IM)"/> </layout_panel> - <layout_panel name="chat_btn_lp"> + <layout_panel name="call_btn_lp"> <button label="Kald" name="call_btn" tool_tip="Opkald til denne beboer"/> </layout_panel> - <layout_panel name="chat_btn_lp"> + <layout_panel name="share_btn_lp"> <button label="Del" name="share_btn" tool_tip="Del en genstand fra beholdning"/> </layout_panel> - <layout_panel name="chat_btn_lp"> + <layout_panel name="teleport_btn_lp"> <button label="Teleportér" name="teleport_btn" tool_tip="Tilbyd teleport"/> </layout_panel> </layout_stack> diff --git a/indra/newview/skins/default/xui/da/panel_preferences_chat.xml b/indra/newview/skins/default/xui/da/panel_preferences_chat.xml index ed499619f691e1df6f5dc572ba23b8149f5dba99..19c82509cdb2a7ac2a6a8a689e215d05fe77a1ea 100644 --- a/indra/newview/skins/default/xui/da/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/da/panel_preferences_chat.xml @@ -30,7 +30,9 @@ <spinner label="Tid før chatvisning forsvinder:" name="nearby_toasts_lifetime"/> <spinner label="Tid før chatvisning forsvinder:" name="nearby_toasts_fadingtime"/> <check_box name="translate_chat_checkbox"/> - <text name="translate_chb_label" >Benyt maskin-oversættelse ved chat (hÃ¥ndteret af Google)</text> + <text name="translate_chb_label"> + Benyt maskinel oversættelse ved chat (hÃ¥ndteret af Google) + </text> <text name="translate_language_text" width="110"> Oversæt chat til : </text> diff --git a/indra/newview/skins/default/xui/da/panel_preferences_colors.xml b/indra/newview/skins/default/xui/da/panel_preferences_colors.xml index b2b00db769c00bb506bc84fb9e46d0b29aec0482..cc3dc480bc8dba39185b0a3e7ff668a58eef95b4 100644 --- a/indra/newview/skins/default/xui/da/panel_preferences_colors.xml +++ b/indra/newview/skins/default/xui/da/panel_preferences_colors.xml @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Farver" name="colors_panel"> <text name="effects_color_textbox"> - Mine effekter (selektions-strÃ¥le): + Mine effekter (selektions pejlelys): </text> - <color_swatch name="effect_color_swatch" tool_tip="Klik for at Ã¥bne farve-vælger"/> + <color_swatch name="effect_color_swatch" tool_tip="Klik for at Ã¥bne farvevælger"/> <text name="font_colors"> - Chat bogstavsfarver: + Vælg font farver: </text> <text name="text_box1"> Mig @@ -22,6 +22,9 @@ <text name="text_box5"> Fejl </text> + <text name="text_box10"> + Direkte + </text> <text name="text_box7"> Ejer </text> @@ -29,12 +32,12 @@ URL'er </text> <text name="bubble_chat"> - Baggrundsfarve til navne-skilt (berører ogsÃ¥ Bubble Chat): + Navneskilt baggrundsfarve (pÃ¥virker ogsÃ¥ chat talebobler): </text> - <color_swatch name="background" tool_tip="Vælg farve til navne-skilt"/> - <slider label="Uigennemsigtighed:" name="bubble_chat_opacity" tool_tip="Vælg gennemsigtighed for navneskilt"/> + <color_swatch name="background" tool_tip="Vælg navneskilt farve"/> + <slider label="Gennemsigtighed:" name="bubble_chat_opacity" tool_tip="Vælg navneskilt gennemsigtighed"/> <text name="floater_opacity"> - Vindue uigennemsigtighed: + Floater gennemsigtighed: </text> <slider label="Aktiv:" name="active"/> <slider label="Inaktiv:" name="inactive"/> diff --git a/indra/newview/skins/default/xui/da/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/da/panel_preferences_graphics1.xml index 15da1f9ec5819f13792bb1cc015c1bf679b65815..72200a07ad55fe5a18cf82b131151e6881cec827 100644 --- a/indra/newview/skins/default/xui/da/panel_preferences_graphics1.xml +++ b/indra/newview/skins/default/xui/da/panel_preferences_graphics1.xml @@ -28,8 +28,20 @@ </text> <check_box initial_value="sand" label="Gennemsigtig vand" name="TransparentWater"/> <check_box initial_value="true" label="Glatte flader og skin" name="BumpShiny"/> + <check_box initial_value="sand" label="Lokale lys" name="LocalLights"/> <check_box initial_value="true" label="Basale flader" name="BasicShaders" tool_tip="Ved at slÃ¥ dette valg fra, kan det forhindres at visse grafikkort drivere crasher."/> <check_box initial_value="true" label="Atmosfæriske flader" name="WindLightUseAtmosShaders"/> + <check_box initial_value="sand" label="Lys og skygger" name="UseLightShaders"/> + <check_box initial_value="sand" label=""Ambient Occlusion"" name="UseSSAO"/> + <check_box initial_value="sand" label="Skarphedsdybde" name="UseDoF"/> + <text name="shadows_label"> + Skygger: + </text> + <combo_box name="ShadowDetail"> + <combo_box.item label="Ingen" name="0"/> + <combo_box.item label="Sol/MÃ¥ne" name="1"/> + <combo_box.item label="Sol/MÃ¥ne + Projektorer" name="2"/> + </combo_box> <text name="reflection_label"> Reflektioner i vand: </text> @@ -40,6 +52,10 @@ <combo_box.item label="Alle avatarer og objekter" name="3"/> <combo_box.item label="Alt" name="4"/> </combo_box> + <slider label="Avatar fysik:" name="AvatarPhysicsDetail"/> + <text name="AvatarPhysicsDetailText"> + Lav + </text> <slider label="Maks. visnings-afstand:" name="DrawDistance"/> <text name="DrawDistanceMeterText2"> m @@ -78,7 +94,7 @@ Lav </text> <text name="AvatarRenderingText"> - Avatar gengivelse + Avatar rendering: </text> <check_box initial_value="true" label="Mini-figurer pÃ¥ lang afstand" name="AvatarImpostors"/> <check_box initial_value="true" label="Hardware Skinning" name="AvatarVertexProgram"/> diff --git a/indra/newview/skins/default/xui/da/panel_preferences_sound.xml b/indra/newview/skins/default/xui/da/panel_preferences_sound.xml index 067463be02cebd8f012636b66ad7d11ddac1b1b1..26d2ae4abdf8099ea41fb3c5a9926d4a236bfc4d 100644 --- a/indra/newview/skins/default/xui/da/panel_preferences_sound.xml +++ b/indra/newview/skins/default/xui/da/panel_preferences_sound.xml @@ -5,7 +5,9 @@ </panel.string> <slider label="Generel" name="System Volume"/> <check_box initial_value="true" name="mute_when_minimized"/> - <text name="mute_chb_label">Sluk lyd nÃ¥r minimeret</text> + <text name="mute_chb_label"> + Sluk for lyd nÃ¥r minimeret + </text> <slider label="Knapper" name="UI Volume"/> <slider label="Omgivelser" name="Wind Volume"/> <slider label="Lyd effekter" name="SFX Volume"/> diff --git a/indra/newview/skins/default/xui/da/panel_profile.xml b/indra/newview/skins/default/xui/da/panel_profile.xml index b8b99a9c21a17a0b9704c01e7c4e72633f0f90d1..db85eb23a840822a0aae5d36b17a9374091cdc8f 100644 --- a/indra/newview/skins/default/xui/da/panel_profile.xml +++ b/indra/newview/skins/default/xui/da/panel_profile.xml @@ -5,6 +5,12 @@ <string name="RegisterDateFormat"> [REG_DATE] ([AGE]) </string> + <string name="name_text_args"> + [NAME] + </string> + <string name="display_name_text_args"> + [DISPLAY_NAME] + </string> <layout_stack name="layout"> <layout_panel name="profile_stack"> <scroll_container name="profile_scroll"> @@ -19,7 +25,7 @@ <text name="title_acc_status_text" value="Konto status:"/> <text name="title_partner_text" value="Partner:"/> <panel name="partner_data_panel"> - <name_box initial_value="(henter)" name="partner_text"/> + <text initial_value="(henter)" name="partner_text"/> </panel> <text name="title_groups_text" value="Grupper:"/> </panel> diff --git a/indra/newview/skins/default/xui/da/panel_region_general.xml b/indra/newview/skins/default/xui/da/panel_region_general.xml index 5b5dd411ac4b347de4b2a39379d90b8ee94893ae..667c88c5b1f494e461cbc863940f55b0e23bce52 100644 --- a/indra/newview/skins/default/xui/da/panel_region_general.xml +++ b/indra/newview/skins/default/xui/da/panel_region_general.xml @@ -25,6 +25,7 @@ <check_box label="Tillad at sælge land" name="allow_land_resell_check"/> <check_box label="Tillad at samle/dele land" name="allow_parcel_changes_check"/> <check_box label="Blokér visning af land i Søgning" name="block_parcel_search_check" tool_tip="Lad beboere se denne region og dens parceller i søgeresultater"/> + <check_box label="Til "mesh" objekter" name="mesh_rez_enabled_check" tool_tip="Lad personer rezze mesh objekter i denne region"/> <spinner label="Max besøgende" name="agent_limit_spin"/> <spinner label="Objekt bonus" name="object_bonus_spin"/> <text label="Indhold" name="access_text"> diff --git a/indra/newview/skins/default/xui/da/panel_script_ed.xml b/indra/newview/skins/default/xui/da/panel_script_ed.xml index 8997cab30ca98593f32c2b8aab265f03c8b6fc89..3dec4bf101b9cc44e8a5dbda6e3beb85db01b94b 100644 --- a/indra/newview/skins/default/xui/da/panel_script_ed.xml +++ b/indra/newview/skins/default/xui/da/panel_script_ed.xml @@ -15,6 +15,9 @@ <panel.string name="Title"> Script: [NAME] </panel.string> + <panel.string name="external_editor_not_set"> + Vælg en editor ved at opsætte miljø-variablen LL_SCRIPT_EDITOR eller opsætning af Ekstern editor. + </panel.string> <menu_bar name="script_menu"> <menu label="Filer" name="File"> <menu_item_call label="Gem" name="Save"/> diff --git a/indra/newview/skins/default/xui/da/panel_scrolling_param_base.xml b/indra/newview/skins/default/xui/da/panel_scrolling_param_base.xml new file mode 100644 index 0000000000000000000000000000000000000000..fa659040eaa57c1c5e325093dcc427058ea160b3 --- /dev/null +++ b/indra/newview/skins/default/xui/da/panel_scrolling_param_base.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="LLScrollingPanelParamBase"> + <slider label="[DESC]" name="param slider"/> +</panel> diff --git a/indra/newview/skins/default/xui/da/panel_sound_devices.xml b/indra/newview/skins/default/xui/da/panel_sound_devices.xml new file mode 100644 index 0000000000000000000000000000000000000000..27b7666a1f50a22ce864dee7b71c5104d84118b2 --- /dev/null +++ b/indra/newview/skins/default/xui/da/panel_sound_devices.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<panel label="Opsætning for udstyr" name="device_settings_panel"> + <panel.string name="default_text"> + Standard + </panel.string> + <text name="Input"> + Input + </text> + <text name="My volume label"> + Min lydstyrke: + </text> + <slider_bar initial_value="1.0" name="mic_volume_slider" tool_tip="Ændre lydstyrke med denne skyder"/> + <text name="wait_text"> + Vent venligst + </text> + <text name="Output"> + Output + </text> +</panel> diff --git a/indra/newview/skins/default/xui/da/strings.xml b/indra/newview/skins/default/xui/da/strings.xml index b0b4d1ccc6c5f810d4ea3ac950f509cf32fbb8b6..68b861fe924a640126a205a9bdfc9d7287c53238 100644 --- a/indra/newview/skins/default/xui/da/strings.xml +++ b/indra/newview/skins/default/xui/da/strings.xml @@ -115,6 +115,140 @@ <string name="Quit"> Afslut </string> + <string name="LoginFailedViewerNotPermitted"> + Den klient du benytter kan ikke længere fÃ¥ adgang til Second Life. Besøg venligst denne side for at hente en ny klient: +http://secondlife.com/download + +For mere information, se denne FAQ: +http://secondlife.com/viewer-access-faq + </string> + <string name="LoginIntermediateOptionalUpdateAvailable"> + Valgfri klient opdatering tilgængelig: [VERSION] + </string> + <string name="LoginFailedRequiredUpdate"> + PÃ¥krævet opdatering a klient: [VERSION] + </string> + <string name="LoginFailedAlreadyLoggedIn"> + Din avatar er allerede logget pÃ¥. + </string> + <string name="LoginFailedAuthenticationFailed"> + Beklager! vi kunne ikke logge dig pÃ¥. +Undersøg venligst at du har indtastet det rette +Please check to make sure you entered the right + * Brugernavn (like bobsmith12 or steller.sunshine) + * Password +Check ogsÃ¥ at Caps Lock ikke er aktiveret. + </string> + <string name="LoginFailedPasswordChanged"> + Som en sikkerhedsforanstaltning er dit password blevet ændret. +GÃ¥r venligst til din konto-side pÃ¥ http://secondlife.com/password +og besvar sikkerhedsspørgsmÃ¥l for at nulstille dit password. +Vi undskylder besværet. + </string> + <string name="LoginFailedPasswordReset"> + vi har lavet nogle ændringer i vores system og det er nødvendigt at nulstille dit password. +GÃ¥r venligst til din konto-side pÃ¥ http://secondlife.com/password +og besvar sikkerhedsspørgsmÃ¥l for at nulstille dit password. +Vi undskylder besværet. + </string> + <string name="LoginFailedEmployeesOnly"> + Second Life er midlertidig lukket ned for vedligeholdelse. +Kun medarbejdere kan logge pÃ¥ for øjeblikket. +Check www.secondlife.com/status for opdateringer. + </string> + <string name="LoginFailedPremiumOnly"> + Second Life har midlertidig begrænset muligheden for log-in for at sikre, at brugere pÃ¥ systemet ikke fÃ¥r dÃ¥rlige svartider. + + Brugere med gratis-konti vil ikke kunne logge pÃ¥ Second Life pÃ¥ dette tidspunkt. + </string> + <string name="LoginFailedComputerProhibited"> + Second Life kan ikke tilgÃ¥s fra dennecomputer. +Hvis du mener dette er en fejl, kontakt venligst support@secondlife.com. + </string> + <string name="LoginFailedAcountSuspended"> + Din konto vil ikke være tilgængelig før +[TIME] Pacific Time. + </string> + <string name="LoginFailedAccountDisabled"> + Vi kan desværre ikke behandle forespøgsel lige nu. +Kontakt venligst Second Life supper for assitance via http://secondlife.com/support. +Hvis du ikke kan ændre dit password ring venligst +1 (866) 476-9763. + </string> + <string name="LoginFailedTransformError"> + Data inkonsistens registret ved login. +Kontakt venligst support@secondlife.com. + </string> + <string name="LoginFailedAccountMaintenance"> + Der foretages vedligehold pÃ¥ din konto lige nu. +Din konto vil ikke være tilgængelig før +[TIME] Pacific Time. +Hvis du mener dette er en fejl, kontakt venligst support@secondlife.com. + </string> + <string name="LoginFailedPendingLogoutFault"> + Forespøgsel pÃ¥ logout blev besvaret med en fejl fra simulatoren. + </string> + <string name="LoginFailedPendingLogout"> + Systemet er i gang med at logge dig ud netop nu. +Din konto vil ikke være tilgængelig før +[TIME] Pacific Time. + </string> + <string name="LoginFailedUnableToCreateSession"> + Ikke muligt at oprette gyldig session. + </string> + <string name="LoginFailedUnableToConnectToSimulator"> + Ikke muligt at koble til en simulator. + </string> + <string name="LoginFailedRestrictedHours"> + Din konto kan kun tilgÃ¥ Second Life +mellem [START] [END] Pacific Time. +Kom venligst tilbage i dette tidsrum. + +Hvis du mener dette er en fejl, kontakt venligst support@secondlife.com. + </string> + <string name="LoginFailedIncorrectParameters"> + Ugyldig parametre. +Hvis du mener dette er en fejl, kontakt venligst support@secondlife.com. + </string> + <string name="LoginFailedFirstNameNotAlphanumeric"> + Fornavn parameter skal være alfanumerisk +Hvis du mener dette er en fejl, kontakt venligst support@secondlife.com. + </string> + <string name="LoginFailedLastNameNotAlphanumeric"> + Efternavn parameter skal være alfanumerisk +Hvis du mener dette er en fejl, kontakt venligst support@secondlife.com. + </string> + <string name="LogoutFailedRegionGoingOffline"> + Regionen er lukket ned. +Prøv at logge pÃ¥ om lidt igen. + </string> + <string name="LogoutFailedAgentNotInRegion"> + Avatar ikke i en region. +Prøv venligst om lidt igen. + </string> + <string name="LogoutFailedPendingLogin"> + The region was logging in another session. +Please try logging in again in a minute. + </string> + <string name="LogoutFailedLoggingOut"> + Region har lukket sidste session ned. +Prøv venligst om lidt igen. + </string> + <string name="LogoutFailedStillLoggingOut"> + Regionen er stadig ved at lukke forrige session ud. +Prøv venligst om lidt igen. + </string> + <string name="LogoutSucceeded"> + Region har lukket sidste session ned. +Prøv venligst om lidt igen. + </string> + <string name="LogoutFailedLogoutBegun"> + Region er i gang med at logge ud. +Prøv venligst om lidt igen. + </string> + <string name="LoginFailedLoggingOutSession"> + Region er i gang med at lukket sidste session ned. +Prøv venligst om lidt igen. + </string> <string name="AgentLostConnection"> Denne region kan have problemer. Tjek venligst din forbindelse til internettet. </string> @@ -423,6 +557,9 @@ <string name="symbolic folder link"> link til mappe </string> + <string name="mesh"> + mesh + </string> <string name="AvatarAway"> Væk </string> @@ -852,6 +989,9 @@ <string name="tattoo"> Tatovering </string> + <string name="physics"> + Fysik + </string> <string name="invalid"> ugyldig </string> @@ -891,6 +1031,9 @@ <string name="tattoo_not_worn"> Tatovering ikke benyttet </string> + <string name="physics_not_worn"> + Ikke noget fysisk bÃ¥ret + </string> <string name="invalid_not_worn"> ugyldig </string> @@ -939,6 +1082,9 @@ <string name="create_new_tattoo"> Opret ny tatovering </string> + <string name="create_new_physics"> + Opret ny fysik + </string> <string name="create_new_invalid"> ugyldig </string> @@ -1037,7 +1183,7 @@ </string> <string name="WornOnAttachmentPoint" value=" (bÃ¥ret pÃ¥ [ATTACHMENT_POINT])"/> <string name="ActiveGesture" value="[GESLABEL] (aktiv)"/> - <string name="Chat" value=" Chat : "/> + <string name="Chat Message" value="Chat :"/> <string name="Sound" value=" Lyd : "/> <string name="Wait" value=" --- Vent : "/> <string name="AnimFlagStop" value=" Stop Animation : "/> @@ -1141,6 +1287,9 @@ <string name="InvFolder Accessories"> Tilbehør </string> + <string name="InvFolder Meshes"> + Meshes + </string> <string name="InvFolder Friends"> Venner </string> @@ -1819,12 +1968,6 @@ Forventet .wav, .tga, .bmp, .jpg, .jpeg, or .bvh <string name="accel-win-shift"> Shift+ </string> - <string name="Esc"> - Esc - </string> - <string name="Home"> - Hjem - </string> <string name="FileSaved"> Fil gemt </string> @@ -1942,6 +2085,9 @@ Forventet .wav, .tga, .bmp, .jpg, .jpeg, or .bvh <string name="Other"> Andet </string> + <string name="Rental"> + Leje + </string> <string name="Any"> Enhver </string> @@ -2178,6 +2324,114 @@ Hvis du bliver ved med at modtage denne besked, kontakt venligst [SUPPORT_SITE]. <string name="Bulbous Nose"> Kartoffelnæse </string> + <string name="Breast Physics Mass"> + Bryst fylde + </string> + <string name="Breast Physics Smoothing"> + Brystudjævning + </string> + <string name="Breast Physics Gravity"> + Bryst tyngde + </string> + <string name="Breast Physics Drag"> + Bryst inerti + </string> + <string name="Breast Physics InOut Max Effect"> + Maks. effekt + </string> + <string name="Breast Physics InOut Spring"> + Fjeder + </string> + <string name="Breast Physics InOut Gain"> + Øg + </string> + <string name="Breast Physics InOut Damping"> + Dæmpning + </string> + <string name="Breast Physics UpDown Max Effect"> + Maks. effekt + </string> + <string name="Breast Physics UpDown Spring"> + Fjeder + </string> + <string name="Breast Physics UpDown Gain"> + Øg + </string> + <string name="Breast Physics UpDown Damping"> + Dæmpning + </string> + <string name="Breast Physics LeftRight Max Effect"> + Maks. effekt + </string> + <string name="Breast Physics LeftRight Spring"> + Fjeder + </string> + <string name="Breast Physics LeftRight Gain"> + Øg + </string> + <string name="Breast Physics LeftRight Damping"> + Dæmpning + </string> + <string name="Belly Physics Mass"> + Mave omfang + </string> + <string name="Belly Physics Smoothing"> + maveudjævning + </string> + <string name="Belly Physics Gravity"> + Mave tyngde + </string> + <string name="Belly Physics Drag"> + Mave inerti + </string> + <string name="Belly Physics UpDown Max Effect"> + Maks. effekt + </string> + <string name="Belly Physics UpDown Spring"> + Fjeder + </string> + <string name="Belly Physics UpDown Gain"> + Øg + </string> + <string name="Belly Physics UpDown Damping"> + Dæmpning + </string> + <string name="Butt Physics Mass"> + Bagdel omfang + </string> + <string name="Butt Physics Smoothing"> + Bagdelsudjævning + </string> + <string name="Butt Physics Gravity"> + Bagdel tyngde + </string> + <string name="Butt Physics Drag"> + Bagdel modstand + </string> + <string name="Butt Physics UpDown Max Effect"> + Maks. effekt + </string> + <string name="Butt Physics UpDown Spring"> + Fjeder + </string> + <string name="Butt Physics UpDown Gain"> + Øg + </string> + <string name="Butt Physics UpDown Damping"> + Dæmpning + </string> + <string name="Butt Physics LeftRight Max Effect"> + Maks. effekt + </string> + <string name="Butt Physics LeftRight Spring"> + Fjeder + </string> + <string name="Butt Physics LeftRight Gain"> + Øg + </string> + <string name="Butt Physics LeftRight Damping"> + Dæmpning + </string> <string name="Bushy Eyebrows"> Buskede øjenbryn </string> @@ -2187,6 +2441,9 @@ Hvis du bliver ved med at modtage denne besked, kontakt venligst [SUPPORT_SITE]. <string name="Butt Size"> Størrelse bagdel </string> + <string name="Butt Gravity"> + Bagdel tyngde + </string> <string name="bustle skirt"> Tournure </string> @@ -3540,6 +3797,9 @@ Hvis du bliver ved med at modtage denne besked, kontakt venligst [SUPPORT_SITE]. <string name="session_initialization_timed_out_error"> Initialisering af session er "timed out" </string> + <string name="Home position set."> + Hjemmeposition sat. + </string> <string name="voice_morphing_url"> http://secondlife.com/landing/voicemorphing </string> @@ -3662,6 +3922,9 @@ Krænkelsesanmeldelse <string name="New Tattoo"> Ny tatovering </string> + <string name="New Physics"> + Ny fysik + </string> <string name="Invalid Wearable"> Kan ikke tages pÃ¥ </string> @@ -3861,7 +4124,7 @@ Krænkelsesanmeldelse <string name="Notices"> Beskeder </string> - <string name="Chat"> + <string name="Chat" value=" Chat : "> Chat </string> <string name="DeleteItems"> @@ -3873,4 +4136,348 @@ Krænkelsesanmeldelse <string name="EmptyOutfitText"> Der er ingen genstande i dette sæt </string> + <string name="ExternalEditorNotSet"> + Vælg en editor via opsætningen for Ekstern editor. + </string> + <string name="ExternalEditorNotFound"> + Kan ikke benytte deb eksterne editor der er angivet. +Prøv at omkrandse stien til editor med anførselstegn. +(f.eks. "/stil til min editor" "%s") + </string> + <string name="ExternalEditorCommandParseError"> + Fejl ved hÃ¥ndtering af kommando til ekstern editor. + </string> + <string name="ExternalEditorFailedToRun"> + Den eksterne editor kunne ikke startes. + </string> + <string name="Esc"> + Esc + </string> + <string name="Space"> + Space + </string> + <string name="Enter"> + Enter + </string> + <string name="Tab"> + Tab + </string> + <string name="Ins"> + Ins + </string> + <string name="Del"> + Del + </string> + <string name="Backsp"> + Backsp + </string> + <string name="Shift"> + Shift + </string> + <string name="Ctrl"> + Ctrl + </string> + <string name="Alt"> + Alt + </string> + <string name="CapsLock"> + CapsLock + </string> + <string name="Home"> + Hjem + </string> + <string name="End"> + End + </string> + <string name="PgUp"> + PgUp + </string> + <string name="PgDn"> + PgDn + </string> + <string name="F1"> + F1 + </string> + <string name="F2"> + F2 + </string> + <string name="F3"> + F3 + </string> + <string name="F4"> + F4 + </string> + <string name="F5"> + F5 + </string> + <string name="F6"> + F6 + </string> + <string name="F7"> + F7 + </string> + <string name="F8"> + F8 + </string> + <string name="F9"> + F9 + </string> + <string name="F10"> + F10 + </string> + <string name="F11"> + F11 + </string> + <string name="F12"> + F12 + </string> + <string name="Add"> + Tilføj + </string> + <string name="Subtract"> + Træk fra + </string> + <string name="Multiply"> + Multiplicer + </string> + <string name="Divide"> + Divider + </string> + <string name="PAD_DIVIDE"> + PAD_DIVIDE + </string> + <string name="PAD_LEFT"> + PAD_LEFT + </string> + <string name="PAD_RIGHT"> + PAD_RIGHT + </string> + <string name="PAD_DOWN"> + PAD_DOWN + </string> + <string name="PAD_UP"> + PAD_UP + </string> + <string name="PAD_HOME"> + PAD_HOME + </string> + <string name="PAD_END"> + PAD_END + </string> + <string name="PAD_PGUP"> + PAD_PGUP + </string> + <string name="PAD_PGDN"> + PAD_PGDN + </string> + <string name="PAD_CENTER"> + PAD_CENTER + </string> + <string name="PAD_INS"> + PAD_INS + </string> + <string name="PAD_DEL"> + PAD_DEL + </string> + <string name="PAD_Enter"> + PAD_Enter + </string> + <string name="PAD_BUTTON0"> + PAD_BUTTON0 + </string> + <string name="PAD_BUTTON1"> + PAD_BUTTON1 + </string> + <string name="PAD_BUTTON2"> + PAD_BUTTON2 + </string> + <string name="PAD_BUTTON3"> + PAD_BUTTON3 + </string> + <string name="PAD_BUTTON4"> + PAD_BUTTON4 + </string> + <string name="PAD_BUTTON5"> + PAD_BUTTON5 + </string> + <string name="PAD_BUTTON6"> + PAD_BUTTON6 + </string> + <string name="PAD_BUTTON7"> + PAD_BUTTON7 + </string> + <string name="PAD_BUTTON8"> + PAD_BUTTON8 + </string> + <string name="PAD_BUTTON9"> + PAD_BUTTON9 + </string> + <string name="PAD_BUTTON10"> + PAD_BUTTON10 + </string> + <string name="PAD_BUTTON11"> + PAD_BUTTON11 + </string> + <string name="PAD_BUTTON12"> + PAD_BUTTON12 + </string> + <string name="PAD_BUTTON13"> + PAD_BUTTON13 + </string> + <string name="PAD_BUTTON14"> + PAD_BUTTON14 + </string> + <string name="PAD_BUTTON15"> + PAD_BUTTON15 + </string> + <string name="-"> + - + </string> + <string name="="> + = + </string> + <string name="`"> + ` + </string> + <string name=";"> + ; + </string> + <string name="["> + [ + </string> + <string name="]"> + ] + </string> + <string name="\"> + \ + </string> + <string name="0"> + 0 + </string> + <string name="1"> + 1 + </string> + <string name="2"> + 2 + </string> + <string name="3"> + 3 + </string> + <string name="4"> + 4 + </string> + <string name="5"> + 5 + </string> + <string name="6"> + 6 + </string> + <string name="7"> + 7 + </string> + <string name="8"> + 8 + </string> + <string name="9"> + 9 + </string> + <string name="A"> + A + </string> + <string name="B"> + B + </string> + <string name="C"> + C + </string> + <string name="D"> + D + </string> + <string name="E"> + E + </string> + <string name="F"> + F + </string> + <string name="G"> + G + </string> + <string name="H"> + H + </string> + <string name="I"> + I + </string> + <string name="J"> + J + </string> + <string name="K"> + K + </string> + <string name="L"> + L + </string> + <string name="M"> + M + </string> + <string name="N"> + N + </string> + <string name="O"> + O + </string> + <string name="P"> + P + </string> + <string name="Q"> + Q + </string> + <string name="R"> + R + </string> + <string name="S"> + S + </string> + <string name="T"> + T + </string> + <string name="U"> + U + </string> + <string name="V"> + V + </string> + <string name="W"> + W + </string> + <string name="X"> + X + </string> + <string name="Y"> + Y + </string> + <string name="Z"> + Z + </string> + <string name="BeaconParticle"> + Viser pejlelys for for partikler (blÃ¥) + </string> + <string name="BeaconPhysical"> + Viser pejlelys for fysiske objekter (grøn) + </string> + <string name="BeaconScripted"> + Viser pejlelys for "scriptede" objekter (rød) + </string> + <string name="BeaconScriptedTouch"> + Viser pejlelys for "scriptede" objekter med berøringsfunktion (rød) + </string> + <string name="BeaconSound"> + Viser pejlelys for lyd (gul) + </string> + <string name="BeaconMedia"> + Viser pejlelys for media (hvid) + </string> + <string name="ParticleHiding"> + Skjuler partikler + </string> </strings> diff --git a/indra/newview/skins/default/xui/de/floater_about.xml b/indra/newview/skins/default/xui/de/floater_about.xml index d15ab105c2aed1a2a56a8fb916e5296c694e31fa..578dcd50e50b765848ac3ed5e4b5f7c7a5ae58d5 100644 --- a/indra/newview/skins/default/xui/de/floater_about.xml +++ b/indra/newview/skins/default/xui/de/floater_about.xml @@ -55,27 +55,33 @@ Wir bedanken uns bei folgenden Einwohnern, die uns geholfen haben, dies zur bish </panel> <panel label="Lizenzen" name="licenses_panel"> <text_editor name="credits_editor"> - 3Dconnexion SDK Copyright (C) 1992-2007 3Dconnexion -APR Copyright (C) 2000-2004 The Apache Software Foundation -cURL Copyright (C) 1996-2002, Daniel Stenberg, (daniel@haxx.se) + 3Dconnexion SDK Copyright (C) 1992-2007 3Dconnexion. +APR Copyright (C) 2000-2004 The Apache Software Foundation. +Collada DOM Copyright 2005 Sony Computer Entertainment Inc. +cURL Copyright (C) 1996-2002, Daniel Stenberg (daniel@haxx.se). +DBus/dbus-glib Copyright (C) 2002, 2003 CodeFactory AB / Copyright (C) 2003, 2004 Red Hat, Inc. expat Copyright (C) 1998, 1999, 2000 Thai Open Source Software Center Ltd. FreeType Copyright (C) 1996-2002, The FreeType Project (www.freetype.org). GL Copyright (C) 1999-2004 Brian Paul. +GLOD Copyright (C) 2003-04 Jonathan Cohen, Nat Duca, Chris Niski, Johns Hopkins University sowie David Luebke, Brenden Schubert, University of Virginia. +google-perftools Copyright (c) 2005, Google Inc. Havok.com(TM) Copyright (C) 1999-2001, Telekinesys Research Limited. -jpeg2000 Copyright (C) 2001, David Taubman, The University of New South Wales (UNSW) +jpeg2000 Copyright (C) 2001, David Taubman, The University of New South Wales (UNSW). jpeglib Copyright (C) 1991-1998, Thomas G. Lane. -ogg/vorbis Copyright (C) 2001, Xiphophorus +ogg/vorbis Copyright (C) 2001, Xiphophorus. OpenSSL Copyright (C) 1998-2002 The OpenSSL Project. -SDL Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga -SSLeay Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) +PCRE Copyright (c) 1997-2008 University of Cambridge. +SDL Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga. +SSLeay Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com). xmlrpc-epi Copyright (C) 2000 Epinions, Inc. zlib Copyright (C) 1995-2002 Jean-loup Gailly und Mark Adler. google-perftools Copyright (c) 2005, Google Inc. -Alle Rechte vorbehalten. Details siehe licenses.txt. +Second Life Viewer verwendet Havok (TM) Physics. (c)Copyright 1999-2010 Havok.com Inc. (und Lizenzgeber). Alle Rechte vorbehalten. Details siehe www.havok.com. + +Alle Rechte vorbehalten. Details siehe licenses.txt. -Voice-Chat-Audiocoding: Polycom(R) Siren14(TM) -(ITU-T Empf.G.722.1 Anhang C) +Audiocodierung für Voice-Chat: Polycom(R) Siren14(TM) (ITU-T Rec. G.722.1 Annex C) </text_editor> </panel> </tab_container> diff --git a/indra/newview/skins/default/xui/de/floater_about_land.xml b/indra/newview/skins/default/xui/de/floater_about_land.xml index f1e42232c8f0cccf4a76f51b892e73988a2415da..f0fa4386d2770ea370cb64c17cd4372ceeeb001b 100644 --- a/indra/newview/skins/default/xui/de/floater_about_land.xml +++ b/indra/newview/skins/default/xui/de/floater_about_land.xml @@ -219,38 +219,38 @@ werden. <text name="objects_available"> [COUNT] von [MAX] ([AVAILABLE] verfügbar) </text> - <text name="Primitives parcel supports:" width="200"> + <text name="Primitives parcel supports:"> Von Parzelle unterstützte Prims: </text> - <text left="204" name="object_contrib_text" width="152"> + <text name="object_contrib_text"> [COUNT] </text> <text name="Primitives on parcel:"> Prims auf Parzelle: </text> - <text left="204" name="total_objects_text" width="48"> + <text name="total_objects_text"> [COUNT] </text> - <text left="14" name="Owned by parcel owner:" width="200"> + <text name="Owned by parcel owner:" width="200"> Im Eigentum des Parzellenbesitzers: </text> - <text left="204" left_delta="200" name="owner_objects_text" width="48"> + <text left_delta="204" name="owner_objects_text"> [COUNT] </text> - <button label="Anzeigen" label_selected="Anzeigen" name="ShowOwner" right="-135" width="60"/> - <button label="Zurückgeben" label_selected="Zurückgeben..." name="ReturnOwner..." right="-10" tool_tip="Objekte an ihre Eigentümer zurückgeben." width="119"/> - <text left="14" name="Set to group:"> + <button label="Anzeigen" label_selected="Anzeigen" name="ShowOwner"/> + <button label="Zurückgeben" label_selected="Zurückgeben..." name="ReturnOwner..." tool_tip="Objekte an ihre Eigentümer zurückgeben."/> + <text name="Set to group:"> Der Gruppe zugeordnet: </text> - <text left="204" name="group_objects_text" width="48"> + <text name="group_objects_text"> [COUNT] </text> - <button label="Anzeigen" label_selected="Anzeigen" name="ShowGroup" right="-135" width="60"/> - <button label="Zurückgeben" label_selected="Zurückgeben..." name="ReturnGroup..." right="-10" tool_tip="Objekte an ihre Eigentümer zurückgeben." width="119"/> - <text left="14" name="Owned by others:" width="128"> + <button label="Anzeigen" label_selected="Anzeigen" name="ShowGroup"/> + <button label="Zurückgeben" label_selected="Zurückgeben..." name="ReturnGroup..." tool_tip="Objekte an ihre Eigentümer zurückgeben."/> + <text name="Owned by others:"> Im Eigentum anderer: </text> - <text left="204" name="other_objects_text" width="48"> + <text name="other_objects_text"> [COUNT] </text> <button label="Anzeigen" label_selected="Anzeigen" name="ShowOther"/> diff --git a/indra/newview/skins/default/xui/de/floater_buy_contents.xml b/indra/newview/skins/default/xui/de/floater_buy_contents.xml index ccafa11cf47246f3e042f45c96de4cc52182297f..bd6ace6bdaa31d7869786e73aab16cc342aef986 100644 --- a/indra/newview/skins/default/xui/de/floater_buy_contents.xml +++ b/indra/newview/skins/default/xui/de/floater_buy_contents.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater min_width="300" name="floater_buy_contents" title="INHALT KAUFEN"> <text name="contains_text"> - [NAME] enthält: + <nolink>[NAME]</nolink> enthält: </text> <text name="buy_text"> [AMOUNT] L$ von [NAME] kaufen? diff --git a/indra/newview/skins/default/xui/de/floater_import_collada.xml b/indra/newview/skins/default/xui/de/floater_import_collada.xml new file mode 100644 index 0000000000000000000000000000000000000000..8b1313c7b56a28de56dbe96239ec3c89cf972077 --- /dev/null +++ b/indra/newview/skins/default/xui/de/floater_import_collada.xml @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="Import Collada" title="Szene importieren"> + <text name="mesh count"> + Netze: [COUNT] + </text> + <text name="texture count"> + Texturen: [COUNT] + </text> + <text name="status"> + Status: [STATUS] + </text> + <button label="Abbrechen" name="cancel"/> + <button label="OK" name="ok"/> + <string name="status_idle"> + Inaktiv + </string> + <string name="status_uploading"> + [NAME] wird hochgeladen + </string> + <string name="status_creating"> + Objektname [NAME] wird erstellt + </string> +</floater> diff --git a/indra/newview/skins/default/xui/de/floater_inventory_view_finder.xml b/indra/newview/skins/default/xui/de/floater_inventory_view_finder.xml index 9cc5b92dafc5b95798ca2dd109d0404804ba33d6..d63426d684455550351203013570035a93c8633c 100644 --- a/indra/newview/skins/default/xui/de/floater_inventory_view_finder.xml +++ b/indra/newview/skins/default/xui/de/floater_inventory_view_finder.xml @@ -5,6 +5,7 @@ <check_box label="Kleidung" name="check_clothing"/> <check_box label="Gesten" name="check_gesture"/> <check_box label="Landmarken" name="check_landmark"/> + <check_box label="Netze" name="check_mesh"/> <check_box label="Notizkarten" name="check_notecard"/> <check_box label="Objekte" name="check_object"/> <check_box label="Skripts" name="check_script"/> diff --git a/indra/newview/skins/default/xui/de/floater_model_preview.xml b/indra/newview/skins/default/xui/de/floater_model_preview.xml new file mode 100644 index 0000000000000000000000000000000000000000..83c51132ee2128b18d318bbe05fc60a136fda9af --- /dev/null +++ b/indra/newview/skins/default/xui/de/floater_model_preview.xml @@ -0,0 +1,231 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="Model Preview" title="Modell hochladen"> + <string name="status_idle"> + Inaktiv + </string> + <string name="status_reading_file"> + Laden... + </string> + <string name="status_generating_meshes"> + Netze werden generiert... + </string> + <string name="status_vertex_number_overflow"> + Fehler: Anzahl von Vertices überschreitet 65534. Operation abgebrochen. + </string> + <string name="high"> + Hoch + </string> + <string name="medium"> + Mittel + </string> + <string name="low"> + Niedrig + </string> + <string name="lowest"> + Niedrigste + </string> + <string name="mesh_status_good"> + Ausliefern + </string> + <string name="mesh_status_na"> + -- + </string> + <string name="mesh_status_none"> + Keine + </string> + <string name="mesh_status_submesh_mismatch"> + Detailstufen haben unterschiedliche Anzahl texturfähiger Flächen. + </string> + <string name="mesh_status_mesh_mismatch"> + Detailstufen haben unterschiedliche Anzahl von Netzinstanzen. + </string> + <string name="mesh_status_too_many_vertices"> + Detailstufe hat zu viele Vertices. + </string> + <string name="mesh_status_missing_lod"> + Erforderliche Detailstufe fehlt. + </string> + <string name="layer_all"> + Alle + </string> + <string name="decomposing"> + Analyse läuft... + </string> + <string name="simplifying"> + Vereinfachung läuft... + </string> + <text name="name_label"> + Name: + </text> + <text name="lod_label"> + Vorschau: + </text> + <combo_box name="preview_lod_combo" tool_tip="Detailstufe zur Anzeige in Vorschaudarstellung"> + <combo_item name="high"> + Detailstufe: Hoch + </combo_item> + <combo_item name="medium"> + Detailstufe: Mittel + </combo_item> + <combo_item name="low"> + Detailstufe: Niedrig + </combo_item> + <combo_item name="lowest"> + Detailstufe: Niedrigste + </combo_item> + </combo_box> + <panel> + <text name="streaming cost"> + Ressourcenkosten: [COST] + </text> + <text name="physics cost"> + Physikkosten: [COST] + </text> + <text name="upload fee"> + Gebühr für Hochladen: -- + </text> + </panel> + <text name="status"> + [STATUS] + </text> + <button label="Standardwerte" name="reset_btn" tool_tip="Standardwerte wiederherstellen"/> + <button label="Hochladen" name="ok_btn" tool_tip="An Simulator hochladen"/> + <button label="Abbrechen" name="cancel_btn"/> + <tab_container name="import_tab"> + <panel label="Detailstufe" name="lod_panel"> + <text name="lod_table_header"> + Detailstufe auswählen + </text> + <text name="high_label" value="Hoch"/> + <text name="high_triangles" value="0"/> + <text name="high_vertices" value="0"/> + <text name="medium_label" value="Mittel"/> + <text name="medium_triangles" value="0"/> + <text name="medium_vertices" value="0"/> + <text name="low_label" value="Niedrig"/> + <text name="low_triangles" value="0"/> + <text name="low_vertices" value="0"/> + <text name="lowest_label" value="Niedrigste"/> + <text name="lowest_triangles" value="0"/> + <text name="lowest_vertices" value="0"/> + <text name="lod_table_footer"> + Detailstufe: [DETAIL] + </text> + <radio_group name="lod_file_or_limit" value="lod_from_file"> + <radio_item label="Aus Datei laden" name="lod_from_file"/> + <radio_item label="Automatisch generieren" name="lod_auto_generate"/> + <radio_item label="Keine" name="lod_none"/> + </radio_group> + <button label="Durchsuchen..." name="lod_browse"/> + <combo_box name="lod_mode"> + <combo_item name="triangle_limit"> + Dreiecklimit + </combo_item> + <combo_item name="error_threshold"> + Fehlerschwelle + </combo_item> + </combo_box> + <text name="build_operator_text"> + Konstruktionsoperator: + </text> + <text name="queue_mode_text"> + Warteschlangenmodus: + </text> + <combo_box name="build_operator"> + <combo_item name="edge_collapse"> + Kantenkollaps + </combo_item> + <combo_item name="half_edge_collapse"> + Halbkantenkollaps + </combo_item> + </combo_box> + <combo_box name="queue_mode"> + <combo_item name="greedy"> + Strikt + </combo_item> + <combo_item name="lazy"> + Locker + </combo_item> + <combo_item name="independent"> + Unabhängig + </combo_item> + </combo_box> + <text name="border_mode_text"> + Grenzenmodus: + </text> + <text name="share_tolderance_text"> + Sharetoleranz: + </text> + <combo_box name="border_mode"> + <combo_item name="border_unlock"> + Freigeben + </combo_item> + <combo_item name="border_lock"> + Sperren + </combo_item> + </combo_box> + <text name="crease_label"> + Knitterwinkel: + </text> + <spinner name="crease_angle" value="75"/> + </panel> + <panel label="Physik" name="physics_panel"> + <panel name="physics geometry"> + <radio_group name="physics_load_radio" value="physics_load_from_file"> + <radio_item label="Datei:" name="physics_load_from_file"/> + <radio_item label="Detailstufe verwenden:" name="physics_use_lod"/> + </radio_group> + <combo_box name="physics_lod_combo" tool_tip="Detailstufe für physische Form"> + <combo_item name="physics_lowest"> + Niedrigste + </combo_item> + <combo_item name="physics_low"> + Niedrig + </combo_item> + <combo_item name="physics_medium"> + Mittel + </combo_item> + <combo_item name="physics_high"> + Hoch + </combo_item> + </combo_box> + <button label="Durchsuchen..." name="physics_browse"/> + </panel> + <panel name="physics analysis"> + <slider label="Glätten:" name="Smooth"/> + <check_box label="Löcher schließen (langsam)" name="Close Holes (Slow)"/> + <button label="Analysieren" name="Decompose"/> + <button label="Abbrechen" name="decompose_cancel"/> + </panel> + <panel name="physics simplification"> + <slider label="Durchläufe:" name="Combine Quality"/> + <slider label="Detailskala:" name="Detail Scale"/> + <slider label="Beibehalten:" name="Retain%"/> + <button label="Vereinfachen" name="Simplify"/> + <button label="Abbrechen" name="simplify_cancel"/> + </panel> + <panel name="physics info"> + <slider label="Vorschaudehnung:" name="physics_explode"/> + <text name="physics_triangles"> + Dreiecke: [TRIANGLES] + </text> + <text name="physics_points"> + Vertices: [POINTS] + </text> + <text name="physics_hulls"> + Hüllen: [HULLS] + </text> + </panel> + </panel> + <panel label="Modifizierer" name="modifiers_panel"> + <spinner name="import_scale" value="1,0"/> + <text name="import_dimensions"> + [X] x [Y] x [Z] m + </text> + <check_box label="Texturen" name="upload_textures"/> + <check_box label="Skingewicht" name="upload_skin"/> + <check_box label="Gelenkpositionen" name="upload_joints"/> + <spinner name="pelvis_offset" value="0,0"/> + </panel> + </tab_container> +</floater> diff --git a/indra/newview/skins/default/xui/de/floater_model_wizard.xml b/indra/newview/skins/default/xui/de/floater_model_wizard.xml new file mode 100644 index 0000000000000000000000000000000000000000..2c7b45906e9353732a930334c7f01091e5752c03 --- /dev/null +++ b/indra/newview/skins/default/xui/de/floater_model_wizard.xml @@ -0,0 +1,241 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="Model Wizard" title="ASSISTENT ZUM HOCHLADEN VON MODELLEN"> + <button label="5. Hochladen" name="upload_btn"/> + <button label="4. Ãœberprüfen" name="review_btn"/> + <button label="3. Physik" name="physics2_btn"/> + <button label="3. Physik" name="physics_btn"/> + <button label="2. Optimieren" name="optimize_btn"/> + <button label="1. Datei auswählen" name="choose_file_btn"/> + <panel name="choose_file_panel"> + <panel name="header_panel"> + <text name="header_text"> + Modell hochladen + </text> + </panel> + <text name="description"> + Mit diesem Assistenten können Sie Netzmodelle in Second Life hochladen. Geben Sie zuerst die Datei mit dem zu importierenden Modell an. Second Life unterstützt COLLADA-Dateien (.dae). + </text> + <panel name="content"> + <text name="Cache location"> + Dateiname: + </text> + <button label="Durchsuchen..." label_selected="Durchsuchen..." name="browse"/> + <text name="dimensions"> + X: Y: Z: + </text> + <text name="dimension_dividers"> + | | + </text> + </panel> + </panel> + <panel name="optimize_panel"> + <panel name="header_panel"> + <text name="header_text"> + Optimieren + </text> + </panel> + <text name="description"> + Dieser Assistent hat Ihr Modell optimiert, um die Leistung zu erhöhen. Sie können die Optimierungsergebnisse unten ändern oder zum Fortfahren auf „Weiter“ klicken. + </text> + <panel name="content"> + <text name="high_detail_text"> + Detailstufe generieren: Hoch + </text> + <text name="medium_detail_text"> + Detailstufe generieren: Mittel + </text> + <text name="low_detail_text"> + Detailstufe generieren: Niedrig + </text> + <text name="lowest_detail_text"> + Detailstufe generieren: Niedrigste + </text> + </panel> + <panel name="content2"> + <text name="lod_label"> + Modellvorschau: + </text> + <combo_box name="preview_lod_combo2" tool_tip="Detailstufe zur Anzeige in Vorschaudarstellung"> + <combo_item name="high"> + Hoch + </combo_item> + <combo_item name="medium"> + Mittel + </combo_item> + <combo_item name="low"> + Niedrig + </combo_item> + <combo_item name="lowest"> + Niedrigste + </combo_item> + </combo_box> + <text name="streaming cost"> + Ressourcenkosten: [COST] + </text> + <text name="dimensions"> + X: Y: Z: + </text> + <text name="dimension_dividers"> + | | + </text> + </panel> + </panel> + <panel name="physics_panel"> + <panel name="header_panel"> + <text name="header_text"> + Physik + </text> + </panel> + <text name="description"> + Der Assistent erstellt eine physische Form, die die Interaktionen des Objekts mit anderen Objekten und Avataren bestimmt. Setzen Sie den Schieber auf die Detailstufe, die für Ihr Objekt am besten geeignet ist: + </text> + <panel name="content"> + <text name="streaming cost"> + Ressourcenkosten: [COST] + </text> + </panel> + </panel> + <panel name="physics2_panel"> + <panel name="header_panel"> + <text name="header_text"> + Physik + </text> + </panel> + <text name="description"> + Ãœberprüfen Sie die physische Form unten und klicken Sie dann auf „Weiter“. Um die physische Form zu ändern, klicken Sie auf „Zurück“. + </text> + <panel name="content"> + <text name="lod_label"> + Modellvorschau: + </text> + <combo_box name="preview_lod_combo3" tool_tip="Detailstufe zur Anzeige in Vorschaudarstellung"> + <combo_item name="high"> + Hoch + </combo_item> + <combo_item name="medium"> + Mittel + </combo_item> + <combo_item name="low"> + Niedrig + </combo_item> + <combo_item name="lowest"> + Niedrigste + </combo_item> + </combo_box> + <text name="dimensions"> + X: Y: Z: + </text> + <text name="dimension_dividers"> + | | + </text> + <text name="streaming cost"> + Ressourcenkosten: [COST] + </text> + </panel> + </panel> + <panel name="review_panel"> + <panel name="header_panel"> + <text name="header_text"> + Ãœberprüfen + </text> + </panel> + <text name="description"> + Ãœberprüfen Sie die Details unten und klicken Sie dann auf „Hochladen“, um das Modell hochzuladen. Die Kosten werden von Ihrem L$-Kontostand abgezogen. + </text> + <panel name="content"> + <text name="lod_label"> + Modellvorschau: + </text> + <combo_box name="preview_lod_combo" tool_tip="Detailstufe zur Anzeige in Vorschaudarstellung"> + <combo_item name="high"> + Hoch + </combo_item> + <combo_item name="medium"> + Mittel + </combo_item> + <combo_item name="low"> + Niedrig + </combo_item> + <combo_item name="lowest"> + Niedrigste + </combo_item> + </combo_box> + <text name="dimensions"> + X: Y: Z: + </text> + <text name="dimension_dividers"> + | | + </text> + </panel> + <text name="streaming cost"> + Ressourcenkosten: [COST] + </text> + <text name="physics cost"> + Physikkosten: [COST] + </text> + </panel> + <panel name="upload_panel"> + <panel name="header_panel"> + <text name="header_text"> + Upload abgeschlossen + </text> + </panel> + <text name="description"> + Herzlichen Glückwunsch! Ihr Modell wurde erfolgreich hochgeladen. Sie finden das Modell im Objektordner Ihres Inventars. + </text> + </panel> + <button label="<< Zurück" name="back"/> + <button label="Weiter >>" name="next"/> + <button label="Hochladen" name="upload" tool_tip="An Simulator hochladen"/> + <button label="Abbrechen" name="cancel"/> + <button label="Schließen" name="close"/> + <spinner name="import_scale" value="1,0"/> + <string name="status_idle"> + Inaktiv + </string> + <string name="status_reading_file"> + Laden... + </string> + <string name="status_generating_meshes"> + Netze werden generiert... + </string> + <string name="status_vertex_number_overflow"> + Fehler: Anzahl von Vertices überschreitet 65534. Operation abgebrochen. + </string> + <string name="high"> + Hoch + </string> + <string name="medium"> + Mittel + </string> + <string name="low"> + Niedrig + </string> + <string name="lowest"> + Niedrigste + </string> + <string name="mesh_status_good"> + Ausliefern + </string> + <string name="mesh_status_na"> + -- + </string> + <string name="mesh_status_none"> + Keine + </string> + <string name="mesh_status_submesh_mismatch"> + Detailstufen haben unterschiedliche Anzahl texturfähiger Flächen. + </string> + <string name="mesh_status_mesh_mismatch"> + Detailstufen haben unterschiedliche Anzahl von Netzinstanzen. + </string> + <string name="mesh_status_too_many_vertices"> + Detailstufe hat zu viele Vertices. + </string> + <string name="mesh_status_missing_lod"> + Erforderliche Detailstufe fehlt. + </string> + <string name="layer_all"> + Alle + </string> +</floater> diff --git a/indra/newview/skins/default/xui/de/floater_perm_prefs.xml b/indra/newview/skins/default/xui/de/floater_perm_prefs.xml index fd65987aa989ae1e198338d6ebcb4d954c6e68a6..9be22f3ccbf823efc59af04d91473494e30ee1e1 100644 --- a/indra/newview/skins/default/xui/de/floater_perm_prefs.xml +++ b/indra/newview/skins/default/xui/de/floater_perm_prefs.xml @@ -9,7 +9,7 @@ </text> <check_box label="Bearbeiten" name="next_owner_modify"/> <check_box label="Kopieren" name="next_owner_copy"/> - <check_box label="Verkaufen/Weggeben" left_delta="80" name="next_owner_transfer"/> + <check_box label="Verkaufen/Weggeben" name="next_owner_transfer"/> </panel> <button label="OK" label_selected="OK" name="ok"/> <button label="Abbrechen" label_selected="Abbrechen" name="cancel"/> diff --git a/indra/newview/skins/default/xui/de/floater_preview_gesture.xml b/indra/newview/skins/default/xui/de/floater_preview_gesture.xml index 6d3635fa8dcba91c7e790b8f368dd36bb61ca6c0..76dc623ca41527e98fec01cce56439531425cbab 100644 --- a/indra/newview/skins/default/xui/de/floater_preview_gesture.xml +++ b/indra/newview/skins/default/xui/de/floater_preview_gesture.xml @@ -33,7 +33,7 @@ <text name="replace_text" tool_tip="Ersetzt den Auslösertext mit diesem Text. Wenn Sie zum Beispiel den Auslöser „hallo“ durch „wie geht's“ ersetzen, erscheint im Chat anstelle von „Ich wollte nur hallo sagen“ der Text „Ich wollte nur wie geht's sagen“ und die zugehörige Geste wird abgespielt."> Ersetzen mit: </text> - <line_editor left_delta="94" name="replace_editor" tool_tip="Ersetzt den Auslösertext mit diesem Text. Wenn Sie zum Beispiel den Auslöser „hallo“ durch „wie geht's“ ersetzen, erscheint im Chat anstelle von „Ich wollte nur hallo sagen“ der Text „Ich wollte nur wie geht's sagen“ und die zugehörige Geste wird abgespielt." width="160"/> + <line_editor name="replace_editor" tool_tip="Ersetzt den Auslösertext mit diesem Text. Wenn Sie zum Beispiel den Auslöser „hallo“ durch „wie geht's“ ersetzen, erscheint im Chat anstelle von „Ich wollte nur hallo sagen“ der Text „Ich wollte nur wie geht's sagen“ und die zugehörige Geste wird abgespielt."/> <text name="key_label"> Tastenkürzel: </text> diff --git a/indra/newview/skins/default/xui/de/floater_price_for_listing.xml b/indra/newview/skins/default/xui/de/floater_price_for_listing.xml new file mode 100644 index 0000000000000000000000000000000000000000..bdd772a9c2aea374ee0a5d563ce1743fcd5d3ea6 --- /dev/null +++ b/indra/newview/skins/default/xui/de/floater_price_for_listing.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="price_for_listing" title="ANZEIGE VERÖFFENTLICHEN"> + <text name="explanation_text"> + Ihre Anzeige wird für eine Woche veröffentlicht. + +Die Position Ihrer Anzeige hängt davon ab, wie viel Sie dafür bezahlen möchten. + +Die Anzeigen, für die am meisten bezahlt wird, werden am Anfang der Liste angezeigt und erscheinen in Suchergebnissen weiter oben. + </text> + <text name="price_text"> + Anzeigenpreis: + </text> + <text name="price_symbol"> + L$ + </text> + <button label="OK" name="set_price_btn"/> + <button label="Abbrechen" name="cancel_btn"/> +</floater> diff --git a/indra/newview/skins/default/xui/de/floater_snapshot.xml b/indra/newview/skins/default/xui/de/floater_snapshot.xml index c014b8e040d32db2da95869d923b8f6e4dbac2f4..ae68c71a80c7ef9041345a7ac276af0e7de8e9d3 100644 --- a/indra/newview/skins/default/xui/de/floater_snapshot.xml +++ b/indra/newview/skins/default/xui/de/floater_snapshot.xml @@ -4,7 +4,7 @@ unbekannt </floater.string> <radio_group label="Fototyp" name="snapshot_type_radio"> - <radio_item label="Email" name="postcard"/> + <radio_item label="E-Mail" name="postcard"/> <radio_item label="Mein Inventar ([AMOUNT] L$)" name="texture"/> <radio_item label="Auf meinem Computer speichern" name="local"/> </radio_group> diff --git a/indra/newview/skins/default/xui/de/floater_sound_devices.xml b/indra/newview/skins/default/xui/de/floater_sound_devices.xml new file mode 100644 index 0000000000000000000000000000000000000000..7575ad9e2aaf32a82446e18261df576b81e34684 --- /dev/null +++ b/indra/newview/skins/default/xui/de/floater_sound_devices.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_sound_devices" title="Audiogeräte"> + <text name="voice_label"> + Voice-Chat + </text> + <check_box label="Aktiviert" name="enable_voice"/> +</floater> diff --git a/indra/newview/skins/default/xui/de/floater_tools.xml b/indra/newview/skins/default/xui/de/floater_tools.xml index d95d674df2d5bc255d7d863e68a005e24703234f..338b6093436983cc6816fdadb64d18ecc4af2aa4 100644 --- a/indra/newview/skins/default/xui/de/floater_tools.xml +++ b/indra/newview/skins/default/xui/de/floater_tools.xml @@ -64,9 +64,9 @@ <radio_item label="Fläche auswählen" name="radio select face"/> </radio_group> <check_box label="Verknüpfte Teile bearbeiten" name="checkbox edit linked parts"/> - <button label="Link" name="link_btn"/> - <button label="Verknüpfung auflösen" name="unlink_btn"/> - <text name="RenderingCost" tool_tip="Zeigt die errechneten Wiedergabekosten für dieses Objekt"> + <button label="Link" name="link_btn" width="30"/> + <button label="Verknüpfung auflösen" name="unlink_btn" width="126"/> + <text name="RenderingCost" tool_tip="Zeigt die errechneten Wiedergabekosten für dieses Objekt" left_pad="0"> þ: [COUNT] </text> <check_box label="" name="checkbox uniform"/> @@ -125,6 +125,18 @@ <text name="prim_count"> Primitive: [COUNT] </text> + <text name="linked_set_count"> + Verknüpfte Sätze: [COUNT] + </text> + <text name="linked_set_cost" tool_tip="Kosten der gegenwärtig ausgewählten verknüpften Sätze als [Prims],[Komplexität der Physik]"> + Kosten: [COST] / [PHYSICS] + </text> + <text name="object_count"> + Objekte: [COUNT] + </text> + <text name="object_cost" tool_tip="Kosten der gegenwärtig ausgewählten Objekte als [Prims] / [Komplexität der Physik]"> + Kosten: [COST] / [PHYSICS] + </text> <tab_container name="Object Info Tabs"> <panel label="Allgemein" name="General"> <panel.string name="text deed continued"> @@ -269,15 +281,6 @@ <combo_box.item label="Ring" name="Ring"/> <combo_box.item label="Geformt" name="Sculpted"/> </combo_box> - <combo_box name="material"> - <combo_box.item label="Stein" name="Stone"/> - <combo_box.item label="Metall" name="Metal"/> - <combo_box.item label="Glas" name="Glass"/> - <combo_box.item label="Holz" name="Wood"/> - <combo_box.item label="Fleisch" name="Flesh"/> - <combo_box.item label="Kunststoff" name="Plastic"/> - <combo_box.item label="Gummi" name="Rubber"/> - </combo_box> <text name="text cut"> Pfadschnitt (Anfang/Ende) </text> @@ -353,9 +356,19 @@ <combo_box.item label="Torus" name="Torus"/> <combo_box.item label="Fläche" name="Plane"/> <combo_box.item label="Zylinder" name="Cylinder"/> + <combo_box.item label="Netz" name="Mesh"/> </combo_box> </panel> <panel label="Eigenschaften" name="Features"> + <panel.string name="None"> + Keine + </panel.string> + <panel.string name="Prim"> + Prim + </panel.string> + <panel.string name="Convex Hull"> + Konvexe Hülle + </panel.string> <text name="select_single"> Wählen Sie nur einen einzelnen Baustein aus, um Eigenschaften zu bearbeiten. </text> @@ -380,6 +393,23 @@ <spinner label="Fokus" name="Light Focus"/> <spinner label="Abnehmend" name="Light Falloff"/> <spinner label="Ambiente" name="Light Ambiance"/> + <text name="label physicsshapetype"> + Art der physischen Form: + </text> + <combo_box name="Physics Shape Type Combo Ctrl" tool_tip="Art der physischen Form auswählen"/> + <combo_box name="material"> + <combo_box.item label="Stein" name="Stone"/> + <combo_box.item label="Metall" name="Metal"/> + <combo_box.item label="Glas" name="Glass"/> + <combo_box.item label="Holz" name="Wood"/> + <combo_box.item label="Fleisch" name="Flesh"/> + <combo_box.item label="Plastik" name="Plastic"/> + <combo_box.item label="Gummi" name="Rubber"/> + </combo_box> + <spinner label="Schwerkraft" name="Physics Gravity"/> + <spinner label="Reibung" name="Physics Friction"/> + <spinner label="Dichte" name="Physics Density"/> + <spinner label="Restitution" name="Physics Restitution"/> </panel> <panel label="Textur" name="Texture"> <panel.string name="string repeats per meter"> diff --git a/indra/newview/skins/default/xui/de/menu_inventory_add.xml b/indra/newview/skins/default/xui/de/menu_inventory_add.xml index 165e9a9264eb32d2fe00e857d0455bfdd8d701a7..af70c08ba17479399b54112ccdbc04bf8ec5ca28 100644 --- a/indra/newview/skins/default/xui/de/menu_inventory_add.xml +++ b/indra/newview/skins/default/xui/de/menu_inventory_add.xml @@ -4,6 +4,8 @@ <menu_item_call label="Bild ([COST] L$)..." name="Upload Image"/> <menu_item_call label="Sound ([COST] L$)..." name="Upload Sound"/> <menu_item_call label="Animation ([COST] L$)..." name="Upload Animation"/> + <menu_item_call label="Modell..." name="Upload Model"/> + <menu_item_call label="Modellassistent..." name="Upload Model Wizard"/> <menu_item_call label="Mehrfach-Upload ([COST] L$ pro Datei)..." name="Bulk Upload"/> <menu_item_call label="Hochlade-Berechtigungen (Standard) festlegen" name="perm prefs"/> </menu> diff --git a/indra/newview/skins/default/xui/de/menu_model_import_gear_default.xml b/indra/newview/skins/default/xui/de/menu_model_import_gear_default.xml new file mode 100644 index 0000000000000000000000000000000000000000..e1faeedcdedd9460b1e3fee5558401db0542b824 --- /dev/null +++ b/indra/newview/skins/default/xui/de/menu_model_import_gear_default.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="model_menu_gear_default"> + <menu_item_check label="Kanten anzeigen" name="show_edges"/> + <menu_item_check label="Physik anzeigen" name="show_physics"/> + <menu_item_check label="Texturen anzeigen" name="show_textures"/> + <menu_item_check label="Skingewicht anzeigen" name="show_skin_weight"/> + <menu_item_check label="Gelenkpositionen anzeigen" name="show_joint_positions"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/de/menu_viewer.xml b/indra/newview/skins/default/xui/de/menu_viewer.xml index 9d5a69105d8374291ab86eef03fdea1877a4776f..05f9f94c8af7f57667340b53ed0a9a3d892b122f 100644 --- a/indra/newview/skins/default/xui/de/menu_viewer.xml +++ b/indra/newview/skins/default/xui/de/menu_viewer.xml @@ -120,6 +120,8 @@ <menu_item_call label="Bild ([COST] L$)..." name="Upload Image"/> <menu_item_call label="Sound ([COST] L$)..." name="Upload Sound"/> <menu_item_call label="Animation ([COST] L$)..." name="Upload Animation"/> + <menu_item_call label="Modell..." name="Upload Model"/> + <menu_item_call label="Modellassistent..." name="Upload Model Wizard"/> <menu_item_call label="Mehrfach-Upload ([COST] L$ pro Datei)..." name="Bulk Upload"/> </menu> <menu_item_call label="Rückgängig" name="Undo"/> @@ -159,7 +161,7 @@ <menu_item_check label="Alpha" name="Alpha"/> <menu_item_check label="Baum" name="Tree"/> <menu_item_check label="Avatare" name="Character"/> - <menu_item_check label="SurfacePath" name="SurfacePath"/> + <menu_item_check label="Flächenpatch" name="Surface Patch"/> <menu_item_check label="Himmel" name="Sky"/> <menu_item_check label="Wasser" name="Water"/> <menu_item_check label="Boden" name="Ground"/> @@ -218,6 +220,7 @@ <menu_item_check label="Texture-Kategorie" name="Texture Category"/> <menu_item_check label="Schnelle Timer" name="Fast Timers"/> <menu_item_check label="Speicher" name="Memory"/> + <menu_item_check label="Szenestatistiken" name="Scene Statistics"/> <menu_item_call label="Info zu Region in Fenster Fehler beseitigen" name="Region Info to Debug Console"/> <menu_item_call label="Gruppeninfo in Fenster Fehler beseitigen" name="Group Info to Debug Console"/> <menu_item_call label="Info zu Fähigkeiten in Fenster Fehler beseitigen" name="Capabilities Info to Debug Console"/> @@ -228,6 +231,7 @@ </menu> <menu label="Info anzeigen" name="Display Info"> <menu_item_check label="Zeit anzeigen" name="Show Time"/> + <menu_item_check label="Kosten für Hochladen anzeigen" name="Show Upload Cost"/> <menu_item_check label="Render-Info anzeigen" name="Show Render Info"/> <menu_item_check label="Texturinfos anzeigen" name="Show Texture Info"/> <menu_item_check label="Matrizen anzeigen" name="Show Matrices"/> @@ -253,8 +257,10 @@ </menu> <menu label="Metadaten darstellen" name="Render Metadata"> <menu_item_check label="Bonding Boxes" name="Bounding Boxes"/> + <menu_item_check label="Normalen" name="Normals"/> <menu_item_check label="Octree" name="Octree"/> <menu_item_check label="Shadow Frusta" name="Shadow Frusta"/> + <menu_item_check label="Physische Formen" name="Physics Shapes"/> <menu_item_check label="Okklusion" name="Occlusion"/> <menu_item_check label="Bündel rendern" name="Render Batches"/> <menu_item_check label="Typ aktualisieren" name="Update Type"/> @@ -262,9 +268,12 @@ <menu_item_check label="Textur-Priorität" name="Texture Priority"/> <menu_item_check label="Texturbereich" name="Texture Area"/> <menu_item_check label="Oberflächenbereich" name="Face Area"/> + <menu_item_check label="Detailstufeninfos" name="LOD Info"/> + <menu_item_check label="Konstruktionswarteschlange" name="Build Queue"/> <menu_item_check label="Lichter" name="Lights"/> <menu_item_check label="Gelenkpunkte" name="Collision Skeleton"/> <menu_item_check label="Raycast" name="Raycast"/> + <menu_item_check label="Formen" name="Sculpt"/> </menu> <menu label="Rendering" name="Rendering"> <menu_item_check label="Achsen" name="Axes"/> @@ -272,7 +281,6 @@ <menu_item_call label="Texturinfo für ausgewähltes Objekt" name="Selected Texture Info Basis"/> <menu_item_check label="Wireframe" name="Wireframe"/> <menu_item_check label="Objekt-Objekt Okklusion" name="Object-Object Occlusion"/> - <menu_item_check label="Framebuffer-Objekte" name="Framebuffer Objects"/> <menu_item_check label="Licht und Schatten" name="Lighting and Shadows"/> <menu_item_check label="Schatten von Sonne-/Mond-Projektoren" name="Shadows from Sun/Moon/Projectors"/> <menu_item_check label="SSAO und Schattenglättung" name="SSAO and Shadow Smoothing"/> @@ -371,6 +379,7 @@ <menu_item_call label="Lokale Texturen ausgeben" name="Dump Local Textures"/> </menu> <menu_item_check label="HTTP-Texturen" name="HTTP Textures"/> + <menu_item_check label="HTTP-Inventar" name="HTTP Inventory"/> <menu_item_call label="Bilder komprimieren" name="Compress Images"/> <menu_item_check label="Ausgabe Fehlerbeseitigung ausgeben" name="Output Debug Minidump"/> <menu_item_check label="Bei nächster Ausführung Fenster öffnen" name="Console Window"/> diff --git a/indra/newview/skins/default/xui/de/notifications.xml b/indra/newview/skins/default/xui/de/notifications.xml index c172f7ea2dbc363d4086b81764c1d41e3837082b..75f26c6990a246dc364cf850b81076ee9a5f3009 100644 --- a/indra/newview/skins/default/xui/de/notifications.xml +++ b/indra/newview/skins/default/xui/de/notifications.xml @@ -2172,6 +2172,12 @@ Dies kann die Eingabe Ihres Passworts beeinflussen. <notification name="RezItemNoPermissions"> Keine Berechtigung zum Rezzen von Objekten. </notification> + <notification name="IMAcrossParentEstates"> + Senden von IMs über übergeordnete Grundbesitze hinweg nicht möglich. + </notification> + <notification name="TransferInventoryAcrossParentEstates"> + Inventarübertragung über übergeordnete Grundbesitze hinweg nicht möglich. + </notification> <notification name="UnableToLoadNotecard"> Notizkarten-Asset konnte nicht geladen werden. </notification> @@ -2749,6 +2755,10 @@ Diese werden für ein paar Sekunden sicherheitshalber gesperrt. Sie wurden vom Moderator stummgeschaltet. <usetemplate name="okbutton" yestext="OK"/> </notification> + <notification name="UploadCostConfirmation"> + Das Hochladen kostet [PRICE] L$. Möchten Sie fortfahren? + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="Hochladen"/> + </notification> <notification name="ConfirmClearTeleportHistory"> Möchten Sie Ihre Teleport-Liste löschen? <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> @@ -2760,6 +2770,9 @@ Die Schaltfläche wird angezeigt, wenn genügend Platz vorhanden ist. <notification name="ShareNotification"> Wählen Sie Einwohner aus, für die Sie das Objekt freigeben möchten. </notification> + <notification name="MeshUploadError"> + [LABEL] konnte nicht hochgeladen werden: [MESSAGE] [IDENTIFIER] [INVALIDITY_IDENTIFIER] + </notification> <notification name="ShareItemsConfirmation"> Möchten Sie wirklich die folgenden Objekte: @@ -2776,6 +2789,19 @@ für folgende Einwohner freigeben: <notification name="DeedToGroupFail"> Ãœbertragung an Gruppe ist fehlgeschlagen. </notification> + <notification name="ReleaseLandThrottled"> + Die Parzelle [PARCEL_NAME] kann zurzeit nicht aufgegeben werden. + </notification> + <notification name="ReleasedLandWithReclaim"> + Die [AREA] m² große Parzelle „[PARCEL_NAME]“ wurde freigegeben. + +Sie haben [RECLAIM_PERIOD] Stunden, um die Parzelle für 0 L$ zurückzufordern, bevor sie zum Verkauf an alle freigegeben wird. + </notification> + <notification name="ReleasedLandNoReclaim"> + Die [AREA] m² große Parzelle „[PARCEL_NAME]“ wurde freigegeben. + +Sie steht jetzt zum Verkauf an alle zur Verfügung. + </notification> <notification name="AvatarRezNotification"> (Seit [EXISTENCE] Sekunden inworld ) Avatar '[NAME]' wurde in [TIME] Sekunden gerezzt. @@ -2914,6 +2940,10 @@ Durch Ausblenden der Schaltfläche „Sprechen“ wird die Sprechfunktion deakti Die Erstellung und Bearbeitung von Gruppen ist nur im Modus „Erweitert“ möglich. Möchten Sie das Programm beenden und den Modus wechseln? Die Modusauswahl ist auf dem Anmeldebildschirm zu finden. <usetemplate name="okcancelbuttons" notext="Nicht beenden" yestext="Beenden"/> </notification> + <notification label="" name="NoPlaceInfo"> + Die Anzeige des Ortsprofils ist nur im Modus „Erweitert“ möglich. Möchten Sie das Programm beenden und den Modus wechseln? Die Modusauswahl ist auf dem Anmeldebildschirm zu finden. + <usetemplate name="okcancelbuttons" notext="Nicht beenden" yestext="Beenden"/> + </notification> <notification label="" name="NoPicks"> Die Erstellung und Bearbeitung von Auswahlen ist nur im Modus „Erweitert“ möglich. Möchten Sie das Programm beenden und den Modus wechseln? Die Modusauswahl ist auf dem Anmeldebildschirm zu finden. <usetemplate name="okcancelbuttons" notext="Nicht beenden" yestext="Beenden"/> @@ -2934,9 +2964,18 @@ Durch Ausblenden der Schaltfläche „Sprechen“ wird die Sprechfunktion deakti Die Bezahlung anderer Einwohner ist nur im Modus „Erweitert“ möglich. Möchten Sie sich abmelden und den Modus wechseln? <usetemplate name="okcancelbuttons" notext="Nicht beenden" yestext="Beenden"/> </notification> - <global name="UnsupportedCPU"> - - Ihre CPU-Geschwindigkeit entspricht nicht den Mindestanforderungen. - </global> + <notification label="" name="NoInventory"> + Die Inventaranzeige ist nur im Modus „Erweitert“ möglich. Möchten Sie sich abmelden und den Modus wechseln? + <usetemplate name="okcancelbuttons" notext="Nicht beenden" yestext="Beenden"/> + </notification> + <notification label="" name="NoAppearance"> + Das Fenster zum Bearbeiten des Aussehens ist nur im Modus „Erweitert“ verfügbar. Möchten Sie sich abmelden und den Modus wechseln? + <usetemplate name="okcancelbuttons" notext="Nicht beenden" yestext="Beenden"/> + </notification> + <notification label="" name="NoSearch"> + Die Suche ist nur im Modus „Erweitert“ möglich. Möchten Sie sich abmelden und den Modus wechseln? + <usetemplate name="okcancelbuttons" notext="Nicht beenden" yestext="Beenden"/> + </notification> <global name="UnsupportedGLRequirements"> Ihr Computer entspricht nicht den Hardwareanforderungen von [APP_NAME]. [APP_NAME] setzt eine OpenGL-Grafikkarte mit Multitextur-Unterstützung voraus. Falls Ihre Grafikkarte diese Funktion unterstützt, installieren Sie die neuesten Treiber sowie die aktuellen Service Packs und Patches für Ihr Betriebssystem. diff --git a/indra/newview/skins/default/xui/de/panel_people.xml b/indra/newview/skins/default/xui/de/panel_people.xml index 004792bbf531446352523b2c8e936925f1311cba..63a832a16555790e12363d895d317b51ce965282 100644 --- a/indra/newview/skins/default/xui/de/panel_people.xml +++ b/indra/newview/skins/default/xui/de/panel_people.xml @@ -66,16 +66,16 @@ Sie suchen nach Leuten? Verwenden Sie die [secondlife:///app/worldmap Karte]. <layout_panel name="view_profile_btn_lp"> <button label="Profil" name="view_profile_btn" tool_tip="Bilder, Gruppen und andere Einwohner-Informationen anzeigen"/> </layout_panel> - <layout_panel name="chat_btn_lp"> + <layout_panel name="im_btn_lp"> <button label="IM" name="im_btn" tool_tip="Instant Messenger öffnen"/> </layout_panel> - <layout_panel name="chat_btn_lp"> + <layout_panel name="call_btn_lp"> <button label="Anrufen" name="call_btn" tool_tip="Diesen Einwohner anrufen"/> </layout_panel> - <layout_panel name="chat_btn_lp"> + <layout_panel name="share_btn_lp"> <button label="Teilen" name="share_btn" tool_tip="Inventarobjekt teilen"/> </layout_panel> - <layout_panel name="chat_btn_lp"> + <layout_panel name="teleport_btn_lp"> <button label="Teleportieren" name="teleport_btn" tool_tip="Teleport anbieten"/> </layout_panel> </layout_stack> diff --git a/indra/newview/skins/default/xui/de/panel_preferences_colors.xml b/indra/newview/skins/default/xui/de/panel_preferences_colors.xml index 22681ffdf230b7dc6d87a7f61e88a6e4e24ba53b..19c5efcb052e4c9fd2820945012c86cbc5366165 100644 --- a/indra/newview/skins/default/xui/de/panel_preferences_colors.xml +++ b/indra/newview/skins/default/xui/de/panel_preferences_colors.xml @@ -22,6 +22,9 @@ <text name="text_box5"> Fehler </text> + <text name="text_box10"> + Direkt + </text> <text name="text_box7"> Eigentümer </text> diff --git a/indra/newview/skins/default/xui/de/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/de/panel_preferences_graphics1.xml index 78cb03a50a0b11ca1756bf8a7c15b61c13c01b71..9175ea0bae9fb89f5a8f99580506ef178cdeea47 100644 --- a/indra/newview/skins/default/xui/de/panel_preferences_graphics1.xml +++ b/indra/newview/skins/default/xui/de/panel_preferences_graphics1.xml @@ -27,8 +27,20 @@ </text> <check_box initial_value="true" label="Transparentes Wasser" name="TransparentWater"/> <check_box initial_value="true" label="Bumpmapping und Glanz" name="BumpShiny"/> + <check_box initial_value="true" label="Lokale Lichtquellen" name="LocalLights"/> <check_box initial_value="true" label="Einfache Shader" name="BasicShaders" tool_tip="Deaktivieren Sie diese Option, wenn der Grafikkartentreiber Abstürze verursacht"/> <check_box initial_value="true" label="Atmosphären-Shader" name="WindLightUseAtmosShaders"/> + <check_box initial_value="true" label="Licht und Schatten" name="UseLightShaders"/> + <check_box initial_value="true" label="Ambient Occlusion" name="UseSSAO"/> + <check_box initial_value="true" label="Schärfentiefe" name="UseDoF"/> + <text name="shadows_label"> + Schatten: + </text> + <combo_box name="ShadowDetail"> + <combo_box.item label="Keine" name="0"/> + <combo_box.item label="Sonne/Mond" name="1"/> + <combo_box.item label="Sonne/Mond + Projektoren" name="2"/> + </combo_box> <text name="reflection_label"> Wasserreflexionen: </text> @@ -48,7 +60,7 @@ m </text> <slider label="Max. Partikelzahl:" name="MaxParticleCount"/> - <slider label="Max. Anzahl an voll dargestellten Avataren:" name="MaxNumberAvatarDrawn"/> + <slider label="Max. Anzahl an voll dargestellten Avataren:" label_width="230" name="MaxNumberAvatarDrawn" width="315"/> <slider label="Post-Processing-Qualität:" name="RenderPostProcess"/> <text name="MeshDetailText"> Darstellungsgrad: diff --git a/indra/newview/skins/default/xui/de/panel_region_general.xml b/indra/newview/skins/default/xui/de/panel_region_general.xml index be8507ebbdab2883b1c9352334bad614bf4ca01c..f383be992b92123761bdaa5e8355a9d048b4d4f4 100644 --- a/indra/newview/skins/default/xui/de/panel_region_general.xml +++ b/indra/newview/skins/default/xui/de/panel_region_general.xml @@ -25,6 +25,7 @@ <check_box label="Landwiederverkauf zulassen" name="allow_land_resell_check"/> <check_box label="Landumverteilung zulassen" name="allow_parcel_changes_check"/> <check_box label="Landanzeige in Suche blockieren" name="block_parcel_search_check" tool_tip="Diese Region und ihre Parzellen in Suchergebnissen anzeigen"/> + <check_box label="Netzobjekte zulassen" name="mesh_rez_enabled_check" tool_tip="Anderen das Rezzen von Netzobjekten in dieser Region gestatten"/> <spinner label="Avatar-Limit" name="agent_limit_spin"/> <spinner label="Objektbonus" name="object_bonus_spin"/> <text label="Inhaltseinstufung" name="access_text"> diff --git a/indra/newview/skins/default/xui/de/panel_scrolling_param_base.xml b/indra/newview/skins/default/xui/de/panel_scrolling_param_base.xml index 990193574e5f4aff2fac6462ddf1a587a74be247..fa659040eaa57c1c5e325093dcc427058ea160b3 100644 --- a/indra/newview/skins/default/xui/de/panel_scrolling_param_base.xml +++ b/indra/newview/skins/default/xui/de/panel_scrolling_param_base.xml @@ -1,4 +1,4 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="LLScrollingPanelParamBase"> - <slider label="[BESCHR]" name="param slider"/> + <slider label="[DESC]" name="param slider"/> </panel> diff --git a/indra/newview/skins/default/xui/de/panel_sound_devices.xml b/indra/newview/skins/default/xui/de/panel_sound_devices.xml new file mode 100644 index 0000000000000000000000000000000000000000..da20f7e21406c1e44778d06f802613879536b69b --- /dev/null +++ b/indra/newview/skins/default/xui/de/panel_sound_devices.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<panel label="Geräteeinstellungen" name="device_settings_panel"> + <panel.string name="default_text"> + Standard + </panel.string> + <text name="Input"> + Eingabe + </text> + <text name="My volume label"> + Meine Lautstärke: + </text> + <slider_bar initial_value="1,0" name="mic_volume_slider" tool_tip="Lautstärke mit diesem Regler ändern"/> + <text name="wait_text"> + Bitte warten + </text> + <text name="Output"> + Ausgabe + </text> +</panel> diff --git a/indra/newview/skins/default/xui/de/strings.xml b/indra/newview/skins/default/xui/de/strings.xml index f32eb21dd3dff1f01f70068f8f13c55507e87556..d77b4a1e444f78441d85647078314499ebdce5ee 100644 --- a/indra/newview/skins/default/xui/de/strings.xml +++ b/indra/newview/skins/default/xui/de/strings.xml @@ -130,6 +130,139 @@ <string name="create_account_url"> http://join.secondlife.com/index.php?lang=de-DE </string> + <string name="LoginFailedViewerNotPermitted"> + Mit dem von Ihnen verwendeten Viewer ist der Zugriff auf Second Life nicht mehr möglich. Laden Sie von den folgenden Seite einen neuen Viewer herunter: +http://secondlife.com/download + +Weitere Informationen finden Sie auf der folgenden FAQ-Seite: +http://secondlife.com/viewer-access-faq + </string> + <string name="LoginIntermediateOptionalUpdateAvailable"> + Optionales Viewer-Update verfügbar: [VERSION] + </string> + <string name="LoginFailedRequiredUpdate"> + Erforderliches Viewer-Update: [VERSION] + </string> + <string name="LoginFailedAlreadyLoggedIn"> + Dieser Agent ist bereits angemeldet. + </string> + <string name="LoginFailedAuthenticationFailed"> + Wir bitten um Entschuldigung! Wir konnten Sie nicht anmelden. +Stellen Sie sicher, dass Sie die richtigen Informationen eingegeben haben: + * Benutzername (wie robertschmidt12 oder warme.sonne) + * Kennwort +Stellen Sie außerdem sicher, dass die Umschaltsperre deaktiviert ist. + </string> + <string name="LoginFailedPasswordChanged"> + Ihr Kennwort wurde aus Sicherheitsgründen geändert. +Gehen Sie zur Seite „Mein Account“ unter http://secondlife.com/password +und beantworten Sie die Sicherheitsfrage, um Ihr Kennwort zurückzusetzen. +Wir entschuldigen uns für eventuell enstandene Unannehmlichkeiten. + </string> + <string name="LoginFailedPasswordReset"> + Aufgrund von Systemänderungen müssen Sie Ihr Kennwort zurücksetzen. +Gehen Sie zur Seite „Mein Account“ unter http://secondlife.com/password +und beantworten Sie die Sicherheitsfrage, um Ihr Kennwort zurückzusetzen. +Wir entschuldigen uns für eventuell enstandene Unannehmlichkeiten. + </string> + <string name="LoginFailedEmployeesOnly"> + Second Life ist vorübergehend wegen Wartung geschlossen. +Nur Mitarbeiter können sich anmelden. +Aktuelle Informationen finden Sie unter www.secondlife.com/status. + </string> + <string name="LoginFailedPremiumOnly"> + Die Anmeldung bei Second Life ist vorübergehend eingeschränkt, um sicherzustellen, dass Einwohner, die sich bereits inworld aufhalten, das bestmögliche Erlebnis haben. + +Benutzer mit kostenlosen Konten können sich während dieses Zeitraums nicht bei Second Life anmelden, damit die Kapazität den Benutzern zur Verfügung steht, die ein gebührenpflichtiges Premium-Konto besitzen. + </string> + <string name="LoginFailedComputerProhibited"> + Der Zugriff auf Second Life ist von diesem Computer aus nicht möglich. +Wenn Sie der Ansicht sind, dass Sie diese Meldung fälschlicherweise erhalten haben, wenden Sie sich an +support@secondlife.com. + </string> + <string name="LoginFailedAcountSuspended"> + Ihr Konto ist erst ab +[TIME] Pacific Time wieder verfügbar. + </string> + <string name="LoginFailedAccountDisabled"> + Ihre Anfrage kann derzeit nicht bearbeitet werden. +Wenden Sie sich unter http://secondlife.com/support an den Second Life-Support. +Wenn Sie Ihr Kennwort nicht ändern können, rufen Sie die US-Nummer (866) 476-9763 an. + </string> + <string name="LoginFailedTransformError"> + Nicht übereinstimmende Daten bei der Anmeldung festgestellt. +Wenden Sie sich an support@secondlife.com. + </string> + <string name="LoginFailedAccountMaintenance"> + An Ihrem Konto werden gerade kleinere Wartungsarbeiten durchgeführt. +Ihr Konto ist erst ab +[TIME] Pacific Time wieder verfügbar. +Wenn Sie der Ansicht sind, dass Sie diese Meldung fälschlicherweise erhalten haben, wenden Sie sich an support@secondlife.com. + </string> + <string name="LoginFailedPendingLogoutFault"> + Abmeldeanforderung führte zu einem Simulatorfehler. + </string> + <string name="LoginFailedPendingLogout"> + Das System meldet Sie gerade ab. +Ihr Konto ist erst ab +[TIME] Pacific Time wieder verfügbar. + </string> + <string name="LoginFailedUnableToCreateSession"> + Es kann keine gültige Sitzung erstellt werden. + </string> + <string name="LoginFailedUnableToConnectToSimulator"> + Es kann keine Simulatorverbindung hergestellt werden. + </string> + <string name="LoginFailedRestrictedHours"> + Mit Ihrem Konto ist der Zugriff auf Second Life +nur zwischen [START] und [END] Pacific Time möglich. +Schauen Sie während dieses Zeitraums vorbei. +Wenn Sie der Ansicht sind, dass Sie diese Meldung fälschlicherweise erhalten haben, wenden Sie sich an support@secondlife.com. + </string> + <string name="LoginFailedIncorrectParameters"> + Falsche Parameter. +Wenn Sie der Ansicht sind, dass Sie diese Meldung fälschlicherweise erhalten haben, wenden Sie sich an support@secondlife.com. + </string> + <string name="LoginFailedFirstNameNotAlphanumeric"> + Vorname muss alphanumerisch sein. +Wenn Sie der Ansicht sind, dass Sie diese Meldung fälschlicherweise erhalten haben, wenden Sie sich an support@secondlife.com. + </string> + <string name="LoginFailedLastNameNotAlphanumeric"> + Nachname muss alphanumerisch sein. +Wenn Sie der Ansicht sind, dass Sie diese Meldung fälschlicherweise erhalten haben, wenden Sie sich an support@secondlife.com. + </string> + <string name="LogoutFailedRegionGoingOffline"> + Die Region wird gerade offline geschaltet. +Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden. + </string> + <string name="LogoutFailedAgentNotInRegion"> + Agent nicht in Region. +Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden. + </string> + <string name="LogoutFailedPendingLogin"> + Die Region war gerade dabei, eine andere Sitzung anzumelden. +Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden. + </string> + <string name="LogoutFailedLoggingOut"> + Die Region war gerade dabei, die vorherige Sitzung abzumelden. +Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden. + </string> + <string name="LogoutFailedStillLoggingOut"> + Die Region ist noch immer dabei, die vorherige Sitzung abzumelden. +Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden. + </string> + <string name="LogoutSucceeded"> + Die Region hat soeben die letzte Sitzung abgemeldet. +Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden. + </string> + <string name="LogoutFailedLogoutBegun"> + Die Region hat den Abmeldevorgang gestartet. +Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden. + </string> + <string name="LoginFailedLoggingOutSession"> + Das System hat begonnen, Ihre letzte Sitzung abzumelden. +Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden. + </string> <string name="AgentLostConnection"> In dieser Region kann es zu Problemen kommen. Bitte überprüfen Sie Ihre Internetverbindung. </string> @@ -441,6 +574,9 @@ <string name="symbolic folder link"> Link zu Ordner </string> + <string name="mesh"> + mesh + </string> <string name="AvatarEditingAppearance"> (Aussehen wird bearbeitet) </string> @@ -1180,6 +1316,9 @@ <string name="InvFolder Accessories"> Zubehör </string> + <string name="InvFolder Meshes"> + Netze + </string> <string name="InvFolder Friends"> Freunde </string> @@ -3762,6 +3901,9 @@ Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich bitte an [SUPPORT_ <string name="session_initialization_timed_out_error"> Die Initialisierung der Sitzung ist fehlgeschlagen </string> + <string name="Home position set."> + Position für Zuhause festgelegt. + </string> <string name="voice_morphing_url"> http://secondlife.com/landing/voicemorphing </string> diff --git a/indra/newview/skins/default/xui/en/floater_model_preview.xml b/indra/newview/skins/default/xui/en/floater_model_preview.xml index dce55dae128654190cb8b7d343def0d9f80f59f3..f58595b3c57246ce86a918f1f1b570477b9bc2f3 100644 --- a/indra/newview/skins/default/xui/en/floater_model_preview.xml +++ b/indra/newview/skins/default/xui/en/floater_model_preview.xml @@ -4,9 +4,11 @@ name="Model Preview" title="Upload Model" width="620"> <string name="status_idle">Idle</string> + <string name="status_parse_error">Dae parsing issue - see log for details.</string> <string name="status_reading_file">Loading...</string> <string name="status_generating_meshes">Generating Meshes...</string> <string name="status_vertex_number_overflow">Error: Vertex number is more than 65534, aborted!</string> + <string name="bad_element">Error: element is invalid</string> <string name="high">High</string> <string name="medium">Medium</string> <string name="low">Low</string> @@ -83,6 +85,20 @@ </text> </panel> + <check_box + height="16" + left_delta="0" + name="confirm_checkbox" + top_pad="15" + follows="bottom|left" + width="16" /> + + <text + height="30" + width="570" + word_wrap="true" + left_delta="25" + top_delta="0">I confirm that I have the appropriate rights to the material contained in this model. [secondlife:///app/floater/learn_more Learn more]</text> <text left="10" bottom="540" width="290" height="15" follows="bottom|left|right" name="status">[STATUS]</text> diff --git a/indra/newview/skins/default/xui/en/floater_model_wizard.xml b/indra/newview/skins/default/xui/en/floater_model_wizard.xml index 47b2e5fd79e468da3acc016ab02fb3c7c61ce6e2..8603682e3ab3129124513131c3d4bd0f2621325d 100644 --- a/indra/newview/skins/default/xui/en/floater_model_wizard.xml +++ b/indra/newview/skins/default/xui/en/floater_model_wizard.xml @@ -1019,9 +1019,11 @@ Advanced users familiar with 3d content creation tools may prefer to use the [se <spinner visible="false" left="10" height="20" follows="top|left" width="80" top_pad="-50" value="1.0" min_val="0.01" max_val="64.0" name="import_scale"/> <string name="status_idle">Idle</string> + <string name="status_parse_error">Dae parsing issue - see log for details.</string> <string name="status_reading_file">Loading...</string> <string name="status_generating_meshes">Generating Meshes...</string> - <string name="status_vertex_number_overflow">Error: Vertex number is more than 65534, aborted!</string> + <string name="status_vertex_number_overflow">Error: Vertex number is more than 65534, aborted!</string> + <string name="bad_element">Error: element is invalid</string> <string name="high">High</string> <string name="medium">Medium</string> <string name="low">Low</string> diff --git a/indra/newview/skins/default/xui/en/floater_preview_gesture.xml b/indra/newview/skins/default/xui/en/floater_preview_gesture.xml index 9f6199fada89cbe46f99c26e869e42a2eaaca8eb..478ae5f53f0fa2a3de68bfb83236c2fc1c4a01d3 100644 --- a/indra/newview/skins/default/xui/en/floater_preview_gesture.xml +++ b/indra/newview/skins/default/xui/en/floater_preview_gesture.xml @@ -50,17 +50,17 @@ name="desc_label" top_pad="25" font.style="BOLD" - width="100"> + width="105"> Description: </text> <line_editor follows="left|top" height="20" layout="topleft" - left_delta="89" + left_delta="94" name="desc" top_delta="-4" - width="175" /> + width="170" /> <text type="string" length="1" @@ -96,19 +96,19 @@ name="replace_text" tool_tip="Replace the trigger word(s) with these words. For example, trigger 'hello' replace with 'howdy' will turn the chat 'I wanted to say hello' into 'I wanted to say howdy' as well as playing the gesture!" top_pad="10" - width="210"> + width="215"> Replace with: </text> <line_editor follows="left|top" height="20" layout="topleft" - left_delta="99" + left_delta="104" max_length_bytes="31" name="replace_editor" tool_tip="Replace the trigger word(s) with these words. For example, trigger 'hello' replace with 'howdy' will turn the chat 'I wanted to say hello' into 'I wanted to say howdy' as well as playing the gesture" top_delta="-4" - width="165" /> + width="160" /> <text type="string" length="1" diff --git a/indra/newview/skins/default/xui/en/floater_snapshot.xml b/indra/newview/skins/default/xui/en/floater_snapshot.xml index ec190ab656c97b261109b5b06a9dcd1be8dc72e5..89a0c4c287327eb53a2954310f9ab54f14b654f6 100644 --- a/indra/newview/skins/default/xui/en/floater_snapshot.xml +++ b/indra/newview/skins/default/xui/en/floater_snapshot.xml @@ -330,13 +330,13 @@ increment="1" initial_value="75" label="Image quality" - label_width="100" + label_width="124" layout="topleft" left_delta="0" max_val="100" name="image_quality_slider" top_pad="5" - width="205" /> + width="228" /> <text type="string" length="1" diff --git a/indra/newview/skins/default/xui/en/floater_tools.xml b/indra/newview/skins/default/xui/en/floater_tools.xml index 40bf7bfed75608d4530c6cceabfd1d709f9f4eef..8b8f70b940b2f69cd289ddc0f0ff10530c8849ee 100644 --- a/indra/newview/skins/default/xui/en/floater_tools.xml +++ b/indra/newview/skins/default/xui/en/floater_tools.xml @@ -279,7 +279,7 @@ layout="topleft" left_pad="2" name="unlink_btn" - width="50"> + width="105"> <button.commit_callback function="BuildTool.UnlinkObjects"/> </button> @@ -2098,11 +2098,7 @@ even though the user gets a free copy. label="Cylinder" name="Cylinder" value="Cylinder" /> - <combo_box.item - label="Mesh" - name="Mesh" - value="Mesh" /> - </combo_box> + </combo_box> </panel> <panel border="false" @@ -2461,8 +2457,9 @@ even though the user gets a free copy. height="19" increment="0.1" initial_value="0" - label="Density" + label="Density in 100 kg/m^3" label_width="70" + label_wrap="true" layout="topleft" left_delta="0" max_val="22587" @@ -2483,7 +2480,7 @@ even though the user gets a free copy. max_val="1" min_val="0" name="Physics Restitution" - top_pad="4" + top_pad="8" width="132" /> </panel> <panel diff --git a/indra/newview/skins/default/xui/en/main_view.xml b/indra/newview/skins/default/xui/en/main_view.xml index 3ead67ca57f85efe27c303cc30c971a6109dbb01..a7d1aa963c7101f8c07676f1b4453de1e44f66f7 100644 --- a/indra/newview/skins/default/xui/en/main_view.xml +++ b/indra/newview/skins/default/xui/en/main_view.xml @@ -135,6 +135,14 @@ name="login_panel_holder" width="1024"/> + <debug_view follows="all" + left="0" + top="0" + mouse_opaque="false" + height="500" + name="DebugView" + width="1024"/> + <panel follows="all" height="500" left="0" @@ -154,13 +162,6 @@ top="0" width="1024"/> </panel> - <debug_view follows="all" - left="0" - top="0" - mouse_opaque="false" - height="500" - name="DebugView" - width="1024"/> </layout_panel> </layout_stack> <panel mouse_opaque="false" diff --git a/indra/newview/skins/default/xui/en/menu_people_nearby_view_sort.xml b/indra/newview/skins/default/xui/en/menu_people_nearby_view_sort.xml index f9db64b5241f6e19603a0a6f55d23befcaf02f57..65bd2793b606b6b9366bb78a1844d1ac80d73708 100644 --- a/indra/newview/skins/default/xui/en/menu_people_nearby_view_sort.xml +++ b/indra/newview/skins/default/xui/en/menu_people_nearby_view_sort.xml @@ -42,6 +42,14 @@ function="CheckControl" parameter="NearbyListShowIcons" /> </menu_item_check> + <menu_item_check name ="view_map" label="View Map"> + <menu_item_check.on_check + function="CheckControl" + parameter="NearbyListShowMap" /> + <menu_item_check.on_click + function="ToggleControl" + parameter="NearbyListShowMap" /> + </menu_item_check> <menu_item_separator layout="topleft" /> <menu_item_call name="show_blocked_list" label="Show Blocked Residents & Objects"> <menu_item_call.on_click function="SideTray.ShowPanel" userdata="panel_block_list_sidetray" /> diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index ce96c488b482063cba823331dcc2895d657f97a2..db1cee5d0823e5323c40a8331b0b02fd83ea0448 100644 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -3696,6 +3696,19 @@ Join me in [REGION] </form> </notification> + <notification + icon="alertmodal.tga" + name="TooManyTeleportOffers" + type="alertmodal"> +You attempted to make [OFFERS] teleport offers +which exceeds the limit of [LIMIT]. + <tag>group</tag> + <tag>fail</tag> + <usetemplate + name="okbutton" + yestext="OK"/> + </notification> + <notification icon="alertmodal.tga" name="OfferTeleportFromGod" @@ -6823,7 +6836,9 @@ Select residents to share with. name="MeshUploadError" icon="alert.tga" type="alert"> - [LABEL] failed to upload: [MESSAGE] [IDENTIFIER] [INVALIDITY_IDENTIFIER] + [LABEL] failed to upload: [MESSAGE] [IDENTIFIER] + +See the log file for details. </notification> <notification diff --git a/indra/newview/skins/default/xui/en/panel_cof_wearables.xml b/indra/newview/skins/default/xui/en/panel_cof_wearables.xml index f438e3d42d3f8bf2c0ce99a034529effa330e703..9e70706603cafe8f459d1a71445cf03b80097d33 100644 --- a/indra/newview/skins/default/xui/en/panel_cof_wearables.xml +++ b/indra/newview/skins/default/xui/en/panel_cof_wearables.xml @@ -52,10 +52,7 @@ multi_select="true" name="list_attachments" top="0" - width="311"> - <flat_list_view.no_items_text - value="No attachments worn" /> - </flat_list_view> + width="311"/> </accordion_tab> <accordion_tab layout="topleft" diff --git a/indra/newview/skins/default/xui/en/panel_nearby_media.xml b/indra/newview/skins/default/xui/en/panel_nearby_media.xml index 9bd60b935f6cc49bba64da11999617736b3feb4c..bfc503f05b05a6199e676b05dceaae5ac7b4cfcb 100644 --- a/indra/newview/skins/default/xui/en/panel_nearby_media.xml +++ b/indra/newview/skins/default/xui/en/panel_nearby_media.xml @@ -104,12 +104,12 @@ top_pad="15" left="10" name="show_text" - width="40"> + width="62"> Show: </text> <combo_box height="23" - left="50" + left="72" width="140" top_delta="-5" follows="left|top" diff --git a/indra/newview/skins/default/xui/en/panel_outfits_list.xml b/indra/newview/skins/default/xui/en/panel_outfits_list.xml index 9f98019c948ad53a4d746444516041c5736d2a60..a0096adc0167614308428e3d7d2f77106410cd9e 100644 --- a/indra/newview/skins/default/xui/en/panel_outfits_list.xml +++ b/indra/newview/skins/default/xui/en/panel_outfits_list.xml @@ -14,9 +14,7 @@ background_visible="true" bg_alpha_color="DkGray2" bg_opaque_color="DkGray2" - no_matched_tabs_text.value="Didn't find what you're looking for? Try [secondlife:///app/search/all/[SEARCH_TERM] Search]." - no_matched_tabs_text.v_pad="10" - no_visible_tabs_text.value="You don't have any outfits yet. Try [secondlife:///app/search/all/ Search]" + follows="all" height="400" layout="topleft" @@ -24,6 +22,13 @@ name="outfits_accordion" top="0" width="309"> + <no_matched_tabs_text + name="no_matched_outfits_msg" + value="Didn't find what you're looking for? Try [secondlife:///app/search/all/[SEARCH_TERM] Search]." + v_pad="10"/> + <no_visible_tabs_text + name="no_outfits_msg" + value="You don't have any outfits yet. Try [secondlife:///app/search/all/ Search]"/> </accordion> <panel background_visible="true" diff --git a/indra/newview/skins/default/xui/en/panel_people.xml b/indra/newview/skins/default/xui/en/panel_people.xml index 1a00416b2a487a0e903f9058f8435c5c8b1fb4ca..cc4522f9443711f50669c9b708e650b1f7e924bb 100644 --- a/indra/newview/skins/default/xui/en/panel_people.xml +++ b/indra/newview/skins/default/xui/en/panel_people.xml @@ -87,7 +87,7 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M width="319"> <panel background_opaque="true" - background_visible="true" + background_visible="true" bg_alpha_color="DkGray" bg_opaque_color="DkGray" follows="all" @@ -99,28 +99,55 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M name="nearby_panel" top="0" width="313"> - <net_map - bg_color="NetMapBackgroundColor" - follows="top|left|right" - layout="topleft" - left="3" - mouse_opaque="false" - name="Net Map" - width="305" - height="140" - top="5"/> - <avatar_list - allow_select="true" - follows="top|left|bottom|right" - height="211" - ignore_online_status="true" + <layout_stack + clip="false" + follows="all" + height="355" + layout="topleft" + mouse_opaque="false" + orientation="vertical" + width="313"> + <layout_panel + height="142" layout="topleft" - left="3" - multi_select="true" - name="avatar_list" - top="145" - width="306" /> - <panel + min_dim="100" + mouse_opaque="false" + user_resize="true" + visibility_control="NearbyListShowMap" + width="313"> + <net_map + bg_color="NetMapBackgroundColor" + follows="all" + height="140" + layout="topleft" + left="3" + mouse_opaque="false" + name="Net Map" + top="4" + width="305"/> + </layout_panel> + <layout_panel + height="213" + layout="topleft" + min_dim="100" + mouse_opaque="false" + user_resize="true" + width="313"> + <avatar_list + allow_select="true" + follows="all" + height="211" + ignore_online_status="true" + layout="topleft" + left="3" + keep_one_selected="false" + multi_select="true" + name="avatar_list" + top="2" + width="306" /> + </layout_panel> + </layout_stack> + <panel background_visible="true" follows="left|right|bottom" height="27" @@ -595,7 +622,7 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M height="23" layout="bottomleft" left_pad="3" - name="chat_btn_lp" + name="im_btn_lp" user_resize="false" auto_resize="true" width="41"> @@ -616,7 +643,7 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M height="23" layout="bottomleft" left_pad="3" - name="chat_btn_lp" + name="call_btn_lp" user_resize="false" auto_resize="true" width="52"> @@ -637,7 +664,7 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M height="23" layout="bottomleft" left_pad="3" - name="chat_btn_lp" + name="share_btn_lp" user_resize="false" auto_resize="true" width="66"> @@ -658,7 +685,7 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M height="23" layout="bottomleft" left_pad="3" - name="chat_btn_lp" + name="teleport_btn_lp" user_resize="false" auto_resize="true" width="77"> diff --git a/indra/newview/skins/default/xui/en/panel_preferences_sound.xml b/indra/newview/skins/default/xui/en/panel_preferences_sound.xml index 91fe6f544c3e9dab81c8e4c6a8ac581e900e07e1..1745c1e4b0e2f8b0fe862e697bfc0dcae47c743c 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_sound.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_sound.xml @@ -123,8 +123,8 @@ function="Pref.setControlFalse" parameter="MuteAmbient" /> </slider> - <button - control_name="MuteAmbient" + <button + control_name="MuteAmbient" disabled_control="MuteAudio" follows="top|left" height="16" @@ -157,7 +157,7 @@ function="Pref.setControlFalse" parameter="MuteSounds" /> </slider> - <button + <button control_name="MuteSounds" disabled_control="MuteAudio" follows="top|left" @@ -169,7 +169,10 @@ left_pad="5" name="mute_audio" tab_stop="false" - width="16" /> + width="16"> + <button.commit_callback + function="Pref.SetSounds"/> + </button> <slider control_name="AudioLevelMusic" disabled_control="MuteAudio" @@ -332,7 +335,17 @@ label="Play media attached to other avatars" left="25" width="230"/> - + <check_box + name="gesture_audio_play_btn" + control_name="EnableGestureSounds" + disabled_control="MuteAudio" + value="true" + follows="left|bottom|right" + height="15" + tool_tip="Check this to hear sounds from gestures" + label="Play sounds from gestures" + top_pad="1" + left="25"/> <text type="string" length="1" diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml index 339f14eacbc80571524920886cb3add7c2d9525d..143a989d321598dd435233770e441740853764aa 100644 --- a/indra/newview/skins/default/xui/en/strings.xml +++ b/indra/newview/skins/default/xui/en/strings.xml @@ -2101,6 +2101,8 @@ Returns a string with the requested data about the region <string name="InvFolder Friends">Friends</string> <string name="InvFolder All">All</string> + <string name="no_attachments">No attachments worn</string> + <!-- inventory FVBridge --> <!-- This is used in llpanelinventory.cpp when constructing a context menu for an item for Sale --> <string name="Buy">Buy</string> @@ -2248,6 +2250,9 @@ Returns a string with the requested data about the region <string name="IMMainland">mainland</string> <string name="IMTeen">teen</string> + <!-- floater about land --> + <string name="Anyone">anyone</string> + <!-- floater region info --> <!-- The following will replace variable [ALL_ESTATES] in notifications EstateAllowed*, EstateBanned*, EstateManager* --> <string name="RegionInfoError">error</string> diff --git a/indra/newview/skins/default/xui/es/floater_buy_currency.xml b/indra/newview/skins/default/xui/es/floater_buy_currency.xml index 2f92cb55ebc8be255450db8db1a44b4a733dc76a..43bbf0b70fc5a36bf62eb2e646762d906247b3f7 100644 --- a/indra/newview/skins/default/xui/es/floater_buy_currency.xml +++ b/indra/newview/skins/default/xui/es/floater_buy_currency.xml @@ -18,7 +18,7 @@ <text name="balance_amount"> [AMT] L$ </text> - <text name="currency_action" width="50"> + <text name="currency_action"> Quiero comprar </text> <text name="currency_label"> diff --git a/indra/newview/skins/default/xui/es/floater_tools.xml b/indra/newview/skins/default/xui/es/floater_tools.xml index 9d29bc40bfa0adb047430487c506fc0bcb8dab21..78f18b745cabdca2ee78f6969e77e4307c0ef285 100644 --- a/indra/newview/skins/default/xui/es/floater_tools.xml +++ b/indra/newview/skins/default/xui/es/floater_tools.xml @@ -65,7 +65,7 @@ </radio_group> <check_box label="Editar las partes enlazadas" name="checkbox edit linked parts"/> <button label="Enlazar" name="link_btn"/> - <button label="Desenlazar" name="unlink_btn"/> + <button label="Desenlazar" name="unlink_btn" width="95"/> <text name="RenderingCost" tool_tip="Muestra cuánto se calcula que cuesta renderizar este objeto"> þ: [COUNT] </text> diff --git a/indra/newview/skins/default/xui/es/notifications.xml b/indra/newview/skins/default/xui/es/notifications.xml index 9674f73241108e75da2c198faf4881adb4ca8d6c..b2131fc038af04ea8fbdaef97a52eb87a4072fd3 100644 --- a/indra/newview/skins/default/xui/es/notifications.xml +++ b/indra/newview/skins/default/xui/es/notifications.xml @@ -2365,6 +2365,9 @@ Por favor, dirÃgete a la Base de Conocimientos para más detalles sobre el acce <notification name="ImproperPaymentStatus"> No tienes el estado de pago adecuado para entrar a esta región. </notification> + <notification name="MustGetAgeRgion"> + Debes tener verificada la edad para entrar a esta región + </notification> <notification name="MustGetAgeParcel"> Debes haber verificado tu edad para entrar a esta parcela. </notification> diff --git a/indra/newview/skins/default/xui/es/panel_navigation_bar.xml b/indra/newview/skins/default/xui/es/panel_navigation_bar.xml index e8e95c3bac3f98a18bbafc80ae913772759d1d24..293c9ef1d9491fc8b21ff5dc62bc6db7dd281f86 100644 --- a/indra/newview/skins/default/xui/es/panel_navigation_bar.xml +++ b/indra/newview/skins/default/xui/es/panel_navigation_bar.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="navigation_bar"> <panel name="navigation_panel"> - <pull_button name="back_btn" tool_tip="Volver a lo localización anterior"/> + <pull_button name="back_btn" tool_tip="Volver a la localización anterior"/> <pull_button name="forward_btn" tool_tip="Ir una localización adelante"/> <button name="home_btn" tool_tip="Teleportar a mi Base"/> <location_input label="Localización" name="location_combo"/> diff --git a/indra/newview/skins/default/xui/es/panel_people.xml b/indra/newview/skins/default/xui/es/panel_people.xml index 01149e412ddcb63ea32684d84ea5152f4fb89abf..a9d38dca2502807bae6ed8b37651ad1bf088cdbd 100644 --- a/indra/newview/skins/default/xui/es/panel_people.xml +++ b/indra/newview/skins/default/xui/es/panel_people.xml @@ -66,16 +66,16 @@ <layout_panel name="view_profile_btn_lp"> <button label="Perfil" name="view_profile_btn" tool_tip="Mostrar imágenes, grupos y otra información del Residente"/> </layout_panel> - <layout_panel name="chat_btn_lp"> + <layout_panel name="im_btn_lp"> <button label="MI" name="im_btn" tool_tip="Abrir una sesión de mensajes instantáneos"/> </layout_panel> - <layout_panel name="chat_btn_lp"> + <layout_panel name="call_btn_lp"> <button label="Llamar" name="call_btn" tool_tip="Llamar a este Residente"/> </layout_panel> - <layout_panel name="chat_btn_lp"> + <layout_panel name="share_btn_lp"> <button label="Compartir" name="share_btn" tool_tip="Compartir un objeto del inventario"/> </layout_panel> - <layout_panel name="chat_btn_lp"> + <layout_panel name="teleport_btn_lp"> <button label="Teleporte" name="teleport_btn" tool_tip="Ofrecer teleporte"/> </layout_panel> </layout_stack> diff --git a/indra/newview/skins/default/xui/es/panel_preferences_colors.xml b/indra/newview/skins/default/xui/es/panel_preferences_colors.xml index e6e4c132038c654f95d5be28a9cd283ae923db15..d47a6d718a688958078b3f889c057530dbf2a7ec 100644 --- a/indra/newview/skins/default/xui/es/panel_preferences_colors.xml +++ b/indra/newview/skins/default/xui/es/panel_preferences_colors.xml @@ -39,6 +39,6 @@ <text name="floater_opacity"> Opacidad de la ventana: </text> - <slider label="Activo:" name="active"/> - <slider label="Inactivo:" name="inactive"/> + <slider label="Activa:" name="active"/> + <slider label="Inactiva:" name="inactive"/> </panel> diff --git a/indra/newview/skins/default/xui/es/panel_preferences_sound.xml b/indra/newview/skins/default/xui/es/panel_preferences_sound.xml index fa7806a75aa7643628aacd5becefe3a661a4ca96..75d175b262b261881a3b137f4f8a16dd3cdee3fa 100644 --- a/indra/newview/skins/default/xui/es/panel_preferences_sound.xml +++ b/indra/newview/skins/default/xui/es/panel_preferences_sound.xml @@ -12,7 +12,7 @@ <slider label="Ambiental" name="Wind Volume"/> <slider label="Efectos de sonido" name="SFX Volume"/> <slider label="Música en streaming" name="Music Volume"/> - <check_box label="Activados" name="enable_music"/> + <check_box label="Activada" name="enable_music"/> <slider label="Multimedia" name="Media Volume"/> <check_box label="Activados" name="enable_media"/> <slider label="Chat de voz" name="Voice Volume"/> diff --git a/indra/newview/skins/default/xui/es/strings.xml b/indra/newview/skins/default/xui/es/strings.xml index 3731b6b57c54dd235c56665a67b268c99f0c20da..b759eed738e47fa215ff9fc8c01289a9c4bc9728 100644 --- a/indra/newview/skins/default/xui/es/strings.xml +++ b/indra/newview/skins/default/xui/es/strings.xml @@ -3628,6 +3628,9 @@ Si sigues recibiendo este mensaje, contacta con [SUPPORT_SITE]. <string name="LocationCtrlComboBtnTooltip"> Historial de mis localizaciones </string> + <string name="LocationCtrlForSaleTooltip"> + Comprar este terreno + </string> <string name="LocationCtrlAdultIconTooltip"> Región Adulta </string> diff --git a/indra/newview/skins/default/xui/fr/panel_people.xml b/indra/newview/skins/default/xui/fr/panel_people.xml index 166f04b3e47ce7437342c57b6b7d4c910b6c663c..b24c340708490c1e6d7eaa6d3c4c9730e16c6b0b 100644 --- a/indra/newview/skins/default/xui/fr/panel_people.xml +++ b/indra/newview/skins/default/xui/fr/panel_people.xml @@ -66,16 +66,16 @@ Pour rechercher des résidents avec qui passer du temps, utilisez [secondlife:// <layout_panel name="view_profile_btn_lp"> <button label="Profil" name="view_profile_btn" tool_tip="Afficher la photo, les groupes et autres infos des résidents"/> </layout_panel> - <layout_panel name="chat_btn_lp"> + <layout_panel name="im_btn_lp"> <button label="IM" name="im_btn" tool_tip="Ouvrir une session IM"/> </layout_panel> - <layout_panel name="chat_btn_lp"> + <layout_panel name="call_btn_lp"> <button label="Appel" name="call_btn" tool_tip="Appeler ce résident"/> </layout_panel> - <layout_panel name="chat_btn_lp"> + <layout_panel name="share_btn_lp"> <button label="Partager" name="share_btn" tool_tip="Partager un article de l'inventaire"/> </layout_panel> - <layout_panel name="chat_btn_lp"> + <layout_panel name="teleport_btn_lp"> <button label="Téléporter" name="teleport_btn" tool_tip="Proposer une téléportation"/> </layout_panel> </layout_stack> diff --git a/indra/newview/skins/default/xui/it/panel_people.xml b/indra/newview/skins/default/xui/it/panel_people.xml index b24a4055f76dca969fec1b431f1e30f488489ef2..f903ae6e2c02a708e51f8bbc5ca8d5a35349b0a0 100644 --- a/indra/newview/skins/default/xui/it/panel_people.xml +++ b/indra/newview/skins/default/xui/it/panel_people.xml @@ -66,16 +66,16 @@ Stai cercando persone da frequentare? Prova la [secondlife:///app/worldmap Mappa <layout_panel name="view_profile_btn_lp"> <button label="Profilo" name="view_profile_btn" tool_tip="Mostra immagine, gruppi e altre informazioni del residente"/> </layout_panel> - <layout_panel name="chat_btn_lp"> + <layout_panel name="im_btn_lp"> <button label="IM" name="im_btn" tool_tip="Apri una sessione messaggio istantaneo"/> </layout_panel> - <layout_panel name="chat_btn_lp"> + <layout_panel name="call_btn_lp"> <button label="Chiama" name="call_btn" tool_tip="Chiama questo residente"/> </layout_panel> - <layout_panel name="chat_btn_lp"> + <layout_panel name="share_btn_lp"> <button label="Condividi" name="share_btn" tool_tip="Condividi un oggetto dell'inventario"/> </layout_panel> - <layout_panel name="chat_btn_lp"> + <layout_panel name="teleport_btn_lp"> <button label="Teleport" name="teleport_btn" tool_tip="Offri teleport"/> </layout_panel> </layout_stack> diff --git a/indra/newview/skins/default/xui/ja/floater_tools.xml b/indra/newview/skins/default/xui/ja/floater_tools.xml index 0b14f92ae798b2c421c2fb0d4b09e47d89129b71..f7d77d351edda100c1e392d15f3b5996e88fd01d 100644 --- a/indra/newview/skins/default/xui/ja/floater_tools.xml +++ b/indra/newview/skins/default/xui/ja/floater_tools.xml @@ -69,13 +69,13 @@ <text name="RenderingCost" tool_tip="ã“ã®ã‚ªãƒ–ジェクトã«ã‹ã‹ã‚‹ãƒ¬ãƒ³ãƒ€ãƒªãƒ³ã‚°ã‚³ã‚¹ãƒˆã‚’表示"> þ: [COUNT] </text> - <check_box label="" left="116" name="checkbox uniform"/> + <check_box label="" name="checkbox uniform"/> <text label="両å´ã‚’延ã°ã™" name="checkbox uniform label"> 両å´ã‚’延ã°ã™ </text> <check_box initial_value="true" label="テクスãƒãƒ£ã‚’引ã延ã°ã™" name="checkbox stretch textures"/> - <check_box initial_value="true" label="グリッドã«ã‚¹ãƒŠãƒƒãƒ—" left_delta="27" name="checkbox snap to grid"/> - <combo_box left_delta="60" name="combobox grid mode" tool_tip="オブジェクトã®é…ç½®ã«ä½¿ã†ã‚°ãƒªãƒƒãƒ‰ãƒ«ãƒ¼ãƒ©ã‚’é¸æŠžã—ã¾ã™" width="76"> + <check_box initial_value="true" label="グリッドã«ã‚¹ãƒŠãƒƒãƒ—" name="checkbox snap to grid"/> + <combo_box name="combobox grid mode" tool_tip="オブジェクトã®é…ç½®ã«ä½¿ã†ã‚°ãƒªãƒƒãƒ‰ãƒ«ãƒ¼ãƒ©ã‚’é¸æŠžã—ã¾ã™" > <combo_box.item label="インワールドグリッド" name="World"/> <combo_box.item label="ãƒãƒ¼ã‚«ãƒ«ã‚°ãƒªãƒƒãƒ‰" name="Local"/> <combo_box.item label="リファレンスグリッド" name="Reference"/> @@ -137,7 +137,7 @@ <text name="object_cost" tool_tip="[prims] / [physics complexity] ã¨ã—ã¦ç¾åœ¨é¸æŠžã•ã‚Œã¦ã„るオブジェクトã®ã‚³ã‚¹ãƒˆ"> 料金: [COST] / [PHYSICS] </text> - <tab_container name="Object Info Tabs" tab_max_width="150" tab_min_width="30"> + <tab_container name="Object Info Tabs" > <panel label="一般" name="General"> <panel.string name="text deed continued"> è²æ¸¡ @@ -379,22 +379,22 @@ オブジェクトã®ç‰¹å¾´ã‚’編集: </text> <check_box label="フレã‚シブルパス" name="Flexible1D Checkbox Ctrl" tool_tip="Z 軸をä¸å¿ƒã«ã‚ªãƒ–ジェクトã®å±ˆæ›²ã‚’有効ã«ã—ã¾ã™ï¼ˆã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆå´ã®ã¿ï¼‰"/> - <spinner label="柔軟性" label_width="72" name="FlexNumSections" width="135"/> - <spinner label="é‡åŠ›" label_width="72" name="FlexGravity" width="135"/> - <spinner label="ドラッグ" label_width="72" name="FlexFriction" width="135"/> - <spinner label="風" label_width="72" name="FlexWind" width="135"/> - <spinner label="ç·Šå¼µ" label_width="72" name="FlexTension" width="135"/> - <spinner label="X 軸方å‘ã®åŠ›" label_width="72" name="FlexForceX" width="135"/> - <spinner label="Y 軸方å‘ã®åŠ›" label_width="72" name="FlexForceY" width="135"/> - <spinner label="Z 軸方å‘ã®åŠ›" label_width="72" name="FlexForceZ" width="135"/> + <spinner label="柔軟性" name="FlexNumSections" /> + <spinner label="é‡åŠ›" name="FlexGravity" /> + <spinner label="ドラッグ" name="FlexFriction" /> + <spinner label="風" name="FlexWind" /> + <spinner label="ç·Šå¼µ" name="FlexTension" /> + <spinner label="X 軸方å‘ã®åŠ›" name="FlexForceX" /> + <spinner label="Y 軸方å‘ã®åŠ›" name="FlexForceY" /> + <spinner label="Z 軸方å‘ã®åŠ›" name="FlexForceZ" /> <check_box label="å…‰" name="Light Checkbox Ctrl" tool_tip="オブジェクトãŒç™ºå…‰ã—ã¾ã™"/> - <color_swatch label="" left_delta="74" name="colorswatch" tool_tip="クリックã—ã¦ã‚«ãƒ©ãƒ¼ãƒ”ッカーを開ãã¾ã™"/> + <color_swatch label="" name="colorswatch" tool_tip="クリックã—ã¦ã‚«ãƒ©ãƒ¼ãƒ”ッカーを開ãã¾ã™"/> <texture_picker label="" name="light texture control" tool_tip="クリックã§æŠ•å½±ç”»ã‚’é¸æŠžã—ã¾ã™ï¼ˆé…延レンダリング有効時ã®ã¿ï¼‰"/> - <spinner label="è¼åº¦" label_width="72" name="Light Intensity" width="135"/> + <spinner label="è¼åº¦" name="Light Intensity" /> <spinner label="FOV" name="Light FOV"/> - <spinner label="åŠå¾„" label_width="72" name="Light Radius" width="135"/> + <spinner label="åŠå¾„" name="Light Radius" /> <spinner label="焦点" name="Light Focus"/> - <spinner label="å¼±ã¾ã‚‹" label_width="72" name="Light Falloff" width="135"/> + <spinner label="å¼±ã¾ã‚‹" name="Light Falloff" /> <spinner label="環境" name="Light Ambiance"/> <text name="label physicsshapetype"> 実åƒã®ç¨®é¡žï¼š @@ -496,18 +496,18 @@ </panel> </panel> <panel label="ä¸èº«" name="Contents"> - <button label="æ–°ã—ã„スクリプト" label_selected="æ–°è¦ã‚¹ã‚¯ãƒªãƒ—ト" name="button new script" width="120"/> - <button label="権é™" left_delta="130" name="button permissions" width="80"/> + <button label="æ–°ã—ã„スクリプト" label_selected="æ–°è¦ã‚¹ã‚¯ãƒªãƒ—ト" name="button new script" /> + <button label="権é™" name="button permissions" /> </panel> </tab_container> <panel name="land info panel"> <text name="label_parcel_info"> åŒºç”»æƒ…å ± </text> - <text name="label_area_price" width="200"> + <text name="label_area_price" > ä¾¡æ ¼ï¼š [AREA] 平方メートル L$ [PRICE] </text> - <text name="label_area" width="200"> + <text name="label_area" > é¢ç©ï¼š [AREA] 平方メートル </text> <button label="åœŸåœ°æƒ…å ±" label_selected="åœŸåœ°æƒ…å ±" name="button about land"/> diff --git a/indra/newview/skins/default/xui/ja/panel_people.xml b/indra/newview/skins/default/xui/ja/panel_people.xml index c7f71c6de093d22725a9b9a8779be028f2b8c2f4..1c90f7327eed51c75228c57a7d9594ac377363e1 100644 --- a/indra/newview/skins/default/xui/ja/panel_people.xml +++ b/indra/newview/skins/default/xui/ja/panel_people.xml @@ -66,16 +66,16 @@ <layout_panel name="view_profile_btn_lp"> <button label="プãƒãƒ•ã‚£ãƒ¼ãƒ«" name="view_profile_btn" tool_tip="写真ã€ã‚°ãƒ«ãƒ¼ãƒ—ã€ãã®ä»–ä½äººæƒ…å ±ã‚’è¡¨ç¤º"/> </layout_panel> - <layout_panel name="chat_btn_lp"> + <layout_panel name="im_btn_lp"> <button label="IM" name="im_btn" tool_tip="インスタントメッセージを開ãã¾ã™"/> </layout_panel> - <layout_panel name="chat_btn_lp"> + <layout_panel name="call_btn_lp"> <button label="コール" name="call_btn" tool_tip="ã“ã®ä½äººã«ã‚³ãƒ¼ãƒ«ã™ã‚‹"/> </layout_panel> - <layout_panel name="chat_btn_lp"> + <layout_panel name="share_btn_lp"> <button label="共有" name="share_btn" tool_tip="「æŒã¡ç‰©ã€ã®ã‚¢ã‚¤ãƒ†ãƒ を共有ã™ã‚‹"/> </layout_panel> - <layout_panel name="chat_btn_lp"> + <layout_panel name="teleport_btn_lp"> <button label="テレãƒãƒ¼ãƒˆ" name="teleport_btn" tool_tip="テレãƒãƒ¼ãƒˆã‚’é€ã‚Šã¾ã™"/> </layout_panel> </layout_stack> diff --git a/indra/newview/skins/default/xui/nl/floater_preview_gesture.xml b/indra/newview/skins/default/xui/nl/floater_preview_gesture.xml index 7dd85460a241fb48e55c95b4eca40abb381bb862..c6b301841ae78600c537c470a6e9233898cc31db 100644 --- a/indra/newview/skins/default/xui/nl/floater_preview_gesture.xml +++ b/indra/newview/skins/default/xui/nl/floater_preview_gesture.xml @@ -15,7 +15,7 @@ <text name="trigger_label"> Trigger: </text> - <text name="replace_text" tool_tip="Vervang de startseinwoorden door deze woorden. Bijvoorbeeld, startsein 'hallo' vervang door 'hoi' zal de chat 'Ik wilde hallo zeggen' veranderen in 'Ik wilde hoi zeggen', waarbij tevens het gebaar afgespeeld zal worden!" left="208"> + <text name="replace_text" tool_tip="Vervang de startseinwoorden door deze woorden. Bijvoorbeeld, startsein 'hallo' vervang door 'hoi' zal de chat 'Ik wilde hallo zeggen' veranderen in 'Ik wilde hoi zeggen', waarbij tevens het gebaar afgespeeld zal worden!"> Vervangen door: </text> <line_editor name="replace_editor" tool_tip="Vervang de startseinwoorden door deze woorden. Bijvoorbeeld, startsein 'hallo' vervang door 'hoi' zal de chat 'Ik wilde hallo zeggen' veranderen in 'Ik wilde hoi zeggen', waarbij tevens het gebaar afgespeeld zal worden."/> diff --git a/indra/newview/skins/default/xui/pl/panel_people.xml b/indra/newview/skins/default/xui/pl/panel_people.xml index da9f84cb2e423b2ff3f4e880099e11ff5f23b5fe..ef52e2148b7610f3a263a2c6867e5e35843b6299 100644 --- a/indra/newview/skins/default/xui/pl/panel_people.xml +++ b/indra/newview/skins/default/xui/pl/panel_people.xml @@ -66,16 +66,16 @@ Chcesz spotkać ludzi? Spróbuj [secondlife:///app/worldmap Mapa Åšwiata]. <layout_panel name="view_profile_btn_lp"> <button label="Profil" name="view_profile_btn" tool_tip="Pokaż zdjÄ™cie, grupy i inne informacje o Rezydencie"/> </layout_panel> - <layout_panel name="chat_btn_lp"> + <layout_panel name="im_btn_lp"> <button label="IM" name="im_btn" tool_tip="Otwórz wiadomoÅ›ci IM"/> </layout_panel> - <layout_panel name="chat_btn_lp"> + <layout_panel name="call_btn_lp"> <button label="DzwoÅ„" name="call_btn" tool_tip="ZadzwoÅ„ do tego Rezydenta"/> </layout_panel> - <layout_panel name="chat_btn_lp"> + <layout_panel name="share_btn_lp"> <button label="UdostÄ™pnij" name="share_btn" tool_tip="UdostÄ™pnij obiekt z Szafy"/> </layout_panel> - <layout_panel name="chat_btn_lp"> + <layout_panel name="teleport_btn_lp"> <button label="Teleportuj" name="teleport_btn" tool_tip="Zaproponuj teleport"/> </layout_panel> </layout_stack> diff --git a/indra/newview/skins/default/xui/pt/panel_people.xml b/indra/newview/skins/default/xui/pt/panel_people.xml index aece30738ba21c6e7c13a703ff8a0339a1624286..f3af15b99161ec89b069fd2a7e0673652c53441b 100644 --- a/indra/newview/skins/default/xui/pt/panel_people.xml +++ b/indra/newview/skins/default/xui/pt/panel_people.xml @@ -66,16 +66,16 @@ Em busca de alguém para conversar? Procure no [secondlife:///app/worldmap Mapa- <layout_panel name="view_profile_btn_lp"> <button label="Perfil" name="view_profile_btn" tool_tip="Exibir fotografia, grupos e outras informações dos residentes"/> </layout_panel> - <layout_panel name="chat_btn_lp"> + <layout_panel name="im_btn_lp"> <button label="MI" name="im_btn" tool_tip="Abrir sessão de mensagem instantânea"/> </layout_panel> - <layout_panel name="chat_btn_lp"> + <layout_panel name="call_btn_lp"> <button label="Ligar" name="call_btn" tool_tip="Ligar para este residente"/> </layout_panel> - <layout_panel name="chat_btn_lp"> + <layout_panel name="share_btn_lp"> <button label="Compartilhar" name="share_btn" tool_tip="Compartilhar item de inventário"/> </layout_panel> - <layout_panel name="chat_btn_lp"> + <layout_panel name="teleport_btn_lp"> <button label="Teletransportar" name="teleport_btn" tool_tip="Oferecer teletransporte"/> </layout_panel> </layout_stack> diff --git a/indra/newview/skins/default/xui/zh/floater_about.xml b/indra/newview/skins/default/xui/zh/floater_about.xml index 229297e39b4ef873646e701063fe22f98c40bcfe..bee940ddc13408d6a830473cfb3d45695d7553e0 100644 --- a/indra/newview/skins/default/xui/zh/floater_about.xml +++ b/indra/newview/skins/default/xui/zh/floater_about.xml @@ -13,11 +13,11 @@ [[SERVER_RELEASE_NOTES_URL] [ReleaseNotes]] </floater.string> <floater.string name="AboutSystem"> - CPU: [CPU] -Memory: [MEMORY_MB] MB -OS Version: [OS_VERSION] -Graphics Card Vendor: [GRAPHICS_CARD_VENDOR] -Graphics Card: [GRAPHICS_CARD] + CPU:[CPU] +記憶體:[MEMORY_MB] MB +作æ¥ç³»çµ±ç‰ˆæœ¬ï¼š[OS_VERSION] +顯示å¡ä¾›æ‡‰å•†ï¼š[GRAPHICS_CARD_VENDOR] +顯示å¡ï¼š[GRAPHICS_CARD] </floater.string> <floater.string name="AboutDriver"> Windows Graphics Driver Version: [GRAPHICS_DRIVER_VERSION] @@ -25,11 +25,11 @@ Graphics Card: [GRAPHICS_CARD] <floater.string name="AboutLibs"> OpenGL Version: [OPENGL_VERSION] -libcurl Version: [LIBCURL_VERSION] -J2C Decoder Version: [J2C_VERSION] -Audio Driver Version: [AUDIO_DRIVER_VERSION] -Qt Webkit Version: [QT_WEBKIT_VERSION] -Voice Server Version: [VOICE_VERSION] +libcurl 版本: [LIBCURL_VERSION] +J2C 解碼器版本: [J2C_VERSION] +音效驅動程å¼ç‰ˆæœ¬ï¼š [AUDIO_DRIVER_VERSION] +Qt Webkit 版本: [QT_WEBKIT_VERSION] +語音伺æœå™¨ç‰ˆæœ¬ï¼š [VOICE_VERSION] </floater.string> <floater.string name="none"> (無) diff --git a/indra/newview/skins/default/xui/zh/floater_about_land.xml b/indra/newview/skins/default/xui/zh/floater_about_land.xml index c0c5494c91e13e65b836b984474eafea0c16b7b8..efd8909e67d11bac8cdd5b0fe51e8b57fcf92539 100644 --- a/indra/newview/skins/default/xui/zh/floater_about_land.xml +++ b/indra/newview/skins/default/xui/zh/floater_about_land.xml @@ -81,7 +81,7 @@ 分級: </text> <text name="ContentRatingText"> - Adult + æˆäºº </text> <text name="Owner:"> æ“有者: @@ -132,10 +132,10 @@ 0 </text> <button label="購買土地" name="Buy Land..."/> - <button label="Script Info" name="Scripts..."/> + <button label="腳本資訊" name="Scripts..."/> <button label="Buy For Group" name="Buy For Group..."/> - <button label="Buy Pass" name="Buy Pass..." tool_tip="A pass gives you temporary access to this land."/> - <button label="Abandon Land" name="Abandon Land..."/> + <button label="購買通行權" name="Buy Pass..." tool_tip="A pass gives you temporary access to this land."/> + <button label="放棄土地" name="Abandon Land..."/> <button label="Reclaim Land" name="Reclaim Land..."/> <button label="Linden Sale" name="Linden Sale..." tool_tip="Land must be owned, set content, and not already for auction."/> </panel> @@ -186,7 +186,7 @@ 分級: </text> <text name="region_maturity_text"> - Adult + æˆäºº </text> <text name="resellable_lbl"> Resale: @@ -201,7 +201,7 @@ Land in this region may not be joined/subdivided. </text> </panel> - <panel label="OBJECTS" name="land_objects_panel"> + <panel label="物件" name="land_objects_panel"> <panel.string name="objects_available_text"> [COUNT] out of [MAX] ([AVAILABLE] available) </panel.string> @@ -235,24 +235,24 @@ <text name="owner_objects_text"> [COUNT] </text> - <button label="Show" label_selected="Show" name="ShowOwner"/> - <button label="Return" name="ReturnOwner..." tool_tip="Return objects to their owners."/> + <button label="顯示" label_selected="顯示" name="ShowOwner"/> + <button label="退回" name="ReturnOwner..." tool_tip="Return objects to their owners."/> <text name="Set to group:"> Set to group: </text> <text name="group_objects_text"> [COUNT] </text> - <button label="Show" label_selected="Show" name="ShowGroup"/> - <button label="Return" name="ReturnGroup..." tool_tip="Return objects to their owners."/> + <button label="顯示" label_selected="顯示" name="ShowGroup"/> + <button label="退回" name="ReturnGroup..." tool_tip="Return objects to their owners."/> <text name="Owned by others:"> Owned by others: </text> <text name="other_objects_text"> [COUNT] </text> - <button label="Show" label_selected="Show" name="ShowOther"/> - <button label="Return" name="ReturnOther..." tool_tip="Return objects to their owners."/> + <button label="顯示" label_selected="顯示" name="ShowOther"/> + <button label="退回" name="ReturnOther..." tool_tip="Return objects to their owners."/> <text name="Selected / sat upon:"> Selected / sat upon: </text> @@ -289,7 +289,7 @@ Only large parcels can be listed in search. Moderate Content </panel.string> <panel.string name="mature_check_adult"> - Adult Content + æˆäººå…§å®¹ </panel.string> <panel.string name="mature_check_mature_tooltip"> Your parcel information or content is considered moderate. @@ -301,41 +301,41 @@ Only large parcels can be listed in search. (無) </panel.string> <panel.string name="push_restrict_text"> - No Pushing + ç¦æ¢æŽ¨æ’ž </panel.string> <panel.string name="push_restrict_region_text"> - No Pushing (Region Override) + ç¦æ¢æŽ¨æ’žï¼ˆåœ°å€è¨å®šè¦†è“‹ï¼‰ </panel.string> <text name="allow_label"> - Allow other Residents to: + å…許其他居民去: </text> - <check_box label="Edit Terrain" name="edit land check" tool_tip="If checked, anyone can terraform your land. It is best to leave this unchecked, as you can always edit your own land."/> - <check_box label="飛行" name="check fly" tool_tip="If checked, Residents can fly on your land. If unchecked, they can only fly into and over your land."/> + <check_box label="編輯地形" name="edit land check" tool_tip="若勾é¸å‰‡ä»»ä½•äººå°‡å¯ä»¥è®Šå½¢ä½ 的土地,最好是ä¿æŒæœªå‹¾é¸ï¼Œå› ç‚ºä½ éš¨æ™‚å¯ä»¥ç·¨è¼¯è®Šæ›´ä½ 的土地。"/> + <check_box label="飛行" name="check fly" tool_tip="逤勾é¸å‰‡å±…æ°‘å¯ä»¥åœ¨ä½ 飛行,ä¸ç„¶å°±åªèƒ½ç”±å¤–é¢é£›å…¥æˆ–é£›è¶Šä½ çš„åœŸåœ°ã€‚"/> <text name="allow_label2"> å»ºé€ ï¼š </text> - <check_box label="Everyone" name="edit objects check"/> + <check_box label="任何人" name="edit objects check"/> <check_box label="社團" name="edit group objects check"/> <text name="allow_label3"> - Object Entry: + 物件進入: </text> - <check_box label="Everyone" name="all object entry check"/> + <check_box label="任何人" name="all object entry check"/> <check_box label="社團" name="group object entry check"/> <text name="allow_label4"> - Run Scripts: + 執行腳本: </text> - <check_box label="Everyone" name="check other scripts"/> + <check_box label="任何人" name="check other scripts"/> <check_box label="社團" name="check group scripts"/> <text name="land_options_label"> - Land Options: + 土地é¸é …: </text> - <check_box label="Safe (no damage)" name="check safe" tool_tip="If checked, sets the land to Safe, disabling damage combat. If cleared, damage combat is enabled."/> - <check_box label="No Pushing" name="PushRestrictCheck" tool_tip="Prevents scripts from pushing. Checking this option may be useful for preventing disruptive behavior on your land."/> - <check_box label="Show Place in Search (L$30/week)" name="ShowDirectoryCheck" tool_tip="Let people see this parcel in search results"/> + <check_box label="安全(無傷害)" name="check safe" tool_tip="若勾é¸å‰‡è¨æ‡‰åœŸåœ°ç‚ºå®‰å…¨çš„,傷害性的戰鬥將被關閉。清除勾é¸å¾Œæ‰èƒ½é€²è¡Œå‚·å®³æ€§çš„戰鬥。"/> + <check_box label="ç¦æ¢æŽ¨æ’ž" name="PushRestrictCheck" tool_tip="防æ¢ä½¿ç”¨è…³æœ¬æŽ¨æ’žã€‚勾é¸é€™å€‹é¸é …å°‡å¯ä»¥æœ‰æ•ˆé˜²æ¢ä½ åœŸåœ°ä¸Šçš„ç ´å£žè¡Œç‚ºã€‚"/> + <check_box label="將地點刊登顯示在æœå°‹ä¸ï¼ˆL$30 / æ¯é€±ï¼‰" name="ShowDirectoryCheck" tool_tip="Let people see this parcel in search results"/> <combo_box name="land category with adult"> - <combo_box.item label="Any Category" name="item0"/> + <combo_box.item label="任何類別" name="item0"/> <combo_box.item label="Linden Location" name="item1"/> - <combo_box.item label="Adult" name="item2"/> + <combo_box.item label="æˆäºº" name="item2"/> <combo_box.item label="Arts & Culture" name="item3"/> <combo_box.item label="Business" name="item4"/> <combo_box.item label="Educational" name="item5"/> @@ -349,7 +349,7 @@ Only large parcels can be listed in search. <combo_box.item label="Other" name="item12"/> </combo_box> <combo_box name="land category"> - <combo_box.item label="Any Category" name="item0"/> + <combo_box.item label="任何類別" name="item0"/> <combo_box.item label="Linden Location" name="item1"/> <combo_box.item label="Arts & Culture" name="item3"/> <combo_box.item label="Business" name="item4"/> @@ -365,11 +365,11 @@ Only large parcels can be listed in search. </combo_box> <check_box label="Moderate Content" name="MatureCheck" tool_tip=" "/> <text name="Snapshot:"> - Snapshot: + 快照: </text> <texture_picker name="snapshot_ctrl" tool_tip="點擊以挑é¸åœ–片"/> <text name="landing_point"> - Landing Point: [LANDING] + 登陸點:[LANDING] </text> <button label="è¨å®š" label_selected="è¨å®š" name="Set" tool_tip="Sets the landing point where visitors arrive. Sets to your avatar's location inside this parcel."/> <button label="清除" label_selected="清除" name="Clear" tool_tip="清除登陸點"/> @@ -409,7 +409,7 @@ Only large parcels can be listed in search. <spinner name="media_size_width" tool_tip="Size to render Web media, leave 0 for default."/> <spinner name="media_size_height" tool_tip="Size to render Web media, leave 0 for default."/> <text name="pixels"> - pixels + åƒç´ </text> <text name="Options:"> Options: @@ -467,11 +467,11 @@ Only large parcels can be listed in search. </panel> <panel name="Banned_layout_panel"> <text label="Ban" name="BanCheck"> - Banned Residents + 被å°éŽ–çš„å±…æ°‘ </text> <name_list name="BannedList" tool_tip="([LISTED] listed, [MAX] max)"/> - <button label="Add" name="add_banned"/> - <button label="Remove" label_selected="Remove" name="remove_banned"/> + <button label="æ·»åŠ " name="add_banned"/> + <button label="移除" label_selected="移除" name="remove_banned"/> </panel> </panel> </tab_container> diff --git a/indra/newview/skins/default/xui/zh/floater_animation_preview.xml b/indra/newview/skins/default/xui/zh/floater_animation_preview.xml index bcb5606b6003bc5e020a98ad424825d9c9f4f63f..b5d65119f7f23e010d2beddd0e7ed5d1661d5cec 100644 --- a/indra/newview/skins/default/xui/zh/floater_animation_preview.xml +++ b/indra/newview/skins/default/xui/zh/floater_animation_preview.xml @@ -9,7 +9,7 @@ Maximum animation length is [MAX_LENGTH] seconds. </floater.string> <floater.string name="failed_file_read"> - Unable to read animation file. + 無法讀å–動作檔。 [STATUS] </floater.string> @@ -23,7 +23,7 @@ Maximum animation length is [MAX_LENGTH] seconds. Cannot read constraint definition. </floater.string> <floater.string name="E_ST_NO_FILE"> - Cannot open BVH file. + 無法開啟 BVH 檔案。 </floater.string> <floater.string name="E_ST_NO_HIER"> Invalid HIERARCHY header. @@ -115,7 +115,7 @@ Maximum animation length is [MAX_LENGTH] seconds. <text name="description_label"> æ述: </text> - <spinner label="Priority" name="priority" tool_tip="Controls which other animations can be overridden by this animation"/> + <spinner label="優先度" name="priority" tool_tip="Controls which other animations can be overridden by this animation"/> <check_box label="Loop" name="loop_check" tool_tip="Makes this animation loop"/> <spinner label="In(%)" name="loop_in_point" tool_tip="Sets point in animation that looping returns to"/> <spinner label="Out(%)" name="loop_out_point" tool_tip="Sets point in animation that ends a loop"/> @@ -182,5 +182,5 @@ Maximum animation length is [MAX_LENGTH] seconds. We recommend BVH files exported from Poser 4. </text> <button label="上傳(L$[AMOUNT])" name="ok_btn"/> - <button label="å–銷" name="cancel_btn"/> + <button label="å–消" name="cancel_btn"/> </floater> diff --git a/indra/newview/skins/default/xui/zh/floater_avatar_picker.xml b/indra/newview/skins/default/xui/zh/floater_avatar_picker.xml index 2ffcaf5b55a1f7d89d5b627ea3e0c93e3f377c28..27a4199f8cd6ebdea029074e349dcf767711b881 100644 --- a/indra/newview/skins/default/xui/zh/floater_avatar_picker.xml +++ b/indra/newview/skins/default/xui/zh/floater_avatar_picker.xml @@ -10,44 +10,44 @@ No results </floater.string> <floater.string name="searching"> - Searching... + æœå°‹ä¸... </floater.string> <string name="Select"> - Select + é¸æ“‡ </string> <string name="Close"> 關閉 </string> <tab_container name="ResidentChooserTabs"> - <panel label="Search" name="SearchPanel"> + <panel label="æœå°‹" name="SearchPanel"> <text name="InstructSearchResidentName"> Type part of a person's name: </text> <button label="Go" label_selected="Go" name="Find"/> <scroll_list name="SearchResults"> <columns label="å稱" name="name"/> - <columns label="Username" name="username"/> + <columns label="使用者å稱" name="username"/> </scroll_list> </panel> - <panel label="Friends" name="FriendsPanel"> + <panel label="朋å‹" name="FriendsPanel"> <text name="InstructSelectFriend"> é¸æ“‡ä¸€å€‹äººï¼š </text> </panel> <panel label="接近我" name="NearMePanel"> <text name="InstructSelectResident"> - Select a person nearby: + é¸æ“‡ä¸€ä½é™„近的人: </text> - <slider label="Range" name="near_me_range"/> + <slider label="範åœ" name="near_me_range"/> <text name="meters"> - Meters + 公尺 </text> <scroll_list name="NearMe"> <columns label="å稱" name="name"/> - <columns label="Username" name="username"/> + <columns label="使用者å稱" name="username"/> </scroll_list> </panel> </tab_container> <button label="確定" label_selected="確定" name="ok_btn"/> - <button label="å–銷" label_selected="å–銷" name="cancel_btn"/> + <button label="å–消" label_selected="å–消" name="cancel_btn"/> </floater> diff --git a/indra/newview/skins/default/xui/zh/floater_avatar_textures.xml b/indra/newview/skins/default/xui/zh/floater_avatar_textures.xml index fb17c0bb8a6132ec01c32df05292e9250188a490..b1dc081f04d22411d5d700a45ebdb0a5c471bc75 100644 --- a/indra/newview/skins/default/xui/zh/floater_avatar_textures.xml +++ b/indra/newview/skins/default/xui/zh/floater_avatar_textures.xml @@ -15,13 +15,13 @@ Textures </text> <button label="Dump IDs to Console" label_selected="Dump" name="Dump"/> <panel name="scroll_content_panel"> - <texture_picker label="Hair" name="hair-baked"/> - <texture_picker label="Hair" name="hair_grain"/> + <texture_picker label="é é«®" name="hair-baked"/> + <texture_picker label="é é«®" name="hair_grain"/> <texture_picker label="Hair Alpha" name="hair_alpha"/> - <texture_picker label="Head" name="head-baked"/> + <texture_picker label="é 部" name="head-baked"/> <texture_picker label="Makeup" name="head_bodypaint"/> <texture_picker label="Head Alpha" name="head_alpha"/> - <texture_picker label="Head Tattoo" name="head_tattoo"/> + <texture_picker label="é 部刺é’" name="head_tattoo"/> <texture_picker label="眼ç›" name="eyes-baked"/> <texture_picker label="眼ç›" name="eyes_iris"/> <texture_picker label="Eyes Alpha" name="eyes_alpha"/> diff --git a/indra/newview/skins/default/xui/zh/floater_bulk_perms.xml b/indra/newview/skins/default/xui/zh/floater_bulk_perms.xml index ffdd957f9100135762bccfd3bd48a68e14675004..629b0d17d55fbf35cfad0d93c186be68f42625e6 100644 --- a/indra/newview/skins/default/xui/zh/floater_bulk_perms.xml +++ b/indra/newview/skins/default/xui/zh/floater_bulk_perms.xml @@ -12,14 +12,14 @@ <floater.string name="done_text"> Finished permission change requests. </floater.string> - <icon name="icon_animation" tool_tip="Animation"/> + <icon name="icon_animation" tool_tip="動作"/> <icon name="icon_bodypart" tool_tip="身體部ä½"/> <icon name="icon_clothing" tool_tip="æœè£"/> <icon name="icon_gesture" tool_tip="姿勢"/> - <icon name="icon_notecard" tool_tip="Notecards"/> - <icon name="icon_object" tool_tip="Objects"/> - <icon name="icon_script" tool_tip="Scripts"/> - <icon name="icon_sound" tool_tip="Sounds"/> + <icon name="icon_notecard" tool_tip="記事å¡"/> + <icon name="icon_object" tool_tip="物件"/> + <icon name="icon_script" tool_tip="腳本"/> + <icon name="icon_sound" tool_tip="è²éŸ³"/> <icon name="icon_texture" tool_tip="æ質"/> <button label="√ 全部" name="check_all"/> <button label="清除" label_selected="ç„¡" name="check_none"/> @@ -41,5 +41,5 @@ <check_box label="覆製" name="next_owner_copy"/> <check_box initial_value="true" label="轉移" name="next_owner_transfer" tool_tip="Next owner can give away or resell this object"/> <button label="確定" name="apply"/> - <button label="å–銷" name="close"/> + <button label="å–消" name="close"/> </floater> diff --git a/indra/newview/skins/default/xui/zh/floater_buy_contents.xml b/indra/newview/skins/default/xui/zh/floater_buy_contents.xml index a00f069e6ce46c245c1336568d6f0df4e241ada2..44d3394a526f379efcf7662641a57e46b929a7b3 100644 --- a/indra/newview/skins/default/xui/zh/floater_buy_contents.xml +++ b/indra/newview/skins/default/xui/zh/floater_buy_contents.xml @@ -17,5 +17,5 @@ </text> <check_box label="ç«‹å³ç©¿ä¸Šæœè£" name="wear_check"/> <button label="購買" label_selected="購買" name="buy_btn"/> - <button label="å–銷" label_selected="å–銷" name="cancel_btn"/> + <button label="å–消" label_selected="å–消" name="cancel_btn"/> </floater> diff --git a/indra/newview/skins/default/xui/zh/floater_buy_currency.xml b/indra/newview/skins/default/xui/zh/floater_buy_currency.xml index bebc17a5cc4c9aabb65814365c8e0cdb6bf75c7f..d8e9fb0ecc119d6945ee1ce49b26c92c3735227b 100644 --- a/indra/newview/skins/default/xui/zh/floater_buy_currency.xml +++ b/indra/newview/skins/default/xui/zh/floater_buy_currency.xml @@ -40,7 +40,7 @@ [ACTION] </text> <text name="total_label"> - My new balance will be + 我的帳戶餘é¡å°‡ç‚º </text> <text name="total_amount"> L$ [AMT] @@ -58,7 +58,7 @@ You aren't buying enough L$. Please increase the amount. </text> <button label="ç«‹å³è³¼è²·" name="buy_btn"/> - <button label="å–銷" name="cancel_btn"/> + <button label="å–消" name="cancel_btn"/> <text name="info_cannot_buy"> Unable to Buy </text> diff --git a/indra/newview/skins/default/xui/zh/floater_buy_land.xml b/indra/newview/skins/default/xui/zh/floater_buy_land.xml index a75d33136db6697cf86772cf1225707af5b8f100..34401c11d01f25d427e4c543b926087c4d7b1bfa 100644 --- a/indra/newview/skins/default/xui/zh/floater_buy_land.xml +++ b/indra/newview/skins/default/xui/zh/floater_buy_land.xml @@ -68,13 +68,13 @@ Try selecting a smaller area. none needed </floater.string> <floater.string name="must_upgrade"> - Your account must be upgraded to own land. + ä½ çš„å¸³æˆ¶å¿…é ˆè¦å‡ç´šæ‰èƒ½æ“有土地。 </floater.string> <floater.string name="cant_own_land"> - Your account can own land. + ä½ çš„å¸³æˆ¶èƒ½æ“有土地。 </floater.string> <floater.string name="land_holdings"> - You hold [BUYER] m² of land. + ä½ æŒæœ‰ [BUYER] m² 土地。 </floater.string> <floater.string name="pay_to_for_land"> Pay L$ [AMOUNT] to [SELLER] for this land @@ -83,7 +83,7 @@ Try selecting a smaller area. Buy L$ [AMOUNT] for approx. [LOCAL_AMOUNT], </floater.string> <floater.string name="parcel_meters"> - This parcel is [AMOUNT] m² + 這個地段為 [AMOUNT] m² </floater.string> <floater.string name="premium_land"> This land is premium, and will charge as [AMOUNT] m². @@ -122,7 +122,7 @@ supports [AMOUNT2] objects You need to buy at least L$ [AMOUNT] to afford this land. </floater.string> <floater.string name="no_parcel_selected"> - (no parcel selected) + (無地段被é¸æ“‡ï¼‰ </floater.string> <text name="region_name_label"> 地å€ï¼š @@ -190,7 +190,7 @@ sold with objects <text name="error_message"> Something ain't right. </text> - <button label="Go to website" name="error_web"/> + <button label="å‰å¾€ç¶²ç«™" name="error_web"/> <text name="account_action"> Upgrade you to premium membership. </text> @@ -229,5 +229,5 @@ This parcel is 512 m² of land. </text> <check_box label="Remove [AMOUNT] m² of contribution from group." name="remove_contribution"/> <button label="Purchase" name="buy_btn"/> - <button label="å–銷" name="cancel_btn"/> + <button label="å–消" name="cancel_btn"/> </floater> diff --git a/indra/newview/skins/default/xui/zh/floater_buy_object.xml b/indra/newview/skins/default/xui/zh/floater_buy_object.xml index 559982b6c9102c04fb0fdca13b66c0204d0e793e..ef8bc183a4451cab9ac879433cfa36fa205d331a 100644 --- a/indra/newview/skins/default/xui/zh/floater_buy_object.xml +++ b/indra/newview/skins/default/xui/zh/floater_buy_object.xml @@ -25,5 +25,5 @@ [NAME]? </text> <button label="購買" label_selected="購買" name="buy_btn"/> - <button label="å–銷" label_selected="å–銷" name="cancel_btn"/> + <button label="å–消" label_selected="å–消" name="cancel_btn"/> </floater> diff --git a/indra/newview/skins/default/xui/zh/floater_choose_group.xml b/indra/newview/skins/default/xui/zh/floater_choose_group.xml index dea0a7c318909c6ba15aa95832abc213741373e5..9968565bf296226a4050e10bf9f025b60c6028e4 100644 --- a/indra/newview/skins/default/xui/zh/floater_choose_group.xml +++ b/indra/newview/skins/default/xui/zh/floater_choose_group.xml @@ -4,5 +4,5 @@ é¸æ“‡ä¸€å€‹ç¤¾åœ˜ï¼š </text> <button label="確定" label_selected="確定" name="OK"/> - <button label="å–銷" label_selected="å–銷" name="Cancel"/> + <button label="å–消" label_selected="å–消" name="Cancel"/> </floater> diff --git a/indra/newview/skins/default/xui/zh/floater_color_picker.xml b/indra/newview/skins/default/xui/zh/floater_color_picker.xml index f6f2f0187dc4b984c3ae098a97b4421d0546ca0c..a7ac78e419167b07fc34f6987d786e06d66dd0b7 100644 --- a/indra/newview/skins/default/xui/zh/floater_color_picker.xml +++ b/indra/newview/skins/default/xui/zh/floater_color_picker.xml @@ -20,7 +20,7 @@ </text> <check_box label="ç«‹å³å¥—用" name="apply_immediate"/> <button label="確定" label_selected="確定" name="select_btn"/> - <button label="å–銷" label_selected="å–銷" name="cancel_btn"/> + <button label="å–消" label_selected="å–消" name="cancel_btn"/> <text name="Current color:"> ç›®å‰é¡è‰²ï¼š </text> diff --git a/indra/newview/skins/default/xui/zh/floater_day_cycle_options.xml b/indra/newview/skins/default/xui/zh/floater_day_cycle_options.xml index 8adc094fca5a2cb0aab1509e67f5a09d49dc4829..28d2ba6ed484358fb9964167eaa8b906ec831388 100644 --- a/indra/newview/skins/default/xui/zh/floater_day_cycle_options.xml +++ b/indra/newview/skins/default/xui/zh/floater_day_cycle_options.xml @@ -86,7 +86,7 @@ é 覽: </text> <button label="Play" label_selected="Play" name="WLAnimSky"/> - <button label="Stop!" label_selected="Stop" name="WLStopAnimSky"/> + <button label="åœæ¢!" label_selected="åœæ¢" name="WLStopAnimSky"/> <button label="Use Estate Time" label_selected="Go to Estate Time" name="WLUseLindenTime"/> <button label="Save Test Day" label_selected="Save Test Day" name="WLSaveDayCycle"/> <button label="Load Test Day" label_selected="Load Test Day" name="WLLoadDayCycle"/> diff --git a/indra/newview/skins/default/xui/zh/floater_display_name.xml b/indra/newview/skins/default/xui/zh/floater_display_name.xml index 5a89ecaa829438266b3087709d1b2ba96cb3fef9..e12fc211663355bf742162ac8ec853e7b2bc558f 100644 --- a/indra/newview/skins/default/xui/zh/floater_display_name.xml +++ b/indra/newview/skins/default/xui/zh/floater_display_name.xml @@ -14,5 +14,5 @@ </text> <button label="儲å˜" name="save_btn" tool_tip="Save your new Display Name"/> <button label="Reset" name="reset_btn" tool_tip="Make Display Name the same as Username"/> - <button label="å–銷" name="cancel_btn"/> + <button label="å–消" name="cancel_btn"/> </floater> diff --git a/indra/newview/skins/default/xui/zh/floater_gesture.xml b/indra/newview/skins/default/xui/zh/floater_gesture.xml index 901770586a077f5af2e0b9ba92ba64b4deea5d1c..651a976774963930b70cb0d796f4a58a14ec36e6 100644 --- a/indra/newview/skins/default/xui/zh/floater_gesture.xml +++ b/indra/newview/skins/default/xui/zh/floater_gesture.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater label="Places" name="gestures" title="姿勢"> +<floater label="地點" name="gestures" title="姿勢"> <floater.string name="loading"> 載入ä¸... </floater.string> @@ -16,11 +16,11 @@ </scroll_list> <panel label="bottom_panel" name="bottom_panel"> <menu_button name="gear_btn" tool_tip="更多é¸é …"/> - <button name="new_gesture_btn" tool_tip="Make new gesture"/> + <button name="new_gesture_btn" tool_tip="製作新姿勢e"/> <button name="activate_btn" tool_tip="Activate/Deactivate selected gesture"/> - <button name="del_btn" tool_tip="Delete this gesture"/> + <button name="del_btn" tool_tip="刪除這個姿勢"/> </panel> <button label="編輯" name="edit_btn"/> - <button label="Play" name="play_btn"/> - <button label="Stop" name="stop_btn"/> + <button label="æ’放" name="play_btn"/> + <button label="åœæ¢" name="stop_btn"/> </floater> diff --git a/indra/newview/skins/default/xui/zh/floater_god_tools.xml b/indra/newview/skins/default/xui/zh/floater_god_tools.xml index a501a4257aaf0dc0efbf0c289ee5c4860b4d6fae..fbe89ab2a6fa4de8de492d1bc0db2ded34de4313 100644 --- a/indra/newview/skins/default/xui/zh/floater_god_tools.xml +++ b/indra/newview/skins/default/xui/zh/floater_god_tools.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="godtools floater" title="GOD TOOLS"> +<floater name="godtools floater" title="神之工具"> <tab_container name="GodTools Tabs"> <panel label="ç¶²æ ¼" name="grid"> <button label="Flush This Region's Map Visibility Caches" label_selected="Flush This Region's Map Visibility Caches" name="Flush This Region's Map Visibility Caches"/> @@ -55,7 +55,7 @@ <text name="region name"> Welsh </text> - <check_box label="Disable Scripts" name="disable scripts" tool_tip="Set this to disable all scripts in this region"/> + <check_box label="關閉腳本" name="disable scripts" tool_tip="關閉這個地å€ç¾åœ¨çš„全部腳本"/> <check_box label="Disable Collisions" name="disable collisions" tool_tip="Set this to disable non-agent collisions in this region"/> <check_box label="Disable Physics" name="disable physics" tool_tip="Set this to disable all physics in this region"/> <button label="套用" label_selected="套用" name="Apply" tool_tip="Click here to apply any changes from above"/> diff --git a/indra/newview/skins/default/xui/zh/floater_image_preview.xml b/indra/newview/skins/default/xui/zh/floater_image_preview.xml index 98e4e5c2cd71296d188164b0c55242a3c3a9f28d..d7e9a7704c081c957d01a870b86175b971fcb666 100644 --- a/indra/newview/skins/default/xui/zh/floater_image_preview.xml +++ b/indra/newview/skins/default/xui/zh/floater_image_preview.xml @@ -7,11 +7,11 @@ æ述: </text> <text name="preview_label"> - Preview image as: + é 覽圖åƒç‚ºï¼š </text> <combo_box label="æœè£é¡žåž‹" name="clothing_type_combo"> - <item label="Image" name="Image" value="Image"/> - <item label="Hair" name="Hair" value="Hair"/> + <item label="圖åƒ" name="Image" value="圖åƒ"/> + <item label="é é«®" name="Hair" value="é é«®"/> <item label="Female Head" name="FemaleHead" value="Female Head"/> <item label="Female Upper Body" name="FemaleUpperBody" value="Female Upper Body"/> <item label="Female Lower Body" name="FemaleLowerBody" value="Female Lower Body"/> @@ -22,11 +22,11 @@ <item label="Sculpted Prim" name="SculptedPrim" value="Sculpted Prim"/> </combo_box> <text name="bad_image_text"> - Unable to read image. + 無法讀å–圖åƒã€‚ -Try saving image as 24 bit Targa (.tga). +請嘗試儲å˜åœ–åƒç‚º 24 ä½å…ƒ Targa(.tgaï¼‰æ ¼å¼ã€‚ </text> <check_box label="Use lossless compression" name="lossless_check"/> - <button label="å–銷" name="cancel_btn"/> + <button label="å–消" name="cancel_btn"/> <button label="上傳(L$[AMOUNT])" name="ok_btn"/> </floater> diff --git a/indra/newview/skins/default/xui/zh/floater_incoming_call.xml b/indra/newview/skins/default/xui/zh/floater_incoming_call.xml index 4f678dbd9da18eb675f90325257f91c89b943595..123cdd9f2c4cc7dfccc981d1cf729b92813ff5a7 100644 --- a/indra/newview/skins/default/xui/zh/floater_incoming_call.xml +++ b/indra/newview/skins/default/xui/zh/floater_incoming_call.xml @@ -4,10 +4,10 @@ 5 </floater.string> <floater.string name="localchat"> - Nearby Voice Chat + 附近的音èŠå¤© </floater.string> <floater.string name="anonymous"> - anonymous + 匿å </floater.string> <floater.string name="VoiceInviteP2P"> 通話ä¸ã€‚ @@ -28,6 +28,6 @@ Do you want to leave [CURRENT_CHAT] and join this voice chat? </text> <button label="接å—" label_selected="接å—" name="Accept"/> - <button label="Reject" label_selected="Reject" name="Reject"/> + <button label="拒絕" label_selected="拒絕" name="Reject"/> <button label="開始 IM" name="Start IM"/> </floater> diff --git a/indra/newview/skins/default/xui/zh/floater_inventory_view_finder.xml b/indra/newview/skins/default/xui/zh/floater_inventory_view_finder.xml index a442eb9cbc75f9bb96fe92b155a814af5b97959a..a4ede92ab163d8d367eb87a146e00696a77084d8 100644 --- a/indra/newview/skins/default/xui/zh/floater_inventory_view_finder.xml +++ b/indra/newview/skins/default/xui/zh/floater_inventory_view_finder.xml @@ -1,13 +1,13 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="Inventory Finder" title="最近_收ç´å€_物å“"> - <check_box label="Animation" name="check_animation"/> + <check_box label="動作" name="check_animation"/> <check_box label="Calling Cards" name="check_calling_card"/> <check_box label="æœè£" name="check_clothing"/> <check_box label="姿勢" name="check_gesture"/> <check_box label="地標" name="check_landmark"/> <check_box label="Notecards" name="check_notecard"/> <check_box label="Objects" name="check_object"/> - <check_box label="Scripts" name="check_script"/> + <check_box label="腳本" name="check_script"/> <check_box label="Sounds" name="check_sound"/> <check_box label="æ質" name="check_texture"/> <check_box label="Snapshots" name="check_snapshot"/> diff --git a/indra/newview/skins/default/xui/zh/floater_joystick.xml b/indra/newview/skins/default/xui/zh/floater_joystick.xml index 83bd4e2bca3962abe4b2b3b08b5297825469a3c5..1721f7cd1e2e2c1ffa22bfcde12e07a038e34607 100644 --- a/indra/newview/skins/default/xui/zh/floater_joystick.xml +++ b/indra/newview/skins/default/xui/zh/floater_joystick.xml @@ -75,5 +75,5 @@ </text> <button label="SpaceNavigator Defaults" name="SpaceNavigatorDefaults"/> <button label="確定" label_selected="確定" name="ok_btn"/> - <button label="å–銷" label_selected="å–銷" name="cancel_btn"/> + <button label="å–消" label_selected="å–消" name="cancel_btn"/> </floater> diff --git a/indra/newview/skins/default/xui/zh/floater_lagmeter.xml b/indra/newview/skins/default/xui/zh/floater_lagmeter.xml index 261ba8ebc332d5fc0a3931a1ea121d688d8af824..6e58e7332f2a39343d0c0658275f383f25c23631 100644 --- a/indra/newview/skins/default/xui/zh/floater_lagmeter.xml +++ b/indra/newview/skins/default/xui/zh/floater_lagmeter.xml @@ -115,7 +115,7 @@ å¯èƒ½åŽŸå› :地å€æœ‰å¤ªå¤šç§»å‹•çš„人 </floater.string> <floater.string name="server_images_cause_msg"> - å¯èƒ½åŽŸå› :太多影åƒè¨ˆç®— + å¯èƒ½åŽŸå› :太多圖åƒè¨ˆç®— </floater.string> <floater.string name="server_generic_cause_msg"> å¯èƒ½åŽŸå› ï¼šæ¨¡æ“¬å™¨è² è¼‰éŽé‡ diff --git a/indra/newview/skins/default/xui/zh/floater_live_lsleditor.xml b/indra/newview/skins/default/xui/zh/floater_live_lsleditor.xml index 6c8bd76a8a806820921c992188bfee5a17158a64..e6f6e323522303bbd33d0f7d55015150cd4f8fa3 100644 --- a/indra/newview/skins/default/xui/zh/floater_live_lsleditor.xml +++ b/indra/newview/skins/default/xui/zh/floater_live_lsleditor.xml @@ -1,13 +1,13 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="script ed float" title="SCRIPT: NEW SCRIPT"> +<floater name="script ed float" title="腳本: 新腳本"> <floater.string name="not_allowed"> You can not view or edit this script, since it has been set as "no copy". You need full permissions to view or edit a script inside an object. </floater.string> <floater.string name="script_running"> - Running + åŸ·è¡Œä¸ </floater.string> <floater.string name="Title"> - SCRIPT: [NAME] + 腳本:[NAME] </floater.string> <button label="Reset" label_selected="Reset" name="Reset"/> <check_box initial_value="true" label="Running" name="running"/> diff --git a/indra/newview/skins/default/xui/zh/floater_media_browser.xml b/indra/newview/skins/default/xui/zh/floater_media_browser.xml index 616c326d6b5a414d20ca23882f4993563eac50c3..6e75016fad73b44afe466149af93a02f03bd8e3a 100644 --- a/indra/newview/skins/default/xui/zh/floater_media_browser.xml +++ b/indra/newview/skins/default/xui/zh/floater_media_browser.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_about" title="MEDIA BROWSER"> +<floater name="floater_about" title="媒體劉覽器"> <floater.string name="home_page_url"> http://www.secondlife.com </floater.string> @@ -8,22 +8,22 @@ </floater.string> <layout_stack name="stack1"> <layout_panel name="nav_controls"> - <button label="Back" name="back"/> - <button label="Forward" name="forward"/> - <button label="Reload" name="reload"/> + <button label="å‘後" name="back"/> + <button label="å‘å‰" name="forward"/> + <button label="é‡è¼‰" name="reload"/> <button label="Go" name="go"/> </layout_panel> <layout_panel name="time_controls"> <button label="rewind" name="rewind"/> - <button label="stop" name="stop"/> - <button label="forward" name="seek"/> + <button label="åœæ¢" name="stop"/> + <button label="å‘å‰" name="seek"/> </layout_panel> <layout_panel name="parcel_owner_controls"> - <button label="Send Current Page to Parcel" name="assign"/> + <button label="é€å‡ºç›®å‰é é¢åˆ°åœ°æ®µ" name="assign"/> </layout_panel> <layout_panel name="external_controls"> - <button label="Open in My Web Browser" name="open_browser"/> - <check_box label="Always open in my web browser" name="open_always"/> + <button label="在我的網é ç€è¦½å™¨ä¸é–‹å•Ÿ" name="open_browser"/> + <check_box label="總是在我的網é ç€è¦½å™¨ä¸é–‹å•Ÿ" name="open_always"/> <button label="關閉" name="close"/> </layout_panel> </layout_stack> diff --git a/indra/newview/skins/default/xui/zh/floater_media_settings.xml b/indra/newview/skins/default/xui/zh/floater_media_settings.xml index 821b93c06f7a07dc546cf7236fc10f2763b40426..f42c0af3d9902b1ee39fb54b83e1e1d9695d08d4 100644 --- a/indra/newview/skins/default/xui/zh/floater_media_settings.xml +++ b/indra/newview/skins/default/xui/zh/floater_media_settings.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="media_settings" title="MEDIA SETTINGS"> <button label="確定" label_selected="確定" name="OK"/> - <button label="å–銷" label_selected="å–銷" name="Cancel"/> + <button label="å–消" label_selected="å–消" name="Cancel"/> <button label="套用" label_selected="套用" name="Apply"/> </floater> diff --git a/indra/newview/skins/default/xui/zh/floater_mem_leaking.xml b/indra/newview/skins/default/xui/zh/floater_mem_leaking.xml index 3fa62b1b609a7c7fb7ed821589ca07737f495e80..93c1b58df6713273ec2e5861b9dc737d6ae54cb3 100644 --- a/indra/newview/skins/default/xui/zh/floater_mem_leaking.xml +++ b/indra/newview/skins/default/xui/zh/floater_mem_leaking.xml @@ -12,7 +12,7 @@ [NOTE2] </text> <button label="Start" name="start_btn"/> - <button label="Stop" name="stop_btn"/> + <button label="åœæ¢" name="stop_btn"/> <button label="Release" name="release_btn"/> <button label="關閉" name="close_btn"/> </floater> diff --git a/indra/newview/skins/default/xui/zh/floater_mute_object.xml b/indra/newview/skins/default/xui/zh/floater_mute_object.xml index a2a56f769e5254ffde5af03e4cbf89ea52a6dbe7..7d76f4de08d646d272f8f216c942caca62f4eeeb 100644 --- a/indra/newview/skins/default/xui/zh/floater_mute_object.xml +++ b/indra/newview/skins/default/xui/zh/floater_mute_object.xml @@ -10,5 +10,5 @@ * Only blocks object text, not sounds </text> <button label="確定" name="OK"/> - <button label="å–銷" name="Cancel"/> + <button label="å–消" name="Cancel"/> </floater> diff --git a/indra/newview/skins/default/xui/zh/floater_nearby_chat.xml b/indra/newview/skins/default/xui/zh/floater_nearby_chat.xml index bed7c20ba517d80f8e95963d0b9de812a0f5e7ad..f0c34acb0622d0d213d54517edf5a80a73e57c2a 100644 --- a/indra/newview/skins/default/xui/zh/floater_nearby_chat.xml +++ b/indra/newview/skins/default/xui/zh/floater_nearby_chat.xml @@ -1,4 +1,4 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="nearby_chat" title="NEARBY CHAT"> +<floater name="nearby_chat" title="附近的èŠå¤©"> <check_box label="Translate chat (powered by Google)" name="translate_chat_checkbox"/> </floater> diff --git a/indra/newview/skins/default/xui/zh/floater_openobject.xml b/indra/newview/skins/default/xui/zh/floater_openobject.xml index 024ef0b1023e796d51f36015ea0cd7fe90445f09..61ac3cb1fcda65cc5d054e84350cf6a5b8f5c43b 100644 --- a/indra/newview/skins/default/xui/zh/floater_openobject.xml +++ b/indra/newview/skins/default/xui/zh/floater_openobject.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="objectcontents" title="OBJECT CONTENTS"> +<floater name="objectcontents" title="物件內容"> <text name="object_name"> [DESC]: </text> diff --git a/indra/newview/skins/default/xui/zh/floater_outfit_save_as.xml b/indra/newview/skins/default/xui/zh/floater_outfit_save_as.xml index feb68f2b0f4e8b8d3b18bb6de6b1a69272db1f32..e33183a0dccf9eefffd6c81f3d3cf84162c8f727 100644 --- a/indra/newview/skins/default/xui/zh/floater_outfit_save_as.xml +++ b/indra/newview/skins/default/xui/zh/floater_outfit_save_as.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="modal container" title="儲å˜è£æ‰®"> <button label="儲å˜" label_selected="儲å˜" name="Save"/> - <button label="å–銷" label_selected="å–銷" name="Cancel"/> + <button label="å–消" label_selected="å–消" name="Cancel"/> <text name="Save item as:"> 儲å˜æˆ‘æ£åœ¨ç©¿çš„為新è£æ‰®ï¼š </text> diff --git a/indra/newview/skins/default/xui/zh/floater_outgoing_call.xml b/indra/newview/skins/default/xui/zh/floater_outgoing_call.xml index 0cc7bbcfe0ddaa0b1920ab88d31cd6378634e170..8b15668e3b4d296702b5f486f58c54ac3d5b1394 100644 --- a/indra/newview/skins/default/xui/zh/floater_outgoing_call.xml +++ b/indra/newview/skins/default/xui/zh/floater_outgoing_call.xml @@ -36,5 +36,5 @@ <text name="leaving"> Leaving [CURRENT_CHAT]. </text> - <button label="å–銷" label_selected="å–銷" name="Cancel"/> + <button label="å–消" label_selected="å–消" name="Cancel"/> </floater> diff --git a/indra/newview/skins/default/xui/zh/floater_pay.xml b/indra/newview/skins/default/xui/zh/floater_pay.xml index 9374ac3f3b09e42803367ea0083383fcad600953..b4841df0ff56112a3c450fc691c8f5f3cbd55f00 100644 --- a/indra/newview/skins/default/xui/zh/floater_pay.xml +++ b/indra/newview/skins/default/xui/zh/floater_pay.xml @@ -1,10 +1,10 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="Give Money"> <string name="payee_group"> - Pay Group + 支付社團 </string> <string name="payee_resident"> - Pay Resident + 支付居民 </string> <text name="payee_name"> Test Name That Is Extremely Long To Check Clipping @@ -14,8 +14,8 @@ <button label="L$10" label_selected="L$10" name="fastpay 10"/> <button label="L$20" label_selected="L$20" name="fastpay 20"/> <text name="amount text"> - Or, choose amount: + 或,é¸æ“‡ä¸€å€‹é‡‘é¡ï¼š </text> - <button label="Pay" label_selected="Pay" name="pay btn"/> - <button label="å–銷" label_selected="å–銷" name="cancel btn"/> + <button label="支付" label_selected="支付" name="pay btn"/> + <button label="å–消" label_selected="å–消" name="cancel btn"/> </floater> diff --git a/indra/newview/skins/default/xui/zh/floater_pay_object.xml b/indra/newview/skins/default/xui/zh/floater_pay_object.xml index fbb6a8ab3661668b327872dfafc6f5ca91f7421d..2a2aec93b94f99db34dab24d58393d643902cf49 100644 --- a/indra/newview/skins/default/xui/zh/floater_pay_object.xml +++ b/indra/newview/skins/default/xui/zh/floater_pay_object.xml @@ -1,18 +1,18 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="Give Money"> <string name="payee_group"> - Pay Group + 支付社團 </string> <string name="payee_resident"> - Pay Resident + 支付居民 </string> <text name="payee_name"> Ericacita Moostopolison </text> <text name="object_name_label"> - Via object: + 經由物件: </text> - <icon name="icon_object" tool_tip="Objects"/> + <icon name="icon_object" tool_tip="物件"/> <text name="object_name_text"> My awesome object with a really damn long name </text> @@ -23,6 +23,6 @@ <text name="amount text"> 或者,é¸æ“‡ä¸€å€‹é‡‘é¡ï¼š </text> - <button label="Pay" label_selected="Pay" name="pay btn"/> - <button label="å–銷" label_selected="å–銷" name="cancel btn"/> + <button label="支付" label_selected="支付" name="pay btn"/> + <button label="å–消" label_selected="å–消" name="cancel btn"/> </floater> diff --git a/indra/newview/skins/default/xui/zh/floater_perm_prefs.xml b/indra/newview/skins/default/xui/zh/floater_perm_prefs.xml index 8d44d474c0043855966fd3515bcdb9055cd1b6a0..31b8133a18e890f372462fe25da909ab78e00cc3 100644 --- a/indra/newview/skins/default/xui/zh/floater_perm_prefs.xml +++ b/indra/newview/skins/default/xui/zh/floater_perm_prefs.xml @@ -11,5 +11,5 @@ <check_box initial_value="true" label="轉售 / é€äºº" name="next_owner_transfer"/> </panel> <button label="確定" label_selected="確定" name="ok"/> - <button label="å–銷" label_selected="å–銷" name="cancel"/> + <button label="å–消" label_selected="å–消" name="cancel"/> </floater> diff --git a/indra/newview/skins/default/xui/zh/floater_postcard.xml b/indra/newview/skins/default/xui/zh/floater_postcard.xml index c85ca93e85b6dfb255c128e8fb991459b7b2f673..6f6b75f4680d9d39ab86c73f96abb4fbe324f286 100644 --- a/indra/newview/skins/default/xui/zh/floater_postcard.xml +++ b/indra/newview/skins/default/xui/zh/floater_postcard.xml @@ -7,27 +7,27 @@ Check this out! </floater.string> <floater.string name="upload_message"> - Sending... + 傳é€ä¸... </floater.string> <text name="to_label"> - Recipient's Email: + 收件人電å郵件地å€ï¼š </text> <text name="from_label"> - Your Email: + ä½ çš„é›»å郵件地å€ï¼š </text> <text name="name_label"> - Your Name: + ä½ çš„å稱: </text> <text name="subject_label"> - Subject: + 主旨: </text> - <line_editor label="Type your subject here." name="subject_form"/> + <line_editor label="在æ¤è¼¸å…¥ä½ 的主旨。" name="subject_form"/> <text name="msg_label"> - Message: + 訓æ¯ï¼š </text> <text_editor name="msg_form"> - Type your message here. + 在æ¤è¼¸å…¥ä½ 的訊æ¯ã€‚ </text_editor> - <button label="å–銷" name="cancel_btn"/> - <button label="Send" name="send_btn"/> + <button label="å–消" name="cancel_btn"/> + <button label="é€å‡º" name="send_btn"/> </floater> diff --git a/indra/newview/skins/default/xui/zh/floater_preferences.xml b/indra/newview/skins/default/xui/zh/floater_preferences.xml index 777425ba30dd72bcfd926a0976ae09e0213d9953..396a4893e04dafaed83cb2cfd19e9b93fa18a8ee 100644 --- a/indra/newview/skins/default/xui/zh/floater_preferences.xml +++ b/indra/newview/skins/default/xui/zh/floater_preferences.xml @@ -1,17 +1,17 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Preferences" title="PREFERENCES"> +<floater name="Preferences" title="å好è¨å®š"> <button label="確定" label_selected="確定" name="OK"/> - <button label="å–銷" label_selected="å–銷" name="Cancel"/> + <button label="å–消" label_selected="å–消" name="Cancel"/> <tab_container name="pref core"> <panel label="一般" name="general"/> - <panel label="Graphics" name="display"/> - <panel label="Sound & Media" name="audio"/> + <panel label="圖形" name="display"/> + <panel label="è²éŸ³èˆ‡åª’é«”" name="audio"/> <panel label="èŠå¤©" name="chat"/> - <panel label="Move & View" name="move"/> - <panel label="Notifications" name="msgs"/> - <panel label="Colors" name="colors"/> - <panel label="Privacy" name="im"/> - <panel label="Setup" name="input"/> - <panel label="Advanced" name="advanced1"/> + <panel label="移動與視角" name="move"/> + <panel label="通知" name="msgs"/> + <panel label="é¡è‰²" name="colors"/> + <panel label="éš±ç§" name="im"/> + <panel label="è¨å®š" name="input"/> + <panel label="進階" name="advanced1"/> </tab_container> </floater> diff --git a/indra/newview/skins/default/xui/zh/floater_preview_animation.xml b/indra/newview/skins/default/xui/zh/floater_preview_animation.xml index 5ac2de4dc5e1315ccef5fa563c419b439bbe6fb5..ead8dc49a6da09604214d185398c2eaf840ecbbb 100644 --- a/indra/newview/skins/default/xui/zh/floater_preview_animation.xml +++ b/indra/newview/skins/default/xui/zh/floater_preview_animation.xml @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="preview_anim"> <floater.string name="Title"> - Animation: [NAME] + 動作: [NAME] </floater.string> <text name="desc txt"> æ述: </text> - <button label="Play Inworld" label_selected="Stop" name="Anim play btn" tool_tip="Play this animation so that others can see it"/> - <button label="Play Locally" label_selected="Stop" name="Anim audition btn" tool_tip="Play this animation so that only you can see it"/> + <button label="Play Inworld" label_selected="åœæ¢" name="Anim play btn" tool_tip="Play this animation so that others can see it"/> + <button label="Play Locally" label_selected="åœæ¢" name="Anim audition btn" tool_tip="Play this animation so that only you can see it"/> </floater> diff --git a/indra/newview/skins/default/xui/zh/floater_preview_gesture.xml b/indra/newview/skins/default/xui/zh/floater_preview_gesture.xml index 52e6a9d8e4a82a1dbc32854ddb381f608b583470..0649ecb79128af08d27cafba2d8655c8c75c6dc5 100644 --- a/indra/newview/skins/default/xui/zh/floater_preview_gesture.xml +++ b/indra/newview/skins/default/xui/zh/floater_preview_gesture.xml @@ -13,7 +13,7 @@ Wait: </floater.string> <floater.string name="stop_txt"> - Stop + åœæ¢ </floater.string> <floater.string name="preview_txt"> é 覽 @@ -43,10 +43,10 @@ Library: </text> <scroll_list name="library_list"> - <scroll_list.rows name="action_animation" value="Animation"/> - <scroll_list.rows name="action_sound" value="Sound"/> + <scroll_list.rows name="action_animation" value="動作"/> + <scroll_list.rows name="action_sound" value="è²éŸ³"/> <scroll_list.rows name="action_chat" value="èŠå¤©"/> - <scroll_list.rows name="action_wait" value="Wait"/> + <scroll_list.rows name="action_wait" value="ç‰å¾…"/> </scroll_list> <button label="Add >>" name="add_btn"/> <text name="steps_label"> @@ -59,10 +59,10 @@ (é¸é …) </text> <radio_group name="animation_trigger_type"> - <radio_item label="Start" name="start"/> - <radio_item label="Stop" name="stop"/> + <radio_item label="開始" name="start"/> + <radio_item label="åœæ¢" name="stop"/> </radio_group> - <check_box label="until animations are done" name="wait_anim_check"/> + <check_box label="直到動作çµæŸã€‚" name="wait_anim_check"/> <check_box label="time in seconds:" name="wait_time_check"/> <text name="help_label"> All steps happen simultaneously, unless you add wait steps. diff --git a/indra/newview/skins/default/xui/zh/floater_preview_notecard.xml b/indra/newview/skins/default/xui/zh/floater_preview_notecard.xml index 08d56be302cc99c51577e5d11a591b29183ddc43..3c2f913a6dc5317ae0d258c3ff71e53efcc60d6e 100644 --- a/indra/newview/skins/default/xui/zh/floater_preview_notecard.xml +++ b/indra/newview/skins/default/xui/zh/floater_preview_notecard.xml @@ -7,7 +7,7 @@ You do not have permission to view this notecard. </floater.string> <floater.string name="Title"> - Notecard: [NAME] + 記事å¡ï¼š [NAME] </floater.string> <text name="desc txt"> æ述: diff --git a/indra/newview/skins/default/xui/zh/floater_publish_classified.xml b/indra/newview/skins/default/xui/zh/floater_publish_classified.xml index 45bbe7b9796b83334e29683efef43582f7a20f8e..acec1efcb05929a1e5427cf1fc683275ec8278ee 100644 --- a/indra/newview/skins/default/xui/zh/floater_publish_classified.xml +++ b/indra/newview/skins/default/xui/zh/floater_publish_classified.xml @@ -7,5 +7,5 @@ Remember, Classified fees are non-refundable. </text> <spinner label="åƒ¹æ ¼ï¼š L$" name="price_for_listing" tool_tip="Price for listing." value="50"/> <button label="Publish" name="publish_btn"/> - <button label="å–銷" name="cancel_btn"/> + <button label="å–消" name="cancel_btn"/> </floater> diff --git a/indra/newview/skins/default/xui/zh/floater_report_abuse.xml b/indra/newview/skins/default/xui/zh/floater_report_abuse.xml index da89cd80ad0e42169d867c54bda0bd989a060ac5..436f5cdcc56ad9097baf6d548a5e755bd8dd1287 100644 --- a/indra/newview/skins/default/xui/zh/floater_report_abuse.xml +++ b/indra/newview/skins/default/xui/zh/floater_report_abuse.xml @@ -90,5 +90,5 @@ * Incomplete reports won't be investigated </text> <button label="èˆ‰å ±æ¿«ç”¨" label_selected="èˆ‰å ±æ¿«ç”¨" name="send_btn"/> - <button label="å–銷" label_selected="å–銷" name="cancel_btn"/> + <button label="å–消" label_selected="å–消" name="cancel_btn"/> </floater> diff --git a/indra/newview/skins/default/xui/zh/floater_script_debug.xml b/indra/newview/skins/default/xui/zh/floater_script_debug.xml index 12e646785da148f9b5572b95d201202fefca28f4..5b3500c018e41b281717e345d202fc0da10c90c7 100644 --- a/indra/newview/skins/default/xui/zh/floater_script_debug.xml +++ b/indra/newview/skins/default/xui/zh/floater_script_debug.xml @@ -1,2 +1,2 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<multi_floater name="script debug floater" title="Script Warning/Error"/> +<multi_floater name="script debug floater" title="腳本 è¦å‘Š/錯誤"/> diff --git a/indra/newview/skins/default/xui/zh/floater_script_search.xml b/indra/newview/skins/default/xui/zh/floater_script_search.xml index b6671df0e266b0005562070951106829c07a16c9..400ef4be81fd19b9284c867a2155690eed464f1b 100644 --- a/indra/newview/skins/default/xui/zh/floater_script_search.xml +++ b/indra/newview/skins/default/xui/zh/floater_script_search.xml @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="script search" title="SCRIPT SEARCH"> +<floater name="script search" title="腳本æœå°‹"> <check_box label="Case Insensitive" name="case_text"/> - <button label="Search" label_selected="Search" name="search_btn"/> + <button label="æœå°‹" label_selected="æœå°‹" name="search_btn"/> <button label="å–代" label_selected="å–代" name="replace_btn"/> <button label="全部å–代" label_selected="全部å–代" name="replace_all_btn"/> <text name="txt"> - Search + æœå°‹ </text> <text name="txt2"> å–代 diff --git a/indra/newview/skins/default/xui/zh/floater_select_key.xml b/indra/newview/skins/default/xui/zh/floater_select_key.xml index 1452f744dac4159439bc03bc2b2afe68818f43bb..c1661635f1652e3a7048e30531bda22c6b9089fa 100644 --- a/indra/newview/skins/default/xui/zh/floater_select_key.xml +++ b/indra/newview/skins/default/xui/zh/floater_select_key.xml @@ -3,5 +3,5 @@ <text name="Save item as:"> Press a key to set your Speak button trigger. </text> - <button label="å–銷" label_selected="å–銷" name="Cancel"/> + <button label="å–消" label_selected="å–消" name="Cancel"/> </floater> diff --git a/indra/newview/skins/default/xui/zh/floater_sell_land.xml b/indra/newview/skins/default/xui/zh/floater_sell_land.xml index 2d3f5066bc8cb207e3b6ae020f46039159a815de..19580c99a1f4a733c8c92e2077ea4a0fc321407b 100644 --- a/indra/newview/skins/default/xui/zh/floater_sell_land.xml +++ b/indra/newview/skins/default/xui/zh/floater_sell_land.xml @@ -41,7 +41,7 @@ <combo_box name="sell_to"> <combo_box.item label="- é¸æ“‡ä¸€å€‹ -" name="--selectone--"/> <combo_box.item label="任何人" name="Anyone"/> - <combo_box.item label="Specific person:" name="Specificuser:"/> + <combo_box.item label="指定人:" name="Specificuser:"/> </combo_box> <button label="é¸æ“‡" name="sell_to_select_agent"/> <text name="sell_objects_label"> @@ -59,7 +59,7 @@ REMEMBER: All sales are final. </text> <button label="Set Land For Sale" name="sell_btn"/> - <button label="å–銷" name="cancel_btn"/> + <button label="å–消" name="cancel_btn"/> </panel> </scroll_container> </floater> diff --git a/indra/newview/skins/default/xui/zh/floater_snapshot.xml b/indra/newview/skins/default/xui/zh/floater_snapshot.xml index b4216cf5b29a5db5340a441badb99da616d766f4..9edc19969f8c4700145b1195b28388ab40c708ce 100644 --- a/indra/newview/skins/default/xui/zh/floater_snapshot.xml +++ b/indra/newview/skins/default/xui/zh/floater_snapshot.xml @@ -11,15 +11,15 @@ <text name="file_size_label"> [SIZE] KB </text> - <button label="Send" name="send_btn"/> - <button label="Save (L$[AMOUNT])" name="upload_btn"/> - <flyout_button label="儲å˜" name="save_btn" tool_tip="Save image to a file"> + <button label="é€å‡º" name="send_btn"/> + <button label="儲å˜ï¼ˆL$[AMOUNT])" name="upload_btn"/> + <flyout_button label="儲å˜" name="save_btn" tool_tip="儲å˜åœ–åƒåˆ°æª”案"> <flyout_button.item label="儲å˜" name="save_item"/> <flyout_button.item label="å¦å˜..." name="saveas_item"/> </flyout_button> <button label="更多" name="more_btn" tool_tip="進階é¸é …"/> <button label="æ›´å°‘" name="less_btn" tool_tip="進階é¸é …"/> - <button label="å–銷" name="discard_btn"/> + <button label="å–消" name="discard_btn"/> <text name="type_label2"> 尺寸 </text> @@ -58,17 +58,17 @@ <spinner label="Width" name="snapshot_width"/> <spinner label="Height" name="snapshot_height"/> <check_box label="Constrain proportions" name="keep_aspect_check"/> - <slider label="Image quality" name="image_quality_slider"/> + <slider label="圖åƒå“質" name="image_quality_slider"/> <text name="layer_type_label"> Capture: </text> - <combo_box label="Image Layers" name="layer_types"> + <combo_box label="圖層" name="layer_types"> <combo_box.item label="Colors" name="Colors"/> <combo_box.item label="Depth" name="Depth"/> </combo_box> <check_box label="Interface" name="ui_check"/> <check_box label="HUDs" name="hud_check"/> <check_box label="Keep open after saving" name="keep_open_check"/> - <check_box label="Freeze frame (fullscreen)" name="freeze_frame_check"/> + <check_box label="å‡çµæ¡†æž¶ï¼ˆå…¨èž¢å¹•ï¼‰" name="freeze_frame_check"/> <check_box label="Auto-refresh" name="auto_snapshot_check"/> </floater> diff --git a/indra/newview/skins/default/xui/zh/floater_sound_preview.xml b/indra/newview/skins/default/xui/zh/floater_sound_preview.xml index 269cd5db086329f426b5d0210c03d2ee23d1f3f6..c942ba1cfb43eab9c94f3011bce28e3fd5ac6951 100644 --- a/indra/newview/skins/default/xui/zh/floater_sound_preview.xml +++ b/indra/newview/skins/default/xui/zh/floater_sound_preview.xml @@ -7,5 +7,5 @@ æ述: </text> <button label="上傳(L$[AMOUNT])" name="ok_btn"/> - <button label="å–銷" label_selected="å–銷" name="cancel_btn"/> + <button label="å–消" label_selected="å–消" name="cancel_btn"/> </floater> diff --git a/indra/newview/skins/default/xui/zh/floater_stats.xml b/indra/newview/skins/default/xui/zh/floater_stats.xml index 54c5ba5cc0ea0016d4f4d904f87956f1d1bfbd56..eebd5df3f75a3f4bdcccd4f107b2e65d254c3a97 100644 --- a/indra/newview/skins/default/xui/zh/floater_stats.xml +++ b/indra/newview/skins/default/xui/zh/floater_stats.xml @@ -1,53 +1,53 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Statistics" title="STATISTICS"> +<floater name="Statistics" title="統計"> <scroll_container name="statistics_scroll"> <container_view name="statistics_view"> - <stat_view label="Basic" name="basic"> + <stat_view label="基本" name="basic"> <stat_bar label="FPS" name="fps"/> - <stat_bar label="Bandwidth" name="bandwidth"/> + <stat_bar label="é »å¯¬" name="bandwidth"/> <stat_bar label="å°åŒ…æ失" name="packet_loss"/> <stat_bar label="Ping Sim" name="ping"/> </stat_view> - <stat_view label="Advanced" name="advanced"> + <stat_view label="進階" name="advanced"> <stat_view label="Render" name="render"> <stat_bar label="KTris Drawn" name="ktrisframe"/> <stat_bar label="KTris Drawn" name="ktrissec"/> - <stat_bar label="Total Objects" name="objs"/> - <stat_bar label="New Objects" name="newobjs"/> + <stat_bar label="物件總計" name="objs"/> + <stat_bar label="新物件" name="newobjs"/> </stat_view> <stat_view label="æ質" name="texture"> - <stat_bar label="Count" name="numimagesstat"/> + <stat_bar label="計數" name="numimagesstat"/> <stat_bar label="Raw Count" name="numrawimagesstat"/> <stat_bar label="GL Mem" name="gltexmemstat"/> <stat_bar label="Formatted Mem" name="formattedmemstat"/> <stat_bar label="Raw Mem" name="rawmemstat"/> <stat_bar label="Bound Mem" name="glboundmemstat"/> </stat_view> - <stat_view label="Network" name="network"> + <stat_view label="網路" name="network"> <stat_bar label="Packets In" name="packetsinstat"/> <stat_bar label="Packets Out" name="packetsoutstat"/> - <stat_bar label="Objects" name="objectkbitstat"/> + <stat_bar label="物件" name="objectkbitstat"/> <stat_bar label="æ質" name="texturekbitstat"/> - <stat_bar label="Asset" name="assetkbitstat"/> + <stat_bar label="資產" name="assetkbitstat"/> <stat_bar label="Layers" name="layerskbitstat"/> <stat_bar label="Actual In" name="actualinkbitstat"/> <stat_bar label="Actual Out" name="actualoutkbitstat"/> <stat_bar label="VFS Pending Ops" name="vfspendingoperations"/> </stat_view> </stat_view> - <stat_view label="Simulator" name="sim"> + <stat_view label="模擬器" name="sim"> <stat_bar label="Time Dilation" name="simtimedilation"/> <stat_bar label="Sim FPS" name="simfps"/> <stat_bar label="Physics FPS" name="simphysicsfps"/> <stat_view label="Physics Details" name="physicsdetail"> <stat_bar label="Pinned Objects" name="physicspinnedtasks"/> <stat_bar label="Low LOD Objects" name="physicslodtasks"/> - <stat_bar label="Memory Allocated" name="physicsmemoryallocated"/> + <stat_bar label="記憶體é…ç½®" name="physicsmemoryallocated"/> </stat_view> <stat_bar label="Agent Updates/Sec" name="simagentups"/> <stat_bar label="Main Agents" name="simmainagents"/> <stat_bar label="Child Agents" name="simchildagents"/> - <stat_bar label="Objects" name="simobjects"/> + <stat_bar label="物件" name="simobjects"/> <stat_bar label="Active Objects" name="simactiveobjects"/> <stat_bar label="Active Scripts" name="simactivescripts"/> <stat_bar label="Script Events" name="simscripteps"/> @@ -63,7 +63,7 @@ <stat_bar label="Simulation Time" name="simsimothermsec"/> <stat_bar label="Agent Time" name="simagentmsec"/> <stat_bar label="Images Time" name="simimagesmsec"/> - <stat_bar label="Script Time" name="simscriptmsec"/> + <stat_bar label="腳本時間" name="simscriptmsec"/> </stat_view> </stat_view> </container_view> diff --git a/indra/newview/skins/default/xui/zh/floater_sys_well.xml b/indra/newview/skins/default/xui/zh/floater_sys_well.xml index dbdd32974c6d7808683dcc66786c40c9b67fad8e..fd27e944ac9949a582963f6bafc577b2d305cdd0 100644 --- a/indra/newview/skins/default/xui/zh/floater_sys_well.xml +++ b/indra/newview/skins/default/xui/zh/floater_sys_well.xml @@ -1,9 +1,9 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="sys_well_window" title="NOTIFICATIONS"> +<floater name="sys_well_window" title="通知"> <string name="title_im_well_window"> CONVERSATIONS </string> <string name="title_notification_well_window"> - NOTIFICATIONS + 通知 </string> </floater> diff --git a/indra/newview/skins/default/xui/zh/floater_texture_ctrl.xml b/indra/newview/skins/default/xui/zh/floater_texture_ctrl.xml index aaf6ecd7cfb619301a7018a158f1dfd3dc630279..fc00b0b4a2deb77f170bc723c1f89655b24491b0 100644 --- a/indra/newview/skins/default/xui/zh/floater_texture_ctrl.xml +++ b/indra/newview/skins/default/xui/zh/floater_texture_ctrl.xml @@ -19,5 +19,5 @@ <filter_editor label="æ質éŽæ¿¾å™¨" name="inventory search editor"/> <check_box initial_value="false" label="顯示資料夾" name="show_folders_check"/> <button label="確定" label_selected="確定" name="Select"/> - <button label="å–銷" label_selected="å–銷" name="Cancel"/> + <button label="å–消" label_selected="å–消" name="Cancel"/> </floater> diff --git a/indra/newview/skins/default/xui/zh/floater_tools.xml b/indra/newview/skins/default/xui/zh/floater_tools.xml index feee659736412c2475c49cb230309179db00a010..300d7ee63be9fe34e19e974d2fe0087782b24c9a 100644 --- a/indra/newview/skins/default/xui/zh/floater_tools.xml +++ b/indra/newview/skins/default/xui/zh/floater_tools.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="toolbox floater" short_title="BUILD TOOLS"> +<floater name="toolbox floater" short_title="å»ºé€ å·¥å…·"> <floater.string name="status_rotate"> Drag colored bands to rotate object </floater.string> @@ -39,11 +39,11 @@ <floater.string name="grid_attachment_text"> Attachment </floater.string> - <button name="button focus" tool_tip="Focus"/> + <button name="button focus" tool_tip="èšç„¦"/> <button name="button move" tool_tip="移動"/> <button name="button edit" tool_tip="編輯"/> - <button name="button create" tool_tip="Create"/> - <button name="button land" tool_tip="Land"/> + <button name="button create" tool_tip="å‰µé€ "/> + <button name="button land" tool_tip="土地"/> <text name="text status"> Drag to move, shift-drag to copy </text> @@ -60,18 +60,18 @@ </radio_group> <radio_group name="edit_radio_group"> <radio_item label="移動" name="radio position"/> - <radio_item label="Rotate (Ctrl)" name="radio rotate"/> - <radio_item label="Stretch (Ctrl+Shift)" name="radio stretch"/> - <radio_item label="Select Face" name="radio select face"/> + <radio_item label="旋轉(Ctrl)" name="radio rotate"/> + <radio_item label="伸展(Ctrl+Shift)" name="radio stretch"/> + <radio_item label="é¸æ“‡é¢" name="radio select face"/> </radio_group> - <check_box label="Edit linked" name="checkbox edit linked parts"/> - <button label="Link" name="link_btn"/> - <button label="Unlink" name="unlink_btn"/> + <check_box label="編輯è¯çµéƒ¨åˆ†" name="checkbox edit linked parts"/> + <button label="è¯çµ" name="link_btn"/> + <button label="å–消è¯çµ" name="unlink_btn"/> <text name="RenderingCost" tool_tip="Shows the rendering cost calculated for this object"> þ: [COUNT] </text> - <text label="Stretch Both Sides" name="checkbox uniform label"> - Stretch Both Sides + <text label="åŒæ™‚伸展兩å´" name="checkbox uniform label"> + åŒæ™‚ä¼¸å±•å…©å´ </text> <check_box initial_value="true" label="伸展æ質" name="checkbox stretch textures"/> <check_box initial_value="true" label="è²¼é½Šæ ¼ç·š" name="checkbox snap to grid"/> @@ -80,7 +80,7 @@ <combo_box.item label="Local grid" name="Local"/> <combo_box.item label="Reference grid" name="Reference"/> </combo_box> - <button name="Options..." tool_tip="See more grid options"/> + <button name="Options..." tool_tip="å¯Ÿçœ‹æ›´å¤šæ ¼ç·šé¸é …"/> <button name="ToolCube" tool_tip="Cube"/> <button name="ToolPrism" tool_tip="Prism"/> <button name="ToolPyramid" tool_tip="Pyramid"/> @@ -96,33 +96,33 @@ <button name="ToolRing" tool_tip="Ring"/> <button name="ToolTree" tool_tip="Tree"/> <button name="ToolGrass" tool_tip="Grass"/> - <check_box label="Keep Tool selected" name="checkbox sticky"/> - <check_box label="Copy selection" name="checkbox copy selection"/> + <check_box label="ä¿æŒå·²é¸æ“‡çš„工具" name="checkbox sticky"/> + <check_box label="覆製é¸æ“‡" name="checkbox copy selection"/> <check_box initial_value="true" label="Center Copy" name="checkbox copy centers"/> <check_box label="Rotate Copy" name="checkbox copy rotates"/> <radio_group name="land_radio_group"> - <radio_item label="Select Land" name="radio select land"/> - <radio_item label="Flatten" name="radio flatten"/> - <radio_item label="Raise" name="radio raise"/> - <radio_item label="Lower" name="radio lower"/> - <radio_item label="Smooth" name="radio smooth"/> - <radio_item label="Roughen" name="radio noise"/> - <radio_item label="Revert" name="radio revert"/> + <radio_item label="é¸æ“‡åœŸåœ°" name="radio select land"/> + <radio_item label="攤平" name="radio flatten"/> + <radio_item label="æ高" name="radio raise"/> + <radio_item label="é™ä½Ž" name="radio lower"/> + <radio_item label="平滑" name="radio smooth"/> + <radio_item label="ç²—ç³™" name="radio noise"/> + <radio_item label="還原" name="radio revert"/> </radio_group> <text name="Bulldozer:"> - Bulldozer: + 推土機: </text> <text name="Dozer Size:"> 尺寸 </text> <slider_bar initial_value="2.0" name="slider brush size"/> <text name="Strength:"> - Strength + åŠ›é“ </text> <slider_bar initial_value="0.00" name="slider force"/> - <button label="套用" label_selected="套用" name="button apply to selection" tool_tip="Modify selected land"/> + <button label="套用" label_selected="套用" name="button apply to selection" tool_tip="修改所é¸æ“‡çš„土地"/> <text name="obj_count"> - Objects: [COUNT] + 物件: [COUNT] </text> <text name="prim_count"> Prims: [COUNT] @@ -136,19 +136,19 @@ Deed </panel.string> <panel.string name="text modify info 1"> - You can modify this object + ä½ èƒ½ä¿®æ”¹é€™å€‹ç‰©ä»¶ </panel.string> <panel.string name="text modify info 2"> - You can modify these objects + ä½ èƒ½ä¿®æ”¹é€™äº›ç‰©ä»¶ </panel.string> <panel.string name="text modify info 3"> - You can't modify this object + ä½ ä¸èƒ½ä¿®æ”¹é€™å€‹ç‰©ä»¶ </panel.string> <panel.string name="text modify info 4"> - You can't modify these objects + ä½ ä¸èƒ½ä¿®æ”¹é€™äº›ç‰©ä»¶ </panel.string> <panel.string name="text modify warning"> - You must select entire object to set permissions + ä½ å¿…é ˆé¸å–整個物件以è¨å®šæ¬Šé™ </panel.string> <panel.string name="Cost Default"> åƒ¹æ ¼ï¼š L$ @@ -157,7 +157,7 @@ 總價: L$ </panel.string> <panel.string name="Cost Per Unit"> - Price Per: L$ + 單價æ¯å€‹ï¼š L$ </panel.string> <panel.string name="Cost Mixed"> Mixed Price @@ -181,19 +181,19 @@ 社團: </text> <name_box initial_value="載入ä¸..." name="Group Name Proxy"/> - <button name="button set group" tool_tip="Choose a group to share this object's permissions"/> + <button name="button set group" tool_tip="é¸æ“‡ä¸€å€‹ç¤¾åœ˜ä»¥åˆ†äº«é€™ç‰©ä»¶æ¬Šé™"/> <check_box label="分享" name="checkbox share with group" tool_tip="Allow all members of the set group to share your modify permissions for this object. You must Deed to enable role restrictions."/> <button label="Deed" label_selected="Deed" name="button deed" tool_tip="Deeding gives this item away with next owner permissions. Group shared objects can be deeded by a group officer."/> <text name="label click action"> - Click to: + 點擊以: </text> <combo_box name="clickaction"> - <combo_box.item label="Touch (default)" name="Touch/grab(default)"/> - <combo_box.item label="Sit on object" name="Sitonobject"/> - <combo_box.item label="Buy object" name="Buyobject"/> - <combo_box.item label="Pay object" name="Payobject"/> - <combo_box.item label="Open" name="Open"/> - <combo_box.item label="Zoom" name="Zoom"/> + <combo_box.item label="觸碰(é è¨ï¼‰" name="Touch/grab(default)"/> + <combo_box.item label="å在物件上" name="Sitonobject"/> + <combo_box.item label="購買物件" name="Buyobject"/> + <combo_box.item label="支付物件" name="Payobject"/> + <combo_box.item label="é–‹å•Ÿ" name="Open"/> + <combo_box.item label="縮放" name="Zoom"/> </combo_box> <check_box label="出售:" name="checkbox for sale"/> <combo_box name="sale type"> @@ -202,10 +202,10 @@ <combo_box.item label="原件" name="Original"/> </combo_box> <spinner label="åƒ¹æ ¼ï¼š L$" name="Edit Cost"/> - <check_box label="Show in search" name="search_check" tool_tip="Let people see this object in search results"/> + <check_box label="顯示在æœå°‹ä¸" name="search_check" tool_tip="讓其他人å¯ä»¥åœ¨æœå°‹çµæžœä¸çœ‹åˆ°é€™ç‰©ä»¶"/> <panel name="perms_build"> <text name="perm_modify"> - You can modify this object + ä½ å¯ä»¥ä¿®æ”¹é€™å€‹ç‰©ä»¶ </text> <text name="Anyone can:"> 任何人: @@ -238,13 +238,13 @@ </text> </panel> </panel> - <panel label="Object" name="Object"> - <check_box label="Locked" name="checkbox locked" tool_tip="Prevents object from being moved or deleted. Frequently useful during building to avoid unintended edits."/> - <check_box label="Physical" name="Physical Checkbox Ctrl" tool_tip="Allows object to be pushed and affected by gravity"/> - <check_box label="Temporary" name="Temporary Checkbox Ctrl" tool_tip="Causes object to be deleted 1 minute after creation"/> - <check_box label="Phantom" name="Phantom Checkbox Ctrl" tool_tip="Causes object to not collide with other objects or avatars"/> + <panel label="物件" name="Object"> + <check_box label="鎖定" name="checkbox locked" tool_tip="é 防物件被移動或刪除,最常使用的狀æ³æ˜¯åœ¨å»ºé€ éŽç¨‹ä¸é¿å…被æ„外的編輯。"/> + <check_box label="物ç†æ€§" name="Physical Checkbox Ctrl" tool_tip="å…許物件被推撞與å—é‡åŠ›å½±éŸ¿"/> + <check_box label="暫時性" name="Temporary Checkbox Ctrl" tool_tip="ä½¿ç‰©ä»¶åœ¨å»ºé€ å¾Œçš„ä¸€åˆ†é˜è‡ªå‹•åˆªé™¤"/> + <check_box label="幻影性" name="Phantom Checkbox Ctrl" tool_tip="使物件ä¸æœƒèˆ‡å…¶ä»–物件或化身產生碰撞"/> <text name="label position"> - Position (meters) + ä½ç½®ï¼ˆå…¬å°ºï¼‰ </text> <spinner label="X" name="Pos X"/> <spinner label="Y" name="Pos Y"/> @@ -256,7 +256,7 @@ <spinner label="Y" name="Scale Y"/> <spinner label="Z" name="Scale Z"/> <text name="label rotation"> - Rotation (degrees) + 旋轉(角度) </text> <spinner label="X" name="Rot X"/> <spinner label="Y" name="Rot Y"/> @@ -273,12 +273,12 @@ </combo_box> <combo_box name="material"> <combo_box.item label="Stone" name="Stone"/> - <combo_box.item label="Metal" name="Metal"/> - <combo_box.item label="Glass" name="Glass"/> - <combo_box.item label="Wood" name="Wood"/> - <combo_box.item label="Flesh" name="Flesh"/> - <combo_box.item label="Plastic" name="Plastic"/> - <combo_box.item label="Rubber" name="Rubber"/> + <combo_box.item label="金屬" name="Metal"/> + <combo_box.item label="玻璃" name="Glass"/> + <combo_box.item label="木é " name="Wood"/> + <combo_box.item label="肌肉" name="Flesh"/> + <combo_box.item label="å¡‘è† " name="Plastic"/> + <combo_box.item label="æ©¡è† " name="Rubber"/> </combo_box> <text name="text cut"> Path Cut (begin/end) @@ -286,13 +286,13 @@ <spinner label="B" name="cut begin"/> <spinner label="E" name="cut end"/> <text name="text hollow"> - Hollow + ä¸ç©º </text> <text name="text skew"> Skew </text> <text name="Hollow Shape"> - Hollow Shape + ä¸ç©ºå½¢ç‹€ </text> <combo_box name="hole"> <combo_box.item label="é è¨" name="Default"/> @@ -354,12 +354,12 @@ <combo_box.item label="Cylinder" name="Cylinder"/> </combo_box> </panel> - <panel label="Features" name="Features"> + <panel label="特性" name="Features"> <text name="select_single"> Select only one primitive to edit features. </text> <text name="edit_object"> - Edit object features: + 編輯物件特性: </text> <check_box label="Flexible Path" name="Flexible1D Checkbox Ctrl" tool_tip="Allows object to flex about the Z axis (Client-side only)"/> <spinner label="Softness" name="FlexNumSections"/> @@ -371,7 +371,7 @@ <spinner label="Force Y" name="FlexForceY"/> <spinner label="Force Z" name="FlexForceZ"/> <check_box label="Light" name="Light Checkbox Ctrl" tool_tip="Causes object to emit light"/> - <color_swatch name="colorswatch" tool_tip="Click to open color picker"/> + <color_swatch name="colorswatch" tool_tip="點擊以開啟é¡è‰²æŒ‘é¸å™¨"/> <texture_picker label="" name="light texture control" tool_tip="Click to choose a projection image (only has effect with deferred rendering enabled)"/> <spinner label="Intensity" name="Light Intensity"/> <spinner label="FOV" name="Light FOV"/> @@ -382,38 +382,38 @@ </panel> <panel label="æ質" name="Texture"> <panel.string name="string repeats per meter"> - Repeats Per Meter + æ¯å…¬å°ºé‡è¦†æ¬¡æ•¸ </panel.string> <panel.string name="string repeats per face"> - Repeats Per Face + æ¯ä¸€é¢é‡è¦†æ¬¡æ•¸ </panel.string> <texture_picker label="æ質" name="texture control" tool_tip="點擊以挑é¸åœ–片"/> - <color_swatch label="Color" name="colorswatch" tool_tip="Click to open color picker"/> + <color_swatch label="é¡è‰²" name="colorswatch" tool_tip="點擊以開啟é¡è‰²æŒ‘é¸å™¨"/> <text name="color trans"> - Transparency % + é€æ˜Žåº¦ % </text> <text name="glow label"> - Glow + 光暈 </text> - <check_box label="Full Bright" name="checkbox fullbright"/> + <check_box label="全亮" name="checkbox fullbright"/> <text name="tex gen"> - Mapping + æ˜ å°„æ–¹å¼ </text> <combo_box name="combobox texgen"> <combo_box.item label="é è¨" name="Default"/> - <combo_box.item label="Planar" name="Planar"/> + <combo_box.item label="å¹³é¢" name="Planar"/> </combo_box> <text name="label shininess"> - Shininess + 光澤 </text> <combo_box name="combobox shininess"> <combo_box.item label="ç„¡" name="None"/> - <combo_box.item label="Low" name="Low"/> - <combo_box.item label="Medium" name="Medium"/> - <combo_box.item label="High" name="High"/> + <combo_box.item label="低" name="Low"/> + <combo_box.item label="ä¸" name="Medium"/> + <combo_box.item label="高" name="High"/> </combo_box> <text name="label bumpiness"> - Bumpiness + 凹凸貼圖 </text> <combo_box name="combobox bumpiness"> <combo_box.item label="ç„¡" name="None"/> @@ -435,65 +435,65 @@ <combo_box.item label="suction" name="suction"/> <combo_box.item label="weave" name="weave"/> </combo_box> - <check_box initial_value="false" label="Align planar faces" name="checkbox planar align" tool_tip="Align textures on all selected faces with the last selected face. Requires Planar texture mapping."/> + <check_box initial_value="false" label="å°é½Šå¹³é¢" name="checkbox planar align" tool_tip="以最後所é¸æ“‡çš„é¢ç‚ºåŸºæº–,å°é½Šå…¨éƒ¨æ‰€é¸æ“‡çš„é¢ä¸Šçš„æè³ªã€‚é€™å¿…é ˆä½¿ç”¨å¹³é¢æè³ªæ˜ å°„æ–¹å¼ã€‚"/> <text name="rpt"> - Repeats / Face - </text> - <spinner label="Horizontal (U)" name="TexScaleU"/> - <check_box label="Flip" name="checkbox flip s"/> - <spinner label="Vertical (V)" name="TexScaleV"/> - <check_box label="Flip" name="checkbox flip t"/> - <spinner label="RotationËš" name="TexRot"/> - <spinner label="Repeats / Meter" name="rptctrl"/> + é‡è¦†æ¬¡æ•¸ / é¢ + </text> + <spinner label="水平(U)" name="TexScaleU"/> + <check_box label="翻轉" name="checkbox flip s"/> + <spinner label="垂直(V)" name="TexScaleV"/> + <check_box label="翻轉" name="checkbox flip t"/> + <spinner label="旋轉˚" name="TexRot"/> + <spinner label="é‡è¦†æ¬¡æ•¸ / 公尺" name="rptctrl"/> <button label="套用" label_selected="套用" name="button apply"/> <text name="tex offset"> æ質ä½ç§» </text> - <spinner label="Horizontal (U)" name="TexOffsetU"/> - <spinner label="Vertical (V)" name="TexOffsetV"/> + <spinner label="水平(U)" name="TexOffsetU"/> + <spinner label="垂直(V)" name="TexOffsetV"/> <panel name="Add_Media"> <text name="media_tex"> - Media + 媒體 </text> - <button name="add_media" tool_tip="Add Media"/> + <button name="add_media" tool_tip="æ·»åŠ åª’é«”"/> <button name="delete_media" tool_tip="刪除這個媒體æ質"/> - <button name="edit_media" tool_tip="Edit this Media"/> - <button label="Align" label_selected="Align Media" name="button align" tool_tip="Align media texture (must load first)"/> + <button name="edit_media" tool_tip="編輯這個媒體"/> + <button label="å°é½Š" label_selected="å°é½Šåª’é«”" name="button align" tool_tip="å°é½Šåª’é«”æè³ªï¼ˆé ˆå…ˆè¼‰å…¥ï¼‰"/> </panel> </panel> - <panel label="Content" name="Contents"> - <button label="New Script" label_selected="New Script" name="button new script"/> - <button label="Permissions" name="button permissions"/> + <panel label="內容" name="Contents"> + <button label="新腳本" label_selected="新腳本" name="button new script"/> + <button label="權é™" name="button permissions"/> </panel> </tab_container> <panel name="land info panel"> <text name="label_parcel_info"> - Parcel Information + 地段資訊 </text> <text name="label_area_price"> - Price: L$[PRICE] for [AREA] m² + åƒ¹æ ¼ï¼š L$[PRICE] 購買 [AREA] m² </text> <text name="label_area"> é¢ç©ï¼š [AREA] m² </text> <button label="關於土地" label_selected="關於土地" name="button about land"/> - <check_box label="顯示æ“有主" name="checkbox show owners" tool_tip="Colorize the parcels according to the type of owner: + <check_box label="顯示æ“有者" name="checkbox show owners" tool_tip="Colorize the parcels according to the type of owner: -Green = Your land -Aqua = Your group's land -Red = Owned by others -Yellow = For sale -Purple = For auction -Grey = Public"/> +ç¶ è‰² = ä½ çš„åœŸåœ° +æ°´è— = ä½ ç¤¾åœ˜çš„åœŸåœ° +紅色 = 其他人所有 +黃色 = 出售 +紫色 = æ‹è³£ +ç°è‰² = 公有地"/> <text name="label_parcel_modify"> - Modify Parcel + 修改地段 </text> - <button label="Subdivide" label_selected="Subdivide" name="button subdivide land"/> - <button label="Join" label_selected="Join" name="button join land"/> + <button label="分割" label_selected="分割" name="button subdivide land"/> + <button label="åˆä½µ" label_selected="åˆä½µ" name="button join land"/> <text name="label_parcel_trans"> - Land Transactions + 土地交易 </text> <button label="購買土地" label_selected="購買土地" name="button buy land"/> - <button label="Abandon Land" label_selected="Abandon Land" name="button abandon land"/> + <button label="放棄土地" label_selected="放棄土地" name="button abandon land"/> </panel> </floater> diff --git a/indra/newview/skins/default/xui/zh/floater_top_objects.xml b/indra/newview/skins/default/xui/zh/floater_top_objects.xml index c1ad927bbb8ac37d9f744499803e0d0c7f477532..074a4a1881b8aa454348c2c33d5b8d2462203f5b 100644 --- a/indra/newview/skins/default/xui/zh/floater_top_objects.xml +++ b/indra/newview/skins/default/xui/zh/floater_top_objects.xml @@ -19,7 +19,7 @@ Top [COUNT] objects experiencing many potential collisions </floater.string> <floater.string name="colliders_score_label"> - Score + ç©åˆ† </floater.string> <floater.string name="none_descriptor"> None found. @@ -28,7 +28,7 @@ 載入ä¸... </text> <scroll_list name="objects_list"> - <scroll_list.columns label="Score" name="score"/> + <scroll_list.columns label="ç©åˆ†" name="score"/> <scroll_list.columns label="å稱" name="name"/> <scroll_list.columns label="æ“有者" name="owner"/> <scroll_list.columns label="ä½ç½®" name="location"/> @@ -37,19 +37,19 @@ <scroll_list.columns label="URLs" name="URLs"/> </scroll_list> <text name="id_text"> - Object ID: + 物件 ID: </text> <button label="Show Beacon" name="show_beacon_btn"/> <text name="obj_name_text"> 物件å稱: </text> - <button label="Filter" name="filter_object_btn"/> + <button label="éŽæ¿¾å™¨" name="filter_object_btn"/> <text name="owner_name_text"> æ“有者: </text> - <button label="Filter" name="filter_owner_btn"/> - <button label="Return Selected" name="return_selected_btn"/> + <button label="éŽæ¿¾å™¨" name="filter_owner_btn"/> + <button label="退回所é¸æ“‡çš„" name="return_selected_btn"/> <button label="全部退回" name="return_all_btn"/> - <button label="Disable Selected" name="disable_selected_btn"/> - <button label="Disable All" name="disable_all_btn"/> + <button label="關閉所é¸æ“‡çš„" name="disable_selected_btn"/> + <button label="全部關閉" name="disable_all_btn"/> </floater> diff --git a/indra/newview/skins/default/xui/zh/floater_tos.xml b/indra/newview/skins/default/xui/zh/floater_tos.xml index acc61a7961c5995e26586ee4334b21b3879a9bec..5f9e16afe1d71bb3534be6e7af220b5cf13ac00f 100644 --- a/indra/newview/skins/default/xui/zh/floater_tos.xml +++ b/indra/newview/skins/default/xui/zh/floater_tos.xml @@ -7,7 +7,7 @@ data:text/html,%3Chtml%3E%3Chead%3E%3C/head%3E%3Cbody text=%22000000%22%3E%3Ch2%3E Loading %3Ca%20target%3D%22_external%22%20href%3D%22http%3A//secondlife.com/app/tos/%22%3ETerms%20of%20Service%3C/a%3E...%3C/h2%3E %3C/body%3E %3C/html%3E </floater.string> <button label="繼續" label_selected="繼續" name="Continue"/> - <button label="å–銷" label_selected="å–銷" name="Cancel"/> + <button label="å–消" label_selected="å–消" name="Cancel"/> <check_box label="我åŒæ„接å—æœå‹™æ¢æ¬¾åŠéš±ç§æ”¿ç–" name="agree_chk"/> <text name="tos_heading"> 請謹慎閱讀以下的æœå‹™æ¢æ¬¾åŠéš±ç§æ”¿ç–。è¦ç¹¼çºŒç™»å…¥åˆ° [SECOND_LIFE]ï¼Œä½ å¿…é ˆæŽ¥å—這些å”è°ã€‚ diff --git a/indra/newview/skins/default/xui/zh/floater_url_entry.xml b/indra/newview/skins/default/xui/zh/floater_url_entry.xml index 2b4f5ea11d0394104d7ca41e5b67b1f6b533aab9..65f6a9cb957b4c59be2d14a037c8fe6a74d707c4 100644 --- a/indra/newview/skins/default/xui/zh/floater_url_entry.xml +++ b/indra/newview/skins/default/xui/zh/floater_url_entry.xml @@ -1,10 +1,10 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="url_entry"> <text name="media_label"> - Media URL: + 媒體 URL: </text> <button label="" name="ok_btn"/> - <button label="å–銷" name="cancel_btn"/> + <button label="å–消" name="cancel_btn"/> <button label="清除" name="clear_btn"/> <text name="loading_label"> 載入ä¸... diff --git a/indra/newview/skins/default/xui/zh/floater_voice_effect.xml b/indra/newview/skins/default/xui/zh/floater_voice_effect.xml index b9021d25d9e115d3da64e4b15e0763a910861e51..36efe20b65c783e19afee55f24918cba94e2aeb6 100644 --- a/indra/newview/skins/default/xui/zh/floater_voice_effect.xml +++ b/indra/newview/skins/default/xui/zh/floater_voice_effect.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater label="Places" name="voice_effects" title="語音變è²"> +<floater label="地點" name="voice_effects" title="語音變è²"> <string name="no_voice_effect"> (No Voice Morph) </string> @@ -19,7 +19,7 @@ Record a sample, then click on a voice to hear how it will sound. </text> <button label="Record" name="record_btn" tool_tip="Record a sample of your voice."/> - <button label="Stop" name="record_stop_btn"/> + <button label="åœæ¢" name="record_stop_btn"/> <text name="voice_morphing_link"> [[URL] Subscribe Now] </text> diff --git a/indra/newview/skins/default/xui/zh/floater_water.xml b/indra/newview/skins/default/xui/zh/floater_water.xml index 8e790f8dad03aaebb33f3a300c19984f4f52434f..5fb57272af89dd882dd09437b6a59b258163d5d7 100644 --- a/indra/newview/skins/default/xui/zh/floater_water.xml +++ b/indra/newview/skins/default/xui/zh/floater_water.xml @@ -14,7 +14,7 @@ <text name="BHText"> Water Fog Color </text> - <color_swatch name="WaterFogColor" tool_tip="Click to open color picker"/> + <color_swatch name="WaterFogColor" tool_tip="點擊以開啟é¡è‰²æŒ‘é¸å™¨"/> <text name="WaterFogDensText"> Fog Density Exponent </text> @@ -43,7 +43,7 @@ Blur Multiplier </text> </panel> - <panel label="IMAGE" name="Waves"> + <panel label="圖åƒ" name="Waves"> <text name="BHText"> Big Wave Direction </text> diff --git a/indra/newview/skins/default/xui/zh/floater_web_content.xml b/indra/newview/skins/default/xui/zh/floater_web_content.xml index 2670e223d395dd9e2240ee8643be2a67a17bc3b9..a756498b814a074a5e7ce8ceb0b1de172cd350d7 100644 --- a/indra/newview/skins/default/xui/zh/floater_web_content.xml +++ b/indra/newview/skins/default/xui/zh/floater_web_content.xml @@ -4,9 +4,9 @@ <layout_panel name="nav_controls"> <button name="back" tool_tip="Navigate back"/> <button name="forward" tool_tip="Navigate forward"/> - <button name="stop" tool_tip="Stop navigation"/> + <button name="stop" tool_tip="åœæ¢å°Žè¦½"/> <button name="reload" tool_tip="é‡è¼‰é é¢"/> - <combo_box name="address" tool_tip="Enter URL here"/> + <combo_box name="address" tool_tip="在æ¤è¼¸å…¥ URL ä½ç½®"/> <icon name="media_secure_lock_flag" tool_tip="Secured Browsing"/> <button name="popexternal" tool_tip="Open current URL in your desktop browser"/> </layout_panel> diff --git a/indra/newview/skins/default/xui/zh/floater_whitelist_entry.xml b/indra/newview/skins/default/xui/zh/floater_whitelist_entry.xml index ea360be6c9355ceb8d036169ed4808a3b02b8f9d..36e00049f0b452c896e497078a7bc817032cad13 100644 --- a/indra/newview/skins/default/xui/zh/floater_whitelist_entry.xml +++ b/indra/newview/skins/default/xui/zh/floater_whitelist_entry.xml @@ -5,5 +5,5 @@ </text> <line_editor name="whitelist_entry" tool_tip="Enter a URL or URL pattern to White List"/> <button label="確定" name="ok_btn"/> - <button label="å–銷" name="cancel_btn"/> + <button label="å–消" name="cancel_btn"/> </floater> diff --git a/indra/newview/skins/default/xui/zh/floater_windlight_options.xml b/indra/newview/skins/default/xui/zh/floater_windlight_options.xml index d292386323e3ded355d101d1dd5817828659d041..fce851cc90e4d5c3e28c09601a018acd98fae67e 100644 --- a/indra/newview/skins/default/xui/zh/floater_windlight_options.xml +++ b/indra/newview/skins/default/xui/zh/floater_windlight_options.xml @@ -1,12 +1,12 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="WindLight floater" title="ADVANCED SKY EDITOR"> +<floater name="WindLight floater" title="進階天空編輯器"> <floater.string name="WLDefaultSkyNames"> A-12AM:A-12PM:A-3AM:A-3PM:A-4.30PM:A-6AM:A-6PM:A-9AM:A-9PM:Barcelona:Blizzard:Blue Midday:Coastal Afternoon:Coastal Sunset:Default:Desert Sunset:Fine Day:Fluffy Big Clouds:Foggy:Funky Funky:Funky Funky Funky:Gelatto:Ghost:Incongruent Truths:Midday 1:Midday 2:Midday 3:Midday 4:Night:Pirate:Purple:Sailor's Delight:Sheer Sensuality </floater.string> <text name="KeyFramePresetsText"> Sky Presets: </text> - <button label="New" label_selected="New" name="WLNewPreset"/> + <button label="新增" label_selected="新增" name="WLNewPreset"/> <button label="儲å˜" label_selected="儲å˜" name="WLSavePreset"/> <button label="刪除" label_selected="刪除" name="WLDeletePreset"/> <button label="Day Cycle Editor" label_selected="Day Cycle Editor" name="WLDayCycleMenuButton"/> diff --git a/indra/newview/skins/default/xui/zh/floater_window_size.xml b/indra/newview/skins/default/xui/zh/floater_window_size.xml index 167d4cb858c19ea89b89e0cb482198fea829c106..54b72afcccf77287c90b6b84f95a27fa51e0454a 100644 --- a/indra/newview/skins/default/xui/zh/floater_window_size.xml +++ b/indra/newview/skins/default/xui/zh/floater_window_size.xml @@ -6,12 +6,12 @@ <text name="windowsize_text"> è¨å®šè¦–窗尺寸大å°ï¼š </text> - <combo_box name="window_size_combo" tool_tip="width x height"> + <combo_box name="window_size_combo" tool_tip="寬度 x 高度"> <combo_box.item label="1000 x 700 (é è¨ï¼‰" name="item0"/> <combo_box.item label="1024 x 768" name="item1"/> <combo_box.item label="1280 x 720 (720p)" name="item2"/> <combo_box.item label="1920 x 1080 (1080p)" name="item3"/> </combo_box> <button label="è¨å®š" name="set_btn"/> - <button label="å–銷" name="cancel_btn"/> + <button label="å–消" name="cancel_btn"/> </floater> diff --git a/indra/newview/skins/default/xui/zh/floater_world_map.xml b/indra/newview/skins/default/xui/zh/floater_world_map.xml index 47038e3b3d192af8ab1bc6600566f1e61b7b5824..552bb02582e49b32febbfaa2c3e428b8ee6ee245 100644 --- a/indra/newview/skins/default/xui/zh/floater_world_map.xml +++ b/indra/newview/skins/default/xui/zh/floater_world_map.xml @@ -11,7 +11,7 @@ Me </text> <text name="person_label"> - Person + 人 </text> <text name="infohub_label"> Infohub @@ -40,7 +40,7 @@ Moderate </text> <text name="events_adult_label"> - Adult + æˆäºº </text> </panel> <panel name="layout_panel_3"> diff --git a/indra/newview/skins/default/xui/zh/inspect_group.xml b/indra/newview/skins/default/xui/zh/inspect_group.xml index 01649496bc14e743da6d86e6ac752fe2cb2f5615..3583976646448c308c651ad74a438d8db28a11d3 100644 --- a/indra/newview/skins/default/xui/zh/inspect_group.xml +++ b/indra/newview/skins/default/xui/zh/inspect_group.xml @@ -8,7 +8,7 @@ ç§äººç¤¾åœ˜ </string> <string name="FreeToJoin"> - Free to join + å…è²»åŠ å…¥ </string> <string name="CostToJoin"> L$[AMOUNT] to join @@ -26,7 +26,7 @@ Fear the moose! Fear it! And the mongoose too! <text name="group_cost"> L$123 to join </text> - <button label="Join" name="join_btn"/> - <button label="Leave" name="leave_btn"/> + <button label="åŠ å…¥" name="join_btn"/> + <button label="退出" name="leave_btn"/> <button label="察看檔案" name="view_profile_btn"/> </floater> diff --git a/indra/newview/skins/default/xui/zh/inspect_object.xml b/indra/newview/skins/default/xui/zh/inspect_object.xml index f1fe037087caca3fbcf1cc4597f129e62f90004a..58091b3aefbf93c40edcef87833ba6057fbf2271 100644 --- a/indra/newview/skins/default/xui/zh/inspect_object.xml +++ b/indra/newview/skins/default/xui/zh/inspect_object.xml @@ -35,7 +35,7 @@ owner secondlife:///app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/about http://www.superdupertest.com </text> <button label="購買" name="buy_btn"/> - <button label="Pay" name="pay_btn"/> + <button label="支付" name="pay_btn"/> <button label="å–得副本" name="take_free_copy_btn"/> <button label="Touch" name="touch_btn"/> <button label="Sit" name="sit_btn"/> diff --git a/indra/newview/skins/default/xui/zh/menu_attachment_other.xml b/indra/newview/skins/default/xui/zh/menu_attachment_other.xml index aa803cc49de543b1661ea371d8c291ef047194db..a04d59bc81e925588de4a9616b089fc07c77fccf 100644 --- a/indra/newview/skins/default/xui/zh/menu_attachment_other.xml +++ b/indra/newview/skins/default/xui/zh/menu_attachment_other.xml @@ -8,10 +8,10 @@ <menu_item_call label="é‚€è«‹åŠ å…¥ç¤¾åœ˜" name="Invite..."/> <menu_item_call label="å°éŽ–" name="Avatar Mute"/> <menu_item_call label="å›žå ±" name="abuse"/> - <menu_item_call label="Freeze" name="Freeze..."/> - <menu_item_call label="Eject" name="Eject..."/> + <menu_item_call label="å‡çµ" name="Freeze..."/> + <menu_item_call label="踢出" name="Eject..."/> <menu_item_call label="æ質除錯" name="Debug..."/> <menu_item_call label="Zoom In" name="Zoom In"/> - <menu_item_call label="Pay" name="Pay..."/> + <menu_item_call label="支付" name="Pay..."/> <menu_item_call label="物件檔案" name="Object Inspect"/> </context_menu> diff --git a/indra/newview/skins/default/xui/zh/menu_avatar_icon.xml b/indra/newview/skins/default/xui/zh/menu_avatar_icon.xml index 1da583b3d0c7be0e11019c4ef1699ca0def75b54..ef0986a13bd4fbdc2b571e5c640be1af93943f4d 100644 --- a/indra/newview/skins/default/xui/zh/menu_avatar_icon.xml +++ b/indra/newview/skins/default/xui/zh/menu_avatar_icon.xml @@ -3,5 +3,5 @@ <menu_item_call label="察看檔案" name="Show Profile"/> <menu_item_call label="é€å‡º IM..." name="Send IM"/> <menu_item_call label="åŠ ç‚ºæœ‹å‹..." name="Add Friend"/> - <menu_item_call label="Remove Friend..." name="Remove Friend"/> + <menu_item_call label="移除朋å‹..." name="Remove Friend"/> </menu> diff --git a/indra/newview/skins/default/xui/zh/menu_avatar_other.xml b/indra/newview/skins/default/xui/zh/menu_avatar_other.xml index 281d357fd3b223b5714257eb5263ed2cdff33390..acf98dfdfaf2c763b2296b590250737d39de5b38 100644 --- a/indra/newview/skins/default/xui/zh/menu_avatar_other.xml +++ b/indra/newview/skins/default/xui/zh/menu_avatar_other.xml @@ -8,9 +8,9 @@ <menu_item_call label="é‚€è«‹åŠ å…¥ç¤¾åœ˜" name="Invite..."/> <menu_item_call label="Block" name="Avatar Mute"/> <menu_item_call label="å›žå ±" name="abuse"/> - <menu_item_call label="Freeze" name="Freeze..."/> - <menu_item_call label="Eject" name="Eject..."/> + <menu_item_call label="å‡çµ" name="Freeze..."/> + <menu_item_call label="踢出" name="Eject..."/> <menu_item_call label="æ質除錯" name="Debug..."/> <menu_item_call label="Zoom In" name="Zoom In"/> - <menu_item_call label="Pay" name="Pay..."/> + <menu_item_call label="支付" name="Pay..."/> </context_menu> diff --git a/indra/newview/skins/default/xui/zh/menu_bottomtray.xml b/indra/newview/skins/default/xui/zh/menu_bottomtray.xml index d55b3afc95519c6b637e283f3388941a8e04458d..a00aa7cd355246be5ebdf1c7bf0aa4c3a3964f80 100644 --- a/indra/newview/skins/default/xui/zh/menu_bottomtray.xml +++ b/indra/newview/skins/default/xui/zh/menu_bottomtray.xml @@ -1,12 +1,12 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <menu name="hide_camera_move_controls_menu"> - <menu_item_check label="Speak Button" name="EnableVoiceChat"/> - <menu_item_check label="Gesture button" name="ShowGestureButton"/> - <menu_item_check label="Move button" name="ShowMoveButton"/> - <menu_item_check label="View button" name="ShowCameraButton"/> - <menu_item_check label="Snapshot button" name="ShowSnapshotButton"/> - <menu_item_check label="Build button" name="ShowBuildButton"/> - <menu_item_check label="Search button" name="ShowSearchButton"/> + <menu_item_check label="講話按鈕" name="EnableVoiceChat"/> + <menu_item_check label="姿勢按鈕" name="ShowGestureButton"/> + <menu_item_check label="移動按鈕" name="ShowMoveButton"/> + <menu_item_check label="視角按鈕" name="ShowCameraButton"/> + <menu_item_check label="快照按鈕" name="ShowSnapshotButton"/> + <menu_item_check label="å»ºé€ æŒ‰éˆ•" name="ShowBuildButton"/> + <menu_item_check label="æœå°‹æŒ‰éˆ•" name="ShowSearchButton"/> <menu_item_check label="地圖按鈕" name="ShowWorldMapButton"/> <menu_item_check label="è¿·ä½ åœ°åœ–æŒ‰éˆ•" name="ShowMiniMapButton"/> <menu_item_call label="剪下" name="NearbyChatBar_Cut"/> diff --git a/indra/newview/skins/default/xui/zh/menu_edit.xml b/indra/newview/skins/default/xui/zh/menu_edit.xml index 5c5c225c59c74a424476650524d6a1bcd295c396..d6eb87a6b05015b2d4d07c9ad4485bce545a5244 100644 --- a/indra/newview/skins/default/xui/zh/menu_edit.xml +++ b/indra/newview/skins/default/xui/zh/menu_edit.xml @@ -8,5 +8,5 @@ <menu_item_call label="刪除" name="Delete"/> <menu_item_call label="覆製貼上" name="Duplicate"/> <menu_item_call label="å…¨é¸" name="Select All"/> - <menu_item_call label="å–銷é¸æ“‡" name="Deselect"/> + <menu_item_call label="å–消é¸æ“‡" name="Deselect"/> </menu> diff --git a/indra/newview/skins/default/xui/zh/menu_gesture_gear.xml b/indra/newview/skins/default/xui/zh/menu_gesture_gear.xml index 8e30a15562250199c9ac4c409c1cc85932cc643c..e053eb238840fe0a816a6688a045df5498975951 100644 --- a/indra/newview/skins/default/xui/zh/menu_gesture_gear.xml +++ b/indra/newview/skins/default/xui/zh/menu_gesture_gear.xml @@ -3,7 +3,7 @@ <menu_item_call label="Add/Remove from Favorites" name="activate"/> <menu_item_call label="覆製" name="copy_gesture"/> <menu_item_call label="貼上" name="paste"/> - <menu_item_call label="Copy UUID" name="copy_uuid"/> + <menu_item_call label="覆製 UUID" name="copy_uuid"/> <menu_item_call label="儲å˜åˆ°ç›®å‰è£æ‰®" name="save_to_outfit"/> <menu_item_call label="編輯" name="edit_gesture"/> </toggleable_menu> diff --git a/indra/newview/skins/default/xui/zh/menu_hide_navbar.xml b/indra/newview/skins/default/xui/zh/menu_hide_navbar.xml index f03749533e521fe152079d8fa6477b9ba2174692..dbb8ececaac70851b0b0e053f88051a2d841d52f 100644 --- a/indra/newview/skins/default/xui/zh/menu_hide_navbar.xml +++ b/indra/newview/skins/default/xui/zh/menu_hide_navbar.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <menu name="hide_navbar_menu"> - <menu_item_check label="Show Navigation Bar" name="ShowNavbarNavigationPanel"/> - <menu_item_check label="Show Favorites Bar" name="ShowNavbarFavoritesPanel"/> - <menu_item_check label="Show Mini-Location Bar" name="ShowMiniLocationPanel"/> + <menu_item_check label="顯示導覽列" name="ShowNavbarNavigationPanel"/> + <menu_item_check label="顯示最愛列" name="ShowNavbarFavoritesPanel"/> + <menu_item_check label="é¡¯ç¤ºè¿·ä½ ä½ç½®åˆ—" name="ShowMiniLocationPanel"/> </menu> diff --git a/indra/newview/skins/default/xui/zh/menu_imchiclet_adhoc.xml b/indra/newview/skins/default/xui/zh/menu_imchiclet_adhoc.xml index 6cf86327be3305b3a683c40d3cc4c6ca3ed9778d..85417d554e51c883bd92f9d450514da791bc8ec8 100644 --- a/indra/newview/skins/default/xui/zh/menu_imchiclet_adhoc.xml +++ b/indra/newview/skins/default/xui/zh/menu_imchiclet_adhoc.xml @@ -1,4 +1,4 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <menu name="IMChiclet AdHoc Menu"> - <menu_item_call label="End Session" name="End Session"/> + <menu_item_call label="çµæŸæœƒè©±" name="End Session"/> </menu> diff --git a/indra/newview/skins/default/xui/zh/menu_imchiclet_group.xml b/indra/newview/skins/default/xui/zh/menu_imchiclet_group.xml index c208a146d2ff1daf3225c92f381a3ce8a18eaf05..2577c582a73a8a2a07e55e37e7004f66835e4859 100644 --- a/indra/newview/skins/default/xui/zh/menu_imchiclet_group.xml +++ b/indra/newview/skins/default/xui/zh/menu_imchiclet_group.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <menu name="IMChiclet Group Menu"> <menu_item_call label="社團資訊" name="Show Profile"/> - <menu_item_call label="Show Session" name="Chat"/> - <menu_item_call label="End Session" name="End Session"/> + <menu_item_call label="顯示會話" name="Chat"/> + <menu_item_call label="çµæŸæœƒè©±" name="End Session"/> </menu> diff --git a/indra/newview/skins/default/xui/zh/menu_imchiclet_p2p.xml b/indra/newview/skins/default/xui/zh/menu_imchiclet_p2p.xml index dc933518c0edfcc0425138e0ef0158fe74043186..636bdaae09265afabcb34b46ad52f5020e6acf1c 100644 --- a/indra/newview/skins/default/xui/zh/menu_imchiclet_p2p.xml +++ b/indra/newview/skins/default/xui/zh/menu_imchiclet_p2p.xml @@ -2,6 +2,6 @@ <menu name="IMChiclet P2P Menu"> <menu_item_call label="察看檔案" name="Show Profile"/> <menu_item_call label="åŠ ç‚ºæœ‹å‹" name="Add Friend"/> - <menu_item_call label="Show Session" name="Send IM"/> - <menu_item_call label="End Session" name="End Session"/> + <menu_item_call label="顯示會話" name="Send IM"/> + <menu_item_call label="çµæŸæœƒè©±" name="End Session"/> </menu> diff --git a/indra/newview/skins/default/xui/zh/menu_inspect_avatar_gear.xml b/indra/newview/skins/default/xui/zh/menu_inspect_avatar_gear.xml index 6d8fbba50308d34c52c02dd9174d9b72ebdd29f1..0f14057c07fb4090093a57adc7ccabb852944cb7 100644 --- a/indra/newview/skins/default/xui/zh/menu_inspect_avatar_gear.xml +++ b/indra/newview/skins/default/xui/zh/menu_inspect_avatar_gear.xml @@ -9,13 +9,13 @@ <menu_item_call label="Block" name="block"/> <menu_item_call label="Unblock" name="unblock"/> <menu_item_call label="å›žå ±" name="report"/> - <menu_item_call label="Freeze" name="freeze"/> - <menu_item_call label="Eject" name="eject"/> - <menu_item_call label="踢除" name="kick"/> + <menu_item_call label="å‡çµ" name="freeze"/> + <menu_item_call label="踢出" name="eject"/> + <menu_item_call label="踢出" name="kick"/> <menu_item_call label="CSR" name="csr"/> <menu_item_call label="æ質除錯" name="debug"/> <menu_item_call label="Find On Map" name="find_on_map"/> <menu_item_call label="Zoom In" name="zoom_in"/> - <menu_item_call label="Pay" name="pay"/> + <menu_item_call label="支付" name="pay"/> <menu_item_call label="分享" name="share"/> </toggleable_menu> diff --git a/indra/newview/skins/default/xui/zh/menu_inspect_object_gear.xml b/indra/newview/skins/default/xui/zh/menu_inspect_object_gear.xml index dab95fcadc8a712105bff2b2237ab8474bd54f17..94ab82b8a9495341941e8429936f957812fe94f5 100644 --- a/indra/newview/skins/default/xui/zh/menu_inspect_object_gear.xml +++ b/indra/newview/skins/default/xui/zh/menu_inspect_object_gear.xml @@ -1,18 +1,18 @@ <?xml version="1.0" encoding="utf-8"?> <toggleable_menu name="Gear Menu"> - <menu_item_call label="Touch" name="touch"/> - <menu_item_call label="Sit" name="sit"/> + <menu_item_call label="觸碰" name="touch"/> + <menu_item_call label="å下" name="sit"/> <menu_item_call label="Pay" name="pay"/> <menu_item_call label="購買" name="buy"/> - <menu_item_call label="Take" name="take"/> + <menu_item_call label="å–å¾—" name="take"/> <menu_item_call label="å–得副本" name="take_copy"/> - <menu_item_call label="Open" name="open"/> + <menu_item_call label="é–‹å•Ÿ" name="open"/> <menu_item_call label="編輯" name="edit"/> - <menu_item_call label="Wear" name="wear"/> - <menu_item_call label="Add" name="add"/> + <menu_item_call label="穿上" name="wear"/> + <menu_item_call label="æ·»åŠ " name="add"/> <menu_item_call label="å›žå ±" name="report"/> <menu_item_call label="Block" name="block"/> <menu_item_call label="Zoom In" name="zoom_in"/> - <menu_item_call label="Remove" name="remove"/> + <menu_item_call label="移除" name="remove"/> <menu_item_call label="更多資訊" name="more_info"/> </toggleable_menu> diff --git a/indra/newview/skins/default/xui/zh/menu_inventory.xml b/indra/newview/skins/default/xui/zh/menu_inventory.xml index fd8f73e4eacaf6a91b295491c6f06d884e2c45cb..a93e8be1498ce97ace976828ff83793503f5780e 100644 --- a/indra/newview/skins/default/xui/zh/menu_inventory.xml +++ b/indra/newview/skins/default/xui/zh/menu_inventory.xml @@ -28,17 +28,17 @@ <menu_item_call label="New Physics" name="New Physics"/> </menu> <menu label="新身體部ä½" name="New Body Parts"> - <menu_item_call label="New Shape" name="New Shape"/> - <menu_item_call label="New Skin" name="New Skin"/> - <menu_item_call label="New Hair" name="New Hair"/> - <menu_item_call label="New Eyes" name="New Eyes"/> + <menu_item_call label="新體形" name="New Shape"/> + <menu_item_call label="新皮膚" name="New Skin"/> + <menu_item_call label="æ–°é é«®" name="New Hair"/> + <menu_item_call label="新眼ç›" name="New Eyes"/> </menu> - <menu label="Change Type" name="Change Type"> + <menu label="變更類型" name="Change Type"> <menu_item_call label="é è¨" name="Default"/> <menu_item_call label="手套" name="Gloves"/> <menu_item_call label="夾克" name="Jacket"/> <menu_item_call label="褲å" name="Pants"/> - <menu_item_call label="Shape" name="Shape"/> + <menu_item_call label="體形" name="Shape"/> <menu_item_call label="éž‹å" name="Shoes"/> <menu_item_call label="襯衫" name="Shirt"/> <menu_item_call label="裙å" name="Skirt"/> @@ -46,19 +46,19 @@ <menu_item_call label="內衣" name="Undershirt"/> </menu> <menu_item_call label="瞬間傳é€" name="Landmark Open"/> - <menu_item_call label="Open" name="Animation Open"/> - <menu_item_call label="Open" name="Sound Open"/> + <menu_item_call label="é–‹å•Ÿ" name="Animation Open"/> + <menu_item_call label="é–‹å•Ÿ" name="Sound Open"/> <menu_item_call label="å–代目å‰çš„è£æ‰®" name="Replace Outfit"/> <menu_item_call label="æ·»åŠ åˆ°ç›®å‰è£æ‰®" name="Add To Outfit"/> <menu_item_call label="由目å‰çš„è£æ‰®ç§»é™¤" name="Remove From Outfit"/> <menu_item_call label="Find Original" name="Find Original"/> <menu_item_call label="Purge Item" name="Purge Item"/> <menu_item_call label="Restore Item" name="Restore Item"/> - <menu_item_call label="Open" name="Open"/> + <menu_item_call label="é–‹å•Ÿ" name="Open"/> <menu_item_call label="Open Original" name="Open Original"/> <menu_item_call label="Properties" name="Properties"/> <menu_item_call label="æ›´å" name="Rename"/> - <menu_item_call label="Copy Asset UUID" name="Copy Asset UUID"/> + <menu_item_call label="覆製資產 UUID" name="Copy Asset UUID"/> <menu_item_call label="覆製" name="Copy"/> <menu_item_call label="貼上" name="Paste"/> <menu_item_call label="Paste As Link" name="Paste As Link"/> @@ -66,11 +66,11 @@ <menu_item_call label="刪除" name="Delete"/> <menu_item_call label="刪除系統資料夾" name="Delete System Folder"/> <menu_item_call label="Start Conference Chat" name="Conference Chat Folder"/> - <menu_item_call label="Play" name="Sound Play"/> + <menu_item_call label="æ’放" name="Sound Play"/> <menu_item_call label="æ·»åŠ åœ°æ¨™" name="About Landmark"/> <menu_item_call label="Play Inworld" name="Animation Play"/> <menu_item_call label="Play Locally" name="Animation Audition"/> - <menu_item_call label="Send Instant Message" name="Send Instant Message"/> + <menu_item_call label="é€å‡ºå³æ™‚訊æ¯" name="Send Instant Message"/> <menu_item_call label="Offer Teleport..." name="Offer Teleport..."/> <menu_item_call label="Start Conference Chat" name="Conference Chat"/> <menu_item_call label="Activate" name="Activate"/> diff --git a/indra/newview/skins/default/xui/zh/menu_inventory_gear_default.xml b/indra/newview/skins/default/xui/zh/menu_inventory_gear_default.xml index 8c938222e70fe5e60f629450f66bcfa448d1f93a..f51b27d9ce3179198c28fa573a984c8aafa4e40a 100644 --- a/indra/newview/skins/default/xui/zh/menu_inventory_gear_default.xml +++ b/indra/newview/skins/default/xui/zh/menu_inventory_gear_default.xml @@ -3,12 +3,12 @@ <menu_item_call label="新收ç´å€è¦–窗" name="new_window"/> <menu_item_check label="ä¾å稱排åº" name="sort_by_name"/> <menu_item_check label="ä¾æœ€è¿‘排åº" name="sort_by_recent"/> - <menu_item_check label="Sort Folders Always by Name" name="sort_folders_by_name"/> - <menu_item_check label="Sort System Folders to Top" name="sort_system_folders_to_top"/> - <menu_item_call label="Show Filters" name="show_filters"/> + <menu_item_check label="總是由å稱排åºè³‡æ–™å¤¾" name="sort_folders_by_name"/> + <menu_item_check label="系統資料夾排åºåˆ°æœ€ä¸Šæ–¹" name="sort_system_folders_to_top"/> + <menu_item_call label="顯示éŽæ¿¾å™¨" name="show_filters"/> <menu_item_call label="Reset Filters" name="reset_filters"/> <menu_item_call label="關閉全部資料夾" name="close_folders"/> - <menu_item_call label="Empty Lost and Found" name="empty_lostnfound"/> + <menu_item_call label="清空 Lost and Found" name="empty_lostnfound"/> <menu_item_call label="儲å˜æ質為" name="Save Texture As"/> <menu_item_call label="分享" name="Share"/> <menu_item_call label="Find Original" name="Find Original"/> diff --git a/indra/newview/skins/default/xui/zh/menu_landmark.xml b/indra/newview/skins/default/xui/zh/menu_landmark.xml index 97b115151e97201e955799ef8c747b9e3b68e576..7372b223cfd008c734e4b56cfe567de80dd80376 100644 --- a/indra/newview/skins/default/xui/zh/menu_landmark.xml +++ b/indra/newview/skins/default/xui/zh/menu_landmark.xml @@ -2,6 +2,6 @@ <toggleable_menu name="landmark_overflow_menu"> <menu_item_call label="覆製 SLurl" name="copy"/> <menu_item_call label="刪除" name="delete"/> - <menu_item_call label="Create Pick" name="pick"/> - <menu_item_call label="Add to Favorites Bar" name="add_to_favbar"/> + <menu_item_call label="建立精é¸åœ°é»ž" name="pick"/> + <menu_item_call label="æ·»åŠ åˆ°æœ€æ„›åˆ—" name="add_to_favbar"/> </toggleable_menu> diff --git a/indra/newview/skins/default/xui/zh/menu_login.xml b/indra/newview/skins/default/xui/zh/menu_login.xml index 436e86cb74f9b0595861039dc32711e44bfb294d..d6bf34c66e3040119261d911a604bd706a2c8322 100644 --- a/indra/newview/skins/default/xui/zh/menu_login.xml +++ b/indra/newview/skins/default/xui/zh/menu_login.xml @@ -1,8 +1,8 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <menu_bar name="Login Menu"> <menu label="自己" name="File"> - <menu_item_call label="Preferences" name="Preferences..."/> - <menu_item_call label="Exit [APP_NAME]" name="Quit"/> + <menu_item_call label="å好è¨å®š" name="Preferences..."/> + <menu_item_call label="çµæŸé€€å‡º [APP_NAME]" name="Quit"/> </menu> <menu label="幫助" name="Help"> <menu_item_call label="[SECOND_LIFE] 幫助" name="Second Life Help"/> @@ -10,16 +10,16 @@ </menu> <menu_item_check label="顯示除錯é¸å–®" name="Show Debug Menu"/> <menu label="除錯" name="Debug"> - <menu_item_call label="Show Debug Settings" name="Debug Settings"/> - <menu_item_call label="UI/Color Settings" name="UI/Color Settings"/> - <menu_item_call label="XUI Preview Tool" name="UI Preview Tool"/> - <menu label="UI Tests" name="UI Tests"/> + <menu_item_call label="顯示除錯è¨å®š" name="Debug Settings"/> + <menu_item_call label="UI / é¡è‰² è¨å®š" name="UI/Color Settings"/> + <menu_item_call label="XUI é 覽工具" name="UI Preview Tool"/> + <menu label="UI 測試" name="UI Tests"/> <menu_item_call label="è¨å®šè¦–窗尺寸大å°..." name="Set Window Size..."/> - <menu_item_call label="Show TOS" name="TOS"/> - <menu_item_call label="Show Critical Message" name="Critical"/> - <menu_item_call label="Media Browser Test" name="Web Browser Test"/> - <menu_item_call label="Web Content Floater Test" name="Web Content Floater Test"/> - <menu_item_check label="Show Grid Picker" name="Show Grid Picker"/> - <menu_item_call label="Show Notifications Console" name="Show Notifications Console"/> + <menu_item_call label="顯示 TOS" name="TOS"/> + <menu_item_call label="顯示嚴é‡è¨Šæ¯" name="Critical"/> + <menu_item_call label="媒體ç€è¦½å™¨æ¸¬è©¦" name="Web Browser Test"/> + <menu_item_call label="網é 內容浮動視窗測試" name="Web Content Floater Test"/> + <menu_item_check label="é¡¯ç¤ºç¶²æ ¼æŒ‘é¸å™¨" name="Show Grid Picker"/> + <menu_item_call label="顯示通知控制å°" name="Show Notifications Console"/> </menu> </menu_bar> diff --git a/indra/newview/skins/default/xui/zh/menu_nearby_chat.xml b/indra/newview/skins/default/xui/zh/menu_nearby_chat.xml index 7d8997fafe37bee4edb00dc8457f94936c14a99d..cad462eebbbb6418ed64e1a37c2db77f951552aa 100644 --- a/indra/newview/skins/default/xui/zh/menu_nearby_chat.xml +++ b/indra/newview/skins/default/xui/zh/menu_nearby_chat.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <menu name="NearBy Chat Menu"> - <menu_item_call label="Show Nearby People..." name="nearby_people"/> + <menu_item_call label="顯示附近的人..." name="nearby_people"/> <menu_item_check label="Show Blocked Text" name="muted_text"/> <menu_item_check label="Show Buddy Icons" name="show_buddy_icons"/> <menu_item_check label="Show Names" name="show_names"/> diff --git a/indra/newview/skins/default/xui/zh/menu_object.xml b/indra/newview/skins/default/xui/zh/menu_object.xml index 869c5f66fe5640669a27df88eacbad1279c78327..ed41a4f0bf02d5aeec87235f71f3e25b540e3150 100644 --- a/indra/newview/skins/default/xui/zh/menu_object.xml +++ b/indra/newview/skins/default/xui/zh/menu_object.xml @@ -1,27 +1,27 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Object Pie"> - <menu_item_call label="Touch" name="Object Touch"/> + <menu_item_call label="觸碰" name="Object Touch"/> <menu_item_call label="編輯" name="Edit..."/> - <menu_item_call label="Build" name="Build"/> - <menu_item_call label="Open" name="Open"/> - <menu_item_call label="Sit Here" name="Object Sit"/> + <menu_item_call label="å»ºé€ " name="Build"/> + <menu_item_call label="é–‹å•Ÿ" name="Open"/> + <menu_item_call label="å下" name="Object Sit"/> <menu_item_call label="èµ·ç«‹" name="Object Stand Up"/> <menu_item_call label="物件檔案" name="Object Inspect"/> <menu_item_call label="Zoom In" name="Zoom In"/> - <context_menu label="Put On" name="Put On"> - <menu_item_call label="Wear" name="Wear"/> - <menu_item_call label="Add" name="Add"/> + <context_menu label="穿上" name="Put On"> + <menu_item_call label="穿上" name="Wear"/> + <menu_item_call label="æ·»åŠ " name="Add"/> <context_menu label="Attach" name="Object Attach"/> <context_menu label="Attach HUD" name="Object Attach HUD"/> </context_menu> - <context_menu label="Manage" name="Remove"> + <context_menu label="管ç†" name="Remove"> <menu_item_call label="èˆ‰å ±æ¿«ç”¨" name="Report Abuse..."/> - <menu_item_call label="Block" name="Object Mute"/> - <menu_item_call label="Return" name="Return..."/> + <menu_item_call label="å°éŽ–" name="Object Mute"/> + <menu_item_call label="退回" name="Return..."/> </context_menu> - <menu_item_call label="Take" name="Pie Object Take"/> + <menu_item_call label="å–å¾—" name="Pie Object Take"/> <menu_item_call label="å–得副本" name="Take Copy"/> - <menu_item_call label="Pay" name="Pay..."/> + <menu_item_call label="支付" name="Pay..."/> <menu_item_call label="購買" name="Buy..."/> <menu_item_call label="刪除" name="Delete"/> </context_menu> diff --git a/indra/newview/skins/default/xui/zh/menu_outfit_gear.xml b/indra/newview/skins/default/xui/zh/menu_outfit_gear.xml index 169dbf2187fa4df744833e7d82f0aef42c7ad570..cf47020bd98d5e02017854df618d3f5d539d7a23 100644 --- a/indra/newview/skins/default/xui/zh/menu_outfit_gear.xml +++ b/indra/newview/skins/default/xui/zh/menu_outfit_gear.xml @@ -18,10 +18,10 @@ <menu_item_call label="新刺é’" name="New Tattoo"/> </menu> <menu label="新身體部ä½" name="New Body Parts"> - <menu_item_call label="New Shape" name="New Shape"/> - <menu_item_call label="New Skin" name="New Skin"/> - <menu_item_call label="New Hair" name="New Hair"/> - <menu_item_call label="New Eyes" name="New Eyes"/> + <menu_item_call label="新體形" name="New Shape"/> + <menu_item_call label="新皮膚" name="New Skin"/> + <menu_item_call label="æ–°é é«®" name="New Hair"/> + <menu_item_call label="新眼ç›" name="New Eyes"/> </menu> <menu_item_call label="è£æ‰®æ›´å" name="rename"/> <menu_item_call label="刪除è£æ‰®" name="delete_outfit"/> diff --git a/indra/newview/skins/default/xui/zh/menu_participant_list.xml b/indra/newview/skins/default/xui/zh/menu_participant_list.xml index 7b6f6f954e45c43d16d579bb835854103055b302..3737e3d041f4afbec6128a776d0561a29c817f45 100644 --- a/indra/newview/skins/default/xui/zh/menu_participant_list.xml +++ b/indra/newview/skins/default/xui/zh/menu_participant_list.xml @@ -7,7 +7,7 @@ <menu_item_call label="IM" name="IM"/> <menu_item_call label="通話" name="Call"/> <menu_item_call label="分享" name="Share"/> - <menu_item_call label="Pay" name="Pay"/> + <menu_item_call label="支付" name="Pay"/> <menu_item_check label="View People Icons" name="View Icons"/> <menu_item_check label="Block Voice" name="Block/Unblock"/> <menu_item_check label="Block Text" name="MuteText"/> diff --git a/indra/newview/skins/default/xui/zh/menu_people_groups_view_sort.xml b/indra/newview/skins/default/xui/zh/menu_people_groups_view_sort.xml index 06247ab2495585db028365a4ee5e002fda5be4c2..cf36507d743e7db64c1ca042008f253890fc2f7b 100644 --- a/indra/newview/skins/default/xui/zh/menu_people_groups_view_sort.xml +++ b/indra/newview/skins/default/xui/zh/menu_people_groups_view_sort.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <toggleable_menu name="menu_group_plus"> - <menu_item_check label="Display Group Icons" name="Display Group Icons"/> + <menu_item_check label="顯示社團圖示" name="Display Group Icons"/> <menu_item_call label="脫離所é¸æ“‡çš„社團" name="Leave Selected Group"/> </toggleable_menu> diff --git a/indra/newview/skins/default/xui/zh/menu_people_nearby.xml b/indra/newview/skins/default/xui/zh/menu_people_nearby.xml index 73b754e0594c52ae94a9221e28ca8db3b54a2052..49fa775424537810bb2b48c88e6dab0114c43291 100644 --- a/indra/newview/skins/default/xui/zh/menu_people_nearby.xml +++ b/indra/newview/skins/default/xui/zh/menu_people_nearby.xml @@ -7,7 +7,7 @@ <menu_item_call label="通話" name="Call"/> <menu_item_call label="地圖" name="Map"/> <menu_item_call label="分享" name="Share"/> - <menu_item_call label="Pay" name="Pay"/> + <menu_item_call label="支付" name="Pay"/> <menu_item_check label="Block/Unblock" name="Block/Unblock"/> <menu_item_call label="Offer Teleport" name="teleport"/> </context_menu> diff --git a/indra/newview/skins/default/xui/zh/menu_people_nearby_multiselect.xml b/indra/newview/skins/default/xui/zh/menu_people_nearby_multiselect.xml index 4ffbcaff83cc718864029946fae26091a51155e7..c7aff48df466bc5c8668781c397d691d78adc95f 100644 --- a/indra/newview/skins/default/xui/zh/menu_people_nearby_multiselect.xml +++ b/indra/newview/skins/default/xui/zh/menu_people_nearby_multiselect.xml @@ -5,6 +5,6 @@ <menu_item_call label="IM" name="IM"/> <menu_item_call label="通話" name="Call"/> <menu_item_call label="分享" name="Share"/> - <menu_item_call label="Pay" name="Pay"/> + <menu_item_call label="支付" name="Pay"/> <menu_item_call label="Offer Teleport" name="teleport"/> </context_menu> diff --git a/indra/newview/skins/default/xui/zh/menu_picks_plus.xml b/indra/newview/skins/default/xui/zh/menu_picks_plus.xml index 9e55c633f956bf5045f9e03ef39e855a0213282f..e962bd90d578542590583babb352cdcc319ee047 100644 --- a/indra/newview/skins/default/xui/zh/menu_picks_plus.xml +++ b/indra/newview/skins/default/xui/zh/menu_picks_plus.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <toggleable_menu name="picks_plus_menu"> - <menu_item_call label="New Pick" name="create_pick"/> + <menu_item_call label="æ–°ç²¾é¸åœ°é»ž" name="create_pick"/> <menu_item_call label="New Classified" name="create_classified"/> </toggleable_menu> diff --git a/indra/newview/skins/default/xui/zh/menu_place.xml b/indra/newview/skins/default/xui/zh/menu_place.xml index 6ffdf329df6b973cebfaba2ae4c4ff4caa7bd4fa..3733baf119155c529837605a3f96684c6b7b75c7 100644 --- a/indra/newview/skins/default/xui/zh/menu_place.xml +++ b/indra/newview/skins/default/xui/zh/menu_place.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <toggleable_menu name="place_overflow_menu"> <menu_item_call label="製作一個地標" name="landmark"/> - <menu_item_call label="Create Pick" name="pick"/> + <menu_item_call label="建立精é¸åœ°é»ž" name="pick"/> </toggleable_menu> diff --git a/indra/newview/skins/default/xui/zh/menu_places_gear_folder.xml b/indra/newview/skins/default/xui/zh/menu_places_gear_folder.xml index 7f1d091f440c7381428731c2ed76bd7b4c953233..7f4144d14d9a6220862871192e110e52ade4c213 100644 --- a/indra/newview/skins/default/xui/zh/menu_places_gear_folder.xml +++ b/indra/newview/skins/default/xui/zh/menu_places_gear_folder.xml @@ -2,7 +2,7 @@ <toggleable_menu name="menu_folder_gear"> <menu_item_call label="æ·»åŠ åœ°æ¨™" name="add_landmark"/> <menu_item_call label="æ·»åŠ è³‡æ–™å¤¾" name="add_folder"/> - <menu_item_call label="Restore Item" name="restore_item"/> + <menu_item_call label="還原物å“" name="restore_item"/> <menu_item_call label="剪下" name="cut"/> <menu_item_call label="覆製" name="copy_folder"/> <menu_item_call label="貼上" name="paste"/> diff --git a/indra/newview/skins/default/xui/zh/menu_places_gear_landmark.xml b/indra/newview/skins/default/xui/zh/menu_places_gear_landmark.xml index 8578751a28c59d8ead702855243987a20b04ff43..f23d970b78a8915df1a1a46fd6fe1d024d6009ba 100644 --- a/indra/newview/skins/default/xui/zh/menu_places_gear_landmark.xml +++ b/indra/newview/skins/default/xui/zh/menu_places_gear_landmark.xml @@ -15,5 +15,5 @@ <menu_item_call label="展開全部資料夾" name="expand_all"/> <menu_item_call label="摺疊全部資料夾" name="collapse_all"/> <menu_item_check label="ä¾æ—¥æœŸæŽ’åº" name="sort_by_date"/> - <menu_item_call label="Create Pick" name="create_pick"/> + <menu_item_call label="建立精é¸åœ°é»ž" name="create_pick"/> </toggleable_menu> diff --git a/indra/newview/skins/default/xui/zh/menu_profile_overflow.xml b/indra/newview/skins/default/xui/zh/menu_profile_overflow.xml index 2c5e3153bf8195cb8b015249cc56c9736250cfb3..ca637ae54daf1ae4e74df3963e9062457ebf4844 100644 --- a/indra/newview/skins/default/xui/zh/menu_profile_overflow.xml +++ b/indra/newview/skins/default/xui/zh/menu_profile_overflow.xml @@ -1,12 +1,12 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <toggleable_menu name="profile_overflow_menu"> <menu_item_call label="地圖" name="show_on_map"/> - <menu_item_call label="Pay" name="pay"/> + <menu_item_call label="支付" name="pay"/> <menu_item_call label="分享" name="share"/> <menu_item_call label="Block" name="block"/> <menu_item_call label="Unblock" name="unblock"/> - <menu_item_call label="踢除" name="kick"/> - <menu_item_call label="Freeze" name="freeze"/> - <menu_item_call label="Unfreeze" name="unfreeze"/> + <menu_item_call label="踢出" name="kick"/> + <menu_item_call label="å‡çµ" name="freeze"/> + <menu_item_call label="解å‡" name="unfreeze"/> <menu_item_call label="CSR" name="csr"/> </toggleable_menu> diff --git a/indra/newview/skins/default/xui/zh/menu_teleport_history_tab.xml b/indra/newview/skins/default/xui/zh/menu_teleport_history_tab.xml index 423ba64aa77d156387e970dd557f4e5e1d8bbd66..f9107a96ed433806475a0def27fa8b3d92eb8dff 100644 --- a/indra/newview/skins/default/xui/zh/menu_teleport_history_tab.xml +++ b/indra/newview/skins/default/xui/zh/menu_teleport_history_tab.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Teleport History Item Context Menu"> - <menu_item_call label="Open" name="TabOpen"/> + <menu_item_call label="é–‹å•Ÿ" name="TabOpen"/> <menu_item_call label="關閉" name="TabClose"/> </context_menu> diff --git a/indra/newview/skins/default/xui/zh/menu_url_agent.xml b/indra/newview/skins/default/xui/zh/menu_url_agent.xml index 3b667d429c7c6c881e9ff8247e3fd816e269f8c8..592bb6561e9f4bab2a98eaf05bec691be7d6049d 100644 --- a/indra/newview/skins/default/xui/zh/menu_url_agent.xml +++ b/indra/newview/skins/default/xui/zh/menu_url_agent.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Url Popup"> - <menu_item_call label="Show Resident Profile" name="show_agent"/> + <menu_item_call label="顯示居民檔案" name="show_agent"/> <menu_item_call label="覆製å稱到剪貼簿" name="url_copy_label"/> <menu_item_call label="覆製 SLurl 到剪貼簿" name="url_copy"/> </context_menu> diff --git a/indra/newview/skins/default/xui/zh/menu_url_objectim.xml b/indra/newview/skins/default/xui/zh/menu_url_objectim.xml index d2f0b81a9d5ca95e37f56bd1c971c8a1f7098c50..b344b21c62f56dd0886a5227e95169d4250ea6c1 100644 --- a/indra/newview/skins/default/xui/zh/menu_url_objectim.xml +++ b/indra/newview/skins/default/xui/zh/menu_url_objectim.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Url Popup"> - <menu_item_call label="Show Object Information" name="show_object"/> + <menu_item_call label="顯示物件資訊" name="show_object"/> <menu_item_call label="顯示在地圖上" name="show_on_map"/> <menu_item_call label="瞬間傳é€åˆ°ç‰©ä»¶ä½ç½®" name="teleport_to_object"/> <menu_item_call label="覆製物件å稱到剪貼簿" name="url_copy_label"/> diff --git a/indra/newview/skins/default/xui/zh/menu_viewer.xml b/indra/newview/skins/default/xui/zh/menu_viewer.xml index 6f6ca064c803f8aa58863e4948c5e104c2043b52..6d70ac4c1f272ec9191d7a48dabf127f39d384ca 100644 --- a/indra/newview/skins/default/xui/zh/menu_viewer.xml +++ b/indra/newview/skins/default/xui/zh/menu_viewer.xml @@ -22,7 +22,7 @@ </menu> <menu_item_call label="è¦æ±‚ Admin 狀態" name="Request Admin Options"/> <menu_item_call label="離開 Admin 狀態" name="Leave Admin Options"/> - <menu_item_call label="çµæŸé›¢é–‹ [APP_NAME]" name="Quit"/> + <menu_item_call label="çµæŸé€€å‡º [APP_NAME]" name="Quit"/> </menu> <menu label="æºé€š" name="Communicate"> <menu_item_call label="我的朋å‹" name="My Friends"/> @@ -54,7 +54,7 @@ <menu_item_check label="地段屬性" name="Parcel Properties"/> <menu_item_check label="進階é¸å–®" name="Show Advanced Menu"/> </menu> - <menu_item_call label="瞬間傳é€å›žå®¶" name="Teleport Home"/> + <menu_item_call label="瞬間瞬間傳é€å›žå®¶" name="Teleport Home"/> <menu_item_call label="è¨å®šå®¶åœ¨æ¤è™•" name="Set Home to Here"/> <menu label="太陽" name="Environment Settings"> <menu_item_call label="日出" name="Sunrise"/> @@ -75,7 +75,7 @@ <menu_item_call label="土地工具" name="Land"/> </menu> <menu_item_call label="è¯çµ" name="Link"/> - <menu_item_call label="å–銷è¯çµ" name="Unlink"/> + <menu_item_call label="å–消è¯çµ" name="Unlink"/> <menu_item_check label="編輯è¯çµéƒ¨ä½" name="Edit Linked Parts"/> <menu label="é¸æ“‡è¯çµéƒ¨ä½" name="Select Linked Parts"> <menu_item_call label="é¸æ“‡ä¸‹ä¸€éƒ¨ä½" name="Select Next Part"/> @@ -84,21 +84,21 @@ <menu_item_call label="包括上一部ä½" name="Include Previous Part"/> </menu> <menu_item_call label="èšç„¦æ–¼æ‰€é¸éƒ¨ä½" name="Focus on Selection"/> - <menu_item_call label="Zoom to Selection" name="Zoom to Selection"/> + <menu_item_call label="縮放至所é¸éƒ¨ä½" name="Zoom to Selection"/> <menu label="物件" name="Object"> <menu_item_call label="購買" name="Menu Object Buy"/> <menu_item_call label="å–å¾—" name="Menu Object Take"/> <menu_item_call label="å–得副本" name="Take Copy"/> <menu_item_call label="回å˜åˆ°æˆ‘的收ç´å€" name="Save Object Back to My Inventory"/> - <menu_item_call label="Save Back to Object Contents" name="Save Object Back to Object Contents"/> + <menu_item_call label="回å˜åˆ°ç‰©ä»¶å…§å®¹" name="Save Object Back to Object Contents"/> <menu_item_call label="退回物件" name="Return Object back to Owner"/> </menu> - <menu label="Scripts" name="Scripts"> - <menu_item_call label="Recompile Scripts (Mono)" name="Mono"/> - <menu_item_call label="Recompile Scripts (LSL)" name="LSL"/> + <menu label="腳本" name="Scripts"> + <menu_item_call label="é‡æ–°ç·¨è¯è…³æœ¬ï¼ˆMono)" name="Mono"/> + <menu_item_call label="é‡æ–°ç·¨è¯è…³æœ¬ï¼ˆLSL)" name="LSL"/> <menu_item_call label="Reset Scripts" name="Reset Scripts"/> - <menu_item_call label="Set Scripts to Running" name="Set Scripts to Running"/> - <menu_item_call label="Set Scripts to Not Running" name="Set Scripts to Not Running"/> + <menu_item_call label="è¨å®šè…³æœ¬ç‚ºåŸ·è¡Œä¸" name="Set Scripts to Running"/> + <menu_item_call label="è¨å®šè…³æœ¬ç‚ºéžåŸ·è¡Œä¸" name="Set Scripts to Not Running"/> </menu> <menu label="é¸é …" name="Options"> <menu_item_check label="顯示進階權é™" name="DebugPermissions"/> @@ -110,16 +110,16 @@ <menu_item_check label="Show Light Radius for Selection" name="Show Light Radius for Selection"/> <menu_item_check label="Show Selection Beam" name="Show Selection Beam"/> <menu_item_check label="è²¼é½Šæ ¼ç·š" name="Snap to Grid"/> - <menu_item_call label="Snap Object XY to Grid" name="Snap Object XY to Grid"/> + <menu_item_call label="貼齊物件 XY è»¸åˆ°æ ¼ç·š" name="Snap Object XY to Grid"/> <menu_item_call label="Use Selection for Grid" name="Use Selection for Grid"/> <menu_item_call label="æ ¼ç·šé¸é …" name="Grid Options"/> </menu> <menu label="上傳" name="Upload"> - <menu_item_call label="Image (L$[COST])..." name="Upload Image"/> - <menu_item_call label="Sound (L$[COST])..." name="Upload Sound"/> - <menu_item_call label="Animation (L$[COST])..." name="Upload Animation"/> - <menu_item_call label="Bulk (L$[COST] per file)..." name="Bulk Upload"/> - <menu_item_call label="Set Default Upload Permissions" name="perm prefs"/> + <menu_item_call label="圖åƒï¼ˆL$[COST])..." name="Upload Image"/> + <menu_item_call label="è²éŸ³ï¼ˆL$[COST])..." name="Upload Sound"/> + <menu_item_call label="動作(L$[COST])..." name="Upload Animation"/> + <menu_item_call label="大é‡ä¸Šå‚³ï¼ˆæ¯æª”案 L$[COST] )..." name="Bulk Upload"/> + <menu_item_call label="è¨å®šé è¨ä¸Šå‚³æ¬Šé™" name="perm prefs"/> </menu> <menu_item_call label="復原" name="Undo"/> <menu_item_call label="é‡åš" name="Redo"/> @@ -135,22 +135,22 @@ <menu_item_call label="Rebake Textures" name="Rebake Texture"/> <menu_item_call label="è¨å®šä½¿ç”¨è€…ç•Œé¢å¤§å°è‡³é è¨å€¼" name="Set UI Size to Default"/> <menu_item_call label="è¨å®šè¦–窗尺寸大å°..." name="Set Window Size..."/> - <menu_item_check label="Limit Select Distance" name="Limit Select Distance"/> + <menu_item_check label="é™åˆ¶é¸æ“‡è·é›¢" name="Limit Select Distance"/> <menu_item_check label="Disable Camera Constraints" name="Disable Camera Distance"/> - <menu_item_check label="High-res Snapshot" name="HighResSnapshot"/> - <menu_item_check label="Quiet Snapshots to Disk" name="QuietSnapshotsToDisk"/> - <menu_item_check label="Compress Snapshots to Disk" name="CompressSnapshotsToDisk"/> - <menu label="Performance Tools" name="Performance Tools"> + <menu_item_check label="高解æžåº¦å¿«ç…§" name="HighResSnapshot"/> + <menu_item_check label="éœéŸ³æ‹æ”快照到硬碟" name="QuietSnapshotsToDisk"/> + <menu_item_check label="壓縮快照å˜åˆ°ç¡¬ç¢Ÿ" name="CompressSnapshotsToDisk"/> + <menu label="效能工具" name="Performance Tools"> <menu_item_call label="Lag Meter" name="Lag Meter"/> - <menu_item_check label="Statistics Bar" name="Statistics Bar"/> + <menu_item_check label="統計列" name="Statistics Bar"/> <menu_item_check label="Show Avatar Rendering Cost" name="Avatar Rendering Cost"/> </menu> <menu label="Highlighting and Visibility" name="Highlighting and Visibility"> <menu_item_check label="Cheesy Beacon" name="Cheesy Beacon"/> <menu_item_check label="Hide Particles" name="Hide Particles"/> <menu_item_check label="Hide Selected" name="Hide Selected"/> - <menu_item_check label="Highlight Transparent" name="Highlight Transparent"/> - <menu_item_check label="Show HUD Attachments" name="Show HUD Attachments"/> + <menu_item_check label="高亮顯示é€æ˜Žç‰©ä»¶" name="Highlight Transparent"/> + <menu_item_check label="顯示 HUD 附件" name="Show HUD Attachments"/> <menu_item_check label="Show Mouselook Crosshairs" name="ShowCrosshairs"/> </menu> <menu label="Rendering Types" name="Rendering Types"> @@ -181,16 +181,16 @@ <menu_item_check label="Use Plugin Read Thread" name="Use Plugin Read Thread"/> <menu_item_call label="Clear Group Cache" name="ClearGroupCache"/> <menu_item_check label="Mouse Smoothing" name="Mouse Smoothing"/> - <menu label="Shortcuts" name="Shortcuts"> - <menu_item_call label="Image (L$[COST])..." name="Upload Image"/> - <menu_item_check label="Search" name="Search"/> - <menu_item_call label="Release Keys" name="Release Keys"/> + <menu label="快速éµ" name="Shortcuts"> + <menu_item_call label="圖åƒï¼ˆL$[COST])..." name="Upload Image"/> + <menu_item_check label="æœå°‹" name="Search"/> + <menu_item_call label="釋出按éµ" name="Release Keys"/> <menu_item_call label="è¨å®šä½¿ç”¨è€…ç•Œé¢å¤§å°è‡³é è¨å€¼" name="Set UI Size to Default"/> <menu_item_check label="Show Advanced Menu - legacy shortcut" name="Show Advanced Menu - legacy shortcut"/> <menu_item_call label="關閉視窗" name="Close Window"/> <menu_item_call label="關閉全部視窗" name="Close All Windows"/> <menu_item_call label="Snapshot to Disk" name="Snapshot to Disk"/> - <menu_item_call label="Mouselook" name="Mouselook"/> + <menu_item_call label="第一人稱視角" name="Mouselook"/> <menu_item_check label="Joystick Flycam" name="Joystick Flycam"/> <menu_item_call label="Reset View" name="Reset View"/> <menu_item_call label="Look at Last Chatter" name="Look at Last Chatter"/> @@ -209,10 +209,10 @@ <menu_item_check label="顯示開發é¸å–®" name="Debug Mode"/> </menu> <menu label="開發" name="Develop"> - <menu label="Consoles" name="Consoles"> + <menu label="控制å°" name="Consoles"> <menu_item_check label="æ質控制å°" name="Texture Console"/> - <menu_item_check label="Debug Console" name="Debug Console"/> - <menu_item_call label="Notifications Console" name="Notifications"/> + <menu_item_check label="除錯控制å°" name="Debug Console"/> + <menu_item_call label="通知控制å°" name="Notifications"/> <menu_item_check label="æ質尺寸控制å°" name="Texture Size"/> <menu_item_check label="Texture Category Console" name="Texture Category"/> <menu_item_check label="Fast Timers" name="Fast Timers"/> @@ -226,7 +226,7 @@ <menu_item_check label="Badge" name="Badge"/> </menu> <menu label="顯示資訊" name="Display Info"> - <menu_item_check label="Show Time" name="Show Time"/> + <menu_item_check label="顯示時間" name="Show Time"/> <menu_item_check label="Show Render Info" name="Show Render Info"/> <menu_item_check label="顯示æ質資訊" name="Show Texture Info"/> <menu_item_check label="Show Matrices" name="Show Matrices"/> @@ -338,10 +338,10 @@ <menu_item_call label="é€å‡ºæ¸¬è©¦ IMs" name="Send Test IMs"/> <menu_item_call label="Flush Names Caches" name="Flush Names Caches"/> </menu> - <menu label="Avatar" name="Character"> + <menu label="化身" name="Character"> <menu label="Grab Baked Texture" name="Grab Baked Texture"> <menu_item_call label="Iris" name="Iris"/> - <menu_item_call label="Head" name="Head"/> + <menu_item_call label="é 部" name="Head"/> <menu_item_call label="Upper Body" name="Upper Body"/> <menu_item_call label="Lower Body" name="Lower Body"/> <menu_item_call label="裙å" name="Skirt"/> @@ -355,10 +355,10 @@ <menu_item_check label="Allow Select Avatar" name="Allow Select Avatar"/> </menu> <menu_item_call label="Force Params to Default" name="Force Params to Default"/> - <menu_item_check label="Animation Info" name="Animation Info"/> - <menu_item_check label="Slow Motion Animations" name="Slow Motion Animations"/> - <menu_item_check label="Show Look At" name="Show Look At"/> - <menu_item_check label="Show Point At" name="Show Point At"/> + <menu_item_check label="動作資訊" name="Animation Info"/> + <menu_item_check label="慢動作" name="Slow Motion Animations"/> + <menu_item_check label="顯示注視在" name="Show Look At"/> + <menu_item_check label="顯示指å‘在" name="Show Point At"/> <menu_item_check label="Debug Joint Updates" name="Debug Joint Updates"/> <menu_item_check label="Disable LOD" name="Disable LOD"/> <menu_item_check label="Debug Character Vis" name="Debug Character Vis"/> diff --git a/indra/newview/skins/default/xui/zh/mime_types.xml b/indra/newview/skins/default/xui/zh/mime_types.xml index ecc14867b85cc942f4476520a5887db44f55ba17..3498942f9b89ec6e615ecd66ff4e7980df020244 100644 --- a/indra/newview/skins/default/xui/zh/mime_types.xml +++ b/indra/newview/skins/default/xui/zh/mime_types.xml @@ -24,7 +24,7 @@ </widgetset> <widgetset name="image"> <label name="image_label"> - Image + åœ–åƒ </label> <tooltip name="image_tooltip"> There is an image at this location @@ -71,7 +71,7 @@ </mimetype> <mimetype name="image/*"> <label name="image2_label"> - Image + åœ–åƒ </label> </mimetype> <mimetype name="video/vnd.secondlife.qt.legacy"> @@ -91,12 +91,12 @@ </mimetype> <mimetype name="application/pdf"> <label name="application/pdf_label"> - PDF Document + PDF 文件 </label> </mimetype> <mimetype name="application/postscript"> <label name="application/postscript_label"> - Postscript Document + Postscript 文件 </label> </mimetype> <mimetype name="application/rtf"> @@ -141,32 +141,32 @@ </mimetype> <mimetype name="image/bmp"> <label name="image/bmp_label"> - Image (BMP) + 圖åƒï¼ˆBMP) </label> </mimetype> <mimetype name="image/gif"> <label name="image/gif_label"> - Image (GIF) + 圖åƒï¼ˆGIF) </label> </mimetype> <mimetype name="image/jpeg"> <label name="image/jpeg_label"> - Image (JPEG) + 圖åƒï¼ˆJPEG) </label> </mimetype> <mimetype name="image/png"> <label name="image/png_label"> - Image (PNG) + 圖åƒï¼ˆPNG) </label> </mimetype> <mimetype name="image/svg+xml"> <label name="image/svg+xml_label"> - Image (SVG) + 圖åƒï¼ˆSVG) </label> </mimetype> <mimetype name="image/tiff"> <label name="image/tiff_label"> - Image (TIFF) + 圖åƒï¼ˆTIFF) </label> </mimetype> <mimetype name="text/html"> @@ -176,7 +176,7 @@ </mimetype> <mimetype name="text/plain"> <label name="text/plain_label"> - Text + æ–‡å— </label> </mimetype> <mimetype name="text/xml"> diff --git a/indra/newview/skins/default/xui/zh/mime_types_linux.xml b/indra/newview/skins/default/xui/zh/mime_types_linux.xml index ecc14867b85cc942f4476520a5887db44f55ba17..3498942f9b89ec6e615ecd66ff4e7980df020244 100644 --- a/indra/newview/skins/default/xui/zh/mime_types_linux.xml +++ b/indra/newview/skins/default/xui/zh/mime_types_linux.xml @@ -24,7 +24,7 @@ </widgetset> <widgetset name="image"> <label name="image_label"> - Image + åœ–åƒ </label> <tooltip name="image_tooltip"> There is an image at this location @@ -71,7 +71,7 @@ </mimetype> <mimetype name="image/*"> <label name="image2_label"> - Image + åœ–åƒ </label> </mimetype> <mimetype name="video/vnd.secondlife.qt.legacy"> @@ -91,12 +91,12 @@ </mimetype> <mimetype name="application/pdf"> <label name="application/pdf_label"> - PDF Document + PDF 文件 </label> </mimetype> <mimetype name="application/postscript"> <label name="application/postscript_label"> - Postscript Document + Postscript 文件 </label> </mimetype> <mimetype name="application/rtf"> @@ -141,32 +141,32 @@ </mimetype> <mimetype name="image/bmp"> <label name="image/bmp_label"> - Image (BMP) + 圖åƒï¼ˆBMP) </label> </mimetype> <mimetype name="image/gif"> <label name="image/gif_label"> - Image (GIF) + 圖åƒï¼ˆGIF) </label> </mimetype> <mimetype name="image/jpeg"> <label name="image/jpeg_label"> - Image (JPEG) + 圖åƒï¼ˆJPEG) </label> </mimetype> <mimetype name="image/png"> <label name="image/png_label"> - Image (PNG) + 圖åƒï¼ˆPNG) </label> </mimetype> <mimetype name="image/svg+xml"> <label name="image/svg+xml_label"> - Image (SVG) + 圖åƒï¼ˆSVG) </label> </mimetype> <mimetype name="image/tiff"> <label name="image/tiff_label"> - Image (TIFF) + 圖åƒï¼ˆTIFF) </label> </mimetype> <mimetype name="text/html"> @@ -176,7 +176,7 @@ </mimetype> <mimetype name="text/plain"> <label name="text/plain_label"> - Text + æ–‡å— </label> </mimetype> <mimetype name="text/xml"> diff --git a/indra/newview/skins/default/xui/zh/mime_types_mac.xml b/indra/newview/skins/default/xui/zh/mime_types_mac.xml index 51f242a1c2c1201bf9b36893eed52292988887a2..3f38c528a6b9316e065a8cac2fe1b2f288187238 100644 --- a/indra/newview/skins/default/xui/zh/mime_types_mac.xml +++ b/indra/newview/skins/default/xui/zh/mime_types_mac.xml @@ -24,7 +24,7 @@ </widgetset> <widgetset name="image"> <label name="image_label"> - Image + åœ–åƒ </label> <tooltip name="image_tooltip"> There is an image at this location @@ -71,7 +71,7 @@ </mimetype> <mimetype name="image/*"> <label name="image2_label"> - Image + åœ–åƒ </label> </mimetype> <mimetype name="video/vnd.secondlife.qt.legacy"> @@ -91,12 +91,12 @@ </mimetype> <mimetype name="application/pdf"> <label name="application/pdf_label"> - PDF Document + PDF 文件 </label> </mimetype> <mimetype name="application/postscript"> <label name="application/postscript_label"> - Postscript Document + Postscript 文件 </label> </mimetype> <mimetype name="application/rtf"> @@ -141,32 +141,32 @@ </mimetype> <mimetype name="image/bmp"> <label name="image/bmp_label"> - Image (BMP) + 圖åƒï¼ˆBMP) </label> </mimetype> <mimetype name="image/gif"> <label name="image/gif_label"> - Image (GIF) + 圖åƒï¼ˆGIF) </label> </mimetype> <mimetype name="image/jpeg"> <label name="image/jpeg_label"> - Image (JPEG) + 圖åƒï¼ˆJPEG) </label> </mimetype> <mimetype name="image/png"> <label name="image/png_label"> - Image (PNG) + 圖åƒï¼ˆPNG) </label> </mimetype> <mimetype name="image/svg+xml"> <label name="image/svg+xml_label"> - Image (SVG) + 圖åƒï¼ˆSVG) </label> </mimetype> <mimetype name="image/tiff"> <label name="image/tiff_label"> - Image (TIFF) + 圖åƒï¼ˆTIFF) </label> </mimetype> <mimetype name="text/html"> diff --git a/indra/newview/skins/default/xui/zh/notifications.xml b/indra/newview/skins/default/xui/zh/notifications.xml index 7652c1a1d02a05211c96050a09414aff3fd723cc..65bb8ce517106882856d8f359e7fdd06ae97d5ef 100644 --- a/indra/newview/skins/default/xui/zh/notifications.xml +++ b/indra/newview/skins/default/xui/zh/notifications.xml @@ -65,7 +65,7 @@ Error details: The notification called '[_NAME]' was not found in noti </notification> <notification name="GenericAlertYesCancel"> [MESSAGE] - <usetemplate name="okcancelbuttons" notext="å–銷" yestext="是"/> + <usetemplate name="okcancelbuttons" notext="å–消" yestext="是"/> </notification> <notification name="BadInstallation"> An error occurred while updating [APP_NAME]. Please [http://get.secondlife.com download the latest version] of the Viewer. @@ -83,7 +83,7 @@ Make sure your Internet connection is working properly. </notification> <notification name="WearableSave"> Save changes to current clothing/body part? - <usetemplate canceltext="å–銷" name="yesnocancelbuttons" notext="ä¸è¦å„²å˜" yestext="儲å˜"/> + <usetemplate canceltext="å–消" name="yesnocancelbuttons" notext="ä¸è¦å„²å˜" yestext="儲å˜"/> </notification> <notification name="CompileQueueSaveText"> There was a problem uploading the text for a script due to the following reason: [REASON]. Please try again later. @@ -103,7 +103,7 @@ Please select only one object and try again. </notification> <notification name="SaveClothingBodyChanges"> 儲å˜å…¨éƒ¨æœè£æˆ–身體部ä½çš„變更? - <usetemplate canceltext="å–銷" name="yesnocancelbuttons" notext="ä¸è¦å„²å˜" yestext="全部儲å˜"/> + <usetemplate canceltext="å–消" name="yesnocancelbuttons" notext="ä¸è¦å„²å˜" yestext="全部儲å˜"/> </notification> <notification name="FriendsAndGroupsOnly"> Non-friends won't know that you've choosen to ignore their calls and instant messages. @@ -139,7 +139,7 @@ Do you want to grant modify rights for the selected Residents? <notification name="PanelGroupApply"> [NEEDS_APPLY_MESSAGE] [WANT_APPLY_MESSAGE] - <usetemplate canceltext="å–銷" name="yesnocancelbuttons" notext="忽視變更" yestext="套用變更"/> + <usetemplate canceltext="å–消" name="yesnocancelbuttons" notext="忽視變更" yestext="套用變更"/> </notification> <notification name="MustSpecifyGroupNoticeSubject"> You must specify a subject to send a group notice. @@ -178,12 +178,12 @@ Add this Ability to '[ROLE_NAME]'? <notification name="JoinGroupCanAfford"> Joining this group costs L$[COST]. Do you wish to proceed? - <usetemplate name="okcancelbuttons" notext="å–銷" yestext="Join"/> + <usetemplate name="okcancelbuttons" notext="å–消" yestext="Join"/> </notification> <notification name="JoinGroupNoCost"> You are joining group [NAME]. Do you wish to proceed? - <usetemplate name="okcancelbuttons" notext="å–銷" yestext="Join"/> + <usetemplate name="okcancelbuttons" notext="å–消" yestext="Join"/> </notification> <notification name="JoinGroupCannotAfford"> Joining this group costs L$[COST]. @@ -193,11 +193,11 @@ You do not have enough L$ to join this group. Creating this group will cost L$100. Groups need more than one member, or they are deleted forever. Please invite members within 48 hours. - <usetemplate canceltext="å–銷" name="okcancelbuttons" notext="å–銷" yestext="Create group for L$100"/> + <usetemplate canceltext="å–消" name="okcancelbuttons" notext="å–消" yestext="Create group for L$100"/> </notification> <notification name="LandBuyPass"> For L$[COST] you can enter this land ('[PARCEL_NAME]') for [TIME] hours. Buy a pass? - <usetemplate name="okcancelbuttons" notext="å–銷" yestext="確定"/> + <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/> </notification> <notification name="SalePriceRestriction"> Sale price must be set to more than L$0 if selling to anyone. @@ -206,14 +206,14 @@ Please select an individual to sell to if selling for L$0. <notification name="ConfirmLandSaleChange"> The selected [LAND_SIZE] m² land is being set for sale. Your selling price will be L$[SALE_PRICE] and will be authorized for sale to [NAME]. - <usetemplate name="okcancelbuttons" notext="å–銷" yestext="確定"/> + <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/> </notification> <notification name="ConfirmLandSaleToAnyoneChange"> ATTENTION: Clicking 'sell to anyone' makes your land available to the entire [SECOND_LIFE] community, even those not in this region. The selected [LAND_SIZE] m² land is being set for sale. Your selling price will be L$[SALE_PRICE] and will be authorized for sale to [NAME]. - <usetemplate name="okcancelbuttons" notext="å–銷" yestext="確定"/> + <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/> </notification> <notification name="ReturnObjectsDeededToGroup"> Are you sure you want to return all objects shared with the group '[NAME]' on this parcel of land back to their previous owner's inventory? @@ -221,19 +221,19 @@ Your selling price will be L$[SALE_PRICE] and will be authorized for sale to [NA *WARNING* This will delete the non-transferable objects deeded to the group! Objects: [N] - <usetemplate name="okcancelbuttons" notext="å–銷" yestext="確定"/> + <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/> </notification> <notification name="ReturnObjectsOwnedByUser"> Are you sure you want to return all objects owned by the Resident '[NAME]' on this parcel of land back to their inventory? Objects: [N] - <usetemplate name="okcancelbuttons" notext="å–銷" yestext="確定"/> + <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/> </notification> <notification name="ReturnObjectsOwnedBySelf"> Are you sure you want to return all objects owned by you on this parcel of land back to your inventory? Objects: [N] - <usetemplate name="okcancelbuttons" notext="å–銷" yestext="確定"/> + <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/> </notification> <notification name="ReturnObjectsNotOwnedBySelf"> Are you sure you want to return all objects NOT owned by you on this parcel of land back to their owner's inventory? @@ -242,7 +242,7 @@ Transferable objects deeded to a group will be returned to their previous owners *WARNING* This will delete the non-transferable objects deeded to the group! Objects: [N] - <usetemplate name="okcancelbuttons" notext="å–銷" yestext="確定"/> + <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/> </notification> <notification name="ReturnObjectsNotOwnedByUser"> Are you sure you want to return all objects NOT owned by [NAME] on this parcel of land back to their owner's inventory? @@ -251,21 +251,21 @@ Transferable objects deeded to a group will be returned to their previous owners *WARNING* This will delete the non-transferable objects deeded to the group! Objects: [N] - <usetemplate name="okcancelbuttons" notext="å–銷" yestext="確定"/> + <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/> </notification> <notification name="ReturnAllTopObjects"> Are you sure you want to return all listed objects back to their owner's inventory? - <usetemplate name="okcancelbuttons" notext="å–銷" yestext="確定"/> + <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/> </notification> <notification name="DisableAllTopObjects"> Are you sure you want to disable all objects in this region? - <usetemplate name="okcancelbuttons" notext="å–銷" yestext="確定"/> + <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/> </notification> <notification name="ReturnObjectsNotOwnedByGroup"> Return the objects on this parcel of land that are NOT shared with the group [NAME] back to their owners? Objects: [N] - <usetemplate name="okcancelbuttons" notext="å–銷" yestext="確定"/> + <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/> </notification> <notification name="UnableToDisableOutsideScripts"> Can not disable scripts. @@ -276,7 +276,7 @@ Scripts must be allowed to run for weapons to work. Multiple faces are currently selected. If you continue this action, separate instances of media will be set on multiple faces of the object. To place the media on only one face, choose Select Face and click on the desired face of that object then click Add. - <usetemplate ignoretext="Media will be set on multiple selected faces" name="okcancelignore" notext="å–銷" yestext="確定"/> + <usetemplate ignoretext="Media will be set on multiple selected faces" name="okcancelignore" notext="å–消" yestext="確定"/> </notification> <notification name="MustBeInParcel"> You must be standing inside the land parcel to set its Landing Point. @@ -289,7 +289,7 @@ To place the media on only one face, choose Select Face and click on the desired </notification> <notification name="PromptMissingSubjMsg"> Email snapshot with the default subject or message? - <usetemplate name="okcancelbuttons" notext="å–銷" yestext="確定"/> + <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/> </notification> <notification name="ErrorProcessingSnapshot"> Error processing snapshot data @@ -328,7 +328,7 @@ You need an account to enter [SECOND_LIFE]. Would you like to create one now? <url name="url"> http://join.secondlife.com/ </url> - <usetemplate name="okcancelbuttons" notext="Try again" yestext="Create a new account"/> + <usetemplate name="okcancelbuttons" notext="å†è©¦ä¸€æ¬¡" yestext="å‰µé€ æ–°å¸³æˆ¶"/> </notification> <notification name="InvalidCredentialFormat"> You need to enter either the Username or both the First and Last name of your avatar into the Username field, then login again. @@ -336,7 +336,7 @@ You need an account to enter [SECOND_LIFE]. Would you like to create one now? <notification name="DeleteClassified"> Delete classified '[NAME]'? There is no reimbursement for fees paid. - <usetemplate name="okcancelbuttons" notext="å–銷" yestext="確定"/> + <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/> </notification> <notification name="DeleteMedia"> You have selected to delete the media associated with this face. @@ -345,7 +345,7 @@ Are you sure you want to continue? </notification> <notification name="ClassifiedSave"> Save changes to classified [NAME]? - <usetemplate canceltext="å–銷" name="yesnocancelbuttons" notext="ä¸è¦å„²å˜" yestext="儲å˜"/> + <usetemplate canceltext="å–消" name="yesnocancelbuttons" notext="ä¸è¦å„²å˜" yestext="儲å˜"/> </notification> <notification name="ClassifiedInsufficientFunds"> Insufficient funds to create classified. @@ -353,18 +353,18 @@ Are you sure you want to continue? </notification> <notification name="DeleteAvatarPick"> Delete pick <nolink>[PICK]</nolink>? - <usetemplate name="okcancelbuttons" notext="å–銷" yestext="確定"/> + <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/> </notification> <notification name="DeleteOutfits"> 刪除所é¸æ“‡çš„è£æ‰®ï¼Ÿ - <usetemplate name="okcancelbuttons" notext="å–銷" yestext="確定"/> + <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/> </notification> <notification name="PromptGoToEventsPage"> å‰å¾€ [SECOND_LIFE] 事件網é ? <url name="url"> http://secondlife.com/events/ </url> - <usetemplate name="okcancelbuttons" notext="å–銷" yestext="確定"/> + <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/> </notification> <notification name="SelectProposalToView"> Please select a proposal to view. @@ -393,11 +393,11 @@ Note: This will clear the cache. <url name="url"> http://secondlife.com/auctions/auction-detail.php?id=[AUCTION_ID] </url> - <usetemplate name="okcancelbuttons" notext="å–銷" yestext="確定"/> + <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/> </notification> <notification name="SaveChanges"> Save Changes? - <usetemplate canceltext="å–銷" name="yesnocancelbuttons" notext="ä¸è¦å„²å˜" yestext="儲å˜"/> + <usetemplate canceltext="å–消" name="yesnocancelbuttons" notext="ä¸è¦å„²å˜" yestext="儲å˜"/> </notification> <notification name="GestureSaveFailedTooManySteps"> Gesture save failed. @@ -425,7 +425,7 @@ The object may be out of range or may have been deleted. Could not undo all changes in your version of the script. Would you like to load the server's last saved version? (**Warning** This operation cannot be undone.) - <usetemplate name="okcancelbuttons" notext="å–銷" yestext="確定"/> + <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/> </notification> <notification name="SaveScriptFailReason"> There was a problem saving a script due to the following reason: [REASON]. Please try re-saving the script later. @@ -459,14 +459,14 @@ Visit [_URL] for more information? <url name="url"> http://www.secondlife.com/corporate/sysreqs.php </url> - <usetemplate ignoretext="My computer hardware is not supported" name="okcancelignore" notext="å¦" yestext="是"/> + <usetemplate ignoretext="我的電腦硬體並ä¸æ”¯æ´" name="okcancelignore" notext="å¦" yestext="是"/> </notification> <notification name="UnknownGPU"> Your system contains a graphics card that [APP_NAME] doesn't recognize. This is often the case with new hardware that hasn't been tested yet with [APP_NAME]. It will probably be ok, but you may need to adjust your graphics settings. (Me > Preferences > Graphics). <form name="form"> - <ignore name="ignore" text="My graphics card could not be identified"/> + <ignore name="ignore" text="我的顯示å¡ç„¡æ³•è¾¨è˜"/> </form> </notification> <notification name="DisplaySettingsNoShaders"> @@ -476,7 +476,7 @@ We recommend updating your graphics card drivers. Graphics Quality can be raised in Preferences > Graphics. </notification> <notification name="RegionNoTerraforming"> - The region [REGION] does not allow terraforming. + 這個 [REGION] 地å€ä¸¦ä¸å…許變更地形。 </notification> <notification name="CannotCopyWarning"> You do not have permission to copy the following items: @@ -488,7 +488,7 @@ and will lose it from your inventory if you give it away. Do you really want to 無法給予收ç´å€ç‰©å“。 </notification> <notification name="TransactionCancelled"> - 交易已å–銷。 + 交易已å–消。 </notification> <notification name="TooManyItems"> Cannot give more than 42 items in a single inventory transfer. @@ -505,29 +505,29 @@ Do you really want to give these items? You do not have permission to transfer the selected folder. </notification> <notification name="FreezeAvatar"> - Freeze this avatar? -He or she will temporarily be unable to move, chat, or interact with the world. - <usetemplate canceltext="å–銷" name="yesnocancelbuttons" notext="Unfreeze" yestext="Freeze"/> + å‡çµé€™ä½åŒ–身? +他將暫時無法移動ã€èŠå¤©æˆ–這個世界互動。 + <usetemplate canceltext="å–消" name="yesnocancelbuttons" notext="解å‡" yestext="å‡çµ"/> </notification> <notification name="FreezeAvatarFullname"> - Freeze [AVATAR_NAME]? -He or she will temporarily be unable to move, chat, or interact with the world. - <usetemplate canceltext="å–銷" name="yesnocancelbuttons" notext="Unfreeze" yestext="Freeze"/> + å‡çµ [AVATAR_NAME]? +他將暫時無法移動ã€èŠå¤©æˆ–這個世界互動。 + <usetemplate canceltext="å–消" name="yesnocancelbuttons" notext="解å‡" yestext="å‡çµ"/> </notification> <notification name="EjectAvatarFullname"> - Eject [AVATAR_NAME] from your land? - <usetemplate canceltext="å–銷" name="yesnocancelbuttons" notext="Eject and Ban" yestext="Eject"/> + å°‡ [AVATAR_NAME] ç”±ä½ çš„åœŸåœ°è¸¢å‡ºï¼Ÿ + <usetemplate canceltext="å–消" name="yesnocancelbuttons" notext="踢出並å°éŽ–" yestext="踢出"/> </notification> <notification name="EjectAvatarNoBan"> - Eject this avatar from your land? - <usetemplate name="okcancelbuttons" notext="å–銷" yestext="Eject"/> + 將這一ä½åŒ–èº«ç”±ä½ çš„åœŸåœ°è¸¢å‡ºï¼Ÿ + <usetemplate name="okcancelbuttons" notext="å–消" yestext="踢出"/> </notification> <notification name="EjectAvatarFullnameNoBan"> - Eject [AVATAR_NAME] from your land? - <usetemplate name="okcancelbuttons" notext="å–銷" yestext="Eject"/> + å°‡ [AVATAR_NAME] ç”±ä½ çš„åœŸåœ°è¸¢å‡ºï¼Ÿ + <usetemplate name="okcancelbuttons" notext="å–消" yestext="踢出"/> </notification> <notification name="EjectAvatarFromGroup"> - You ejected [AVATAR_NAME] from group [GROUP_NAME] + ä½ å·²å°‡ [AVATAR_NAME] 由社團 [GROUP_NAME] ä¸è¸¢å‡º </notification> <notification name="AcquireErrorTooManyObjects"> ACQUIRE ERROR: Too many objects selected. @@ -543,7 +543,7 @@ Go to [_URL] for information on purchasing L$? <url name="url"> http://secondlife.com/app/currency/ </url> - <usetemplate name="okcancelbuttons" notext="å–銷" yestext="確定"/> + <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/> </notification> <notification name="UnableToLinkObjects"> Unable to link these [COUNT] objects. @@ -747,7 +747,7 @@ No parcel selected. <notification name="ForceOwnerAuctionWarning"> This parcel is up for auction. Forcing ownership will cancel the auction and potentially make some Residents unhappy if bidding has begun. Force ownership? - <usetemplate name="okcancelbuttons" notext="å–銷" yestext="確定"/> + <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/> </notification> <notification name="CannotContentifyNothingSelected"> Unable to contentify: @@ -840,7 +840,7 @@ Select an entire parcel, or divide your parcel first. Releasing this parcel will remove it from your land holdings, but will not grant any L$. Release this land? - <usetemplate name="okcancelbuttons" notext="å–銷" yestext="確定"/> + <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/> </notification> <notification name="CannotDivideLandNothingSelected"> Unable to divide land: @@ -857,7 +857,7 @@ Try selecting a part of the parcel. Dividing this land will split this parcel into two and each parcel can have its own settings. Some settings will be reset to defaults after the operation. Divide land? - <usetemplate name="okcancelbuttons" notext="å–銷" yestext="確定"/> + <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/> </notification> <notification name="CannotDivideLandNoRegion"> Unable to divide land: @@ -888,15 +888,15 @@ Select land across both parcels. You will need to reset the name and options of the new parcel. Join land? - <usetemplate name="okcancelbuttons" notext="å–銷" yestext="確定"/> + <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/> </notification> <notification name="ConfirmNotecardSave"> This notecard needs to be saved before the item can be copied or viewed. Save notecard? - <usetemplate name="okcancelbuttons" notext="å–銷" yestext="確定"/> + <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/> </notification> <notification name="ConfirmItemCopy"> 覆製這個物å“åˆ°ä½ çš„æ”¶ç´å€ï¼Ÿ - <usetemplate name="okcancelbuttons" notext="å–銷" yestext="覆製"/> + <usetemplate name="okcancelbuttons" notext="å–消" yestext="覆製"/> </notification> <notification name="ResolutionSwitchFail"> Failed to switch resolution to [RESX] by [RESY] @@ -917,7 +917,7 @@ This is usually a temporary failure. Please customize and save the wearable agai <notification name="YouHaveBeenLoggedOut"> Darn. You have been logged out of [SECOND_LIFE] [MESSAGE] - <usetemplate name="okcancelbuttons" notext="Quit" yestext="View IM & Chat"/> + <usetemplate name="okcancelbuttons" notext="çµæŸé€€å‡º" yestext="View IM & Chat"/> </notification> <notification name="OnlyOfficerCanBuyLand"> Unable to buy land for the group: @@ -932,7 +932,7 @@ Offer friendship to [NAME]? ä½ é¡˜æ„æˆç‚ºæˆ‘的朋å‹å—Žï¼Ÿ </input> <button name="Offer" text="確定"/> - <button name="Cancel" text="å–銷"/> + <button name="Cancel" text="å–消"/> </form> </notification> <notification label="儲å˜è£æ‰®" name="SaveOutfitAs"> @@ -942,7 +942,7 @@ Offer friendship to [NAME]? [DESC] (新) </input> <button name="OK" text="確定"/> - <button name="Cancel" text="å–銷"/> + <button name="Cancel" text="å–消"/> </form> </notification> <notification label="Save Wearable" name="SaveWearableAs"> @@ -952,7 +952,7 @@ Offer friendship to [NAME]? [DESC] (新) </input> <button name="OK" text="確定"/> - <button name="Cancel" text="å–銷"/> + <button name="Cancel" text="å–消"/> </form> </notification> <notification label="è£æ‰®æ›´å" name="RenameOutfit"> @@ -962,34 +962,34 @@ Offer friendship to [NAME]? [NAME] </input> <button name="OK" text="確定"/> - <button name="Cancel" text="å–銷"/> + <button name="Cancel" text="å–消"/> </form> </notification> <notification name="RemoveFromFriends"> Do you want to remove [NAME] from your Friends List? - <usetemplate name="okcancelbuttons" notext="å–銷" yestext="確定"/> + <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/> </notification> <notification name="RemoveMultipleFromFriends"> ä½ ç¢ºå®šè¦ç”±æœ‹å‹æ¸…å–®ä¸ç§»é™¤å¤šå€‹æœ‹å‹å—Žï¼Ÿ - <usetemplate name="okcancelbuttons" notext="å–銷" yestext="確定"/> + <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/> </notification> <notification name="GodDeleteAllScriptedPublicObjectsByUser"> Are you sure you want to delete all scripted objects owned by ** [AVATAR_NAME] ** on all others land in this sim? - <usetemplate name="okcancelbuttons" notext="å–銷" yestext="確定"/> + <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/> </notification> <notification name="GodDeleteAllScriptedObjectsByUser"> Are you sure you want to DELETE ALL scripted objects owned by ** [AVATAR_NAME] ** on ALL LAND in this sim? - <usetemplate name="okcancelbuttons" notext="å–銷" yestext="確定"/> + <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/> </notification> <notification name="GodDeleteAllObjectsByUser"> Are you sure you want to DELETE ALL objects (scripted or not) owned by ** [AVATAR_NAME] ** on ALL LAND in this sim? - <usetemplate name="okcancelbuttons" notext="å–銷" yestext="確定"/> + <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/> </notification> <notification name="BlankClassifiedName"> You must specify a name for your classified. @@ -1003,46 +1003,46 @@ Please enter a higher price. At least one of the items you has link items that point to it. If you delete this item, its links will permanently stop working. It is strongly advised to delete the links first. Are you sure you want to delete these items? - <usetemplate name="okcancelbuttons" notext="å–銷" yestext="確定"/> + <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/> </notification> <notification name="ConfirmObjectDeleteLock"> At least one of the items you have selected is locked. Are you sure you want to delete these items? - <usetemplate name="okcancelbuttons" notext="å–銷" yestext="確定"/> + <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/> </notification> <notification name="ConfirmObjectDeleteNoCopy"> At least one of the items you have selected is not copyable. Are you sure you want to delete these items? - <usetemplate name="okcancelbuttons" notext="å–銷" yestext="確定"/> + <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/> </notification> <notification name="ConfirmObjectDeleteNoOwn"> You do not own least one of the items you have selected. Are you sure you want to delete these items? - <usetemplate name="okcancelbuttons" notext="å–銷" yestext="確定"/> + <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/> </notification> <notification name="ConfirmObjectDeleteLockNoCopy"> At least one object is locked. At least one object is not copyable. Are you sure you want to delete these items? - <usetemplate name="okcancelbuttons" notext="å–銷" yestext="確定"/> + <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/> </notification> <notification name="ConfirmObjectDeleteLockNoOwn"> At least one object is locked. You do not own least one object. Are you sure you want to delete these items? - <usetemplate name="okcancelbuttons" notext="å–銷" yestext="確定"/> + <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/> </notification> <notification name="ConfirmObjectDeleteNoCopyNoOwn"> At least one object is not copyable. You do not own least one object. Are you sure you want to delete these items? - <usetemplate name="okcancelbuttons" notext="å–銷" yestext="確定"/> + <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/> </notification> <notification name="ConfirmObjectDeleteLockNoCopyNoOwn"> At least one object is locked. @@ -1050,20 +1050,20 @@ At least one object is not copyable. You do not own least one object. Are you sure you want to delete these items? - <usetemplate name="okcancelbuttons" notext="å–銷" yestext="確定"/> + <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/> </notification> <notification name="ConfirmObjectTakeLock"> At least one object is locked. Are you sure you want to take these items? - <usetemplate name="okcancelbuttons" notext="å–銷" yestext="確定"/> + <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/> </notification> <notification name="ConfirmObjectTakeNoOwn"> You do not own all of the objects you are taking. If you continue, next owner permissions will be applied and possibly restrict your ability to modify or copy them. Are you sure you want to take these items? - <usetemplate name="okcancelbuttons" notext="å–銷" yestext="確定"/> + <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/> </notification> <notification name="ConfirmObjectTakeLockNoOwn"> At least one object is locked. @@ -1072,7 +1072,7 @@ If you continue, next owner permissions will be applied and possibly restrict yo However, you can take the current selection. Are you sure you want to take these items? - <usetemplate name="okcancelbuttons" notext="å–銷" yestext="確定"/> + <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/> </notification> <notification name="CantBuyLandAcrossMultipleRegions"> Unable to buy land because selection spans multiple regions. @@ -1084,7 +1084,7 @@ Please select a smaller area and try again. The purchase price of the land is not refunded to the owner. If a deeded parcel is sold, the sale price will be divided evenly among group members. Deed this [AREA] m² of land to the group '[GROUP_NAME]'? - <usetemplate name="okcancelbuttons" notext="å–銷" yestext="確定"/> + <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/> </notification> <notification name="DeedLandToGroupWithContribution"> By deeding this parcel, the group will be required to have and maintain sufficient land use credits. @@ -1092,7 +1092,7 @@ The deed will include a simultaneous land contribution to the group from '[ The purchase price of the land is not refunded to the owner. If a deeded parcel is sold, the sale price will be divided evenly among group members. Deed this [AREA] m² of land to the group '[GROUP_NAME]'? - <usetemplate name="okcancelbuttons" notext="å–銷" yestext="確定"/> + <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/> </notification> <notification name="DisplaySetToSafe"> Display settings have been set to safe levels because you have specified the -safe option. @@ -1129,7 +1129,7 @@ You may want to set a new home location. If this is your first time using [SECOND_LIFE], you will need to create an account before you can log in. Return to [http://join.secondlife.com secondlife.com] to create a new account? - <usetemplate name="okcancelbuttons" notext="繼續" yestext="New Account..."/> + <usetemplate name="okcancelbuttons" notext="繼續" yestext="新帳戶..."/> </notification> <notification name="LoginPacketNeverReceived"> We're having trouble connecting. There may be a problem with your Internet connection or the [SECOND_LIFE_GRID]. @@ -1186,7 +1186,7 @@ Extended Key Usage: [EXTENDEDKEYUSAGE] Subject Key Identifier: [SUBJECTKEYIDENTIFIER] Would you like to trust this authority? - <usetemplate name="okcancelbuttons" notext="å–銷" yestext="Trust"/> + <usetemplate name="okcancelbuttons" notext="å–消" yestext="Trust"/> </notification> <notification name="NotEnoughCurrency"> [NAME] L$ [PRICE] You don't have enough L$ to do that. @@ -1201,7 +1201,7 @@ Would you like to trust this authority? This will flush the map caches on this region. This is really only useful for debugging. (In production, wait 5 minutes, then everyone's map will update after they relog.) - <usetemplate name="okcancelbuttons" notext="å–銷" yestext="確定"/> + <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/> </notification> <notification name="BuyOneObjectOnly"> Unable to buy more than one object at a time. Please select only one object and try again. @@ -1209,15 +1209,15 @@ This is really only useful for debugging. <notification name="OnlyCopyContentsOfSingleItem"> Unable to copy the contents of more than one item at a time. Please select only one object and try again. - <usetemplate name="okcancelbuttons" notext="å–銷" yestext="確定"/> + <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/> </notification> <notification name="KickUsersFromRegion"> 確定è¦å¼·åˆ¶çž¬é–“傳é€é€™åœ°å€æ‰€æœ‰å±…民回家? - <usetemplate name="okcancelbuttons" notext="å–銷" yestext="確定"/> + <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/> </notification> <notification name="EstateObjectReturn"> Are you sure you want to return objects owned by [USER_NAME]? - <usetemplate name="okcancelbuttons" notext="å–銷" yestext="確定"/> + <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/> </notification> <notification name="InvalidTerrainBitDepth"> Couldn't set region textures: @@ -1236,13 +1236,13 @@ Replace texture [TEXTURE_NUM] with a 24-bit 512x512 or smaller image then click </notification> <notification name="ConfirmBakeTerrain"> Do you really want to bake the current terrain, make it the center for terrain raise/lower limits and the default for the 'Revert' tool? - <usetemplate name="okcancelbuttons" notext="å–銷" yestext="確定"/> + <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/> </notification> <notification name="MaxAllowedAgentOnRegion"> You can only have [MAX_AGENTS] Allowed Residents. </notification> <notification name="MaxBannedAgentsOnRegion"> - You can only have [MAX_BANNED] Banned Residents. + ä½ åªå¯ä»¥æœ‰æœ€å¤š [MAX_BANNED] ä½è¢«å°éŽ–的居民。 </notification> <notification name="MaxAgentOnRegionBatch"> Failure while attempting to add [NUM_ADDED] agents: @@ -1250,13 +1250,13 @@ Exceeds the [MAX_AGENTS] [LIST_TYPE] limit by [NUM_EXCESS]. </notification> <notification name="MaxAllowedGroupsOnRegion"> You can only have [MAX_GROUPS] Allowed Groups. - <usetemplate name="okcancelbuttons" notext="å–銷" yestext="Bake"/> + <usetemplate name="okcancelbuttons" notext="å–消" yestext="Bake"/> </notification> <notification name="MaxManagersOnRegion"> - You can only have [MAX_MANAGER] Estate Managers. + ä½ åªå¯ä»¥æœ‰æœ€å¤š [MAX_MANAGER] ä½é ˜åœ°ç¶“ç†ã€‚ </notification> <notification name="OwnerCanNotBeDenied"> - Can't add estate owner to estate 'Banned Resident' list. + ç„¡æ³•æ·»åŠ é ˜åœ°æ“æœ‰è€…åˆ°é ˜åœ°çš„ '被å°éŽ–çš„å±…æ°‘' åå–®ä¸ã€‚ </notification> <notification name="CanNotChangeAppearanceUntilLoaded"> 無法變更外觀,直到æœè£èˆ‡é«”形下載完畢。 @@ -1273,15 +1273,15 @@ Please set the object for sale and try again. [DOWNLOAD_PATH]. </notification> <notification name="DownloadWindowsMandatory"> - A new version of [APP_NAME] is available. + 一個新版本的 [APP_NAME] 已經å¯ç”¨ã€‚ [MESSAGE] -You must download this update to use [APP_NAME]. - <usetemplate name="okcancelbuttons" notext="Quit" yestext="下載"/> +ä½ å¿…é ˆä¸‹è¼‰é€™å€‹æ›´æ–°ä»¥ä½¿ç”¨ [APP_NAME]。 + <usetemplate name="okcancelbuttons" notext="çµæŸé€€å‡º" yestext="下載"/> </notification> <notification name="DownloadWindows"> - An updated version of [APP_NAME] is available. + 一個 [APP_NAME] æ›´æ–°éŽçš„版本已經å¯ç”¨ã€‚ [MESSAGE] -This update is not required, but we suggest you install it to improve performance and stability. +這個更新並éžå¼·åˆ¶æ›´æ–°ï¼Œä½†æˆ‘們建è°ä½ 安è£ä»¥å¢žå¼·æ•ˆèƒ½åŠç©©å®šæ€§ã€‚ <usetemplate name="okcancelbuttons" notext="繼續" yestext="下載"/> </notification> <notification name="DownloadWindowsReleaseForDownload"> @@ -1294,7 +1294,7 @@ This update is not required, but we suggest you install it to improve performanc A new version of [APP_NAME] is available. [MESSAGE] You must download this update to use [APP_NAME]. - <usetemplate name="okcancelbuttons" notext="Quit" yestext="下載"/> + <usetemplate name="okcancelbuttons" notext="çµæŸé€€å‡º" yestext="下載"/> </notification> <notification name="DownloadLinux"> An updated version of [APP_NAME] is available. @@ -1314,7 +1314,7 @@ This update is not required, but we suggest you install it to improve performanc You must download this update to use [APP_NAME]. Download to your Applications folder? - <usetemplate name="okcancelbuttons" notext="Quit" yestext="下載"/> + <usetemplate name="okcancelbuttons" notext="çµæŸé€€å‡º" yestext="下載"/> </notification> <notification name="DownloadMac"> An updated version of [APP_NAME] is available. @@ -1344,24 +1344,24 @@ You will be unable to log in until [APP_NAME] has been updated. Please download and install the latest viewer from http://secondlife.com/download. - <usetemplate name="okbutton" yestext="Quit"/> + <usetemplate name="okbutton" yestext="çµæŸé€€å‡º"/> </notification> <notification name="UpdaterServiceNotRunning"> There is a required update for your Second Life Installation. You may download this update from http://www.secondlife.com/downloads or you can install it now. - <usetemplate name="okcancelbuttons" notext="Quit Second Life" yestext="ç«‹å³ä¸‹è¼‰åŠå®‰è£"/> + <usetemplate name="okcancelbuttons" notext="çµæŸé€€å‡ºç¬¬äºŒäººç”Ÿ" yestext="ç«‹å³ä¸‹è¼‰åŠå®‰è£"/> </notification> <notification name="DownloadBackgroundTip"> We have downloaded an update to your [APP_NAME] installation. Version [VERSION] [[RELEASE_NOTES_FULL_URL] Information about this update] - <usetemplate name="okcancelbuttons" notext="Later..." yestext="Install now and restart [APP_NAME]"/> + <usetemplate name="okcancelbuttons" notext="ç¨å€™..." yestext="ç«‹å³å®‰è£åŠé‡æ–°å•Ÿå‹• [APP_NAME]"/> </notification> <notification name="DownloadBackgroundDialog"> We have downloaded an update to your [APP_NAME] installation. Version [VERSION] [[RELEASE_NOTES_FULL_URL] Information about this update] - <usetemplate name="okcancelbuttons" notext="Later..." yestext="Install now and restart [APP_NAME]"/> + <usetemplate name="okcancelbuttons" notext="梢候..." yestext="ç«‹å³å®‰è£åŠé‡æ–°å•Ÿå‹• [APP_NAME]"/> </notification> <notification name="RequiredUpdateDownloadedVerboseDialog"> We have downloaded a required software update. @@ -1371,60 +1371,60 @@ We must restart [APP_NAME] to install the update. <usetemplate name="okbutton" yestext="確定"/> </notification> <notification name="RequiredUpdateDownloadedDialog"> - We must restart [APP_NAME] to install the update. + æˆ‘é–€å¿…é ˆé‡æ–°å•Ÿå‹• [APP_NAME] 以安è£æ›´æ–°ã€‚ <usetemplate name="okbutton" yestext="確定"/> </notification> <notification name="DeedObjectToGroup"> Deeding this object will cause the group to: * Receive L$ paid into the object - <usetemplate ignoretext="Confirm before I deed an object to a group" name="okcancelignore" notext="å–銷" yestext="Deed"/> + <usetemplate ignoretext="Confirm before I deed an object to a group" name="okcancelignore" notext="å–消" yestext="Deed"/> </notification> <notification name="WebLaunchExternalTarget"> Do you want to open your Web browser to view this content? - <usetemplate ignoretext="Launch my browser to view a web page" name="okcancelignore" notext="å–銷" yestext="確定"/> + <usetemplate ignoretext="Launch my browser to view a web page" name="okcancelignore" notext="å–消" yestext="確定"/> </notification> <notification name="WebLaunchJoinNow"> - Go to your [http://secondlife.com/account/ Dashboard] to manage your account? - <usetemplate ignoretext="Launch my browser to manage my account" name="okcancelignore" notext="å–銷" yestext="確定"/> + å‰å¾€ä½ çš„[http://secondlife.com/account/ 塗鴉牆]以進行管ç†ä½ 的帳戶? + <usetemplate ignoretext="啟動我的ç€è¦½å™¨ä»¥ç®¡ç†æˆ‘的帳戶" name="okcancelignore" notext="å–消" yestext="確定"/> </notification> <notification name="WebLaunchSecurityIssues"> Visit the [SECOND_LIFE] Wiki for details of how to report a security issue. - <usetemplate ignoretext="Launch my browser to learn how to report a Security Issue" name="okcancelignore" notext="å–銷" yestext="確定"/> + <usetemplate ignoretext="Launch my browser to learn how to report a Security Issue" name="okcancelignore" notext="å–消" yestext="確定"/> </notification> <notification name="WebLaunchQAWiki"> Visit the [SECOND_LIFE] QA Wiki. - <usetemplate ignoretext="Launch my browser to view the QA Wiki" name="okcancelignore" notext="å–銷" yestext="確定"/> + <usetemplate ignoretext="Launch my browser to view the QA Wiki" name="okcancelignore" notext="å–消" yestext="確定"/> </notification> <notification name="WebLaunchPublicIssue"> Visit the [SECOND_LIFE] Public Issue Tracker, where you can report bugs and other issues. - <usetemplate ignoretext="Launch my browser to use the Public Issue Tracker" name="okcancelignore" notext="å–銷" yestext="å‰å¾€é é¢"/> + <usetemplate ignoretext="Launch my browser to use the Public Issue Tracker" name="okcancelignore" notext="å–消" yestext="å‰å¾€é é¢"/> </notification> <notification name="WebLaunchSupportWiki"> - Go to the Official Linden Blog, for the latest news and information. - <usetemplate ignoretext="Launch my browser to view the blog" name="okcancelignore" notext="å–銷" yestext="確定"/> + å‰å¾€æž—登官方部è½æ ¼ï¼Œä»¥å–得最新的新èžèˆ‡è³‡è¨Šã€‚ + <usetemplate ignoretext="Launch my browser to view the blog" name="okcancelignore" notext="å–消" yestext="確定"/> </notification> <notification name="WebLaunchLSLGuide"> Do you want to open the Scripting Guide for help with scripting? - <usetemplate ignoretext="Launch my browser to view the Scripting Guide" name="okcancelignore" notext="å–銷" yestext="確定"/> + <usetemplate ignoretext="Launch my browser to view the Scripting Guide" name="okcancelignore" notext="å–消" yestext="確定"/> </notification> <notification name="WebLaunchLSLWiki"> Do you want to visit the LSL Portal for help with scripting? - <usetemplate ignoretext="Launch my browser to view the LSL Portal" name="okcancelignore" notext="å–銷" yestext="Go to page"/> + <usetemplate ignoretext="Launch my browser to view the LSL Portal" name="okcancelignore" notext="å–消" yestext="å‰å¾€é é¢"/> </notification> <notification name="ReturnToOwner"> Are you sure you want to return the selected objects to their owners? Transferable deeded objects will be returned to their previous owners. *WARNING* No-transfer deeded objects will be deleted! - <usetemplate ignoretext="Confirm before I return objects to their owners" name="okcancelignore" notext="å–銷" yestext="確定"/> + <usetemplate ignoretext="Confirm before I return objects to their owners" name="okcancelignore" notext="å–消" yestext="確定"/> </notification> <notification name="GroupLeaveConfirmMember"> You are currently a member of the group [GROUP]. Leave Group? - <usetemplate name="okcancelbuttons" notext="å–銷" yestext="確定"/> + <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/> </notification> <notification name="ConfirmKick"> - ä½ ç¢ºå®šè¦è¸¢é™¤é€™ç¶²æ ¼å…§çš„全部居民? - <usetemplate name="okcancelbuttons" notext="å–銷" yestext="踢除全部居民"/> + ä½ ç¢ºå®šè¦è¸¢å‡ºé€™ç¶²æ ¼å…§çš„全部居民? + <usetemplate name="okcancelbuttons" notext="å–消" yestext="踢出全部居民"/> </notification> <notification name="MuteLinden"> Sorry, you cannot block a Linden. @@ -1439,7 +1439,7 @@ Leave Group? </notification> <notification name="RemoveItemWarn"> Though permitted, deleting contents may damage the object. Do you want to delete that item? - <usetemplate name="okcancelbuttons" notext="å–銷" yestext="確定"/> + <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/> </notification> <notification name="CantOfferCallingCard"> Cannot offer a calling card at this time. Please try again in a moment. @@ -1464,13 +1464,13 @@ Chat and instant messages will be hidden. Instant messages will get your Busy mo <usetemplate name="okbutton" yestext="確定"/> </notification> <notification name="KickUser"> - 踢除這個居民並留給他什麼訊æ¯ï¼Ÿ + 踢出這個居民並留給他什麼訊æ¯ï¼Ÿ <form name="form"> <input name="message"> An administrator has logged you off. </input> <button name="OK" text="確定"/> - <button name="Cancel" text="å–銷"/> + <button name="Cancel" text="å–消"/> </form> </notification> <notification name="KickAllUsers"> @@ -1480,27 +1480,27 @@ Chat and instant messages will be hidden. Instant messages will get your Busy mo An administrator has logged you off. </input> <button name="OK" text="確定"/> - <button name="Cancel" text="å–銷"/> + <button name="Cancel" text="å–消"/> </form> </notification> <notification name="FreezeUser"> - Freeze this Resident with what message? + å‡çµé€™ä½å±…民時åŒæ™‚留下什麼訊æ¯ï¼Ÿ <form name="form"> <input name="message"> - You have been frozen. You cannot move or chat. An administrator will contact you via instant message (IM). + ä½ å·²ç¶“è¢«å‡çµäº†ã€‚ä½ å°‡ä¸èƒ½ç§»å‹•æˆ–èŠå¤©ã€‚管ç†å“¡å°‡æœƒä»¥å³æ™‚訊æ¯è¯ç¹«ä½ (IM)。 </input> <button name="OK" text="確定"/> - <button name="Cancel" text="å–銷"/> + <button name="Cancel" text="å–消"/> </form> </notification> <notification name="UnFreezeUser"> - Unfreeze this Resident with what message? + 將這ä½å±…民解å‡ä¸¦åŒæ™‚留下什麼訊æ¯ï¼Ÿ <form name="form"> <input name="message"> You are no longer frozen. </input> <button name="OK" text="確定"/> - <button name="Cancel" text="å–銷"/> + <button name="Cancel" text="å–消"/> </form> </notification> <notification name="SetDisplayNameSuccess"> @@ -1550,7 +1550,7 @@ Please try again later. åŠ å…¥æˆ‘åˆ° [REGION] </input> <button name="OK" text="確定"/> - <button name="Cancel" text="å–銷"/> + <button name="Cancel" text="å–消"/> </form> </notification> <notification name="OfferTeleportFromGod"> @@ -1560,30 +1560,30 @@ Please try again later. Join me in [REGION] </input> <button name="OK" text="確定"/> - <button name="Cancel" text="å–銷"/> + <button name="Cancel" text="å–消"/> </form> </notification> <notification name="TeleportFromLandmark"> Are you sure you want to teleport to <nolink>[LOCATION]</nolink>? - <usetemplate ignoretext="Confirm that I want to teleport to a landmark" name="okcancelignore" notext="å–銷" yestext="瞬間傳é€"/> + <usetemplate ignoretext="Confirm that I want to teleport to a landmark" name="okcancelignore" notext="å–消" yestext="瞬間傳é€"/> </notification> <notification name="TeleportToPick"> 瞬間傳é€åˆ° [PICK]? - <usetemplate ignoretext="Confirm that I want to teleport to a location in Picks" name="okcancelignore" notext="å–銷" yestext="Teleport"/> + <usetemplate ignoretext="確èªæˆ‘è¦çž¬é–“傳é€åˆ°ç²¾é¸åœ°é»žçš„所在ä½ç½®" name="okcancelignore" notext="å–消" yestext="瞬間傳é€"/> </notification> <notification name="TeleportToClassified"> 瞬間傳é€åˆ° [CLASSIFIED]? - <usetemplate ignoretext="Confirm that I want to teleport to a location in Classifieds" name="okcancelignore" notext="å–銷" yestext="瞬間傳é€"/> + <usetemplate ignoretext="確èªæˆ‘è¦çž¬é–“傳é€åˆ°å€‹äººå»£å‘Šçš„所在ä½ç½®" name="okcancelignore" notext="å–消" yestext="瞬間傳é€"/> </notification> <notification name="TeleportToHistoryEntry"> 瞬間傳é€åˆ° [HISTORY_ENTRY]? - <usetemplate ignoretext="Confirm that I want to teleport to a history location" name="okcancelignore" notext="å–銷" yestext="瞬間傳é€"/> + <usetemplate ignoretext="確èªæˆ‘è¦çž¬é–“傳é€åˆ°æ·å²ç´€éŒ„ä¸çš„ä½ç½®" name="okcancelignore" notext="å–消" yestext="瞬間傳é€"/> </notification> - <notification label="Message everyone in your Estate" name="MessageEstate"> + <notification label="é€å‡ºè¨Šæ¯çµ¦ä½ é ˜åœ°å…§çš„æ¯ä¸€å€‹äºº" name="MessageEstate"> Type a short announcement which will be sent to everyone currently in your estate. <form name="form"> <button name="OK" text="確定"/> - <button name="Cancel" text="å–銷"/> + <button name="Cancel" text="å–消"/> </form> </notification> <notification label="Change Linden Estate" name="ChangeLindenEstate"> @@ -1592,54 +1592,54 @@ Please try again later. This is EXTREMELY DANGEROUS because it can fundamentally affect the Resident experience. On the mainland, it will change thousands of regions and make the spaceserver hiccup. Proceed? - <usetemplate name="okcancelbuttons" notext="å–銷" yestext="確定"/> + <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/> </notification> <notification label="Change Linden Estate Access" name="ChangeLindenAccess"> You are about to change the access list for a Linden owned estate (mainland, teen grid, orientation, etc.). This is DANGEROUS and should only be done to invoke the hack allowing objects/L$ to be transfered in/out of a grid. It will change thousands of regions and make the spaceserver hiccup. - <usetemplate name="okcancelbuttons" notext="å–銷" yestext="確定"/> + <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/> </notification> <notification label="é¸æ“‡é ˜åœ°" name="EstateAllowedAgentAdd"> Add to allowed list for this estate only or for [ALL_ESTATES]? - <usetemplate canceltext="å–銷" name="yesnocancelbuttons" notext="å…¨éƒ¨é ˜åœ°" yestext="é€™å€‹é ˜åœ°"/> + <usetemplate canceltext="å–消" name="yesnocancelbuttons" notext="å…¨éƒ¨é ˜åœ°" yestext="é€™å€‹é ˜åœ°"/> </notification> <notification label="é¸æ“‡é ˜åœ°" name="EstateAllowedAgentRemove"> Remove from allowed list for this estate only or for [ALL_ESTATES]? - <usetemplate canceltext="å–銷" name="yesnocancelbuttons" notext="å…¨éƒ¨é ˜åœ°" yestext="é€™å€‹é ˜åœ°"/> + <usetemplate canceltext="å–消" name="yesnocancelbuttons" notext="å…¨éƒ¨é ˜åœ°" yestext="é€™å€‹é ˜åœ°"/> </notification> <notification label="é¸æ“‡é ˜åœ°" name="EstateAllowedGroupAdd"> Add to group allowed list for this estate only or for [ALL_ESTATES]? - <usetemplate canceltext="å–銷" name="yesnocancelbuttons" notext="å…¨éƒ¨é ˜åœ°" yestext="é€™å€‹é ˜åœ°"/> + <usetemplate canceltext="å–消" name="yesnocancelbuttons" notext="å…¨éƒ¨é ˜åœ°" yestext="é€™å€‹é ˜åœ°"/> </notification> <notification label="é¸æ“‡é ˜åœ°" name="EstateAllowedGroupRemove"> Remove from group allowed list for this estate only or [ALL_ESTATES]? - <usetemplate canceltext="å–銷" name="yesnocancelbuttons" notext="å…¨éƒ¨é ˜åœ°" yestext="é€™å€‹é ˜åœ°"/> + <usetemplate canceltext="å–消" name="yesnocancelbuttons" notext="å…¨éƒ¨é ˜åœ°" yestext="é€™å€‹é ˜åœ°"/> </notification> <notification label="é¸æ“‡é ˜åœ°" name="EstateBannedAgentAdd"> Deny access for this estate only or for [ALL_ESTATES]? - <usetemplate canceltext="å–銷" name="yesnocancelbuttons" notext="å…¨éƒ¨é ˜åœ°" yestext="é€™å€‹é ˜åœ°"/> + <usetemplate canceltext="å–消" name="yesnocancelbuttons" notext="å…¨éƒ¨é ˜åœ°" yestext="é€™å€‹é ˜åœ°"/> </notification> <notification label="é¸æ“‡é ˜åœ°" name="EstateBannedAgentRemove"> Remove this Resident from the ban list for access for this estate only or for [ALL_ESTATES]? - <usetemplate canceltext="å–銷" name="yesnocancelbuttons" notext="å…¨éƒ¨é ˜åœ°" yestext="é€™å€‹é ˜åœ°"/> + <usetemplate canceltext="å–消" name="yesnocancelbuttons" notext="å…¨éƒ¨é ˜åœ°" yestext="é€™å€‹é ˜åœ°"/> </notification> <notification label="é¸æ“‡é ˜åœ°" name="EstateManagerAdd"> Add estate manager for this estate only or for [ALL_ESTATES]? - <usetemplate canceltext="å–銷" name="yesnocancelbuttons" notext="å…¨éƒ¨é ˜åœ°" yestext="é€™å€‹é ˜åœ°"/> + <usetemplate canceltext="å–消" name="yesnocancelbuttons" notext="å…¨éƒ¨é ˜åœ°" yestext="é€™å€‹é ˜åœ°"/> </notification> <notification label="é¸æ“‡é ˜åœ°" name="EstateManagerRemove"> Remove estate manager for this estate only or for [ALL_ESTATES]? - <usetemplate canceltext="å–銷" name="yesnocancelbuttons" notext="å…¨éƒ¨é ˜åœ°" yestext="é€™å€‹é ˜åœ°"/> + <usetemplate canceltext="å–消" name="yesnocancelbuttons" notext="å…¨éƒ¨é ˜åœ°" yestext="é€™å€‹é ˜åœ°"/> </notification> - <notification label="確èªè¸¢é™¤" name="EstateKickUser"> - å°‡ [EVIL_USER] ç”±é€™é ˜åœ°è¸¢é™¤ï¼Ÿ - <usetemplate name="okcancelbuttons" notext="å–銷" yestext="確定"/> + <notification label="確èªè¸¢å‡º" name="EstateKickUser"> + å°‡ [EVIL_USER] ç”±é€™é ˜åœ°è¸¢å‡ºï¼Ÿ + <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/> </notification> <notification name="EstateChangeCovenant"> Are you sure you want to change the Estate Covenant? - <usetemplate name="okcancelbuttons" notext="å–銷" yestext="確定"/> + <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/> </notification> <notification name="RegionEntryAccessBlocked"> You are not allowed in that Region due to your maturity Rating. This may be a result of a lack of information validating your age. @@ -1750,25 +1750,25 @@ You can click 'Change Preference' to raise your maturity Rating prefer Remember: Classified ad fees are non-refundable. Publish this classified now for L$[AMOUNT]? - <usetemplate name="okcancelbuttons" notext="å–銷" yestext="確定"/> + <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/> </notification> <notification name="SetClassifiedMature"> Does this classified contain Moderate content? - <usetemplate canceltext="å–銷" name="yesnocancelbuttons" notext="å¦" yestext="是"/> + <usetemplate canceltext="å–消" name="yesnocancelbuttons" notext="å¦" yestext="是"/> </notification> <notification name="SetGroupMature"> Does this group contain Moderate content? - <usetemplate canceltext="å–銷" name="yesnocancelbuttons" notext="å¦" yestext="是"/> + <usetemplate canceltext="å–消" name="yesnocancelbuttons" notext="å¦" yestext="是"/> </notification> <notification label="Confirm restart" name="ConfirmRestart"> Do you really want to restart this region in 2 minutes? - <usetemplate name="okcancelbuttons" notext="å–銷" yestext="確定"/> + <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/> </notification> <notification label="Message everyone in this region" name="MessageRegion"> Type a short announcement which will be sent to everyone in this region. <form name="form"> <button name="OK" text="確定"/> - <button name="Cancel" text="å–銷"/> + <button name="Cancel" text="å–消"/> </form> </notification> <notification label="Changed Region Maturity" name="RegionMaturityChange"> @@ -1780,15 +1780,15 @@ To enter Adult regions, Residents must be Account Verified, either by age-verifi <notification label="Voice Version Mismatch" name="VoiceVersionMismatch"> This version of [APP_NAME] is not compatible with the Voice Chat feature in this region. In order for Voice Chat to function correctly you will need to update [APP_NAME]. </notification> - <notification label="Can't Buy Objects" name="BuyObjectOneOwner"> + <notification label="無法購買物件" name="BuyObjectOneOwner"> Cannot buy objects from different owners at the same time. Please select only one object and try again. </notification> - <notification label="Can't Buy Contents" name="BuyContentsOneOnly"> + <notification label="無法購買內容物" name="BuyContentsOneOnly"> Unable to buy the contents of more than one object at a time. Please select only one object and try again. </notification> - <notification label="Can't Buy Contents" name="BuyContentsOneOwner"> + <notification label="無法購買內容物" name="BuyContentsOneOwner"> Cannot buy objects from different owners at the same time. Please select only one object and try again. </notification> @@ -1799,7 +1799,7 @@ You will be able to: Modify: [MODIFYPERM] Copy: [COPYPERM] Resell or Give Away: [RESELLPERM] - <usetemplate name="okcancelbuttons" notext="å–銷" yestext="確定"/> + <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/> </notification> <notification name="BuyOriginalNoOwner"> Buy original object for L$[PRICE]? @@ -1808,7 +1808,7 @@ You will be able to: Modify: [MODIFYPERM] Copy: [COPYPERM] Resell or Give Away: [RESELLPERM] - <usetemplate name="okcancelbuttons" notext="å–銷" yestext="確定"/> + <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/> </notification> <notification name="BuyCopy"> Buy a copy from [OWNER] for L$[PRICE]? @@ -1817,7 +1817,7 @@ You will be able to: Modify: [MODIFYPERM] Copy: [COPYPERM] Resell or Give Away: [RESELLPERM] - <usetemplate name="okcancelbuttons" notext="å–銷" yestext="確定"/> + <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/> </notification> <notification name="BuyCopyNoOwner"> Buy a copy for L$[PRICE]? @@ -1826,24 +1826,24 @@ You will be able to: Modify: [MODIFYPERM] Copy: [COPYPERM] Resell or Give Away: [RESELLPERM] - <usetemplate name="okcancelbuttons" notext="å–銷" yestext="確定"/> + <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/> </notification> <notification name="BuyContents"> Buy contents from [OWNER] for L$[PRICE]? They will be copied to your inventory. - <usetemplate name="okcancelbuttons" notext="å–銷" yestext="確定"/> + <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/> </notification> <notification name="BuyContentsNoOwner"> Buy contents for L$[PRICE]? They will be copied to your inventory. - <usetemplate name="okcancelbuttons" notext="å–銷" yestext="確定"/> + <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/> </notification> <notification name="ConfirmPurchase"> This transaction will: [ACTION] Are you sure you want to proceed with this purchase? - <usetemplate name="okcancelbuttons" notext="å–銷" yestext="確定"/> + <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/> </notification> <notification name="ConfirmPurchasePassword"> This transaction will: @@ -1853,7 +1853,7 @@ Are you sure you want to proceed with this purchase? Please re-enter your password and click OK. <form name="form"> <button name="ConfirmPurchase" text="確定"/> - <button name="Cancel" text="å–銷"/> + <button name="Cancel" text="å–消"/> </form> </notification> <notification name="SetPickLocation"> @@ -1866,14 +1866,14 @@ You have updated the location of this pick but the other details will retain the These items will be moved to your inventory, not copied. Move the inventory item(s)? - <usetemplate ignoretext="Warn me before I move 'no-copy' items from an object" name="okcancelignore" notext="å–銷" yestext="確定"/> + <usetemplate ignoretext="Warn me before I move 'no-copy' items from an object" name="okcancelignore" notext="å–消" yestext="確定"/> </notification> <notification name="MoveInventoryFromScriptedObject"> You have selected 'no copy' inventory items. These items will be moved to your inventory, not copied. Because this object is scripted, moving these items to your inventory may cause the script to malfunction. Move the inventory item(s)? - <usetemplate ignoretext="Warn me before I move 'no-copy' items which might break a scripted object" name="okcancelignore" notext="å–銷" yestext="確定"/> + <usetemplate ignoretext="Warn me before I move 'no-copy' items which might break a scripted object" name="okcancelignore" notext="å–消" yestext="確定"/> </notification> <notification name="ClickActionNotPayable"> Warning: The 'Pay object' click action has been set, but it will only work if a script is added with a money() event. @@ -1885,16 +1885,16 @@ Move the inventory item(s)? There are no items in this object that you are allowed to copy. </notification> <notification name="WebLaunchAccountHistory"> - Go to your [http://secondlife.com/account/ Dashboard] to see your account history? - <usetemplate ignoretext="Launch my browser to see my account history" name="okcancelignore" notext="å–銷" yestext="Go to page"/> + å‰å¾€ä½ çš„[http://secondlife.com/account/ 塗鴉牆]ä»¥å¯Ÿçœ‹ä½ çš„å¸³æˆ¶æ·å²ç´€éŒ„? + <usetemplate ignoretext="啟動我的ç€è¦½å™¨ä»¥å¯Ÿçœ‹æˆ‘的帳戶æ·å²ç´€éŒ„" name="okcancelignore" notext="å–消" yestext="å‰å¾€é é¢"/> </notification> <notification name="ConfirmQuit"> - Are you sure you want to quit? - <usetemplate ignoretext="Confirm before I quit" name="okcancelignore" notext="Don't Quit" yestext="Quit"/> + ä½ ç¢ºå®šä½ è¦çµæŸé€€å‡ºï¼Ÿ + <usetemplate ignoretext="當我çµæŸé€€å‡ºæ™‚進行確èª" name="okcancelignore" notext="ä¸çµæŸé€€å‡º" yestext="çµæŸé€€å‡º"/> </notification> <notification name="DeleteItems"> [QUESTION] - <usetemplate ignoretext="Confirm before deleting items" name="okcancelignore" notext="å–銷" yestext="確定"/> + <usetemplate ignoretext="Confirm before deleting items" name="okcancelignore" notext="å–消" yestext="確定"/> </notification> <notification name="HelpReportAbuseEmailLL"> Use this tool to report violations of the [http://secondlife.com/corporate/tos.php Terms of Service] and [http://secondlife.com/corporate/cs.php Community Standards]. @@ -1947,38 +1947,38 @@ Do you want to replace it with the selected object? <form name="form"> <ignore name="ignore" text="Replace an existing attachment with the selected item"/> <button ignore="自動å–代" name="Yes" text="確定"/> - <button ignore="絕ä¸å–代" name="No" text="å–銷"/> + <button ignore="絕ä¸å–代" name="No" text="å–消"/> </form> </notification> - <notification label="Busy Mode Warning" name="BusyModePay"> + <notification label="忙碌模å¼è¦å‘Š" name="BusyModePay"> You are in Busy Mode, which means you will not receive any items offered in exchange for this payment. Would you like to leave Busy Mode before completing this transaction? <form name="form"> <ignore name="ignore" text="I am about to pay a person or object while I am in Busy mode"/> <button ignore="Always leave Busy Mode" name="Yes" text="確定"/> - <button ignore="Never leave Busy Mode" name="No" text="å–銷"/> + <button ignore="Never leave Busy Mode" name="No" text="å–消"/> </form> </notification> <notification name="ConfirmDeleteProtectedCategory"> The folder '[FOLDERNAME]' is a system folder. Deleting system folders can cause instability. Are you sure you want to delete it? - <usetemplate ignoretext="Confirm before I delete a system folder" name="okcancelignore" notext="å–銷" yestext="確定"/> + <usetemplate ignoretext="Confirm before I delete a system folder" name="okcancelignore" notext="å–消" yestext="確定"/> </notification> <notification name="ConfirmEmptyTrash"> Are you sure you want to permanently delete the contents of your Trash? - <usetemplate ignoretext="Confirm before I empty the inventory Trash folder" name="okcancelignore" notext="å–銷" yestext="確定"/> + <usetemplate ignoretext="Confirm before I empty the inventory Trash folder" name="okcancelignore" notext="å–消" yestext="確定"/> </notification> <notification name="ConfirmClearBrowserCache"> Are you sure you want to delete your travel, web, and search history? - <usetemplate name="okcancelbuttons" notext="å–銷" yestext="確定"/> + <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/> </notification> <notification name="ConfirmClearCookies"> Are you sure you want to clear your cookies? - <usetemplate name="okcancelbuttons" notext="å–銷" yestext="是"/> + <usetemplate name="okcancelbuttons" notext="å–消" yestext="是"/> </notification> <notification name="ConfirmClearMediaUrlList"> Are you sure you want to clear your list of saved URLs? - <usetemplate name="okcancelbuttons" notext="å–銷" yestext="是"/> + <usetemplate name="okcancelbuttons" notext="å–消" yestext="是"/> </notification> <notification name="ConfirmEmptyLostAndFound"> Are you sure you want to permanently delete the contents of your Lost And Found? @@ -2018,7 +2018,7 @@ Link to this from a web page to give others easy access to this location, or try New Preset </input> <button name="OK" text="確定"/> - <button name="Cancel" text="å–銷"/> + <button name="Cancel" text="å–消"/> </form> </notification> <notification name="ExistsSkyPresetAlert"> @@ -2031,7 +2031,7 @@ Link to this from a web page to give others easy access to this location, or try New Preset </input> <button name="OK" text="確定"/> - <button name="Cancel" text="å–銷"/> + <button name="Cancel" text="å–消"/> </form> </notification> <notification name="ExistsWaterPresetAlert"> @@ -2041,7 +2041,7 @@ Link to this from a web page to give others easy access to this location, or try You cannot edit or delete a default preset. </notification> <notification name="ChatterBoxSessionStartError"> - Unable to start a new chat session with [RECIPIENT]. + 無法開始一個與 [RECIPIENT] 他的新èŠå¤©æœƒè©±ã€‚ [REASON] <usetemplate name="okbutton" yestext="確定"/> </notification> @@ -2051,7 +2051,7 @@ Link to this from a web page to give others easy access to this location, or try <usetemplate name="okbutton" yestext="確定"/> </notification> <notification name="ForceCloseChatterBoxSession"> - Your chat session with [NAME] must close. + ä½ èˆ‡ [NAME] çš„èŠå¤©æœƒè©±å¿…é ˆé—œé–‰ã€‚ [REASON] <usetemplate name="okbutton" yestext="確定"/> </notification> @@ -2255,7 +2255,7 @@ Try selecting a smaller piece of land. [DATE] <form name="form"> <button name="Details" text="Details"/> - <button name="Cancel" text="å–銷"/> + <button name="Cancel" text="å–消"/> </form> </notification> <notification name="TransferObjectsHighlighted"> @@ -2374,7 +2374,7 @@ Please go to the Knowledge Base for details on accessing areas with this maturit Could not teleport closer to destination. </notification> <notification name="TPCancelled"> - 瞬間傳é€å·²å–銷。 + 瞬間傳é€å·²å–消。 </notification> <notification name="FullRegionTryAgain"> The region you are attempting to enter is currently full. @@ -2453,7 +2453,7 @@ Please try again in a few moments. [MESSAGE] - [MATURITY_STR] <icon>[MATURITY_ICON]</icon> <form name="form"> <button name="Teleport" text="瞬間傳é€"/> - <button name="Cancel" text="å–銷"/> + <button name="Cancel" text="å–消"/> </form> </notification> <notification name="TeleportOfferSent"> @@ -2463,8 +2463,8 @@ Please try again in a few moments. [MESSAGE] [URL] <form name="form"> - <button name="Later" text="Later"/> - <button name="GoNow..." text="Go Now..."/> + <button name="Later" text="ç¨å€™"/> + <button name="GoNow..." text="ç«‹å³å‰å¾€..."/> </form> </notification> <notification name="OfferFriendship"> @@ -2525,8 +2525,8 @@ If you stay in this region you will be logged out. From object: <nolink>[OBJECTNAME]</nolink>, owner: [NAME]? <form name="form"> - <button name="Gotopage" text="Go to page"/> - <button name="Cancel" text="å–銷"/> + <button name="Gotopage" text="å‰å¾€é é¢"/> + <button name="Cancel" text="å–消"/> </form> </notification> <notification name="FailedToFindWearableUnnamed"> @@ -2714,7 +2714,7 @@ They will be blocked for a few seconds for your security. </notification> <notification name="ConfirmCloseAll"> Are you sure you want to close all IMs? - <usetemplate ignoretext="Confirm before I close all IMs" name="okcancelignore" notext="å–銷" yestext="確定"/> + <usetemplate ignoretext="Confirm before I close all IMs" name="okcancelignore" notext="å–消" yestext="確定"/> </notification> <notification name="AttachmentSaved"> Attachment has been saved. @@ -2737,7 +2737,7 @@ They will be blocked for a few seconds for your security. </notification> <notification name="ConfirmClearTeleportHistory"> Are you sure you want to delete your teleport history? - <usetemplate name="okcancelbuttons" notext="å–銷" yestext="確定"/> + <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/> </notification> <notification name="BottomTrayButtonCanNotBeShown"> Selected button can not be shown right now. @@ -2754,7 +2754,7 @@ The button will be shown when there is enough space for it. With the following Residents: [RESIDENTS] - <usetemplate name="okcancelbuttons" notext="å–銷" yestext="確定"/> + <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/> </notification> <notification name="ItemsShared"> Items successfully shared. @@ -2831,7 +2831,7 @@ This will also cause all residents that later join the call to be muted, even after you have left the call. Mute everyone? - <usetemplate ignoretext="Confirm before I mute all participants in a group call" name="okcancelignore" notext="å–銷" yestext="確定"/> + <usetemplate ignoretext="Confirm before I mute all participants in a group call" name="okcancelignore" notext="å–消" yestext="確定"/> </notification> <notification label="èŠå¤©" name="HintChat"> To join the conversation, type into the chat field below. @@ -2887,40 +2887,40 @@ Click and drag anywhere on the world to rotate your view <input name="username" text="User Name"/> <input name="password" text="Password"/> <button name="ok" text="Submit"/> - <button name="cancel" text="å–銷"/> + <button name="cancel" text="å–消"/> </form> </notification> <notification label="" name="ModeChange"> - Changing modes requires you to quit and restart. - <usetemplate name="okcancelbuttons" notext="Don't Quit" yestext="Quit"/> + 改變劉覽器模å¼è¦æ±‚ä½ å¿…é ˆçµæŸé€€å‡ºä¸¦é‡æ–°å•Ÿå‹•ã€‚ + <usetemplate name="okcancelbuttons" notext="ä¸çµæŸé€€å‡º" yestext="çµæŸé€€å‡º"/> </notification> <notification label="" name="NoClassifieds"> Creation and editing of Classifieds is only available in Advanced mode. Would you like to quit and change modes? The mode selector can be found on the login screen. - <usetemplate name="okcancelbuttons" notext="Don't Quit" yestext="Quit"/> + <usetemplate name="okcancelbuttons" notext="ä¸çµæŸé€€å‡º" yestext="çµæŸé€€å‡º"/> </notification> <notification label="" name="NoGroupInfo"> Creation and editing of Groups is only available in Advanced mode. Would you like to quit and change modes? The mode selector can be found on the login screen. - <usetemplate name="okcancelbuttons" notext="Don't Quit" yestext="Quit"/> + <usetemplate name="okcancelbuttons" notext="ä¸çµæŸé€€å‡º" yestext="çµæŸé€€å‡º"/> </notification> <notification label="" name="NoPicks"> Creation and editing of Picks is only available in Advanced mode. Would you like to quit and change modes? The mode selector can be found on the login screen. - <usetemplate name="okcancelbuttons" notext="Don't Quit" yestext="Quit"/> + <usetemplate name="okcancelbuttons" notext="ä¸çµæŸé€€å‡º" yestext="çµæŸé€€å‡º"/> </notification> <notification label="" name="NoWorldMap"> Viewing of the world map is only available in Advanced mode. Would you like to quit and change modes? The mode selector can be found on the login screen. - <usetemplate name="okcancelbuttons" notext="Don't Quit" yestext="Quit"/> + <usetemplate name="okcancelbuttons" notext="ä¸çµæŸé€€å‡º" yestext="çµæŸé€€å‡º"/> </notification> <notification label="" name="NoVoiceCall"> Voice calls are only available in Advanced mode. Would you like to logout and change modes? - <usetemplate name="okcancelbuttons" notext="Don't Quit" yestext="Quit"/> + <usetemplate name="okcancelbuttons" notext="ä¸çµæŸé€€å‡º" yestext="çµæŸé€€å‡º"/> </notification> <notification label="" name="NoAvatarShare"> Sharing is only available in Advanced mode. Would you like to logout and change modes? - <usetemplate name="okcancelbuttons" notext="Don't Quit" yestext="Quit"/> + <usetemplate name="okcancelbuttons" notext="ä¸çµæŸé€€å‡º" yestext="çµæŸé€€å‡º"/> </notification> <notification label="" name="NoAvatarPay"> Paying other residents is only available in Advanced mode. Would you like to logout and change modes? - <usetemplate name="okcancelbuttons" notext="Don't Quit" yestext="Quit"/> + <usetemplate name="okcancelbuttons" notext="ä¸çµæŸé€€å‡º" yestext="çµæŸé€€å‡º"/> </notification> <global name="UnsupportedCPU"> - Your CPU speed does not meet the minimum requirements. @@ -2937,7 +2937,7 @@ If you continue to have problems, please visit the [SUPPORT_SITE]. 510 </global> <global name="UnsupportedGPU"> - - Your graphics card does not meet the minimum requirements. + - ä½ çš„é¡¯ç¤ºå¡æœªé”系統最低é…å‚™è¦æ±‚。 </global> <global name="UnsupportedRAM"> - Your system memory does not meet the minimum requirements. diff --git a/indra/newview/skins/default/xui/zh/panel_adhoc_control_panel.xml b/indra/newview/skins/default/xui/zh/panel_adhoc_control_panel.xml index c9e47984e222153144f35d2d01a764b352003cfa..7d16ac4129c2e592447635df1d9523fa84325e9a 100644 --- a/indra/newview/skins/default/xui/zh/panel_adhoc_control_panel.xml +++ b/indra/newview/skins/default/xui/zh/panel_adhoc_control_panel.xml @@ -5,7 +5,7 @@ <button label="通話" name="call_btn"/> </layout_panel> <layout_panel name="end_call_btn_panel"> - <button label="Leave Call" name="end_call_btn"/> + <button label="離開通話" name="end_call_btn"/> </layout_panel> <layout_panel name="voice_ctrls_btn_panel"> <button label="語音控制" name="voice_ctrls_btn"/> diff --git a/indra/newview/skins/default/xui/zh/panel_avatar_list_item.xml b/indra/newview/skins/default/xui/zh/panel_avatar_list_item.xml index 23b76eea9be90a7a818d11b4c106f712647aad58..eccb938f150d796fd9469e33f0984b2fc3c06f97 100644 --- a/indra/newview/skins/default/xui/zh/panel_avatar_list_item.xml +++ b/indra/newview/skins/default/xui/zh/panel_avatar_list_item.xml @@ -21,7 +21,7 @@ <string name="FormatYears"> [COUNT]y </string> - <text name="avatar_name" value="(loading)"/> + <text name="avatar_name" value="(載入)"/> <text name="last_interaction" value="0s"/> <icon name="permission_edit_theirs_icon" tool_tip="ä½ ä¸èƒ½ç·¨è¼¯é€™ä½æœ‹å‹çš„物件"/> <icon name="permission_edit_mine_icon" tool_tip="這ä½æœ‹å‹èƒ½ç·¨è¼¯ã€åˆªé™¤æˆ–å–å¾—ä½ çš„ç‰©ä»¶"/> diff --git a/indra/newview/skins/default/xui/zh/panel_body_parts_list_item.xml b/indra/newview/skins/default/xui/zh/panel_body_parts_list_item.xml index 1fb0f210fe89e034b922acf91ff39a23bd2e5559..550868e5e5e22d0dcec20f11d58b7d7a0d165858 100644 --- a/indra/newview/skins/default/xui/zh/panel_body_parts_list_item.xml +++ b/indra/newview/skins/default/xui/zh/panel_body_parts_list_item.xml @@ -1,8 +1,8 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="wearable_item"> <text name="item_name" value="..."/> - <panel name="btn_lock" tool_tip="You don't have permission to edit"/> + <panel name="btn_lock" tool_tip="ä½ ä¸¦æ²’æœ‰æ¬Šé™é€²è¡Œç·¨è¼¯"/> <panel name="btn_edit_panel"> - <button name="btn_edit" tool_tip="Edit this shape"/> + <button name="btn_edit" tool_tip="編輯這個體形"/> </panel> </panel> diff --git a/indra/newview/skins/default/xui/zh/panel_bottomtray.xml b/indra/newview/skins/default/xui/zh/panel_bottomtray.xml index 4c0174559efcc09c03c7d34c472bb3d931864fc0..2b0cd7c0a65568b6c7645982d87d8563ad34b2f6 100644 --- a/indra/newview/skins/default/xui/zh/panel_bottomtray.xml +++ b/indra/newview/skins/default/xui/zh/panel_bottomtray.xml @@ -10,7 +10,7 @@ </talk_button> </layout_panel> <layout_panel name="gesture_panel"> - <gesture_combo_list label="Gesture" name="Gesture" tool_tip="顯示 / éš±è— å§¿å‹¢"/> + <gesture_combo_list label="姿勢" name="Gesture" tool_tip="顯示 / éš±è— å§¿å‹¢"/> </layout_panel> <layout_panel name="movement_panel"> <bottomtray_button label="移動" name="movement_btn" tool_tip="顯示 / éš±è— ç§»å‹•æŽ§åˆ¶"/> diff --git a/indra/newview/skins/default/xui/zh/panel_bottomtray_lite.xml b/indra/newview/skins/default/xui/zh/panel_bottomtray_lite.xml index 22f3731a6f5ee865ec7436964b1cd0ac9dda0286..9833e9ef8b6140e62c8cd27e965b8d07ab1bc095 100644 --- a/indra/newview/skins/default/xui/zh/panel_bottomtray_lite.xml +++ b/indra/newview/skins/default/xui/zh/panel_bottomtray_lite.xml @@ -2,7 +2,7 @@ <panel name="bottom_tray_lite"> <layout_stack name="toolbar_stack_lite"> <layout_panel name="gesture_panel"> - <gesture_combo_list label="Gesture" name="Gesture" tool_tip="顯示 / éš±è— å§¿å‹¢"/> + <gesture_combo_list label="姿勢" name="Gesture" tool_tip="顯示 / éš±è— å§¿å‹¢"/> </layout_panel> </layout_stack> </panel> diff --git a/indra/newview/skins/default/xui/zh/panel_clothing_list_button_bar.xml b/indra/newview/skins/default/xui/zh/panel_clothing_list_button_bar.xml index 7a74f07743c272392cd0fc3828fc3c5815ef9577..ba63dada760477193f79279e807a1d155bd6dbcd 100644 --- a/indra/newview/skins/default/xui/zh/panel_clothing_list_button_bar.xml +++ b/indra/newview/skins/default/xui/zh/panel_clothing_list_button_bar.xml @@ -1,4 +1,4 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="clothing_list_button_bar_panel"> - <button label="Add +" name="add_btn"/> + <button label="æ·»åŠ +" name="add_btn"/> </panel> diff --git a/indra/newview/skins/default/xui/zh/panel_edit_classified.xml b/indra/newview/skins/default/xui/zh/panel_edit_classified.xml index 9478ec49a6a9c8a19cb6df3c626acd3b16386c45..e749d9e3e7de0d294148372e49429133c10f3c15 100644 --- a/indra/newview/skins/default/xui/zh/panel_edit_classified.xml +++ b/indra/newview/skins/default/xui/zh/panel_edit_classified.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Edit Classified" name="panel_edit_classified"> <panel.string name="location_notice"> - (will update after save) + (儲å˜å¾Œå°‡æœƒæ›´æ–°ï¼‰ </panel.string> <string name="publish_label"> Publish @@ -15,7 +15,7 @@ <scroll_container name="profile_scroll"> <panel name="scroll_content_panel"> <panel name="snapshot_panel"> - <icon label="" name="edit_icon" tool_tip="Click to select an image"/> + <icon label="" name="edit_icon" tool_tip="點擊以é¸æ“‡åœ–åƒ"/> </panel> <text name="Name:"> Title: @@ -47,7 +47,7 @@ <button label="[LABEL]" name="save_changes_btn"/> </layout_panel> <layout_panel name="show_on_map_btn_lp"> - <button label="å–銷" name="cancel_btn"/> + <button label="å–消" name="cancel_btn"/> </layout_panel> </layout_stack> </panel> diff --git a/indra/newview/skins/default/xui/zh/panel_edit_hair.xml b/indra/newview/skins/default/xui/zh/panel_edit_hair.xml index 0578fe9ef19a492823c34e76257a6b90af8664cb..d9ddafac3b2c57b8871ba8d280c78e8f0a502a30 100644 --- a/indra/newview/skins/default/xui/zh/panel_edit_hair.xml +++ b/indra/newview/skins/default/xui/zh/panel_edit_hair.xml @@ -5,7 +5,7 @@ </panel> <panel name="accordion_panel"> <accordion name="wearable_accordion"> - <accordion_tab name="hair_color_tab" title="Color"/> + <accordion_tab name="hair_color_tab" title="é¡è‰²"/> <accordion_tab name="hair_style_tab" title="Style"/> <accordion_tab name="hair_eyebrows_tab" title="Eyebrows"/> <accordion_tab name="hair_facial_tab" title="Facial"/> diff --git a/indra/newview/skins/default/xui/zh/panel_edit_pants.xml b/indra/newview/skins/default/xui/zh/panel_edit_pants.xml index b453fdc7581be25436bd5d26cfb9362c9841395e..76560256f7a73e4669146592fe0d51e2b052beb9 100644 --- a/indra/newview/skins/default/xui/zh/panel_edit_pants.xml +++ b/indra/newview/skins/default/xui/zh/panel_edit_pants.xml @@ -2,7 +2,7 @@ <panel name="edit_pants_panel"> <panel name="avatar_pants_color_panel"> <texture_picker label="æ質" name="Fabric" tool_tip="點擊以挑é¸åœ–片"/> - <color_swatch label="Color/Tint" name="Color/Tint" tool_tip="Click to open color picker"/> + <color_swatch label="Color/Tint" name="Color/Tint" tool_tip="點擊以開啟é¡è‰²æŒ‘é¸å™¨"/> </panel> <panel name="accordion_panel"> <accordion name="wearable_accordion"> diff --git a/indra/newview/skins/default/xui/zh/panel_edit_pick.xml b/indra/newview/skins/default/xui/zh/panel_edit_pick.xml index 2dd0ed2015614a066ff93d66d35458ae05c9b732..6ac7226185a51848f5a47c7ca9ee7dc570c540d6 100644 --- a/indra/newview/skins/default/xui/zh/panel_edit_pick.xml +++ b/indra/newview/skins/default/xui/zh/panel_edit_pick.xml @@ -1,16 +1,16 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel label="Edit Pick" name="panel_edit_pick"> +<panel label="編輯精é¸åœ°é»ž" name="panel_edit_pick"> <panel.string name="location_notice"> - (will update after save) + (將在儲å˜å¾Œæ›´æ–°ï¼‰ </panel.string> <text name="title"> - Edit Pick + 編輯精é¸åœ°é»ž </text> <scroll_container name="profile_scroll"> <panel name="scroll_content_panel"> - <icon label="" name="edit_icon" tool_tip="Click to select an image"/> + <icon label="" name="edit_icon" tool_tip="點擊以é¸æ“‡åœ–åƒ"/> <text name="Name:"> - Title: + 標題: </text> <text name="description_label"> æ述: @@ -21,16 +21,16 @@ <text name="pick_location"> 載入ä¸... </text> - <button label="Set to Current Location" name="set_to_curr_location_btn"/> + <button label="è¨å®šç‚ºç›®å‰ä½ç½®" name="set_to_curr_location_btn"/> </panel> </scroll_container> <panel label="bottom_panel" name="bottom_panel"> <layout_stack name="layout_stack1"> <layout_panel name="layout_panel1"> - <button label="Save Pick" name="save_changes_btn"/> + <button label="儲å˜ç²¾é¸åœ°é»ž" name="save_changes_btn"/> </layout_panel> <layout_panel name="layout_panel1"> - <button label="å–銷" name="cancel_btn"/> + <button label="å–消" name="cancel_btn"/> </layout_panel> </layout_stack> </panel> diff --git a/indra/newview/skins/default/xui/zh/panel_edit_profile.xml b/indra/newview/skins/default/xui/zh/panel_edit_profile.xml index 7fb8392836b9b5130891fa9a4a9009b83791c8ec..2258e51b856a1eea56857d47c1995d4e2b5dfb55 100644 --- a/indra/newview/skins/default/xui/zh/panel_edit_profile.xml +++ b/indra/newview/skins/default/xui/zh/panel_edit_profile.xml @@ -27,31 +27,31 @@ <panel name="scroll_content_panel"> <panel name="data_panel"> <text name="display_name_label" value="Display Name:"/> - <text name="solo_username_label" value="Username:"/> + <text name="solo_username_label" value="使用者å稱:"/> <button name="set_name" tool_tip="Set Display Name"/> - <text name="user_label" value="Username:"/> + <text name="user_label" value="使用者å稱:"/> <panel name="lifes_images_panel"> <panel name="second_life_image_panel"> <text name="second_life_photo_title_text" value="[SECOND_LIFE]:"/> </panel> - <icon label="" name="2nd_life_edit_icon" tool_tip="Click to select an image"/> + <icon label="" name="2nd_life_edit_icon" tool_tip="點擊以é¸æ“‡åœ–åƒ"/> </panel> <panel name="first_life_image_panel"> <text name="real_world_photo_title_text" value="真實世界:"/> </panel> - <icon label="" name="real_world_edit_icon" tool_tip="Click to select an image"/> + <icon label="" name="real_world_edit_icon" tool_tip="點擊以é¸æ“‡åœ–åƒ"/> <text name="title_homepage_text"> 首é : </text> <line_editor name="homepage_edit" value="http://"/> - <text name="title_acc_status_text" value="My Account:"/> + <text name="title_acc_status_text" value="我的帳戶:"/> <text_editor name="acc_status_text" value="Resident. No payment info on file."/> - <text name="my_account_link" value="[[URL] Go to My Dashboard]"/> + <text name="my_account_link" value="[[URL] å‰å¾€æˆ‘的塗鴉牆]"/> <text name="title_partner_text" value="我的é…å¶ï¼š"/> <panel name="partner_data_panel"> <text initial_value="(retrieving)" name="partner_text"/> </panel> - <text name="partner_edit_link" value="[[URL] Edit]"/> + <text name="partner_edit_link" value="[[URL] 編輯]"/> </panel> </panel> </scroll_container> @@ -61,7 +61,7 @@ <button label="儲å˜è®Šæ›´" name="save_btn"/> </layout_panel> <layout_panel name="show_on_map_btn_lp"> - <button label="å–銷" name="cancel_btn"/> + <button label="å–消" name="cancel_btn"/> </layout_panel> </layout_stack> </panel> diff --git a/indra/newview/skins/default/xui/zh/panel_edit_shape.xml b/indra/newview/skins/default/xui/zh/panel_edit_shape.xml index da6049ea7568a7344db441de021e90d90f676301..f249100786f41ace8a3f48a4035da26cc58132c2 100644 --- a/indra/newview/skins/default/xui/zh/panel_edit_shape.xml +++ b/indra/newview/skins/default/xui/zh/panel_edit_shape.xml @@ -1,25 +1,25 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="edit_shape_panel"> <string name="meters"> - Meters + 公尺 </string> <string name="feet"> - Feet + 英呎 </string> <string name="height"> - Height: + 身高: </string> <panel label="襯衫" name="accordion_panel"> <accordion name="wearable_accordion"> - <accordion_tab name="shape_body_tab" title="Body"/> - <accordion_tab name="shape_head_tab" title="Head"/> + <accordion_tab name="shape_body_tab" title="身體"/> + <accordion_tab name="shape_head_tab" title="é 部"/> <accordion_tab name="shape_eyes_tab" title="眼ç›"/> - <accordion_tab name="shape_ears_tab" title="Ears"/> - <accordion_tab name="shape_nose_tab" title="Nose"/> - <accordion_tab name="shape_mouth_tab" title="Mouth"/> - <accordion_tab name="shape_chin_tab" title="Chin"/> - <accordion_tab name="shape_torso_tab" title="Torso"/> - <accordion_tab name="shape_legs_tab" title="Legs"/> + <accordion_tab name="shape_ears_tab" title="耳朵"/> + <accordion_tab name="shape_nose_tab" title="é¼»å"/> + <accordion_tab name="shape_mouth_tab" title="嘴巴"/> + <accordion_tab name="shape_chin_tab" title="下巴"/> + <accordion_tab name="shape_torso_tab" title="軀幹"/> + <accordion_tab name="shape_legs_tab" title="腿部"/> </accordion> </panel> </panel> diff --git a/indra/newview/skins/default/xui/zh/panel_edit_shirt.xml b/indra/newview/skins/default/xui/zh/panel_edit_shirt.xml index 321fb68756b73fe4c52671535b6998a48be635ae..ecfc1e2fad29523f453588d0f980ae5203b265fe 100644 --- a/indra/newview/skins/default/xui/zh/panel_edit_shirt.xml +++ b/indra/newview/skins/default/xui/zh/panel_edit_shirt.xml @@ -2,7 +2,7 @@ <panel name="edit_shirt_panel"> <panel name="avatar_shirt_color_panel"> <texture_picker label="æ質" name="Fabric" tool_tip="點擊以挑é¸åœ–片"/> - <color_swatch label="Color/Tint" name="Color/Tint" tool_tip="Click to open color picker"/> + <color_swatch label="Color/Tint" name="Color/Tint" tool_tip="點擊以開啟é¡è‰²æŒ‘é¸å™¨"/> </panel> <panel name="accordion_panel"> <accordion name="wearable_accordion"> diff --git a/indra/newview/skins/default/xui/zh/panel_edit_skirt.xml b/indra/newview/skins/default/xui/zh/panel_edit_skirt.xml index 096a83c87165ecd0f747e2bbb1efff3378ef61f2..5c46f94fe948956751ccbe955410372a2b6a270e 100644 --- a/indra/newview/skins/default/xui/zh/panel_edit_skirt.xml +++ b/indra/newview/skins/default/xui/zh/panel_edit_skirt.xml @@ -2,7 +2,7 @@ <panel name="edit_skirt_panel"> <panel name="avatar_skirt_color_panel"> <texture_picker label="æ質" name="Fabric" tool_tip="點擊以挑é¸åœ–片"/> - <color_swatch label="Color/Tint" name="Color/Tint" tool_tip="Click to open color picker"/> + <color_swatch label="Color/Tint" name="Color/Tint" tool_tip="點擊以開啟é¡è‰²æŒ‘é¸å™¨"/> </panel> <panel name="accordion_panel"> <accordion name="wearable_accordion"> diff --git a/indra/newview/skins/default/xui/zh/panel_edit_socks.xml b/indra/newview/skins/default/xui/zh/panel_edit_socks.xml index dab132bad2df5ead414e5ac2628b986cf244daa9..09c888f226e98aefcda9799a3546aaa6ffe6425b 100644 --- a/indra/newview/skins/default/xui/zh/panel_edit_socks.xml +++ b/indra/newview/skins/default/xui/zh/panel_edit_socks.xml @@ -2,7 +2,7 @@ <panel name="edit_socks_panel"> <panel name="avatar_socks_color_panel"> <texture_picker label="æ質" name="Fabric" tool_tip="點擊以挑é¸åœ–片"/> - <color_swatch label="Color/Tint" name="Color/Tint" tool_tip="Click to open color picker"/> + <color_swatch label="Color/Tint" name="Color/Tint" tool_tip="點擊以開啟é¡è‰²æŒ‘é¸å™¨"/> </panel> <panel name="accordion_panel"> <accordion name="wearable_accordion"> diff --git a/indra/newview/skins/default/xui/zh/panel_edit_tattoo.xml b/indra/newview/skins/default/xui/zh/panel_edit_tattoo.xml index d183e6897d5c9cc155e4808a531ad37459a60625..946f8b22dce8f731375f33a39309c7ef27acf13b 100644 --- a/indra/newview/skins/default/xui/zh/panel_edit_tattoo.xml +++ b/indra/newview/skins/default/xui/zh/panel_edit_tattoo.xml @@ -1,9 +1,9 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="edit_tattoo_panel"> <panel name="avatar_tattoo_color_panel"> - <texture_picker label="Head Tattoo" name="Head Tattoo" tool_tip="點擊以挑é¸åœ–片"/> - <texture_picker label="Upper Tattoo" name="Upper Tattoo" tool_tip="Click to choose a picture"/> - <texture_picker label="Lower Tattoo" name="Lower Tattoo" tool_tip="點擊以挑é¸åœ–片"/> - <color_swatch label="Color/Tint" name="Color/Tint" tool_tip="Click to open color picker"/> + <texture_picker label="é 部刺é’" name="Head Tattoo" tool_tip="點擊以挑é¸åœ–片"/> + <texture_picker label="上åŠèº«åˆºé’" name="Upper Tattoo" tool_tip="點擊以挑é¸ç…§ç‰‡"/> + <texture_picker label="下åŠèº«åˆºé’" name="Lower Tattoo" tool_tip="點擊以挑é¸åœ–片"/> + <color_swatch label="Color/Tint" name="Color/Tint" tool_tip="點擊以開啟é¡è‰²æŒ‘é¸å™¨"/> </panel> </panel> diff --git a/indra/newview/skins/default/xui/zh/panel_edit_wearable.xml b/indra/newview/skins/default/xui/zh/panel_edit_wearable.xml index 21b5c1c6980cb4506e0811c7087e3230ae24bc2a..936a2651ab338148ea63b80e07dbeee3b880320e 100644 --- a/indra/newview/skins/default/xui/zh/panel_edit_wearable.xml +++ b/indra/newview/skins/default/xui/zh/panel_edit_wearable.xml @@ -49,16 +49,16 @@ Editing Physics </string> <string name="shape_desc_text"> - Shape: + 體形: </string> <string name="skin_desc_text"> - Skin: + 皮膚: </string> <string name="hair_desc_text"> - Hair: + é 髮: </string> <string name="eyes_desc_text"> - Eyes: + 眼ç›ï¼š </string> <string name="shirt_desc_text"> 襯衫: @@ -97,15 +97,15 @@ Physics: </string> <labeled_back_button label="儲å˜" name="back_btn" tool_tip="回到編輯è£æ‰®"/> - <text name="edit_wearable_title" value="Editing Shape"/> + <text name="edit_wearable_title" value="體形編輯ä¸"/> <panel label="襯衫" name="wearable_type_panel"> - <text name="description_text" value="Shape:"/> + <text name="description_text" value="體形:"/> <radio_group name="sex_radio"> <radio_item label="" name="sex_male" tool_tip="男性" value="1"/> - <radio_item label="" name="sex_female" tool_tip="Female" value="0"/> + <radio_item label="" name="sex_female" tool_tip="女性" value="0"/> </radio_group> <icon name="male_icon" tool_tip="男性"/> - <icon name="female_icon" tool_tip="Female"/> + <icon name="female_icon" tool_tip="女性"/> </panel> <panel name="button_panel"> <layout_stack name="button_panel_ls"> diff --git a/indra/newview/skins/default/xui/zh/panel_group_general.xml b/indra/newview/skins/default/xui/zh/panel_group_general.xml index 2873d4cabb7a4d1d4a5505b313c194dd1447968d..a97a35056bb1f51d1771204c269ccc074db8758c 100644 --- a/indra/newview/skins/default/xui/zh/panel_group_general.xml +++ b/indra/newview/skins/default/xui/zh/panel_group_general.xml @@ -6,7 +6,7 @@ Hover your mouse over the options for more help. </panel.string> <panel.string name="group_info_unchanged"> - General group information has changed + 一般社團資訊已經被變更 </panel.string> <panel.string name="incomplete_member_data_str"> Retrieving member data @@ -17,7 +17,7 @@ Hover your mouse over the options for more help. 創辦人: </text> <text name="join_cost_text"> - Free + å…è²» </text> <button label="ç¾åœ¨å°±åŠ å…¥!!" name="btn_join"/> </panel> @@ -25,33 +25,33 @@ Hover your mouse over the options for more help. Group Charter </text_editor> <name_list name="visible_members"> - <name_list.columns label="Member" name="name"/> - <name_list.columns label="Title" name="title"/> - <name_list.columns label="Status" name="status"/> + <name_list.columns label="æˆå“¡" name="name"/> + <name_list.columns label="é 銜" name="title"/> + <name_list.columns label="狀態" name="status"/> </name_list> <text name="my_group_settngs_label"> 自己 </text> <text name="active_title_label"> - My title: + 我的é 銜: </text> <combo_box name="active_title" tool_tip="Sets the title that appears in your avatar's name tag when this group is active."/> - <check_box label="Receive group notices" name="receive_notices" tool_tip="Sets whether you want to receive Notices from this group. Uncheck this box if this group is spamming you."/> + <check_box label="接å—社團通知" name="receive_notices" tool_tip="Sets whether you want to receive Notices from this group. Uncheck this box if this group is spamming you."/> <check_box label="顯示在我的檔案ä¸" name="list_groups_in_profile" tool_tip="Sets whether you want to show this group in your profile"/> <panel name="preferences_container"> <text name="group_settngs_label"> 社團 </text> - <check_box label="Anyone can join" name="open_enrollement" tool_tip="Sets whether this group allows new members to join without being invited."/> - <check_box label="Cost to join" name="check_enrollment_fee" tool_tip="Sets whether to require an enrollment fee to join the group"/> + <check_box label="任何人都å¯ä»¥åŠ å…¥" name="open_enrollement" tool_tip="Sets whether this group allows new members to join without being invited."/> + <check_box label="åŠ å…¥è²»ç”¨" name="check_enrollment_fee" tool_tip="Sets whether to require an enrollment fee to join the group"/> <spinner label="L$" name="spin_enrollment_fee" tool_tip="New members must pay this fee to join the group when Enrollment Fee is checked."/> <combo_box name="group_mature_check" tool_tip="Sets whether your group contains information rated as Moderate"> <combo_item name="select_mature"> - - Select maturity rating - + - é¸æ“‡å…§å®¹åˆ†ç´š - </combo_item> <combo_box.item label="Moderate Content" name="mature"/> - <combo_box.item label="General Content" name="pg"/> + <combo_box.item label="一般內容" name="pg"/> </combo_box> - <check_box initial_value="true" label="Show in search" name="show_in_group_list" tool_tip="Let people see this group in search results"/> + <check_box initial_value="true" label="顯示在æœå°‹ä¸" name="show_in_group_list" tool_tip="Let people see this group in search results"/> </panel> </panel> diff --git a/indra/newview/skins/default/xui/zh/panel_group_info_sidetray.xml b/indra/newview/skins/default/xui/zh/panel_group_info_sidetray.xml index 4c65d2484cfdeb0d47273aef84dba786c5ce3f36..320645ea5e2650892862bc0b55ccaa013c2445b0 100644 --- a/indra/newview/skins/default/xui/zh/panel_group_info_sidetray.xml +++ b/indra/newview/skins/default/xui/zh/panel_group_info_sidetray.xml @@ -20,9 +20,9 @@ <layout_panel name="group_accordions"> <accordion name="groups_accordion"> <accordion_tab name="group_general_tab" title="一般"/> - <accordion_tab name="group_roles_tab" title="Roles"/> - <accordion_tab name="group_notices_tab" title="Notices"/> - <accordion_tab name="group_land_tab" title="Land/Assets"/> + <accordion_tab name="group_roles_tab" title="角色"/> + <accordion_tab name="group_notices_tab" title="通知"/> + <accordion_tab name="group_land_tab" title="土地 / 資產"/> </accordion> </layout_panel> </layout_stack> @@ -35,7 +35,7 @@ </layout_panel> <layout_panel name="btn_apply_lp"> <button label="儲å˜" label_selected="儲å˜" name="btn_apply"/> - <button label="Create Group" name="btn_create" tool_tip="Create a new Group"/> + <button label="å‰µé€ ç¤¾åœ˜" name="btn_create" tool_tip="å‰µé€ ä¸€å€‹æ–°ç¤¾åœ˜"/> </layout_panel> </layout_stack> </panel> diff --git a/indra/newview/skins/default/xui/zh/panel_group_invite.xml b/indra/newview/skins/default/xui/zh/panel_group_invite.xml index c9b17b5d67b79e1df1faf667e1b351c50d19d7b6..a1395f454b86f8d76ab7a1fc21d7f0adc4bf934d 100644 --- a/indra/newview/skins/default/xui/zh/panel_group_invite.xml +++ b/indra/newview/skins/default/xui/zh/panel_group_invite.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel label="Invite a Member" name="invite_panel"> +<panel label="邀請一個æˆå“¡" name="invite_panel"> <panel.string name="confirm_invite_owner_str"> Are you sure you want to invite new owner(s)? This action is permanent! </panel.string> @@ -19,8 +19,8 @@ Choose what Role to assign them to: </text> <combo_box name="role_name" tool_tip="Choose from the list of Roles you are allowed to assign members to"/> - <button label="Send Invitations" name="ok_button"/> - <button label="å–銷" name="cancel_button"/> + <button label="é€å‡ºé‚€è«‹" name="ok_button"/> + <button label="å–消" name="cancel_button"/> <string name="GroupInvitation"> 社團邀請 </string> diff --git a/indra/newview/skins/default/xui/zh/panel_group_land_money.xml b/indra/newview/skins/default/xui/zh/panel_group_land_money.xml index 71f139a3e6478eff408b179e39100b89570efcea..58022c227942c4d1521288b39ea726fe132ce29f 100644 --- a/indra/newview/skins/default/xui/zh/panel_group_land_money.xml +++ b/indra/newview/skins/default/xui/zh/panel_group_land_money.xml @@ -22,9 +22,9 @@ <scroll_list name="group_parcel_list"> <scroll_list.columns label="地段" name="name"/> <scroll_list.columns label="地å€" name="location"/> - <scroll_list.columns label="Type" name="type"/> - <scroll_list.columns label="Area" name="area"/> - <scroll_list.columns label="Hidden" name="hidden"/> + <scroll_list.columns label="é¡žåž‹" name="type"/> + <scroll_list.columns label="å€åŸŸ" name="area"/> + <scroll_list.columns label="éš±è—" name="hidden"/> </scroll_list> <text name="total_contributed_land_label"> Total contribution: diff --git a/indra/newview/skins/default/xui/zh/panel_group_notices.xml b/indra/newview/skins/default/xui/zh/panel_group_notices.xml index b4d7e3608e6c6edd6c905a6a42f5f3ff1429fbb8..65c07e7137d7c186d8e22a6e8a0eb70ed08b8ab8 100644 --- a/indra/newview/skins/default/xui/zh/panel_group_notices.xml +++ b/indra/newview/skins/default/xui/zh/panel_group_notices.xml @@ -1,30 +1,30 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel label="Notices" name="notices_tab"> +<panel label="通知" name="notices_tab"> <panel.string name="help_text"> Notices let you send a message and an optionally attached item. Notices only go to group members in Roles with the ability to receive Notices. You can turn off Notices on the General tab. </panel.string> <panel.string name="no_notices_text"> - There are no past notices + 沒有éŽåŽ»çš„通知 </panel.string> <text name="lbl2"> - Notices are kept for 14 days. -Maximum 200 per group daily + 通知ä¿ç•™ 14 天。 +æ¯å€‹ç¤¾åœ˜ä¸€å¤©æœ€å¤š 200 則 </text> <scroll_list name="notice_list"> - <scroll_list.columns label="Subject" name="subject"/> - <scroll_list.columns label="From" name="from"/> - <scroll_list.columns label="Date" name="date"/> + <scroll_list.columns label="主旨" name="subject"/> + <scroll_list.columns label="ç”±" name="from"/> + <scroll_list.columns label="日期" name="date"/> </scroll_list> <text name="notice_list_none_found"> - None found + 沒發ç¾ã€‚ </text> - <button label="New Notice" name="create_new_notice" tool_tip="Create a new notice"/> + <button label="新通知" name="create_new_notice" tool_tip="建立一個新通知"/> <button name="refresh_notices" tool_tip="Refresh list of notices"/> - <panel label="Create New Notice" name="panel_create_new_notice"> + <panel label="建立新通知" name="panel_create_new_notice"> <text name="lbl"> - Create a Notice + 建立一個通知 </text> <text name="lbl3"> 主旨: @@ -36,26 +36,26 @@ Maximum 200 per group daily 附件: </text> <text name="string"> - Drag and drop item here to attach it: + 將物å“拖曳並丟於æ¤è™•ä»¥æ·»åŠ 為附件: </text> <button label="收ç´å€" name="open_inventory" tool_tip="開啟收ç´å€"/> - <button name="remove_attachment" tool_tip="Remove attachment from your notification"/> - <button label="Send" label_selected="Send" name="send_notice"/> + <button name="remove_attachment" tool_tip="ç”±ä½ çš„é€šçŸ¥ç§»é™¤é™„ä»¶"/> + <button label="é€å‡º" label_selected="é€å‡º" name="send_notice"/> <group_drop_target name="drop_target" tool_tip="Drag an inventory item onto this target box to send it with this notice. You must have permission to copy and transfer the item in order to attach it."/> </panel> - <panel label="View Past Notice" name="panel_view_past_notice"> + <panel label="察看éŽåŽ»çš„通知" name="panel_view_past_notice"> <text name="lbl"> - Archived Notice + å˜æª”的通知 </text> <text name="lbl2"> - To send a new notice, click the + button + è¦é€å‡ºä¸€å€‹æ–°é€šçŸ¥ï¼Œé»žæ“Š + 按鈕 </text> <text name="lbl3"> - Subject: + 主旨: </text> <text name="lbl4"> - Message: + 訊æ¯ï¼š </text> - <button label="Open Attachment" name="open_attachment"/> + <button label="開啟附件" name="open_attachment"/> </panel> </panel> diff --git a/indra/newview/skins/default/xui/zh/panel_group_roles.xml b/indra/newview/skins/default/xui/zh/panel_group_roles.xml index 91f0f4125fd99592ab664eb711b7a508f553865e..fff43838930c0be6167d6e110535fee393e28e5b 100644 --- a/indra/newview/skins/default/xui/zh/panel_group_roles.xml +++ b/indra/newview/skins/default/xui/zh/panel_group_roles.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel label="Members & Roles" name="roles_tab"> +<panel label="æˆå“¡èˆ‡è§’色" name="roles_tab"> <panel.string name="default_needs_apply_text"> There are unsaved changes </panel.string> @@ -7,7 +7,7 @@ Do you want to save your changes? </panel.string> <tab_container name="roles_tab_container"> - <panel label="MEMBERS" name="members_sub_tab" tool_tip="Members"> + <panel label="æˆå“¡" name="members_sub_tab" tool_tip="æˆå“¡"> <panel.string name="help_text"> You can add or remove Roles assigned to Members. Select multiple Members by holding the Ctrl key and @@ -16,16 +16,16 @@ clicking on their names. <panel.string name="donation_area"> [AREA] m² </panel.string> - <filter_editor label="Filter Members" name="filter_input"/> + <filter_editor label="æˆå“¡éŽæ¿¾å™¨" name="filter_input"/> <name_list name="member_list"> - <name_list.columns label="Member" name="name"/> - <name_list.columns label="Donation" name="donated"/> - <name_list.columns label="Status" name="online"/> + <name_list.columns label="æˆå“¡" name="name"/> + <name_list.columns label="æ款" name="donated"/> + <name_list.columns label="狀態" name="online"/> </name_list> - <button label="Invite" name="member_invite"/> - <button label="Eject" name="member_eject"/> + <button label="邀請" name="member_invite"/> + <button label="踢出" name="member_eject"/> </panel> - <panel label="ROLES" name="roles_sub_tab"> + <panel label="角色" name="roles_sub_tab"> <panel.string name="help_text"> Roles have a title and an allowed list of Abilities that Members can perform. Members can belong to @@ -35,21 +35,21 @@ including the Everyone and Owner Roles. <panel.string name="cant_delete_role"> The 'Everyone' and 'Owners' Roles are special and can't be deleted. </panel.string> - <filter_editor label="Filter Roles" name="filter_input"/> + <filter_editor label="角色éŽæ¿¾å™¨" name="filter_input"/> <scroll_list name="role_list"> - <scroll_list.columns label="Role" name="name"/> - <scroll_list.columns label="Title" name="title"/> + <scroll_list.columns label="角色" name="name"/> + <scroll_list.columns label="é 銜" name="title"/> <scroll_list.columns label="#" name="members"/> </scroll_list> - <button label="New Role" name="role_create"/> - <button label="Delete Role" name="role_delete"/> + <button label="新角色" name="role_create"/> + <button label="刪除角色" name="role_delete"/> </panel> - <panel label="ABILITIES" name="actions_sub_tab" tool_tip="You can view an Ability's Description and which Roles and Members can execute the Ability."> + <panel label="能力" name="actions_sub_tab" tool_tip="You can view an Ability's Description and which Roles and Members can execute the Ability."> <panel.string name="help_text"> Abilities allow Members in Roles to do specific things in this group. There's a broad variety of Abilities. </panel.string> - <filter_editor label="Filter Abilities" name="filter_input"/> + <filter_editor label="能力éŽæ¿¾å™¨" name="filter_input"/> <scroll_list name="action_list" tool_tip="Select an Ability to view more details"/> </panel> </tab_container> @@ -67,10 +67,10 @@ things in this group. There's a broad variety of Abilities. 角色å稱 </text> <text name="static3"> - Role Title + 角色é 銜 </text> <text name="static2"> - Description + æè¿° </text> <text name="static4"> Assigned Members diff --git a/indra/newview/skins/default/xui/zh/panel_im_control_panel.xml b/indra/newview/skins/default/xui/zh/panel_im_control_panel.xml index 881f8eac0b819d1b2cdb48ed73a8d45e990e5878..703182e04d39d3b9cf42fa6a48f8df220f0f1f3b 100644 --- a/indra/newview/skins/default/xui/zh/panel_im_control_panel.xml +++ b/indra/newview/skins/default/xui/zh/panel_im_control_panel.xml @@ -14,7 +14,7 @@ <button label="分享" name="share_btn"/> </layout_panel> <layout_panel name="pay_btn_panel"> - <button label="Pay" name="pay_btn"/> + <button label="支付" name="pay_btn"/> </layout_panel> <layout_panel name="call_btn_panel"> <button label="通話" name="call_btn"/> diff --git a/indra/newview/skins/default/xui/zh/panel_landmarks.xml b/indra/newview/skins/default/xui/zh/panel_landmarks.xml index 0ea3ea2226f62232809345bccef8c6ce04ca0f3f..fa907e3d9068f7551255199a92c37020c200a481 100644 --- a/indra/newview/skins/default/xui/zh/panel_landmarks.xml +++ b/indra/newview/skins/default/xui/zh/panel_landmarks.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="Landmarks"> <accordion name="landmarks_accordion"> - <accordion_tab name="tab_favorites" title="Favorites bar"/> + <accordion_tab name="tab_favorites" title="最愛列"/> <accordion_tab name="tab_landmarks" title="我的地標"/> <accordion_tab name="tab_inventory" title="我的收ç´å€"/> <accordion_tab name="tab_library" title="Library"/> diff --git a/indra/newview/skins/default/xui/zh/panel_me.xml b/indra/newview/skins/default/xui/zh/panel_me.xml index abdbfd7429b1807d895b0628646de14e9235781e..a236dfc17abc3dc530da143c519072594c307bee 100644 --- a/indra/newview/skins/default/xui/zh/panel_me.xml +++ b/indra/newview/skins/default/xui/zh/panel_me.xml @@ -2,6 +2,6 @@ <panel label="我的檔案" name="panel_me"> <tab_container name="tabs"> <panel label="我的檔案" name="panel_profile"/> - <panel label="MY PICKS" name="panel_picks"/> + <panel label="我的精é¸åœ°é»ž" name="panel_picks"/> </tab_container> </panel> diff --git a/indra/newview/skins/default/xui/zh/panel_media_settings_general.xml b/indra/newview/skins/default/xui/zh/panel_media_settings_general.xml index f3163e3c19938babaff366c666c9b7cb6e9fbaad..059a78cf7decd1871f75fdcd0a7de0462075b7df 100644 --- a/indra/newview/skins/default/xui/zh/panel_media_settings_general.xml +++ b/indra/newview/skins/default/xui/zh/panel_media_settings_general.xml @@ -11,7 +11,7 @@ é 覽 </text> <text name="current_url_label"> - Current Page: + ç›®å‰é é¢ï¼š </text> <text name="current_url" tool_tip="The current page for this media source" value=""/> <button label="Reset" name="current_url_reset_btn"/> diff --git a/indra/newview/skins/default/xui/zh/panel_media_settings_permissions.xml b/indra/newview/skins/default/xui/zh/panel_media_settings_permissions.xml index be9711c8a60ee37a6993067e74463a703701b12b..3645f471ceefbf14bb0241cf861e1e7a4be4379c 100644 --- a/indra/newview/skins/default/xui/zh/panel_media_settings_permissions.xml +++ b/indra/newview/skins/default/xui/zh/panel_media_settings_permissions.xml @@ -1,29 +1,29 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="自訂" name="Media settings for controls"> <text name="controls_label"> - Controls: + 控制: </text> <combo_box name="controls"> <combo_item name="Standard"> - Standard + 標準 </combo_item> <combo_item name="Mini"> - Mini + è¿·ä½ </combo_item> </combo_box> <text name="owner_label"> - Owner + æ“有者 </text> <check_box initial_value="false" label="Allow Navigation & Interactivity" name="perms_owner_interact"/> - <check_box initial_value="false" label="Show Control Bar" name="perms_owner_control"/> + <check_box initial_value="false" label="顯示控制列" name="perms_owner_control"/> <text name="group_label"> 社團: </text> <check_box initial_value="false" label="Allow Navigation & Interactivity" name="perms_group_interact"/> - <check_box initial_value="false" label="Show Control Bar" name="perms_group_control"/> + <check_box initial_value="false" label="顯示控制列" name="perms_group_control"/> <text name="anyone_label"> - Anyone + 任何人 </text> <check_box initial_value="false" label="Allow Navigation & Interactivity" name="perms_anyone_interact"/> - <check_box initial_value="false" label="Show Control Bar" name="perms_anyone_control"/> + <check_box initial_value="false" label="顯示控制列" name="perms_anyone_control"/> </panel> diff --git a/indra/newview/skins/default/xui/zh/panel_navigation_bar.xml b/indra/newview/skins/default/xui/zh/panel_navigation_bar.xml index 26e03c9b3b90deb4a3ccd4bb8f502bc56828d5d6..1748d117f46e05a247def0f7bce749f75d8b04cd 100644 --- a/indra/newview/skins/default/xui/zh/panel_navigation_bar.xml +++ b/indra/newview/skins/default/xui/zh/panel_navigation_bar.xml @@ -1,8 +1,8 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="navigation_bar"> <panel name="navigation_panel"> - <pull_button name="back_btn" tool_tip="Go back to previous location"/> - <pull_button name="forward_btn" tool_tip="Go forward one location"/> + <pull_button name="back_btn" tool_tip="å‰å¾€ä¸Šä¸€å€‹ä½ç½®"/> + <pull_button name="forward_btn" tool_tip="å‰å¾€ä¸‹ä¸€å€‹ä½ç½®"/> <button name="home_btn" tool_tip="瞬間傳é€åˆ°æˆ‘家的ä½ç½®"/> <location_input label="ä½ç½®" name="location_combo"/> <search_combo_box label="æœå°‹" name="search_combo_box" tool_tip="æœå°‹"> @@ -11,8 +11,8 @@ </panel> <favorites_bar name="favorite" tool_tip="Drag Landmarks here for quick access to your favorite places in Second Life!"> <label name="favorites_bar_label" tool_tip="Drag Landmarks here for quick access to your favorite places in Second Life!"> - Favorites Bar + 最愛列 </label> - <chevron_button name=">>" tool_tip="Show more of My Favorites"/> + <chevron_button name=">>" tool_tip="顯示更多我的最愛"/> </favorites_bar> </panel> diff --git a/indra/newview/skins/default/xui/zh/panel_nearby_chat_bar.xml b/indra/newview/skins/default/xui/zh/panel_nearby_chat_bar.xml index 724cd54bf199af8d0bd6373bc800a098ee3a5657..3cabfcfabaa9419b8acc290c966e8bb4e3096006 100644 --- a/indra/newview/skins/default/xui/zh/panel_nearby_chat_bar.xml +++ b/indra/newview/skins/default/xui/zh/panel_nearby_chat_bar.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="chat_bar"> - <line_editor label="點擊æ¤è™•é–‹å§‹èŠå¤©ã€‚" name="chat_box" tool_tip="Press Enter to say, Ctrl+Enter to shout"/> - <button name="show_nearby_chat" tool_tip="顯示 / éš±è— é™„è¿‘èŠå¤©ç´€éŒ„"/> + <line_editor label="點擊æ¤è™•é–‹å§‹èŠå¤©ã€‚" name="chat_box" tool_tip="按下 Enter éµä¾†èªªæˆ–按下 Ctrl+Enter 來喊å«"/> + <button name="show_nearby_chat" tool_tip="顯示 / éš±è— é™„è¿‘çš„èŠå¤©ç´€éŒ„"/> </panel> diff --git a/indra/newview/skins/default/xui/zh/panel_nearby_media.xml b/indra/newview/skins/default/xui/zh/panel_nearby_media.xml index 0b8a7a5f42e0d5434a97113a100d11376c64ce95..5ab6837569d591195d716468f77296523b8bfb68 100644 --- a/indra/newview/skins/default/xui/zh/panel_nearby_media.xml +++ b/indra/newview/skins/default/xui/zh/panel_nearby_media.xml @@ -44,13 +44,13 @@ <panel name="media_controls_panel"> <layout_stack name="media_controls"> <layout_panel name="stop"> - <button name="stop_btn" tool_tip="Stop selected media"/> + <button name="stop_btn" tool_tip="åœæ¢æ‰€é¸æ“‡åª’é«”"/> </layout_panel> <layout_panel name="play"> - <button name="play_btn" tool_tip="Play selected media"/> + <button name="play_btn" tool_tip="æ’放所é¸æ“‡çš„媒體"/> </layout_panel> <layout_panel name="pause"> - <button name="pause_btn" tool_tip="Pause selected media"/> + <button name="pause_btn" tool_tip="æš«åœæ‰€é¸æ“‡çš„媒體"/> </layout_panel> <layout_panel name="volume_slider_ctrl"> <slider_bar initial_value="0.5" name="volume_slider" tool_tip="Audio volume for selected media"/> diff --git a/indra/newview/skins/default/xui/zh/panel_notes.xml b/indra/newview/skins/default/xui/zh/panel_notes.xml index cf804b517d1e7da74dc141f85bf594b7eb640116..f68fd74d1f6529c2f55a81de43b60bbaf4991181 100644 --- a/indra/newview/skins/default/xui/zh/panel_notes.xml +++ b/indra/newview/skins/default/xui/zh/panel_notes.xml @@ -18,7 +18,7 @@ <button label="åŠ ç‚ºæœ‹å‹" name="add_friend" tool_tip="Offer friendship to the Resident"/> </layout_panel> <layout_panel name="im_btn_lp"> - <button label="IM" name="im" tool_tip="Open instant message session"/> + <button label="IM" name="im" tool_tip="é–‹å•Ÿå³æ™‚訊æ¯æœƒè©±"/> </layout_panel> <layout_panel name="call_btn_lp"> <button label="通話" name="call" tool_tip="與這ä½å±…民通話"/> diff --git a/indra/newview/skins/default/xui/zh/panel_notify_textbox.xml b/indra/newview/skins/default/xui/zh/panel_notify_textbox.xml index bdbc89f71cf6c65fe6da85904537b6c5e4bb94df..01a82103381581ee2e065eb8c98ef93adbbc2620 100644 --- a/indra/newview/skins/default/xui/zh/panel_notify_textbox.xml +++ b/indra/newview/skins/default/xui/zh/panel_notify_textbox.xml @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel label="instant_message" name="panel_notify_textbox"> +<panel label="å³æ™‚訊æ¯" name="panel_notify_textbox"> <string name="message_max_lines_count" value="7"/> <panel label="info_panel" name="info_panel"> - <text_editor name="message" value="message"/> + <text_editor name="message" value="訊æ¯"/> </panel> <panel label="control_panel" name="control_panel"> - <button label="Submit" name="btn_submit"/> + <button label="æ交" name="btn_submit"/> <button label="忽視" name="ignore_btn"/> </panel> </panel> diff --git a/indra/newview/skins/default/xui/zh/panel_outfit_edit.xml b/indra/newview/skins/default/xui/zh/panel_outfit_edit.xml index 6ceaf447a753d1a0e1a79f8f6452e6e1c6fb1ede..263106d13ad290ef1c98e0f7602a83115ae7614d 100644 --- a/indra/newview/skins/default/xui/zh/panel_outfit_edit.xml +++ b/indra/newview/skins/default/xui/zh/panel_outfit_edit.xml @@ -15,7 +15,7 @@ <string name="Filter.Objects" value="物件"/> <string name="Filter.Clothing" value="æœè£"/> <string name="Filter.Bodyparts" value="身體部ä½"/> - <string name="replace_body_part" value="Click to replace your existing shape"/> + <string name="replace_body_part" value="點擊以å–ä»£ä½ ç¾å˜çš„體形"/> <text name="title" value="編輯è£æ‰®"/> <panel name="header_panel"> <panel name="outfit_name_and_status"> @@ -27,7 +27,7 @@ <layout_panel name="outfit_wearables_panel"> <layout_stack name="filter_panels"> <layout_panel name="add_button_and_combobox"> - <button label="Add More..." name="show_add_wearables_btn" tool_tip="é–‹å•Ÿ / 關閉"/> + <button label="æ·»åŠ æ›´å¤š..." name="show_add_wearables_btn" tool_tip="é–‹å•Ÿ / 關閉"/> </layout_panel> <layout_panel name="filter_panel"> <filter_editor label="收ç´å€å¯ç©¿è‘—éŽæ¿¾å™¨" name="look_item_filter"/> @@ -35,7 +35,7 @@ </layout_stack> </layout_panel> <layout_panel name="add_wearables_panel"> - <button label="Wear Item" name="plus_btn"/> + <button label="穿上物å“" name="plus_btn"/> </layout_panel> </layout_stack> <panel name="no_add_wearables_button_bar"> diff --git a/indra/newview/skins/default/xui/zh/panel_people.xml b/indra/newview/skins/default/xui/zh/panel_people.xml index a1fec089407ad8492be73b77611bb5d4d3c90a29..4c6d6c76beb8bd7e309fc008c540e67740423a79 100644 --- a/indra/newview/skins/default/xui/zh/panel_people.xml +++ b/indra/newview/skins/default/xui/zh/panel_people.xml @@ -66,16 +66,16 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M <layout_panel name="view_profile_btn_lp"> <button label="檔案" name="view_profile_btn" tool_tip="Show picture, groups, and other Residents information"/> </layout_panel> - <layout_panel name="chat_btn_lp"> - <button label="IM" name="im_btn" tool_tip="Open instant message session"/> + <layout_panel name="im_btn_lp"> + <button label="IM" name="im_btn" tool_tip="é–‹å•Ÿå³æ™‚訊æ¯æœƒè©±"/> </layout_panel> - <layout_panel name="chat_btn_lp"> + <layout_panel name="call_btn_lp"> <button label="通話" name="call_btn" tool_tip="Call this Resident"/> </layout_panel> - <layout_panel name="chat_btn_lp"> + <layout_panel name="share_btn_lp"> <button label="分享" name="share_btn" tool_tip="分享一個收ç´å€ç‰©å“"/> </layout_panel> - <layout_panel name="chat_btn_lp"> + <layout_panel name="teleport_btn_lp"> <button label="瞬間傳é€" name="teleport_btn" tool_tip="Offer teleport"/> </layout_panel> </layout_stack> @@ -84,7 +84,7 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M <button label="社團檔案" name="group_info_btn" tool_tip="顯示社團資訊"/> </layout_panel> <layout_panel name="chat_btn_lp"> - <button label="Group Chat" name="chat_btn" tool_tip="Open chat session"/> + <button label="Group Chat" name="chat_btn" tool_tip="é–‹å•ŸèŠå¤©æœƒè©±"/> </layout_panel> <layout_panel name="group_call_btn_lp"> <button label="Group Call" name="group_call_btn" tool_tip="Call this group"/> diff --git a/indra/newview/skins/default/xui/zh/panel_pick_info.xml b/indra/newview/skins/default/xui/zh/panel_pick_info.xml index 44ae5703c603b4f1ef4d9f44196b9287bc9bca44..cd4cdbf999b3422363cef73348cfabb6397e3d39 100644 --- a/indra/newview/skins/default/xui/zh/panel_pick_info.xml +++ b/indra/newview/skins/default/xui/zh/panel_pick_info.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="panel_pick_info"> - <text name="title" value="Pick Info"/> + <text name="title" value="ç²¾é¸åœ°é»žè³‡è¨Š"/> <scroll_container name="profile_scroll"> <panel name="scroll_content_panel"> <text_editor name="pick_name" value="[name]"/> diff --git a/indra/newview/skins/default/xui/zh/panel_picks.xml b/indra/newview/skins/default/xui/zh/panel_picks.xml index 3b356967f924aacac703dfe6b0e610ebde7e87e9..a233092dc2e5ae4d7c728f89a0fb8da6d0777b6a 100644 --- a/indra/newview/skins/default/xui/zh/panel_picks.xml +++ b/indra/newview/skins/default/xui/zh/panel_picks.xml @@ -1,28 +1,28 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel label="Picks" name="panel_picks"> - <string name="no_picks" value="No Picks"/> +<panel label="ç²¾é¸åœ°é»ž" name="panel_picks"> + <string name="no_picks" value="ç„¡ç²¾é¸åœ°é»ž"/> <string name="no_classifieds" value="No Classifieds"/> <accordion name="accordion"> - <accordion_tab name="tab_picks" title="Picks"/> + <accordion_tab name="tab_picks" title="ç²¾é¸åœ°é»ž"/> <accordion_tab name="tab_classifieds" title="Classifieds"/> </accordion> <panel label="bottom_panel" name="edit_panel"> <layout_stack name="edit_panel_ls"> <layout_panel name="gear_menu_btn"> - <button name="new_btn" tool_tip="Create a new pick or classified at the current location"/> + <button name="new_btn" tool_tip="以目å‰ä½ç½®å»ºç«‹æ–°çš„ç²¾é¸åœ°é»žæˆ–個人廣告"/> </layout_panel> </layout_stack> </panel> <panel name="buttons_cucks"> <layout_stack name="buttons_cucks_ls"> <layout_panel name="info_btn_lp"> - <button label="資訊" name="info_btn" tool_tip="Show pick information"/> + <button label="資訊" name="info_btn" tool_tip="顯示精é¸åœ°é»žè³‡è¨Š"/> </layout_panel> <layout_panel name="teleport_btn_lp"> - <button label="瞬間傳é€" name="teleport_btn" tool_tip="Teleport to the corresponding area"/> + <button label="瞬間傳é€" name="teleport_btn" tool_tip="瞬間傳é€åˆ°ç›¸å°æ‡‰çš„å€åŸŸ"/> </layout_panel> <layout_panel name="show_on_map_btn_lp"> - <button label="地圖" name="show_on_map_btn" tool_tip="Show the corresponding area on the World Map"/> + <button label="地圖" name="show_on_map_btn" tool_tip="在世界地圖上顯示相å°æ‡‰çš„å€åŸŸ"/> </layout_panel> </layout_stack> </panel> diff --git a/indra/newview/skins/default/xui/zh/panel_place_profile.xml b/indra/newview/skins/default/xui/zh/panel_place_profile.xml index b0919c9151286bb118930f5299b8fddb4cb9997e..aa7b036398ac840e574eeb20a3530434fb71db4e 100644 --- a/indra/newview/skins/default/xui/zh/panel_place_profile.xml +++ b/indra/newview/skins/default/xui/zh/panel_place_profile.xml @@ -11,7 +11,7 @@ <string name="unknown" value="(未知)"/> <string name="public" value="(公開)"/> <string name="none_text" value="(無)"/> - <string name="sale_pending_text" value="(Sale Pending)"/> + <string name="sale_pending_text" value="(擱置銷售)"/> <string name="group_owned_text" value="(社團所æ“有)"/> <string name="price_text" value="L$"/> <string name="area_text" value="m²"/> @@ -60,11 +60,11 @@ <text name="voice_value" value="On"/> <text name="fly_label" value="飛行:"/> <text name="fly_value" value="On"/> - <text name="push_label" value="Push:"/> + <text name="push_label" value="推撞:"/> <text name="push_value" value="Off"/> - <text name="build_label" value="Build:"/> + <text name="build_label" value="å»ºé€ ï¼š"/> <text name="build_value" value="On"/> - <text name="scripts_label" value="Scripts:"/> + <text name="scripts_label" value="腳本:"/> <text name="scripts_value" value="On"/> <text name="damage_label" value="Damage:"/> <text name="damage_value" value="Off"/> @@ -78,7 +78,7 @@ <text name="region_type_label" value="類型:"/> <text name="region_type" value="Moose"/> <text name="region_rating_label" value="分級:"/> - <text name="region_rating" value="Adult"/> + <text name="region_rating" value="æˆäºº"/> <text name="region_owner_label" value="æ“有者:"/> <text name="region_owner" value="moose Van Moose extra long name moose"/> <text name="region_group_label" value="社團:"/> @@ -103,7 +103,7 @@ <text name="area_label" value="é¢ç©ï¼š"/> <text name="traffic_label" value="æµé‡ï¼š"/> <text name="primitives_label" value="Primitives:"/> - <text name="parcel_scripts_label" value="Scripts:"/> + <text name="parcel_scripts_label" value="腳本:"/> <text name="terraform_limits_label" value="Terraform limits:"/> <text name="subdivide_label" value="Subdivide/Join ability:"/> <text name="resale_label" value="ReSale ability:"/> diff --git a/indra/newview/skins/default/xui/zh/panel_places.xml b/indra/newview/skins/default/xui/zh/panel_places.xml index 10524bc5f0a14111b893b152da870076f679212e..c141201ab2eed953cd1dec9fa5fefb3f8f2d917b 100644 --- a/indra/newview/skins/default/xui/zh/panel_places.xml +++ b/indra/newview/skins/default/xui/zh/panel_places.xml @@ -41,7 +41,7 @@ <button label="儲å˜" name="save_btn"/> </layout_panel> <layout_panel name="cancel_btn_lp"> - <button label="å–銷" name="cancel_btn"/> + <button label="å–消" name="cancel_btn"/> </layout_panel> </layout_stack> </panel> diff --git a/indra/newview/skins/default/xui/zh/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/zh/panel_preferences_advanced.xml index ad137e9dd4f305854ae2211d2838dfe9bc9a8abf..c5dce10d638740c7611e409b91786b191cbb4f46 100644 --- a/indra/newview/skins/default/xui/zh/panel_preferences_advanced.xml +++ b/indra/newview/skins/default/xui/zh/panel_preferences_advanced.xml @@ -9,7 +9,7 @@ <check_box label="顯示腳本錯誤訊æ¯æ–¼ï¼š" name="show_script_errors"/> <radio_group name="show_location"> <radio_item label="附近的èŠå¤©ä¸" name="0"/> - <radio_item label="分開的試窗ä¸" name="1"/> + <radio_item label="分開的視窗ä¸" name="1"/> </radio_group> <check_box label="å…許åŒæ™‚執行多個ç€è¦½å™¨" name="allow_multiple_viewer_check"/> <check_box label="ç™»å…¥æ™‚é¡¯ç¤ºç¶²æ ¼é¸æ“‡" name="show_grid_selection_check"/> diff --git a/indra/newview/skins/default/xui/zh/panel_preferences_chat.xml b/indra/newview/skins/default/xui/zh/panel_preferences_chat.xml index 34b0e3800f35435647b5a1b9aeb8fdba7e228b16..c691edb11cb429d4de8d0f7bad38548533d89368 100644 --- a/indra/newview/skins/default/xui/zh/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/zh/panel_preferences_chat.xml @@ -9,7 +9,7 @@ <radio_item label="大" name="radio3" value="2"/> </radio_group> <check_box initial_value="true" label="èŠå¤©æ™‚æ’放打å—動作" name="play_typing_animation"/> - <check_box label="Email me IMs when I'm offline" name="send_im_to_email"/> + <check_box label="當我離線時將收到的 IM 訊æ¯éƒµå¯„給我" name="send_im_to_email"/> <check_box label="Enable plain text IM and chat history" name="plain_text_chat_history"/> <check_box label="èŠå¤©æ³¡æ³¡" name="bubble_text_chat"/> <text name="show_ims_in_label"> @@ -18,7 +18,7 @@ <text name="requires_restart_label"> ï¼ˆé ˆé‡æ–°å•Ÿå‹•ï¼‰ </text> - <radio_group name="chat_window" tool_tip="Show your Instant Messages in separate floaters, or in one floater with many tabs (Requires restart)"> + <radio_group name="chat_window" tool_tip="é¡¯ç¤ºä½ çš„å³æ™‚訊æ¯åœ¨åˆ†é–‹çš„浮動視窗,或是使用很多é ç±¤çš„å–®ä¸€æµ®å‹•è¦–çª—ï¼ˆé ˆé‡æ–°å•Ÿå‹•ï¼‰"> <radio_item label="分開視窗" name="radio" value="0"/> <radio_item label="é 籤" name="radio2" value="1"/> </radio_group> @@ -33,7 +33,7 @@ Use machine translation while chatting (powered by Google) </text> <text name="translate_language_text"> - Translate chat into: + èŠå¤©ç¿»è¯ç‚ºï¼š </text> <combo_box name="translate_language_combobox"> <combo_box.item label="系統é è¨" name="System Default Language"/> diff --git a/indra/newview/skins/default/xui/zh/panel_preferences_general.xml b/indra/newview/skins/default/xui/zh/panel_preferences_general.xml index e53d2a8c06e57f15ae0a859e1baa18cc38d0b77a..b7449dad10c5fe0227d7df418bd644b3441ea111 100644 --- a/indra/newview/skins/default/xui/zh/panel_preferences_general.xml +++ b/indra/newview/skins/default/xui/zh/panel_preferences_general.xml @@ -17,10 +17,10 @@ <combo_box.item label="日本語 (Japanese) - Beta" name="(Japanese)"/> </combo_box> <text name="language_textbox2"> - (Requires restart) + ï¼ˆé ˆé‡æ–°å•Ÿå‹•ï¼‰ </text> <text name="maturity_desired_prompt"> - I want to access content rated: + 我想è¦èƒ½é€²å‡ºå…§å®¹åˆ†ç´šçš„地å€ç‚ºï¼š </text> <combo_box name="maturity_desired_combobox"> <combo_box.item label="General, Moderate, Adult" name="Desired_Adult"/> @@ -36,34 +36,34 @@ </combo_box> <check_box initial_value="true" label="登入時顯示" name="show_location_checkbox"/> <text name="name_tags_textbox"> - Name tags: + å稱標籤: </text> <radio_group name="Name_Tag_Preference"> <radio_item label="Off" name="radio" value="0"/> <radio_item label="On" name="radio2" value="1"/> - <radio_item label="Show briefly" name="radio3" value="2"/> + <radio_item label="ç°¡çŸé¡¯ç¤º" name="radio3" value="2"/> </radio_group> - <check_box label="My name" name="show_my_name_checkbox1"/> - <check_box label="Usernames" name="show_slids" tool_tip="Show username, like bobsmith123"/> - <check_box label="Group titles" name="show_all_title_checkbox1" tool_tip="Show group titles, like Officer or Member"/> + <check_box label="我的åå—" name="show_my_name_checkbox1"/> + <check_box label="使用者å稱" name="show_slids" tool_tip="顯示使用者åç¨±ï¼Œå°±åƒ bobsmith123 這類的"/> + <check_box label="社團é 銜" name="show_all_title_checkbox1" tool_tip="顯示社團é 銜,åƒæ˜¯ Officer 或æˆå“¡"/> <check_box label="高亮顯示朋å‹" name="show_friends" tool_tip="é«˜äº®é¡¯ç¤ºä½ æœ‹å‹çš„å稱標籤"/> <check_box label="View Display Names" name="display_names_check" tool_tip="Check to use display names in chat, IM, name tags, etc."/> <text name="inworld_typing_rg_label"> - Pressing letter keys: + 按下å—æ¯éµï¼š </text> <radio_group name="inworld_typing_preference"> - <radio_item label="Starts local chat" name="radio_start_chat" value="1"/> - <radio_item label="Affects movement (i.e. WASD)" name="radio_move" value="0"/> + <radio_item label="開始本地èŠå¤©" name="radio_start_chat" value="1"/> + <radio_item label="影響移動(例如 WASDéµï¼‰" name="radio_move" value="0"/> </radio_group> <text name="title_afk_text"> - Away timeout: + 離開逾時è¨å®šï¼š </text> - <combo_box label="Away timeout:" name="afk"> - <combo_box.item label="2 minutes" name="item0"/> - <combo_box.item label="5 minutes" name="item1"/> - <combo_box.item label="10 minutes" name="item2"/> - <combo_box.item label="30 minutes" name="item3"/> - <combo_box.item label="never" name="item4"/> + <combo_box label="離開逾時è¨å®šï¼š" name="afk"> + <combo_box.item label="2 分é˜" name="item0"/> + <combo_box.item label="5 分é˜" name="item1"/> + <combo_box.item label="10 分é˜" name="item2"/> + <combo_box.item label="30 分é˜" name="item3"/> + <combo_box.item label="絕ä¸" name="item4"/> </combo_box> <text name="text_box3"> 忙碌模å¼å›žæ‡‰ï¼š diff --git a/indra/newview/skins/default/xui/zh/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/zh/panel_preferences_graphics1.xml index 68e149d866f5148d01d3fce6d759347a541f823c..8c728bf7792c6ed8bc21ce241202b93b5a011d3f 100644 --- a/indra/newview/skins/default/xui/zh/panel_preferences_graphics1.xml +++ b/indra/newview/skins/default/xui/zh/panel_preferences_graphics1.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel label="Graphics" name="Display panel"> +<panel label="圖形" name="Display panel"> <text name="QualitySpeed"> Quality and speed: </text> @@ -21,7 +21,7 @@ <text name="ShadersPrefText4"> Ultra </text> - <panel label="CustomGraphics" name="CustomGraphics Panel"> + <panel label="自訂圖形" name="CustomGraphics Panel"> <text name="ShadersText"> Shaders: </text> @@ -43,7 +43,7 @@ <text name="AvatarPhysicsDetailText"> Low </text> - <slider label="Draw distance:" name="DrawDistance"/> + <slider label="æ繪è·é›¢ï¼š" name="DrawDistance"/> <text name="DrawDistanceMeterText2"> m </text> diff --git a/indra/newview/skins/default/xui/zh/panel_preferences_move.xml b/indra/newview/skins/default/xui/zh/panel_preferences_move.xml index ff582d774b1ccb573687dbb74109e84eeb92a94d..de296f72f3d12351f5d32f7ee472ef32c6b7f2e7 100644 --- a/indra/newview/skins/default/xui/zh/panel_preferences_move.xml +++ b/indra/newview/skins/default/xui/zh/panel_preferences_move.xml @@ -13,9 +13,9 @@ Mouselook mouse sensitivity: </text> <check_box label="å轉" name="invert_mouse"/> - <check_box label="Arrow keys always move me" name="arrow_keys_move_avatar_check"/> + <check_box label="總是使用方å‘éµç§»å‹•" name="arrow_keys_move_avatar_check"/> <check_box label="Tap-tap-hold to run" name="tap_tap_hold_to_run"/> - <check_box label="Double-Click to:" name="double_click_chkbox"/> + <check_box label="雙擊以D:" name="double_click_chkbox"/> <radio_group name="double_click_action"> <radio_item label="瞬間傳é€" name="radio_teleport"/> <radio_item label="Auto-pilot" name="radio_autopilot"/> diff --git a/indra/newview/skins/default/xui/zh/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/zh/panel_preferences_privacy.xml index e0e091187227a67a702d7d8962077b9d9daf1eb2..89a1a48abf218e3d45d9bb7e98ac916595ea7658 100644 --- a/indra/newview/skins/default/xui/zh/panel_preferences_privacy.xml +++ b/indra/newview/skins/default/xui/zh/panel_preferences_privacy.xml @@ -5,7 +5,7 @@ </panel.string> <button label="清除æ·å²ç´€éŒ„" name="clear_cache" tool_tip="清除登入圖åƒã€æœ€å¾Œä½ç½®ã€çž¬é–“傳é€ç´€éŒ„ã€ç¶²é åŠæ質快å–"/> <text name="cache_size_label_l"> - (ä½ç½®ã€åœ–åƒã€ç¶²é ã€æœå°‹çš„æ·ä½¿ç´€éŒ„) + (ä½ç½®ã€åœ–åƒã€ç¶²é ã€æœå°‹çš„æ·å²ç´€éŒ„) </text> <check_box label="將我顯示在æœå°‹çš„çµæžœä¸" name="online_searchresults"/> <check_box label="åªæœ‰æˆ‘的朋å‹å’Œç¤¾åœ˜çŸ¥é“我在線上" name="online_visibility"/> diff --git a/indra/newview/skins/default/xui/zh/panel_preferences_sound.xml b/indra/newview/skins/default/xui/zh/panel_preferences_sound.xml index 0c6d8386e4def7f7098caa52178c5c0464893a8c..305d1e2ac9b1dc4958ced070d9f30b7e07ef3452 100644 --- a/indra/newview/skins/default/xui/zh/panel_preferences_sound.xml +++ b/indra/newview/skins/default/xui/zh/panel_preferences_sound.xml @@ -10,29 +10,29 @@ </text> <slider label="按éµéŸ³" name="UI Volume"/> <slider label="Ambient" name="Wind Volume"/> - <slider label="Sound Effects" name="SFX Volume"/> - <slider label="Streaming music" name="Music Volume"/> - <check_box label="Enabled" name="enable_music"/> - <slider label="Media" name="Media Volume"/> - <check_box label="Enabled" name="enable_media"/> - <slider label="Voice Chat" name="Voice Volume"/> - <check_box label="Enabled" name="enable_voice_check"/> - <check_box label="Allow Media to auto-play" name="media_auto_play_btn" tool_tip="Check this to let media auto-play if it wants" value="true"/> - <check_box label="Play media attached to other avatars" name="media_show_on_others_btn" tool_tip="Uncheck this to hide media attached to other avatars nearby" value="true"/> + <slider label="音效" name="SFX Volume"/> + <slider label="串æµéŸ³æ¨‚" name="Music Volume"/> + <check_box label="已啟用" name="enable_music"/> + <slider label="媒體" name="Media Volume"/> + <check_box label="已啟用" name="enable_media"/> + <slider label="語音èŠå¤©" name="Voice Volume"/> + <check_box label="已啟用" name="enable_voice_check"/> + <check_box label="å…許媒體自動æ’放" name="media_auto_play_btn" tool_tip="è‹¥ä½ æƒ³è¦ï¼Œå¯ä»¥å‹¾é¸é€™å€‹å…許媒體自動æ’放" value="true"/> + <check_box label="æ’æ”¾é™„åŠ åˆ°å…¶ä»–åŒ–èº«èº«ä¸Šçš„åª’é«”" name="media_show_on_others_btn" tool_tip="Uncheck this to hide media attached to other avatars nearby" value="true"/> <text name="voice_chat_settings"> - Voice Chat Settings + 語音èŠå¤©è¨å®š </text> <text name="Listen from"> - Listen from: + 傾è½ä½ç½®ï¼š </text> <radio_group name="ear_location"> - <radio_item label="Camera position" name="0"/> - <radio_item label="Avatar position" name="1"/> + <radio_item label="æ”影機ä½ç½®" name="0"/> + <radio_item label="化身ä½ç½®" name="1"/> </radio_group> - <check_box label="Move avatar lips when speaking" name="enable_lip_sync"/> + <check_box label="說話時åŒæ¥ç§»å‹•åŒ–身嘴唇" name="enable_lip_sync"/> <check_box label="Toggle speak on/off when I press:" name="push_to_talk_toggle_check" tool_tip="When in toggle mode, press and release the trigger key ONCE to switch your microphone on or off. When not in toggle mode, the microphone broadcasts your voice only while the trigger is being held down."/> <line_editor label="Push-to-Speak trigger" name="modifier_combo"/> - <button label="Set Key" name="set_voice_hotkey_button"/> + <button label="è¨å®šæŒ‰éµ" name="set_voice_hotkey_button"/> <button name="set_voice_middlemouse_button" tool_tip="Reset to Middle Mouse Button"/> <button label="輸入 / 輸出è¨å‚™" name="device_settings_btn"/> <panel label="è¨å‚™è¨å®š" name="device_settings_panel"> @@ -49,11 +49,11 @@ 輸入 </text> <text name="My volume label"> - My volume: + 我的音é‡ï¼š </text> <slider_bar initial_value="1.0" name="mic_volume_slider" tool_tip="Change the volume using this slider"/> <text name="wait_text"> - Please wait + è«‹ç¨å€™ </text> <text name="Output"> 輸出 diff --git a/indra/newview/skins/default/xui/zh/panel_prim_media_controls.xml b/indra/newview/skins/default/xui/zh/panel_prim_media_controls.xml index 71de9f861ac04756c7c901650af5952a013b6df9..8d0e2a635593178881364ab44e779c182683ea15 100644 --- a/indra/newview/skins/default/xui/zh/panel_prim_media_controls.xml +++ b/indra/newview/skins/default/xui/zh/panel_prim_media_controls.xml @@ -40,7 +40,7 @@ <button name="home_btn" tool_tip="Home page"/> </layout_panel> <layout_panel name="media_stop"> - <button name="media_stop_btn" tool_tip="Stop media"/> + <button name="media_stop_btn" tool_tip="åœæ¢åª’é«”"/> </layout_panel> <layout_panel name="reload"> <button name="reload_btn" tool_tip="Reload"/> diff --git a/indra/newview/skins/default/xui/zh/panel_profile.xml b/indra/newview/skins/default/xui/zh/panel_profile.xml index fafbf855de0069245da62afee670783d9fa6ca3c..fcf7bb64db03104dea6802e07811594f5f8b0c4f 100644 --- a/indra/newview/skins/default/xui/zh/panel_profile.xml +++ b/indra/newview/skins/default/xui/zh/panel_profile.xml @@ -32,8 +32,8 @@ <panel name="first_life_image_panel"> <text name="title_rw_descr_text" value="真實世界:"/> </panel> - <text name="title_member_text" value="Resident Since:"/> - <text name="title_acc_status_text" value="Account Status:"/> + <text name="title_member_text" value="æˆç‚ºå±…民自:"/> + <text name="title_acc_status_text" value="帳戶狀態:"/> <text name="title_partner_text" value="é…å¶ï¼š"/> <panel name="partner_data_panel"> <text initial_value="(retrieving)" name="partner_text"/> @@ -50,7 +50,7 @@ <button label="åŠ ç‚ºæœ‹å‹" name="add_friend" tool_tip="Offer friendship to the Resident"/> </layout_panel> <layout_panel name="im_btn_lp"> - <button label="IM" name="im" tool_tip="Open instant message session"/> + <button label="IM" name="im" tool_tip="é–‹å•Ÿå³æ™‚訊æ¯æœƒè©±"/> </layout_panel> <layout_panel name="call_btn_lp"> <button label="通話" name="call" tool_tip="與這ä½å±…民通話"/> @@ -59,7 +59,7 @@ <button label="瞬間傳é€" name="teleport" tool_tip="Offer teleport"/> </layout_panel> <layout_panel name="overflow_btn_lp"> - <menu_button label="â–¼" name="overflow_btn" tool_tip="Pay money to or share inventory with the Resident"/> + <menu_button label="â–¼" name="overflow_btn" tool_tip="支付金錢,或分享收ç´å€çµ¦å±…æ°‘"/> </layout_panel> </layout_stack> </layout_panel> diff --git a/indra/newview/skins/default/xui/zh/panel_profile_view.xml b/indra/newview/skins/default/xui/zh/panel_profile_view.xml index a8d7c8d6d119b33cba2d8b6bd1aaee93e8ea989c..12fe776e450943513505f7615344c1c2b94d2fb3 100644 --- a/indra/newview/skins/default/xui/zh/panel_profile_view.xml +++ b/indra/newview/skins/default/xui/zh/panel_profile_view.xml @@ -7,14 +7,14 @@ Offline </string> <text name="display_name_label" value="Display Name:"/> - <text name="solo_username_label" value="Username:"/> + <text name="solo_username_label" value="使用者å稱:"/> <text name="status" value="Online"/> <text name="user_name_small" value="Jack oh look at me this is a super duper long name"/> <button name="copy_to_clipboard" tool_tip="覆製到剪貼簿"/> - <text name="user_label" value="Username:"/> + <text name="user_label" value="使用者å稱:"/> <tab_container name="tabs"> <panel label="檔案" name="panel_profile"/> - <panel label="PICKS" name="panel_picks"/> + <panel label="ç²¾é¸åœ°é»ž" name="panel_picks"/> <panel label="NOTES & PRIVACY" name="panel_notes"/> </tab_container> </panel> diff --git a/indra/newview/skins/default/xui/zh/panel_region_covenant.xml b/indra/newview/skins/default/xui/zh/panel_region_covenant.xml index 2e52efb804a750f68be409117fe62ae3f740995a..315bc0ac8eace178d5e5f7a74b01a17dc42937b3 100644 --- a/indra/newview/skins/default/xui/zh/panel_region_covenant.xml +++ b/indra/newview/skins/default/xui/zh/panel_region_covenant.xml @@ -62,18 +62,18 @@ 分級: </text> <text name="region_maturity_text"> - Adult + æˆäºº </text> <text name="resellable_lbl"> - Resale: + 轉售: </text> <text name="resellable_clause"> - Land in this region may not be resold. + 這地å€çš„土地ä¸èƒ½è½‰å”®ã€‚ </text> <text name="changeable_lbl"> - Subdivide: + 分割: </text> <text name="changeable_clause"> - Land in this region may not be joined/subdivided. + 這地å€çš„土地ä¸èƒ½åˆä½µæˆ–分割。 </text> </panel> diff --git a/indra/newview/skins/default/xui/zh/panel_region_debug.xml b/indra/newview/skins/default/xui/zh/panel_region_debug.xml index dee3e3045fe8524cefeeb0584e8d70637b1baf31..1ffbcbf8fd00380f19fe0a6d1150657298cac92a 100644 --- a/indra/newview/skins/default/xui/zh/panel_region_debug.xml +++ b/indra/newview/skins/default/xui/zh/panel_region_debug.xml @@ -6,29 +6,29 @@ <text name="region_text"> 未知 </text> - <check_box label="Disable Scripts" name="disable_scripts_check" tool_tip="Disable all scripts in this region"/> + <check_box label="關閉腳本" name="disable_scripts_check" tool_tip="關閉這個地å€ç¾åœ¨çš„全部腳本"/> <check_box label="Disable Collisions" name="disable_collisions_check" tool_tip="Disable non-avatar collisions in this region"/> <check_box label="Disable Physics" name="disable_physics_check" tool_tip="Disable all physics in this region"/> <button label="套用" name="apply_btn"/> <text name="objret_text_lbl"> - Object Return + 物件退回 </text> <text name="resident_text_lbl"> - Resident: + 居民: </text> <line_editor name="target_avatar_name"> (無) </line_editor> - <button label="Choose" name="choose_avatar_btn"/> + <button label="é¸æ“‡" name="choose_avatar_btn"/> <text name="options_text_lbl"> é¸é …: </text> - <check_box label="With scripts" name="return_scripts" tool_tip="Return only objects which have scripts"/> + <check_box label="With scripts" name="return_scripts" tool_tip="åªé€€å›žR包å«è…³æœ¬çš„物件"/> <check_box label="On someone else's land" name="return_other_land" tool_tip="Return only objects which are on land belonging to someone else"/> <check_box label="In every region of this estate" name="return_estate_wide" tool_tip="Return objects in all of the regions that make up this estate"/> - <button label="Return" name="return_btn"/> + <button label="退回" name="return_btn"/> <button label="Get Top Colliders..." name="top_colliders_btn" tool_tip="List of objects experiencing the most potential collisions"/> <button label="Get Top Scripts..." name="top_scripts_btn" tool_tip="List of objects spending the most time running scripts"/> - <button label="Restart Region" name="restart_btn" tool_tip="Give 2 minute countdown and restart region"/> - <button label="Delay Restart" name="cancel_restart_btn" tool_tip="Delay region restart by one hour"/> + <button label="地å€é‡æ–°å•Ÿå‹•" name="restart_btn" tool_tip="給予兩分é˜å€’數計時並é‡æ–°å•Ÿå‹•"/> + <button label="延é²é‡æ–°å•Ÿå‹•" name="cancel_restart_btn" tool_tip="延é²åœ°å€é‡æ–°å•Ÿå‹•ä¸€å°æ™‚"/> </panel> diff --git a/indra/newview/skins/default/xui/zh/panel_region_estate.xml b/indra/newview/skins/default/xui/zh/panel_region_estate.xml index c1e43cef48c78e9b0eb0543e69ce87b33a799a7b..1f1676167bbb4fadd9efdc8378e993494d6b9825 100644 --- a/indra/newview/skins/default/xui/zh/panel_region_estate.xml +++ b/indra/newview/skins/default/xui/zh/panel_region_estate.xml @@ -27,26 +27,26 @@ <check_box label="å…許語音èŠå¤©" name="voice_chat_check"/> <check_box label="å…許直接瞬間傳é€" name="allow_direct_teleport"/> <button label="套用" name="apply_btn"/> - <button label="瞬間傳é€è¨Šæ¯åˆ°é ˜åœ°..." name="message_estate_btn"/> - <button label="ç”±é ˜åœ°å°‡å±…æ°‘è¸¢é™¤..." name="kick_user_from_estate_btn"/> + <button label="é€å‡ºè¨Šæ¯åˆ°é ˜åœ°..." name="message_estate_btn"/> + <button label="ç”±é ˜åœ°å°‡å±…æ°‘è¸¢å‡º..." name="kick_user_from_estate_btn"/> <text name="estate_manager_label"> é ˜åœ°ç®¡ç†å“¡ï¼š </text> - <button label="Remove..." name="remove_estate_manager_btn"/> - <button label="Add..." name="add_estate_manager_btn"/> + <button label="移除..." name="remove_estate_manager_btn"/> + <button label="æ·»åŠ ..." name="add_estate_manager_btn"/> <text name="allow_resident_label"> - Allowed Residents: + å…許的居民: </text> - <button label="Remove..." name="remove_allowed_avatar_btn"/> - <button label="Add..." name="add_allowed_avatar_btn"/> + <button label="移除..." name="remove_allowed_avatar_btn"/> + <button label="æ·»åŠ ..." name="add_allowed_avatar_btn"/> <text name="allow_group_label"> - Allowed Groups: + å…許的社團: </text> - <button label="Remove..." name="remove_allowed_group_btn"/> - <button label="Add..." name="add_allowed_group_btn"/> + <button label="移除..." name="remove_allowed_group_btn"/> + <button label="æ·»åŠ ..." name="add_allowed_group_btn"/> <text name="ban_resident_label"> - Banned Residents: + 被å°éŽ–的居民: </text> - <button label="Remove..." name="remove_banned_avatar_btn"/> - <button label="Add..." name="add_banned_avatar_btn"/> + <button label="移除..." name="remove_banned_avatar_btn"/> + <button label="æ·»åŠ ..." name="add_banned_avatar_btn"/> </panel> diff --git a/indra/newview/skins/default/xui/zh/panel_region_general.xml b/indra/newview/skins/default/xui/zh/panel_region_general.xml index f2ccb6e1cf0fb1d4ce7d23616e21d993019b09df..dce75c997df4df30c4e9358f28f9c5df9a4aeaf5 100644 --- a/indra/newview/skins/default/xui/zh/panel_region_general.xml +++ b/indra/newview/skins/default/xui/zh/panel_region_general.xml @@ -7,7 +7,7 @@ 未知 </text> <text name="version_channel_text_lbl"> - Version: + 版本: </text> <text name="version_channel_text"> 未知 @@ -22,22 +22,22 @@ <check_box label="Block Fly" name="block_fly_check"/> <check_box label="Allow Damage" name="allow_damage_check"/> <check_box label="Restrict Pushing" name="restrict_pushobject"/> - <check_box label="Allow Land Resell" name="allow_land_resell_check"/> - <check_box label="Allow Land Join/Divide" name="allow_parcel_changes_check"/> - <check_box label="Block Land Show in Search" name="block_parcel_search_check" tool_tip="Let people see this region and its parcels in search results"/> - <spinner label="Agent Limit" name="agent_limit_spin"/> + <check_box label="å…許土地轉售" name="allow_land_resell_check"/> + <check_box label="å…許土地 åˆä½µ/分割" name="allow_parcel_changes_check"/> + <check_box label="阻擋土地顯示於æœå°‹ä¸" name="block_parcel_search_check" tool_tip="Let people see this region and its parcels in search results"/> + <spinner label="人數上é™" name="agent_limit_spin"/> <spinner label="Object Bonus" name="object_bonus_spin"/> <text label="Maturity" name="access_text"> 分級: </text> <icons_combo_box label="Moderate" name="access_combo"> - <icons_combo_box.item label="Adult" name="Adult" value="42"/> + <icons_combo_box.item label="æˆäºº" name="Adult" value="42"/> <icons_combo_box.item label="Moderate" name="Mature" value="21"/> <icons_combo_box.item label="一般" name="PG" value="13"/> </icons_combo_box> <button label="套用" name="apply_btn"/> <button label="強制瞬間傳é€ä¸€ä½å±…民回家..." name="kick_btn"/> <button label="強制瞬間傳é€æ‰€æœ‰å±…民回家..." name="kick_all_btn"/> - <button label="傳é€è¨Šæ¯åˆ°åœ°å€..." name="im_btn"/> + <button label="é€å‡ºè¨Šæ¯åˆ°åœ°å€..." name="im_btn"/> <button label="管ç†çž¬é–“傳é€ä¸å¿ƒ..." name="manage_telehub_btn"/> </panel> diff --git a/indra/newview/skins/default/xui/zh/panel_region_terrain.xml b/indra/newview/skins/default/xui/zh/panel_region_terrain.xml index 0269c8f7345c5b7398bfeb970ccbeac02101ac24..0622cb4e739f4adbe1e6aa2227c35e97ae483d87 100644 --- a/indra/newview/skins/default/xui/zh/panel_region_terrain.xml +++ b/indra/newview/skins/default/xui/zh/panel_region_terrain.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel label="Terrain" name="Terrain"> +<panel label="地形" name="Terrain"> <text name="region_text_lbl"> 地å€ï¼š </text> @@ -14,6 +14,6 @@ <slider label="Phase" name="sun_hour_slider"/> <button label="套用" name="apply_btn"/> <button label="Download RAW terrain..." name="download_raw_btn" tool_tip="Available only to estate owners, not managers"/> - <button label="Upload RAW terrain..." name="upload_raw_btn" tool_tip="Available only to estate owners, not managers"/> + <button label="上傳 RAW 地形檔..." name="upload_raw_btn" tool_tip="Available only to estate owners, not managers"/> <button label="Bake Terrain" name="bake_terrain_btn" tool_tip="Set current terrain as mid-point for raise/lower limits"/> </panel> diff --git a/indra/newview/skins/default/xui/zh/panel_script_ed.xml b/indra/newview/skins/default/xui/zh/panel_script_ed.xml index 03b845a76c9a8ea6eda1fc13c3702e4dfa5bd935..e42d904f32c636c267ff42a6a527c2d6b0839973 100644 --- a/indra/newview/skins/default/xui/zh/panel_script_ed.xml +++ b/indra/newview/skins/default/xui/zh/panel_script_ed.xml @@ -10,10 +10,10 @@ Public Objects cannot run scripts </panel.string> <panel.string name="script_running"> - Running + åŸ·è¡Œä¸ </panel.string> <panel.string name="Title"> - Script: [NAME] + 腳本:[NAME] </panel.string> <panel.string name="external_editor_not_set"> Select an editor by setting the environment variable LL_SCRIPT_EDITOR or the ExternalEditor setting. @@ -30,7 +30,7 @@ <menu_item_call label="覆製" name="Copy"/> <menu_item_call label="貼上" name="Paste"/> <menu_item_call label="å…¨é¸" name="Select All"/> - <menu_item_call label="å–銷é¸æ“‡" name="Deselect"/> + <menu_item_call label="å–消é¸æ“‡" name="Deselect"/> <menu_item_call label="æœå°‹ / å–代..." name="Search / Replace..."/> </menu> <menu label="幫助" name="Help"> diff --git a/indra/newview/skins/default/xui/zh/panel_script_limits_region_memory.xml b/indra/newview/skins/default/xui/zh/panel_script_limits_region_memory.xml index cbb40e52def89b41ccd6c6d21c2f9ff629a32770..950abbfb4c6745a0730039bdf493d1e239174dc7 100644 --- a/indra/newview/skins/default/xui/zh/panel_script_limits_region_memory.xml +++ b/indra/newview/skins/default/xui/zh/panel_script_limits_region_memory.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel label="REGION MEMORY" name="script_limits_region_memory_panel"> +<panel label="地å€è¨˜æ†¶é«”" name="script_limits_region_memory_panel"> <text name="script_memory"> - Parcel Script Memory + 地段腳本記憶體 </text> <text name="loading_text"> 載入ä¸... @@ -10,11 +10,11 @@ <scroll_list.columns label="尺寸(kb)" name="size"/> <scroll_list.columns label="URLs" name="urls"/> <scroll_list.columns label="物件å稱" name="name"/> - <scroll_list.columns label="Object Owner" name="owner"/> + <scroll_list.columns label="物件æ“有者" name="owner"/> <scroll_list.columns label="地段" name="parcel"/> - <scroll_list.columns label="Location" name="location"/> + <scroll_list.columns label="ä½ç½®" name="location"/> </scroll_list> <button label="Refresh List" name="refresh_list_btn"/> <button label="Highlight" name="highlight_btn"/> - <button label="Return" name="return_btn"/> + <button label="退回" name="return_btn"/> </panel> diff --git a/indra/newview/skins/default/xui/zh/panel_side_tray.xml b/indra/newview/skins/default/xui/zh/panel_side_tray.xml index d0169b7c2d4333ec3aa01c04f13cc73e919aacc0..625213e376ded39aa3e08381fc4ab61eff66243c 100644 --- a/indra/newview/skins/default/xui/zh/panel_side_tray.xml +++ b/indra/newview/skins/default/xui/zh/panel_side_tray.xml @@ -2,11 +2,11 @@ <!-- Side tray cannot show background because it is always partially on screen to hold tab buttons. --> <side_tray name="sidebar"> - <sidetray_tab description="Toggle Sidebar." name="sidebar_openclose" tab_title="Toggle Sidebar"/> + <sidetray_tab description="å´é‚Šæ¬„切æ›ã€‚" name="sidebar_openclose" tab_title="å´é‚Šæ¬„切æ›"/> <sidetray_tab description="首é 。" name="sidebar_home" tab_title="首é "> <panel label="首é " name="panel_home"/> </sidetray_tab> - <sidetray_tab description="Edit your public profile and Picks." name="sidebar_me" tab_title="我的檔案"> + <sidetray_tab description="ç·¨è¼¯ä½ çš„å…¬é–‹æª”æ¡ˆåŠç²¾é¸åœ°é»žã€‚" name="sidebar_me" tab_title="我的檔案"> <panel_container name="panel_container"> <panel label="自己" name="panel_me"/> </panel_container> @@ -17,13 +17,13 @@ <panel label="Blocked Residents & Objects" name="panel_block_list_sidetray"/> </panel_container> </sidetray_tab> - <sidetray_tab description="Find places to go and places you've visited before." label="Places" name="sidebar_places" tab_title="Places"> - <panel label="Places" name="panel_places"/> + <sidetray_tab description="Find places to go and places you've visited before." label="地點" name="sidebar_places" tab_title="地點"> + <panel label="地點" name="panel_places"/> </sidetray_tab> <sidetray_tab description="ç€è¦½ä½ 的收ç´å€ã€‚" name="sidebar_inventory" tab_title="我的收ç´å€"> <panel label="編輯收ç´å€" name="sidepanel_inventory"/> </sidetray_tab> <sidetray_tab description="è®Šæ›´ä½ çš„å¤–è§€èˆ‡ç›®å‰æ¨£è²Œã€‚" name="sidebar_appearance" tab_title="我的外觀"> - <panel label="Edit Appearance" name="sidepanel_appearance"/> + <panel label="編輯外觀" name="sidepanel_appearance"/> </sidetray_tab> </side_tray> diff --git a/indra/newview/skins/default/xui/zh/panel_teleport_history.xml b/indra/newview/skins/default/xui/zh/panel_teleport_history.xml index 6c81ede76c470efbbc178c1c8eba01e197e590db..a2a63db0007e53569efeb2cceb56b093f8898f34 100644 --- a/indra/newview/skins/default/xui/zh/panel_teleport_history.xml +++ b/indra/newview/skins/default/xui/zh/panel_teleport_history.xml @@ -2,7 +2,7 @@ <panel name="Teleport History"> <accordion name="history_accordion"> <no_matched_tabs_text name="no_matched_teleports_msg" value="沒有發ç¾ä½ è¦æ‰¾çš„嗎?試試 [secondlife:///app/search/places/[SEARCH_TERM] æœå°‹]。"/> - <no_visible_tabs_text name="no_teleports_msg" value="瞬間傳é€ç´€éŒ„是空白的。試試 [secondlife:///app/search/places/ æœå°‹]。"/> + <no_visible_tabs_text name="no_teleports_msg" value="瞬間傳é€ç´€éŒ„是空白的。試試 [secondlife:///app/search/places/ Search]。"/> <accordion_tab name="today" title="今天"/> <accordion_tab name="yesterday" title="昨天"/> <accordion_tab name="2_days_ago" title="å‰å¤©"/> diff --git a/indra/newview/skins/default/xui/zh/role_actions.xml b/indra/newview/skins/default/xui/zh/role_actions.xml index 91015bb8b069411f121e2badcde90ad5e7f4ca74..534c0f39fc0e182206267b8fcb6b22878279e8f0 100644 --- a/indra/newview/skins/default/xui/zh/role_actions.xml +++ b/indra/newview/skins/default/xui/zh/role_actions.xml @@ -2,16 +2,16 @@ <role_actions> <action_set description="These Abilities include powers to add and remove group Members, and allow new Members to join without an invitation." name="Membership"> <action description="Invite People to this Group" longdescription="Invite People to this Group using the 'Invite' button in the Roles section > Members tab." name="member invite" value="1"/> - <action description="Eject Members from this Group" longdescription="Eject Members from this Group using the 'Eject' button in the Roles section > Members tab. An Owner can eject anyone except another Owner. If you're not an Owner, a Member can be ejected from a group if, and only if, they're only in the Everyone Role, and NO other Roles. To remove Members from Roles, you need to have the 'Remove Members from Roles' Ability." name="member eject" value="2"/> + <action description="將會員由這個社團ä¸è¸¢å‡º" longdescription="Eject Members from this Group using the 'Eject' button in the Roles section > Members tab. An Owner can eject anyone except another Owner. If you're not an Owner, a Member can be ejected from a group if, and only if, they're only in the Everyone Role, and NO other Roles. To remove Members from Roles, you need to have the 'Remove Members from Roles' Ability." name="member eject" value="2"/> <action description="Toggle 'Open Enrollment' and change 'Enrollment fee'" longdescription="Toggle 'Open Enrollment' to let new Members join without an invitation, and change the 'Enrollment fee' in the General section." name="member options" value="3"/> </action_set> <action_set description="These Abilities include powers to add, remove, and change group Roles, add and remove Members in Roles, and assign Abilities to Roles." name="Roles"> <action description="Create new Roles" longdescription="Create new Roles in the Roles section > Roles tab." name="role create" value="4"/> - <action description="Delete Roles" longdescription="Delete Roles in the Roles section > Roles tab." name="role delete" value="5"/> + <action description="刪除角色" longdescription="Delete Roles in the Roles section > Roles tab." name="role delete" value="5"/> <action description="Change Role names, titles, descriptions, and whether Role members are publicly revealed" longdescription="Change Role names, titles, descriptions, and whether Role members are publicly revealed. This is done at the bottom of the the Roles section > Roles tab after selecting a Role." name="role properties" value="6"/> <action description="Assign Members to Assigner's Roles" longdescription="Assign Members to Roles in the list of Assigned Roles (Roles section > Members tab). A Member with this Ability can only add Members to a Role that the assigner is already in." name="role assign member limited" value="7"/> <action description="Assign Members to Any Role" longdescription="Assign Members to Any Role in the list of Assigned Roles (Roles section > Members tab). *WARNING* Any Member in a Role with this Ability can assign themselves--and any other non-Owner Member--to Roles that have more powers than they currently have, potentially elevating themselves to near-Owner power. Be sure you know what you're doing before assigning this Ability." name="role assign member" value="8"/> - <action description="Remove Members from Roles" longdescription="Remove Members from Roles in the list of Assigned Roles (Roles section > Members tab). Owners can't be removed." name="role remove member" value="9"/> + <action description="由角色ä¸ç§»é™¤æˆå“¡" longdescription="Remove Members from Roles in the list of Assigned Roles (Roles section > Members tab). Owners can't be removed." name="role remove member" value="9"/> <action description="Assign and Remove Abilities in Roles" longdescription="Assign and Remove Abilities for each Role in the list of Allowed Abilities (Roles section > Roles tab). *WARNING* Any Member in a Role with this Ability can assign themselves--and any other non-Owner Member--all Abilities, potentially elevating themselves to near-Owner power. Be sure you know what you're doing before assigning this Ability." name="role change actions" value="10"/> </action_set> <action_set description="These Abilities include powers to modify this group's identity, such as changing public visibility, charter, and insignia." name="Group Identity"> @@ -45,7 +45,7 @@ <action description="Manage parcel Access lists" longdescription="Manage parcel Access lists in About Land > Access tab." name="land manage allowed" value="29"/> <action description="Manage parcel Ban lists" longdescription="Manage parcel Ban lists in About Land > Access tab." name="land manage banned" value="30"/> <action description="Change parcel 'Sell passes to' settings" longdescription="Change parcel 'Sell passes to' settings in About Land > Access tab." name="land manage passes" value="31"/> - <action description="Eject and freeze Residents on parcels" longdescription="Members in a Role with this Ability can handle an unwelcome Resident on a group-owned parcel by right-clicking them, then selecting 'Eject' or 'Freeze'." name="land admin" value="32"/> + <action description="將地段內的居民踢出åŠå‡çµ" longdescription="Members in a Role with this Ability can handle an unwelcome Resident on a group-owned parcel by right-clicking them, then selecting 'Eject' or 'Freeze'." name="land admin" value="32"/> </action_set> <action_set description="These Abilities include powers to allow members to return objects and place and move Linden plants. This is useful for Members to clean up litter and do landscaping, but it should also be used with care, because there's no undo for returning objects." name="Parcel Content"> <action description="Return objects owned by group" longdescription="Return objects on group-owned parcels that are owned by the group in About Land > Objects tab." name="land return group owned" value="48"/> @@ -62,8 +62,8 @@ <action description="Pay group liabilities and receive group dividends" longdescription="Members in a Role with this Ability will automatically pay group liabilities and receive group dividends. This means they will receive a portion of group-owned land sales which are distributed daily, as well as contribute towards things like parcel listing fees." name="accounting accountable" value="40"/> </action_set> <action_set description="These Abilities include powers to allow Members to send, receive, and view group Notices." name="Notices"> - <action description="Send Notices" longdescription="Members in a Role with this Ability can send Notices via the Group > Notices section." name="notices send" value="42"/> - <action description="Receive Notices and view past Notices" longdescription="Members in a Role with this Ability can receive Notices and view past Notices in Group > Notices section." name="notices receive" value="43"/> + <action description="é€å‡ºé€šçŸ¥" longdescription="Members in a Role with this Ability can send Notices via the Group > Notices section." name="notices send" value="42"/> + <action description="接收通知與察看éŽåŽ»é€šçŸ¥" longdescription="Members in a Role with this Ability can receive Notices and view past Notices in Group > Notices section." name="notices receive" value="43"/> </action_set> <action_set description="These Abilities include powers to allow or restrict access to group chat sessions and group voice chat." name="Chat"> <action description="Join Group Chat" longdescription="Members in a Role with this Ability can join group chat sessions, for text and voice." name="join group chat" value="16"/> diff --git a/indra/newview/skins/default/xui/zh/sidepanel_appearance.xml b/indra/newview/skins/default/xui/zh/sidepanel_appearance.xml index 6f8f19b26d16f0cabd1846058e727faa34bded13..7d8a502594cb8ba546ccfcd972d454d5a0f38f46 100644 --- a/indra/newview/skins/default/xui/zh/sidepanel_appearance.xml +++ b/indra/newview/skins/default/xui/zh/sidepanel_appearance.xml @@ -8,7 +8,7 @@ <button label="E" name="editappearance_btn"/> <button label="O" name="openoutfit_btn"/> <text name="currentlook_status"> - (Status) + (狀態) </text> <text name="currentlook_name"> MyOutfit With a really Long Name like MOOSE diff --git a/indra/newview/skins/default/xui/zh/sidepanel_item_info.xml b/indra/newview/skins/default/xui/zh/sidepanel_item_info.xml index 15437e3624cd5494379be6341699c812f02b8a9a..f28638d93df871dda3321bb29ef27562c9166263 100644 --- a/indra/newview/skins/default/xui/zh/sidepanel_item_info.xml +++ b/indra/newview/skins/default/xui/zh/sidepanel_item_info.xml @@ -71,6 +71,6 @@ </panel> </scroll_container> <panel name="button_panel"> - <button label="å–銷" name="cancel_btn"/> + <button label="å–消" name="cancel_btn"/> </panel> </panel> diff --git a/indra/newview/skins/default/xui/zh/sidepanel_task_info.xml b/indra/newview/skins/default/xui/zh/sidepanel_task_info.xml index a011e29184b6f5533721cb5c8b90f24b0330862f..f308f2d4d0006cf48c61cc974021e33f86edf013 100644 --- a/indra/newview/skins/default/xui/zh/sidepanel_task_info.xml +++ b/indra/newview/skins/default/xui/zh/sidepanel_task_info.xml @@ -58,18 +58,18 @@ <name_box initial_value="載入ä¸..." name="Group Name Proxy"/> <button label="Deed" label_selected="Deed" name="button deed" tool_tip="Deeding gives this item away with next owner permissions. Group shared objects can be deeded by a group officer."/> <text name="label click action"> - Click to: + 點擊以: </text> <combo_box name="clickaction"> - <combo_box.item label="Touch (default)" name="Touch/grab(default)"/> - <combo_box.item label="Sit on object" name="Sitonobject"/> - <combo_box.item label="Buy object" name="Buyobject"/> - <combo_box.item label="Pay object" name="Payobject"/> - <combo_box.item label="Open" name="Open"/> + <combo_box.item label="觸碰(é è¨ï¼‰" name="Touch/grab(default)"/> + <combo_box.item label="å在物件上" name="Sitonobject"/> + <combo_box.item label="購買物件" name="Buyobject"/> + <combo_box.item label="支付物件" name="Payobject"/> + <combo_box.item label="é–‹å•Ÿ" name="Open"/> </combo_box> <panel name="perms_inv"> <text name="perm_modify"> - You can modify this object + ä½ èƒ½ä¿®æ”¹é€™å€‹ç‰©ä»¶ </text> <text name="Anyone can:"> 任何人: @@ -94,7 +94,7 @@ <combo_box.item label="Original" name="Original"/> </combo_box> <spinner label="åƒ¹æ ¼ï¼š L$" name="Edit Cost"/> - <check_box label="Show in search" name="search_check" tool_tip="Let people see this object in search results"/> + <check_box label="顯示在æœå°‹ä¸" name="search_check" tool_tip="Let people see this object in search results"/> <text name="B:"> B: </text> @@ -115,9 +115,9 @@ </text> </panel> <panel name="button_panel"> - <button label="Open" name="open_btn"/> - <button label="Pay" name="pay_btn"/> + <button label="é–‹å•Ÿ" name="open_btn"/> + <button label="支付" name="pay_btn"/> <button label="購買" name="buy_btn"/> - <button label="Details" name="details_btn"/> + <button label="細節" name="details_btn"/> </panel> </panel> diff --git a/indra/newview/skins/default/xui/zh/strings.xml b/indra/newview/skins/default/xui/zh/strings.xml index c3f669c6869f8af16f551b047121834ae29dc413..986ab825238df0d2307bb6a692ef564c8d650d53 100644 --- a/indra/newview/skins/default/xui/zh/strings.xml +++ b/indra/newview/skins/default/xui/zh/strings.xml @@ -5,19 +5,19 @@ that are returned from one component and may appear in many places--> <strings> <string name="SECOND_LIFE"> - Second Life + 第二人生 </string> <string name="APP_NAME"> - Second Life + 第二人生 </string> <string name="CAPITALIZED_APP_NAME"> - SECOND LIFE + 第二人生 </string> <string name="SECOND_LIFE_GRID"> - Second Life Grid + ç¬¬äºŒäººç”Ÿç¶²æ ¼ </string> <string name="SUPPORT_SITE"> - Second Life Support Portal + 第二人生支æ´å…¥å£ </string> <string name="StartupDetectingHardware"> 硬體åµæ¸¬ä¸... @@ -59,37 +59,37 @@ Previous login attempt failed. Logging in, attempt [NUMBER] </string> <string name="LoginPrecaching"> - Loading world... + 世界載入ä¸... </string> <string name="LoginInitializingBrowser"> - Initializing embedded web browser... + 內嵌å¼ç¶²é ç€è¦½å™¨åˆå§‹åŒ–ä¸... </string> <string name="LoginInitializingMultimedia"> - Initializing multimedia... + 多媒體åˆå§‹åŒ–ä¸... </string> <string name="LoginInitializingFonts"> - Loading fonts... + å—型載入ä¸... </string> <string name="LoginVerifyingCache"> - Verifying cache files (can take 60-90 seconds)... + é©—è‰å¿«å–檔案(約需 60-90 秒左å³ï¼‰... </string> <string name="LoginProcessingResponse"> - Processing Response... + 回應處ç†ä¸... </string> <string name="LoginInitializingWorld"> - Initializing World... + 世界åˆå§‹åŒ–ä¸... </string> <string name="LoginDecodingImages"> - Decoding images... + 圖åƒè§£ç¢¼ä¸... </string> <string name="LoginInitializingQuicktime"> - Initializing QuickTime... + QuickTime åˆå§‹åŒ–ä¸... </string> <string name="LoginQuicktimeNotFound"> - QuickTime not found - unable to initialize. + QuickTime æœªç™¼ç¾ - 無法進行åˆå§‹åŒ–。 </string> <string name="LoginQuicktimeOK"> - QuickTime initialized successfully. + QuickTime å·²æˆåŠŸåˆå§‹åŒ–。 </string> <string name="LoginWaitingForRegionHandshake"> 地å€äº¤æ¡ç‰å¾…ä¸... @@ -125,16 +125,16 @@ 登入失敗。 </string> <string name="Quit"> - Quit + çµæŸé€€å‡º </string> <string name="create_account_url"> http://join.secondlife.com/ </string> <string name="AgentLostConnection"> - This region may be experiencing trouble. Please check your connection to the Internet. + 這個地å€å¯èƒ½éé‡å•é¡Œï¼Œè«‹æª¢æŸ¥ä½ 的網路連線。 </string> <string name="SavingSettings"> - Saving your settings... + ä½ çš„è¨å®šå„²å˜ä¸... </string> <string name="LoggingOut"> 登出ä¸... @@ -149,10 +149,10 @@ You were sent to an invalid region. </string> <string name="TestingDisconnect"> - Testing viewer disconnect + 測試ç€è¦½å™¨æ–·ç·š </string> <string name="TooltipPerson"> - Person + 人 </string> <string name="TooltipNoName"> (no name) @@ -173,41 +173,41 @@ Group Build </string> <string name="TooltipFlagNoBuild"> - No Build + ç¦æ¢å»ºé€ </string> <string name="TooltipFlagNoEdit"> - Group Build + ç¤¾åœ˜å»ºé€ </string> <string name="TooltipFlagNotSafe"> - Not Safe + éžå®‰å…¨ </string> <string name="TooltipFlagNoFly"> ç¦æ¢é£›è¡Œ </string> <string name="TooltipFlagGroupScripts"> - Group Scripts + 社團腳本 </string> <string name="TooltipFlagNoScripts"> - No Scripts + ç¦æ¢è…³æœ¬ </string> <string name="TooltipLand"> - Land: + 土地: </string> <string name="TooltipMustSingleDrop"> - Only a single item can be dragged here + åªæœ‰ä¸€å€‹ç‰©å“å¯ä»¥è¢«æ‹–曳到æ¤è™• </string> <string name="TooltipPrice" value="L$[AMOUNT]:"/> <string name="TooltipHttpUrl"> 點擊以察看這個網é </string> <string name="TooltipSLURL"> - Click to view this location's information + 點擊以察看這個ä½ç½®è³‡è¨Š </string> <string name="TooltipAgentUrl"> - Click to view this Resident's profile + 點擊以察看這個居民檔案 </string> <string name="TooltipAgentInspect"> - Learn more about this Resident + çžè§£æ›´å¤šæœ‰é—œé€™å€‹å±…æ°‘ </string> <string name="TooltipAgentMute"> Click to mute this Resident @@ -219,7 +219,7 @@ 點擊開始 IM 這ä½å±…æ°‘ </string> <string name="TooltipAgentPay"> - Click to Pay this Resident + 點擊以支付這ä½å±…æ°‘ </string> <string name="TooltipAgentOfferTeleport"> Click to offer a teleport request to this Resident @@ -268,7 +268,7 @@ IM </string> <string name="SLappAgentPay"> - Pay + 支付 </string> <string name="SLappAgentOfferTeleport"> Offer Teleport to @@ -286,7 +286,7 @@ 關閉 </string> <string name="BUTTON_RESTORE"> - Restore + 還原 </string> <string name="BUTTON_MINIMIZE"> 最å°åŒ– @@ -331,7 +331,7 @@ Avaline Caller [ORDER] </string> <string name="AssetErrorNone"> - No error + 無錯誤 </string> <string name="AssetErrorRequestFailed"> Asset request: failed @@ -361,13 +361,13 @@ Viewer and server do not agree on price </string> <string name="AssetErrorUnknownStatus"> - Unknown status + 未知狀態 </string> <string name="texture"> æ質 </string> <string name="sound"> - sound + è²éŸ³ </string> <string name="calling card"> calling card @@ -382,10 +382,10 @@ æœè£ </string> <string name="object"> - object + 物件 </string> <string name="note card"> - notecard + è¨˜äº‹å¡ </string> <string name="folder"> 資料夾 @@ -403,28 +403,28 @@ tga æ質 </string> <string name="body part"> - body part + èº«é«”éƒ¨ä½ </string> <string name="snapshot"> - snapshot + å¿«ç…§ </string> <string name="lost and found"> Lost and Found </string> <string name="targa image"> - targa image + targa åœ–åƒ </string> <string name="trash"> - Trash + 垃圾桶 </string> <string name="jpeg image"> - jpeg image + jpeg åœ–åƒ </string> <string name="animation"> - animation + 動作 </string> <string name="gesture"> - gesture + 姿勢 </string> <string name="simstate"> simstate @@ -439,13 +439,13 @@ folder link </string> <string name="AvatarEditingAppearance"> - (Editing Appearance) + (外觀編輯ä¸ï¼‰ </string> <string name="AvatarAway"> - Away + 離開 </string> <string name="AvatarBusy"> - Busy + 忙碌 </string> <string name="AvatarMuted"> Blocked @@ -661,13 +661,13 @@ 載入ä¸... </string> <string name="worldmap_offline"> - Offline + 離線 </string> <string name="worldmap_item_tooltip_format"> [AREA] m² L$[PRICE] </string> <string name="worldmap_results_none_found"> - None found. + 沒有發ç¾ã€‚ </string> <string name="Ok"> 確定 @@ -748,10 +748,10 @@ Moderate </string> <string name="SIM_ACCESS_ADULT"> - Adult + æˆäºº </string> <string name="SIM_ACCESS_DOWN"> - Offline + 離線 </string> <string name="SIM_ACCESS_MIN"> 未知 @@ -760,40 +760,40 @@ (未知) </string> <string name="Estate / Full Region"> - Estate / Full Region + é ˜åœ° / å®Œæ•´åœ°å€ </string> <string name="Estate / Homestead"> - Estate / Homestead + é ˜åœ° / 家園 </string> <string name="Mainland / Homestead"> - Mainland / Homestead + 大陸 / 家園 </string> <string name="Mainland / Full Region"> - Mainland / Full Region + 大陸 / å®Œæ•´åœ°å€ </string> <string name="all_files"> 全部檔案 </string> <string name="sound_files"> - Sounds + è²éŸ³ </string> <string name="animation_files"> - Animations + 動作 </string> <string name="image_files"> - Images + åœ–åƒ </string> <string name="save_file_verb"> - Save + å„²å˜ </string> <string name="load_file_verb"> - Load + 載入 </string> <string name="targa_image_files"> - Targa Images + Targa åœ–åƒ </string> <string name="bitmap_image_files"> - Bitmap Images + Bitmap åœ–åƒ </string> <string name="avi_movie_file"> AVI 影片檔案 @@ -808,34 +808,34 @@ RAW File </string> <string name="compressed_image_files"> - Compressed Images + å£“ç¸®çš„åœ–åƒ </string> <string name="load_files"> - Load Files + 載入檔案 </string> <string name="choose_the_directory"> - Choose Directory + é¸æ“‡ç›®éŒ„ </string> <string name="AvatarSetNotAway"> - Not Away + éžé›¢é–‹ </string> <string name="AvatarSetAway"> - Away + 離開 </string> <string name="AvatarSetNotBusy"> - Not Busy + éžå¿™ç¢Œ </string> <string name="AvatarSetBusy"> - Busy + 忙碌 </string> <string name="shape"> - Shape + 體形 </string> <string name="skin"> - Skin + 皮膚 </string> <string name="hair"> - Hair + é é«® </string> <string name="eyes"> çœ¼ç› @@ -877,49 +877,49 @@ Physics </string> <string name="invalid"> - invalid + 無效 </string> <string name="none"> ç„¡ </string> <string name="shirt_not_worn"> - Shirt not worn + 襯衫未穿 </string> <string name="pants_not_worn"> - Pants not worn + 褲å未穿 </string> <string name="shoes_not_worn"> - Shoes not worn + éž‹å未穿 </string> <string name="socks_not_worn"> - Socks not worn + 襪å未穿 </string> <string name="jacket_not_worn"> - Jacket not worn + 夾克未穿 </string> <string name="gloves_not_worn"> - Gloves not worn + 手套未穿 </string> <string name="undershirt_not_worn"> - Undershirt not worn + 內衣未穿 </string> <string name="underpants_not_worn"> - Underpants not worn + 內褲未穿 </string> <string name="skirt_not_worn"> - Skirt not worn + 裙å未穿 </string> <string name="alpha_not_worn"> Alpha not worn </string> <string name="tattoo_not_worn"> - Tattoo not worn + 刺é’未穿 </string> <string name="physics_not_worn"> Physics not worn </string> <string name="invalid_not_worn"> - invalid + 無效 </string> <string name="create_new_shape"> å‰µé€ æ–°é«”å½¢ @@ -931,34 +931,34 @@ å‰µé€ æ–°é é«® </string> <string name="create_new_eyes"> - å‰µè€–æ–°çœ¼ç› + å‰µé€ æ–°çœ¼ç› </string> <string name="create_new_shirt"> - Create new shirt + å‰µé€ æ–°è¥¯è¡« </string> <string name="create_new_pants"> - Create new pants + å‰µé€ æ–°è¤²å </string> <string name="create_new_shoes"> - Create new shoes + å‰µé€ æ–°éž‹å </string> <string name="create_new_socks"> - Create new socks + å‰µé€ æ–°è¥ªå </string> <string name="create_new_jacket"> - Create new jacket + å‰µé€ æ–°å¤¾å…‹ </string> <string name="create_new_gloves"> - Create new gloves + å‰µé€ æ–°æ‰‹å¥— </string> <string name="create_new_undershirt"> - Create new undershirt + å‰µé€ æ–°å…§è¡£ </string> <string name="create_new_underpants"> - Create new underpants + å‰µé€ æ–°å…§è¤² </string> <string name="create_new_skirt"> - Create new skirt + å‰µé€ æ–°è£™å </string> <string name="create_new_alpha"> Create new alpha @@ -970,13 +970,13 @@ Create new physics </string> <string name="create_new_invalid"> - invalid + 無效 </string> <string name="NewWearable"> - New [WEARABLE_ITEM] + æ–° [WEARABLE_ITEM] </string> <string name="next"> - Next + 下一個 </string> <string name="ok"> 確定 @@ -988,7 +988,7 @@ 社團通知 </string> <string name="GroupNotifySentBy"> - Sent by + é€å‡ºç”± </string> <string name="GroupNotifyAttached"> Attached: @@ -1006,16 +1006,16 @@ Teleport offering </string> <string name="StartUpNotifications"> - New notifications arrived while you were away. + ç•¶ä½ é›¢é–‹æ™‚æœ‰æ–°çš„é€šçŸ¥é€é”。 </string> <string name="OverflowInfoChannelString"> - You have %d more notification + ä½ æœ‰ç´„ %d 通知 </string> <string name="BodyPartsRightArm"> Right Arm </string> <string name="BodyPartsHead"> - Head + é 部 </string> <string name="BodyPartsLeftArm"> Left Arm @@ -1024,7 +1024,7 @@ Left Leg </string> <string name="BodyPartsTorso"> - Torso + 軀幹 </string> <string name="BodyPartsRightLeg"> Right Leg @@ -1175,7 +1175,7 @@ 我的è£æ‰® </string> <string name="InvFolder Accessories"> - Accessories + é…件 </string> <string name="InvFolder Friends"> æœ‹å‹ @@ -1253,7 +1253,7 @@ 嘴 </string> <string name="Chin"> - Chin + 下巴 </string> <string name="Left Ear"> 左耳 @@ -1328,7 +1328,7 @@ [AGEDAYS] old </string> <string name="TodayOld"> - ä»Šæ—¥å‰›åŠ å…¥ + é«˜æ—¥å‰›åŠ å…¥ </string> <string name="AgeYearsA"> [COUNT] å¹´ @@ -1367,16 +1367,16 @@ [COUNT] 天 </string> <string name="GroupMembersA"> - [COUNT] member + [COUNT] æˆå“¡ </string> <string name="GroupMembersB"> - [COUNT] members + [COUNT] æˆå“¡ </string> <string name="GroupMembersC"> - [COUNT] members + [COUNT] æˆå“¡ </string> <string name="AcctTypeResident"> - Resident + å±…æ°‘ </string> <string name="AcctTypeTrial"> Trial @@ -1457,28 +1457,28 @@ reset </string> <string name="RunQueueTitle"> - Set Running Progress + è¨å®šåŸ·è¡Œä¸ç¨‹åº </string> <string name="RunQueueStart"> - set running + è¨ç‚ºåŸ·è¡Œä¸ </string> <string name="NotRunQueueTitle"> - Set Not Running Progress + è¨å®šéžåŸ·è¡Œä¸ç¨‹åº </string> <string name="NotRunQueueStart"> - set not running + è¨ç‚ºéžåŸ·è¡Œä¸ </string> <string name="CompileSuccessful"> - Compile successful! + ç·¨è¯æˆåŠŸ!! </string> <string name="CompileSuccessfulSaving"> - Compile successful, saving... + ç·¨è¯æˆåŠŸï¼Œå„²å˜ä¸... </string> <string name="SaveComplete"> - Save complete. + 儲å˜å®Œç•¢ã€‚ </string> <string name="ObjectOutOfRange"> - Script (object out of range) + 腳本(物件超出範åœï¼‰ </string> <string name="GodToolsObjectOwnedBy"> Object [OBJECT] owned by [OWNER] @@ -1537,7 +1537,7 @@ Allowed groups: ([ALLOWEDGROUPS], max [MAXACCESS]) </string> <string name="ScriptLimitsParcelScriptMemory"> - Parcel Script Memory + 地段腳本記憶體 </string> <string name="ScriptLimitsParcelsOwned"> Parcels Listed: [PARCELS] @@ -1579,7 +1579,7 @@ Chest </string> <string name="ATTACH_HEAD"> - Head + é 部 </string> <string name="ATTACH_LSHOULDER"> Left Shoulder @@ -1609,7 +1609,7 @@ Mouth </string> <string name="ATTACH_CHIN"> - Chin + 下巴 </string> <string name="ATTACH_LEAR"> Left Ear @@ -1750,7 +1750,7 @@ You haven't created any Picks or Classifieds. Click the Plus button below to create a Pick or Classified. </string> <string name="NoAvatarPicksClassifiedsText"> - User has no picks or classifieds + 使用者無精é¸åœ°é»žæˆ–個人廣告 </string> <string name="PicksClassifiedsLoadingText"> 載入ä¸... @@ -1819,7 +1819,7 @@ Acquired Items </string> <string name="Cancel"> - å–銷 + å–消 </string> <string name="UploadingCosts"> 花費 L$ [AMOUNT] 上傳 [NAME] @@ -1919,7 +1919,7 @@ Down </string> <string name="Any Category"> - Any Category + 任何類別 </string> <string name="Shopping"> Shopping @@ -1955,7 +1955,7 @@ Linden Location </string> <string name="Adult"> - Adult + æˆäºº </string> <string name="Arts&Culture"> Arts & Culture @@ -2392,7 +2392,7 @@ If you continue to receive this message, contact the [SUPPORT_SITE]. Chest Size </string> <string name="Chin Angle"> - Chin Angle + 下巴角度 </string> <string name="Chin Cleft"> Chin Cleft @@ -2629,7 +2629,7 @@ If you continue to receive this message, contact the [SUPPORT_SITE]. Glove Length </string> <string name="Hair"> - Hair + é é«® </string> <string name="Hair Back"> Hair: Back @@ -3565,7 +3565,7 @@ If you continue to receive this message, contact the [SUPPORT_SITE]. ä¸å…許飛行 </string> <string name="LocationCtrlPushTooltip"> - No pushing + ç¦æ¢æŽ¨æ’ž </string> <string name="LocationCtrlBuildTooltip"> Building/dropping objects not allowed @@ -3577,43 +3577,43 @@ If you continue to receive this message, contact the [SUPPORT_SITE]. Health </string> <string name="LocationCtrlAdultIconTooltip"> - Adult Region + æˆäººåœ°å€ </string> <string name="LocationCtrlModerateIconTooltip"> Moderate Region </string> <string name="LocationCtrlGeneralIconTooltip"> - General Region + ä¸€èˆ¬åœ°å€ </string> <string name="UpdaterWindowTitle"> - [APP_NAME] Update + [APP_NAME] æ›´æ–° </string> <string name="UpdaterNowUpdating"> - Now updating [APP_NAME]... + [APP_NAME] ç¾æ›´æ–°ä¸... </string> <string name="UpdaterNowInstalling"> - Installing [APP_NAME]... + [APP_NAME] 安è£ä¸... </string> <string name="UpdaterUpdatingDescriptive"> Your [APP_NAME] Viewer is being updated to the latest release. This may take some time, so please be patient. </string> <string name="UpdaterProgressBarTextWithEllipses"> - Downloading update... + 更新下載ä¸... </string> <string name="UpdaterProgressBarText"> - Downloading update + 更新下載 </string> <string name="UpdaterFailDownloadTitle"> - Failed to download update + å¤è¼‰æ›´æ–°å¤±æ•— </string> <string name="UpdaterFailUpdateDescriptive"> An error occurred while updating [APP_NAME]. Please download the latest version from www.secondlife.com. </string> <string name="UpdaterFailInstallTitle"> - Failed to install update + 安è£æ›´æ–°å¤±æ•— </string> <string name="UpdaterFailStartTitle"> - Failed to start viewer + å•Ÿå‹•ç€è¦½å™¨å¤±æ•— </string> <string name="ItemsComingInTooFastFrom"> [APP_NAME]: Items coming in too fast from [FROM_NAME], automatic preview disabled for [TIME] seconds @@ -3625,7 +3625,7 @@ If you continue to receive this message, contact the [SUPPORT_SITE]. -- Instant message logging enabled -- </string> <string name="IM_typing_start_string"> - [NAME] is typing... + [NAME] æ£åœ¨è¼¸å…¥... </string> <string name="Unnamed"> (Unnamed) @@ -3688,13 +3688,13 @@ If you continue to receive this message, contact the [SUPPORT_SITE]. Drag items from inventory here </string> <string name="no_session_message"> - (IM Session Doesn't Exist) + (IM 會話ä¸å˜åœ¨ï¼‰ </string> <string name="only_user_message"> You are the only user in this session. </string> <string name="offline_message"> - [NAME] is offline. + [NAME] 離線。 </string> <string name="invite_message"> Click the [BUTTON NAME] button to accept/connect to this voice chat. @@ -3712,7 +3712,7 @@ If you continue to receive this message, contact the [SUPPORT_SITE]. You do not have sufficient permissions. </string> <string name="session_does_not_exist_error"> - The session no longer exists + æ¤æœƒè©±ä¸å†å˜åœ¨ </string> <string name="no_ability_error"> You do not have that ability. @@ -3793,13 +3793,13 @@ If you continue to receive this message, contact the [SUPPORT_SITE]. for deeding land </string> <string name="to create a group"> - to create a group + ä»¥å‰µé€ ç¤¾åœ˜ </string> <string name="to join a group"> - to join a group + ä»¥åŠ å…¥ç¤¾åœ˜ </string> <string name="to upload"> - to upload + 以上傳 </string> <string name="to publish a classified ad"> to publish a classified ad @@ -3820,7 +3820,7 @@ If you continue to receive this message, contact the [SUPPORT_SITE]. This object costs L$ [AMOUNT] </string> <string name="group_role_everyone"> - Everyone + 任何人 </string> <string name="group_role_officers"> Officers @@ -3829,7 +3829,7 @@ If you continue to receive this message, contact the [SUPPORT_SITE]. Owners </string> <string name="group_member_status_online"> - Online + 上線 </string> <string name="uploading_abuse_report"> 上傳ä¸... @@ -4014,7 +4014,7 @@ If you continue to receive this message, contact the [SUPPORT_SITE]. ç„¡/ç„¡ </string> <string name="texture_load_dimensions_error"> - Can't load images larger than [WIDTH]*[HEIGHT] + 無法載入圖åƒå¤§æ–¼ [WIDTH]*[HEIGHT] </string> <string name="words_separator" value=","/> <string name="server_is_down"> @@ -4051,7 +4051,7 @@ If you continue to receive this message, contact the [SUPPORT_SITE]. Membership </string> <string name="Roles"> - Roles + 角色 </string> <string name="Group Identity"> Group Identity @@ -4081,7 +4081,7 @@ If you continue to receive this message, contact the [SUPPORT_SITE]. Accounting </string> <string name="Notices"> - Notices + 通知 </string> <string name="Chat"> èŠå¤© diff --git a/indra/newview/skins/default/xui/zh/teleport_strings.xml b/indra/newview/skins/default/xui/zh/teleport_strings.xml index 9702832f44f5f6e0b7b6c0d22d2dde8ccb844f58..b18eb4a3907b6116801e0ecadd61c4f335628db4 100644 --- a/indra/newview/skins/default/xui/zh/teleport_strings.xml +++ b/indra/newview/skins/default/xui/zh/teleport_strings.xml @@ -53,7 +53,7 @@ Try again in a moment. Relaying to destination. </message> <message name="sending_home"> - 傳é€å®¶ä½ç½®çš„è¦æ±‚。 + é€å‡ºå®¶ä½ç½®çš„è¦æ±‚。 </message> <message name="sending_landmark"> 地標ä½ç½®è¦æ±‚瞬間傳é€ä¸ã€‚ diff --git a/indra/newview/skins/minimal/xui/da/floater_camera.xml b/indra/newview/skins/minimal/xui/da/floater_camera.xml new file mode 100644 index 0000000000000000000000000000000000000000..5b7ef6db5460f829908dfb6938e3a2172437f79c --- /dev/null +++ b/indra/newview/skins/minimal/xui/da/floater_camera.xml @@ -0,0 +1,65 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="camera_floater" title=""> + <floater.string name="rotate_tooltip"> + Roter kamera omkring fokus + </floater.string> + <floater.string name="zoom_tooltip"> + Zoom kamera mod fokus + </floater.string> + <floater.string name="move_tooltip"> + Flyt kamera op og ned, til venstre og højre + </floater.string> + <floater.string name="camera_modes_title"> + Kamera valg + </floater.string> + <floater.string name="pan_mode_title"> + Kredsløb zoom panorering + </floater.string> + <floater.string name="presets_mode_title"> + Forvalg + </floater.string> + <floater.string name="free_mode_title"> + Se objekt + </floater.string> + <panel name="controls"> + <panel name="preset_views_list"> + <panel_camera_item name="front_view"> + <panel_camera_item.text name="front_view_text"> + Se forfra + </panel_camera_item.text> + </panel_camera_item> + <panel_camera_item name="group_view"> + <panel_camera_item.text name="side_view_text"> + Se fra siden + </panel_camera_item.text> + </panel_camera_item> + <panel_camera_item name="rear_view"> + <panel_camera_item.text name="rear_view_text"> + Se bagfra + </panel_camera_item.text> + </panel_camera_item> + </panel> + <panel name="camera_modes_list"> + <panel_camera_item name="object_view"> + <panel_camera_item.text name="object_view_text"> + Se fra objekt + </panel_camera_item.text> + </panel_camera_item> + <panel_camera_item name="mouselook_view"> + <panel_camera_item.text name="mouselook_view_text"> + Førsteperson + </panel_camera_item.text> + </panel_camera_item> + </panel> + <panel name="zoom" tool_tip="Zoom kamera mod fokus"> + <joystick_rotate name="cam_rotate_stick" tool_tip="Kamera kredser rundt om fokus"/> + <slider_bar name="zoom_slider" tool_tip="Zoom kamera mod fokus"/> + <joystick_track name="cam_track_stick" tool_tip="Flyt kamera op og ned, venstre og højre"/> + </panel> + </panel> + <panel name="buttons"> + <button label="" name="presets_btn" tool_tip="Forvalg"/> + <button label="" name="pan_btn" tool_tip="Kredsløb zoom panorering"/> + <button label="" name="avatarview_btn" tool_tip="Kamera valg"/> + </panel> +</floater> diff --git a/indra/newview/skins/minimal/xui/da/floater_help_browser.xml b/indra/newview/skins/minimal/xui/da/floater_help_browser.xml new file mode 100644 index 0000000000000000000000000000000000000000..0e2918e4e2d10b4ccbb63546a1cbdbd64f6f5866 --- /dev/null +++ b/indra/newview/skins/minimal/xui/da/floater_help_browser.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_help_browser" title="HVORDAN"> + <floater.string name="loading_text"> + Henter... + </floater.string> + <layout_stack name="stack1"> + <layout_panel name="external_controls"/> + </layout_stack> +</floater> diff --git a/indra/newview/skins/minimal/xui/da/floater_media_browser.xml b/indra/newview/skins/minimal/xui/da/floater_media_browser.xml new file mode 100644 index 0000000000000000000000000000000000000000..42fbdeaa9ea44e8f6db8fb03d1724fb1cea9f2be --- /dev/null +++ b/indra/newview/skins/minimal/xui/da/floater_media_browser.xml @@ -0,0 +1,30 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_about" title="MEDIA BROWSER"> + <floater.string name="home_page_url"> + http://www.secondlife.com + </floater.string> + <floater.string name="support_page_url"> + http://support.secondlife.com + </floater.string> + <layout_stack name="stack1"> + <layout_panel name="nav_controls"> + <button label="Tilbage" name="back"/> + <button label="Frem" name="forward"/> + <button label="Genlæs" name="reload"/> + <button label="Go" name="go"/> + </layout_panel> + <layout_panel name="time_controls"> + <button label="tilbage" name="rewind"/> + <button label="stop" name="stop"/> + <button label="fremad" name="seek"/> + </layout_panel> + <layout_panel name="parcel_owner_controls"> + <button label="Send denne side til parcel" name="assign"/> + </layout_panel> + <layout_panel name="external_controls"> + <button label="Ã…ben i min internetbrowser" name="open_browser"/> + <check_box label="Ã…ben altid i min internetbrowser" name="open_always"/> + <button label="Luk" name="close"/> + </layout_panel> + </layout_stack> +</floater> diff --git a/indra/newview/skins/minimal/xui/da/floater_nearby_chat.xml b/indra/newview/skins/minimal/xui/da/floater_nearby_chat.xml new file mode 100644 index 0000000000000000000000000000000000000000..bd17224259a7ea66a7e0cb07dbf36b369c2f7575 --- /dev/null +++ b/indra/newview/skins/minimal/xui/da/floater_nearby_chat.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="nearby_chat" title="CHAT NÆRVED"> + <check_box label="Oversæt chat (hÃ¥ndteret af Google)" name="translate_chat_checkbox"/> +</floater> diff --git a/indra/newview/skins/minimal/xui/da/floater_web_content.xml b/indra/newview/skins/minimal/xui/da/floater_web_content.xml new file mode 100644 index 0000000000000000000000000000000000000000..0410f743246a1094bf99e1c5d0702dbaf4bb711c --- /dev/null +++ b/indra/newview/skins/minimal/xui/da/floater_web_content.xml @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_web_content" title=""> + <layout_stack name="stack1"> + <layout_panel name="nav_controls"> + <button name="back" tool_tip="GÃ¥ bagud"/> + <button name="forward" tool_tip="GÃ¥ frem"/> + <button name="stop" tool_tip="Stop"/> + <button name="reload" tool_tip="Genindlæs side"/> + <combo_box name="address" tool_tip="Indtast URL her"/> + <icon name="media_secure_lock_flag" tool_tip="Sikker browsing"/> + <button name="popexternal" tool_tip="Ã…ben denne URL i din normale internet browser"/> + </layout_panel> + </layout_stack> +</floater> diff --git a/indra/newview/skins/minimal/xui/da/inspect_avatar.xml b/indra/newview/skins/minimal/xui/da/inspect_avatar.xml new file mode 100644 index 0000000000000000000000000000000000000000..dc1ed562eb2fb9abe58ac166d9e286c7b35da626 --- /dev/null +++ b/indra/newview/skins/minimal/xui/da/inspect_avatar.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<!-- + Not can_close / no title to avoid window chrome + Single instance - only have one at a time, recycle it each spawn +--> +<floater name="inspect_avatar"> + <string name="Subtitle"> + [AGE] + </string> + <string name="Details"> + [SL_PROFILE] + </string> + <text name="user_details"> + Dette er min second life beskrivelse og jeg synes den er rigtig god. Men af en eller ande grund er min beskrivelse meget lang fordi jeg taler en hel masse + </text> + <slider name="volume_slider" tool_tip="Stemme lydstyrke" value="0.5"/> + <button label="Tilføj ven" name="add_friend_btn"/> + <button label="IM" name="im_btn"/> + <button label="Profil" name="view_profile_btn"/> + <panel name="moderator_panel"> + <button label="SlÃ¥ stemme-chat fra" name="disable_voice"/> + <button label="SlÃ¥ stemme-chat til" name="enable_voice"/> + </panel> +</floater> diff --git a/indra/newview/skins/minimal/xui/da/inspect_object.xml b/indra/newview/skins/minimal/xui/da/inspect_object.xml new file mode 100644 index 0000000000000000000000000000000000000000..78ccc5b8699c3a7aa8b96354f0c81c251958e0f8 --- /dev/null +++ b/indra/newview/skins/minimal/xui/da/inspect_object.xml @@ -0,0 +1,41 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<!-- + Not can_close / no title to avoid window chrome + Single instance - only have one at a time, recycle it each spawn +--> +<floater name="inspect_object"> + <string name="Creator"> + Af [CREATOR] + </string> + <string name="CreatorAndOwner"> + Af [CREATOR] +Owner [OWNER] + </string> + <string name="Price"> + L$[AMOUNT] + </string> + <string name="PriceFree"> + Gratis! + </string> + <string name="Touch"> + Berør + </string> + <string name="Sit"> + Sid + </string> + <text name="object_name" value="Test objekt navn der reelt er to linier og meget lang"/> + <text name="price_text"> + L$30,000 + </text> + <text name="object_description"> + Dette er en meget lang beskrivelse af et objekt udformet sÃ¥ den fylder mindst 80 karakterer i længden eller endda nærmere 120 pÃ¥ dette sted. Man kan aldrig vide.... + </text> + <button label="Køb" name="buy_btn"/> + <button label="Betal" name="pay_btn"/> + <button label="Tag kopi" name="take_free_copy_btn"/> + <button label="Berør" name="touch_btn"/> + <button label="Sid" name="sit_btn"/> + <button label="Ã…ben" name="open_btn"/> + <icon name="secure_browsing" tool_tip="Sikker Browsing"/> + <button label="Mere" name="more_info_btn"/> +</floater> diff --git a/indra/newview/skins/minimal/xui/da/menu_add_wearable_gear.xml b/indra/newview/skins/minimal/xui/da/menu_add_wearable_gear.xml new file mode 100644 index 0000000000000000000000000000000000000000..1e8301dc4cb412448cb04f7b780abc65ca09a2dc --- /dev/null +++ b/indra/newview/skins/minimal/xui/da/menu_add_wearable_gear.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Add Wearable Gear Menu"> + <menu_item_check label="Sortér efter nyeste" name="sort_by_most_recent"/> + <menu_item_check label="Sortér efter navn" name="sort_by_name"/> + <menu_item_check label="Sortér efter type" name="sort_by_type"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/da/menu_attachment_other.xml b/indra/newview/skins/minimal/xui/da/menu_attachment_other.xml new file mode 100644 index 0000000000000000000000000000000000000000..ca7b18494248bf85eb568999aa60af14fd378106 --- /dev/null +++ b/indra/newview/skins/minimal/xui/da/menu_attachment_other.xml @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<!-- *NOTE: See also menu_avatar_other.xml --> +<context_menu name="Avatar Pie"> + <menu_item_call label="Profil" name="Profile..."/> + <menu_item_call label="Tilføj ven" name="Add Friend"/> + <menu_item_call label="Send besked" name="Send IM..."/> + <menu_item_call label="Opkald" name="Call"/> + <menu_item_call label="Invitér til gruppe" name="Invite..."/> + <menu_item_call label="Blokér" name="Avatar Mute"/> + <menu_item_call label="Rapportér" name="abuse"/> + <menu_item_call label="Frys" name="Freeze..."/> + <menu_item_call label="Smid ud" name="Eject..."/> + <menu_item_call label="Debug teksturer" name="Debug..."/> + <menu_item_call label="Zoom ind" name="Zoom In"/> + <menu_item_call label="Betal" name="Pay..."/> + <menu_item_call label="Objekt profil" name="Object Inspect"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/da/menu_attachment_self.xml b/indra/newview/skins/minimal/xui/da/menu_attachment_self.xml new file mode 100644 index 0000000000000000000000000000000000000000..35ba27f9e23c06730764a83a679c426ab6e9498b --- /dev/null +++ b/indra/newview/skins/minimal/xui/da/menu_attachment_self.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Attachment Pie"> + <menu_item_call label="Berør" name="Attachment Object Touch"/> + <menu_item_call label="Redigér" name="Edit..."/> + <menu_item_call label="Tag af" name="Detach"/> + <menu_item_call label="Sid ned" name="Sit Down Here"/> + <menu_item_call label="StÃ¥ op" name="Stand Up"/> + <menu_item_call label="Udseende" name="Change Outfit"/> + <menu_item_call label="Redigér mit sæt" name="Edit Outfit"/> + <menu_item_call label="Redigér min figur" name="Edit My Shape"/> + <menu_item_call label="Venner" name="Friends..."/> + <menu_item_call label="Grupper" name="Groups..."/> + <menu_item_call label="Profil" name="Profile..."/> + <menu_item_call label="Debug teksturer" name="Debug..."/> + <menu_item_call label="Smid" name="Drop"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/da/menu_avatar_icon.xml b/indra/newview/skins/minimal/xui/da/menu_avatar_icon.xml new file mode 100644 index 0000000000000000000000000000000000000000..26b58ce1ab41bc477562b3fa24039da6e9528550 --- /dev/null +++ b/indra/newview/skins/minimal/xui/da/menu_avatar_icon.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Avatar Icon Menu"> + <menu_item_call label="Profil" name="Show Profile"/> + <menu_item_call label="Send besked..." name="Send IM"/> + <menu_item_call label="Tilføj ven..." name="Add Friend"/> + <menu_item_call label="Fjern ven..." name="Remove Friend"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/da/menu_avatar_other.xml b/indra/newview/skins/minimal/xui/da/menu_avatar_other.xml new file mode 100644 index 0000000000000000000000000000000000000000..a778dedf0bcbe9fe2ef14f6281db19679178f041 --- /dev/null +++ b/indra/newview/skins/minimal/xui/da/menu_avatar_other.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<!-- *NOTE: See also menu_attachment_other.xml --> +<context_menu name="Avatar Pie"> + <menu_item_call label="Profil" name="Profile..."/> + <menu_item_call label="Tilføj ven" name="Add Friend"/> + <menu_item_call label="Besked" name="Send IM..."/> + <menu_item_call label="Opkald" name="Call"/> + <menu_item_call label="Invitér til gruppe" name="Invite..."/> + <menu_item_call label="Blokér" name="Avatar Mute"/> + <menu_item_call label="Rapportér" name="abuse"/> + <menu_item_call label="Frys" name="Freeze..."/> + <menu_item_call label="Smid ud" name="Eject..."/> + <menu_item_call label="Debug Teksturer" name="Debug..."/> + <menu_item_call label="Zoom ind" name="Zoom In"/> + <menu_item_call label="Betal" name="Pay..."/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/da/menu_avatar_self.xml b/indra/newview/skins/minimal/xui/da/menu_avatar_self.xml new file mode 100644 index 0000000000000000000000000000000000000000..0080f7a59ea368aded975102d0b2c9a668af1e2b --- /dev/null +++ b/indra/newview/skins/minimal/xui/da/menu_avatar_self.xml @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Self Pie"> + <menu_item_call label="Sid ned" name="Sit Down Here"/> + <menu_item_call label="StÃ¥ op" name="Stand Up"/> + <context_menu label="Tag af" name="Take Off >"> + <context_menu label="Tøj" name="Clothes >"> + <menu_item_call label="Trøje" name="Shirt"/> + <menu_item_call label="Bukser" name="Pants"/> + <menu_item_call label="Nederdel" name="Skirt"/> + <menu_item_call label="Sko" name="Shoes"/> + <menu_item_call label="Strømper" name="Socks"/> + <menu_item_call label="Jakke" name="Jacket"/> + <menu_item_call label="Handsker" name="Gloves"/> + <menu_item_call label="Undertrøje" name="Self Undershirt"/> + <menu_item_call label="Underbukser" name="Self Underpants"/> + <menu_item_call label="Tatovering" name="Self Tattoo"/> + <menu_item_call label="Alpha" name="Self Alpha"/> + <menu_item_call label="Alt tøj" name="All Clothes"/> + </context_menu> + <context_menu label="HUD" name="Object Detach HUD"/> + <context_menu label="Tag af" name="Object Detach"/> + <menu_item_call label="Tag alt af" name="Detach All"/> + </context_menu> + <menu_item_call label="Mit udseende" name="Chenge Outfit"/> + <menu_item_call label="Redigér mit sæt" name="Edit Outfit"/> + <menu_item_call label="Redigér min form" name="Edit My Shape"/> + <menu_item_call label="Venner" name="Friends..."/> + <menu_item_call label="Grupper" name="Groups..."/> + <menu_item_call label="Profil" name="Profile..."/> + <menu_item_call label="Debug teksturer" name="Debug..."/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/da/menu_bottomtray.xml b/indra/newview/skins/minimal/xui/da/menu_bottomtray.xml new file mode 100644 index 0000000000000000000000000000000000000000..9ac296904a839aedc858915563ca7d58a7c3462c --- /dev/null +++ b/indra/newview/skins/minimal/xui/da/menu_bottomtray.xml @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="hide_camera_move_controls_menu"> + <menu_item_check label="Stemme aktiveret" name="EnableVoiceChat"/> + <menu_item_check label="Faste bevægelser" name="ShowGestureButton"/> + <menu_item_check label="Bevægelse knap" name="ShowMoveButton"/> + <menu_item_check label="Vis knap" name="ShowCameraButton"/> + <menu_item_check label="Foto knap" name="ShowSnapshotButton"/> + <menu_item_check label="Bygge knap" name="ShowBuildButton"/> + <menu_item_check label="Søge knap" name="ShowSearchButton"/> + <menu_item_check label="Kort knap" name="ShowWorldMapButton"/> + <menu_item_check label="Mini-Map button" name="ShowMiniMapButton"/> + <menu_item_call label="Klip" name="NearbyChatBar_Cut"/> + <menu_item_call label="Kopiér" name="NearbyChatBar_Copy"/> + <menu_item_call label="Sæt ind" name="NearbyChatBar_Paste"/> + <menu_item_call label="Slet" name="NearbyChatBar_Delete"/> + <menu_item_call label="Vælg alt" name="NearbyChatBar_Select_All"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/da/menu_cof_attachment.xml b/indra/newview/skins/minimal/xui/da/menu_cof_attachment.xml new file mode 100644 index 0000000000000000000000000000000000000000..9d7fc0f2239d0c679c0d58a467b57fb1ec212a04 --- /dev/null +++ b/indra/newview/skins/minimal/xui/da/menu_cof_attachment.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="COF Attachment"> + <menu_item_call label="Tag af" name="detach"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/da/menu_cof_body_part.xml b/indra/newview/skins/minimal/xui/da/menu_cof_body_part.xml new file mode 100644 index 0000000000000000000000000000000000000000..0e90d5a3aebdbe0cf1d34a520f4f5b3e9fc14d19 --- /dev/null +++ b/indra/newview/skins/minimal/xui/da/menu_cof_body_part.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="COF Body"> + <menu_item_call label="Erstat" name="replace"/> + <menu_item_call label="Redigér" name="edit"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/da/menu_cof_clothing.xml b/indra/newview/skins/minimal/xui/da/menu_cof_clothing.xml new file mode 100644 index 0000000000000000000000000000000000000000..16c225b7d9953ae1bfbc2b3c8a8d7b72de452941 --- /dev/null +++ b/indra/newview/skins/minimal/xui/da/menu_cof_clothing.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="COF Clothing"> + <menu_item_call label="Tag af" name="take_off"/> + <menu_item_call label="Redigér" name="edit"/> + <menu_item_call label="Erstat" name="replace"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/da/menu_cof_gear.xml b/indra/newview/skins/minimal/xui/da/menu_cof_gear.xml new file mode 100644 index 0000000000000000000000000000000000000000..f44369fd843e6d68eb582d5aa712b22e31cc3c29 --- /dev/null +++ b/indra/newview/skins/minimal/xui/da/menu_cof_gear.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Gear COF"> + <menu label="Nyt tøj" name="COF.Gear.New_Clothes"/> + <menu label="Nye kropsdele" name="COF.Geear.New_Body_Parts"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/da/menu_edit.xml b/indra/newview/skins/minimal/xui/da/menu_edit.xml new file mode 100644 index 0000000000000000000000000000000000000000..3752f42b1c4055ebc7f8feb416c7f4e5fc619fc2 --- /dev/null +++ b/indra/newview/skins/minimal/xui/da/menu_edit.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu label="Redigér" name="Edit"> + <menu_item_call label="Fortryd" name="Undo"/> + <menu_item_call label="Gendan" name="Redo"/> + <menu_item_call label="Klip" name="Cut"/> + <menu_item_call label="Kopiér" name="Copy"/> + <menu_item_call label="Sæt ind" name="Paste"/> + <menu_item_call label="Slet" name="Delete"/> + <menu_item_call label="Duplikér" name="Duplicate"/> + <menu_item_call label="Marker alt" name="Select All"/> + <menu_item_call label="Fjern markering" name="Deselect"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/da/menu_favorites.xml b/indra/newview/skins/minimal/xui/da/menu_favorites.xml new file mode 100644 index 0000000000000000000000000000000000000000..a4793e294cbfeb553c34408686d841c75eefa81d --- /dev/null +++ b/indra/newview/skins/minimal/xui/da/menu_favorites.xml @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Popup"> + <menu_item_call label="Teleportér" name="Teleport To Landmark"/> + <menu_item_call label="Vis/ret landemærke" name="Landmark Open"/> + <menu_item_call label="Kopiér SLurl" name="Copy slurl"/> + <menu_item_call label="Vis pÃ¥ kort" name="Show On Map"/> + <menu_item_call label="Kopiér" name="Landmark Copy"/> + <menu_item_call label="Sæt ind" name="Landmark Paste"/> + <menu_item_call label="Slet" name="Delete"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/da/menu_gesture_gear.xml b/indra/newview/skins/minimal/xui/da/menu_gesture_gear.xml new file mode 100644 index 0000000000000000000000000000000000000000..a9010e99b65c085ceaff6f97c2fdc5734277068e --- /dev/null +++ b/indra/newview/skins/minimal/xui/da/menu_gesture_gear.xml @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="menu_gesture_gear"> + <menu_item_call label="Tilføj/fjern fra favoritter" name="activate"/> + <menu_item_call label="Kopiér" name="copy_gesture"/> + <menu_item_call label="Sæt ind" name="paste"/> + <menu_item_call label="Kopiér UUID" name="copy_uuid"/> + <menu_item_call label="Gem til nuværende sæt" name="save_to_outfit"/> + <menu_item_call label="Editér" name="edit_gesture"/> + <menu_item_call label="Undersøg" name="inspect"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/da/menu_group_plus.xml b/indra/newview/skins/minimal/xui/da/menu_group_plus.xml new file mode 100644 index 0000000000000000000000000000000000000000..97fbec1ed1d9b84ef2fcd44a7f7de8aa1bbc8538 --- /dev/null +++ b/indra/newview/skins/minimal/xui/da/menu_group_plus.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="menu_group_plus"> + <menu_item_call label="Meld ind i gruppe..." name="item_join"/> + <menu_item_call label="Ny gruppe..." name="item_new"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/da/menu_hide_navbar.xml b/indra/newview/skins/minimal/xui/da/menu_hide_navbar.xml new file mode 100644 index 0000000000000000000000000000000000000000..d96a8a8a17e2f95a13d5bed11c12c86482c3a990 --- /dev/null +++ b/indra/newview/skins/minimal/xui/da/menu_hide_navbar.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="hide_navbar_menu"> + <menu_item_check label="Vis navigationsbjælke" name="ShowNavbarNavigationPanel"/> + <menu_item_check label="Vis favoritbjælke" name="ShowNavbarFavoritesPanel"/> + <menu_item_check label="Vis min lokation bjælke" name="ShowMiniLocationPanel"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/da/menu_im_well_button.xml b/indra/newview/skins/minimal/xui/da/menu_im_well_button.xml new file mode 100644 index 0000000000000000000000000000000000000000..4889230919b28cec0dbb62efdcd33201725015d6 --- /dev/null +++ b/indra/newview/skins/minimal/xui/da/menu_im_well_button.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="IM Well Button Context Menu"> + <menu_item_call label="Luk alle" name="Close All"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/da/menu_imchiclet_adhoc.xml b/indra/newview/skins/minimal/xui/da/menu_imchiclet_adhoc.xml new file mode 100644 index 0000000000000000000000000000000000000000..f64a6ad455ea277e47ab2ca567cc3775c240bcfb --- /dev/null +++ b/indra/newview/skins/minimal/xui/da/menu_imchiclet_adhoc.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="IMChiclet AdHoc Menu"> + <menu_item_call label="Afslut" name="End Session"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/da/menu_imchiclet_group.xml b/indra/newview/skins/minimal/xui/da/menu_imchiclet_group.xml new file mode 100644 index 0000000000000000000000000000000000000000..b89d9a57895d47b5bb036a50380747d5341fbac0 --- /dev/null +++ b/indra/newview/skins/minimal/xui/da/menu_imchiclet_group.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="IMChiclet Group Menu"> + <menu_item_call label="Gruppe info" name="Show Profile"/> + <menu_item_call label="Vis session" name="Chat"/> + <menu_item_call label="Afslut session" name="End Session"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/da/menu_imchiclet_p2p.xml b/indra/newview/skins/minimal/xui/da/menu_imchiclet_p2p.xml new file mode 100644 index 0000000000000000000000000000000000000000..6ebc40a8dd05a142c03b19d97aaa877411690813 --- /dev/null +++ b/indra/newview/skins/minimal/xui/da/menu_imchiclet_p2p.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="IMChiclet P2P Menu"> + <menu_item_call label="Profil" name="Show Profile"/> + <menu_item_call label="Tilføj ven" name="Add Friend"/> + <menu_item_call label="Vis session" name="Send IM"/> + <menu_item_call label="Afslut session" name="End Session"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/da/menu_inspect_avatar_gear.xml b/indra/newview/skins/minimal/xui/da/menu_inspect_avatar_gear.xml new file mode 100644 index 0000000000000000000000000000000000000000..8da35adb1b3a33cf60f901a9917491db7c6daaab --- /dev/null +++ b/indra/newview/skins/minimal/xui/da/menu_inspect_avatar_gear.xml @@ -0,0 +1,21 @@ +<?xml version="1.0" encoding="utf-8"?> +<toggleable_menu name="Gear Menu"> + <menu_item_call label="Profil" name="view_profile"/> + <menu_item_call label="Tilføj ven" name="add_friend"/> + <menu_item_call label="Besked" name="im"/> + <menu_item_call label="Opkald" name="call"/> + <menu_item_call label="Teleportér" name="teleport"/> + <menu_item_call label="Invitér til gruppe" name="invite_to_group"/> + <menu_item_call label="Blokér" name="block"/> + <menu_item_call label="Fjern blokering" name="unblock"/> + <menu_item_call label="Rapportér" name="report"/> + <menu_item_call label="Frys" name="freeze"/> + <menu_item_call label="Smid ud" name="eject"/> + <menu_item_call label="Spark" name="kick"/> + <menu_item_call label="CSR" name="csr"/> + <menu_item_call label="Debug teksturer" name="debug"/> + <menu_item_call label="Find pÃ¥ kort" name="find_on_map"/> + <menu_item_call label="Zoom ind" name="zoom_in"/> + <menu_item_call label="Betal" name="pay"/> + <menu_item_call label="Del" name="share"/> +</toggleable_menu> diff --git a/indra/newview/skins/minimal/xui/da/menu_inspect_object_gear.xml b/indra/newview/skins/minimal/xui/da/menu_inspect_object_gear.xml new file mode 100644 index 0000000000000000000000000000000000000000..e28842836ddb35fdab1ba4ef11f6de20d943af6e --- /dev/null +++ b/indra/newview/skins/minimal/xui/da/menu_inspect_object_gear.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="utf-8"?> +<menu name="Gear Menu"> + <menu_item_call label="Berør" name="touch"/> + <menu_item_call label="Sid her" name="sit"/> + <menu_item_call label="betal" name="pay"/> + <menu_item_call label="Køb" name="buy"/> + <menu_item_call label="Tag" name="take"/> + <menu_item_call label="tag kopi" name="take_copy"/> + <menu_item_call label="Ã…ben" name="open"/> + <menu_item_call label="Redigér" name="edit"/> + <menu_item_call label="Tag pÃ¥" name="wear"/> + <menu_item_call label="Tilføj" name="add"/> + <menu_item_call label="Rapportér" name="report"/> + <menu_item_call label="Blokér" name="block"/> + <menu_item_call label="Zoom ind" name="zoom_in"/> + <menu_item_call label="Fjern" name="remove"/> + <menu_item_call label="Mere info" name="more_info"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/da/menu_inspect_self_gear.xml b/indra/newview/skins/minimal/xui/da/menu_inspect_self_gear.xml new file mode 100644 index 0000000000000000000000000000000000000000..887c6484bc3b4d2292f5b8ca5c3d4c8167ee7650 --- /dev/null +++ b/indra/newview/skins/minimal/xui/da/menu_inspect_self_gear.xml @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="Gear Menu"> + <menu_item_call label="Sid ned" name="Sit Down Here"/> + <menu_item_call label="StÃ¥ op" name="Stand Up"/> + <context_menu label="Tag af" name="Take Off >"> + <context_menu label="Tøj" name="Clothes >"> + <menu_item_call label="Trøje" name="Shirt"/> + <menu_item_call label="Bukser" name="Pants"/> + <menu_item_call label="Nederdel" name="Skirt"/> + <menu_item_call label="Sko" name="Shoes"/> + <menu_item_call label="Strømper" name="Socks"/> + <menu_item_call label="Jakke" name="Jacket"/> + <menu_item_call label="Handsker" name="Gloves"/> + <menu_item_call label="Undertrøje" name="Self Undershirt"/> + <menu_item_call label="Underbukser" name="Self Underpants"/> + <menu_item_call label="Tatovering" name="Self Tattoo"/> + <menu_item_call label="Alpha" name="Self Alpha"/> + <menu_item_call label="Alt tøj" name="All Clothes"/> + </context_menu> + <context_menu label="HUD" name="Object Detach HUD"/> + <context_menu label="Tag af" name="Object Detach"/> + <menu_item_call label="Tag alt af" name="Detach All"/> + </context_menu> + <menu_item_call label="Skift sæt" name="Chenge Outfit"/> + <menu_item_call label="Redigér sæt" name="Edit Outfit"/> + <menu_item_call label="Redigér min figur" name="Edit My Shape"/> + <menu_item_call label="Mine venner" name="Friends..."/> + <menu_item_call label="Mine grupper" name="Groups..."/> + <menu_item_call label="Min profil" name="Profile..."/> + <menu_item_call label="Debug teksturer" name="Debug..."/> +</toggleable_menu> diff --git a/indra/newview/skins/minimal/xui/da/menu_inv_offer_chiclet.xml b/indra/newview/skins/minimal/xui/da/menu_inv_offer_chiclet.xml new file mode 100644 index 0000000000000000000000000000000000000000..c3b03232bf1dd81ff23ac51fcc05716a3e825fe1 --- /dev/null +++ b/indra/newview/skins/minimal/xui/da/menu_inv_offer_chiclet.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="InvOfferChiclet Menu"> + <menu_item_call label="Luk" name="Close"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/da/menu_inventory.xml b/indra/newview/skins/minimal/xui/da/menu_inventory.xml new file mode 100644 index 0000000000000000000000000000000000000000..35551318d170125a5f1dbe39d7f8ebbf2516c3fe --- /dev/null +++ b/indra/newview/skins/minimal/xui/da/menu_inventory.xml @@ -0,0 +1,84 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Popup"> + <menu_item_call label="Del" name="Share"/> + <menu_item_call label="Køb" name="Task Buy"/> + <menu_item_call label="Ã¥ben" name="Task Open"/> + <menu_item_call label="Afspil" name="Task Play"/> + <menu_item_call label="Egenskaber" name="Task Properties"/> + <menu_item_call label="Omdøb" name="Task Rename"/> + <menu_item_call label="Slet" name="Task Remove"/> + <menu_item_call label="Tøm papirkurv" name="Empty Trash"/> + <menu_item_call label="Tøm 'Lost and found'" name="Empty Lost And Found"/> + <menu_item_call label="Ny mappe" name="New Folder"/> + <menu_item_call label="Nyt script" name="New Script"/> + <menu_item_call label="Ny note" name="New Note"/> + <menu_item_call label="Ny bevægelse" name="New Gesture"/> + <menu label="Nyt tøj" name="New Clothes"> + <menu_item_call label="Ny trøje" name="New Shirt"/> + <menu_item_call label="Nye bukser" name="New Pants"/> + <menu_item_call label="Nye sko" name="New Shoes"/> + <menu_item_call label="Nye strømper" name="New Socks"/> + <menu_item_call label="Ny jakke" name="New Jacket"/> + <menu_item_call label="Ny nederdel" name="New Skirt"/> + <menu_item_call label="Nye handsker" name="New Gloves"/> + <menu_item_call label="Ny undertrøje" name="New Undershirt"/> + <menu_item_call label="Nye underbukser" name="New Underpants"/> + <menu_item_call label="Nyt alpha lag" name="New Alpha Mask"/> + <menu_item_call label="Ny tatovering" name="New Tattoo"/> + </menu> + <menu label="Nye kropsdele" name="New Body Parts"> + <menu_item_call label="Ny figur" name="New Shape"/> + <menu_item_call label="Nyt hud" name="New Skin"/> + <menu_item_call label="Nyt hÃ¥r" name="New Hair"/> + <menu_item_call label="Nye øjne" name="New Eyes"/> + </menu> + <menu label="Ændre type" name="Change Type"> + <menu_item_call label="Standard" name="Default"/> + <menu_item_call label="Handsker" name="Gloves"/> + <menu_item_call label="Jakke" name="Jacket"/> + <menu_item_call label="Bukser" name="Pants"/> + <menu_item_call label="Kropsbygning" name="Shape"/> + <menu_item_call label="Sko" name="Shoes"/> + <menu_item_call label="Trøje" name="Shirt"/> + <menu_item_call label="Nederdel" name="Skirt"/> + <menu_item_call label="Underbukser" name="Underpants"/> + <menu_item_call label="Undertrøje" name="Undershirt"/> + </menu> + <menu_item_call label="Teleport" name="Landmark Open"/> + <menu_item_call label="Ã¥ben" name="Animation Open"/> + <menu_item_call label="Ã¥ben" name="Sound Open"/> + <menu_item_call label="Erstat pÃ¥klædning" name="Replace Outfit"/> + <menu_item_call label="Tilføj til pÃ¥klædning" name="Add To Outfit"/> + <menu_item_call label="Slet ting" name="Purge Item"/> + <menu_item_call label="Genskab ting" name="Restore Item"/> + <menu_item_call label="Ã¥ben" name="Open"/> + <menu_item_call label="Ã…ben original" name="Open Original"/> + <menu_item_call label="Egenskaber" name="Properties"/> + <menu_item_call label="Omdøb" name="Rename"/> + <menu_item_call label="Kopiér asset UUID" name="Copy Asset UUID"/> + <menu_item_call label="Kopiér" name="Copy"/> + <menu_item_call label="Indsæt" name="Paste"/> + <menu_item_call label="Sæt ind som link" name="Paste As Link"/> + <menu_item_call label="Slet" name="Remove Link"/> + <menu_item_call label="Slet" name="Delete"/> + <menu_item_call label="Slet systemfolder" name="Delete System Folder"/> + <menu_item_call label="start konference chat" name="Conference Chat Folder"/> + <menu_item_call label="Afspil" name="Sound Play"/> + <menu_item_call label="Om landemærke" name="About Landmark"/> + <menu_item_call label="Afspil i verden" name="Animation Play"/> + <menu_item_call label="Afspil lokalt" name="Animation Audition"/> + <menu_item_call label="Send privat besked (IM)" name="Send Instant Message"/> + <menu_item_call label="Tilbyd teleport..." name="Offer Teleport..."/> + <menu_item_call label="start konference Chat" name="Conference Chat"/> + <menu_item_call label="Aktivér" name="Activate"/> + <menu_item_call label="Deaktivér" name="Deactivate"/> + <menu_item_call label="Gem som" name="Save As"/> + <menu_item_call label="Tag af dig selv" name="Detach From Yourself"/> + <menu_item_call label="Tag pÃ¥" name="Wearable And Object Wear"/> + <menu label="Vedhæft" name="Attach To"/> + <menu label="Vedhæft til HUD" name="Attach To HUD"/> + <menu_item_call label="Redigér" name="Wearable Edit"/> + <menu_item_call label="Tilføj" name="Wearable Add"/> + <menu_item_call label="Tag af" name="Take Off"/> + <menu_item_call label="--ingen valg--" name="--no options--"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/da/menu_inventory_add.xml b/indra/newview/skins/minimal/xui/da/menu_inventory_add.xml new file mode 100644 index 0000000000000000000000000000000000000000..07f70d7190dcf2a6b5f85d711596cf85be3bc28b --- /dev/null +++ b/indra/newview/skins/minimal/xui/da/menu_inventory_add.xml @@ -0,0 +1,33 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="menu_inventory_add"> + <menu label="Hent" name="upload"> + <menu_item_call label="Billede (L$[COST])..." name="Upload Image"/> + <menu_item_call label="Lyd (L$[COST])..." name="Upload Sound"/> + <menu_item_call label="Animation (L$[COST])..." name="Upload Animation"/> + <menu_item_call label="Hent mange (L$[COST] pr. fil)..." name="Bulk Upload"/> + <menu_item_call label="Sæt standardværdier for upload rettigheder" name="perm prefs"/> + </menu> + <menu_item_call label="Ny mappe" name="New Folder"/> + <menu_item_call label="Nyt script" name="New Script"/> + <menu_item_call label="Ny note" name="New Note"/> + <menu_item_call label="Ny bevægelse" name="New Gesture"/> + <menu label="Nyt tøj" name="New Clothes"> + <menu_item_call label="Ny trøje" name="New Shirt"/> + <menu_item_call label="Nye bukser" name="New Pants"/> + <menu_item_call label="Nye sko" name="New Shoes"/> + <menu_item_call label="Nye strømper" name="New Socks"/> + <menu_item_call label="Ny jakke" name="New Jacket"/> + <menu_item_call label="Ny nederdel" name="New Skirt"/> + <menu_item_call label="Nye handsker" name="New Gloves"/> + <menu_item_call label="Ny undertrøje" name="New Undershirt"/> + <menu_item_call label="Nye underbukser" name="New Underpants"/> + <menu_item_call label="Nyt alpha lag" name="New Alpha"/> + <menu_item_call label="Ny tatovering" name="New Tattoo"/> + </menu> + <menu label="Nye kropsdele" name="New Body Parts"> + <menu_item_call label="Ny kropsbygning" name="New Shape"/> + <menu_item_call label="Ny hud" name="New Skin"/> + <menu_item_call label="Nyt hÃ¥r" name="New Hair"/> + <menu_item_call label="Nye øjne" name="New Eyes"/> + </menu> +</menu> diff --git a/indra/newview/skins/minimal/xui/da/menu_inventory_gear_default.xml b/indra/newview/skins/minimal/xui/da/menu_inventory_gear_default.xml new file mode 100644 index 0000000000000000000000000000000000000000..4809b2446356463d22dfe64f284a35ee19fe16c8 --- /dev/null +++ b/indra/newview/skins/minimal/xui/da/menu_inventory_gear_default.xml @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_gear_default"> + <menu_item_call label="Nyt vindue" name="new_window"/> + <menu_item_check label="Sortér efter navn" name="sort_by_name"/> + <menu_item_check label="Sortér efter nyeste" name="sort_by_recent"/> + <menu_item_check label="Sortér altid mapper efter navn" name="sort_folders_by_name"/> + <menu_item_check label="Vis System mapper øverst" name="sort_system_folders_to_top"/> + <menu_item_call label="Vis filtre" name="show_filters"/> + <menu_item_call label="Nulstil filtre" name="reset_filters"/> + <menu_item_call label="Luk alle mapper" name="close_folders"/> + <menu_item_call label="Tøm "fundne genstande"" name="empty_lostnfound"/> + <menu_item_call label="Gem tekstur som" name="Save Texture As"/> + <menu_item_call label="Del" name="Share"/> + <menu_item_call label="Find original" name="Find Original"/> + <menu_item_call label="Find alle links" name="Find All Links"/> + <menu_item_call label="Tøm papirkurv" name="empty_trash"/> +</toggleable_menu> diff --git a/indra/newview/skins/minimal/xui/da/menu_land.xml b/indra/newview/skins/minimal/xui/da/menu_land.xml new file mode 100644 index 0000000000000000000000000000000000000000..1548f18f8979e0a1db50f130537eabf826aae44f --- /dev/null +++ b/indra/newview/skins/minimal/xui/da/menu_land.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Land Pie"> + <menu_item_call label="Om land" name="Place Information..."/> + <menu_item_call label="Sid her" name="Sit Here"/> + <menu_item_call label="Køb" name="Land Buy"/> + <menu_item_call label="Køb adgang" name="Land Buy Pass"/> + <menu_item_call label="Byg" name="Create"/> + <menu_item_call label="Tilpas terræn" name="Edit Terrain"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/da/menu_landmark.xml b/indra/newview/skins/minimal/xui/da/menu_landmark.xml new file mode 100644 index 0000000000000000000000000000000000000000..3cf2ffe375c95d0561b6a2dca5fc40694251844d --- /dev/null +++ b/indra/newview/skins/minimal/xui/da/menu_landmark.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="landmark_overflow_menu"> + <menu_item_call label="Kopiér SLurl" name="copy"/> + <menu_item_call label="Slet" name="delete"/> + <menu_item_call label="Opret favorit" name="pick"/> + <menu_item_call label="Tilføj til favorit bjælke" name="add_to_favbar"/> +</toggleable_menu> diff --git a/indra/newview/skins/minimal/xui/da/menu_login.xml b/indra/newview/skins/minimal/xui/da/menu_login.xml new file mode 100644 index 0000000000000000000000000000000000000000..0b7a5040ae4ff911f8fa2b31638e3042d6c86df9 --- /dev/null +++ b/indra/newview/skins/minimal/xui/da/menu_login.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu_bar name="Login Menu"> + <menu label="Mig" name="File"> + <menu_item_call label="Indstillinger" name="Preferences..."/> + <menu_item_call label="Afslut [APP_NAME]" name="Quit"/> + </menu> + <menu label="Hjælp" name="Help"> + <menu_item_call label="[SECOND_LIFE] hjælp" name="Second Life Help"/> + <menu_item_call label="Om [APP_NAME]" name="About Second Life"/> + </menu> + <menu_item_check label="Vis debug menu" name="Show Debug Menu"/> + <menu label="Debug" name="Debug"> + <menu_item_call label="Vis debug opsætning" name="Debug Settings"/> + <menu_item_call label="UI/farve opsætning" name="UI/Color Settings"/> + <menu label="UI tests" name="UI Tests"/> + <menu_item_call label="Sæt vinduesstørrelse" name="Set Window Size..."/> + <menu_item_call label="Vis betingelser" name="TOS"/> + <menu_item_call label="Vis vigtig besked" name="Critical"/> + <menu_item_call label="Media Browser Test" name="Web Browser Test"/> + <menu_item_call label="Web Content Floater Test" name="Web Content Floater Test"/> + <menu_item_check label="Vis gitter vælger" name="Show Grid Picker"/> + <menu_item_call label="Vis notifikationskonsol" name="Show Notifications Console"/> + </menu> +</menu_bar> diff --git a/indra/newview/skins/minimal/xui/da/menu_mini_map.xml b/indra/newview/skins/minimal/xui/da/menu_mini_map.xml new file mode 100644 index 0000000000000000000000000000000000000000..186dbd476ae10e3ef8ea4f23f409fed0a30e07e5 --- /dev/null +++ b/indra/newview/skins/minimal/xui/da/menu_mini_map.xml @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Popup"> + <menu_item_call label="Zoom tæt" name="Zoom Close"/> + <menu_item_call label="Zoom mellem" name="Zoom Medium"/> + <menu_item_call label="Zoom langt" name="Zoom Far"/> + <menu_item_call label="Zoom standard" name="Zoom Default"/> + <menu_item_check label="Rotér kort" name="Rotate Map"/> + <menu_item_check label="Auto centrér" name="Auto Center"/> + <menu_item_call label="Fjern ref." name="Stop Tracking"/> + <menu_item_call label="Verdenskort" name="World Map"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/da/menu_navbar.xml b/indra/newview/skins/minimal/xui/da/menu_navbar.xml new file mode 100644 index 0000000000000000000000000000000000000000..c04206824ac20f21d297423f12ba58b364815b96 --- /dev/null +++ b/indra/newview/skins/minimal/xui/da/menu_navbar.xml @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Navbar Menu"> + <menu_item_check label="Vis koordinater" name="Show Coordinates"/> + <menu_item_check label="Vis oplysninger om parcel" name="Show Parcel Properties"/> + <menu_item_call label="Landemærke" name="Landmark"/> + <menu_item_call label="Klip" name="Cut"/> + <menu_item_call label="Kopiér" name="Copy"/> + <menu_item_call label="Sæt ind" name="Paste"/> + <menu_item_call label="Slet" name="Delete"/> + <menu_item_call label="Vælg alt" name="Select All"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/da/menu_nearby_chat.xml b/indra/newview/skins/minimal/xui/da/menu_nearby_chat.xml new file mode 100644 index 0000000000000000000000000000000000000000..be532ad406d5d80a23efd7fb504dc1c255a60221 --- /dev/null +++ b/indra/newview/skins/minimal/xui/da/menu_nearby_chat.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="NearBy Chat Menu"> + <menu_item_call label="Vis personer tæt pÃ¥..." name="nearby_people"/> + <menu_item_check label="Vis blokeret tekst" name="muted_text"/> + <menu_item_check label="Vis venne-ikoner" name="show_buddy_icons"/> + <menu_item_check label="Vis navne" name="show_names"/> + <menu_item_check label="Vis ikoner og navne" name="show_icons_and_names"/> + <menu_item_call label="Font størrelse" name="font_size"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/da/menu_notification_well_button.xml b/indra/newview/skins/minimal/xui/da/menu_notification_well_button.xml new file mode 100644 index 0000000000000000000000000000000000000000..40b35b5fdd201adc51bb732f335c3a88987812f9 --- /dev/null +++ b/indra/newview/skins/minimal/xui/da/menu_notification_well_button.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Notification Well Button Context Menu"> + <menu_item_call label="Luk alle" name="Close All"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/da/menu_object.xml b/indra/newview/skins/minimal/xui/da/menu_object.xml new file mode 100644 index 0000000000000000000000000000000000000000..ba62ccf90ce47591ef93d97c37f93f8413a2b37f --- /dev/null +++ b/indra/newview/skins/minimal/xui/da/menu_object.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Object Pie"> + <menu_item_call label="Berør" name="Object Touch"> + <menu_item_call.on_enable name="EnableTouch" parameter="Berør"/> + </menu_item_call> + <menu_item_call label="Redigér" name="Edit..."/> + <menu_item_call label="Byg" name="Build"/> + <menu_item_call label="Ã…ben" name="Open"/> + <menu_item_call label="Sid her" name="Object Sit"/> + <menu_item_call label="StÃ¥ op" name="Object Stand Up"/> + <menu_item_call label="Objekt profil" name="Object Inspect"/> + <menu_item_call label="Zoom In" name="Zoom In"/> + <context_menu label="Tag pÃ¥" name="Put On"> + <menu_item_call label="Tag pÃ¥" name="Wear"/> + <menu_item_call label="Tilføj" name="Add"/> + <context_menu label="Vedhæft" name="Object Attach"/> + <context_menu label="Vedhæft HUD" name="Object Attach HUD"/> + </context_menu> + <context_menu label="Administrér" name="Remove"> + <menu_item_call label="Rapportér misbrug" name="Report Abuse..."/> + <menu_item_call label="Blokér" name="Object Mute"/> + <menu_item_call label="Returnér" name="Return..."/> + </context_menu> + <menu_item_call label="Tag" name="Pie Object Take"/> + <menu_item_call label="Tag kopi" name="Take Copy"/> + <menu_item_call label="Betal" name="Pay..."/> + <menu_item_call label="Køb" name="Buy..."/> + <menu_item_call label="Slet" name="Delete"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/da/menu_object_icon.xml b/indra/newview/skins/minimal/xui/da/menu_object_icon.xml new file mode 100644 index 0000000000000000000000000000000000000000..08aeb633b64031abb71a809b1a07c4e656f4d8cb --- /dev/null +++ b/indra/newview/skins/minimal/xui/da/menu_object_icon.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Object Icon Menu"> + <menu_item_call label="Objekt Profil..." name="Object Profile"/> + <menu_item_call label="Blokér..." name="Block"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/da/menu_outfit_gear.xml b/indra/newview/skins/minimal/xui/da/menu_outfit_gear.xml new file mode 100644 index 0000000000000000000000000000000000000000..8b4c776496f7a549b22bb65c0f1c73804b92cb7d --- /dev/null +++ b/indra/newview/skins/minimal/xui/da/menu_outfit_gear.xml @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Gear Outfit"> + <menu_item_call label="Tag pÃ¥ - Erstat nuværende sæt" name="wear"/> + <menu_item_call label="Tag pÃ¥ - Tilføj til nuværende sæt" name="wear_add"/> + <menu_item_call label="Tag af - Fjern fra nuværende sæt" name="take_off"/> + <menu label="Nyt tøj" name="New Clothes"> + <menu_item_call label="Ny trøje" name="New Shirt"/> + <menu_item_call label="Nye bukser" name="New Pants"/> + <menu_item_call label="Nye sko" name="New Shoes"/> + <menu_item_call label="Nye strømper" name="New Socks"/> + <menu_item_call label="Ny jakke" name="New Jacket"/> + <menu_item_call label="Ny nederdel" name="New Skirt"/> + <menu_item_call label="Nye handsker" name="New Gloves"/> + <menu_item_call label="Ny undertrøje" name="New Undershirt"/> + <menu_item_call label="Nye underbukser" name="New Underpants"/> + <menu_item_call label="Ny alpha" name="New Alpha"/> + <menu_item_call label="Ny tatovering" name="New Tattoo"/> + </menu> + <menu label="Nye kropsdele" name="New Body Parts"> + <menu_item_call label="Ny figur" name="New Shape"/> + <menu_item_call label="Nyt hud" name="New Skin"/> + <menu_item_call label="Nyt hÃ¥r" name="New Hair"/> + <menu_item_call label="Nye øjne" name="New Eyes"/> + </menu> + <menu_item_call label="Omdøb sæt" name="rename"/> + <menu_item_call label="Slet sæt" name="delete_outfit"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/da/menu_outfit_tab.xml b/indra/newview/skins/minimal/xui/da/menu_outfit_tab.xml new file mode 100644 index 0000000000000000000000000000000000000000..d6a6f2724fe730bfce24b38f1319fcb09ed54c2f --- /dev/null +++ b/indra/newview/skins/minimal/xui/da/menu_outfit_tab.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Outfit"> + <menu_item_call label="Tag pÃ¥ - Erstat nuværende sæt" name="wear_replace"/> + <menu_item_call label="Tag pÃ¥ - Tilføj til nuværende sæt" name="wear_add"/> + <menu_item_call label="Tag af - Fjern fra nuværende sæt" name="take_off"/> + <menu_item_call label="Redigér sæt" name="edit"/> + <menu_item_call label="Omdøb sæt" name="rename"/> + <menu_item_call label="Slet sæt" name="delete"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/da/menu_participant_list.xml b/indra/newview/skins/minimal/xui/da/menu_participant_list.xml new file mode 100644 index 0000000000000000000000000000000000000000..5951d3ffb9858aca1c8ac65c3a87d78717db597f --- /dev/null +++ b/indra/newview/skins/minimal/xui/da/menu_participant_list.xml @@ -0,0 +1,21 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Participant List Context Menu"> + <menu_item_check label="Sortér efter navn" name="SortByName"/> + <menu_item_check label="Sortér efter nylige talere" name="SortByRecentSpeakers"/> + <menu_item_call label="Profil" name="View Profile"/> + <menu_item_call label="Tilføj ven" name="Add Friend"/> + <menu_item_call label="Send besked" name="IM"/> + <menu_item_call label="Opkald" name="Call"/> + <menu_item_call label="Del" name="Share"/> + <menu_item_call label="Betal" name="Pay"/> + <menu_item_check label="Se person ikoner" name="View Icons"/> + <menu_item_check label="Blokér stemme" name="Block/Unblock"/> + <menu_item_check label="Blokér tekst" name="MuteText"/> + <context_menu label="Moderator valg" name="Moderator Options"> + <menu_item_check label="Tillad tekst chat" name="AllowTextChat"/> + <menu_item_call label="Sluk for denne deltager" name="ModerateVoiceMuteSelected"/> + <menu_item_call label="Fjern slukning for denne deltager" name="ModerateVoiceUnMuteSelected"/> + <menu_item_call label="Sluk lyd for alle" name="ModerateVoiceMute"/> + <menu_item_call label="Tænd lyd for alle" name="ModerateVoiceUnmute"/> + </context_menu> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/da/menu_people_friends_view_sort.xml b/indra/newview/skins/minimal/xui/da/menu_people_friends_view_sort.xml new file mode 100644 index 0000000000000000000000000000000000000000..32c5e6a6c7fa7336afe46b94f51e05d8c200494a --- /dev/null +++ b/indra/newview/skins/minimal/xui/da/menu_people_friends_view_sort.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="menu_group_plus"> + <menu_item_check label="Sortér efter navn" name="sort_name"/> + <menu_item_check label="Sortér efter status" name="sort_status"/> + <menu_item_check label="Vis person ikoner" name="view_icons"/> + <menu_item_check label="Vis tildelte rettigheder" name="view_permissions"/> + <menu_item_call label="Vis blokerede beboere og objekter" name="show_blocked_list"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/da/menu_people_groups.xml b/indra/newview/skins/minimal/xui/da/menu_people_groups.xml new file mode 100644 index 0000000000000000000000000000000000000000..841f58b61914a678177b59075c289d88d292c261 --- /dev/null +++ b/indra/newview/skins/minimal/xui/da/menu_people_groups.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="menu_group_plus"> + <menu_item_call label="Se info" name="View Info"/> + <menu_item_call label="Chat" name="Chat"/> + <menu_item_call label="Opkald" name="Call"/> + <menu_item_call label="Aktivér" name="Activate"/> + <menu_item_call label="Forlad" name="Leave"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/da/menu_people_groups_view_sort.xml b/indra/newview/skins/minimal/xui/da/menu_people_groups_view_sort.xml new file mode 100644 index 0000000000000000000000000000000000000000..0b9a791530da06da6220ed17c0adfca81c6d0dc0 --- /dev/null +++ b/indra/newview/skins/minimal/xui/da/menu_people_groups_view_sort.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="menu_group_plus"> + <menu_item_check label="Vis gruppe ikoner" name="Display Group Icons"/> + <menu_item_call label="Forlad valgte gruppe" name="Leave Selected Group"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/da/menu_people_nearby.xml b/indra/newview/skins/minimal/xui/da/menu_people_nearby.xml new file mode 100644 index 0000000000000000000000000000000000000000..220ab8724f59155b228f35febd0aee4a91a4812b --- /dev/null +++ b/indra/newview/skins/minimal/xui/da/menu_people_nearby.xml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Avatar Context Menu"> + <menu_item_call label="Vis profil" name="View Profile"/> + <menu_item_call label="Tilføj som ven" name="Add Friend"/> + <menu_item_call label="Fjern venskab" name="Remove Friend"/> + <menu_item_call label="IM" name="IM"/> + <menu_item_call label="Opkald" name="Call"/> + <menu_item_call label="Kort" name="Map"/> + <menu_item_call label="Del" name="Share"/> + <menu_item_call label="Betal" name="Pay"/> + <menu_item_check label="Blokér/Fjern blokering" name="Block/Unblock"/> + <menu_item_call label="Tilbyd teleport" name="teleport"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/da/menu_people_nearby_multiselect.xml b/indra/newview/skins/minimal/xui/da/menu_people_nearby_multiselect.xml new file mode 100644 index 0000000000000000000000000000000000000000..9318a0e3409c6fbd534d1b93e5dc9c7bdad2a9ac --- /dev/null +++ b/indra/newview/skins/minimal/xui/da/menu_people_nearby_multiselect.xml @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Multi-Selected People Context Menu"> + <menu_item_call label="Tilføj venner" name="Add Friends"/> + <menu_item_call label="Fjern venner" name="Remove Friend"/> + <menu_item_call label="Besked" name="IM"/> + <menu_item_call label="Opkald" name="Call"/> + <menu_item_call label="Del" name="Share"/> + <menu_item_call label="Betal" name="Pay"/> + <menu_item_call label="tilbyd teleport" name="teleport"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/da/menu_people_nearby_view_sort.xml b/indra/newview/skins/minimal/xui/da/menu_people_nearby_view_sort.xml new file mode 100644 index 0000000000000000000000000000000000000000..2f35ff3c92cd7b958abd58709fd21e4759f7d2a6 --- /dev/null +++ b/indra/newview/skins/minimal/xui/da/menu_people_nearby_view_sort.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="menu_group_plus"> + <menu_item_check label="Sortér efter tidligere talere" name="sort_by_recent_speakers"/> + <menu_item_check label="Sortér efter navn" name="sort_name"/> + <menu_item_check label="Sortér efter afstand" name="sort_distance"/> + <menu_item_check label="Se ikoner for personer" name="view_icons"/> + <menu_item_call label="Vis blokerede beboere og objekter" name="show_blocked_list"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/da/menu_people_recent_view_sort.xml b/indra/newview/skins/minimal/xui/da/menu_people_recent_view_sort.xml new file mode 100644 index 0000000000000000000000000000000000000000..d081f637f22602d85e54bb0f03c6dc7c18b808ea --- /dev/null +++ b/indra/newview/skins/minimal/xui/da/menu_people_recent_view_sort.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="menu_group_plus"> + <menu_item_check label="Sortér efter nyeste" name="sort_most"/> + <menu_item_check label="Sortér efter navn" name="sort_name"/> + <menu_item_check label="Vis person ikoner" name="view_icons"/> + <menu_item_call label="Vis blokerede beboere og objekter" name="show_blocked_list"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/da/menu_picks.xml b/indra/newview/skins/minimal/xui/da/menu_picks.xml new file mode 100644 index 0000000000000000000000000000000000000000..81ee900773cfaceebf1a26d0b8fab52c92fa7632 --- /dev/null +++ b/indra/newview/skins/minimal/xui/da/menu_picks.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Picks"> + <menu_item_call label="Info" name="pick_info"/> + <menu_item_call label="Redigér" name="pick_edit"/> + <menu_item_call label="Teleportér" name="pick_teleport"/> + <menu_item_call label="Vis pÃ¥ kort" name="pick_map"/> + <menu_item_call label="Slet" name="pick_delete"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/da/menu_picks_plus.xml b/indra/newview/skins/minimal/xui/da/menu_picks_plus.xml new file mode 100644 index 0000000000000000000000000000000000000000..d95071fbbb01cb69fe6ad852adc18158b26d7f39 --- /dev/null +++ b/indra/newview/skins/minimal/xui/da/menu_picks_plus.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="picks_plus_menu"> + <menu_item_call label="Ny favorit" name="create_pick"/> + <menu_item_call label="Ny annonce" name="create_classified"/> +</toggleable_menu> diff --git a/indra/newview/skins/minimal/xui/da/menu_place.xml b/indra/newview/skins/minimal/xui/da/menu_place.xml new file mode 100644 index 0000000000000000000000000000000000000000..b87964ac1427e6fcf668e63f711d9945efc99d30 --- /dev/null +++ b/indra/newview/skins/minimal/xui/da/menu_place.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="place_overflow_menu"> + <menu_item_call label="Opret et landemærke" name="landmark"/> + <menu_item_call label="Opret favorit" name="pick"/> + <menu_item_call label="Køb adgang" name="pass"/> + <menu_item_call label="Redigér" name="edit"/> +</toggleable_menu> diff --git a/indra/newview/skins/minimal/xui/da/menu_place_add_button.xml b/indra/newview/skins/minimal/xui/da/menu_place_add_button.xml new file mode 100644 index 0000000000000000000000000000000000000000..7ad22535503e4c0e11ae0655521ca2ad5fdea13a --- /dev/null +++ b/indra/newview/skins/minimal/xui/da/menu_place_add_button.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="menu_folder_gear"> + <menu_item_call label="Opret mappe" name="add_folder"/> + <menu_item_call label="Tilføj landemærke" name="add_landmark"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/da/menu_places_gear_folder.xml b/indra/newview/skins/minimal/xui/da/menu_places_gear_folder.xml new file mode 100644 index 0000000000000000000000000000000000000000..5f573c2363e97e123c149b063b59491165089bb1 --- /dev/null +++ b/indra/newview/skins/minimal/xui/da/menu_places_gear_folder.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_folder_gear"> + <menu_item_call label="Tilføj landemærke" name="add_landmark"/> + <menu_item_call label="Tilføj mappe" name="add_folder"/> + <menu_item_call label="Gendan genstand" name="restore_item"/> + <menu_item_call label="Klip" name="cut"/> + <menu_item_call label="Kopiér" name="copy_folder"/> + <menu_item_call label="Sæt ind" name="paste"/> + <menu_item_call label="Omdøb" name="rename"/> + <menu_item_call label="Slet" name="delete"/> + <menu_item_call label="Udvid" name="expand"/> + <menu_item_call label="Luk" name="collapse"/> + <menu_item_call label="Udvid alle mapper" name="expand_all"/> + <menu_item_call label="Luk alle mapper" name="collapse_all"/> + <menu_item_check label="Sortér efter dato" name="sort_by_date"/> +</toggleable_menu> diff --git a/indra/newview/skins/minimal/xui/da/menu_places_gear_landmark.xml b/indra/newview/skins/minimal/xui/da/menu_places_gear_landmark.xml new file mode 100644 index 0000000000000000000000000000000000000000..13dbcdd42e2645f8139b129d06c03db340c9b299 --- /dev/null +++ b/indra/newview/skins/minimal/xui/da/menu_places_gear_landmark.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="menu_ladmark_gear"> + <menu_item_call label="Teleportér" name="teleport"/> + <menu_item_call label="Mere information" name="more_info"/> + <menu_item_call label="Vis pÃ¥ kort" name="show_on_map"/> + <menu_item_call label="Tilføj landemærke" name="add_landmark"/> + <menu_item_call label="Tilføj mappe" name="add_folder"/> + <menu_item_call label="Gendan genstand" name="restore_item"/> + <menu_item_call label="Klip" name="cut"/> + <menu_item_call label="Kopiér landemærke" name="copy_landmark"/> + <menu_item_call label="Kopiér SLurl" name="copy_slurl"/> + <menu_item_call label="Sæt ind" name="paste"/> + <menu_item_call label="Omdøb" name="rename"/> + <menu_item_call label="Slet" name="delete"/> + <menu_item_call label="Ã…ben alle mapper" name="expand_all"/> + <menu_item_call label="Luk alle mapper" name="collapse_all"/> + <menu_item_check label="Sortér efter dato" name="sort_by_date"/> + <menu_item_call label="Opret favorit" name="create_pick"/> +</toggleable_menu> diff --git a/indra/newview/skins/minimal/xui/da/menu_profile_overflow.xml b/indra/newview/skins/minimal/xui/da/menu_profile_overflow.xml new file mode 100644 index 0000000000000000000000000000000000000000..6745007c996451c9210851f99518d2883caa3f40 --- /dev/null +++ b/indra/newview/skins/minimal/xui/da/menu_profile_overflow.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="profile_overflow_menu"> + <menu_item_call label="Kort" name="show_on_map"/> + <menu_item_call label="Betal" name="pay"/> + <menu_item_call label="Del" name="share"/> + <menu_item_call label="Blokér" name="block"/> + <menu_item_call label="Fjern blokering" name="unblock"/> + <menu_item_call label="Spark" name="kick"/> + <menu_item_call label="Frys" name="freeze"/> + <menu_item_call label="Fjern frys" name="unfreeze"/> + <menu_item_call label="Kundeservicemedarbejder (CSR)" name="csr"/> +</toggleable_menu> diff --git a/indra/newview/skins/minimal/xui/da/menu_save_outfit.xml b/indra/newview/skins/minimal/xui/da/menu_save_outfit.xml new file mode 100644 index 0000000000000000000000000000000000000000..188229b58684921babd8529880ac1fe7fad0da74 --- /dev/null +++ b/indra/newview/skins/minimal/xui/da/menu_save_outfit.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="save_outfit_menu"> + <menu_item_call label="Gem" name="save_outfit"/> + <menu_item_call label="Gem som" name="save_as_new_outfit"/> +</toggleable_menu> diff --git a/indra/newview/skins/minimal/xui/da/menu_script_chiclet.xml b/indra/newview/skins/minimal/xui/da/menu_script_chiclet.xml new file mode 100644 index 0000000000000000000000000000000000000000..cdd3212373d3792671634cd7dae968b31497a47b --- /dev/null +++ b/indra/newview/skins/minimal/xui/da/menu_script_chiclet.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="ScriptChiclet Menu"> + <menu_item_call label="Luk" name="Close"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/da/menu_slurl.xml b/indra/newview/skins/minimal/xui/da/menu_slurl.xml new file mode 100644 index 0000000000000000000000000000000000000000..a9302e111eadc4e04ae3bed35a79505fe95d0f85 --- /dev/null +++ b/indra/newview/skins/minimal/xui/da/menu_slurl.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Popup"> + <menu_item_call label="Om URL" name="about_url"/> + <menu_item_call label="Teleportér til URL" name="teleport_to_url"/> + <menu_item_call label="Kort" name="show_on_map"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/da/menu_teleport_history_gear.xml b/indra/newview/skins/minimal/xui/da/menu_teleport_history_gear.xml new file mode 100644 index 0000000000000000000000000000000000000000..a1c25fea690d407d9702e17342351101573a8302 --- /dev/null +++ b/indra/newview/skins/minimal/xui/da/menu_teleport_history_gear.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Teleport History Gear Context Menu"> + <menu_item_call label="Udvid alle mapper" name="Expand all folders"/> + <menu_item_call label="Luk alle mapper" name="Collapse all folders"/> + <menu_item_call label="Nulstil teleport historik" name="Clear Teleport History"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/da/menu_teleport_history_item.xml b/indra/newview/skins/minimal/xui/da/menu_teleport_history_item.xml new file mode 100644 index 0000000000000000000000000000000000000000..dbaec62087e21e9fecc04e7b94f84134476b9ad2 --- /dev/null +++ b/indra/newview/skins/minimal/xui/da/menu_teleport_history_item.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Teleport History Item Context Menu"> + <menu_item_call label="Teleportér" name="Teleport"/> + <menu_item_call label="Mere information" name="More Information"/> + <menu_item_call label="Kopiér til udklipsholder" name="CopyToClipboard"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/da/menu_teleport_history_tab.xml b/indra/newview/skins/minimal/xui/da/menu_teleport_history_tab.xml new file mode 100644 index 0000000000000000000000000000000000000000..c4d4bb4b5b4be49458aba45a2771d7e071b29338 --- /dev/null +++ b/indra/newview/skins/minimal/xui/da/menu_teleport_history_tab.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Teleport History Item Context Menu"> + <menu_item_call label="Ã…ben" name="TabOpen"/> + <menu_item_call label="Luk" name="TabClose"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/da/menu_text_editor.xml b/indra/newview/skins/minimal/xui/da/menu_text_editor.xml new file mode 100644 index 0000000000000000000000000000000000000000..3ff31ea232f99383bbc37a5d993aee120074802e --- /dev/null +++ b/indra/newview/skins/minimal/xui/da/menu_text_editor.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Text editor context menu"> + <menu_item_call label="Klip" name="Cut"/> + <menu_item_call label="Kopiér" name="Copy"/> + <menu_item_call label="Sæt ind" name="Paste"/> + <menu_item_call label="Slet" name="Delete"/> + <menu_item_call label="Vælg alt" name="Select All"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/da/menu_topinfobar.xml b/indra/newview/skins/minimal/xui/da/menu_topinfobar.xml new file mode 100644 index 0000000000000000000000000000000000000000..08d1c25d6f21c475ba1b4dec2e85e5095051beae --- /dev/null +++ b/indra/newview/skins/minimal/xui/da/menu_topinfobar.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="menu_topinfobar"> + <menu_item_check label="Vis koordinater" name="Show Coordinates"/> + <menu_item_check label="Vis egenskaber for parcel" name="Show Parcel Properties"/> + <menu_item_call label="Landemærke" name="Landmark"/> + <menu_item_call label="Kopi" name="Copy"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/da/menu_url_agent.xml b/indra/newview/skins/minimal/xui/da/menu_url_agent.xml new file mode 100644 index 0000000000000000000000000000000000000000..491586f3b469b6d2d718f590cab7583ad13b7dd1 --- /dev/null +++ b/indra/newview/skins/minimal/xui/da/menu_url_agent.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="Vis beboer profil" name="show_agent"/> + <menu_item_call label="Kopiér navn til udklipsholder" name="url_copy_label"/> + <menu_item_call label="Kopiér SLurl til udklipsholder" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/da/menu_url_group.xml b/indra/newview/skins/minimal/xui/da/menu_url_group.xml new file mode 100644 index 0000000000000000000000000000000000000000..c776159b0a239c87592596cf8d14f1a9720b0ef6 --- /dev/null +++ b/indra/newview/skins/minimal/xui/da/menu_url_group.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="Vis gruppeinformation" name="show_group"/> + <menu_item_call label="Kopiér gruppe til udklipsholder" name="url_copy_label"/> + <menu_item_call label="Kopiér SLurl til udklipsholder" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/da/menu_url_http.xml b/indra/newview/skins/minimal/xui/da/menu_url_http.xml new file mode 100644 index 0000000000000000000000000000000000000000..4398777a3913098778a1dda0e0cc0c2ee60e0bcf --- /dev/null +++ b/indra/newview/skins/minimal/xui/da/menu_url_http.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="Indlæs" name="url_open"/> + <menu_item_call label="Ã…ben i intern browser" name="url_open_internal"/> + <menu_item_call label="Ã…ben i ekstern browser" name="url_open_external"/> + <menu_item_call label="Kopiér URL til udklipsholder" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/da/menu_url_inventory.xml b/indra/newview/skins/minimal/xui/da/menu_url_inventory.xml new file mode 100644 index 0000000000000000000000000000000000000000..9a7de23e0654a50e77bab540159c60445480bb1d --- /dev/null +++ b/indra/newview/skins/minimal/xui/da/menu_url_inventory.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="Vis beholdningsgenstand" name="show_item"/> + <menu_item_call label="Kopiér navn til udklipsholder" name="url_copy_label"/> + <menu_item_call label="Kopiér SLurl til udklipsholder" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/da/menu_url_map.xml b/indra/newview/skins/minimal/xui/da/menu_url_map.xml new file mode 100644 index 0000000000000000000000000000000000000000..ff4a4d5174fcfc4dff2e6e7591911c1f4badfbdc --- /dev/null +++ b/indra/newview/skins/minimal/xui/da/menu_url_map.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="Vis pÃ¥ kort" name="show_on_map"/> + <menu_item_call label="Teleport til lokation" name="teleport_to_location"/> + <menu_item_call label="Kopiér SLurl til udklipsholder" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/da/menu_url_objectim.xml b/indra/newview/skins/minimal/xui/da/menu_url_objectim.xml new file mode 100644 index 0000000000000000000000000000000000000000..e27cf8495934a405581f4ce03deb7ab2032fcf3b --- /dev/null +++ b/indra/newview/skins/minimal/xui/da/menu_url_objectim.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="Vis objekt information" name="show_object"/> + <menu_item_call label="Vis pÃ¥ kort" name="show_on_map"/> + <menu_item_call label="Teleportér til objekt lokation" name="teleport_to_object"/> + <menu_item_call label="Kopiér objekt navn til udklipsholder" name="url_copy_label"/> + <menu_item_call label="Kopiér SLurl til udklipsholder" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/da/menu_url_parcel.xml b/indra/newview/skins/minimal/xui/da/menu_url_parcel.xml new file mode 100644 index 0000000000000000000000000000000000000000..0f21e14f6614230db6ece887ddcaef3e6ad03964 --- /dev/null +++ b/indra/newview/skins/minimal/xui/da/menu_url_parcel.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="Vis information om parcel" name="show_parcel"/> + <menu_item_call label="Vis pÃ¥ kort" name="show_on_map"/> + <menu_item_call label="Kopiér SLurl til udklipsholder" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/da/menu_url_slapp.xml b/indra/newview/skins/minimal/xui/da/menu_url_slapp.xml new file mode 100644 index 0000000000000000000000000000000000000000..dd25db2aa7159968f7dd858ee91880ad81005a19 --- /dev/null +++ b/indra/newview/skins/minimal/xui/da/menu_url_slapp.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="Kør denne kommando" name="run_slapp"/> + <menu_item_call label="Kopiér SLurl til udklipsholder" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/da/menu_url_slurl.xml b/indra/newview/skins/minimal/xui/da/menu_url_slurl.xml new file mode 100644 index 0000000000000000000000000000000000000000..8d84a138bb7e9570b588456de0729f34ce3c6ad1 --- /dev/null +++ b/indra/newview/skins/minimal/xui/da/menu_url_slurl.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="Vis information" name="show_place"/> + <menu_item_call label="Vis pÃ¥ kort" name="show_on_map"/> + <menu_item_call label="Teleportér til lokation" name="teleport_to_location"/> + <menu_item_call label="Kopiér SLurl til udklipsholder" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/da/menu_url_teleport.xml b/indra/newview/skins/minimal/xui/da/menu_url_teleport.xml new file mode 100644 index 0000000000000000000000000000000000000000..e0ca7b920dbd6b0f0582c9c938c34f5a7d0290ec --- /dev/null +++ b/indra/newview/skins/minimal/xui/da/menu_url_teleport.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="Teleport" name="teleport"/> + <menu_item_call label="Vis pÃ¥ kort" name="show_on_map"/> + <menu_item_call label="Kopiér SLurl til udklipsholder" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/da/menu_viewer.xml b/indra/newview/skins/minimal/xui/da/menu_viewer.xml new file mode 100644 index 0000000000000000000000000000000000000000..93b247f8414f4022dc26f4abf1cfcbe31ba0932e --- /dev/null +++ b/indra/newview/skins/minimal/xui/da/menu_viewer.xml @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu_bar name="Main Menu"> + <menu label="Hjælp" name="Help"> + <menu_item_call label="[SECOND_LIFE] Help" name="Second Life Help"/> + </menu> + <menu label="Avanceret" name="Advanced"> + <menu label="Shortcuts" name="Shortcuts"> + <menu_item_check label="Flyv" name="Fly"/> + <menu_item_call label="Luk vindue" name="Close Window"/> + <menu_item_call label="Luk alle vinduer" name="Close All Windows"/> + <menu_item_call label="Nulstil udsyn" name="Reset View"/> + </menu> + </menu> +</menu_bar> diff --git a/indra/newview/skins/minimal/xui/da/menu_wearable_list_item.xml b/indra/newview/skins/minimal/xui/da/menu_wearable_list_item.xml new file mode 100644 index 0000000000000000000000000000000000000000..63f4b0b38849cdb60770137ef4f52f64a5879c12 --- /dev/null +++ b/indra/newview/skins/minimal/xui/da/menu_wearable_list_item.xml @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Outfit Wearable Context Menu"> + <menu_item_call label="Erstat" name="wear_replace"/> + <menu_item_call label="Tag pÃ¥" name="wear_wear"/> + <menu_item_call label="Tilføj" name="wear_add"/> + <menu_item_call label="Tag af" name="take_off_or_detach"/> + <menu_item_call label="Tag af" name="detach"/> + <context_menu label="Vedhæft til" name="wearable_attach_to"/> + <context_menu label="Vedhæft til HUD" name="wearable_attach_to_hud"/> + <menu_item_call label="Tag af" name="take_off"/> + <menu_item_call label="Redigér" name="edit"/> + <menu_item_call label="Genstandsprofil" name="object_profile"/> + <menu_item_call label="Vis original" name="show_original"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/da/menu_wearing_gear.xml b/indra/newview/skins/minimal/xui/da/menu_wearing_gear.xml new file mode 100644 index 0000000000000000000000000000000000000000..515a15b287ea9a122af3176b1bc8cab204cbbbcc --- /dev/null +++ b/indra/newview/skins/minimal/xui/da/menu_wearing_gear.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Gear Wearing"> + <menu_item_call label="Redigér sæt" name="edit"/> + <menu_item_call label="Tag af" name="takeoff"/> +</menu> diff --git a/indra/newview/skins/minimal/xui/da/menu_wearing_tab.xml b/indra/newview/skins/minimal/xui/da/menu_wearing_tab.xml new file mode 100644 index 0000000000000000000000000000000000000000..c0db7b68426012c915339b32dfd5093ae60ea9d9 --- /dev/null +++ b/indra/newview/skins/minimal/xui/da/menu_wearing_tab.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Wearing"> + <menu_item_call label="Tag af" name="take_off"/> + <menu_item_call label="Tag af" name="detach"/> + <menu_item_call label="Redigér sæt" name="edit"/> +</context_menu> diff --git a/indra/newview/skins/minimal/xui/da/notifications.xml b/indra/newview/skins/minimal/xui/da/notifications.xml new file mode 100644 index 0000000000000000000000000000000000000000..e77eeee8df4db3db23c82095ba96b93a72118853 --- /dev/null +++ b/indra/newview/skins/minimal/xui/da/notifications.xml @@ -0,0 +1,1831 @@ +<?xml version="1.0" encoding="utf-8"?> +<notifications> + <global name="skipnexttime"> + Vis ikke dette igen + </global> + <global name="alwayschoose"> + Vælg altid dette + </global> + <global name="implicitclosebutton"> + Luk + </global> + <template name="okbutton"> + <form> + <button name="OK_okbutton" text="$yestext"/> + </form> + </template> + <template name="okignore"> + <form> + <button name="OK_okignore" text="$yestext"/> + </form> + </template> + <template name="okcancelbuttons"> + <form> + <button name="OK_okcancelbuttons" text="$yestext"/> + <button name="Cancel_okcancelbuttons" text="$notext"/> + </form> + </template> + <template name="okcancelignore"> + <form> + <button name="OK_okcancelignore" text="$yestext"/> + <button name="Cancel_okcancelignore" text="$notext"/> + </form> + </template> + <template name="okhelpbuttons"> + <form> + <button name="OK_okhelpbuttons" text="$yestext"/> + <button name="Help" text="$helptext"/> + </form> + </template> + <template name="yesnocancelbuttons"> + <form> + <button name="Yes" text="$yestext"/> + <button name="No" text="$notext"/> + <button name="Cancel_yesnocancelbuttons" text="$canceltext"/> + </form> + </template> + <notification functor="GenericAcknowledge" label="Ukendt notificeringsbesked" name="MissingAlert"> + Din version af [APP_NAME] kan ikke vise den besked den lige modtog. Undersøg venligst at du har den nyester version af klienten installeret. + +Fejl detaljer: Beskeden kaldet '[_NAME]' blev ikke fundet i notifications.xml. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="FloaterNotFound"> + Floater error: Kunne ikke finde følgende kontrol: + +[CONTROLS] + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="TutorialNotFound"> + Der er i øjeblikket ingen tilgængelig guide. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="GenericAlert"> + [MESSAGE] + </notification> + <notification name="GenericAlertYesCancel"> + [MESSAGE] + <usetemplate name="okcancelbuttons" notext="Annullér" yestext="Ja"/> + </notification> + <notification name="BadInstallation"> + Der opstod en fejl ved opdatering af [APP_NAME]. Please [http://get.secondlife.com download the latest version] of the Viewer. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="LoginFailedNoNetwork"> + Kunne ikke tilslutte til [SECOND_LIFE_GRID]. + '[DIAGNOSTIC]' +Check at Internet forbindelsen fungerer korrekt. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="MessageTemplateNotFound"> + Besked template [PATH] kunne ikke findes. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="WearableSave"> + Gem ændringer til nuværende tøj/krops del? + <usetemplate canceltext="Annullér" name="yesnocancelbuttons" notext="Gem ikke" yestext="Gem"/> + </notification> + <notification name="CompileQueueSaveText"> + Der var problemer med upload af teksten til et script af følgende Ã¥rsager: [REASON]. Prøv igen senere. + </notification> + <notification name="CompileQueueSaveBytecode"> + Der var problemer med at uploade den kompileret script af følgende Ã¥rsager: [REASON]. Prøv igen senere. + </notification> + <notification name="WriteAnimationFail"> + Der var et problem med skrivning af animations data. Prøv igen senere. + </notification> + <notification name="UploadAuctionSnapshotFail"> + Der var problemer med at uploade billedet til auktionen af følgende Ã¥rsager: [REASON] + </notification> + <notification name="UnableToViewContentsMoreThanOne"> + Ude af stand til at se indholdet af mere end ét element ad gangen. +Vælg kun en genstand, og prøv igen. + </notification> + <notification name="SaveClothingBodyChanges"> + Gem alle ændringer til tøj/krops dele? + <usetemplate canceltext="Annullér" name="yesnocancelbuttons" notext="Gem Ikke" yestext="Gem Alt"/> + </notification> + <notification name="FriendsAndGroupsOnly"> + 'Ikke-venner' vil ikke vide, at du har valgt at ignorere deres opkald og personlige beskeder (IM) + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="FavoritesOnLogin"> + Bemærk: NÃ¥r du aktiverer dette valg, kan enhver der bruger denne computer se dine favorit lokationer. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="GrantModifyRights"> + Tildeling af ændre-rettigheder til andre beboere, tillader dem at ændre, slette eller tage ETHVERT objekt du mÃ¥tte have. Vær MEGET forsigtig ved tildeling af denne rettighed. +Ønsker du at give ændre-rettgheder til [NAME]? + <usetemplate name="okcancelbuttons" notext="Nej" yestext="Ja"/> + </notification> + <notification name="GrantModifyRightsMultiple"> + At give redigerings rettigheder til en anden beboer, giver dem mulighed for at ændre, slette eller tage ALLE genstande, du mÃ¥tte have i verden. Vær MEGET forsigtig nÃ¥r uddeler denne tilladelse. +Ønsker du at ændre rettigheder for de valgte beboere? + <usetemplate name="okcancelbuttons" notext="Nej" yestext="Ja"/> + </notification> + <notification name="RevokeModifyRights"> + Ønsker du at tilbagekalder ændre-rettigheder for [NAME]? + <usetemplate name="okcancelbuttons" notext="Nej" yestext="Ja"/> + </notification> + <notification name="RevokeModifyRightsMultiple"> + Vil du tilbagekalde rettighederne for de valgte beboere? + <usetemplate name="okcancelbuttons" notext="Nej" yestext="Ja"/> + </notification> + <notification name="UnableToCreateGroup"> + Kunne ikke oprette gruppe. +[MESSAGE] + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="PanelGroupApply"> + [NEEDS_APPLY_MESSAGE] +[WANT_APPLY_MESSAGE] + <usetemplate canceltext="Annullér" name="yesnocancelbuttons" notext="Ignorer Ændringer" yestext="Godkend Ændringer"/> + </notification> + <notification name="MustSpecifyGroupNoticeSubject"> + Du skal angive et emne for at sende en gruppe besked. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="AddGroupOwnerWarning"> + Du er ved at tilføje medlemmer til rollen som [ROLE_NAME]. +Medlemmer ikke kan fjernes fra denne rolle. +Medlemmerne skal fratræde sin rolle selv. +Er du sikker pÃ¥ du vil fortsætte? + <usetemplate ignoretext="Bekræft, før jeg tilføjer en ny gruppe ejer" name="okcancelignore" notext="Nej" yestext="Ja"/> + </notification> + <notification name="AssignDangerousActionWarning"> + Du er ved at tilføje muligheden for '[ACTION_NAME]' til +rollen '[ROLE_NAME]'. + +*ADVARSEL* +Ethvert medlem i en rolle med denne evne kan tildele sig selv -- og et andet medlem - roller med flere beføjelser, end de har i øjeblikket, potentielt kan de ophøje sig selv til nær-Ejer magt. Være sikker pÃ¥, at du ved, hvad du laver, før tildeling af denne evne. + +Add this Ability to '[ROLE_NAME]'? + <usetemplate name="okcancelbuttons" notext="Nej" yestext="Ja"/> + </notification> + <notification name="AttachmentDrop"> + Du er ved at smide et vedhæng. + Er du sikker pÃ¥ at du vil fortsætte? + <usetemplate ignoretext="Bekræft før vedhæng smides" name="okcancelignore" notext="Nej" yestext="Ja"/> + </notification> + <notification name="JoinGroupNoCost"> + Du melder dig ind i gruppen [NAME]. +Ønsker du at fortsætte? + <usetemplate name="okcancelbuttons" notext="Annullér" yestext="Bliv medlem"/> + </notification> + <notification name="JoinGroupCannotAfford"> + Tilmelding til denne gruppe koster L$[COST]. +Du har ikke nok L$ til denne tilmelding. + </notification> + <notification name="CreateGroupCost"> + Oprettelse af denne gruppe vil koste L$100. +Grupper skal have mindst 2 medlemmer, ellers slettes de for altid. +Invitér venligst medlemmer indenfor 48 timer. + <usetemplate canceltext="Annullér" name="okcancelbuttons" notext="Annullér" yestext="Oprete en gruppe for L$100"/> + </notification> + <notification name="ConfirmLandSaleToAnyoneChange"> + ADVARSEL: Ved at vælge 'sælg til enhver' bliver til land tilgængeligt for alle i hele [SECOND_LIFE], ogsÃ¥ de som ikke er i denne region. + +Det valgte antal [LAND_SIZE] m² land bliver sat til salg. +Salgprisen vil være [SALE_PRICE]L$ og vil være til salg til [NAME]. + </notification> + <notification name="MultipleFacesSelected"> + Flere overflader er valgt for øjeblikket. +Hvis du fortsætter med denne aktion, vil flere instanser af media blive vist pÃ¥ overfladerne pÃ¥ objektet. +Hvis media kun skal vises pÃ¥ en overflade, vælg 'Vælg overflade' og klik pÃ¥ den relevante overflade og klik pÃ¥ tilføj. + <usetemplate ignoretext="Media vil blive sat pÃ¥ flere valgte overflader" name="okcancelignore" notext="Annullér" yestext="OK"/> + </notification> + <notification name="PromptMissingSubjMsg"> + E-mail dette billede med standard emne eller besked? + <usetemplate name="okcancelbuttons" notext="Annullér" yestext="OK"/> + </notification> + <notification name="ErrorUploadingPostcard"> + Der var et problem med at sende billedet pÃ¥ grund af følgende: [REASON] + </notification> + <notification name="MaxAttachmentsOnOutfit"> + Kunne ikke vedhæfte objekt. +Overskrider vedhæftnings begrænsning pÃ¥ [MAX_ATTACHMENTS] objekter. Tag venligst en anden vedhæftning af først. + </notification> + <notification name="MustHaveAccountToLogIn"> + Ups. Noget mangler at blive udfyldt. +Du skal indtaste brugernavnet for din avatar. + +Du skal bruge en konto for at benytte [SECOND_LIFE]. Ønsker du at oprette en konto nu? + <usetemplate name="okcancelbuttons" notext="Prøv igen" yestext="Lav ny konto"/> + </notification> + <notification name="InvalidCredentialFormat"> + Du skal indtaste enten dit brugernavn eller bÃ¥de dit fornavn og efternavn for din avatar i brugernavn feltet, derefter log pÃ¥ igen. + </notification> + <notification name="DeleteMedia"> + Du har valgt at slette media tilknyttet denne overflade. +Er du sikker pÃ¥ at du vil fortsætte? + <usetemplate ignoretext="Bekræft før jeg slette media i et objekt" name="okcancelignore" notext="Nej" yestext="Ja"/> + </notification> + <notification name="ClassifiedInsufficientFunds"> + Ikke nok penge til at oprette annonce. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="DeleteAvatarPick"> + Slet favorit <nolink>[PICK]</nolink>? + </notification> + <notification name="DeleteOutfits"> + Slet valgte sæt? + <usetemplate name="okcancelbuttons" notext="Annullér" yestext="OK"/> + </notification> + <notification name="CacheWillClear"> + Cache vil blive tømt ved næste genstart af [APP_NAME]. + </notification> + <notification name="CacheWillBeMoved"> + Cache vil blive fjernet ved næste genstart af [APP_NAME]. +Note: This will clear the cache. + </notification> + <notification name="ChangeConnectionPort"> + Port ændringer vil blive effektueret ved næste genstart af [APP_NAME]. + </notification> + <notification name="ChangeSkin"> + Den nye hud vil blive vist ved næste genstart af [APP_NAME]. + </notification> + <notification name="ChangeLanguage"> + Ændring af sprog vil først have effekt efter genstart af [APP_NAME]. + </notification> + <notification name="StartRegionEmpty"> + Ups, din start region er ikke angivet. +Indtast venligst navn pÃ¥ region i Start lokation feltet eller vælg "Min sidste lokation" eller "Hjem". + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="UnsupportedHardware"> + Din computer opfylder ikke minimumskravene til [APP_NAME]. Du kan risikere nedsat hastighed. Desværre kan [SUPPORT_SITE] ikke tilbyde teknisk support til konfigurationer der ikke er understøttet. + +Besøg [_URL] for yderligere information? + <usetemplate ignoretext="Din computer hardware understøttes ikke" name="okcancelignore" notext="No" yestext="Yes"/> + </notification> + <notification name="UnknownGPU"> + Dit system indeholder et grafikkort som [APP_NAME] ikke kan genkende. +Dette skyldes ofte nyt hardware som endnu ikke er blevet testet med [APP_NAME]. Kortet vil sandsynligvis virke fint, med det kan være nødvendigt at justere grafik opsætningen. +(Mig > Indstillinger > Grafik). + <form name="form"> + <ignore name="ignore" text="Dit grafikkort kunne ikke identificeres"/> + </form> + </notification> + <notification name="DisplaySettingsNoShaders"> + [APP_NAME] gik ned ved inititalisering af grafik drivere. +Grafik kvaliteten sættes til 'lav' for at undgÃ¥ typiske problemer med drivere. Dette vil slÃ¥ visse grafik funktioner fra. +Vi anbefaler at opdatere driverne til dit grafikkort. +Grafik kvaliteten kan forbedres i indstillinger > Grafik. + </notification> + <notification name="CannotCopyWarning"> + Du har ikke rettigheder til at kopiere følgende genstande: +[ITEMS] +og du vil miste dem fra din beholdning hvis du forærer dem væk. Er du sikker pÃ¥ at du vil tilbyde disse genstande? + </notification> + <notification name="CannotGiveCategory"> + Du har ikke tilladelse til at videreføre den valgte mappe. + </notification> + <notification name="EjectAvatarFromGroup"> + Du har smidt [AVATAR_NAME] ud af gruppen [GROUP_NAME] + </notification> + <notification name="PromptGoToCurrencyPage"> + [EXTRA] + +GÃ¥ til [_URL] for information om køb af L$? + </notification> + <notification name="SoundFileInvalidChunkSize"> + Fejl i WAV fil (chunk size): +[FILE] + </notification> + <notification name="CannotEncodeFile"> + Kunne ikke 'forstÃ¥' filen: [FILE] + </notification> + <notification name="CorruptedProtectedDataStore"> + Vi kan ikke udfylde dit brugernavn og password. Dette kan ske hvis du ændrer netværksopsætning + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="DoNotSupportBulkAnimationUpload"> + [APP_NAME] understøtter p.t. ikke at send flere animationsfiler ad gangen. + </notification> + <notification name="LandmarkCreated"> + Du har tilføjet "[LANDMARK_NAME]" til din [FOLDER_NAME] mappe. + </notification> + <notification name="LandmarkAlreadyExists"> + Du har allerede et landemærke for denne lokation. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="CannotOpenScriptObjectNoMod"> + Ikke muligt at Ã¥bne script i objekt uden 'Redigére' rettigheder. + </notification> + <notification name="CouldNotTeleportReason"> + Teleport fejlede. +[REASON] + </notification> + <notification name="invalid_tport"> + Der opstod et problem ved din teleport. Det kan være nødvendigt at logge ind igen, før du kan teleporte. +Hvis du bliver ved med at fÃ¥ denne fejl, check venligst [SUPPORT_SITE]. + </notification> + <notification name="invalid_region_handoff"> + Der opstod et problem ved skift til ny region. Det kan være nødvendigt at logge ind igen, før du kan skifte til andre regioner. +Hvis du bliver ved med at fÃ¥ denne fejl, check venligst [SUPPORT_SITE]. + </notification> + <notification name="blocked_tport"> + Beklager, teleport er blokeret lige nu. Prøv igen senere. +Hvis du stadig ikke kan teleporte, prøv venligst at logge ud og ligge ind for at løse dette problem. + </notification> + <notification name="nolandmark_tport"> + Beklager, systemet kunne ikke finde landmærke destinationen. + </notification> + <notification name="timeout_tport"> + Beklager, systemet kunne ikke fuldføre teleport forbindelse. +Prøv igen om lidt. + </notification> + <notification name="noaccess_tport"> + Beklager, du har ikke adgang til denne teleport destination. + </notification> + <notification name="missing_attach_tport"> + Dine vedhæng er ikke ankommet endnu. Prøv at vente lidt endnu eller log ud og ind igen før du prøver at teleporte igen. + </notification> + <notification name="too_many_uploads_tport"> + Tekniske problemer hindrer at din teleport kan gennemføres. +Prøv venligst igen om lidt eller vælg et mindre travlt omrÃ¥de. + </notification> + <notification name="expired_tport"> + Beklager, men systemet kunne ikke fuldføre din teleport i rimelig tid. Prøv venligst igen om lidt. + </notification> + <notification name="expired_region_handoff"> + Beklager, men systemet kunne ikke fuldføre skift til anden region i rimelig tid. Prøv venligst igen om lidt. + </notification> + <notification name="no_host"> + Ikke muligt at fine teleport destination. Destinationen kan være midlertidig utilgængelig eller findes ikke mere. +Prøv evt. igen om lidt. + </notification> + <notification name="no_inventory_host"> + Beholdningssystemet er ikke tilgængelig lige nu. + </notification> + <notification name="ForceOwnerAuctionWarning"> + Denne parcel er sat pÃ¥ auktion. Gennemtving ejerskab vil annullere denne auktion og mÃ¥ske irritere nogen beboere hvis bud allerede er afgivet. +Gennemtving ejerskab? + </notification> + <notification name="CannotBuyLandNoRegion"> + Ikke i stand til at købe land: +Kan ikke finde region som dette land er i. + </notification> + <notification name="CannotCloseFloaterBuyLand"> + Du kan ikke lukke 'Køb land' vinduet før [APP_NAME] har vurderet en pris pÃ¥ denne transaktion. + </notification> + <notification name="CannotDeedLandNoRegion"> + Land kunne ikke dedikeres: +Kunne ikke finde den region land ligger i. + </notification> + <notification name="CannotReleaseLandRegionNotFound"> + Kunne ikke efterlade land: +Kan ikke finde den region landet ligger i. + </notification> + <notification name="CannotDivideLandNoRegion"> + Kunne ikke opdele land: +Kan ikke finde den region landet ligger i. + </notification> + <notification name="CannotJoinLandNoRegion"> + Kunne ikke opdele land: +Kan ikke finde den region landet ligger i. + </notification> + <notification name="CannotSaveToAssetStore"> + Kunne ikke gemme [NAME] i den centrale database. +Dette er typisk en midlertidig fejl. Venligst rediger og gem igen om et par minutter. + </notification> + <notification name="YouHaveBeenLoggedOut"> + Du er blevet logget af [SECOND_LIFE] + [MESSAGE] + <usetemplate name="okcancelbuttons" notext="Afslut" yestext="Se PB & Chat"/> + </notification> + <notification label="Tilføj ven" name="AddFriendWithMessage"> + Venner kan give tilladelse til at følge hinanden +pÃ¥ Verdenskortet eller modtage status opdateringer. + +Tilbyd venskab til [NAME]? + <form name="form"> + <input name="message"> + Vil du være min ven? + </input> + <button name="Offer" text="OK"/> + <button name="Cancel" text="Annullér"/> + </form> + </notification> + <notification label="Gem sæt" name="SaveOutfitAs"> + Gem det som jeg har pÃ¥ som nyt sæt: + <form name="form"> + <input name="message"> + [DESC] (ny) + </input> + <button name="OK" text="OK"/> + <button name="Cancel" text="Annullér"/> + </form> + </notification> + <notification label="Gem" name="SaveWearableAs"> + Gem genstand til beholdning som: + <form name="form"> + <input name="message"> + [DESC] (ny) + </input> + <button name="OK" text="OK"/> + <button name="Cancel" text="Annullér"/> + </form> + </notification> + <notification label="Omdøb sæt" name="RenameOutfit"> + Nyt navn til sæt: + <form name="form"> + <input name="new_name"> + [NAME] + </input> + <button name="OK" text="OK"/> + <button name="Cancel" text="Annullér"/> + </form> + </notification> + <notification name="RemoveFromFriends"> + Ønsker du at fjerne [NAME] fra din venneliste? + </notification> + <notification name="ConfirmItemDeleteHasLinks"> + Mindst en af genstandene har lænkede genstande der peger pÃ¥ den. Hvis du sletter denne genstand, vil lænkninger ikke virke mere. Det anbefales kraftigt at fjerne lænkninger først. + +Er du sikker pÃ¥ at du vil slette disse genstande? + <usetemplate name="okcancelbuttons" notext="Annullér" yestext="OK"/> + </notification> + <notification name="DeedLandToGroupWithContribution"> + Ved at dedikere denne parcel, vil gruppen skulle have og vedblive med at have nok kreditter til brug af land. +Dedikeringen vil inkludere samtidige bidrag til gruppen fra '[NAME]'. +Købsprisen for dette land er ikke refunderet til ejeren. Hvis en dedikeret parvel sælges, vil salgsprisen blive delt ligeligt mellem gruppe medlemmerne. + +Dediker disse [AREA] m² land til gruppen '[GROUP_NAME]'? + </notification> + <notification name="ErrorMessage"> + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="AvatarMovedDesired"> + Den ønskede lokation er ikke tilgængelig lige nu. +Du er blevet flyttet til en region in nærheden. + </notification> + <notification name="AvatarMovedLast"> + Din sidste lokation er ikke tilgængelig for øjeblikket. +Du er blevet flyttet til en region in nærheden. + </notification> + <notification name="AvatarMovedHome"> + Din hjemme lokation er ikke tilgængelig for øjeblikket. +Du er blevet flyttet til en region in nærheden. +Du kan mÃ¥ske ønske at sætte en ny hjemme lokation. + </notification> + <notification name="ClothingLoading"> + Dit tøj hentes stadig ned. +Du kan bruge [SECOND_LIFE] normalt og andre personer vil se dig korrekt. + <form name="form"> + <ignore name="ignore" text="Det tager lang tid at hente tøj"/> + </form> + </notification> + <notification name="FirstRun"> + [APP_NAME] installationen er færdig. + +Hvis det er første gang du bruger [SECOND_LIFE], skal du først oprette en konto for at logge pÃ¥. +Vend tilbage til [http://join.secondlife.com secondlife.com] for at oprette en ny konto? + </notification> + <notification name="LoginPacketNeverReceived"> + Der er problemer med at koble pÃ¥. Der kan være et problem med din Internet forbindelse eller [SECOND_LIFE_GRID]. + +Du kan enten checke din Internet forbindelse og prøve igen om lidt, klikke pÃ¥ Hjælp for at se [SUPPORT_SITE] siden, eller klikke pÃ¥ Teleport for at forsøge at teleportere hjem. + </notification> + <notification name="CantTeleportToGrid"> + Kunne ikke teleportere til [SLURL] da den er pÃ¥ et andet net ([GRID]) end det nuværende net ([CURRENT_GRID]). Luk venligst din klient og prøv igen. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="GeneralCertificateError"> + Kunne ikke opnÃ¥ forbindelse til server. +[REASON] + +Vedrørende: [SUBJECT_NAME_STRING] +Fra: [ISSUER_NAME_STRING] +Valid fra: [VALID_FROM] +Valid til: [VALID_TO] +MD5 Fingerprint: [SHA1_DIGEST] +SHA1 Fingerprint: [MD5_DIGEST] +Key Usage: [KEYUSAGE] +Extended Key Usage: [EXTENDEDKEYUSAGE] +Subject Key Identifier: [SUBJECTKEYIDENTIFIER] + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="TrustCertificateError"> + Certifikationsmyndighed for denne server er ikke kendt. + +Certifikat information: +Vedrørende: [SUBJECT_NAME_STRING] +Fra: [ISSUER_NAME_STRING] +Valid fra: [VALID_FROM] +Valid til: [VALID_TO] +MD5 Fingerprint: [SHA1_DIGEST] +SHA1 Fingerprint: [MD5_DIGEST] +Key Usage: [KEYUSAGE] +Extended Key Usage: [EXTENDEDKEYUSAGE] +Subject Key Identifier: [SUBJECTKEYIDENTIFIER] + +Ønsker du at stole pÃ¥ denne myndighed? + <usetemplate name="okcancelbuttons" notext="Annullér" yestext="Stol pÃ¥"/> + </notification> + <notification name="NotEnoughCurrency"> + [NAME] L$ [PRICE] Du har ikke nok L$ til dette. + </notification> + <notification name="GrantedModifyRights"> + [NAME] har givet dig rettighed til at redigere sine objekter. + </notification> + <notification name="RevokedModifyRights"> + Dinne rettigheder til at redigere objekter ejet af [NAME] er fjernet + </notification> + <notification name="BuyOneObjectOnly"> + Ikke muligt at købe mere end et objekt ad gangen. Vælg kun ét objekt og prøv igen. + </notification> + <notification name="DownloadWindowsMandatory"> + En ny version af [APP_NAME] er tilgængelig. +[MESSAGE] +Du skal hente denne version for at bruge [APP_NAME]. + </notification> + <notification name="DownloadWindows"> + En opdateret version af [APP_NAME] er tilgængelig. +[MESSAGE] +Denne opdatering er ikke pÃ¥krævet, men det anbefales at installere den for at opnÃ¥ øget hastighed og forbedret stabilitet. + </notification> + <notification name="DownloadWindowsReleaseForDownload"> + En opdateret version af [APP_NAME] er tilgængelig. +[MESSAGE] +Denne opdatering er ikke pÃ¥krævet, men det anbefales at installere den for at opnÃ¥ øget hastighed og forbedret stabilitet. + </notification> + <notification name="DownloadLinuxMandatory"> + En ny version af [APP_NAME] er tilgængelig. +[MESSAGE] +Du skal hente denne version for at kunne benytte [APP_NAME]. + <usetemplate name="okcancelbuttons" notext="Afslut" yestext="Hent"/> + </notification> + <notification name="DownloadLinux"> + En opdateret version af [APP_NAME] er tilgængelig. +[MESSAGE] +Denne opdatering er ikke pÃ¥krævet, men det anbefales at installere den for at opnÃ¥ øget hastighed og forbedret stabilitet. + <usetemplate name="okcancelbuttons" notext="Fortsæt" yestext="Hent"/> + </notification> + <notification name="DownloadLinuxReleaseForDownload"> + En opdateret version af [APP_NAME] er tilgængelig. +[MESSAGE] +Denne opdatering er ikke pÃ¥krævet, men det anbefales at installere den for at opnÃ¥ øget hastighed og forbedret stabilitet. + <usetemplate name="okcancelbuttons" notext="Fortsæt" yestext="Hent"/> + </notification> + <notification name="DownloadMacMandatory"> + En ny version af [APP_NAME] er tilgængelig. +[MESSAGE] +Du skal hente denne opdatering for at bruge [APP_NAME]. + +Download til dit Program bibliotek? + </notification> + <notification name="DownloadMac"> + En opdateret version af [APP_NAME] er tilgængelig. +[MESSAGE] +Denne opdatering er ikke pÃ¥krævet, men det anbefales at installere den for at opnÃ¥ øget hastighed og forbedret stabilitet. + +Download til dit Program bibliotek? + </notification> + <notification name="DownloadMacReleaseForDownload"> + En opdateret version af [APP_NAME] er tilgængelig. +[MESSAGE] +Denne opdatering er ikke pÃ¥krævet, men det anbefales at installere den for at opnÃ¥ øget hastighed og forbedret stabilitet. + +Download til dit Program bibliotek? + </notification> + <notification name="FailedUpdateInstall"> + Der opstod en fejl ved installation af opdatering. +Hent og installér venligst den nyeste version fra +http://secondlife.com/download. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="FailedRequiredUpdateInstall"> + Vi kunne ikke installere en pÃ¥krævet opdatering. +Du kan ikke logge pÃ¥ før [APP_NAME] er blevet opdateret. + +Hent og installer venligst den nyeste klien fra +http://secondlife.com/download. + <usetemplate name="okbutton" yestext="Afslut"/> + </notification> + <notification name="UpdaterServiceNotRunning"> + Dette er en pÃ¥krævet opdatering af din Second Life installation. + +Du kan downloade opdateringen fra http://www.secondlife.com/downloads +eller du kan installere den nu. + <usetemplate name="okcancelbuttons" notext="Afslut Second Life" yestext="Hent og installér nu"/> + </notification> + <notification name="DownloadBackgroundTip"> + Vi har hentet en opdatering til din [APP_NAME] installation. +Version [VERSION] [[RELEASE_NOTES_FULL_URL] Information about this update] + <usetemplate name="okcancelbuttons" notext="Senere..." yestext="Installér nu og genstart [APP_NAME]"/> + </notification> + <notification name="DownloadBackgroundDialog"> + Vi har hentet en opdatering til din [APP_NAME] installation. +Version [VERSION] [[RELEASE_NOTES_FULL_URL] Information about this update] + <usetemplate name="okcancelbuttons" notext="Senere..." yestext="Installér nu og genstart [APP_NAME]"/> + </notification> + <notification name="RequiredUpdateDownloadedVerboseDialog"> + Vi har hentet en pÃ¥krævet opdatering. +Version [VERSION] + +Du skal genstarte [APP_NAME] for at installere denne opdatering. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="RequiredUpdateDownloadedDialog"> + Du skal genstarte [APP_NAME] for at installere opdateringen. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="DeedObjectToGroup"> + <usetemplate ignoretext="Bekræft før jeg dedikerer et objekt til en gruppe" name="okcancelignore" notext="Cancel" yestext="Deed"/> + </notification> + <notification name="WebLaunchExternalTarget"> + Ønsker du at Ã¥bne din web browser for at se dette indhold? + <usetemplate ignoretext="Start min browser for at se hjemmesider" name="okcancelignore" notext="Cancel" yestext="OK"/> + </notification> + <notification name="WebLaunchJoinNow"> + GÃ¥ til [http://secondlife.com/account/ Dashboard] for at administrere din konto? + <usetemplate ignoretext="Start min browser for at administrere min konto" name="okcancelignore" notext="Cancel" yestext="OK"/> + </notification> + <notification name="WebLaunchSecurityIssues"> + <usetemplate ignoretext="Start min browser for at lære hvordan man rapporterer sikkerhedsproblemer" name="okcancelignore" notext="Cancel" yestext="OK"/> + </notification> + <notification name="WebLaunchQAWiki"> + <usetemplate ignoretext="Start min browser for at se QA Wiki" name="okcancelignore" notext="Cancel" yestext="OK"/> + </notification> + <notification name="WebLaunchPublicIssue"> + <usetemplate ignoretext="Start min browser for at bruge det Linden Labs sagsstyring" name="okcancelignore" notext="Cancel" yestext="Go to page"/> + </notification> + <notification name="WebLaunchSupportWiki"> + <usetemplate ignoretext="Start min browser for at se bloggen" name="okcancelignore" notext="Cancel" yestext="OK"/> + </notification> + <notification name="WebLaunchLSLGuide"> + Ønsker du at Ã¥bne 'Scripting Guide' for hjælp til scripting? + <usetemplate ignoretext="Start min browser for at se Scripting Guide" name="okcancelignore" notext="Cancel" yestext="OK"/> + </notification> + <notification name="WebLaunchLSLWiki"> + Ønsker du at besøge LSL portalen for hjælp til scripting? + <usetemplate ignoretext="Start min browser for at besøge LSL Portalen" name="okcancelignore" notext="Cancel" yestext="Go to page"/> + </notification> + <notification name="ReturnToOwner"> + <usetemplate ignoretext="Bekræft før objekter returneres til deres ejere" name="okcancelignore" notext="Cancel" yestext="OK"/> + </notification> + <notification name="ConfirmKick"> + Er du SIKKER pÃ¥ at du vil sparke alle beboere ud? + <usetemplate name="okcancelbuttons" notext="Cancel" yestext="Spark alle beboere ud"/> + </notification> + <notification name="MuteLinden"> + Beklager, men du kan ikke blokere en Linden. + </notification> + <notification name="CannotStartAuctionAlreadyForSale"> + Du kan ikke starte en auktion pÃ¥ en parcel som allerede er sat til salg. Fjern 'til salg' muligheden hvis du ønsker at starte en auktion. + </notification> + <notification label="Blokering af objekt via navn mislykkedes" name="MuteByNameFailed"> + Du har allerede blokeret dette navn. + </notification> + <notification name="BusyModeSet"> + Sat til 'optaget'. +Chat og personlige beskeder vil blive skjult. Personlige beskeder vil fÃ¥ din 'optaget' besked. Alle teleport invitationer vil blive afvist. Alle objekter sendt til dig vil ende i papirkurven. + <usetemplate ignoretext="Jeg skrifter min status til 'optaget" name="okignore" yestext="OK"/> + </notification> + <notification name="JoinedTooManyGroupsMember"> + Du er oppe pÃ¥ det maksimale antal grupper. Forlad venligst en anden gruppe inden du melder dig ind i denne, eller afvis tilbuddet. +[NAME] har inviteret dig til en gruppe. + </notification> + <notification name="JoinedTooManyGroups"> + Du er oppe pÃ¥ det maksimale antal grupper. Forlad venligst en gruppe inden du melder dig ind i enndnu en gruppe eller opretter en ny. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="KickUser"> + Spark beboere ud med hvilken besked? + </notification> + <notification name="FreezeUser"> + Frys beboeren med hvilken besked? + </notification> + <notification name="UnFreezeUser"> + Fjern frysning af beboeren med hvilken besked? + </notification> + <notification name="SetDisplayNameSuccess"> + Hej [DISPLAY_NAME]! + +Præcist som i virkeligheden tager det et stykke tid at vænne sig til et nyt navn. Det kan tage flere dage for [http://wiki.secondlife.com/wiki/Setting_your_display_name your name to update] i objekter, scripts, søgninger m.v. + </notification> + <notification name="SetDisplayNameBlocked"> + Beklager, du kan ikke ændre dit visningsnavn. Hvis du mener dette skyldes en fejl, kontakt venligst support. + </notification> + <notification name="SetDisplayNameFailedLength"> + Beklager, mavnet er for langt. Visningsnavne kan ikke indholde mere end [LENGTH] karakterer. + +Prøv venligst med et kortere navn. + </notification> + <notification name="SetDisplayNameFailedGeneric"> + Beklager, vi kunne ikke sætte dit visningsnavn. Prøv venligst igen senere. + </notification> + <notification name="SetDisplayNameMismatch"> + Visningsnavnene du angav matcher ikke. Prøv at taste ind igen. + </notification> + <notification name="AgentDisplayNameUpdateThresholdExceeded"> + Beklager, du er nødt til at vente længere, inden du kan ændre visningsnavn. + +Se mere under http://wiki.secondlife.com/wiki/Setting_your_display_name + +Prøv venligst igen senere. + </notification> + <notification name="AgentDisplayNameSetBlocked"> + Beklager, vi kunne ikke sætte dit valgte navn da det indholder et ikke tilladt ord. + + Prøv med et andet navn. + </notification> + <notification name="AgentDisplayNameSetInvalidUnicode"> + Visningsnavnet du prøver at angive indeholder ugyldige karakterer. + </notification> + <notification name="AgentDisplayNameSetOnlyPunctuation"> + Dit vinsningsnavn skal indeholde andre bogstaver end tegnsætningstegn. + </notification> + <notification name="DisplayNameUpdate"> + [OLD_NAME] ([SLID]) er nu kendt som [NEW_NAME]. + </notification> + <notification name="OfferTeleport"> + Tilbyd en teleport til din position med følgende besked? + <form name="form"> + <input name="message"> + Mød mig i [REGION] + </input> + <button name="OK" text="OK"/> + <button name="Cancel" text="Annullér"/> + </form> + </notification> + <notification name="OfferTeleportFromGod"> + Tilkald beboer til din lokation? + </notification> + <notification name="TeleportFromLandmark"> + Er du sikker pÃ¥ at du vil teleportere til <nolink>[LOCATION]</nolink>? + <usetemplate ignoretext="Bekræft at jeg vil teleportere til et landemærke" name="okcancelignore" notext="Cancel" yestext="Teleport"/> + </notification> + <notification name="TeleportToPick"> + Teleport til [PICK]? + <usetemplate ignoretext="Bekræft at jeg ønsker at teleportere til et sted i favoritter" name="okcancelignore" notext="Annullér" yestext="Teleport"/> + </notification> + <notification name="TeleportToClassified"> + Teleport til [CLASSIFIED]? + <usetemplate ignoretext="Bekræft at du ønsker at teleportere til lokation in annoncer" name="okcancelignore" notext="Annullér" yestext="Teleport"/> + </notification> + <notification name="TeleportToHistoryEntry"> + Teleport til [HISTORY_ENTRY]? + <usetemplate ignoretext="Bekræft at du ønsker at teleportere til en lokation i din historik" name="okcancelignore" notext="Annullér" yestext="Teleport"/> + </notification> + <notification label="Change Linden Estate" name="ChangeLindenEstate"> + Du er i færd med at ændre et Linden ejet estate (mainland, teeen grid, orientation etc.). + +Dette er EKSTREMT FARLIGT da det kan ændre beboernes oplevelse fundamentalt. PÃ¥ mainland vil dette betyde ændring af tusinder af regioner og fÃ¥ spaceserveren til at kløjs i det. + +Fortsæt? + </notification> + <notification name="RegionEntryAccessBlocked"> + Du har ikke adgang til denne region pÃ¥ grund af din valgte indholdsrating. Dette kan skyldes manglende validering af din alder. + +Undersøg venligst om du har installeret den nyeste [APP_NAME] klient, og gÃ¥ til 'Knowledge Base' for yderligere detaljer om adgang til omrÃ¥der med denne indholdsrating. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="RegionEntryAccessBlocked_KB"> + Du har ikke adgang til denne region pÃ¥ grund af din valgte indholdsrating. + +GÃ¥ til 'Knowledge Base' for mere information om indholdsratings. + <url name="url"> + https://support.secondlife.com/ics/support/default.asp?deptID=4417&task=knowledge&questionID=6010 + </url> + <usetemplate ignoretext="Ikke adgang til denne region pÃ¥ grund af begrænsninger i min indholdsrating" name="okcancelignore" notext="Luk" yestext="GÃ¥ til 'Knowledge Base'"/> + </notification> + <notification name="RegionEntryAccessBlocked_Notify"> + Du har ikke adgang til denne region pÃ¥ grund af din valgte indholdsrating. + </notification> + <notification name="RegionEntryAccessBlocked_Change"> + Du har ikke adgang til denne region pÃ¥ grund af din opsætning af indholdsrating. + +For at fÃ¥ adgang til den ønskede region skal du ændre din indholdsrating. Dette vil give dig ret til at søge og fÃ¥r tilgang til indhold af typen [REGIONMATURITY]. For at omgøre ændringer gÃ¥ til Mig > Indstillinger > Generelt. + <form name="form"> + <button name="OK" text="Ændre indstillinger"/> + <button name="Cancel" text="Luk"/> + <ignore name="ignore" text="Din valgte indholdsrating forhindrer dig i at kommer til en region"/> + </form> + </notification> + <notification name="PreferredMaturityChanged"> + Din indholdsrating er nu [RATING]. + </notification> + <notification name="LandClaimAccessBlocked"> + Du kan ikke kræve dette land pÃ¥ grund af din nuværende indholdsrating indstillinge . Dette kan skyldes manglende validering af din alder. + +Undersøg om du har den nyeste [APP_NAME] klient og gÃ¥ venligst til 'Knowledge Base' for yderligere detaljer om adgang til omrÃ¥der med denne indholdsrating. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="LandClaimAccessBlocked_KB"> + Du kan ikke kræve dette land pÃ¥ grund af din nuværende indholdsrating indstilling.. + +GÃ¥ venligst til 'Knowledge Base' for yderligere information om indholdsrating. + <url name="url"> + https://support.secondlife.com/ics/support/default.asp?deptID=4417&task=knowledge&questionID=6010 + </url> + <usetemplate ignoretext="Du kan ikke kræve dette land, pÃ¥ grund af begrænsninger i indholdsrating" name="okcancelignore" notext="Luk" yestext="GÃ¥ til 'Knowledge Base'"/> + </notification> + <notification name="LandClaimAccessBlocked_Notify"> + Du kan ikke kræve dette land pÃ¥ grund af din indholdsrating. + </notification> + <notification name="LandClaimAccessBlocked_Change"> + Du kan ikke kræve dette land, pÃ¥ grund af begrænsninger i din opsætning af indholdsrating. + +Du kan klikke pÃ¥ 'Ændre præference' for at ændre din indholdsrating nu og dermed opnÃ¥ adgang. Du vil sÃ¥ fÃ¥ mulighed for at søge og tilgÃ¥ [REGIONMATURITY] fra da af. Hvis du senere ønsker at ændre denne opsætning tilbage, gÃ¥ til Mig > Indstillinger > Generelt. + <usetemplate ignoretext="Din valgte indholdsrating forhindrer dig i at kræve land" name="okcancelignore" notext="Luk" yestext="Ændre præferencer"/> + </notification> + <notification name="LandBuyAccessBlocked"> + Du kan ikke købe dette land pÃ¥ grund af din nuværende indholdsrating indstillinge . Dette kan skyldes manglende validering af din alder. + +Undersøg om du har den nyeste [APP_NAME] klient og gÃ¥ venligst til 'Knowledge Base' for yderligere detaljer om adgang til omrÃ¥der med denne indholdsrating. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="LandBuyAccessBlocked_KB"> + Du kan ikke købe dette land pÃ¥ grund af din nuværende indholdsrating. + +GÃ¥ til 'Knowledge Base' for yderligere detaljer om indholdsrating. + <url name="url"> + https://support.secondlife.com/ics/support/default.asp?deptID=4417&task=knowledge&questionID=6010 + </url> + <usetemplate ignoretext="Du kan ikke købe dette land, pÃ¥ grund af begrænsninger i indholdsrating" name="okcancelignore" notext="Luk" yestext="GÃ¥ til 'Knowledge Base'"/> + </notification> + <notification name="LandBuyAccessBlocked_Notify"> + Du kan ikke købe dette land pÃ¥ grund af din nuværende indholdsrating indstilling. + </notification> + <notification name="LandBuyAccessBlocked_Change"> + Du kan ikke købe dette land, pÃ¥ grund af begrænsninger i din opsætning af indholdsrating. + +Du kan klikke pÃ¥ 'Ændre præference' for at ændre din indholdsrating nu og dermed opnÃ¥ adgang. Du vil sÃ¥ fÃ¥ mulighed for at søge og tilgÃ¥ [REGIONMATURITY] fra da af. Hvis du senere ønsker at ændre denne opsætning tilbage, gÃ¥ til Mig > Indstillinger > Generelt. + <usetemplate ignoretext="Din valgte rating forhindrer dig i at købe land" name="okcancelignore" notext="Luk" yestext="Ændre præferencer"/> + </notification> + <notification name="TooManyPrimsSelected"> + Der er valgt for mange prims. Vælg venligst [MAX_PRIM_COUNT] eller færre og prøv igen + </notification> + <notification name="UnableToLoadNotecardAsset"> + Kunne ikke hente notecard indhold. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="SetClassifiedMature"> + Indeholder denne annonce 'Mature' indhold? + <usetemplate canceltext="Annullér" name="yesnocancelbuttons" notext="Nej" yestext="Ja"/> + </notification> + <notification name="SetGroupMature"> + Indeholder denne gruppe 'Mature' indhold? + <usetemplate canceltext="Annullér" name="yesnocancelbuttons" notext="Nej" yestext="Ja"/> + </notification> + <notification label="Changed Region Maturity" name="RegionMaturityChange"> + Ratingen for denne region er ændret. +Det kan tage noget tid inden ændringen slÃ¥r igennem pÃ¥ kortet. + +For at fÃ¥ adgang til voksen regioner, skal beboere være alders-checket, enten via aldersverifikation eller betalingsverifikation. + </notification> + <notification label="Voice Version Mismatch" name="VoiceVersionMismatch"> + Denne version af [APP_NAME] er ikke kompatibel med stemme chat funktionen i denne region. For at kunne fÃ¥ stemme chat til at fungere skal du opdatere [APP_NAME]. + </notification> + <notification name="MoveInventoryFromObject"> + <usetemplate ignoretext="Advar mig før jeg flytter 'ikke-kopiérbare' genstande fra et objekt" name="okcancelignore" notext="Cancel" yestext="OK"/> + </notification> + <notification name="MoveInventoryFromScriptedObject"> + <usetemplate ignoretext="Advar mig før jeg flytter 'ikke-kopiérbare' genstande, hvor det kan medføre at ødelægge et scriptet objekt" name="okcancelignore" notext="Cancel" yestext="OK"/> + </notification> + <notification name="ClickActionNotPayable"> + Advarsel: 'Betal objekt' klik-aktionen er blevet aktiveret, men det vil kun virke, hvis et script med et 'money()' event er tilføjet. + <form name="form"> + <ignore name="ignore" text="I set the action 'Pay object' when building an object without a money() script"/> + </form> + </notification> + <notification name="WebLaunchAccountHistory"> + GÃ¥ til [http://secondlife.com/account/ Dashboard] for at se konto-historik? + <usetemplate ignoretext="Start min browser for at se min konto historik" name="okcancelignore" notext="Cancel" yestext="Go to page"/> + </notification> + <notification name="ConfirmQuit"> + Er du sikker pÃ¥ at du vil afslutte? + <usetemplate ignoretext="Bekræft før jeg afslutter" name="okcancelignore" notext="Afslut ikke" yestext="Quit"/> + </notification> + <notification name="DeleteItems"> + [QUESTION] + <usetemplate ignoretext="Bekræft før sletning af genstande" name="okcancelignore" notext="Annullér" yestext="OK"/> + </notification> + <notification name="HelpReportAbuseEmailLL"> + Benyt dette værktøj til at rapportere krænkninger af [http://secondlife.com/corporate/tos.php Terms of Service] og [http://secondlife.com/corporate/cs.php Community Standards]. + +Alle rapporter om krænkninger vil blive undersøgt og behandlet. + </notification> + <notification name="HelpReportAbuseContainsCopyright"> + Kære beboer, + +Det ser ud til at du indrapporterer krænkelse af ophavsret. Check venligst at du rapporterer korrekt: + +(1) Krænkelsesproces. Du mÃ¥ sende en rapport, hvis du mener at en beboer udnytter [SECOND_LIFE] rettighedssystemet, for eksempel via CopyBot eller lignende værktøjer, til at overtræde ophavsretten til objekter. + +(2) DCMA (â€Digital Millennium Copyright Actâ€) eller fjernelsesproces. For at kræve at indhold fjernes fra [SECOND_LIFE], SKAL du sende en gyldig besked om overtrædelse som beskrevet i [http://secondlife.com/corporate/dmca.php DMCA Policy]. + +Hvis du stadig ønsker at fortsætte med rapportering om overtrædelse, luk venligst dette vindue og afslut afsendelse af rapporten. Du skal muligvis vælge en specifik kategori 'CopyBot or Permissions Exploit'. + +Mange tak + +Linden Lab + </notification> + <notification label="Replace Existing Attachment" name="ReplaceAttachment"> + <form name="form"> + <ignore name="ignore" text="Erstat et eksisterende vedhæng med den valgte genstand"/> + </form> + </notification> + <notification label="Busy Mode Warning" name="BusyModePay"> + <form name="form"> + <ignore name="ignore" text="Jeg er ved at betale en person eller et objekt mens jeg er 'optaget'"/> + </form> + </notification> + <notification name="ConfirmDeleteProtectedCategory"> + Mappen '[FOLDERNAME]' er en system mappe. At slette denne mappe kan medføre ustabilitet. Er du sikker pÃ¥ at du vil slette den? + <usetemplate ignoretext="Bekræft, inden en system mappe slettes" name="okcancelignore" notext="Annullér" yestext="OK"/> + </notification> + <notification name="ConfirmEmptyTrash"> + Er du sikker pÃ¥ at du ønsker at tømme papirkurven? + <usetemplate ignoretext="Bekræft før papirkurv i beholdning tømmes" name="okcancelignore" notext="Cancel" yestext="OK"/> + </notification> + <notification name="ConfirmClearBrowserCache"> + Er du sikker pÃ¥ at du ønsker at slette din historik om besøg, web og søgninger? + <usetemplate name="okcancelbuttons" notext="Cancel" yestext="OK"/> + </notification> + <notification name="ConfirmClearCookies"> + Er du sikker pÃ¥ du vil slette alle cookies? + </notification> + <notification name="ConfirmEmptyLostAndFound"> + Er du sikker pÃ¥ at du vil slette indholdet i din 'Fundne genstande'? + <usetemplate ignoretext="Bekræft før sletning af 'Fundne genstande' mappe i beholdning" name="okcancelignore" notext="No" yestext="Yes"/> + </notification> + <notification name="CopySLURL"> + Følgende SLurl er blevet kopieret til din udklipsholder: + [SLURL] + +Henvis til dette fra en hjemmeside for at give andre nem adgang til denne lokation, eller prøv det selv ved at indsætte det i adresselinien i en web-browser. + <form name="form"> + <ignore name="ignore" text="SLurl er kopieret til min udklipsholder"/> + </form> + </notification> + <notification name="NewSkyPreset"> + <form name="form"> + <input name="message"> + Ny forudindstilling + </input> + <button name="OK" text="OK"/> + <button name="Cancel" text="Annullér"/> + </form> + </notification> + <notification name="NewWaterPreset"> + <form name="form"> + <input name="message"> + Ny forudindstilling + </input> + <button name="OK" text="OK"/> + <button name="Cancel" text="Annullér"/> + </form> + </notification> + <notification name="ChatterBoxSessionStartError"> + Ikke i stand til at start chat med [RECIPIENT]. +[REASON] + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="Cannot_Purchase_an_Attachment"> + Du kan ikke købe en genstand mens den er vedhæftet. + </notification> + <notification name="AutoWearNewClothing"> + Vil du automatisk tage det tøj pÃ¥ du er ved at lave? + <usetemplate ignoretext="Tag det tøj pÃ¥ jeg laver, mens jeg ændrer udseende" name="okcancelignore" notext="No" yestext="Yes"/> + </notification> + <notification name="NotAgeVerified"> + Du skal være alders-checket for at besøge dette omrÃ¥de. Ønsker du at gÃ¥ til [SECOND_LIFE] hjemmesiden og bekræfte din alder? + +[_URL] + <usetemplate ignoretext="Jeg har ikke bekræftet min alder" name="okcancelignore" notext="No" yestext="Yes"/> + </notification> + <notification name="Cannot enter parcel: no payment info on file"> + Du skal være betalende medlem for at besøge dette omrÃ¥de. Ønsker du at gÃ¥ til [SECOND_LIFE] hjemmesiden for at blive dette? + +[_URL] + <usetemplate ignoretext="Du mangler at være betalende medlem" name="okcancelignore" notext="No" yestext="Yes"/> + </notification> + <notification name="SystemMessageTip"> + [MESSAGE] + </notification> + <notification name="IMSystemMessageTip"> + [MESSAGE] + </notification> + <notification name="Cancelled"> + Annulléret + </notification> + <notification name="CancelledSit"> + Annulléret sid + </notification> + <notification name="CancelledAttach"> + Annulléreret vedhæft + </notification> + <notification name="ReplacedMissingWearable"> + Erstattet manglende tøj/kropsdele med standard. + </notification> + <notification name="FriendOnline"> + [NAME] er logget pÃ¥ + </notification> + <notification name="FriendOffline"> + [NAME] er logget af + </notification> + <notification name="AddSelfFriend"> + Selvom du nok er meget sød, kan du ikke tilføje dig selv som ven. + </notification> + <notification name="UploadingAuctionSnapshot"> + Uploader billeder fra verdenen og www... +(Tager omkring 5 minutter.) + </notification> + <notification name="UploadPayment"> + Du betalte L$[AMOUNT] for at uploade. + </notification> + <notification name="UploadWebSnapshotDone"> + Billeder fra www er uploadet. + </notification> + <notification name="UploadSnapshotDone"> + Billeder fra verdenen er uploadet + </notification> + <notification name="TerrainDownloaded"> + Terrain.raw downloadet + </notification> + <notification name="GestureMissing"> + Bevægelsen [NAME] mangler i databasen. + </notification> + <notification name="UnableToLoadGesture"> + Kunne ikke indlæse læse bevægelse [NAME]. + </notification> + <notification name="LandmarkMissing"> + Landmærke mangler i databasen. + </notification> + <notification name="UnableToLoadLandmark"> + Ikke muligt at indlæse landmærke. Prøv venligst igen. + </notification> + <notification name="CapsKeyOn"> + Din Caps Lock er aktiveret. +Det kan pÃ¥virke din indtastning af password. + </notification> + <notification name="NotecardMissing"> + Note mangler i databasen. + </notification> + <notification name="NotecardNoPermissions"> + Du har ikke rettigheder til at se denne note. + </notification> + <notification name="RezItemNoPermissions"> + Utilstrækkelige tilladelser til at danne genstanden. + </notification> + <notification name="UnableToLoadNotecard"> + Ikke muligt at indlæse note. +Prøv venligst igen. + </notification> + <notification name="ScriptMissing"> + Script mangler i databasen. + </notification> + <notification name="ScriptNoPermissions"> + Utilstrækkelige tilladelser til at se script. + </notification> + <notification name="UnableToLoadScript"> + Ikke muligt at indlæse script. Prøv venligst igen. + </notification> + <notification name="IncompleteInventory"> + Det komplette indhold, du tilbyder, er ikke endnu tilgængelig lokalt. Prøv venligst at tilbyde tingene igen om lidt. + </notification> + <notification name="CannotModifyProtectedCategories"> + Du kan ikke ændre beskyttede kategorier. + </notification> + <notification name="CannotRemoveProtectedCategories"> + Du kan ikke fjerne beskyttede kategorier. + </notification> + <notification name="UnableToBuyWhileDownloading"> + Ikke muligt at købe, imens genstandens data hentes. +Prøv venligst igen. + </notification> + <notification name="UnableToLinkWhileDownloading"> + Ikke muligt at lænke imens genstandens data hentes. +Prøv venligst igen. + </notification> + <notification name="CannotBuyObjectsFromDifferentOwners"> + Du kan kun købe objekter fra én ejer ad gangen. +Vælg venligst et enkelt objekt. + </notification> + <notification name="ObjectNotForSale"> + Dette objekt er ikke til salg. + </notification> + <notification name="EnteringGodMode"> + Starter gud-tilstand, niveau [LEVEL] + </notification> + <notification name="LeavingGodMode"> + Stopper gud-tilstand, niveau [LEVEL] + </notification> + <notification name="CopyFailed"> + Du har ikke rettigheder til at kopiere dette. + </notification> + <notification name="InventoryAccepted"> + [NAME] modtog dit tilbud til hans/hendes beholdning. + </notification> + <notification name="InventoryDeclined"> + [NAME] afviste det du tilbød fra din beholdning. + </notification> + <notification name="ObjectMessage"> + [NAME]: [MESSAGE] + </notification> + <notification name="CallingCardAccepted"> + Dit visitkort blev accepteret. + </notification> + <notification name="CallingCardDeclined"> + Dit visitkort blev afvist. + </notification> + <notification name="TeleportToLandmark"> + Du kan teleportere til lokationer som '[NAME]' ved at Ã¥bne Steder panelet til højre pÃ¥ skærmen, og her vælge landemærker fanen. +Klik pÃ¥ et landemærke og vælg den, derefter +Click on any landmark to select it, then click 'Teleport' at the bottom of the panel. +(You can also double-click on the landmark, or right-click it and choose 'Teleport'.) + </notification> + <notification name="TeleportToPerson"> + Du kan kontakte beboere som '[NAME]' ved at Ã¥bne Personer panelet til højre pÃ¥ skærmen. +Vælg beboeren fra listen og klik sÃ¥ 'IM' i bundet af panelet. +(Du kan ogsÃ¥ dobbelt-klikke pÃ¥ navnet i listen, eller højre-klikke og vælge 'IM'). + </notification> + <notification name="CantSelectLandFromMultipleRegions"> + Kan ikke vælge land pÃ¥ tværs af grænser. +Prøv at vælge mindre stykker land. + </notification> + <notification name="SearchWordBanned"> + Visse ord er fjernet fra din søge-sætning pÃ¥ grund af at disse strider mod de generelle 'Community Standards'. + </notification> + <notification name="NoContentToSearch"> + Vælg venligst mindst en indholdstype for at søge (PG, Mature, or Adult). + </notification> + <notification name="SystemMessage"> + [MESSAGE] + </notification> + <notification name="PaymentReceived"> + [MESSAGE] + </notification> + <notification name="PaymentSent"> + [MESSAGE] + </notification> + <notification name="EventNotification"> + Besked om begivenhed: + +[NAME] +[DATE] + <form name="form"> + <button name="Details" text="Detaljer"/> + <button name="Cancel" text="Annullér"/> + </form> + </notification> + <notification name="TransferObjectsHighlighted"> + Alle genstande pÃ¥ denne grund, som vil blive overført til køberen af denne grund, er nu oplyst. + +* Træer og græs, der vil blive overført, er ikke fremhævet. + <form name="form"> + <button name="Done" text="Færdig"/> + </form> + </notification> + <notification name="DeactivatedGesturesTrigger"> + Deaktiverede bevægelser med samme udløser: [NAMES] + </notification> + <notification name="NoQuickTime"> + Det ser ikke ud til at Apples QuickTime software er installeret pÃ¥ dit system. +Hvis du ønsker at se streaming media pÃ¥ parceller der understøtter dette skal du besøge siden [http://www.apple.com/quicktime QuickTime site] og installere QuickTime Player. + </notification> + <notification name="NoPlugin"> + Ingen Media Plugin blev fundet til at hÃ¥ndtere mime af typen "[MIME_TYPE]". Media af denne type vil ikke være tilgængelig. + </notification> + <notification name="MediaPluginFailed"> + Følgende Media Plugin has fejlede: + [PLUGIN] + +Prøv venligst at geninstallere plugin eller kontakt leverandøren hvis problemerne bliver ved. + <form name="form"> + <ignore name="ignore" text="En Media Plugin kunne ikke afvikles"/> + </form> + </notification> + <notification name="OwnedObjectsReturned"> + De genstande du ejer pÃ¥ det valgte stykke land er blevet returneret til din beholdning. + </notification> + <notification name="OtherObjectsReturned"> + Objekterne pÃ¥ den valgte parcel, ejet af [NAME], er blevet returneret til vedkommendes beholdning. + </notification> + <notification name="OtherObjectsReturned2"> + Objekterne i den valgte parcel, ejet af beboeren '[NAME]', er blevet returneret til deres ejer. + </notification> + <notification name="GroupObjectsReturned"> + Genstandene pÃ¥ det valgte stykke land, delt med gruppen [GROUPNAME], er blevet returneret til deres ejeres beholdninger. +Genstande, som er dedikerede og som kan overføres, er blevet returneret til deres forrige ejere. +Genstande, der ikke kan overføres og som er dedikeret til gruppen, er blevet slettet. + </notification> + <notification name="UnOwnedObjectsReturned"> + Genstandene pÃ¥ det valgte stykke land, der IKKE er ejet af dig, er blevet returneret til deres ejere. + </notification> + <notification name="ServerObjectMessage"> + Besked fra [NAME]: +<nolink>[MSG]</nolink> + </notification> + <notification name="NotSafe"> + Dette land er Ã¥bnet for 'skade'. +Du kan blive skadet her. Hvis du dør, vil du blive teleporteret til din hjemme lokation. + </notification> + <notification name="NoFly"> + Dette sted har ikke aktiveret ret til flyvning. +Du kan ikke flyve her. + </notification> + <notification name="PushRestricted"> + Dette sted tillader ikke skubning. Du kan ikke skubbe andre, med mindre du ejer dette land. + </notification> + <notification name="NoVoice"> + Dette sted har ikke aktiveret stemme-chat. Du vil ikke kunne høre nogen tale. + </notification> + <notification name="NoBuild"> + Dette sted har ikke aktiveret bygge-ret. Du kan ikke bygge eller 'rezze' objekter her. + </notification> + <notification name="ScriptsStopped"> + En administrator har midlertidig stoppet scripts i denne region. + </notification> + <notification name="ScriptsNotRunning"> + Denne region kører ikke nogen scripts. + </notification> + <notification name="NoOutsideScripts"> + Dette sted tillader ikke udefra kommende scripts. + +Ingen scripts vil virke her, udover de som tilhører ejeren af landet. + </notification> + <notification name="ClaimPublicLand"> + Du kan kun kræve land i den region du befinder dig i. + </notification> + <notification name="RegionTPAccessBlocked"> + Du har ikke adgang til denne region pÃ¥ grund af din valgte indholdsrating. Dette kan skyldes manglende validering af din alder eller at du ikke benytter den nyeste [APP_NAME] klient. + +GÃ¥ venligst til 'Knowledge Base' for yderligere detaljer om adgang til omrÃ¥der med denne indholdsrating. + </notification> + <notification name="URBannedFromRegion"> + Du er blokeret i denne region. + </notification> + <notification name="NoTeenGridAccess"> + Du kan ikke tilslutte dig denne 'Teen' region. + </notification> + <notification name="ImproperPaymentStatus"> + Du har ikke de rette betalingsoplysninger til at komme ind i denne region. + </notification> + <notification name="MustGetAgeParcel"> + Du skal være aldersgodkendt for at komme ind pÃ¥ denne parcel. + </notification> + <notification name="NoDestRegion"> + Destinations region ikke fundet. + </notification> + <notification name="NotAllowedInDest"> + Du har ikke adgang til denne destination. + </notification> + <notification name="RegionParcelBan"> + Kan ikke skifte til ny region via en blokeret parcel. Prøv en anden vej ind. + </notification> + <notification name="TelehubRedirect"> + Du er blevet omdirigeret til en telehub. + </notification> + <notification name="CouldntTPCloser"> + Kunne ikke teleportere nærmere til destination. + </notification> + <notification name="TPCancelled"> + Teleport afbrudt. + </notification> + <notification name="FullRegionTryAgain"> + Den region du prøver at komme ind i er fuld for øjeblikket. +Prøv igen om lidt. + </notification> + <notification name="GeneralFailure"> + Generel fejl. + </notification> + <notification name="RoutedWrongRegion"> + Du blev sendt til en forkert region. Prøv igen. + </notification> + <notification name="NoValidAgentID"> + Ikke en gyldig agent ID. + </notification> + <notification name="NoValidSession"> + Ikke noget gyldig sessions-ID + </notification> + <notification name="NoValidCircuit"> + Ingen gyldig kode for kredsløb. + </notification> + <notification name="NoValidTimestamp"> + Ikke et gyldigt klokkeslæt. + </notification> + <notification name="NoPendingConnection"> + Kunne ikke skabe fast forbindelse. + </notification> + <notification name="InternalUsherError"> + Der opstod en intern fejl ved teleportering til din teleport destination.. Der kan være generelle problemer med [SECOND_LIFE] lige nu. + </notification> + <notification name="NoGoodTPDestination"> + Kunne ikke finde et egnet teleport sted i denne region. + </notification> + <notification name="InternalErrorRegionResolver"> + Der opstod en intern fejl ved beregning af globale koordinater for din teleport forespørgsel. Der kan være generelle problemer med [SECOND_LIFE] lige nu. + </notification> + <notification name="NoValidLanding"> + Kunne ikke finde et gyldigt landingspunkt. + </notification> + <notification name="NoValidParcel"> + No valid parcel could be found. + </notification> + <notification name="ObjectGiveItem"> + Et objekt ved navn <nolink>[OBJECTFROMNAME]</nolink> ejet af [NAME_SLURL] tilbyder dig [ITEM_SLURL]. For at bruge denne genstand skal du skifte til avanceret tilstand, hvor du kan finde genstanden i din beholdning. Ønsker du at logge ud for at skifte tilstand? Valg af tilstand findes pÃ¥ login skærmbilledet. + <form name="form"> + <button name="Keep" text="Behold genstand"/> + <button name="Discard" text="Afvis genstand"/> + <button name="Mute" text="Blokér objekt"/> + </form> + </notification> + <notification name="UserGiveItem"> + [NAME_SLURL] tilbyder dig [ITEM_SLURL]. For at bruge denne genstand skal du skifte til avanceret tilstand, hvor du kan finde genstanden i din beholdning. Ønsker du at logge ud for at skifte tilstand? Valg af tilstand findes pÃ¥ login skærmbilledet. + <form name="form"> + <button name="Show" text="Behold genstand"/> + <button name="Discard" text="Afvis genstand"/> + <button name="Mute" text="Blokér bruger"/> + </form> + </notification> + <notification name="GodMessage"> + [NAME] + +[MESSAGE] + </notification> + <notification name="JoinGroup"> + [MESSAGE] + <form name="form"> + <button name="Join" text="Indmeld"/> + <button name="Decline" text="Afvis"/> + <button name="Info" text="Information"/> + </form> + </notification> + <notification name="TeleportOffered"> + [NAME_SLURL] har tilbudt en teleport til deres lokation: + +[MESSAGE] - [MATURITY_STR] <icon>[MATURITY_ICON]</icon> + <form name="form"> + <button name="Teleport" text="Teleportér"/> + <button name="Cancel" text="Annullér"/> + </form> + </notification> + <notification name="TeleportOfferSent"> + Tilbud om teleport sendt til [TO_NAME] + </notification> + <notification name="GotoURL"> + [MESSAGE] +[URL] + <form name="form"> + <button name="Later" text="Senere"/> + <button name="GoNow..." text="GÃ¥ nu..."/> + </form> + </notification> + <notification name="OfferFriendship"> + [NAME_SLURL] tilbyder venskab. + +[MESSAGE] + +(Som udgangspunkt vil I være i stand til at se hinandens online status.) + <form name="form"> + <button name="Accept" text="Acceptér"/> + <button name="Decline" text="Afvis"/> + </form> + </notification> + <notification name="FriendshipOffered"> + Du har tilbudt venskab til [TO_NAME] + </notification> + <notification name="OfferFriendshipNoMessage"> + [NAME_SLURL] tilbyder venskab. + +(Som udgangspunkt, vil du være i stand til at se den andens online status) + </notification> + <notification name="FriendshipAccepted"> + [NAME] accepterede dit tilbud om venskab. + </notification> + <notification name="FriendshipDeclined"> + [NAME] afviste dit tilbud om venskab. + </notification> + <notification name="FriendshipAcceptedByMe"> + Tilbud om venskab accepteret. + </notification> + <notification name="FriendshipDeclinedByMe"> + Tilbud om venskab afvist. + </notification> + <notification name="OfferCallingCard"> + [NAME] tilbyder sit visitkort. +Dette vil tilføje et bogmærke i din beholdning, sÃ¥ du hurtigt kan sende en personlig besked til denne beboer. + <form name="form"> + <button name="Accept" text="Acceptér"/> + <button name="Decline" text="Afvis"/> + </form> + </notification> + <notification name="RegionRestartMinutes"> + Denne region vil genstarte om [MINUTES] minutter. +Hvis du ikke forlader regionen, vil du blive logget af. + </notification> + <notification name="RegionRestartSeconds"> + Denne region genstartes om [SECONDS] sekunder. +Hvis du ikke forlader regionen, vil du blive logget af. + </notification> + <notification name="LoadWebPage"> + Indlæas websiden [URL]? + +[MESSAGE] + +Fra objekt: <nolink>[OBJECTNAME]</nolink>, ejer: [NAME]? + <form name="form"> + <button name="Gotopage" text="GÃ¥ til side"/> + <button name="Cancel" text="Afbryd"/> + </form> + </notification> + <notification name="FailedToFindWearableUnnamed"> + Det lykkedes ikke at finde [TYPE] i databasen. + </notification> + <notification name="FailedToFindWearable"> + Det lykkedes ikke at finde [TYPE] med navnet [DESC] i databasen. + </notification> + <notification name="InvalidWearable"> + Den genstand du prøver at tage pÃ¥ benytter en funktion din klient ikke kan forstÃ¥. Upgradér venligst din version af [APP_NAME] for at kunne tage denne genstand pÃ¥. + </notification> + <notification name="ScriptQuestion"> + '<nolink>[OBJECTNAME]</nolink>', et objekt ved ejet af '[NAME]', ønsker at: + +[QUESTIONS] +Er dette OK? + <form name="form"> + <button name="Yes" text="Ja"/> + <button name="No" text="Nej"/> + <button name="Mute" text="Blokér"/> + </form> + </notification> + <notification name="ScriptQuestionCaution"> + Et objeckt med navn '<nolink>[OBJECTNAME]</nolink>', ejet af '[NAME]' ønsker at: + +[QUESTIONS] +Hvis du ikke stoler pÃ¥ dette objekt og dets skaber, bør du afvise dette ønske. + +Opfyld dette ønske? + <form name="form"> + <button name="Grant" text="Imødekom"/> + <button name="Deny" text="Afvis"/> + <button name="Details" text="Detaljer..."/> + </form> + </notification> + <notification name="ScriptDialog"> + [NAME]'s '<nolink>[TITLE]</nolink>' +[MESSAGE] + <form name="form"> + <button name="Ignore" text="Ignorér"/> + </form> + </notification> + <notification name="ScriptDialogGroup"> + [GROUPNAME]'s '<nolink>[TITLE]</nolink>' +[MESSAGE] + <form name="form"> + <button name="Ignore" text="Ignorér"/> + </form> + </notification> + <notification name="BuyLindenDollarSuccess"> + Tak for din betaling! + +Din L$ balance vil blive opdateret nÃ¥r transaktionen er gennemført. Ved transaktionen tager mere end 20 min., vil den blive annulleret. I sÃ¥ fald vil beløbet blive krediteret din US$ balance. + +Status for din betaling kan ses i din 'Transaction History' side pÃ¥ din [http://secondlife.com/account/ Dashboard] + </notification> + <notification name="FirstOverrideKeys"> + Dine bevælgelsestaster bliver nu hÃ¥ndteret af et objekt. +Brug piletasterne eller AWSD for at se, hvad de gør. +Nogle genstande (som skydevÃ¥ben) kræver at du gÃ¥r ind i musevisning for at bruge dem. +Tryk pÃ¥ 'M' for at gÃ¥re det. + </notification> + <notification name="FirstSandbox"> + Dette er et sandkasse omrÃ¥de. Her kan beboere lære ast bygge. + +De ting du bygger vil blive slettet senere, sÃ¥ glem ikke at højre-klikke og vælge "Tag" for at tage en kopi af din kreation til din beholdning. + </notification> + <notification name="MaxListSelectMessage"> + Du mÃ¥ kun vælge op til [MAX_SELECT] genstande pÃ¥ denne liste. + </notification> + <notification name="VoiceInviteP2P"> + [NAME] inviterer dig til en stemme-chat samtale. +Klik pÃ¥ Acceptér for at deltage eller Afvis for at afvise invitationen. Klik pÃ¥ Blokér for at blokere personen. + <form name="form"> + <button name="Accept" text="Acceptér"/> + <button name="Decline" text="Afvis"/> + <button name="Mute" text="Blokér"/> + </form> + </notification> + <notification name="AutoUnmuteByIM"> + [NAME] har fÃ¥et sendt en besked og blokering er derfor automatisk blevet fjernet. + </notification> + <notification name="AutoUnmuteByMoney"> + [NAME] har fÃ¥et givet penge og blokering er derfor automatisk blevet fjernet. + </notification> + <notification name="AutoUnmuteByInventory"> + [NAME] er blevet tilbud noget fra beholdning og blokering er derfor automatisk blevet fjernet. + </notification> + <notification name="VoiceInviteGroup"> + [NAME] har has sluttet sig til stemme-chaten i gruppen [GROUP]. +Klik pÃ¥ Acceptér for at deltage eller Afvis for at afvise invitationen. Klik pÃ¥ Blokér for at blokere personen. + <form name="form"> + <button name="Accept" text="Acceptér"/> + <button name="Decline" text="Afvis"/> + <button name="Mute" text="Blokér"/> + </form> + </notification> + <notification name="VoiceInviteAdHoc"> + [NAME] har sluttet sig til en stemme-chat med en konference chat. +Klik pÃ¥ Acceptér for at deltage eller Afvis for at afvise invitationen. Klik pÃ¥ Blokér for at blokere personen. + <form name="form"> + <button name="Accept" text="Acceptér"/> + <button name="Decline" text="Afvis"/> + <button name="Mute" text="Blokér"/> + </form> + </notification> + <notification name="InviteAdHoc"> + [NAME] inviterer dig til en konference chat. +Klik pÃ¥ Acceptér for at deltage eller Afvis for at afvise invitationen. Klik pÃ¥ Blokér for at blokere personen. + <form name="form"> + <button name="Accept" text="Acceptér"/> + <button name="Decline" text="Afvis"/> + <button name="Mute" text="Blokér"/> + </form> + </notification> + <notification name="VoiceChannelFull"> + Den stemme-chat, du prøver at tilslutte dig, [VOICE_CHANNEL_NAME], har nÃ¥et maksiumum kapacitet. Prøv venligst igen senere. + </notification> + <notification name="ProximalVoiceChannelFull"> + Vi beklager. Dette omrÃ¥de har nÃ¥et sin maksimale kapacitet for stemme-chat. Prøv venligst at benytte stemme i et andet omrÃ¥de. + </notification> + <notification name="VoiceChannelDisconnected"> + Du er blevet koblet fra [VOICE_CHANNEL_NAME]. Du vil nu blive koblet til almindelig voice-chat. + </notification> + <notification name="VoiceChannelDisconnectedP2P"> + [VOICE_CHANNEL_NAME] har afsluttet samtalen. Du vil nu blive koblet til almindelig voice-chat. + </notification> + <notification name="P2PCallDeclined"> + [VOICE_CHANNEL_NAME] har avist dit opkald. Du vil nu blive koblet til almindelig voice-chat. + </notification> + <notification name="P2PCallNoAnswer"> + [VOICE_CHANNEL_NAME] er ikke tilgængelig til at modtage dit opkald. Du vil nu blive koblet til almindelig voice-chat. + </notification> + <notification name="VoiceChannelJoinFailed"> + Det lykkedes ikke at forbinde til [VOICE_CHANNEL_NAME], prøv venligst igen senere. Du vil nu blive koblet til almindelig voice-chat. + </notification> + <notification name="VoiceLoginRetry"> + Vi laver en stemmekanal til dig. Det kan tage op til et minut. + </notification> + <notification name="VoiceEffectsExpired"> + En eller flere af dine stemme "morphs" er udløbet. +[[URL] Click here] for at forny dit abbonnement. + </notification> + <notification name="VoiceEffectsExpiredInUse"> + Den aktive stemme "morph" er udløbet og din normale stemme opsætning er genaktiveret. +[[URL] Click here] for at forny dit abbonnement. + </notification> + <notification name="VoiceEffectsWillExpire"> + En eller flere af dine stemme "morphs" vil udløbe om mindre end [INTERVAL] dage. +[[URL] Click here] for at forny dit abbonnement. + </notification> + <notification name="VoiceEffectsNew"> + Nye stemme "morphs" er tilgængelige! + </notification> + <notification name="Cannot enter parcel: not a group member"> + Kun medlemmer af en bestemt gruppe kan besøge dette omrÃ¥de. + </notification> + <notification name="Cannot enter parcel: banned"> + Du kan ikke komme ind pÃ¥ omrÃ¥det. Du er blevet udelukket. + </notification> + <notification name="Cannot enter parcel: not on access list"> + Du kan ikke komme ind pÃ¥ omrÃ¥det. Du er ikke pÃ¥ adgangslisten. + </notification> + <notification name="VoiceNotAllowed"> + Du har ikke tilladelse til at tilslutte dig stemme-chat pÃ¥ [VOICE_CHANNEL_NAME]. + </notification> + <notification name="VoiceCallGenericError"> + En fejl er opstÃ¥et under forsøget pÃ¥ at koble sig pÃ¥ stemme chatten [VOICE_CHANNEL_NAME]. PrÃ¥v venligst senere. + </notification> + <notification name="UnsupportedCommandSLURL"> + Den SLurl du klikkede pÃ¥ understøttes ikke. + </notification> + <notification name="BlockedSLURL"> + En SLurl blev modtaget en ikke sikret browser og den er blevet blokeret af sikkerhedsmæssige Ã¥rsager. + </notification> + <notification name="ThrottledSLURL"> + Flere SLurls blev modtaget fra en browser i et kort tidsrum. +De vil blive blokeret nogle fÃ¥ sekunder af sikkerhedsmæssige Ã¥rsager. + </notification> + <notification name="IMToast"> + [MESSAGE] + <form name="form"> + <button name="respondbutton" text="Svar"/> + </form> + </notification> + <notification name="ConfirmCloseAll"> + Er du sikker pÃ¥ at du vil lukke alle personlige samtaler (IM)? + <usetemplate ignoretext="Bekræft før du lukker alle IMer" name="okcancelignore" notext="Annullér" yestext="OK"/> + </notification> + <notification name="AttachmentSaved"> + Vedhæng er blevet gemt. + </notification> + <notification name="UnableToFindHelpTopic"> + Ikke muligt at finde hjælp om dette element. + </notification> + <notification name="ObjectMediaFailure"> + Server fejl: Media opdatering eller "get" fejlede. +'[ERROR]' + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="TextChatIsMutedByModerator"> + Din tekst chat er blevet slukket af moderator. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="VoiceIsMutedByModerator"> + Din stemme er blevet slukket af moderatoren. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="ConfirmClearTeleportHistory"> + Er du sikker pÃ¥ at du vil slette teleport historikken? + <usetemplate name="okcancelbuttons" notext="Annullér" yestext="OK"/> + </notification> + <notification name="BottomTrayButtonCanNotBeShown"> + Den valgte knap kan ikke vises lige nu. +Knappen vil blive vist nÃ¥r der er nok plads til den. + </notification> + <notification name="ShareNotification"> + Vælg beboere at dele med. + </notification> + <notification name="ShareItemsConfirmation"> + Er du sikker pÃ¥ at du vil dele følgende genstande: + +<nolink>[ITEMS]</nolink> + +Me følgende beboere: + +[RESIDENTS] + <usetemplate name="okcancelbuttons" notext="Annullér" yestext="Ok"/> + </notification> + <notification name="ItemsShared"> + Genstande er nu delt. + </notification> + <notification name="DeedToGroupFail"> + Dedikering til gruppe fejlede. + </notification> + <notification name="AvatarRezNotification"> + ( [EXISTENCE] sekunder i live ) +Avatar '[NAME]' var ikke sky mere, efter [TIME] sekunder. + </notification> + <notification name="AvatarRezSelfBakedDoneNotification"> + ( [EXISTENCE] seconds alive ) +Du blev færdig med at fremvise dit sæt efter [TIME] sekunder. + </notification> + <notification name="AvatarRezSelfBakedUpdateNotification"> + ( [EXISTENCE] seconds alive ) +Du sendte en opdatering af dit udseende efter [TIME] sekunder. +[STATUS] + </notification> + <notification name="AvatarRezCloudNotification"> + ( [EXISTENCE] sekunder i live ) +Avatar '[NAME]' blev til "sky". + </notification> + <notification name="AvatarRezArrivedNotification"> + ( [EXISTENCE] sekunder i live ) +Avatar '[NAME]' appeared. + </notification> + <notification name="AvatarRezLeftCloudNotification"> + ( [EXISTENCE] sekunder i live ) +Avatar '[NAME]' forsvandt efter [TIME] sekunder som "sky". + </notification> + <notification name="AvatarRezEnteredAppearanceNotification"> + ( [EXISTENCE] sekunder i live ) +Avatar '[NAME]' skiftede til udseende modus. + </notification> + <notification name="AvatarRezLeftAppearanceNotification"> + ( [EXISTENCE] sekunder i live ) +Avatar '[NAME]' har forladt udseende modus. + </notification> + <notification name="NoConnect"> + Vi har problemer med at oprette forbindelse via [PROTOCOL] [HOSTID]. +Check venligst din netværks- og firewallsetup. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="NoVoiceConnect"> + Vi har problemer med at oprette forbindelse til din stemme server: + +[HOSTID] + +Stemme kommunikation vil ikke være tilgængelig. +Check venligst din netværks- og firewall setup. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="AvatarRezLeftNotification"> + ( [EXISTENCE] sekunder i live ) +Avatar '[NAME]' forsvandt helt "uploaded". + </notification> + <notification name="AvatarRezSelfBakedTextureUploadNotification"> + ( [EXISTENCE] sekunder i live ) +Du uploadede en [RESOLUTION] "bagt" tekstur til '[BODYREGION]' efter [TIME] sekunder. + </notification> + <notification name="AvatarRezSelfBakedTextureUpdateNotification"> + ( [EXISTENCE] sekunder i live ) +Du opdaterede en [RESOLUTION] "bagt" tekstur for '[BODYREGION]' efter [TIME] sekunder. + </notification> + <notification name="ConfirmLeaveCall"> + Er du sikker pÃ¥ at du vil forlade dette opkald? + <usetemplate ignoretext="Bekræft før jeg forlader opkald" name="okcancelignore" notext="Nej" yestext="Ja"/> + </notification> + <notification name="ConfirmMuteAll"> + Du har valgt at slukke for lyden for alle deltagere i gruppeopkaldet. +Dette vil ogsÃ¥ betyde, at alle beboere der slutter sig til opkaldet +vil have lyden slukket - selv efter de har forladt kaldet. + + +Sluk for alles lyd? + <usetemplate ignoretext="Bekræft før jeg slukker for alle deltageres lyd i gruppe-kald" name="okcancelignore" notext="Annullér" yestext="Ok"/> + </notification> + <notification label="Chat" name="HintChat"> + For at deltage i samtalen tast tekst ind i chat feltet nedenfor. + </notification> + <notification label="StÃ¥ op" name="HintSit"> + For at rejse dig op og forlad siddeposition, tryk pÃ¥ "StÃ¥ op" knappen. + </notification> + <notification label="Undersøg verden" name="HintDestinationGuide"> + Destinationsguiden indeholder tusinder af nye steder der kan opleves. Vælg venligst et sted og vælg Teleport for at komme derhen. + </notification> + <notification label="Side panel" name="HintSidePanel"> + FÃ¥ hurtig tilgang til din beholdning, sæt, profiler og andet i dette side panel. + </notification> + <notification label="Flyt" name="HintMove"> + For at gÃ¥ eller løbe, Ã¥ben Flyt panelet for neden og brug pilene til at navigere. Du kan ogsÃ¥ bruge pile-tasterne pÃ¥ dit tastatur. + </notification> + <notification label="Visningsnavn" name="HintDisplayName"> + Angiv dit konfigurérbare visningsnavn her. Dette er i tillæg til dit unikke brugernavn, som ikke kan ændres. Du kan ændre hvordan du ser andre beboeres navne i dine indstillinger. + </notification> + <notification label="Flyt" name="HintMoveArrows"> + For at gÃ¥, brug piletasterne pÃ¥ tastaturet. Du kan løbe ved at trykke to gange pÃ¥ Pil-Op + </notification> + <notification label="Se" name="HintView"> + For at ændre dit kamera-view, benyt kredsløbs og panoreringskontrollerne. Nulstil view ved at trykke Esc eller ved at gÃ¥. + </notification> + <notification label="Beholdning" name="HintInventory"> + Undersøg din beholdning for at finde ting. Nyeste genstand findes lettes under fanen "Nye ting" + </notification> + <notification label="Der er kommet Linden Dollars" name="HintLindenDollar"> + Her er din nuværende balance af L$. Klik pÃ¥ Køb L$ for at købe flere Linden dollars. + </notification> + <notification name="PopupAttempt"> + En pop-up blev hindret i at blive vist. + <form name="form"> + <ignore name="ignore" text="Tillad alle pop-ups"/> + <button name="open" text="Ã…ben pop-up vindue"/> + </form> + </notification> + <notification name="AuthRequest"> + Hjemmesiden pÃ¥ '<nolink>[HOST_NAME]</nolink>' in realm '[REALM]' kræver et brugernavn og password. + <form name="form"> + <input name="username" text="Brugernavn"/> + <input name="password" text="Password"/> + <button name="ok" text="Send"/> + <button name="cancel" text="Annullér"/> + </form> + </notification> + <notification label="" name="ModeChange"> + For at skifte tilstand skal du genstarte programmet. + <usetemplate name="okcancelbuttons" notext="Afslut ikke" yestext="Afslut"/> + </notification> + <notification label="" name="NoClassifieds"> + Oprettelse og redigering af annoncer er kun muligt i avanceret tilstand. Ønsker du at logge ud for at skifte tilstand? Valg af tilstand findes pÃ¥ login skærmbilledet. + <usetemplate name="okcancelbuttons" notext="Afslut ikke" yestext="Afslut"/> + </notification> + <notification label="" name="NoGroupInfo"> + Oprettelse og redigering af grupper er kun muligt i avanceret tilstand. Ønsker du at logge ud for at skifte tilstand? Valg af tilstand findes pÃ¥ login skærmbilledet. + <usetemplate name="okcancelbuttons" notext="Afslut ikke" yestext="Afslut"/> + </notification> + <notification label="" name="NoPicks"> + Oprettelse og redigering af favoritter er kun mulig i avanceret tilstand. Ønsker du at logge ud for at skifte tilstand? Valg af tilstand findes pÃ¥ login skærmbilledet. + <usetemplate name="okcancelbuttons" notext="Afslut ikke" yestext="Afslut"/> + </notification> + <notification label="" name="NoWorldMap"> + Det er kun muligt at se verdenskortet i avanceret tilstand.Ønsker du at logge ud for at skifte tilstand? Valg af tilstand findes pÃ¥ login skærmbilledet. + <usetemplate name="okcancelbuttons" notext="Afslut ikke" yestext="Afslut"/> + </notification> + <notification label="" name="NoVoiceCall"> + Stemme kald kan kun benttes i avanceret tilstand. Ønsker du at logge ud for at skifte tilstand? + <usetemplate name="okcancelbuttons" notext="Afslut ikke" yestext="Afslut"/> + </notification> + <notification label="" name="NoAvatarShare"> + Det er kun mulig at dele i avanceret tilstand. Ønsker du at logge ud for at skifte tilstand? + <usetemplate name="okcancelbuttons" notext="Afslut ikke" yestext="Afslut"/> + </notification> + <notification label="" name="NoAvatarPay"> + Det er kun muligt at betale andre beboere i avanceret tilstand. Ønsker du at logge ud for at skifte tilstand? + <usetemplate name="okcancelbuttons" notext="Afslut ikke" yestext="Afslut"/> + </notification> + <global name="UnsupportedGLRequirements"> + Det ser ikke ud til at din hardware opfylder minimumskravene til [APP_NAME]. [APP_NAME] kræver et OpenGL grafikkort som understøter 'multitexture'. Check eventuelt om du har de nyeste drivere for grafikkortet, og de nyeste service-packs og patches til dit operativsystem. + +Hvis du bliver ved med at have problemer, besøg venligst [SUPPORT_SITE]. + </global> + <global name="You can only set your 'Home Location' on your land or at a mainland Infohub."> + Hvis du selv ejer land, kan du benytte det til hjemme lokation. +Ellers kan du se pÃ¥ verdenskortet og finde steder markeret med "Infohub". + </global> + <global name="You died and have been teleported to your home location"> + Du døde og er blevet teleporteret til din hjemmelokation. + </global> +</notifications> diff --git a/indra/newview/skins/minimal/xui/da/panel_adhoc_control_panel.xml b/indra/newview/skins/minimal/xui/da/panel_adhoc_control_panel.xml new file mode 100644 index 0000000000000000000000000000000000000000..14250453eb78dea2dccfc33e9216710fb4183e9c --- /dev/null +++ b/indra/newview/skins/minimal/xui/da/panel_adhoc_control_panel.xml @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="panel_im_control_panel"> + <layout_stack name="vertical_stack"> + <layout_panel name="call_btn_panel"> + <button label="Opkald" name="call_btn"/> + </layout_panel> + <layout_panel name="end_call_btn_panel"> + <button label="Forlad samtale" name="end_call_btn"/> + </layout_panel> + <layout_panel name="voice_ctrls_btn_panel"> + <button label="Stemmekontroller" name="voice_ctrls_btn"/> + </layout_panel> + </layout_stack> +</panel> diff --git a/indra/newview/skins/minimal/xui/da/panel_bottomtray.xml b/indra/newview/skins/minimal/xui/da/panel_bottomtray.xml new file mode 100644 index 0000000000000000000000000000000000000000..bd20ece7642cf39b54b15b96e4eda5d283b5cc24 --- /dev/null +++ b/indra/newview/skins/minimal/xui/da/panel_bottomtray.xml @@ -0,0 +1,45 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="bottom_tray"> + <string name="DragIndicationImageName" value="Accordion_ArrowOpened_Off"/> + <string name="SpeakBtnToolTip" value="SlÃ¥ mikrofon til/fra"/> + <string name="VoiceControlBtnToolTip" value="Vis/skjul stemme kontrolpanel"/> + <layout_stack name="toolbar_stack"> + <layout_panel name="speak_panel"> + <button label="Tal" name="speak_btn" tool_tip="Tænd og sluk for mikrofon"/> + </layout_panel> + <layout_panel name="speak_flyout_panel"> + <button label="" name="flyout_btn" tool_tip="Ændring af opsætning for lyd"/> + </layout_panel> + <layout_panel name="gesture_panel"> + <gesture_combo_list label="Bevægelse" name="Gesture" tool_tip="Lad din avatar gøre ting"/> + </layout_panel> + <layout_panel name="cam_panel"> + <bottomtray_button label="Vis" name="camera_btn" tool_tip="Kontrollér kameravinkel"/> + </layout_panel> + <layout_panel name="destinations_panel"> + <bottomtray_button label="Destinationer" name="destination_btn" tool_tip="Rejs i Second Life"/> + </layout_panel> + <layout_panel name="avatar_panel"> + <bottomtray_button label="Min avatar" name="avatar_btn" tool_tip="Ændre dit udseende"/> + </layout_panel> + <layout_panel name="people_panel"> + <bottomtray_button label="Personer" name="show_people_button" tool_tip="Find personer i Second Life"/> + </layout_panel> + <layout_panel name="profile_panel"> + <bottomtray_button label="Profil" name="show_profile_btn" tool_tip="Se og rediger din profil"/> + </layout_panel> + <layout_panel name="howto_panel"> + <bottomtray_button label="Hvordan" name="show_help_btn" tool_tip="Vis hjælpeinformation for Second Life"/> + </layout_panel> + <layout_panel name="im_well_panel"> + <chiclet_im_well name="im_well"> + <button name="Unread IM messages" tool_tip="Konversationer"/> + </chiclet_im_well> + </layout_panel> + <layout_panel name="notification_well_panel"> + <chiclet_notification name="notification_well"> + <button name="Unread" tool_tip="Notifikationer"/> + </chiclet_notification> + </layout_panel> + </layout_stack> +</panel> diff --git a/indra/newview/skins/minimal/xui/da/panel_group_control_panel.xml b/indra/newview/skins/minimal/xui/da/panel_group_control_panel.xml new file mode 100644 index 0000000000000000000000000000000000000000..23a5e79e228474fd3e28ff9c678df2cf9ec38f43 --- /dev/null +++ b/indra/newview/skins/minimal/xui/da/panel_group_control_panel.xml @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="panel_im_control_panel"> + <layout_stack name="vertical_stack"> + <layout_panel name="group_info_btn_panel"> + <button label="Gruppe profil" name="group_info_btn"/> + </layout_panel> + <layout_panel name="call_btn_panel"> + <button label="Opkald gruppe" name="call_btn"/> + </layout_panel> + <layout_panel name="end_call_btn_panel"> + <button label="Forlad samtale" name="end_call_btn"/> + </layout_panel> + <layout_panel name="voice_ctrls_btn_panel"> + <button label="Ã…ben stemme indstillinger" name="voice_ctrls_btn"/> + </layout_panel> + </layout_stack> +</panel> diff --git a/indra/newview/skins/minimal/xui/da/panel_im_control_panel.xml b/indra/newview/skins/minimal/xui/da/panel_im_control_panel.xml new file mode 100644 index 0000000000000000000000000000000000000000..b8a7ec0b34a07fe3add48a0b330cc44167c9c248 --- /dev/null +++ b/indra/newview/skins/minimal/xui/da/panel_im_control_panel.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="panel_im_control_panel"> + <layout_stack name="button_stack"> + <layout_panel name="view_profile_btn_panel"> + <button label="Profil" name="view_profile_btn"/> + </layout_panel> + <layout_panel name="add_friend_btn_panel"> + <button label="Tilføj ven" name="add_friend_btn"/> + </layout_panel> + <layout_panel name="teleport_btn_panel"> + <button label="Teleport" name="teleport_btn" tool_tip="Tilbyd teleport til denne person"/> + </layout_panel> + <layout_panel name="share_btn_panel"> + <button label="Del" name="share_btn"/> + </layout_panel> + <layout_panel name="pay_btn_panel"> + <button label="Betal" name="pay_btn"/> + </layout_panel> + <layout_panel name="call_btn_panel"> + <button label="Opkald" name="call_btn"/> + </layout_panel> + <layout_panel name="end_call_btn_panel"> + <button label="Afslut samtale" name="end_call_btn"/> + </layout_panel> + <layout_panel name="voice_ctrls_btn_panel"> + <button label="Stemme kontroller" name="voice_ctrls_btn"/> + </layout_panel> + </layout_stack> +</panel> diff --git a/indra/newview/skins/minimal/xui/da/panel_login.xml b/indra/newview/skins/minimal/xui/da/panel_login.xml new file mode 100644 index 0000000000000000000000000000000000000000..2e0f726e1abb826ef9a657713da88a19a35afcac --- /dev/null +++ b/indra/newview/skins/minimal/xui/da/panel_login.xml @@ -0,0 +1,48 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="panel_login"> + <panel.string name="create_account_url"> + http://join.secondlife.com/ + </panel.string> + <panel.string name="forgot_password_url"> + http://secondlife.com/account/request.php + </panel.string> + <layout_stack name="login_widgets"> + <layout_panel name="login"> + <text name="username_text"> + Brugernavn: + </text> + <combo_box name="username_combo" tool_tip="Brugernavnet du valgte da du registrerde dig, som f.eks. bobsmith12 or Steller Sunshine"/> + <text name="password_text"> + Password: + </text> + <check_box label="Husk password" name="remember_check"/> + <button label="Log pÃ¥" name="connect_btn"/> + <text name="mode_selection_text"> + Tilstand: + </text> + <combo_box name="mode_combo" tool_tip="Vælg ønsket tilstand. Vælg basis for hurtig og nem udforskning og chat. Vælg avanceret for at fÃ¥ adgang til flere muligheder."> + <combo_box.item label="Basis" name="Basic"/> + <combo_box.item label="Avanceret" name="Advanced"/> + </combo_box> + <text name="start_location_text"> + Start ved: + </text> + <combo_box name="start_location_combo"> + <combo_box.item label="Min sidste lokation" name="MyLastLocation"/> + <combo_box.item label="Hjem" name="MyHome"/> + <combo_box.item label="<Indtast regionnavn>" name="Typeregionname"/> + </combo_box> + </layout_panel> + <layout_panel name="links"> + <text name="create_new_account_text"> + Opret bruger + </text> + <text name="forgot_password_text"> + Har du glemt brugernavn eller password? + </text> + <text name="login_help"> + Hjælp til login + </text> + </layout_panel> + </layout_stack> +</panel> diff --git a/indra/newview/skins/minimal/xui/da/panel_navigation_bar.xml b/indra/newview/skins/minimal/xui/da/panel_navigation_bar.xml new file mode 100644 index 0000000000000000000000000000000000000000..2ee87433a462b06caaaa25ed1bba9858ea358457 --- /dev/null +++ b/indra/newview/skins/minimal/xui/da/panel_navigation_bar.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="navigation_bar"> + <panel name="navigation_panel"> + <pull_button name="back_btn" tool_tip="GÃ¥ tilbage til min forrige lokation"/> + <pull_button name="forward_btn" tool_tip="GÃ¥ en lokation fremad"/> + <button name="home_btn" tool_tip="Teleport til min hjemme lokation"/> + <location_input label="Lokation" name="location_combo"/> + <search_combo_box label="Søg" name="search_combo_box" tool_tip="Søg"> + <combo_editor label="Søg [SECOND_LIFE]" name="search_combo_editor"/> + </search_combo_box> + </panel> + <favorites_bar name="favorite" tool_tip="Træk landemærker hertil for at fÃ¥ hurtig adgang til dine favoritsteder i Second Life!"> + <label name="favorites_bar_label" tool_tip="Træk landemærker hertil for at fÃ¥ hurtig adgang til dine favoritsteder i Second Life!"> + Favoritter + </label> + <chevron_button name=">>" tool_tip="Søg mere af mine favoritter"/> + </favorites_bar> +</panel> diff --git a/indra/newview/skins/minimal/xui/da/panel_people.xml b/indra/newview/skins/minimal/xui/da/panel_people.xml new file mode 100644 index 0000000000000000000000000000000000000000..49cd2c71f2194a364f24c199d29ca15b61077f5a --- /dev/null +++ b/indra/newview/skins/minimal/xui/da/panel_people.xml @@ -0,0 +1,94 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<!-- Side tray panel --> +<panel label="Personer" name="people_panel"> + <string name="no_recent_people" value="Ingen nylige personer. Leder du efter personer at være sammen med? Prøv destinationsknappen nedenfor."/> + <string name="no_filtered_recent_people" value="Ingen nylige personer med det navn."/> + <string name="no_one_near" value="Ingen i nærheden. Leder du efter personer at være sammen med? Prøv destinationsknappen nedenfor."/> + <string name="no_one_filtered_near" value="Ingen i nærheden med det navn."/> + <string name="no_friends_online" value="Ingen venner online"/> + <string name="no_friends" value="Ingen venner"/> + <string name="no_friends_msg"> + Højre-klik pÃ¥ en person for at tilføje som ven. +Leder du efter personer at være sammen med? Prøv destinationsknappen nedenfor. + </string> + <string name="no_filtered_friends_msg"> + Fandt du ikke hvad du søgte? Prøv destinationsknappen nedenfor. + </string> + <string name="people_filter_label" value="Filtrér personer"/> + <string name="groups_filter_label" value="Filtrér grupper"/> + <string name="no_filtered_groups_msg" value="Fandt du ikke det du søgte? Prøv [secondlife:///app/search/groups/[SEARCH_TERM] Søg]."/> + <string name="no_groups_msg" value="Leder du efter grupper at være med i? Prøv [secondlife:///app/search/groups Søg]."/> + <string name="MiniMapToolTipMsg" value="[REGION](Dobbelt-klik for at Ã¥bne kort, træk for at panorere)"/> + <string name="AltMiniMapToolTipMsg" value="[REGION](Dobbelt-klik for at teleportere, træk for at panorere)"/> + <filter_editor label="Filtrér" name="filter_input"/> + <tab_container name="tabs"> + <panel label="TÆT PÃ…" name="nearby_panel"> + <panel label="bottom_panel" name="bottom_panel"> + <menu_button name="nearby_view_sort_btn" tool_tip="Valg"/> + <button name="add_friend_btn" tool_tip="Tilføj valgte beboer til din venneliste"/> + </panel> + </panel> + <panel label="MINE VENNER" name="friends_panel"> + <accordion name="friends_accordion"> + <accordion_tab name="tab_online" title="Online"/> + <accordion_tab name="tab_all" title="Alle"/> + </accordion> + <panel label="bottom_panel" name="bottom_panel"> + <layout_stack name="bottom_panel"> + <layout_panel name="options_gear_btn_panel"> + <menu_button name="friends_viewsort_btn" tool_tip="Vis flere valg"/> + </layout_panel> + <layout_panel name="add_btn_panel"> + <button name="add_btn" tool_tip="Tilbyd venskab til en beboer"/> + </layout_panel> + <layout_panel name="trash_btn_panel"> + <dnd_button name="del_btn" tool_tip="Fjern valgte person fra din venneliste"/> + </layout_panel> + </layout_stack> + </panel> + </panel> + <panel label="MINE GRUPPER" name="groups_panel"> + <panel label="bottom_panel" name="bottom_panel"> + <menu_button name="groups_viewsort_btn" tool_tip="Valg"/> + <button name="plus_btn" tool_tip="Bliv medlem af gruppe/Opret ny gruppe"/> + <button name="activate_btn" tool_tip="Activér valgte gruppe"/> + </panel> + </panel> + <panel label="NYLIGE" name="recent_panel"> + <panel label="bottom_panel" name="bottom_panel"> + <menu_button name="recent_viewsort_btn" tool_tip="Valg"/> + <button name="add_friend_btn" tool_tip="Tilføj valgte beboer til din venneliste"/> + </panel> + </panel> + </tab_container> + <panel name="button_bar"> + <layout_stack name="bottom_bar_ls"> + <layout_panel name="view_profile_btn_lp"> + <button label="Profil" name="view_profile_btn" tool_tip="Vis billeder, grupper og anden beboer information"/> + </layout_panel> + <layout_panel name="chat_btn_lp"> + <button label="IM" name="im_btn" tool_tip="Ã…ben session med privat besked (IM)"/> + </layout_panel> + <layout_panel name="chat_btn_lp"> + <button label="Opkald" name="call_btn" tool_tip="Kald til denne beboer"/> + </layout_panel> + <layout_panel name="chat_btn_lp"> + <button label="Del" name="share_btn" tool_tip="Del en genstand fra beholdning"/> + </layout_panel> + <layout_panel name="chat_btn_lp"> + <button label="Teleportér" name="teleport_btn" tool_tip="Tilbyd teleport"/> + </layout_panel> + </layout_stack> + <layout_stack name="bottom_bar_ls1"> + <layout_panel name="group_info_btn_lp"> + <button label="Gruppe profil" name="group_info_btn" tool_tip="Vis gruppe information"/> + </layout_panel> + <layout_panel name="chat_btn_lp"> + <button label="Gruppe chat" name="chat_btn" tool_tip="Ã…ben chat session"/> + </layout_panel> + <layout_panel name="group_call_btn_lp"> + <button label="Gruppe kald" name="group_call_btn" tool_tip="Opkald til denne gruppe"/> + </layout_panel> + </layout_stack> + </panel> +</panel> diff --git a/indra/newview/skins/minimal/xui/da/panel_side_tray_tab_caption.xml b/indra/newview/skins/minimal/xui/da/panel_side_tray_tab_caption.xml new file mode 100644 index 0000000000000000000000000000000000000000..ce3a1d8b4ef480904558778b6113eec9b149f3fc --- /dev/null +++ b/indra/newview/skins/minimal/xui/da/panel_side_tray_tab_caption.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="sidetray_tab_panel"> + <text name="sidetray_tab_title" value="Side bjælke"/> + <button name="undock" tool_tip="Løsriv"/> + <button name="dock" tool_tip="Fastgør"/> + <button name="show_help" tool_tip="Vis hjælp"/> +</panel> diff --git a/indra/newview/skins/minimal/xui/da/panel_status_bar.xml b/indra/newview/skins/minimal/xui/da/panel_status_bar.xml new file mode 100644 index 0000000000000000000000000000000000000000..6e7bdfc1884b382822f25719c1a31df907112c5d --- /dev/null +++ b/indra/newview/skins/minimal/xui/da/panel_status_bar.xml @@ -0,0 +1,33 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="status"> + <panel.string name="StatBarDaysOfWeek"> + Søndag:Mandag:Tirsdag:Onsdag:Torsdag:Fredag:Lørdag + </panel.string> + <panel.string name="StatBarMonthsOfYear"> + Januar:Februar:Marts:April:Maj:Juni:Juli:August:September:Oktober:November:December + </panel.string> + <panel.string name="packet_loss_tooltip"> + Packet Loss + </panel.string> + <panel.string name="bandwidth_tooltip"> + BÃ¥ndbredde + </panel.string> + <panel.string name="time"> + [hour12, datetime, slt]:[min, datetime, slt] [ampm, datetime, slt] [timezone,datetime, slt] + </panel.string> + <panel.string name="timeTooltip"> + [weekday, datetime, slt], [day, datetime, slt] [month, datetime, slt] [year, datetime, slt] + </panel.string> + <panel.string name="buycurrencylabel"> + L$ [AMT] + </panel.string> + <panel name="balance_bg"> + <text name="balance" tool_tip="Klik for at opdaterer din L$ balance" value="L$20"/> + <button label="KØB L$" name="buyL" tool_tip="Klik for at købe flere L$"/> + </panel> + <text name="TimeText" tool_tip="Nuværende tid (Pacific)"> + 24:00 PST + </text> + <button name="media_toggle_btn" tool_tip="Start/Stop Alle medier (musik, video, hjemmesider)"/> + <button name="volume_btn" tool_tip="Kontrol for generel lydstyrke"/> +</panel> diff --git a/indra/newview/skins/minimal/xui/de/menu_inspect_avatar_gear.xml b/indra/newview/skins/minimal/xui/de/menu_inspect_avatar_gear.xml index fbc119c4833278ba2c7a41997676438ece734cf6..72ba7fe41dc269a8ef82f3f1c3c8378f470b74d1 100644 --- a/indra/newview/skins/minimal/xui/de/menu_inspect_avatar_gear.xml +++ b/indra/newview/skins/minimal/xui/de/menu_inspect_avatar_gear.xml @@ -3,6 +3,7 @@ <menu_item_call label="Profil anzeigen" name="view_profile"/> <menu_item_call label="Freund hinzufügen" name="add_friend"/> <menu_item_call label="IM" name="im"/> + <menu_item_call label="Anrufen" name="call"/> <menu_item_call label="Teleportieren" name="teleport"/> <menu_item_call label="Ignorieren" name="block"/> <menu_item_call label="Freischalten" name="unblock"/> diff --git a/indra/newview/skins/minimal/xui/de/panel_adhoc_control_panel.xml b/indra/newview/skins/minimal/xui/de/panel_adhoc_control_panel.xml new file mode 100644 index 0000000000000000000000000000000000000000..cc45f42169391982f4893e6fdea4329469d7a1b6 --- /dev/null +++ b/indra/newview/skins/minimal/xui/de/panel_adhoc_control_panel.xml @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="panel_im_control_panel"> + <layout_stack name="vertical_stack"> + <layout_panel name="call_btn_panel"> + <button label="Anrufen" name="call_btn"/> + </layout_panel> + <layout_panel name="end_call_btn_panel"> + <button label="Anruf beenden" name="end_call_btn"/> + </layout_panel> + </layout_stack> +</panel> diff --git a/indra/newview/skins/minimal/xui/de/panel_bottomtray.xml b/indra/newview/skins/minimal/xui/de/panel_bottomtray.xml index a4d80921ece5d14f326bb65fa99b6e2f7cf9ffd2..2278bfb699897857f8d82b1c1fffcabf7c0ff400 100644 --- a/indra/newview/skins/minimal/xui/de/panel_bottomtray.xml +++ b/indra/newview/skins/minimal/xui/de/panel_bottomtray.xml @@ -4,26 +4,32 @@ <string name="SpeakBtnToolTip" value="Schaltet Mikrofon ein/aus"/> <string name="VoiceControlBtnToolTip" value="Voice-Chat-Steuerung anzeigen/ausblenden"/> <layout_stack name="toolbar_stack"> + <layout_panel name="speak_panel"> + <button label="Sprechen" name="speak_btn" tool_tip="Mikrofon ein- und ausschalten"/> + </layout_panel> + <layout_panel name="speak_flyout_panel"> + <button label="" name="flyout_btn" tool_tip="Soundeinstellungen ändern"/> + </layout_panel> <layout_panel name="gesture_panel"> - <gesture_combo_list label="Gesten" name="Gesture" tool_tip="Gesten anzeigen/ausblenden"/> + <gesture_combo_list label="Gesten" name="Gesture" tool_tip="Ihren Avatar bestimmte Aktionen durchführen lassen"/> </layout_panel> <layout_panel name="cam_panel"> - <bottomtray_button label="Ansicht" name="camera_btn" tool_tip="Kamerasteuerung anzeigen/ausblenden"/> + <bottomtray_button label="Ansicht" name="camera_btn" tool_tip="Kamerawinkel steuern"/> </layout_panel> - <layout_panel name="avatar_and_destinations_panel"> - <bottomtray_button label="Ziele" name="destination_btn" tool_tip="Zeigt Leutefenster an"/> + <layout_panel name="destinations_panel"> + <bottomtray_button label="Ziele" name="destination_btn" tool_tip="Durch Second Life reisen"/> </layout_panel> - <layout_panel name="avatar_and_destinations_panel"> - <bottomtray_button label="Mein Avatar" name="avatar_btn"/> + <layout_panel name="avatar_panel"> + <bottomtray_button label="Mein Avatar" name="avatar_btn" tool_tip="Eigenes Aussehen verändern"/> </layout_panel> <layout_panel name="people_panel"> - <bottomtray_button label="Leute" name="show_people_button" tool_tip="Zeigt Leutefenster an"/> + <bottomtray_button label="Leute" name="show_people_button" tool_tip="Personen in Second Life suchen"/> </layout_panel> <layout_panel name="profile_panel"> - <bottomtray_button label="Profil" name="show_profile_btn" tool_tip="Zeigt Profilfenster an"/> + <bottomtray_button label="Profil" name="show_profile_btn" tool_tip="Eigenes Profil anzeigen und bearbeiten"/> </layout_panel> <layout_panel name="howto_panel"> - <bottomtray_button label="Anweisungen" name="show_help_btn" tool_tip="Second Life-Anweisungsthemen öffnen"/> + <bottomtray_button label="Anweisungen" name="show_help_btn" tool_tip="Hilfeinfos zu Second Life anzeigen"/> </layout_panel> <layout_panel name="im_well_panel"> <chiclet_im_well name="im_well"> diff --git a/indra/newview/skins/minimal/xui/de/panel_im_control_panel.xml b/indra/newview/skins/minimal/xui/de/panel_im_control_panel.xml index abf8011d9d5a42dc8aa0df45b6430111626800ba..0ef2234fecce596f0aded552d34055214657cf29 100644 --- a/indra/newview/skins/minimal/xui/de/panel_im_control_panel.xml +++ b/indra/newview/skins/minimal/xui/de/panel_im_control_panel.xml @@ -9,7 +9,7 @@ <button label="Freund hinzufügen" name="add_friend_btn"/> </layout_panel> <layout_panel name="teleport_btn_panel"> - <button label="Teleportieren" name="teleport_btn" tool_tip="Dieser Person einen Teleport anbieten."/> + <button label="Teleportieren" name="teleport_btn" tool_tip="Dieser Person einen Teleport anbieten"/> </layout_panel> <layout_panel name="share_btn_panel"> <button label="Teilen" name="share_btn"/> diff --git a/indra/newview/skins/minimal/xui/de/panel_people.xml b/indra/newview/skins/minimal/xui/de/panel_people.xml index c6253e17dee4b9f88ad74e7b43395cc752a1e5b3..4f8f70ad17a72468668e1a40041aa9b0fb8514dd 100644 --- a/indra/newview/skins/minimal/xui/de/panel_people.xml +++ b/indra/newview/skins/minimal/xui/de/panel_people.xml @@ -51,6 +51,9 @@ <layout_panel name="chat_btn_lp"> <button label="IM" name="im_btn" tool_tip="Instant Messenger öffnen"/> </layout_panel> + <layout_panel name="chat_btn_lp"> + <button label="Anrufen" name="call_btn" tool_tip="Diesen Einwohner anrufen"/> + </layout_panel> <layout_panel name="chat_btn_lp"> <button label="Teleportieren" name="teleport_btn" tool_tip="Teleport anbieten"/> </layout_panel>