summaryrefslogtreecommitdiff
path: root/indra/llmath
diff options
context:
space:
mode:
authorBrad Payne (Vir Linden) <vir@lindenlab.com>2018-06-04 14:43:06 +0100
committerBrad Payne (Vir Linden) <vir@lindenlab.com>2018-06-04 14:43:06 +0100
commit228525aa27b05cc1aa8be27de4ae59f5ec590ae3 (patch)
treedde50d01034b34b0c4f15a6ed2fd13efe30eb1e8 /indra/llmath
parente86839fac19753d0fa4006296c7f8909fe781013 (diff)
SL-915 - tracking joint is rigged state
Diffstat (limited to 'indra/llmath')
-rw-r--r--indra/llmath/CMakeLists.txt2
-rw-r--r--indra/llmath/llrigginginfo.cpp96
-rw-r--r--indra/llmath/llrigginginfo.h55
3 files changed, 153 insertions, 0 deletions
diff --git a/indra/llmath/CMakeLists.txt b/indra/llmath/CMakeLists.txt
index dab566da56..379c3ee9ea 100644
--- a/indra/llmath/CMakeLists.txt
+++ b/indra/llmath/CMakeLists.txt
@@ -25,6 +25,7 @@ set(llmath_SOURCE_FILES
lloctree.cpp
llperlin.cpp
llquaternion.cpp
+ llrigginginfo.cpp
llrect.cpp
llsphere.cpp
llvector4a.cpp
@@ -71,6 +72,7 @@ set(llmath_HEADER_FILES
llquaternion2.h
llquaternion2.inl
llrect.h
+ llrigginginfo.h
llsimdmath.h
llsimdtypes.h
llsimdtypes.inl
diff --git a/indra/llmath/llrigginginfo.cpp b/indra/llmath/llrigginginfo.cpp
new file mode 100644
index 0000000000..925179c2ba
--- /dev/null
+++ b/indra/llmath/llrigginginfo.cpp
@@ -0,0 +1,96 @@
+/**
+* @file llrigginginfo.cpp
+* @brief Functions for tracking rigged box extents
+*
+* $LicenseInfo:firstyear=2018&license=viewerlgpl$
+* Second Life Viewer Source Code
+* Copyright (C) 2018, Linden Research, Inc.
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU Lesser General Public
+* License as published by the Free Software Foundation;
+* version 2.1 of the License only.
+*
+* This library is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this library; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+*
+* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+* $/LicenseInfo$
+*/
+
+#include "llmath.h"
+#include "llrigginginfo.h"
+
+//-----------------------------------------------------------------------------
+// LLJointRiggingInfo
+//-----------------------------------------------------------------------------
+LLJointRiggingInfo::LLJointRiggingInfo()
+{
+ mRiggedExtents[0].clear();
+ mRiggedExtents[1].clear();
+ mIsRiggedTo = false;
+}
+
+bool LLJointRiggingInfo::isRiggedTo() const
+{
+ return mIsRiggedTo;
+}
+
+void LLJointRiggingInfo::setIsRiggedTo(bool val)
+{
+ mIsRiggedTo = val;
+}
+
+LLVector4a *LLJointRiggingInfo::getRiggedExtents()
+{
+ return mRiggedExtents;
+}
+
+const LLVector4a *LLJointRiggingInfo::getRiggedExtents() const
+{
+ return mRiggedExtents;
+}
+
+// Combine two rigging info states.
+// - isRiggedTo if either of the source infos are rigged to
+// - box is union of the two sources
+void LLJointRiggingInfo::merge(const LLJointRiggingInfo& other)
+{
+ if (other.mIsRiggedTo)
+ {
+ if (mIsRiggedTo)
+ {
+ // Combine existing boxes
+ update_min_max(mRiggedExtents[0], mRiggedExtents[1], other.mRiggedExtents[0]);
+ update_min_max(mRiggedExtents[0], mRiggedExtents[1], other.mRiggedExtents[1]);
+ }
+ else
+ {
+ // Initialize box
+ mIsRiggedTo = true;
+ mRiggedExtents[0] = other.mRiggedExtents[0];
+ mRiggedExtents[1] = other.mRiggedExtents[1];
+ }
+ }
+}
+
+void mergeRigInfoTab(joint_rig_info_tab& dst, const joint_rig_info_tab& src)
+{
+ // Size should be either LL_CHARACTER_MAX_ANIMATED_JOINTS, or 0 if
+ // no data. Not necessarily the same for both inputs.
+ if (src.size() > dst.size())
+ {
+ dst.resize(src.size());
+ }
+ S32 size = llmin(src.size(), dst.size());
+ for (S32 i=0; i<size; i++)
+ {
+ dst[i].merge(src[i]);
+ }
+}
diff --git a/indra/llmath/llrigginginfo.h b/indra/llmath/llrigginginfo.h
new file mode 100644
index 0000000000..18da905abb
--- /dev/null
+++ b/indra/llmath/llrigginginfo.h
@@ -0,0 +1,55 @@
+/**
+* @file llrigginginfo.h
+* @brief Functions for tracking rigged box extents
+*
+* $LicenseInfo:firstyear=2018&license=viewerlgpl$
+* Second Life Viewer Source Code
+* Copyright (C) 2018, Linden Research, Inc.
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU Lesser General Public
+* License as published by the Free Software Foundation;
+* version 2.1 of the License only.
+*
+* This library is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this library; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+*
+* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+* $/LicenseInfo$
+*/
+
+// Stores information related to associated rigged mesh vertices
+// This lives in llmath because llvolume lives in llmath.
+
+#ifndef LL_LLRIGGINGINFO_H
+#define LL_LLRIGGINGINFO_H
+
+// Extents are in joint space
+// isRiggedTo is based on the state of all currently associated rigged meshes
+class LLJointRiggingInfo
+{
+public:
+ LLJointRiggingInfo();
+ bool isRiggedTo() const;
+ void setIsRiggedTo(bool val);
+ LLVector4a *getRiggedExtents();
+ const LLVector4a *getRiggedExtents() const;
+ void merge(const LLJointRiggingInfo& other);
+private:
+ LL_ALIGN_16(LLVector4a mRiggedExtents[2]);
+ bool mIsRiggedTo;
+};
+
+// For storing all the rigging info associated with a given avatar or
+// object, keyed by joint_num.
+typedef std::vector<LLJointRiggingInfo> joint_rig_info_tab;
+
+void mergeRigInfoTab(joint_rig_info_tab& dst, const joint_rig_info_tab& src);
+
+#endif