From 228525aa27b05cc1aa8be27de4ae59f5ec590ae3 Mon Sep 17 00:00:00 2001 From: "Brad Payne (Vir Linden)" Date: Mon, 4 Jun 2018 14:43:06 +0100 Subject: SL-915 - tracking joint is rigged state --- indra/llmath/llrigginginfo.h | 55 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 indra/llmath/llrigginginfo.h (limited to 'indra/llmath/llrigginginfo.h') 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 joint_rig_info_tab; + +void mergeRigInfoTab(joint_rig_info_tab& dst, const joint_rig_info_tab& src); + +#endif -- cgit v1.2.3 From b269b531706f2490f143bb675398d7c53e2254af Mon Sep 17 00:00:00 2001 From: "Brad Payne (Vir Linden)" Date: Tue, 5 Jun 2018 19:54:30 +0100 Subject: SL-915 - alignment/optimization changes --- indra/llmath/llrigginginfo.h | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'indra/llmath/llrigginginfo.h') diff --git a/indra/llmath/llrigginginfo.h b/indra/llmath/llrigginginfo.h index 18da905abb..7b36880a39 100644 --- a/indra/llmath/llrigginginfo.h +++ b/indra/llmath/llrigginginfo.h @@ -30,8 +30,11 @@ #ifndef LL_LLRIGGINGINFO_H #define LL_LLRIGGINGINFO_H +#include "llvector4a.h" + // Extents are in joint space // isRiggedTo is based on the state of all currently associated rigged meshes +LL_ALIGN_PREFIX(16) class LLJointRiggingInfo { public: @@ -44,7 +47,7 @@ public: private: LL_ALIGN_16(LLVector4a mRiggedExtents[2]); bool mIsRiggedTo; -}; +} LL_ALIGN_POSTFIX(16); // For storing all the rigging info associated with a given avatar or // object, keyed by joint_num. -- cgit v1.2.3 From 430f9420cf0094635b0b0428a29ff7dfaf5718e8 Mon Sep 17 00:00:00 2001 From: "Brad Payne (Vir Linden)" Date: Thu, 7 Jun 2018 22:18:15 +0100 Subject: SL-915 - more on dynamic extent tracking, possible fix for 32-bit crash issues --- indra/llmath/llrigginginfo.h | 32 ++++++++++++++++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) (limited to 'indra/llmath/llrigginginfo.h') diff --git a/indra/llmath/llrigginginfo.h b/indra/llmath/llrigginginfo.h index 7b36880a39..b09746a5b7 100644 --- a/indra/llmath/llrigginginfo.h +++ b/indra/llmath/llrigginginfo.h @@ -44,6 +44,17 @@ public: LLVector4a *getRiggedExtents(); const LLVector4a *getRiggedExtents() const; void merge(const LLJointRiggingInfo& other); + + void* operator new(size_t size) + { + return ll_aligned_malloc_16(size); + } + + void operator delete(void* ptr) + { + ll_aligned_free_16(ptr); + } + private: LL_ALIGN_16(LLVector4a mRiggedExtents[2]); bool mIsRiggedTo; @@ -51,8 +62,25 @@ private: // For storing all the rigging info associated with a given avatar or // object, keyed by joint_num. -typedef std::vector joint_rig_info_tab; +// Using direct memory management instead of std::vector<> to avoid alignment issues. +class LLJointRiggingInfoTab +{ +public: + LLJointRiggingInfoTab(); + ~LLJointRiggingInfoTab(); + void resize(S32 size); + void clear(); + S32 size() const { return mSize; } + void merge(const LLJointRiggingInfoTab& src); + LLJointRiggingInfo& operator[](S32 i) { return mRigInfoPtr[i]; } + const LLJointRiggingInfo& operator[](S32 i) const { return mRigInfoPtr[i]; }; +private: + // Not implemented + LLJointRiggingInfoTab& operator=(const LLJointRiggingInfoTab& src); + LLJointRiggingInfoTab(const LLJointRiggingInfoTab& src); -void mergeRigInfoTab(joint_rig_info_tab& dst, const joint_rig_info_tab& src); + LLJointRiggingInfo *mRigInfoPtr; + S32 mSize; +}; #endif -- cgit v1.2.3 From f30d95ee5feaa3a20ec2f7091324d21179edbbba Mon Sep 17 00:00:00 2001 From: "Brad Payne (Vir Linden)" Date: Fri, 8 Jun 2018 14:19:46 +0100 Subject: SL-915 - more on alignment for 32-bit --- indra/llmath/llrigginginfo.h | 14 ++++++++++++++ 1 file changed, 14 insertions(+) (limited to 'indra/llmath/llrigginginfo.h') diff --git a/indra/llmath/llrigginginfo.h b/indra/llmath/llrigginginfo.h index b09746a5b7..b3d6bc2d19 100644 --- a/indra/llmath/llrigginginfo.h +++ b/indra/llmath/llrigginginfo.h @@ -55,6 +55,17 @@ public: ll_aligned_free_16(ptr); } + void* operator new[](size_t size) + { + return ll_aligned_malloc_16(size); + } + + void operator delete[](void* ptr) + { + ll_aligned_free_16(ptr); + } + + private: LL_ALIGN_16(LLVector4a mRiggedExtents[2]); bool mIsRiggedTo; @@ -74,6 +85,8 @@ public: void merge(const LLJointRiggingInfoTab& src); LLJointRiggingInfo& operator[](S32 i) { return mRigInfoPtr[i]; } const LLJointRiggingInfo& operator[](S32 i) const { return mRigInfoPtr[i]; }; + bool needsUpdate() { return mNeedsUpdate; } + void setNeedsUpdate(bool val) { mNeedsUpdate = val; } private: // Not implemented LLJointRiggingInfoTab& operator=(const LLJointRiggingInfoTab& src); @@ -81,6 +94,7 @@ private: LLJointRiggingInfo *mRigInfoPtr; S32 mSize; + bool mNeedsUpdate; }; #endif -- cgit v1.2.3