Ansariel 2025-06-15 17:58:08 +02:00
commit 3f4d28329f
33 changed files with 111 additions and 60 deletions

View File

@ -379,13 +379,13 @@ jobs:
- name: Install Microsoft.Trusted.Signing.Client
if: runner.os == 'Windows'
run: |
.\nuget.exe install Microsoft.Trusted.Signing.Client -Version 1.0.53 -OutputDirectory .
.\nuget.exe install Microsoft.Trusted.Signing.Client -Version 1.0.86 -OutputDirectory .
shell: pwsh
- name: Locate Azure.CodeSigning.Dlib.dll
if: runner.os == 'Windows'
run: |
$dllPath = (Get-ChildItem ".\Microsoft.Trusted.Signing.Client.1.0.53\bin\x64\Azure.CodeSigning.Dlib.dll" -Recurse -File | Select-Object -First 1).FullName
$dllPath = (Get-ChildItem ".\Microsoft.Trusted.Signing.Client.1.0.86\bin\x64\Azure.CodeSigning.Dlib.dll" -Recurse -File | Select-Object -First 1).FullName
if (-not $dllPath) {
Write-Error "Azure.CodeSigning.Dlib.dll not found."
exit 1

View File

@ -244,14 +244,4 @@ inline size_t hash_value(const LLUUID& id) noexcept
return (size_t)id.getDigest64();
}
// <FS:Ansariel> UUID hash calculation
struct FSUUIDHash
{
inline size_t operator() (const LLUUID& id) const
{
return *reinterpret_cast<const size_t*>(id.mData);
}
};
// </FS:Ansariel> UUID hash calculation
#endif // LL_LLUUID_H

View File

