summaryrefslogtreecommitdiff
path: root/indra/llmath
diff options
context:
space:
mode:
authorandreykproductengine <akleshchev@productengine.com>2015-07-14 16:29:36 +0300
committerandreykproductengine <akleshchev@productengine.com>2015-07-14 16:29:36 +0300
commitd43cef4ed5a012593ff31c4ef9c0356edbea5339 (patch)
tree82cd097cdebc8d0e83eae21f67c79fca6aaa463f /indra/llmath
parent078612e292fa8b66a8b7a68b7e1fe9b5049c3deb (diff)
MAINT-5364 FIXED Object with invalid sculpt topology type cannot be seen or selected
Diffstat (limited to 'indra/llmath')
-rwxr-xr-xindra/llmath/llvolume.cpp29
-rwxr-xr-xindra/llmath/llvolume.h13
2 files changed, 36 insertions, 6 deletions
diff --git a/indra/llmath/llvolume.cpp b/indra/llmath/llvolume.cpp
index 41ee3941ac..82081ca853 100755
--- a/indra/llmath/llvolume.cpp
+++ b/indra/llmath/llvolume.cpp
@@ -3178,6 +3178,16 @@ BOOL LLVolume::isFlat(S32 face)
}
+LLVolumeParams::LLVolumeParams( LLProfileParams &profile,
+ LLPathParams &path,
+ LLUUID sculpt_id,
+ U8 sculpt_type) :
+mProfileParams(profile),
+mPathParams(path)
+{
+ setSculptID(sculpt_id, sculpt_type);
+}
+
bool LLVolumeParams::isSculpt() const
{
return mSculptID.notNull();
@@ -3494,7 +3504,24 @@ bool LLVolumeParams::setSkew(const F32 skew_value)
bool LLVolumeParams::setSculptID(const LLUUID sculpt_id, U8 sculpt_type)
{
mSculptID = sculpt_id;
- mSculptType = sculpt_type;
+ // Check sculpt type value, it consist of type and flags
+ U8 type = sculpt_type & LL_SCULPT_TYPE_MASK;
+ U8 flags = sculpt_type & LL_SCULPT_FLAG_MASK;
+ if (sculpt_type != (type | flags) || type > LL_SCULPT_TYPE_MAX)
+ {
+ if (sculpt_id != LLUUID::null)
+ {
+ mSculptType = LL_SCULPT_TYPE_MESH;
+ }
+ else
+ {
+ mSculptType = LL_SCULPT_TYPE_SPHERE;
+ }
+ }
+ else
+ {
+ mSculptType = sculpt_type;
+ }
return true;
}
diff --git a/indra/llmath/llvolume.h b/indra/llmath/llvolume.h
index c8476f6897..06688cacc9 100755
--- a/indra/llmath/llvolume.h
+++ b/indra/llmath/llvolume.h
@@ -190,8 +190,12 @@ const U8 LL_SCULPT_TYPE_MESH = 5;
const U8 LL_SCULPT_TYPE_MASK = LL_SCULPT_TYPE_SPHERE | LL_SCULPT_TYPE_TORUS | LL_SCULPT_TYPE_PLANE |
LL_SCULPT_TYPE_CYLINDER | LL_SCULPT_TYPE_MESH;
+// for value checks, assign new value after adding new types
+const U8 LL_SCULPT_TYPE_MAX = LL_SCULPT_TYPE_MESH;
+
const U8 LL_SCULPT_FLAG_INVERT = 64;
const U8 LL_SCULPT_FLAG_MIRROR = 128;
+const U8 LL_SCULPT_FLAG_MASK = LL_SCULPT_FLAG_INVERT | LL_SCULPT_FLAG_MIRROR;
const S32 LL_SCULPT_MESH_MAX_FACES = 8;
@@ -556,11 +560,10 @@ public:
{
}
- LLVolumeParams(LLProfileParams &profile, LLPathParams &path,
- LLUUID sculpt_id = LLUUID::null, U8 sculpt_type = LL_SCULPT_TYPE_NONE)
- : mProfileParams(profile), mPathParams(path), mSculptID(sculpt_id), mSculptType(sculpt_type)
- {
- }
+ LLVolumeParams( LLProfileParams &profile,
+ LLPathParams &path,
+ LLUUID sculpt_id = LLUUID::null,
+ U8 sculpt_type = LL_SCULPT_TYPE_NONE);
bool operator==(const LLVolumeParams &params) const;
bool operator!=(const LLVolumeParams &params) const;