summaryrefslogtreecommitdiff
path: root/indra/llprimitive
diff options
context:
space:
mode:
authorBrad Linden <brad@lindenlab.com>2023-05-17 11:17:48 -0700
committerBrad Linden <brad@lindenlab.com>2023-05-17 11:17:48 -0700
commit2f44377b3e98d60f1bd5b1a495c9a3aab9cfa450 (patch)
tree0c9b22edca280d8e2a2ef280360485c139c9b829 /indra/llprimitive
parent4758355c599d1487c11884d3f700981e011cb7b7 (diff)
parent5a70639b7992842a9f74ec81b11bac56608b8f2e (diff)
Merge remote-tracking branch 'origin/main' into DRTVWR-559
Diffstat (limited to 'indra/llprimitive')
-rw-r--r--indra/llprimitive/llmodel.cpp108
-rw-r--r--indra/llprimitive/llmodelloader.cpp7
2 files changed, 68 insertions, 47 deletions
diff --git a/indra/llprimitive/llmodel.cpp b/indra/llprimitive/llmodel.cpp
index dba4bee6e2..ee493968de 100644
--- a/indra/llprimitive/llmodel.cpp
+++ b/indra/llprimitive/llmodel.cpp
@@ -875,55 +875,69 @@ LLSD LLModel::writeModel(
if (skinning)
{
- //write out skin weights
-
- //each influence list entry is up to 4 24-bit values
- // first 8 bits is bone index
- // last 16 bits is bone influence weight
- // a bone index of 0xFF signifies no more influences for this vertex
-
- std::stringstream ostr;
-
- for (U32 j = 0; j < face.mNumVertices; ++j)
- {
- LLVector3 pos(face.mPositions[j].getF32ptr());
-
- weight_list& weights = model[idx]->getJointInfluences(pos);
-
- S32 count = 0;
- for (weight_list::iterator iter = weights.begin(); iter != weights.end(); ++iter)
- {
- // Note joint index cannot exceed 255.
- if (iter->mJointIdx < 255 && iter->mJointIdx >= 0)
- {
- U8 idx = (U8) iter->mJointIdx;
- ostr.write((const char*) &idx, 1);
-
- U16 influence = (U16) (iter->mWeight*65535);
- ostr.write((const char*) &influence, 2);
-
- ++count;
- }
- }
- U8 end_list = 0xFF;
- if (count < 4)
- {
- ostr.write((const char*) &end_list, 1);
- }
- }
+ if (!model[idx]->mSkinWeights.empty())
+ {
+ //write out skin weights
+
+ //each influence list entry is up to 4 24-bit values
+ // first 8 bits is bone index
+ // last 16 bits is bone influence weight
+ // a bone index of 0xFF signifies no more influences for this vertex
+
+ std::stringstream ostr;
+ for (U32 j = 0; j < face.mNumVertices; ++j)
+ {
+ LLVector3 pos(face.mPositions[j].getF32ptr());
+
+ weight_list& weights = model[idx]->getJointInfluences(pos);
+
+ S32 count = 0;
+ for (weight_list::iterator iter = weights.begin(); iter != weights.end(); ++iter)
+ {
+ // Note joint index cannot exceed 255.
+ if (iter->mJointIdx < 255 && iter->mJointIdx >= 0)
+ {
+ U8 idx = (U8)iter->mJointIdx;
+ ostr.write((const char*)&idx, 1);
+
+ U16 influence = (U16)(iter->mWeight * 65535);
+ ostr.write((const char*)&influence, 2);
+
+ ++count;
+ }
+ }
+ U8 end_list = 0xFF;
+ if (count < 4)
+ {
+ ostr.write((const char*)&end_list, 1);
+ }
+ }
- //copy ostr to binary buffer
- std::string data = ostr.str();
- const U8* buff = (U8*) data.data();
- U32 bytes = data.size();
+ //copy ostr to binary buffer
+ std::string data = ostr.str();
+ const U8* buff = (U8*)data.data();
+ U32 bytes = data.size();
- LLSD::Binary w(bytes);
- for (U32 j = 0; j < bytes; ++j)
- {
- w[j] = buff[j];
- }
+ LLSD::Binary w(bytes);
+ for (U32 j = 0; j < bytes; ++j)
+ {
+ w[j] = buff[j];
+ }
- mdl[model_names[idx]][i]["Weights"] = w;
+ mdl[model_names[idx]][i]["Weights"] = w;
+ }
+ else
+ {
+ if (idx == LLModel::LOD_PHYSICS)
+ {
+ // Ex: using "bounding box"
+ LL_DEBUGS("MESHSKININFO") << "Using physics model without skin weights" << LL_ENDL;
+ }
+ else
+ {
+ LL_WARNS("MESHSKININFO") << "Attempting to use skinning without having skin weights" << LL_ENDL;
+ }
+ }
}
}
}
@@ -1025,6 +1039,8 @@ LLModel::weight_list& LLModel::getJointInfluences(const LLVector3& pos)
//1. If a vertex has been weighted then we'll find it via pos and return its weight list
weight_map::iterator iterPos = mSkinWeights.begin();
weight_map::iterator iterEnd = mSkinWeights.end();
+
+ llassert(!mSkinWeights.empty());
for ( ; iterPos!=iterEnd; ++iterPos )
{
diff --git a/indra/llprimitive/llmodelloader.cpp b/indra/llprimitive/llmodelloader.cpp
index 554ed54de1..fc826727e1 100644
--- a/indra/llprimitive/llmodelloader.cpp
+++ b/indra/llprimitive/llmodelloader.cpp
@@ -25,6 +25,8 @@
*/
#include "llmodelloader.h"
+
+#include "llapp.h"
#include "llsdserialize.h"
#include "lljoint.h"
#include "llcallbacklist.h"
@@ -364,7 +366,10 @@ bool LLModelLoader::isAlive(LLModelLoader* loader)
void LLModelLoader::loadModelCallback()
{
- mLoadCallback(mScene,mModelList,mLod, mOpaqueData);
+ if (!LLApp::isExiting())
+ {
+ mLoadCallback(mScene, mModelList, mLod, mOpaqueData);
+ }
while (!isStopped())
{ //wait until this thread is stopped before deleting self