diff --git a/.github/workflows/build_viewer.yml b/.github/workflows/build_viewer.yml
index 3b45984df8..1671216199 100644
--- a/.github/workflows/build_viewer.yml
+++ b/.github/workflows/build_viewer.yml
@@ -9,11 +9,11 @@ jobs:
build_matrix:
strategy:
matrix:
- os: [macos-10.15,ubuntu-18.04,windows-2022]
+ os: [macos-10.15,ubuntu-20.04,windows-2022]
grid: [sl,os]
addrsize: [64,32]
exclude:
- - os: ubuntu-18.04
+ - os: ubuntu-20.04
addrsize: 32
- os: macos-10.15
addrsize: 32
@@ -27,21 +27,29 @@ jobs:
python-version: '3.11'
cache: 'pip'
- run: pip3 install -r requirements.txt
+
- name: Check python version
run: python -V
- - name: Checkout build var
- uses: actions/checkout@v3
- with:
- repository: FirestormViewer/fs-build-variables
- path: build-variables
+
+ - name: Install Bash 4 and GNU sed on Mac
+ if: runner.os == 'macOS'
+ run: |
+ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
+ brew update
+
+ brew install bash
+ brew install gnu-sed
+
+ echo "/usr/local/bin" >> $GITHUB_PATH
+ echo "$(brew --prefix)/opt/gnu-sed/libexec/gnubin" >> $GITHUB_PATH
+
- name: Setup rclone and download the folder
uses: beqjanus/setup-rclone@main
with:
rclone_config: ${{ secrets.RCLONE_CONFIG }}
- - name: Set OS flag
- if: matrix.grid == 'os'
- run: echo "FS_GRID=-DOPENSIM:BOOL=ON" >> $GITHUB_ENV
+ - name: Set OS/SL flags
+ run: echo "FS_GRID=-DOPENSIM:BOOL=$([ "${{ matrix.grid }}" == "os" ] && echo "ON" || echo "OFF") -DHAVOK_TPV:BOOL=$([ "${{ matrix.grid }}" == "sl" ] && echo "ON" || echo "OFF")" >> $GITHUB_ENV
shell: bash
- name: find channel from Branch name
@@ -57,46 +65,39 @@ jobs:
echo "FS_RELEASE_CHAN=\"${FS_RELEASE_CHAN}\"" >> $GITHUB_ENV
echo "Building for channel ${FS_RELEASE_CHAN}"
shell: bash
-
- # - name: Set channel name
- # if: matrix.addrsize == '64'
- # run: echo "FS_RELEASE_CHAN=Releasex64" >> $GITHUB_ENV
- # shell: bash
-
- # - name: Set channel name for 32 bit
- # if: matrix.addrsize == '32'
- # shell: bash
-
- - name: Set SL flag
- if: matrix.grid == 'sl'
- run: echo "FS_GRID=-DOPENSIM:BOOL=OFF -DHAVOK_TPV:BOOL=ON" >> $GITHUB_ENV
- shell: bash
- name: Get the code
uses: actions/checkout@v3
with:
fetch-depth: 0
- - name: Checkout build var
+ - name: Checkout build vars (after the main code)
uses: actions/checkout@v3
with:
repository: FirestormViewer/fs-build-variables
path: build-variables
- - name: rclone the private 3p packages on Windows
- if: runner.os == 'Windows'
- run: 'rclone copy fs_bundles: --include "*windows*bz2" .'
- - name: rclone the private 3p packages on MacOS
- if: runner.os == 'MacOS'
- run: 'rclone copy fs_bundles: --include "*darwin*bz2" .'
- - name: rclone the private 3p packages on Linux
- if: runner.os == 'Linux'
- run: 'rclone copy fs_bundles: --include "*linux*bz2" .'
+ - name: Define platform variable(s)
+ run: |
+ declare -A os_map
+ os_map=( ["Windows"]="windows" ["Linux"]="linux" ["macOS"]="darwin" )
+ platform="${os_map[${{ runner.os}}]}"
+ echo "fallback_platform=${platform}" >> $GITHUB_ENV
+ if [ ${{ matrix.addrsize }} -ne 32 ];
+ then
+ platform+=${{ matrix.addrsize }}
+ fi
+ echo "platform=${platform}" >> $GITHUB_ENV
+ shell: bash
+
+ - name: rclone the private 3p packages for this platform (both 64 & 32)
+ run: 'rclone copy fs_bundles: --include "*${{ env.fallback_platform }}*bz2" .'
- name: set VSVER for Windows builds
if: runner.os == 'Windows'
run: echo "AUTOBUILD_VSVER=170" >> $GITHUB_ENV
shell: bash
+
- name: Install certificate
if: runner.os == 'macOS'
env:
@@ -115,48 +116,57 @@ jobs:
security import ${build_secrets_checkout}/code-signing-osx/fs-cert.p12 -P "$FS_CERT_PASS" -A -t cert -f pkcs12 -k ~/Library/Keychains/viewer.keychain
security set-key-partition-list -S apple-tool:,apple:, -s -k "$FS_KEYCHAIN_PASS" -t private ~/Library/Keychains/viewer.keychain
security list-keychain -d user -s ~/Library/Keychains/viewer.keychain
+
- name: Install required Ubuntu packages
if: runner.os == 'Linux'
- run: sudo apt-get install python3-setuptools mesa-common-dev libgl1-mesa-dev libxinerama-dev libxrandr-dev libpulse-dev libglu1-mesa-dev
- - name: install autobuild
- run: pip3 install git+https://github.com/Nicky-D/autobuild@main_nd
-
- - name: install autobuild
- run: pip3 install llbase
-
- - name: edit installables (64 bit)
- if: runner.os == 'Windows' && matrix.addrsize == 64
run: |
- autobuild installables edit llphysicsextensions_tpv platform=windows${{matrix.addrsize}} url='file:///\${{ github.workspace }}\llphysicsextensions_tpv-1.0.571939-windows${{matrix.addrsize}}-571939.tar.bz2'
- autobuild installables edit fmodstudio platform=windows${{matrix.addrsize}} url='file:///\${{ github.workspace }}\fmodstudio-2.02.09-windows${{matrix.addrsize}}-222890941.tar.bz2'
- shell: bash
+ dependencies=("python3-setuptools" "mesa-common-dev" "libgl1-mesa-dev" "libxinerama-dev" "libxrandr-dev" "libpulse-dev" "libglu1-mesa-dev" "libfreetype6-dev" "libfontconfig1")
+ sudo apt-get update
+ sudo apt-get install -y "${dependencies[@]}"
- - name: edit installables (32 bit)
- if: runner.os == 'Windows' && matrix.addrsize == 32
+ - name: test macOS bundles are present
+ if: runner.os == 'MacOS'
run: |
- autobuild installables edit llphysicsextensions_tpv platform=windows url='file:///\${{ github.workspace }}\llphysicsextensions_tpv-1.0.571939-windows-571939.tar.bz2'
- autobuild installables edit fmodstudio platform=windows url='file:///\${{ github.workspace }}\fmodstudio-2.02.09-windows-222890940.tar.bz2'
- shell: bash
-
- - name: edit installables (32/64 agnostic)
- if: runner.os == 'Windows'
- run: |
- autobuild installables edit kdu platform=windows url='file:///\${{ github.workspace }}\kdu-8.2-windows-212351246.tar.bz2'
- shell: bash
-
- - name: edit installables
- if: runner.os == 'macOS'
- run: |
- autobuild installables edit llphysicsextensions_tpv platform=darwin${{matrix.addrsize}} url='file:////${{ github.workspace }}/llphysicsextensions_tpv-1.0.571939-darwin${{matrix.addrsize}}-571939.tar.bz2'
- autobuild installables edit kdu platform=darwin url='file:////${{ github.workspace }}/kdu-8.2-darwin-212431232.tar.bz2'
- autobuild installables --debug edit fmodstudio platform=darwin${{matrix.addrsize}} url='file:////${{ github.workspace }}/fmodstudio-2.02.09-darwin${{matrix.addrsize}}-5.tar.bz2'
+ dirlisting="$(ls -l ${{ github.workspace }}${path_sep}${pattern})"
+ echo "${dirlisting}"
shell: bash
- name: edit installables
- if: runner.os == 'Linux'
run: |
- autobuild installables edit kdu platform=linux${{matrix.addrsize}} url='file:////${{ github.workspace }}/kdu-8.2-linux${{matrix.addrsize}}_bionic-220911445.tar.bz2'
- autobuild installables edit fmodstudio platform=linux${{matrix.addrsize}} url='file:////${{ github.workspace }}/fmodstudio-2.02.09-linux${{matrix.addrsize}}-222891103.tar.bz2'
+ path_sep="/"
+ if [[ "${{ runner.os }}" == "Windows" ]]; then
+ path_sep="\\"
+ fi
+ function find_most_recent_bundle() {
+ local pattern="$1.*$2.*"
+ local most_recent_file=$(ls -t "${{ github.workspace }}" | grep "$pattern" | head -1)
+ if [ -z "$most_recent_file" ]; then
+ echo ""
+ else
+ echo "$most_recent_file"
+ fi
+ }
+ packages=("fmodstudio" "llphysicsextensions_tpv" "kdu")
+ for package in "${packages[@]}"; do
+ package_file=$(find_most_recent_bundle $package ${{ env.platform }})
+ full_package_path="${{ github.workspace }}${path_sep}${package_file}"
+ if [ -n "$package_file" ]; then
+ echo "Installing ${package_file}"
+ autobuild installables remove ${package}
+ autobuild installables add ${package} platform=${{ env.platform }} url="file:///${full_package_path}"
+ else
+ echo "No bundle found for ${package} on ${{ env.platform }}"
+ package_file=$(find_most_recent_bundle $package ${{ env.fallback_platform }})
+ full_package_path="${{ github.workspace }}${path_sep}${package_file}"
+ if [ -n "$package_file" ]; then
+ echo "Installing ${package_file}"
+ autobuild installables remove ${package}
+ autobuild installables add ${package} platform=${{ env.fallback_platform }} url="file:///${full_package_path}"
+ else
+ echo "No bundle found for ${package} on ${{ env.fallback_platform }}. Package will not be available for build."
+ fi
+ fi
+ done
shell: bash
- name: Configure
diff --git a/indra/llui/lluicolortable.cpp b/indra/llui/lluicolortable.cpp
index 2503d391f0..d44c932b1f 100644
--- a/indra/llui/lluicolortable.cpp
+++ b/indra/llui/lluicolortable.cpp
@@ -163,7 +163,7 @@ void LLUIColorTable::insertFromParams(const Params& p, string_color_map_t& table
iter != visited_refs.end();
++iter)
{
- LL_WARNS() << iter->first << " references a non-existent color" << LL_ENDL;
+ LL_WARNS() << iter->first << " references a non-existent color: " << iter->second->second << LL_ENDL;
unresolved_refs.erase(iter->second);
}
diff --git a/indra/newview/llinventoryfunctions.cpp b/indra/newview/llinventoryfunctions.cpp
index 4c0b285193..579279d1d8 100644
--- a/indra/newview/llinventoryfunctions.cpp
+++ b/indra/newview/llinventoryfunctions.cpp
@@ -2994,6 +2994,18 @@ void LLInventoryAction::doToSelected(LLInventoryModel* model, LLFolderView* root
{
return;
}
+
+ // FIRE-32736: Add confirmation before ungrouping folder
+ LLSD args;
+ args["FOLDER_NAME"] = inv_cat->getName();
+ LLNotificationsUtil::add("UngroupFolder", args, LLSD(),
+ [inv_cat](const LLSD& notification, const LLSD& response)
+ {
+ S32 opt = LLNotificationsUtil::getSelectedOption(notification, response);
+ if (opt == 1)
+ return;
+ //
+
const LLUUID &new_cat_uuid = inv_cat->getParentUUID();
LLInventoryModel::cat_array_t* cat_array;
LLInventoryModel::item_array_t* item_array;
@@ -3019,6 +3031,9 @@ void LLInventoryAction::doToSelected(LLInventoryModel* model, LLFolderView* root
}
gInventory.removeCategory(inv_cat->getUUID());
gInventory.notifyObservers();
+
+ }); // FIRE-32736: Add confirmation before ungrouping folder
+
}
}
// FIRE-22851: Show texture "Save as" file picker subsequently instead all at once
diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp
index df2b819432..4627d83934 100644
--- a/indra/newview/llvovolume.cpp
+++ b/indra/newview/llvovolume.cpp
@@ -5740,7 +5740,7 @@ void LLVolumeGeometryManager::registerFace(LLSpatialGroup* group, LLFace* facep,
}
}
- if (type == LLRenderPass::PASS_ALPHA)
+ // if (type == LLRenderPass::PASS_ALPHA) // always populate the draw_info ptr
{ //for alpha sorting
facep->setDrawInfo(draw_info);
}
diff --git a/indra/newview/skins/default/colors.xml b/indra/newview/skins/default/colors.xml
index 9049f45373..ef0eeab305 100644
--- a/indra/newview/skins/default/colors.xml
+++ b/indra/newview/skins/default/colors.xml
@@ -262,7 +262,9 @@
-
+
diff --git a/indra/newview/skins/default/xui/de/notifications.xml b/indra/newview/skins/default/xui/de/notifications.xml
index 5dbb244abf..48d68d4b07 100644
--- a/indra/newview/skins/default/xui/de/notifications.xml
+++ b/indra/newview/skins/default/xui/de/notifications.xml
@@ -5646,4 +5646,8 @@ URL auf Standard zurücksetzen?
[SOURCES]
+
+ Gruppierung durch den Ordner „[FOLDER_NAME]“ aufheben?
+
+
diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml
index c05bdd9574..265e10cfd0 100644
--- a/indra/newview/skins/default/xui/en/notifications.xml
+++ b/indra/newview/skins/default/xui/en/notifications.xml
@@ -14049,4 +14049,18 @@ Camera reset might be inhibited by the following objects:
[SOURCES]
+
+
+ Ungroup the folder "[FOLDER_NAME]"?
+ confirm
+
+
+
diff --git a/indra/newview/skins/default/xui/fr/notifications.xml b/indra/newview/skins/default/xui/fr/notifications.xml
index aa081f0967..48a86dbc64 100644
--- a/indra/newview/skins/default/xui/fr/notifications.xml
+++ b/indra/newview/skins/default/xui/fr/notifications.xml
@@ -1897,7 +1897,7 @@ jusqu'à [MAX_PREMIUM_PLUS]. [https://secondlife.com/my/account/membership.php?
- Éjecter tous les résidents actuellement en ligne avec quel message ?
+ Avec quel message éjecter tous les résidents actuellement en ligne ?
- Le chat vocal est interdit dans cette zone. Vous n'entendrez personne parler.
+ Les appels vocaux sont interdits dans cette zone. Vous n'entendrez personne parler.
La construction est interdite dans cette zone. Vous ne pouvez pas construite ou rezzer d'objets ici.
@@ -5415,4 +5415,8 @@ La réinitialisation de la caméra peut être empêchée par les objets suivants
[SOURCES]
+
+ Dégrouper le dossier "[FOLDER_NAME]" ?
+
+
diff --git a/indra/newview/skins/default/xui/pl/notifications.xml b/indra/newview/skins/default/xui/pl/notifications.xml
index 9fdeeb52b5..299ec43fae 100644
--- a/indra/newview/skins/default/xui/pl/notifications.xml
+++ b/indra/newview/skins/default/xui/pl/notifications.xml
@@ -5215,4 +5215,8 @@ Zresetować adres URL do domyślnego?
[SOURCES]
+
+ Rozgrupować folder "[FOLDER_NAME]"?
+
+
diff --git a/indra/newview/skins/default/xui/ru/notifications.xml b/indra/newview/skins/default/xui/ru/notifications.xml
index acdbdc4016..580eeb3915 100644
--- a/indra/newview/skins/default/xui/ru/notifications.xml
+++ b/indra/newview/skins/default/xui/ru/notifications.xml
@@ -5331,4 +5331,8 @@ https://wiki.firestormviewer.org/fs_voice
[SOURCES]
+
+ Разгруппировать папку "[FOLDER_NAME]"?
+
+
diff --git a/indra/newview/vjlocalmesh.cpp b/indra/newview/vjlocalmesh.cpp
index 70e87b31b4..656525e0ab 100644
--- a/indra/newview/vjlocalmesh.cpp
+++ b/indra/newview/vjlocalmesh.cpp
@@ -113,8 +113,8 @@ void LLLocalMeshObject::computeObjectBoundingBox()
// process any additional faces
for (size_t face_iter = 1; face_iter < lod3_faces.size(); ++face_iter)
{
- auto& current_bbox_min = lod3_faces[face_iter]->getFaceBoundingBox().first;
- auto& current_bbox_max = lod3_faces[face_iter]->getFaceBoundingBox().second;
+ const auto& [current_bbox_min, current_bbox_max] = lod3_faces[face_iter]->getFaceBoundingBox();
+
for (size_t array_iter = 0; array_iter < 4; ++array_iter)
{
@@ -130,30 +130,30 @@ void LLLocalMeshObject::computeObjectTransform(const LLMatrix4& scene_transform)
// most things here were tactfully stolen from LLModel::normalizeVolumeFaces()
// translation of bounding box to origin
+ // We will use this to centre the object at the origin (hence the -ve 1/2)
mObjectTranslation = mObjectBoundingBox.first;
mObjectTranslation += mObjectBoundingBox.second;
mObjectTranslation *= -0.5f;
- // actual bounding box size
- mObjectSize = mObjectBoundingBox.second;
- mObjectSize -= mObjectBoundingBox.first;
+ // actual bounding box size (max-min)
+ mObjectSize = mObjectBoundingBox.second - mObjectBoundingBox.first;
- // make sure all axes of mObjectSize are non zero
- for (auto& axis_size : mObjectSize.mV)
+ // make sure all axes of mObjectSize are non zero (don't adjust the 4th dim)
+ for ( int i=0; i <3; i++ )
{
+ auto& axis_size = mObjectSize[i];
// set size of 1.0 if < F_APPROXIMATELY_ZERO
if (axis_size <= F_APPROXIMATELY_ZERO)
{
axis_size = 1.0f;
}
}
- // bounding box scale in a 1Mx3 cube
- mObjectScale.set(1.f, 1.f, 1.f);
+ // object scale is the inverse of the object size
+ mObjectScale.set(1.f, 1.f, 1.f,1.f);
for (int vec_iter = 0; vec_iter < 4; ++vec_iter)
{
- mObjectScale.mV[vec_iter] = mObjectScale.mV[vec_iter] / mObjectSize.mV[vec_iter];
- }
-
+ mObjectScale[vec_iter] /= mObjectSize[vec_iter];
+ }
}
void LLLocalMeshObject::normalizeFaceValues(LLLocalMeshFileLOD lod_iter)
@@ -172,15 +172,18 @@ void LLLocalMeshObject::normalizeFaceValues(LLLocalMeshFileLOD lod_iter)
// process current lod
for (auto& current_face : lod_faces)
{
- // first transform the bounding boxes
+ // first transform the bounding boxes ro be centred at 0,0,0
auto& current_submesh_bbox = current_face->getFaceBoundingBox();
current_submesh_bbox.first += mObjectTranslation;
current_submesh_bbox.second += mObjectTranslation;
+
+ LL_INFOS("LocalMesh") << "before squish:" << current_submesh_bbox.first << " " << current_submesh_bbox.second << LL_ENDL;
for (int vec_iter = 0; vec_iter < 4; ++vec_iter)
{
current_submesh_bbox.first.mV[vec_iter] *= mObjectScale.mV[vec_iter];
current_submesh_bbox.second.mV[vec_iter] *= mObjectScale.mV[vec_iter];
}
+ LL_INFOS("LocalMesh") << "after squish:" << current_submesh_bbox.first << " " << current_submesh_bbox.second << LL_ENDL;
// then transform the positions
auto& current_face_positions = current_face->getPositions();
@@ -309,13 +312,18 @@ void LLLocalMeshObject::attachSkinInfo()
auto skinmap_seeker = gMeshRepo.mSkinMap.find(mSculptID);
if (skinmap_seeker == gMeshRepo.mSkinMap.end())
{
- gMeshRepo.mSkinMap[mSculptID] = &mMeshSkinInfo;
+ // Not found create it
+ mMeshSkinInfoPtr->mMeshID = mSculptID;
+ gMeshRepo.mSkinMap[mSculptID] = mMeshSkinInfoPtr;
+ LL_INFOS("LocalMesh") << "Skinmap entry for UUID " << mSculptID << " created with " << std::hex << std::showbase << (void *)mMeshSkinInfoPtr << LL_ENDL;
}
else
{
- // NOTE: seems necessary, not tested without.
- skinmap_seeker->second = &mMeshSkinInfo;
+ // found but we will update it to ours
+ LL_INFOS("LocalMesh") << "Skinmap entry for UUID " << mSculptID << " updated from " << std::hex << std::showbase << (void *)skinmap_seeker->second << " to " << (void *)mMeshSkinInfoPtr << LL_ENDL;
+ skinmap_seeker->second = mMeshSkinInfoPtr;
}
+
}
bool LLLocalMeshObject::getIsRiggedObject() const
@@ -326,6 +334,7 @@ bool LLLocalMeshObject::getIsRiggedObject() const
// main lod isn't empty
if (!main_lod_faces.empty())
{
+ LL_INFOS("LocalMesh") << "Main lod is not empty" << LL_ENDL;
auto& skin = main_lod_faces[0]->getSkin();
if (!skin.empty())
{
@@ -750,22 +759,39 @@ void LLLocalMeshFile::applyToVObject(LLUUID viewer_object_id, int object_index,
auto current_lod = static_cast(lod_reverse_iter);
mLoadedObjectList[object_index]->fillVolume(current_lod);
+ LL_INFOS("LocalMesh") << "Loaded LOD " << current_lod << LL_ENDL;
}
-
+ LL_INFOS("LocalMesh") << "Loaded Object " << object_index << LL_ENDL;
if (mLoadedObjectList[object_index]->getIsRiggedObject())
{
+ LL_INFOS("LocalMesh") << "Object " << object_index << " is rigged" << LL_ENDL;
mLoadedObjectList[object_index]->attachSkinInfo();
+ target_object->notifySkinInfoLoaded(mLoadedObjectList[object_index]->getObjectMeshSkinInfo());
}
if ((!target_object->isAttachment()) && use_scale)
{
+ LL_INFOS("LocalMesh") << "Object " << object_index << " is not attachment" << LL_ENDL;
auto scale = mLoadedObjectList[object_index]->getObjectSize();
target_object->setScale(LLVector3(scale), false);
}
// force refresh (selected/edit mode won't let it redraw otherwise)
- gPipeline.markRebuild(target_object->mDrawable, LLDrawable::REBUILD_VOLUME, FALSE);
+ auto& target_drawable = target_object->mDrawable;
+
+ if( target_drawable.notNull() )
+ {
+ target_object->markForUpdate(true);
+ // target_drawable->updateSpatialExtents();
+ // target_drawable->movePartition();
+ gPipeline.markRebuild(target_drawable, LLDrawable::REBUILD_ALL, true);
+ if(auto floater_ptr = LLLocalMeshSystem::getInstance()->getFloaterPointer(); floater_ptr != nullptr)
+ {
+ floater_ptr->toggleSelectTool(false);
+ }
+ }
// NOTE: this ^^ (or lod change) causes renderer crash on mesh with degenerate primitives.
+ LL_INFOS("LocalMesh") << "Object " << object_index << " marked for rebuild" << LL_ENDL;
}
void LLLocalMeshFile::pushLog(const std::string& who, const std::string& what, bool is_error)
diff --git a/indra/newview/vjlocalmesh.h b/indra/newview/vjlocalmesh.h
index aa4ce2e8ee..28b294b9a1 100644
--- a/indra/newview/vjlocalmesh.h
+++ b/indra/newview/vjlocalmesh.h
@@ -107,13 +107,14 @@ class LLLocalMeshObject
// getters
std::vector>& getFaces(LLLocalMeshFileLOD lod) { return mFaces[lod]; };
std::pair& getObjectBoundingBox() { return mObjectBoundingBox; };
- LLVector4 getObjectTranslation() const { return mObjectTranslation; };
- std::string getObjectName() const { return mObjectName; };
- LLVector4 getObjectSize() const { return mObjectSize; };
- LLVector4 getObjectScale() const { return mObjectScale; };
- LLMeshSkinInfo& getObjectMeshSkinInfo() { return mMeshSkinInfo; };
- LLVolumeParams getVolumeParams() const { return mVolumeParams; };
- bool getIsRiggedObject() const;
+ LLVector4 getObjectTranslation() const { return mObjectTranslation; };
+ std::string getObjectName() const { return mObjectName; };
+ LLVector4 getObjectSize() const { return mObjectSize; };
+ LLVector4 getObjectScale() const { return mObjectScale; };
+ LLPointer getObjectMeshSkinInfo() { return mMeshSkinInfoPtr; };
+ void setObjectMeshSkinInfo(LLPointer skininfop ) { mMeshSkinInfoPtr = skininfop; };
+ LLVolumeParams getVolumeParams() const { return mVolumeParams; };
+ bool getIsRiggedObject() const;
private:
// internal data keeping
@@ -125,7 +126,7 @@ class LLLocalMeshObject
LLVector4 mObjectScale;
// vovolume
- LLMeshSkinInfo mMeshSkinInfo;
+ LLPointer mMeshSkinInfoPtr{nullptr};
LLUUID mSculptID;
LLVolumeParams mVolumeParams;
};
diff --git a/indra/newview/vjlocalmeshimportdae.cpp b/indra/newview/vjlocalmeshimportdae.cpp
index fc0f63034e..8661496df9 100644
--- a/indra/newview/vjlocalmeshimportdae.cpp
+++ b/indra/newview/vjlocalmeshimportdae.cpp
@@ -485,8 +485,19 @@ bool LLLocalMeshImportDAE::processSkin(daeDatabase* collada_db, daeElement* coll
LLVector4 objct_size = current_object->getObjectSize();
// this is basically the data_out but for skinning data
- auto& skininfo = current_object->getObjectMeshSkinInfo();
-
+ LLPointer skininfop = current_object->getObjectMeshSkinInfo();
+ if (skininfop == nullptr)
+ {
+ try
+ {
+ skininfop = new LLMeshSkinInfo();
+ }
+ catch (const std::bad_alloc& ex)
+ {
+ LL_WARNS() << "Failed to allocate skin info with exception: " << ex.what() << LL_ENDL;
+ return false;
+ }
+ }
// basically copy-pasted from linden magic
LLMatrix4 normalized_transformation;
LLMatrix4 mesh_scale;
@@ -513,10 +524,10 @@ bool LLLocalMeshImportDAE::processSkin(daeDatabase* collada_db, daeElement* coll
mat4_proxy.mMatrix[matrix_i][matrix_j] = bind_matrix_value[matrix_i + (matrix_j * 4)];
}
}
- skininfo.mBindShapeMatrix.loadu(mat4_proxy);
+ skininfop->mBindShapeMatrix.loadu(mat4_proxy);
// matrix multiplication order matters, so this is as clean as it gets.
LLMatrix4a transform{normalized_transformation};
- matMul(transform, skininfo.mBindShapeMatrix, skininfo.mBindShapeMatrix);
+ matMul(transform, skininfop->mBindShapeMatrix, skininfop->mBindShapeMatrix);
}
// setup joint map
@@ -611,7 +622,7 @@ bool LLLocalMeshImportDAE::processSkin(daeDatabase* collada_db, daeElement* coll
// jointlist processing
// moved this lambda definition out of the loop below.
- auto lambda_process_joint_name = [&skininfo, &joint_map](std::string joint_name)
+ auto lambda_process_joint_name = [&skininfo = *skininfop, &joint_map](std::string joint_name)
{
// looking for internal joint name, otherwise use provided name?
// seems weird, but ok.
@@ -695,13 +706,13 @@ bool LLLocalMeshImportDAE::processSkin(daeDatabase* collada_db, daeElement* coll
}
}
- skininfo.mInvBindMatrix.push_back(LLMatrix4a(current_matrix));
+ skininfop->mInvBindMatrix.push_back(LLMatrix4a(current_matrix));
}
}
}
int jointname_number_iter = 0;
- for (auto jointname_iterator = skininfo.mJointNames.begin(); jointname_iterator != skininfo.mJointNames.end(); ++jointname_iterator, ++jointname_number_iter)
+ for (auto jointname_iterator = skininfop->mJointNames.begin(); jointname_iterator != skininfop->mJointNames.end(); ++jointname_iterator, ++jointname_number_iter)
{
std::string name_lookup = jointname_iterator->mName;
if (joint_map.find(name_lookup) == joint_map.end())
@@ -710,25 +721,25 @@ bool LLLocalMeshImportDAE::processSkin(daeDatabase* collada_db, daeElement* coll
continue;
}
- if (skininfo.mInvBindMatrix.size() <= jointname_number_iter)
+ if (skininfop->mInvBindMatrix.size() <= jointname_number_iter)
{
// doesn't seem like a critical fail that should invalidate the entire skin, just break and move on?
pushLog("DAE Importer", "WARNING: Requesting out of bounds joint named " + name_lookup);
break;
}
- LLMatrix4 newinverse = LLMatrix4(skininfo.mInvBindMatrix[jointname_number_iter].getF32ptr());
+ LLMatrix4 newinverse = LLMatrix4(skininfop->mInvBindMatrix[jointname_number_iter].getF32ptr());
auto joint_translation = joint_transforms[name_lookup].getTranslation();
newinverse.setTranslation(joint_translation);
- skininfo.mAlternateBindMatrix.push_back( LLMatrix4a(newinverse) );
+ skininfop->mAlternateBindMatrix.push_back( LLMatrix4a(newinverse) );
}
- size_t bind_count = skininfo.mAlternateBindMatrix.size();
- if ((bind_count > 0) && (bind_count != skininfo.mJointNames.size()))
+ size_t bind_count = skininfop->mAlternateBindMatrix.size();
+ if ((bind_count > 0) && (bind_count != skininfop->mJointNames.size()))
{
// different number of binds vs jointnames, i hestiate to fail the entire skinmap over this
// because it can just be a case of a few additional joints being ignored, unless i'm missing something?
- pushLog("DAE Importer", "WARNING: " + std::to_string(skininfo.mJointNames.size()) + " joints were found, but " + std::to_string(bind_count) + " binds matrices were made.");
+ pushLog("DAE Importer", "WARNING: " + std::to_string(skininfop->mJointNames.size()) + " joints were found, but " + std::to_string(bind_count) + " binds matrices were made.");
}
//==============================
@@ -964,7 +975,8 @@ bool LLLocalMeshImportDAE::processSkin(daeDatabase* collada_db, daeElement* coll
weights.push_back(new_wght);
}
}
-
+ skininfop->updateHash();
+ current_object->setObjectMeshSkinInfo(skininfop);
return true;
}
diff --git a/requirements.txt b/requirements.txt
index 25bcb223a5..9272ca6a2c 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,2 +1,3 @@
llbase==1.2.11
-git+https://github.com/Nicky-D/autobuild@main_nd#egg=autobuild
\ No newline at end of file
+git+https://github.com/FirestormViewer/autobuild-3.0#egg=autobuild
+# git+https://github.com/Nicky-D/autobuild@main_nd#egg=autobuild
\ No newline at end of file
diff --git a/scripts/configure_firestorm.sh b/scripts/configure_firestorm.sh
index a65f0f05c6..7d59304cb2 100755
--- a/scripts/configure_firestorm.sh
+++ b/scripts/configure_firestorm.sh
@@ -595,7 +595,6 @@ if [ $WANTS_CONFIG -eq $TRUE ] ; then
../indra/tools/vstool/VSTool.exe --solution Firestorm.sln --startup firestorm-bin --workingdir firestorm-bin "..\\..\\indra\\newview" --config $BTYPE
fi
fi
-
if [ $WANTS_BUILD -eq $TRUE ] ; then
echo "Building $TARGET_PLATFORM..."
if [ $TARGET_PLATFORM == "darwin" ] ; then
@@ -627,5 +626,5 @@ if [ $WANTS_BUILD -eq $TRUE ] ; then
fi
fi
fi
+echo "finished"
-echo "Finished"