diff --git a/indra/cmake/Copy3rdPartyLibs.cmake b/indra/cmake/Copy3rdPartyLibs.cmake index b408702f045648262e18138e42c628d9d3dbc9e0..ff705101ded51485ee120cc69017823871d68899 100644 --- a/indra/cmake/Copy3rdPartyLibs.cmake +++ b/indra/cmake/Copy3rdPartyLibs.cmake @@ -129,6 +129,7 @@ if(WINDOWS) msvcp${MSVC_VER}.dll msvcr${MSVC_VER}.dll vcruntime${MSVC_VER}.dll + vcruntime${MSVC_VER}_1.dll ) if(EXISTS "${registry_path}/${release_msvc_file}") to_staging_dirs( diff --git a/indra/lib/python/indra/util/llmanifest.py b/indra/lib/python/indra/util/llmanifest.py index 30b722828911625513ae31220e8fcf9ac35e41a4..aedd3b7ee45b9b9f9aface22f929753455faffb4 100755 --- a/indra/lib/python/indra/util/llmanifest.py +++ b/indra/lib/python/indra/util/llmanifest.py @@ -881,6 +881,49 @@ def try_path(src): # particular, let caller notice 0. return count + def path_optional(self, src, dst=None): + sys.stdout.flush() + if src == None: + raise ManifestError("No source file, dst is " + dst) + if dst == None: + dst = src + dst = os.path.join(self.get_dst_prefix(), dst) + sys.stdout.write("Processing %s => %s ... " % (src, self._relative_dst_path(dst))) + + def try_path(src): + # expand globs + count = 0 + if self.wildcard_pattern.search(src): + for s,d in self.expand_globs(src, dst): + assert(s != d) + count += self.process_file(s, d) + else: + # if we're specifying a single path (not a glob), + # we should error out if it doesn't exist + self.check_file_exists(src) + count += self.process_either(src, dst) + return count + + try_prefixes = [self.get_src_prefix(), self.get_artwork_prefix(), self.get_build_prefix()] + for pfx in try_prefixes: + try: + count = try_path(os.path.join(pfx, src)) + except MissingError: + # if we produce MissingError, just try the next prefix + continue + # If we actually found nonzero files, stop looking + if count: + break + else: + sys.stdout.write("Skipping %s\n" % (src)) + return 0 + + print("%d files" % count) + + # Let caller check whether we processed as many files as expected. In + # particular, let caller notice 0. + return count + def do(self, *actions): self.actions = actions self.construct() diff --git a/indra/llmath/lloctree.h b/indra/llmath/lloctree.h index 2283df1e1a9a20336c56eb1d3e8b912b3ad38156..a9a54a8113ec64be5801ce80864b1239dc592a8d 100644 --- a/indra/llmath/lloctree.h +++ b/indra/llmath/lloctree.h @@ -73,7 +73,7 @@ template <class T> class LLOctreeTravelerDepthFirst : public LLOctreeTraveler<T> { public: - virtual void traverse(const LLOctreeNode<T>* node); + virtual void traverse(const LLOctreeNode<T>* node) override; }; template <class T> @@ -696,7 +696,7 @@ class LLOctreeRoot : public LLOctreeNode<T> { } - bool balance() + bool balance() override { //LL_PROFILE_ZONE_NAMED_COLOR("Octree::balance()",OCTREE_DEBUG_COLOR_BALANCE); @@ -732,7 +732,7 @@ class LLOctreeRoot : public LLOctreeNode<T> } // LLOctreeRoot::insert - bool insert(T* data) + bool insert(T* data) override { if (data == NULL) { @@ -835,6 +835,12 @@ class LLOctreeRoot : public LLOctreeNode<T> return false; } + + bool isLeaf() const override + { + // root can't be a leaf + return false; + } }; //======================== diff --git a/indra/llmath/llvolume.cpp b/indra/llmath/llvolume.cpp index 3727ce85afab9d1ab2b99b8ec29eb57d8822829c..5099920f328c6fa1d38870392eabd5d7b1c18d55 100644 --- a/indra/llmath/llvolume.cpp +++ b/indra/llmath/llvolume.cpp @@ -414,7 +414,7 @@ class LLVolumeOctreeRebound : public LLOctreeTravelerDepthFirst<LLVolumeTriangle max.setMax(max, *tri->mV[2]); } } - else if (!branch->isLeaf()) + else if (branch->getChildCount() > 0) { //no data, but child nodes exist LLVolumeOctreeListener* child = (LLVolumeOctreeListener*) branch->getChild(0)->getListener(0); @@ -424,7 +424,7 @@ class LLVolumeOctreeRebound : public LLOctreeTravelerDepthFirst<LLVolumeTriangle } else { - LL_ERRS() << "Empty leaf" << LL_ENDL; + llassert(!branch->isLeaf()); // Empty leaf } for (S32 i = 0; i < branch->getChildCount(); ++i) diff --git a/indra/newview/VIEWER_VERSION.txt b/indra/newview/VIEWER_VERSION.txt index 54358db763fa41582501e9fc9b6729d54ce7d1e2..09a7391e4e373ff475cb5093c88cbbbc7210dc27 100644 --- a/indra/newview/VIEWER_VERSION.txt +++ b/indra/newview/VIEWER_VERSION.txt @@ -1 +1 @@ -6.5.4 +6.6.1 diff --git a/indra/newview/app_settings/shaders/class1/deferred/fullbrightShinyV.glsl b/indra/newview/app_settings/shaders/class1/deferred/fullbrightShinyV.glsl index 2c139430e7eff3a33b6552a5fabc4946bcee7dbc..3bd6b693fa29366e3669769282a95c1a5ada0feb 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/fullbrightShinyV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/fullbrightShinyV.glsl @@ -25,6 +25,7 @@ uniform mat3 normal_matrix; uniform mat4 texture_matrix0; +uniform mat4 texture_matrix1; uniform mat4 modelview_matrix; uniform mat4 modelview_projection_matrix; @@ -71,7 +72,7 @@ void main() vec3 ref = reflect(pos.xyz, -norm); vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy; - vary_texcoord1 = transpose(normal_matrix) * ref.xyz; + vary_texcoord1 = (texture_matrix1 * vec4(ref,1.0)).xyz; calcAtmospherics(pos.xyz); diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightAlphaMaskF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightAlphaMaskF.glsl index 1855cfceeb8c4b277e3fe3142d9a98791c4ecb3a..ad2170bbd3aa3f98f0032c221fd1f1be4cb77078 100644 --- a/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightAlphaMaskF.glsl +++ b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightAlphaMaskF.glsl @@ -50,7 +50,7 @@ void fullbright_lighting() discard; } - color.rgb *= vertex_color.rgb; + color *= vertex_color; color.rgb = pow(color.rgb, vec3(texture_gamma)); diff --git a/indra/newview/app_settings/shaders/class1/objects/fullbrightShinyV.glsl b/indra/newview/app_settings/shaders/class1/objects/fullbrightShinyV.glsl index ace2574ac2aa97463e500b696d58a75330692fe8..891515ab1e2d39537a99161a2f2df8fd50f84439 100644 --- a/indra/newview/app_settings/shaders/class1/objects/fullbrightShinyV.glsl +++ b/indra/newview/app_settings/shaders/class1/objects/fullbrightShinyV.glsl @@ -25,6 +25,7 @@ uniform mat3 normal_matrix; uniform mat4 texture_matrix0; +uniform mat4 texture_matrix1; uniform mat4 modelview_matrix; uniform mat4 modelview_projection_matrix; @@ -70,7 +71,7 @@ void main() vec3 ref = reflect(pos.xyz, -norm); vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy; - vary_texcoord1 = transpose(normal_matrix) * ref; + vary_texcoord1 = (texture_matrix1 * vec4(ref,1.0)).xyz; calcAtmospherics(pos.xyz); diff --git a/indra/newview/app_settings/shaders/class1/objects/shinyV.glsl b/indra/newview/app_settings/shaders/class1/objects/shinyV.glsl index 097e42d2331820b1a77a2bd997a615e4c61c739c..3ad7bcaa50f7bb14f0ccf8cee61ece51c7e53f4b 100644 --- a/indra/newview/app_settings/shaders/class1/objects/shinyV.glsl +++ b/indra/newview/app_settings/shaders/class1/objects/shinyV.glsl @@ -25,6 +25,7 @@ uniform mat3 normal_matrix; uniform mat4 texture_matrix0; +uniform mat4 texture_matrix1; uniform mat4 modelview_matrix; uniform mat4 modelview_projection_matrix; @@ -69,7 +70,7 @@ void main() vec3 ref = reflect(pos.xyz, -norm); vary_texcoord0 = (texture_matrix0*vec4(texcoord0,0,1)).xy; - vary_texcoord1 = transpose(normal_matrix) * ref; + vary_texcoord1 = (texture_matrix1 * vec4(ref,1.0)).xyz; calcAtmospherics(pos.xyz); diff --git a/indra/newview/lldrawpoolbump.cpp b/indra/newview/lldrawpoolbump.cpp index 2892fc6f9f533c3bf2270e48016ad085d7bfdb03..8db6a10e2685a539369219ac4a0f241c64aad1fd 100644 --- a/indra/newview/lldrawpoolbump.cpp +++ b/indra/newview/lldrawpoolbump.cpp @@ -311,6 +311,7 @@ void LLDrawPoolBump::bindCubeMap(LLGLSLShader* shader, S32 shader_level, S32& di shader->uniform4fv(LLViewerShaderMgr::SHINY_ORIGIN, 1, vec4.mV); if (shader_level > 1) { + cube_map->setMatrix(1); // Make sure that texture coord generation happens for tex unit 1, as that's the one we use for // the cube map in the one pass shiny shaders cube_channel = shader->enableTexture(LLViewerShaderMgr::ENVIRONMENT_MAP, LLTexUnit::TT_CUBE_MAP); @@ -319,6 +320,7 @@ void LLDrawPoolBump::bindCubeMap(LLGLSLShader* shader, S32 shader_level, S32& di } else { + cube_map->setMatrix(0); cube_channel = shader->enableTexture(LLViewerShaderMgr::ENVIRONMENT_MAP, LLTexUnit::TT_CUBE_MAP); diffuse_channel = -1; cube_map->enable(cube_channel); @@ -332,6 +334,7 @@ void LLDrawPoolBump::bindCubeMap(LLGLSLShader* shader, S32 shader_level, S32& di diffuse_channel = -1; gGL.getTexUnit(0)->disable(); cube_map->enable(0); + cube_map->setMatrix(0); gGL.getTexUnit(0)->bind(cube_map); } } @@ -390,6 +393,7 @@ void LLDrawPoolBump::unbindCubeMap(LLGLSLShader* shader, S32 shader_level, S32& // Moved below shader->disableTexture call to avoid false alarms from auto-re-enable of textures on stage 0 // MAINT-755 cube_map->disable(); + cube_map->restoreMatrix(); } } @@ -460,6 +464,7 @@ void LLDrawPoolBump::beginFullbrightShiny() LLVector4 vec4(vec, gShinyOrigin.mV[3]); shader->uniform4fv(LLViewerShaderMgr::SHINY_ORIGIN, 1, vec4.mV); + cube_map->setMatrix(1); // Make sure that texture coord generation happens for tex unit 1, as that's the one we use for // the cube map in the one pass shiny shaders gGL.getTexUnit(1)->disable(); @@ -520,6 +525,7 @@ void LLDrawPoolBump::endFullbrightShiny() if( cube_map ) { cube_map->disable(); + cube_map->restoreMatrix(); shader->unbind(); } diff --git a/indra/newview/llface.cpp b/indra/newview/llface.cpp index d1e2b8b93d01deb35e0a7c76d1afd4a2143f610b..d0c26bc43ba1a6bcc9365ba604421b987682cb36 100644 --- a/indra/newview/llface.cpp +++ b/indra/newview/llface.cpp @@ -2377,7 +2377,7 @@ BOOL LLFace::calcPixelArea(F32& cos_angle_to_view_dir, F32& radius) { //override with avatar bounding box LLVOAvatar* avatar = mVObjp->getAvatar(); - if (avatar) + if (avatar && avatar->mDrawable) { center.load3(avatar->getPositionAgent().mV); const LLVector4a* exts = avatar->mDrawable->getSpatialExtents(); diff --git a/indra/newview/llpanelgroupcreate.cpp b/indra/newview/llpanelgroupcreate.cpp index 52be75072cad4104c7ef714451bc890c85312c99..01a4ab0455f0477d5b82ad9eaa532dc074eb9508 100644 --- a/indra/newview/llpanelgroupcreate.cpp +++ b/indra/newview/llpanelgroupcreate.cpp @@ -104,7 +104,7 @@ void LLPanelGroupCreate::onOpen(const LLSD& key) // populate list addMembershipRow("Base"); addMembershipRow("Premium"); - addMembershipRow("Premium Plus"); + addMembershipRow("Premium_Plus"); addMembershipRow("Internal");// Present only if you are already in one, needed for testing S32 cost = LLAgentBenefitsMgr::current().getCreateGroupCost(); diff --git a/indra/newview/llpanelpeople.cpp b/indra/newview/llpanelpeople.cpp index 5997d522c4fac606c25c448089ebda150565ecb6..e424d6b5f53aca781e76df28e7085fbd8e24da66 100644 --- a/indra/newview/llpanelpeople.cpp +++ b/indra/newview/llpanelpeople.cpp @@ -1090,9 +1090,9 @@ void LLPanelPeople::onGroupLimitInfo() args["MAX_BASIC"] = max_basic; args["MAX_PREMIUM"] = max_premium; - if (LLAgentBenefitsMgr::has("Premium Plus")) + if (LLAgentBenefitsMgr::has("Premium_Plus")) { - S32 max_premium_plus = LLAgentBenefitsMgr::get("Premium Plus").getGroupMembershipLimit(); + S32 max_premium_plus = LLAgentBenefitsMgr::get("Premium_Plus").getGroupMembershipLimit(); args["MAX_PREMIUM_PLUS"] = max_premium_plus; LLNotificationsUtil::add("GroupLimitInfoPlus", args); } diff --git a/indra/newview/llspatialpartition.h b/indra/newview/llspatialpartition.h index acfcd63686cde377bb93a6b622e33e23e86a05d6..6d3ef338013d09bbdf5cbdc99e81d945a9ec759d 100644 --- a/indra/newview/llspatialpartition.h +++ b/indra/newview/llspatialpartition.h @@ -255,6 +255,19 @@ class LLSpatialGroup : public LLOcclusionCullingGroup } }; + struct CompareRenderOrder + { + bool operator()(const LLSpatialGroup* const& lhs, const LLSpatialGroup* const& rhs) + { + if (lhs->mAvatarp != rhs->mAvatarp) + { + return lhs->mAvatarp < rhs->mAvatarp; + } + + return lhs->mRenderOrder > rhs->mRenderOrder; + } + }; + typedef enum { GEOM_DIRTY = LLViewerOctreeGroup::INVALID_STATE, @@ -338,6 +351,10 @@ class LLSpatialGroup : public LLOcclusionCullingGroup F32 mPixelArea; F32 mRadius; + + //used by LLVOAVatar to set render order in alpha draw pool to preserve legacy render order behavior + LLVOAvatar* mAvatarp = nullptr; + U32 mRenderOrder = 0; } LL_ALIGN_POSTFIX(64); class LLGeometryManager diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index 6c074dfa08ea704d4428c108da89dbefa928334b..5aec579fd8b6bbac6c82bbb5a4b9ebacf92b2d84 100644 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -3337,12 +3337,6 @@ bool init_benefits(LLSD& response) succ = false; } - // FIXME PREMIUM - for testing if login does not yet provide Premium Plus. Should be removed thereafter. - //if (succ && !LLAgentBenefitsMgr::has("Premium Plus")) - //{ - // LLAgentBenefitsMgr::init("Premium Plus", packages_sd["Premium"]["benefits"]); - // llassert(LLAgentBenefitsMgr::has("Premium Plus")); - //} return succ; } diff --git a/indra/newview/llvieweroctree.cpp b/indra/newview/llvieweroctree.cpp index 87e296012d3249fab20fca7249d274761afb02a6..12624ec3a20ed3dd626541fefc83b5ea4cf51e11 100644 --- a/indra/newview/llvieweroctree.cpp +++ b/indra/newview/llvieweroctree.cpp @@ -564,7 +564,7 @@ void LLViewerOctreeGroup::rebound() group->setState(SKIP_FRUSTUM_CHECK); } - else if (mOctreeNode->isLeaf()) + else if (mOctreeNode->getChildCount() == 0) { //copy object bounding box if this is a leaf boundObjects(TRUE, mExtents[0], mExtents[1]); mBounds[0] = mObjectBounds[0]; diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index 625fdf1977e143c8d28c519e0931a4a796ae7f43..f0c379f1ae7e1b8b8459bf74389b500b58405f5e 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -2813,6 +2813,7 @@ void LLVOAvatar::idleUpdateMisc(bool detailed_update) // update attachments positions if (detailed_update) { + U32 draw_order = 0; for (attachment_map_t::iterator iter = mAttachmentPoints.begin(); iter != mAttachmentPoints.end(); ++iter) @@ -2851,9 +2852,17 @@ void LLVOAvatar::idleUpdateMisc(bool detailed_update) } } - - attached_object->mDrawable->makeActive(); - attached_object->mDrawable->updateXform(TRUE); + // if selecting any attachments, update all of them as non-damped + if (LLSelectMgr::getInstance()->getSelection()->getObjectCount() && LLSelectMgr::getInstance()->getSelection()->isAttachment()) + { + gPipeline.updateMoveNormalAsync(attached_object->mDrawable); + } + else + { + // Note: SL-17415; While most objects follow joints, + // some objects get position updates from server + gPipeline.updateMoveDampedAsync(attached_object->mDrawable); + } // override_bbox calls movePartition() and getSpatialPartition(), // so bridge might no longer be valid, get it again. @@ -2871,6 +2880,13 @@ void LLVOAvatar::idleUpdateMisc(bool detailed_update) bridge->setState(LLDrawable::MOVE_UNDAMPED); bridge->updateMove(); bridge->setState(LLDrawable::EARLY_MOVE); + + LLSpatialGroup* group = attached_object->mDrawable->getSpatialGroup(); + if (group) + { //set draw order of group + group->mAvatarp = this; + group->mRenderOrder = draw_order++; + } } } diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index 545fe9642ad3f51aca6c9d538127e71abd2e044a..ee1f8eba9ceafe28838ccf689f810bc0283738a4 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -3883,7 +3883,11 @@ void LLPipeline::postSort(LLCamera& camera) if (!sShadowRender) { + // order alpha groups by distance std::sort(sCull->beginAlphaGroups(), sCull->endAlphaGroups(), LLSpatialGroup::CompareDepthGreater()); + + // order rigged alpha groups by avatar attachment order + std::sort(sCull->beginRiggedAlphaGroups(), sCull->endRiggedAlphaGroups(), LLSpatialGroup::CompareRenderOrder()); } LL_PUSH_CALLSTACKS(); diff --git a/indra/newview/skins/default/xui/de/strings.xml b/indra/newview/skins/default/xui/de/strings.xml index f021e03dc759bd14927c9e0fe9ab73224d7045b4..ba26f721fe57b4323d7fb7964f2429ee87ca429b 100644 --- a/indra/newview/skins/default/xui/de/strings.xml +++ b/indra/newview/skins/default/xui/de/strings.xml @@ -5101,7 +5101,7 @@ Bitte überprüfen Sie http://status.secondlifegrid.net, um herauszufinden, ob e <string name="PremiumMembership"> Premium </string> - <string name="Premium PlusMembership"> + <string name="Premium_PlusMembership"> Premium Plus </string> <string name="DeleteItems"> diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml index 6ad49764103d4be9785d79ad1010ff6e418d53f6..be9ea71f4c69a3b344766edb9f6f2704d2463001 100644 --- a/indra/newview/skins/default/xui/en/strings.xml +++ b/indra/newview/skins/default/xui/en/strings.xml @@ -3964,7 +3964,7 @@ Please check http://status.secondlifegrid.net to see if there is a known problem <!-- SL Membership --> <string name="BaseMembership">Base</string> <string name="PremiumMembership">Premium</string> - <string name="Premium PlusMembership">Premium Plus</string> + <string name="Premium_PlusMembership">Premium Plus</string> <string name="InternalMembership">Internal</string> <!-- No need to translate --> <string name="MembershipUpgradeText">Upgrade to Premium</string> diff --git a/indra/newview/skins/default/xui/fr/strings.xml b/indra/newview/skins/default/xui/fr/strings.xml index 9fde703d6cd3ed105ffd77b4548f32ce9eb7b7a8..f7545f08d2a11b08a9c56d8cc3b7fad25c2ac2d1 100644 --- a/indra/newview/skins/default/xui/fr/strings.xml +++ b/indra/newview/skins/default/xui/fr/strings.xml @@ -5102,7 +5102,7 @@ Veuillez vous reporter à http://status.secondlifegrid.net afin de déterminer s <string name="PremiumMembership"> Premium </string> - <string name="Premium PlusMembership"> + <string name="Premium_PlusMembership"> Premium Plus </string> <string name="DeleteItems"> diff --git a/indra/newview/skins/default/xui/it/strings.xml b/indra/newview/skins/default/xui/it/strings.xml index 3049828f46e05f0855ce6cb724ed5b10f3542825..7690e02692673df139e0a1892983511366d10f0c 100644 --- a/indra/newview/skins/default/xui/it/strings.xml +++ b/indra/newview/skins/default/xui/it/strings.xml @@ -5017,7 +5017,7 @@ Consulta la pagina http://status.secondlifegrid.net per determinare se il proble <string name="PremiumMembership"> Premium </string> - <string name="Premium PlusMembership"> + <string name="Premium_PlusMembership"> Premium Plus </string> <string name="DeleteItems"> diff --git a/indra/newview/skins/default/xui/ja/strings.xml b/indra/newview/skins/default/xui/ja/strings.xml index dcd6e65d34a871ac729f807b972b215141cdb517..b4bc36a80090de5d44d58e25ab5ec13e8aa16d9f 100644 --- a/indra/newview/skins/default/xui/ja/strings.xml +++ b/indra/newview/skins/default/xui/ja/strings.xml @@ -5100,7 +5100,7 @@ www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンãƒãƒ¼ãƒ‰ã—ã¦ãã <string name="PremiumMembership"> プレミアム</string> - <string name="Premium PlusMembership"> + <string name="Premium_PlusMembership"> プレミアムプラス </string> <string name="DeleteItems"> diff --git a/indra/newview/skins/default/xui/ru/strings.xml b/indra/newview/skins/default/xui/ru/strings.xml index 43a87b2b1863fa3ce993078074441845ee837e41..ee2dcfe9ccb296c717b4e997331a46385ba91d76 100644 --- a/indra/newview/skins/default/xui/ru/strings.xml +++ b/indra/newview/skins/default/xui/ru/strings.xml @@ -5096,7 +5096,7 @@ support@secondlife.com. <string name="PremiumMembership"> Премиум </string> - <string name="Premium PlusMembership"> + <string name="Premium_PlusMembership"> Премиум ÐŸÐ»ÑŽÑ </string> <string name="DeleteItems"> diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 76160b73ba978e4f8e9b88a30c219843e0174e61..de5ac5ed3da126099e5e37df294ee632d7c2f175 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -527,6 +527,7 @@ def construct(self): # See http://msdn.microsoft.com/en-us/library/ms235291(VS.80).aspx self.path("msvcp140.dll") self.path("vcruntime140.dll") + self.path_optional("vcruntime140_1.dll") # SLVoice executable with self.prefix(src=os.path.join(pkgdir, 'bin', 'release')): @@ -604,6 +605,7 @@ def construct(self): 'sharedlibs', 'Release')): self.path("msvcp140.dll") self.path("vcruntime140.dll") + self.path_optional("vcruntime140_1.dll") # CEF files common to all configurations with self.prefix(src=os.path.join(pkgdir, 'resources')):