@ -361,14 +361,12 @@ LLSD LLSettingsBase::interpolateSDValue(const std::string& key_name, const LLSD
new_array = q.getValue();
}
else
{ // TODO: We could expand this to inspect the type and do a deep lerp based on type.
// for now assume a heterogeneous array of reals.
{
size_t len = std::max(value.size(), other_value.size());
for (size_t i = 0; i < len; ++i)
{
new_array[i] = lerp((F32)value[i].asReal(), (F32)other_value[i].asReal(), (F32)mix);
new_array[i] = interpolateSDValue(key_name, value[i], other_value[i], defaults, mix, skip, slerps);
}
}

View File

@ -661,16 +661,15 @@ void LLSettingsSky::blend(LLSettingsBase::ptr_t &end, F64 blendf)
mHasLegacyHaze |= lerp_legacy_float(mHazeDensity, mLegacyHazeDensity, other->mHazeDensity, other->mLegacyHazeDensity, 0.7f, (F32)blendf);
mHasLegacyHaze |= lerp_legacy_float(mDistanceMultiplier, mLegacyDistanceMultiplier, other->mDistanceMultiplier, other->mLegacyDistanceMultiplier, 0.8f, (F32)blendf);
mHasLegacyHaze |= lerp_legacy_float(mDensityMultiplier, mLegacyDensityMultiplier, other->mDensityMultiplier, other->mLegacyDensityMultiplier, 0.0001f, (F32)blendf);
mHasLegacyHaze |= lerp_legacy_color(mAmbientColor, mLegacyAmbientColor, other->mAmbientColor, other->mLegacyAmbientColor, LLColor3(0.25f, 0.25f, 0.25f), (F32)blendf);
mHasLegacyHaze |= lerp_legacy_color(mAmbientColor, mLegacyAmbientColor, other->mAmbientColor, other->mLegacyAmbientColor, LLColor3(0.25f, 0.25f, 0.25f), (F32)blendf); // <FS:Beq for Hecklezz/> import pending PR #4185 Fix sky ambient color not blending.
mHasLegacyHaze |= lerp_legacy_color(mBlueHorizon, mLegacyBlueHorizon, other->mBlueHorizon, other->mLegacyBlueHorizon, LLColor3(0.4954f, 0.4954f, 0.6399f), (F32)blendf);
mHasLegacyHaze |= lerp_legacy_color(mBlueDensity, mLegacyBlueDensity, other->mBlueDensity, other->mLegacyBlueDensity, LLColor3(0.2447f, 0.4487f, 0.7599f), (F32)blendf);
parammapping_t defaults = other->getParameterMap();
stringset_t skip = getSkipInterpolateKeys();
stringset_t slerps = getSlerpKeys();
mAbsorptionConfigs = interpolateSDMap(mAbsorptionConfigs, other->mAbsorptionConfigs, defaults, blendf, skip, slerps);
mMieConfigs = interpolateSDMap(mMieConfigs, other->mMieConfigs, defaults, blendf, skip, slerps);
mRayleighConfigs = interpolateSDMap(mRayleighConfigs, other->mRayleighConfigs, defaults, blendf, skip, slerps);
mAbsorptionConfigs = interpolateSDValue("absorption_config", mAbsorptionConfigs, other->mAbsorptionConfigs, defaults, blendf, skip, slerps);
mMieConfigs = interpolateSDValue("mie_config", mMieConfigs, other->mMieConfigs, defaults, blendf, skip, slerps);
mRayleighConfigs = interpolateSDValue("rayleigh_config", mRayleighConfigs, other->mRayleighConfigs, defaults, blendf, skip, slerps);
setDirtyFlag(true);
setReplaced();

View File

@ -1502,7 +1502,17 @@ void LLDAELoader::processDomModel(LLModel* model, DAE* dae, daeElement* root, do
{
domListOfFloats& transform = t->getValue();
auto count = transform.getCount()/16;
// <FS:Beq> FIRE-34811 Crash during import due to missing inv_bind_matrices.
if (count==0)
{
LL_WARNS("DAELOader") << "Invalid rigged mesh: Missing inv_bind_matrices." << LL_ENDL;
LLSD args;
args["Message"] = "ParsingErrorEmptyInvBindInvalidModel";
mWarningsArray.append(args);
setLoadState( ERROR_PARSING );
}
// </FS:Beq>
for (size_t k = 0; k < count; ++k)
{
LLMatrix4 mat;
@ -1520,7 +1530,14 @@ void LLDAELoader::processDomModel(LLModel* model, DAE* dae, daeElement* root, do
}
}
}
// <FS:Beq> FIRE-34811 Crash during import due to missing inv_bind_matrices.
if (model->mSkinInfo.mInvBindMatrix.empty())
{
model->mSkinInfo.mJointNames.clear();
model->mSkinInfo.mJointNums.clear();
missingSkeletonOrScene = true; // set this true as we've just wiped that data.
}
// </FS:Beq>
//Now that we've parsed the joint array, let's determine if we have a full rig
//(which means we have all the joint sthat are required for an avatar versus
//a skinned asset attached to a node in a file that contains an entire skeleton,

View File

@ -1587,7 +1587,7 @@ LLSD LLMeshSkinInfo::asLLSD(bool include_joints, bool lock_scale_if_joint_positi
for (U32 i = 0; i < mJointNames.size(); ++i)
{
ret[ "joint_names" ][ i ] = mJointNames[ i ];
if (mInvBindMatrix.size() < i) break; // <FS:Beq/> FIRE-34811 Crash during import due to missing inv_bind_matrices.
for (U32 j = 0; j < 4; j++)
{
for (U32 k = 0; k < 4; k++)

View File

@ -66,8 +66,8 @@ private:
bool mBlocked;
};
typedef std::unordered_map<LLUUID, NACLAntiSpamQueueEntry*, FSUUIDHash> spam_queue_entry_map_t;
typedef std::unordered_set<LLUUID, FSUUIDHash> collision_sound_set_t;
typedef std::unordered_map<LLUUID, NACLAntiSpamQueueEntry*> spam_queue_entry_map_t;
typedef std::unordered_set<LLUUID> collision_sound_set_t;
class NACLAntiSpamQueue
{

View File

@ -35,9 +35,9 @@
#include "llsingleton.h"
#include "llassettype.h"
using blacklisted_uuid_container_t = std::unordered_set<LLUUID, FSUUIDHash>;
using blacklisted_uuid_container_t = std::unordered_set<LLUUID>;
using blacklist_type_map_t = std::map<LLAssetType::EType, blacklisted_uuid_container_t>;
using blacklist_data_t = std::unordered_map<LLUUID, LLSD, FSUUIDHash>;
using blacklist_data_t = std::unordered_map<LLUUID, LLSD>;
class FSAssetBlacklist : public LLSingleton<FSAssetBlacklist>
{

View File

@ -92,10 +92,10 @@ bool FSCommon::is_irc_me_prefix(std::string_view text)
std::string FSCommon::unescape_name(std::string_view name)
{
// bugfix for SL-46920: preventing filenames that break stuff.
char * curl_str = curl_unescape(name.data(), static_cast<int>(name.size())); // Calling data() should be ok here because we also pass the length
char* curl_str = curl_unescape(name.data(), static_cast<int>(name.size())); // Calling data() should be ok here because we also pass the length
std::string unescaped_name(curl_str);
curl_free(curl_str);
curl_str = NULL;
curl_str = nullptr;
return unescaped_name;
}
@ -301,11 +301,12 @@ bool FSCommon::isLinden(const LLUUID& av_id)
if (LLGridManager::getInstance()->isInOpenSim())
{
LLViewerRegion* region = gAgent.getRegion();
if (!region) return false;
bool is_god = false;
if (!region)
return false;
bool is_god{ false };
// <FS:CR> They may not be "Lindens" per se, but opensim has gods.
std::set<std::string> gods = region->getGods();
if (!gods.empty())
if (std::set<std::string> gods = region->getGods(); !gods.empty())
{
is_god = (gods.find(first_name + " " + last_name) != gods.end()
|| gods.find(last_name) != gods.end());
@ -453,7 +454,7 @@ std::string FSCommon::getAvatarNameByDisplaySettings(const LLAvatarName& av_name
std::string name;
static LLCachedControl<bool> NameTagShowUsernames(gSavedSettings, "NameTagShowUsernames");
static LLCachedControl<bool> UseDisplayNames(gSavedSettings, "UseDisplayNames");
if ((NameTagShowUsernames) && (UseDisplayNames))
if (NameTagShowUsernames && UseDisplayNames)
{
name = av_name.getCompleteName();
}
@ -494,21 +495,21 @@ bool FSCommon::isDefaultTexture(const LLUUID& asset_id)
bool FSCommon::isLegacySkin()
{
std::string current_skin = gSavedSettings.getString("FSInternalSkinCurrent");
return (current_skin == "Vintage");
static bool is_legacy_skin = gSavedSettings.getString("FSInternalSkinCurrent") == "Vintage";
return is_legacy_skin;
}
bool FSCommon::isFilterEditorKeyCombo(KEY key, MASK mask)
{
return (mask == MASK_CONTROL && key == 'F' && gSavedSettings.getBOOL("FSSelectLocalSearchEditorOnShortcut"));
static LLCachedControl<bool> select_search_on_shortcut(gSavedSettings, "FSSelectLocalSearchEditorOnShortcut");
return (mask == MASK_CONTROL && key == 'F' && select_search_on_shortcut);
}
LLUUID FSCommon::getGroupForRezzing()
{
LLUUID group_id{ gAgent.getGroupID() };
LLParcel* parcel = LLViewerParcelMgr::getInstance()->getAgentParcel();
if (parcel && gSavedSettings.getBOOL("RezUnderLandGroup"))
if (LLParcel* parcel = LLViewerParcelMgr::getInstance()->getAgentParcel(); parcel && gSavedSettings.getBOOL("RezUnderLandGroup"))
{
// In both cases, group-owned or not, the group ID is the same;
// No need to query the parcel owner ID as it will be either

View File

@ -63,7 +63,7 @@ class FSRadar
virtual ~FSRadar();
public:
typedef std::unordered_map<const LLUUID, std::shared_ptr<FSRadarEntry>, FSUUIDHash> entry_map_t;
typedef std::unordered_map<LLUUID, std::shared_ptr<FSRadarEntry>> entry_map_t;
entry_map_t getRadarList() { return mEntryList; }
void startTracking(const LLUUID& avatar_id);
@ -130,7 +130,7 @@ private:
bool lastIgnore;
};
typedef std::unordered_map<LLUUID, RadarFields, FSUUIDHash> radarfields_map_t;
typedef std::unordered_map<LLUUID, RadarFields> radarfields_map_t;
radarfields_map_t mLastRadarSweep;
entry_map_t mEntryList;

View File

@ -52,7 +52,7 @@ class LGGContactSets : public LLSingleton<LGGContactSets>
public:
typedef std::vector<std::string> string_vec_t;
typedef std::unordered_set<LLUUID, FSUUIDHash> uuid_set_t;
typedef std::unordered_set<LLUUID> uuid_set_t;
void loadFromDisk();
@ -157,7 +157,7 @@ private:
LLSD exportToLLSD();
void saveToDisk();
typedef std::unordered_map<LLUUID, std::string, FSUUIDHash> uuid_map_t;
typedef std::unordered_map<LLUUID, std::string> uuid_map_t;
typedef std::map<std::string, ContactSet*> contact_set_map_t;
contact_set_map_t mContactSets;

View File

@ -305,7 +305,10 @@ S32 LLAgentBenefits::get2KTextureUploadCost(S32 area) const
{
if (m_2k_texture_upload_cost.empty())
{
return m_texture_upload_cost;
// <FS:Ansariel> OpenSim legacy economy
//return m_texture_upload_cost;
return getTextureUploadCost();
// </FS:Ansariel>
}
return m_2k_texture_upload_cost[0];
}

View File

@ -60,7 +60,7 @@ static void touch_default_probe(LLReflectionMap* probe)
}
}
LLHeroProbeManager::LLHeroProbeManager():mMirrorNormal(0,0,1) // <FS:Beq/> [FIRE-35007][#3331] mirrors not working after relog. make sure the mirror normal is not zero length
LLHeroProbeManager::LLHeroProbeManager()
{
}

View File

@ -127,7 +127,7 @@ private:
S32 sortMembersList(S32,const LLScrollListItem*,const LLScrollListItem*);
LLGroupMgrGroupData::member_list_t::iterator mMemberProgress;
typedef std::unordered_map<LLUUID, boost::signals2::connection, FSUUIDHash> avatar_name_cache_connection_map_t;
typedef std::unordered_map<LLUUID, boost::signals2::connection> avatar_name_cache_connection_map_t;
avatar_name_cache_connection_map_t mAvatarNameCacheConnections;
bool mPendingMemberUpdate;

View File

@ -245,7 +245,7 @@ namespace LLPerfStats
static void updateMeanFrameTime(U64 tot_frame_time_raw);
// StatsArray is a uint64_t for each possible statistic type.
using StatsArray = std::array<uint64_t, static_cast<size_t>(LLPerfStats::StatType_t::STATS_COUNT)>;
using StatsMap = std::unordered_map<LLUUID, StatsArray, FSUUIDHash>; // <FS:Beq/>
using StatsMap = std::unordered_map<LLUUID, StatsArray>; // <FS:Beq/>
using StatsTypeMatrix = std::array<StatsMap, static_cast<size_t>(LLPerfStats::ObjType_t::OT_COUNT)>;
using StatsSummaryArray = std::array<StatsArray, static_cast<size_t>(LLPerfStats::ObjType_t::OT_COUNT)>;

View File

@ -742,6 +742,10 @@ bool idle_startup()
gSavedSettings.setBOOL("FSInternalShowNavbarFavoritesPanel", gSavedSettings.getBOOL("ShowNavbarFavoritesPanel"));
// </FS:Ansariel>
// <FS:Ansariel> Added to determine if toolbar gets hidden when empty
if (gToolBarView)
gToolBarView->setHideBottomOnEmpty(FSCommon::isLegacySkin());
if (LLFeatureManager::getInstance()->isSafe())
{
LLNotificationsUtil::add("DisplaySetToSafe");

View File

@ -131,9 +131,6 @@ bool LLToolBarView::postBuild()
// <FS:Ansariel> Member variable needed for console chat bottom offset
mBottomChatStack = findChild<LLView>("bottom_chat_stack");
// <FS:Ansariel> Added to determine if toolbar gets hidden when empty
mHideBottomOnEmpty = FSCommon::isLegacySkin();
return true;
}

View File

@ -102,9 +102,12 @@ public:
bool isModified() const;
// <FS:Ansariel> Getters for member variables needed for console chat bottom offset
LLView* getBottomChatStack() const { return mBottomChatStack; };
LLView* getBottomChatStack() const { return mBottomChatStack; }
// </FS:Ansariel>
// <FS:Ansariel> Added to determine if toolbar gets hidden when empty
void setHideBottomOnEmpty(bool hideBottomOnEmpty) { mHideBottomOnEmpty = hideBottomOnEmpty; }
protected:
friend class LLUICtrlFactory;
LLToolBarView(const Params&);

View File

@ -420,7 +420,7 @@ void LLViewerTextureList::dump()
LL_CONT << image->getNumVolumes(index) << " ";
}
// </FS:minerjr> [FIRE-35081]
LL_CONT << " http://asset.siva.lindenlab.com/" << image->getID() << ".texture"
LL_CONT << " " << image->getID().asString().substr(0, 7)
<< LL_ENDL;
// <FS:minerjr> [FIRE-35081] Blurry prims not changing with graphics settings
image_counts[(image->getDiscardLevel() + 1)] += 1; // Need to add +1 to make up for -1 being a possible value

View File

@ -7327,11 +7327,16 @@ void LLViewerWindow::setUIVisibility(bool visible)
// LLPanelTopInfoBar::getInstance()->setVisible(visible? gSavedSettings.getBOOL("ShowMiniLocationPanel") : false);
mStatusBarContainer->setVisible(visible);
// <FS:Zi> hide utility bar if we are on a skin that uses it, e.g. Vintage
LLView* utilityBarStack = mRootView->findChildView("chat_bar_utility_bar_stack");
if (utilityBarStack)
// <FS:Zi> hide utility bar if we are on a skin that uses it, i.e. Vintage
// Beq Note: Added a skin check to fix FIRE-29517 "hitch when entering mouselook"
// This was caused having to search for a non-existent childview. If another skin other than vintage
// ever needs chat_bar_utility_bar_stack in the future, this will need to be updated.
if (FSCommon::isLegacySkin())
{
utilityBarStack->setVisible(visible);
if (LLView* utilityBarStack = mRootView->findChildView("chat_bar_utility_bar_stack"); utilityBarStack)
{
utilityBarStack->setVisible(visible);
}
}
// </FS:Zi>
}

View File

@ -596,7 +596,6 @@ with the same filename but different name
<!-- FS:Beq: Poser icons -->
<texture name="Poser_Visual_On" file_name="icons/visual_pose_enabled.png" />
<texture name="Poser_Visual_Off" file_name="icons/visual_pose_disabled.png" />
<!-- FS:Ansariel: Icon for script errors in V1 status bar -->

View File

@ -145,6 +145,9 @@
<string name="ParsingErrorPositionInvalidModel">
Netz kann nicht ohne Positionsdaten verarbeitet werden - ungültiges Modell.
</string>
<string name="ParsingErrorEmptyInvBindInvalidModel">
Geriggtes Netz kann nicht ohne InvBind-Daten verarbeitet werden - ungültiges Modell.
</string>
<panel name="left_panel">
<panel name="model_name_representation_panel">

View File

@ -65,6 +65,9 @@
<string name="ParsingErrorNoRoot">Document has no root</string>
<string name="ParsingErrorNoScene">Document has no visual_scene</string>
<string name="ParsingErrorPositionInvalidModel">Unable to process mesh without position data. Invalid model.</string>
<!-- FS:Beq FIRE-34811 Crash during import due to missing inv_bind_matrices. -->
<string name="ParsingErrorEmptyInvBindInvalidModel">Unable to process rigged mesh without InvBind data. Invalid model.</string>
<!-- /FS:Beq FIRE-34811 Crash during import due to missing inv_bind_matrices. -->
<panel
follows="top|left"

View File

@ -3807,7 +3807,7 @@
</check_box>
<check_box
follows="top|left"
label="Slop-mo Animation - Your Avatar and Viewer"
label="Slow-mo Animation - Your Avatar and Viewer"
layout="topleft"
left="3"
top_pad="10"

View File

@ -15,6 +15,10 @@
<check_box label="Guide de cadrage" tool_tip="Affiche le guide de cadrage (règle des tiers) à l'intérieur du cadre de la photo." name="show_guides"/>
<button label="Actualiser" name="new_snapshot_btn" tool_tip="Cliquez pour actualiser"/>
<button label="Aperçu" name="big_preview_btn" tool_tip="Cliquez pour afficher l'aperçu"/>
<text name="store_label">
Publier en tant que :
</text>
<combo_box name="stores_combobox" tool_tip="Si vous avez une ou plusieurs boutiques Easy Blogger attribuées sur Primfeed, elles apparaîtront ici."/>
<text name="description_label">
Description :
</text>

View File

@ -24,6 +24,10 @@
<check_box label="フレームのガイドを表示" tool_tip="スナップショットフレーム内にフレームのガイド(三分割法)を表示します。" name="show_guides"/>
<button label="リフレッシュ" name="new_snapshot_btn" tool_tip="クリックでリフレッシュします。"/>
<button label="プレビュー" name="big_preview_btn" tool_tip="クリックでプレビューを切り替えます。"/>
<text name="store_label">
投稿者:
</text>
<combo_box name="stores_combobox" tool_tip="Primfeedにつ以上の簡単なブロガーストアが割り当てられている場合は、ここに表示されます。"/>
<text name="description_label">
説明:
</text>

View File

@ -48,6 +48,7 @@
<string name="ParsingErrorNoRoot">Dokument nie ma elementu głównego</string>
<string name="ParsingErrorNoScene">Dokument nie zawiera visual_scene</string>
<string name="ParsingErrorPositionInvalidModel">Nie można przetworzyć meszu bez danych pozycji. Nieprawidłowy model.</string>
<string name="ParsingErrorEmptyInvBindInvalidModel">Nie można przetworzyć meszu bez danych InvBind. Nieprawidłowy model.</string>
<panel name="left_panel">
<panel name="model_name_representation_panel">
<text name="name_label">

View File

@ -468,6 +468,7 @@
<button label="Добавить" name="add_allowed" />
<button label="Удалить" label_selected="Удалить" name="remove_allowed" />
<button label="Экспорт" label_selected="Экспорт" name="export_allowed" />
<button label="Импорт" label_selected="Импорт" name="import_allowed" tool_tip="Импортируйте CSV-файл, содержащий только действительные UUID — по одному на строку, без дополнительных символов или форматирования."/>
</panel>
<panel name="Banned_layout_panel">
<text name="BanCheck">
@ -480,6 +481,7 @@
<button label="Добавить" name="add_banned"/>
<button label="Удалить" label_selected="Удалить" name="remove_banned" />
<button label="Экспорт" label_selected="Экспорт" name="export_banned" />
<button label="Импорт" label_selected="Импорт" name="import_banned" tool_tip="Импортируйте CSV-файл, содержащий только действительные UUID — по одному на строку, без дополнительных символов или форматирования."/>
</panel>
</panel>
<panel label="Приключения" name="land_experiences_panel"/>

View File

@ -207,10 +207,13 @@
<panel title="Настр." name="settings_panel">
<text name="trackpad_sensitivity_label">Чувствительность трекпада:</text>
<slider name="trackpad_sensitivity_slider" tool_tip="Регулирует чувствительность трекбола"/>
<check_box name="natural_direction_checkbox" label="Используйте естественное выравнивание" tool_tip="Скелет имеет неестественные вращения суставов по умолчанию. Это усложняет позирование. Если отмечено, суставы будут вращаться более естественно." />
<check_box name="stop_posing_on_close_checkbox" label="Стоп позы по закрытию" tool_tip="Не прерывать позу может быть полезно, если вы много работаете и не хотите случайно потерять ее."/>
<check_box name="reset_base_rotation_on_edit_checkbox" label="Сброс базовый поворот" tool_tip="При первом редактировании поворота обнулите его значение. Это означает, что в вашей работе можно сохранить позу (а не разницу, см. раздел Загрузка/сохранение). Рядом с каждым суставом, экспорт которого вы обнулили, появляется зеленая галочка."/>
<check_box name="also_save_bvh_checkbox" label="Запись BVH при сохранении**" tool_tip="Когда вы сохраняете свою позу, также запишется файл BVH, который можно загрузить через 'Build > Upload > Animation', чтобы позировать себя или других в мире. Это требует, чтобы суставы сбросили свою 'базу' на ноль, потому что BVH требует оригинальной работы."/>
<check_box name="confirm_overwrite_on_save_checkbox" label="Подтвердить перезапись" tool_tip="При сохранении позы, если файл уже существует, вам необходимо нажать кнопку сохранения еще раз, чтобы подтвердить, что вы действительно хотите перезаписать его."/>
<check_box name="natural_direction_checkbox" label="Используйте естественное выравнивание" tool_tip="Скелет имеет неестественные вращения суставов по умолчанию. Это усложняет позирование. Если отмечено, суставы будут вращаться более естественно." />
<check_box name="show_joint_markers_checkbox" label="Показать маркеры суставов" tool_tip="Покажите небольшие индикаторы, помогающие выбрать суставы при визуальном позировании."/>
</panel>
</tab_container>
<button name="toggleVisualManipulators" tool_tip="Включать и выключать визуальные манипуляторы"/>

View File

@ -13,6 +13,8 @@
<check_box label="Направляющие кадрирования" tool_tip="Показать направляющую кадрирования (правило третей) внутри рамки снимка." name="show_guides" />
<button label="Обновить" name="new_snapshot_btn" tool_tip="Нажмите, чтобы обновить"/>
<button label="Просмотр" name="big_preview_btn" tool_tip="Нажмите, чтобы переключить предварительный просмотр"/>
<text name="store_label">Опубликовать как:</text>
<combo_box name="stores_combobox" tool_tip="Если у вас есть один или несколько простых магазинов блогеров, назначенных на Primfeed, они появятся здесь."/>
<text name="description_label">Описание:</text>
<check_box label="Включить местоположение" name="add_location_cb"/>
<check_box label="Добавить в публичную галерею" name="primfeed_add_to_public_gallery"/>

View File

@ -11,6 +11,7 @@
<button label="Добавить..." name="add_estate_manager_btn"/>
<button label="Удалить..." name="remove_estate_manager_btn"/>
<button label="Экспорт..." name="export_estate_manager_btn"/>
<button label="Импорт..." name="import_estate_manager_btn" tool_tip="Импортируйте CSV-файл, содержащий только действительные UUID - по одному на строку, без дополнительных символов или форматирования."/>
</panel>
<panel label="Разрешенные" name="allowed_panel">
<panel label="top_panel" name="allowed_search_panel">
@ -26,6 +27,7 @@
<button label="Добавить..." name="add_allowed_avatar_btn"/>
<button label="Удалить..." name="remove_allowed_avatar_btn"/>
<button label="Экспорт..." name="export_allowed_list_btn"/>
<button label="Импорт..." name="import_allowed_list_btn" tool_tip="Импортируйте CSV-файл, содержащий только действительные UUID - по одному на строку, без дополнительных символов или форматирования."/>
</panel>
<panel label="Допущенные Группы" name="allowed_groups_panel">
<panel label="top_panel" name="allowed_group_search_panel">
@ -41,6 +43,7 @@
<button label="Добавить..." name="add_allowed_group_btn"/>
<button label="Удалить..." name="remove_allowed_group_btn"/>
<button label="Экспорт..." name="export_allowed_group_btn"/>
<button label="Импорт..." name="import_allowed_group_btn" tool_tip="Импортируйте CSV-файл, содержащий только действительные UUID - по одному на строку, без дополнительных символов или форматирования."/>
</panel>
<panel label="Заблокированы" name="banned_panel">
<panel label="top_panel" name="banned_search_panel">
@ -59,6 +62,7 @@
<button label="Добавить..." name="add_banned_avatar_btn"/>
<button label="Удалить..." name="remove_banned_avatar_btn"/>
<button label="Экспорт..." name="export_banned_avatar_btn"/>
<button label="Импорт..." name="import_banned_avatar_btn" tool_tip="Импортируйте CSV-файл, содержащий только действительные UUID - по одному на строку, без дополнительных символов или форматирования."/>
</panel>
</tab_container>
</panel>

View File

@ -6877,5 +6877,10 @@ ID объекта: [INSPECTING_KEY]
<string name="FSObjectInventoryElements">[NUM_ELEMENTS] элементов</string>
<string name="OpenSimInventoryValidationErrorGenericHelp">команда поддержки оператора вашей сетки</string>
<string name="Unlimited">Неограниченный</string>
<string name="ListEmpty">Список пуст</string>
<string name="NoValidUUIDs">В импортированном файле не найдено действительных UUID.</string>
<string name="ImportListTooLarge">Слишком много записей. CSV-файл содержит [COUNT] записей, а доступно [MAX] слотов.</string>
<string name="ImportSuccessful">Успешно обработано [COUNT] записей.</string>
</strings>

View File

@ -15,6 +15,10 @@
<check_box label="顯示指導線" name="show_guides" tool_tip="在拍攝範圍內顯示拍攝指導線(例如三分法)。"/>
<button label="更新" name="new_snapshot_btn" tool_tip="點擊更新"/>
<button label="預覽" name="big_preview_btn" tool_tip="點擊切換預覽狀態"/>
<text name="store_label">
發布為:
</text>
<combo_box name="stores_combobox" tool_tip="如果您在Primfeed上分配了一個或多個EasyBloggers商店它們將顯示在這裡。"/>
<text name="description_label">
描述:
</text>