diff options
Diffstat (limited to 'indra/llmath')
| -rw-r--r-- | indra/llmath/CMakeLists.txt | 2 | ||||
| -rw-r--r-- | indra/llmath/llrigginginfo.cpp | 96 | ||||
| -rw-r--r-- | indra/llmath/llrigginginfo.h | 55 | 
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 | 
