Merge branch 'develop' of https://github.com/secondlife/viewer
# Conflicts: # indra/llrender/llrendertarget.cpp # indra/newview/gltf/asset.cpp # indra/newview/llagentcamera.cpp # indra/newview/lldrawpoolwater.cpp # indra/newview/llstartup.cpp # indra/newview/llviewertexture.cpp # indra/newview/llvoavatar.cpp # indra/newview/llvoicewebrtc.cpp # indra/newview/viewer_manifest.pymaster
commit
b0b8328c5c
|
|
@ -43,7 +43,11 @@ jobs:
|
|||
artifact: Windows-installer
|
||||
install-path: 'C:\viewer-automation-main'
|
||||
- os: windows
|
||||
runner: qa-dan-asus
|
||||
runner: qa-windows-asus-dan
|
||||
artifact: Windows-installer
|
||||
install-path: 'C:\viewer-automation-main'
|
||||
- os: windows
|
||||
runner: qa-windows-z600-dan
|
||||
artifact: Windows-installer
|
||||
install-path: 'C:\viewer-automation-main'
|
||||
- os: mac
|
||||
|
|
|
|||
|
|
@ -497,24 +497,6 @@ U32 LLRenderTarget::getNumTextures() const
|
|||
void LLRenderTarget::bindTexture(U32 index, S32 channel, LLTexUnit::eTextureFilterOptions filter_options)
|
||||
{
|
||||
gGL.getTexUnit(channel)->bindManual(mUsage, getTexture(index), filter_options == LLTexUnit::TFO_TRILINEAR || filter_options == LLTexUnit::TFO_ANISOTROPIC);
|
||||
|
||||
// <FS:Beq> Unused variable warning fix (Macos) none of this code is needed.
|
||||
// bool isSRGB = false;
|
||||
// llassert(mInternalFormat.size() > index);
|
||||
// switch (mInternalFormat[index])
|
||||
// {
|
||||
// case GL_SRGB:
|
||||
// case GL_SRGB8:
|
||||
// case GL_SRGB_ALPHA:
|
||||
// case GL_SRGB8_ALPHA8:
|
||||
// isSRGB = true;
|
||||
// break;
|
||||
|
||||
// default:
|
||||
// break;
|
||||
// }
|
||||
// </FS:Beq>
|
||||
|
||||
gGL.getTexUnit(channel)->setTextureFilteringOption(filter_options);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -2148,7 +2148,7 @@ set(viewer_APPSETTINGS_FILES
|
|||
#app_settings/toolbars.xml FS:AO moved to skins
|
||||
app_settings/trees.xml
|
||||
app_settings/viewerart.xml
|
||||
${CMAKE_SOURCE_DIR}/../etc/message.xml
|
||||
app_settings/message.xml
|
||||
${CMAKE_SOURCE_DIR}/../scripts/messages/message_template.msg
|
||||
packages-info.txt
|
||||
featuretable.txt
|
||||
|
|
@ -2284,7 +2284,7 @@ if (WINDOWS)
|
|||
|
||||
set(COPY_INPUT_DEPENDENCIES
|
||||
# The following commented dependencies are determined at variably at build time. Can't do this here.
|
||||
${CMAKE_SOURCE_DIR}/../etc/message.xml
|
||||
app_settings/message.xml
|
||||
${CMAKE_SOURCE_DIR}/../scripts/messages/message_template.msg
|
||||
#${SHARED_LIB_STAGING_DIR}/openjp2.dll # <FS:Ansariel> Only copy OpenJPEG dll if needed
|
||||
${SHARED_LIB_STAGING_DIR}/llwebrtc.dll
|
||||
|
|
|
|||
|
|
@ -2776,7 +2776,7 @@
|
|||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
<integer>1</integer>
|
||||
</map>
|
||||
<key>ShowDiscordActivityDetails</key>
|
||||
<map>
|
||||
|
|
|
|||
|
|
@ -589,7 +589,7 @@ bool Asset::prep()
|
|||
|
||||
for (U32 variant = 0; variant < LLGLSLShader::NUM_GLTF_VARIANTS; ++variant)
|
||||
{
|
||||
#if SHOW_ASSERT
|
||||
#ifdef SHOW_ASSERT
|
||||
U32 attribute_mask = 0;
|
||||
#endif
|
||||
// for each mesh
|
||||
|
|
@ -609,7 +609,7 @@ bool Asset::prep()
|
|||
|
||||
// all primitives of a given variant and material should all have the same attribute mask
|
||||
llassert(attribute_mask == 0 || primitive.mAttributeMask == attribute_mask);
|
||||
#if SHOW_ASSERT
|
||||
#ifdef SHOW_ASSERT
|
||||
attribute_mask |= primitive.mAttributeMask;
|
||||
#endif
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1903,7 +1903,6 @@ F32 LLAgentCamera::calcCameraFOVZoomFactor()
|
|||
LLVector3d LLAgentCamera::calcCameraPositionTargetGlobal(bool *hit_limit)
|
||||
{
|
||||
// Compute base camera position and look-at points.
|
||||
F32 camera_land_height;
|
||||
LLVector3d frame_center_global = !isAgentAvatarValid() ?
|
||||
gAgent.getPositionGlobal() :
|
||||
gAgent.getPosGlobalFromAgent(getAvatarRootPosition());
|
||||
|
|
@ -2184,19 +2183,11 @@ LLVector3d LLAgentCamera::calcCameraPositionTargetGlobal(bool *hit_limit)
|
|||
}
|
||||
// [/RLVa:KB]
|
||||
|
||||
// <FS:humbletim> FIRE-33613: [OpenSim] [PBR] Camera cannot be located at negative Z
|
||||
F32 camera_ground_plane{ F_ALMOST_ZERO };
|
||||
// integrate OpenSimExtras.MinSimHeight into the camera ground plane calculation
|
||||
if (auto regionp = LLWorld::getInstance()->getRegionFromPosGlobal(camera_position_global))
|
||||
{
|
||||
camera_ground_plane += regionp->getMinSimHeight();
|
||||
}
|
||||
// </FS:humbletim>
|
||||
|
||||
// Don't let camera go underground
|
||||
F32 camera_min_off_ground = getCameraMinOffGround();
|
||||
camera_land_height = LLWorld::getInstance()->resolveLandHeightGlobal(camera_position_global);
|
||||
F32 minZ = llmax(camera_ground_plane, camera_land_height + camera_min_off_ground); // <FS:humbletim/> FIRE-33613: [OpenSim] [PBR] Camera cannot be located at negative Z
|
||||
// Don't let camera go underground if constrained
|
||||
// If not constrained, permit going 1000m below 0, use case: retrieving objects
|
||||
F32 camera_min_off_ground = getCameraMinOffGround(); // checks isDisableCameraConstraints
|
||||
F32 camera_land_height = LLWorld::getInstance()->resolveLandHeightGlobal(camera_position_global);
|
||||
F32 minZ = camera_land_height + camera_min_off_ground;
|
||||
if (camera_position_global.mdV[VZ] < minZ)
|
||||
{
|
||||
camera_position_global.mdV[VZ] = minZ;
|
||||
|
|
|
|||
|
|
@ -6914,100 +6914,21 @@ void LLAppViewer::initDiscordSocial()
|
|||
gDiscordPartyMaxSize = 0;
|
||||
gDiscordTimestampsStart = time(nullptr);
|
||||
gDiscordClient = std::make_shared<discordpp::Client>();
|
||||
gDiscordClient->SetStatusChangedCallback([](discordpp::Client::Status status, discordpp::Client::Error, int32_t) {
|
||||
if (status == discordpp::Client::Status::Ready)
|
||||
{
|
||||
updateDiscordActivity();
|
||||
}
|
||||
});
|
||||
if (gSavedSettings.getBOOL("EnableDiscord"))
|
||||
{
|
||||
auto credential = gSecAPIHandler->loadCredential("Discord");
|
||||
if (credential.notNull())
|
||||
{
|
||||
gDiscordClient->UpdateToken(discordpp::AuthorizationTokenType::Bearer, credential->getAuthenticator()["token"].asString(), [](discordpp::ClientResult result) {
|
||||
if (result.Successful())
|
||||
gDiscordClient->Connect();
|
||||
else
|
||||
LL_WARNS("Discord") << result.Error() << LL_ENDL;
|
||||
});
|
||||
}
|
||||
else
|
||||
{
|
||||
LL_WARNS("Discord") << "Integration was enabled, but no credentials. Disabling integration." << LL_ENDL;
|
||||
gSavedSettings.setBOOL("EnableDiscord", false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void LLAppViewer::toggleDiscordIntegration(const LLSD& value)
|
||||
{
|
||||
static const uint64_t APPLICATION_ID = 1394782217405862001;
|
||||
if (value.asBoolean())
|
||||
{
|
||||
discordpp::AuthorizationArgs args{};
|
||||
args.SetClientId(APPLICATION_ID);
|
||||
args.SetScopes(discordpp::Client::GetDefaultPresenceScopes());
|
||||
auto codeVerifier = gDiscordClient->CreateAuthorizationCodeVerifier();
|
||||
args.SetCodeChallenge(codeVerifier.Challenge());
|
||||
gDiscordClient->Authorize(args, [codeVerifier](auto result, auto code, auto redirectUri) {
|
||||
if (result.Successful())
|
||||
{
|
||||
gDiscordClient->GetToken(APPLICATION_ID, code, codeVerifier.Verifier(), redirectUri, [](discordpp::ClientResult result, std::string accessToken, std::string, discordpp::AuthorizationTokenType, int32_t, std::string) {
|
||||
if (result.Successful())
|
||||
{
|
||||
gDiscordClient->UpdateToken(discordpp::AuthorizationTokenType::Bearer, accessToken, [accessToken](discordpp::ClientResult result) {
|
||||
if (result.Successful())
|
||||
{
|
||||
LLSD authenticator = LLSD::emptyMap();
|
||||
authenticator["token"] = accessToken;
|
||||
gSecAPIHandler->saveCredential(gSecAPIHandler->createCredential("Discord", LLSD::emptyMap(), authenticator), true);
|
||||
gDiscordClient->Connect();
|
||||
}
|
||||
else
|
||||
{
|
||||
LL_WARNS("Discord") << result.Error() << LL_ENDL;
|
||||
}
|
||||
});
|
||||
}
|
||||
else
|
||||
{
|
||||
LL_WARNS("Discord") << result.Error() << LL_ENDL;
|
||||
}
|
||||
});
|
||||
}
|
||||
else
|
||||
{
|
||||
LL_WARNS("Discord") << result.Error() << LL_ENDL;
|
||||
gSavedSettings.setBOOL("EnableDiscord", false);
|
||||
}
|
||||
});
|
||||
}
|
||||
else
|
||||
{
|
||||
gDiscordClient->Disconnect();
|
||||
auto credential = gSecAPIHandler->loadCredential("Discord");
|
||||
if (credential.notNull())
|
||||
{
|
||||
gDiscordClient->RevokeToken(APPLICATION_ID, credential->getAuthenticator()["token"].asString(), [](discordpp::ClientResult result) {
|
||||
if (result.Successful())
|
||||
LL_INFOS("Discord") << "Access token successfully revoked." << LL_ENDL;
|
||||
else
|
||||
LL_WARNS("Discord") << "No access token to revoke." << LL_ENDL;
|
||||
});
|
||||
auto cred = new LLCredential("Discord");
|
||||
gSecAPIHandler->deleteCredential(cred);
|
||||
}
|
||||
else
|
||||
{
|
||||
LL_WARNS("Discord") << "Credentials are already nonexistent." << LL_ENDL;
|
||||
}
|
||||
}
|
||||
gDiscordClient->SetApplicationId(1394782217405862001);
|
||||
updateDiscordActivity();
|
||||
}
|
||||
|
||||
void LLAppViewer::updateDiscordActivity()
|
||||
{
|
||||
LL_PROFILE_ZONE_SCOPED;
|
||||
|
||||
static LLCachedControl<bool> integration_enabled(gSavedSettings, "EnableDiscord", true);
|
||||
if (!integration_enabled)
|
||||
{
|
||||
gDiscordClient->ClearRichPresence();
|
||||
return;
|
||||
}
|
||||
|
||||
discordpp::Activity activity;
|
||||
activity.SetType(discordpp::ActivityTypes::Playing);
|
||||
discordpp::ActivityTimestamps timestamps;
|
||||
|
|
@ -7035,37 +6956,39 @@ void LLAppViewer::updateDiscordActivity()
|
|||
activity.SetDetails(gDiscordActivityDetails);
|
||||
}
|
||||
|
||||
auto agent_pos_region = gAgent.getPositionAgent();
|
||||
S32 pos_x = S32(agent_pos_region.mV[VX] + 0.5f);
|
||||
S32 pos_y = S32(agent_pos_region.mV[VY] + 0.5f);
|
||||
S32 pos_z = S32(agent_pos_region.mV[VZ] + 0.5f);
|
||||
F32 velocity_mag_sq = gAgent.getVelocity().magVecSquared();
|
||||
const F32 FLY_CUTOFF = 6.f;
|
||||
const F32 FLY_CUTOFF_SQ = FLY_CUTOFF * FLY_CUTOFF;
|
||||
const F32 WALK_CUTOFF = 1.5f;
|
||||
const F32 WALK_CUTOFF_SQ = WALK_CUTOFF * WALK_CUTOFF;
|
||||
if (velocity_mag_sq > FLY_CUTOFF_SQ)
|
||||
{
|
||||
pos_x -= pos_x % 4;
|
||||
pos_y -= pos_y % 4;
|
||||
}
|
||||
else if (velocity_mag_sq > WALK_CUTOFF_SQ)
|
||||
{
|
||||
pos_x -= pos_x % 2;
|
||||
pos_y -= pos_y % 2;
|
||||
}
|
||||
|
||||
std::string location = "Hidden Region";
|
||||
static LLCachedControl<bool> show_state(gSavedSettings, "ShowDiscordActivityState", false);
|
||||
if (show_state)
|
||||
{
|
||||
auto agent_pos_region = gAgent.getPositionAgent();
|
||||
S32 pos_x = S32(agent_pos_region.mV[VX] + 0.5f);
|
||||
S32 pos_y = S32(agent_pos_region.mV[VY] + 0.5f);
|
||||
S32 pos_z = S32(agent_pos_region.mV[VZ] + 0.5f);
|
||||
F32 velocity_mag_sq = gAgent.getVelocity().magVecSquared();
|
||||
const F32 FLY_CUTOFF = 6.f;
|
||||
const F32 FLY_CUTOFF_SQ = FLY_CUTOFF * FLY_CUTOFF;
|
||||
const F32 WALK_CUTOFF = 1.5f;
|
||||
const F32 WALK_CUTOFF_SQ = WALK_CUTOFF * WALK_CUTOFF;
|
||||
if (velocity_mag_sq > FLY_CUTOFF_SQ)
|
||||
{
|
||||
pos_x -= pos_x % 4;
|
||||
pos_y -= pos_y % 4;
|
||||
}
|
||||
else if (velocity_mag_sq > WALK_CUTOFF_SQ)
|
||||
{
|
||||
pos_x -= pos_x % 2;
|
||||
pos_y -= pos_y % 2;
|
||||
}
|
||||
auto location = llformat("%s (%d, %d, %d)", gAgent.getRegion()->getName().c_str(), pos_x, pos_y, pos_z);
|
||||
activity.SetState(location);
|
||||
|
||||
discordpp::ActivityParty party;
|
||||
party.SetId(location);
|
||||
party.SetCurrentSize(gDiscordPartyCurrentSize);
|
||||
party.SetMaxSize(gDiscordPartyMaxSize);
|
||||
activity.SetParty(party);
|
||||
location = llformat("%s (%d, %d, %d)", gAgent.getRegion()->getName().c_str(), pos_x, pos_y, pos_z);
|
||||
}
|
||||
activity.SetState(location);
|
||||
|
||||
discordpp::ActivityParty party;
|
||||
party.SetId(location);
|
||||
party.SetCurrentSize(gDiscordPartyCurrentSize);
|
||||
party.SetMaxSize(gDiscordPartyMaxSize);
|
||||
activity.SetParty(party);
|
||||
|
||||
gDiscordClient->UpdateRichPresence(activity, [](discordpp::ClientResult) {});
|
||||
}
|
||||
|
|
|
|||
|
|
@ -254,7 +254,6 @@ public:
|
|||
|
||||
#ifdef LL_DISCORD
|
||||
static void initDiscordSocial();
|
||||
static void toggleDiscordIntegration(const LLSD& value);
|
||||
static void updateDiscordActivity();
|
||||
static void updateDiscordPartyCurrentSize(int32_t size);
|
||||
static void updateDiscordPartyMaxSize(int32_t size);
|
||||
|
|
|
|||
|
|
@ -147,7 +147,6 @@ void LLDrawPoolWater::renderPostDeferred(S32 pass)
|
|||
gGL.setColorMask(true, true);
|
||||
|
||||
LLColor3 light_diffuse(0, 0, 0);
|
||||
//F32 light_exp = 0.0f; // <FS:Ansariel> Remove unused variable
|
||||
|
||||
LLEnvironment& environment = LLEnvironment::instance();
|
||||
LLSettingsWater::ptr_t pwater = environment.getCurrentWater();
|
||||
|
|
@ -183,7 +182,6 @@ void LLDrawPoolWater::renderPostDeferred(S32 pass)
|
|||
// Apply magic numbers translating light direction into intensities
|
||||
light_dir.normalize();
|
||||
F32 ground_proj_sq = light_dir.mV[0] * light_dir.mV[0] + light_dir.mV[1] * light_dir.mV[1];
|
||||
//light_exp = llmax(32.f, 256.f * powf(ground_proj_sq, 16.0f)); // <FS:Ansariel> Remove unused variable
|
||||
if (0.f < light_diffuse.normalize()) // Normalizing a color? Puzzling...
|
||||
{
|
||||
light_diffuse *= (1.5f + (6.f * ground_proj_sq));
|
||||
|
|
|
|||
|
|
@ -551,7 +551,7 @@ LLFloaterPreference::LLFloaterPreference(const LLSD& key)
|
|||
mCommitCallbackRegistrar.add("Pref.DeleteTranscripts", boost::bind(&LLFloaterPreference::onDeleteTranscripts, this));
|
||||
mCommitCallbackRegistrar.add("UpdateFilter", boost::bind(&LLFloaterPreference::onUpdateFilterTerm, this, false)); // <FS:ND/> Hook up for filtering
|
||||
#ifdef LL_DISCORD
|
||||
gSavedSettings.getControl("EnableDiscord")->getCommitSignal()->connect(boost::bind(&LLAppViewer::toggleDiscordIntegration, _2));
|
||||
gSavedSettings.getControl("EnableDiscord")->getCommitSignal()->connect(boost::bind(&LLAppViewer::updateDiscordActivity));
|
||||
gSavedSettings.getControl("ShowDiscordActivityDetails")->getCommitSignal()->connect(boost::bind(&LLAppViewer::updateDiscordActivity));
|
||||
gSavedSettings.getControl("ShowDiscordActivityState")->getCommitSignal()->connect(boost::bind(&LLAppViewer::updateDiscordActivity));
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -396,13 +396,11 @@ void pump_idle_startup_network(void)
|
|||
{
|
||||
// while there are message to process:
|
||||
// process one then call display_startup()
|
||||
// S32 num_messages = 0; // <FS:Beq/> Avoid set-but-unused in Clang
|
||||
{
|
||||
LockMessageChecker lmc(gMessageSystem);
|
||||
while (lmc.checkAllMessages(gFrameCount, gServicePump))
|
||||
{
|
||||
display_startup();
|
||||
// ++num_messages; // <FS:Beq/> Avoid set-but-unused in Clang
|
||||
}
|
||||
lmc.processAcks();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -544,7 +544,6 @@ void LLViewerTexture::updateClass()
|
|||
bool is_low = is_sys_low || over_pct > 0.f;
|
||||
|
||||
static bool was_low = false;
|
||||
//static bool was_sys_low = false; // <FS:Ansariel> Remove unused variable
|
||||
|
||||
if (is_low && !was_low)
|
||||
{
|
||||
|
|
@ -562,7 +561,6 @@ void LLViewerTexture::updateClass()
|
|||
}
|
||||
|
||||
was_low = is_low;
|
||||
//was_sys_low = is_sys_low; // <FS:Ansariel> Remove unused variable
|
||||
|
||||
if (is_low)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -5674,16 +5674,6 @@ bool LLVOAvatar::updateCharacter(LLAgent &agent)
|
|||
}
|
||||
|
||||
bool visible = isVisible();
|
||||
// <FS:Beq> Set but not used
|
||||
// bool is_control_avatar = isControlAvatar(); // capture state to simplify tracing
|
||||
// bool is_attachment = false;
|
||||
|
||||
// if (is_control_avatar)
|
||||
// {
|
||||
// LLControlAvatar *cav = dynamic_cast<LLControlAvatar*>(this);
|
||||
// is_attachment = cav && cav->mRootVolp && cav->mRootVolp->isAttachment(); // For attached animated objects
|
||||
// }
|
||||
// </FS:Beq>
|
||||
|
||||
// For fading out the names above heads, only let the timer
|
||||
// run if we're visible.
|
||||
|
|
|
|||
|
|
@ -2264,7 +2264,6 @@ void LLVoiceWebRTCConnection::processIceUpdatesCoro(connectionPtr_t connection)
|
|||
return;
|
||||
}
|
||||
|
||||
// bool iceCompleted = false; // <FS:Beq/> Set but not used
|
||||
LLSD body;
|
||||
if (!connection->mIceCandidates.empty() || connection->mIceCompleted)
|
||||
{
|
||||
|
|
@ -2303,7 +2302,6 @@ void LLVoiceWebRTCConnection::processIceUpdatesCoro(connectionPtr_t connection)
|
|||
LLSD body_candidate;
|
||||
body_candidate["completed"] = true;
|
||||
body["candidate"] = body_candidate;
|
||||
// iceCompleted = connection->mIceCompleted; // <FS:Beq/> Set but not used
|
||||
connection->mIceCompleted = false;
|
||||
}
|
||||
|
||||
|
|
@ -2928,7 +2926,6 @@ void LLVoiceWebRTCConnection::OnDataReceivedImpl(const std::string &data, bool b
|
|||
return;
|
||||
}
|
||||
boost::json::object voice_data = voice_data_parsed.as_object();
|
||||
// bool new_participant = false; // <FS:Beq/> Set but not used
|
||||
boost::json::object mute;
|
||||
boost::json::object user_gain;
|
||||
for (auto &participant_elem : voice_data)
|
||||
|
|
@ -2981,7 +2978,6 @@ void LLVoiceWebRTCConnection::OnDataReceivedImpl(const std::string &data, bool b
|
|||
}
|
||||
}
|
||||
|
||||
// new_participant |= joined; // <FS:Beq/> Set but not used
|
||||
if (!participant && joined && (primary || !isSpatial()))
|
||||
{
|
||||
participant = LLWebRTCVoiceClient::getInstance()->addParticipantByID(mChannelID, agent_id, mRegionID);
|
||||
|
|
|
|||
|
|
@ -199,6 +199,25 @@ Learn about [https://community.secondlife.com/knowledgebase/joining-and-particip
|
|||
function="People.DelFriend" />
|
||||
</dnd_button>
|
||||
</panel>
|
||||
<slider
|
||||
control_name="NearMeRange"
|
||||
decimal_digits="0"
|
||||
increment="1"
|
||||
follows="left|top"
|
||||
left="5"
|
||||
min_val="0"
|
||||
max_val="4096"
|
||||
label="Range:"
|
||||
name="near_me_range"
|
||||
tool_tip="Nearby people range"
|
||||
width="230"/>
|
||||
<text
|
||||
type="string"
|
||||
follows="left|top"
|
||||
left_delta="225"
|
||||
name="near_me_range_text2">
|
||||
m
|
||||
</text>
|
||||
<layout_stack
|
||||
clip="false"
|
||||
follows="all"
|
||||
|
|
@ -239,7 +258,7 @@ Learn about [https://community.secondlife.com/knowledgebase/joining-and-particip
|
|||
<avatar_list
|
||||
allow_select="true"
|
||||
follows="all"
|
||||
height="211"
|
||||
height="197"
|
||||
ignore_online_status="true"
|
||||
layout="topleft"
|
||||
left="3"
|
||||
|
|
|
|||
|
|
@ -72,7 +72,6 @@ class ViewerManifest(LLManifest,FSViewerManifest):
|
|||
def construct(self):
|
||||
super(ViewerManifest, self).construct()
|
||||
self.path(src="../../scripts/messages/message_template.msg", dst="app_settings/message_template.msg")
|
||||
self.path(src="../../etc/message.xml", dst="app_settings/message.xml")
|
||||
|
||||
# <FS:LO> Copy dictionaries to a place where the viewer can find them if ran from visual studio
|
||||
pkgdir = os.path.join(self.args['build'], os.pardir, 'packages')
|
||||
|
|
|
|||
Loading…
Reference in New Issue