diff options
Diffstat (limited to 'indra')
-rwxr-xr-x | indra/llwindow/lldragdropwin32.h | 2 | ||||
-rwxr-xr-x | indra/newview/app_settings/settings.xml | 17 | ||||
-rw-r--r-- | indra/newview/llavatarrenderinfoaccountant.cpp | 63 | ||||
-rw-r--r-- | indra/newview/llavatarrenderinfoaccountant.h | 2 | ||||
-rwxr-xr-x | indra/newview/llviewermenu.cpp | 18 | ||||
-rwxr-xr-x | indra/newview/llviewerregion.cpp | 2 | ||||
-rwxr-xr-x | indra/newview/llvoavatar.cpp | 136 | ||||
-rwxr-xr-x | indra/newview/llvoavatar.h | 2 | ||||
-rwxr-xr-x | indra/newview/skins/default/xui/en/menu_attachment_other.xml | 24 | ||||
-rwxr-xr-x | indra/newview/skins/default/xui/en/menu_avatar_other.xml | 26 |
10 files changed, 176 insertions, 116 deletions
diff --git a/indra/llwindow/lldragdropwin32.h b/indra/llwindow/lldragdropwin32.h index 929e7f9e37..a6824f3e90 100755 --- a/indra/llwindow/lldragdropwin32.h +++ b/indra/llwindow/lldragdropwin32.h @@ -57,7 +57,7 @@ class LLDragDropWin32 #include <windows.h> #include <ole2.h> -// imposter class that does nothing +// impostor class that does nothing class LLDragDropWin32 { public: diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index eacc7fbec5..31c69f6b3e 100755 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -9735,10 +9735,11 @@ <key>Value</key> <integer>1</integer> </map> + <key>RenderAutoMuteByteLimit</key> <map> <key>Comment</key> - <string>Maximum bytes of attachments before an avatar is rendered as a simple imposter (0 for no limit).</string> + <string>Maximum bytes of attachments before an avatar is rendered as a simple impostor (0 for no limit).</string> <key>Persist</key> <integer>1</integer> <key>Type</key> @@ -9746,10 +9747,10 @@ <key>Value</key> <integer>0</integer> </map> - <key>RenderAutoMuteRenderCostLimit</key> + <key>RenderAutoMuteRenderWeightLimit</key> <map> <key>Comment</key> - <string>Maximum render weight before an avatar is rendered as a simple imposter (0 to not use this limit).</string> + <string>Maximum render weight before an avatar is rendered as a simple impostor (0 to not use this limit).</string> <key>Persist</key> <integer>1</integer> <key>Type</key> @@ -9760,7 +9761,7 @@ <key>RenderAutoMuteSurfaceAreaLimit</key> <map> <key>Comment</key> - <string>Maximum surface area of attachments before an avatar is rendered as a simple imposter (0 to not use this limit).</string> + <string>Maximum surface area of attachments before an avatar is rendered as a simple impostor (0 to not use this limit).</string> <key>Persist</key> <integer>1</integer> <key>Type</key> @@ -9768,16 +9769,16 @@ <key>Value</key> <integer>0</integer> </map> - <key>RenderAutoMuteThreshold</key> + <key>RenderAutoMuteFunctions</key> <map> <key>Comment</key> - <string>Threshold on the Avatar Detail slider where simple imposter mode is enabled. (less than 0 is always on, greather than 1 always off)</string> + <string>Developing feature to render some avatars using simple impostors or colored silhouettes. (Set to 7 for all functionality)</string> <key>Persist</key> <integer>1</integer> <key>Type</key> - <string>F32</string> + <string>U32</string> <key>Value</key> - <real>0.25</real> + <real>0</real> </map> <key>RenderAutoMuteLogging</key> <map> diff --git a/indra/newview/llavatarrenderinfoaccountant.cpp b/indra/newview/llavatarrenderinfoaccountant.cpp index 89c1b2a186..e778e0c032 100644 --- a/indra/newview/llavatarrenderinfoaccountant.cpp +++ b/indra/newview/llavatarrenderinfoaccountant.cpp @@ -38,6 +38,7 @@ #include "llhttpclient.h" #include "lltimer.h" #include "llviewercontrol.h" +#include "llviewermenu.h" #include "llviewerobjectlist.h" #include "llviewerregion.h" #include "llvoavatar.h" @@ -92,7 +93,7 @@ public: { if (LLAvatarRenderInfoAccountant::logRenderInfo()) { - llinfos << "Result for avatar weights request for region " << regionp->getName() << ":" << llendl; + llinfos << "LRI: Result for avatar weights request for region " << regionp->getName() << ":" << llendl; } if (content.isMap()) @@ -115,7 +116,7 @@ public: if (LLAvatarRenderInfoAccountant::logRenderInfo()) { - llinfos << " Agent " << target_agent_id + llinfos << "LRI: Agent " << target_agent_id << ": " << agent_info_map << llendl; } @@ -186,7 +187,7 @@ public: { if (LLAvatarRenderInfoAccountant::logRenderInfo()) { - llinfos << "Result for avatar weights POST for region " << regionp->getName() + llinfos << "LRI: Result for avatar weights POST for region " << regionp->getName() << ": " << content << llendl; } @@ -224,7 +225,7 @@ void LLAvatarRenderInfoAccountant::sendRenderInfoToRegion(LLViewerRegion * regio { if (logRenderInfo()) { - llinfos << "Sending avatar render info to region " + llinfos << "LRI: Sending avatar render info to region " << regionp->getName() << " from " << url << llendl; @@ -253,7 +254,7 @@ void LLAvatarRenderInfoAccountant::sendRenderInfoToRegion(LLViewerRegion * regio if (logRenderInfo()) { - llinfos << "Sending avatar render info for " << avatar->getID() + llinfos << "LRI: Sending avatar render info for " << avatar->getID() << ": " << info << llendl; } } @@ -281,7 +282,7 @@ void LLAvatarRenderInfoAccountant::getRenderInfoFromRegion(LLViewerRegion * regi { if (logRenderInfo()) { - llinfos << "Requesting avatar render info for region " + llinfos << "LRI: Requesting avatar render info for region " << regionp->getName() << " from " << url << llendl; @@ -304,6 +305,12 @@ void LLAvatarRenderInfoAccountant::idle() S32 num_avs = LLCharacter::sInstances.size(); + if (logRenderInfo()) + { + llinfos << "LRI: Scanning all regions and checking for render info updates" + << llendl; + } + // Check all regions and see if it's time to fetch/send data for (LLWorld::region_list_t::const_iterator iter = LLWorld::getInstance()->getRegionList().begin(); iter != LLWorld::getInstance()->getRegionList().end(); ++iter) @@ -325,6 +332,35 @@ void LLAvatarRenderInfoAccountant::idle() // We scanned all the regions, reset the request timer. sRenderInfoReportTimer.resetWithExpiry(SECS_BETWEEN_REGION_SCANS); } + + static LLCachedControl<U32> render_auto_mute_functions(gSavedSettings, "RenderAutoMuteFunctions"); + static U32 prev_render_auto_mute_functions = (U32) -1; + if (prev_render_auto_mute_functions != render_auto_mute_functions) + { + prev_render_auto_mute_functions = render_auto_mute_functions; + + // Adjust menus + BOOL show_items = (BOOL)(render_auto_mute_functions & 0x04); + gMenuAvatarOther->setItemVisible( std::string("Normal"), show_items); + gMenuAvatarOther->setItemVisible( std::string("Always use impostor"), show_items); + gMenuAvatarOther->setItemVisible( std::string("Never use impostor"), show_items); + gMenuAvatarOther->setItemVisible( std::string("Impostor seperator"), show_items); + + gMenuAttachmentOther->setItemVisible( std::string("Normal"), show_items); + gMenuAttachmentOther->setItemVisible( std::string("Always use impostor"), show_items); + gMenuAttachmentOther->setItemVisible( std::string("Never use impostor"), show_items); + gMenuAttachmentOther->setItemVisible( std::string("Impostor seperator"), show_items); + + if (!show_items) + { // Turning off visual muting + for (std::vector<LLCharacter*>::iterator iter = LLCharacter::sInstances.begin(); + iter != LLCharacter::sInstances.end(); ++iter) + { // Make sure all AVs have the setting cleared + LLVOAvatar* inst = (LLVOAvatar*) *iter; + inst->setCachedVisualMute(false); + } + } + } } @@ -332,14 +368,23 @@ void LLAvatarRenderInfoAccountant::idle() // Make sRenderInfoReportTimer expire so the next call to idle() will scan and query a new region // called via LLViewerRegion::setCapabilitiesReceived() boost signals when the capabilities // are returned for a new LLViewerRegion, and is the earliest time to get render info -void LLAvatarRenderInfoAccountant::expireRenderInfoReportTimer() +void LLAvatarRenderInfoAccountant::expireRenderInfoReportTimer(const LLUUID& region_id) { if (logRenderInfo()) { - llinfos << "Viewer has new region capabilities" << llendl; + llinfos << "LRI: Viewer has new region capabilities, clearing global render info timer" + << " and timer for region " << region_id + << llendl; } - sRenderInfoReportTimer.resetWithExpiry(0.f); + // Reset the global timer so it will scan regions immediately + sRenderInfoReportTimer.reset(); + + LLViewerRegion* regionp = LLWorld::instance().getRegionFromID(region_id); + if (regionp) + { // Reset the region's timer so it will request data immediately + regionp->getRenderInfoRequestTimer().reset(); + } } // static diff --git a/indra/newview/llavatarrenderinfoaccountant.h b/indra/newview/llavatarrenderinfoaccountant.h index 97dd9f0ad3..d68f2dccfb 100644 --- a/indra/newview/llavatarrenderinfoaccountant.h +++ b/indra/newview/llavatarrenderinfoaccountant.h @@ -42,7 +42,7 @@ public: static void sendRenderInfoToRegion(LLViewerRegion * regionp); static void getRenderInfoFromRegion(LLViewerRegion * regionp); - static void expireRenderInfoReportTimer(); + static void expireRenderInfoReportTimer(const LLUUID& region_id); static void idle(); diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index c6c1090f45..9468a2d542 100755 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -2930,7 +2930,7 @@ bool enable_object_unmute() // 0 = normal, 1 = always, 2 = never -class LLAvatarCheckImposterMode : public view_listener_t +class LLAvatarCheckImpostorMode : public view_listener_t { bool handleEvent(const LLSD& userdata) { @@ -2956,7 +2956,7 @@ class LLAvatarCheckImposterMode : public view_listener_t }; // 0 = normal, 1 = always, 2 = never -class LLAvatarSetImposterMode : public view_listener_t +class LLAvatarSetImpostorMode : public view_listener_t { bool handleEvent(const LLSD& userdata) { @@ -2971,16 +2971,20 @@ class LLAvatarSetImposterMode : public view_listener_t { case 0: avatar->setVisualMuteSettings(LLVOAvatar::VISUAL_MUTE_NOT_SET); - return true; + break; case 1: avatar->setVisualMuteSettings(LLVOAvatar::ALWAYS_VISUAL_MUTE); - return true; + break; case 2: avatar->setVisualMuteSettings(LLVOAvatar::NEVER_VISUAL_MUTE); - return true; + break; default: return false; } + + avatar->forceUpdateVisualMuteSettings(); + LLVOAvatar::cullAvatarsByPixelArea(); + return true; } // handleEvent() }; @@ -8736,8 +8740,8 @@ void initialize_menus() view_listener_t::addMenu( new LLCheckPanelPeopleTab(), "SideTray.CheckPanelPeopleTab"); // Avatar pie menu - view_listener_t::addMenu(new LLAvatarCheckImposterMode(), "Avatar.CheckImposterMode"); - view_listener_t::addMenu(new LLAvatarSetImposterMode(), "Avatar.SetImposterMode"); + view_listener_t::addMenu(new LLAvatarCheckImpostorMode(), "Avatar.CheckImpostorMode"); + view_listener_t::addMenu(new LLAvatarSetImpostorMode(), "Avatar.SetImpostorMode"); view_listener_t::addMenu(new LLObjectMute(), "Avatar.Mute"); view_listener_t::addMenu(new LLAvatarAddFriend(), "Avatar.AddFriend"); view_listener_t::addMenu(new LLAvatarAddContact(), "Avatar.AddContact"); diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp index 778c0ee61a..b91dde4113 100755 --- a/indra/newview/llviewerregion.cpp +++ b/indra/newview/llviewerregion.cpp @@ -400,7 +400,7 @@ LLViewerRegion::LLViewerRegion(const U64 &handle, mImpl->mObjectPartition.push_back(NULL); //PARTITION_NONE mRenderInfoRequestTimer.resetWithExpiry(0.f); // Set timer to be expired - setCapabilitiesReceivedCallback(boost::bind(&LLAvatarRenderInfoAccountant::expireRenderInfoReportTimer)); + setCapabilitiesReceivedCallback(boost::bind(&LLAvatarRenderInfoAccountant::expireRenderInfoReportTimer, _1)); } diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index 6a504e10c4..d449efb7e7 100755 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -2987,81 +2987,90 @@ bool LLVOAvatar::isVisuallyMuted() { bool muted = false; - // Priority order (highest priority first) - // * own avatar is never visually muted - // * if on the "always draw normally" list, draw them normally - // * if on the "always visually mute" list, mute them - // * draw them normally if they meet the following criteria: - // - within the closest N avatars OR on friends list OR in an IM chat - // - AND aren't over the thresholds - // * otherwise visually mute all other avatars - if (!isSelf()) { - static LLCachedControl<F32> render_mute_threshold(gSavedSettings, "RenderAutoMuteThreshold"); - static LLCachedControl<U32> max_attachment_bytes(gSavedSettings, "RenderAutoMuteByteLimit"); - static LLCachedControl<F32> max_attachment_area(gSavedSettings, "RenderAutoMuteSurfaceAreaLimit"); - static LLCachedControl<U32> max_render_cost(gSavedSettings, "RenderAutoMuteRenderCostLimit"); - - if (mVisuallyMuteSetting == ALWAYS_VISUAL_MUTE) - { // Always want to see this AV as an imposter - muted = true; - } - else if (mVisuallyMuteSetting == NEVER_VISUAL_MUTE) - { // Never show as imposter - muted = false; - } - else if (LLVOAvatar::sLODFactor <= render_mute_threshold) + static LLCachedControl<U32> render_auto_mute_functions(gSavedSettings, "RenderAutoMuteFunctions"); + if (render_auto_mute_functions) // Hacky debug switch for developing feature { - F64 now = LLFrameTimer::getTotalSeconds(); + // Priority order (highest priority first) + // * own avatar is never visually muted + // * if on the "always draw normally" list, draw them normally + // * if on the "always visually mute" list, mute them + // * draw them normally if they meet the following criteria: + // - within the closest N avatars OR on friends list OR in an IM chat + // - AND aren't over the thresholds + // * otherwise visually mute all other avatars - if (now < mCachedVisualMuteUpdateTime) - { // Use cached mute value - muted = mCachedVisualMute; + static LLCachedControl<U32> max_attachment_bytes(gSavedSettings, "RenderAutoMuteByteLimit"); + static LLCachedControl<F32> max_attachment_area(gSavedSettings, "RenderAutoMuteSurfaceAreaLimit"); + static LLCachedControl<U32> max_render_cost(gSavedSettings, "RenderAutoMuteRenderWeightLimit"); + + if (mVisuallyMuteSetting == ALWAYS_VISUAL_MUTE) + { // Always want to see this AV as an impostor + muted = true; } - else - { // Determine if visually muted or not + else if (mVisuallyMuteSetting == NEVER_VISUAL_MUTE) + { // Never show as impostor + muted = false; + } + else + { + F64 now = LLFrameTimer::getTotalSeconds(); - U32 max_cost = (U32) (max_render_cost*(LLVOAvatar::sLODFactor+0.5)); + if (now < mCachedVisualMuteUpdateTime) + { // Use cached mute value + muted = mCachedVisualMute; + } + else + { // Determine if visually muted or not - muted = LLMuteList::getInstance()->isMuted(getID()) || - (mAttachmentGeometryBytes > max_attachment_bytes && max_attachment_bytes > 0) || - (mAttachmentSurfaceArea > max_attachment_area && max_attachment_area > 0.f) || - (mVisualComplexity > max_cost && max_render_cost > 0); + U32 max_cost = (U32) (max_render_cost*(LLVOAvatar::sLODFactor+0.5)); - // Could be part of the grand || collection above, but yanked out to make the logic visible - if (!muted) - { - if (sMaxVisible > 0) - { // They are above the visibilty rank - mute them - muted = (mVisibilityRank > sMaxVisible); - } - - /* Not used - always draw friends or those in IMs. Works nicely, needs UI? - if (muted || // Don't mute friends or IMs - sMaxVisible == 0) + muted = LLMuteList::getInstance()->isMuted(getID()) || + (mAttachmentGeometryBytes > max_attachment_bytes && max_attachment_bytes > 0) || + (mAttachmentSurfaceArea > max_attachment_area && max_attachment_area > 0.f) || + (mVisualComplexity > max_cost && max_render_cost > 0); + + // Could be part of the grand || collection above, but yanked out to make the logic visible + if (!muted) { - muted = !(LLAvatarTracker::instance().isBuddy(getID())); - if (muted) - { // Not a friend, so they are muted ... are they in an IM? - LLUUID session_id = gIMMgr->computeSessionID(IM_NOTHING_SPECIAL,getID()); - muted = !gIMMgr->hasSession(session_id); + if (sMaxVisible > 0) + { // They are above the visibilty rank - mute them + muted = (mVisibilityRank > sMaxVisible); + } + + // Always draw friends or those in IMs. Needs UI? + if ((render_auto_mute_functions & 0x02) && + (muted || sMaxVisible == 0)) // Don't mute friends or IMs + { + muted = !(LLAvatarTracker::instance().isBuddy(getID())); + if (muted) + { // Not a friend, so they are muted ... are they in an IM? + LLUUID session_id = gIMMgr->computeSessionID(IM_NOTHING_SPECIAL,getID()); + muted = !gIMMgr->hasSession(session_id); + } } } - */ - } - // Save visual mute state and set interval for updating - const F64 SECONDS_BETWEEN_RENDER_AUTO_MUTE_UPDATES = 1.5; - mCachedVisualMuteUpdateTime = now + SECONDS_BETWEEN_RENDER_AUTO_MUTE_UPDATES; - mCachedVisualMute = muted; - } + // Save visual mute state and set interval for updating + const F64 SECONDS_BETWEEN_RENDER_AUTO_MUTE_UPDATES = 1.5; + mCachedVisualMuteUpdateTime = now + SECONDS_BETWEEN_RENDER_AUTO_MUTE_UPDATES; + mCachedVisualMute = muted; + } + } } } return muted; } +void LLVOAvatar::forceUpdateVisualMuteSettings() +{ + // Set the cache time so it's updated ASAP + mCachedVisualMuteUpdateTime = LLFrameTimer::getTotalSeconds() - 1.0; +} + + //------------------------------------------------------------------------ // updateCharacter() // called on both your avatar and other avatars @@ -3806,11 +3815,11 @@ U32 LLVOAvatar::renderSkinned(EAvatarRenderPass pass) { //LOD changed or new mesh created, allocate new vertex buffer if needed if (needs_rebuild || mDirtyMesh >= 2 || mVisibilityRank <= 4) { - updateMeshData(); + updateMeshData(); mDirtyMesh = 0; - mNeedsSkin = TRUE; - mDrawable->clearState(LLDrawable::REBUILD_GEOMETRY); - } + mNeedsSkin = TRUE; + mDrawable->clearState(LLDrawable::REBUILD_GEOMETRY); + } } if (LLViewerShaderMgr::instance()->getVertexShaderLevel(LLViewerShaderMgr::SHADER_AVATAR) <= 0) @@ -7868,8 +7877,7 @@ void LLVOAvatar::getImpostorValues(LLVector4a* extents, LLVector3& angle, F32& d void LLVOAvatar::idleUpdateRenderCost() { - static LLCachedControl<U32> max_render_cost(gSavedSettings, "RenderAutoMuteRenderCostLimit"); - + static LLCachedControl<U32> max_render_cost(gSavedSettings, "RenderAutoMuteRenderWeightLimit"); static const U32 ARC_LIMIT = 20000; if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_ATTACHMENT_BYTES)) @@ -8033,7 +8041,7 @@ LLColor4 LLVOAvatar::calcMutedAVColor(F32 value, S32 range_low, S32 range_high) LLColor4 new_color = lerp(*spectrum_color[spectrum_index_1], *spectrum_color[spectrum_index_2], fractBetween); new_color.normalize(); - new_color *= 0.9f; + new_color *= 0.7f; // Tone it down a bit //llinfos << "From value " << std::setprecision(3) << value << " returning color " << new_color // << " using indexes " << spectrum_index_1 << ", " << spectrum_index_2 diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h index 295175133c..931e65b3ea 100755 --- a/indra/newview/llvoavatar.h +++ b/indra/newview/llvoavatar.h @@ -389,6 +389,8 @@ public: public: U32 renderImpostor(LLColor4U color = LLColor4U(255,255,255,255), S32 diffuse_channel = 0); bool isVisuallyMuted(); + void setCachedVisualMute(bool muted) { mCachedVisualMute = muted; }; + void forceUpdateVisualMuteSettings(); enum VisualMuteSettings { diff --git a/indra/newview/skins/default/xui/en/menu_attachment_other.xml b/indra/newview/skins/default/xui/en/menu_attachment_other.xml index 47fae51fac..ba91b0b5d9 100755 --- a/indra/newview/skins/default/xui/en/menu_attachment_other.xml +++ b/indra/newview/skins/default/xui/en/menu_attachment_other.xml @@ -117,37 +117,37 @@ <menu_item_check name="Normal" - label="Normal"> + label="Normal Rendering"> <menu_item_check.on_check - function="Avatar.CheckImposterMode" + function="Avatar.CheckImpostorMode" parameter="0" /> <menu_item_check.on_click - function="Avatar.SetImposterMode" + function="Avatar.SetImpostorMode" parameter="0" /> </menu_item_check> <menu_item_check - name="Always use imposter" - label="Always use imposter"> + name="Always use impostor" + label="Always use impostor"> <menu_item_check.on_check - function="Avatar.CheckImposterMode" + function="Avatar.CheckImpostorMode" parameter="1" /> <menu_item_check.on_click - function="Avatar.SetImposterMode" + function="Avatar.SetImpostorMode" parameter="1" /> </menu_item_check> <menu_item_check - name="Never use imposter" - label="Never use imposter"> + name="Never use impostor" + label="Never use impostor"> <menu_item_check.on_check - function="Avatar.CheckImposterMode" + function="Avatar.CheckImpostorMode" parameter="2" /> <menu_item_check.on_click - function="Avatar.SetImposterMode" + function="Avatar.SetImpostorMode" parameter="2" /> </menu_item_check> <menu_item_separator - layout="topleft" /> + layout="topleft" name="Impostor seperator"/> <menu_item_call enabled="false" diff --git a/indra/newview/skins/default/xui/en/menu_avatar_other.xml b/indra/newview/skins/default/xui/en/menu_avatar_other.xml index 935b5b3ea0..8bd013f14b 100755 --- a/indra/newview/skins/default/xui/en/menu_avatar_other.xml +++ b/indra/newview/skins/default/xui/en/menu_avatar_other.xml @@ -110,37 +110,37 @@ <menu_item_check name="Normal" - label="Normal"> + label="Normal Rendering"> <menu_item_check.on_check - function="Avatar.CheckImposterMode" + function="Avatar.CheckImpostorMode" parameter="0" /> <menu_item_check.on_click - function="Avatar.SetImposterMode" + function="Avatar.SetImpostorMode" parameter="0" /> </menu_item_check> <menu_item_check - name="Always use imposter" - label="Always use imposter"> + name="Always use impostor" + label="Always use impostor"> <menu_item_check.on_check - function="Avatar.CheckImposterMode" + function="Avatar.CheckImpostorMode" parameter="1" /> <menu_item_check.on_click - function="Avatar.SetImposterMode" + function="Avatar.SetImpostorMode" parameter="1" /> </menu_item_check> <menu_item_check - name="Never use imposter" - label="Never use imposter"> + name="Never use impostor" + label="Never use impostor"> <menu_item_check.on_check - function="Avatar.CheckImposterMode" + function="Avatar.CheckImpostorMode" parameter="2" /> <menu_item_check.on_click - function="Avatar.SetImposterMode" + function="Avatar.SetImpostorMode" parameter="2" /> </menu_item_check> - <menu_item_separator - layout="topleft" /> + <menu_item_separator + layout="topleft" name="Impostor seperator"/> <menu_item_call enabled="false" |