diff --git a/Sources/Plasma/PubUtilLib/plMath/CMakeLists.txt b/Sources/Plasma/PubUtilLib/plMath/CMakeLists.txt index 5be16a99..fc7800f3 100644 --- a/Sources/Plasma/PubUtilLib/plMath/CMakeLists.txt +++ b/Sources/Plasma/PubUtilLib/plMath/CMakeLists.txt @@ -3,17 +3,12 @@ include_directories("../../NucleusLib") include_directories("../../PubUtilLib") set(plMath_SOURCES - hsNoiseFunc.cpp hsRadixSort.cpp - plAvg.cpp plTriUtils.cpp ) set(plMath_HEADERS - hsNoiseFunc.h hsRadixSort.h - hsSearchVersion.h - plAvg.h plTriUtils.h ) diff --git a/Sources/Plasma/PubUtilLib/plMath/hsNoiseFunc.cpp b/Sources/Plasma/PubUtilLib/plMath/hsNoiseFunc.cpp deleted file mode 100644 index 7e3a43dc..00000000 --- a/Sources/Plasma/PubUtilLib/plMath/hsNoiseFunc.cpp +++ /dev/null @@ -1,156 +0,0 @@ -/*==LICENSE==* - -CyanWorlds.com Engine - MMOG client, server and tools -Copyright (C) 2011 Cyan Worlds, Inc. - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -This program 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 General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . - -Additional permissions under GNU GPL version 3 section 7 - -If you modify this Program, or any covered work, by linking or -combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK, -NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent -JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK -(or a modified version of those libraries), -containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA, -PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG -JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the -licensors of this Program grant you additional -permission to convey the resulting work. Corresponding Source for a -non-source form of such a combination shall include the source code for -the parts of OpenSSL and IJG JPEG Library used as well as that of the covered -work. - -You can contact Cyan Worlds, Inc. by email legal@cyan.com - or by snail mail at: - Cyan Worlds, Inc. - 14617 N Newport Hwy - Mead, WA 99021 - -*==LICENSE==*/ -#include "hsNoiseFunc.h" -#include "HeadSpin.h" - -#include "hsGeometry3.h" - -hsNoiseFunc::hsNoiseFunc() -{ -} - -hsNoiseFunc::~hsNoiseFunc() -{ -} - -void hsNoiseFunc::Seed(uint32_t s) -{ - srand(s); -} - -hsTableNoise::hsTableNoise() -: fTable(nil), fTableLen(0) -{ -} - -hsTableNoise::~hsTableNoise() -{ - delete [] fTable; -} - -void hsTableNoise::SetTable(int len, float* arr) -{ - fTableLen = len; - - delete [] fTable; - if( !len ) - { - fTable = nil; - return; - } - - fTable = new float[len+2]; - - int i; - for( i = 0; i < len; i++ ) - fTable[i] = arr[i]; - fTable[i++] = fTable[i-1]; - fTable[i++] = fTable[i-1]; - -} - -float hsTableNoise::Noise(float lo, float hi, float t) -{ - hsAssert(fTableLen, "Badly initialized table noise function"); - - float r = float(rand()) / float(RAND_MAX); - r = lo + (hi - lo) * r; - - if( t < 0 ) - t = 0; - else if( t > 1.f ) - t = 1.f; - - float tIdx = t * fTableLen; - uint32_t idx = uint32_t(tIdx); - float frac = tIdx - float(idx); - hsAssert((idx >= 0)&&(idx <= fTableLen), "Noise parm t out of range [0..1]"); - - float scale = fTable[idx] + (fTable[idx+1] - fTable[idx]) * frac; - - r *= scale; - - return r; -} - -float hsTableNoise::NoisePoint(const hsPoint3& p, float lo, float hi, float t) -{ - hsAssert(fTableLen, "Badly initialized table noise function"); - - uint32_t sX = *((uint32_t*)&p.fX); - uint32_t sY = *((uint32_t*)&p.fY); - uint32_t sZ = *((uint32_t*)&p.fZ); - - uint32_t sAll = ((((sX & 0x07800000) >> 16) | ((sX & 0x007fffff) >> 17)) << 20) - | ((((sY & 0x07800000) >> 16) | ((sY & 0x007fffff) >> 17)) << 10) - | ((((sZ & 0x07800000) >> 16) | ((sZ & 0x007fffff) >> 17)) ); - - const uint32_t kExp = 0x3f800000; - const uint32_t kMsk = 0x007fffff; - - const uint32_t kA = 1665636L; - const uint32_t kC = 1013904223L; - - uint32_t iR = kA * sAll + kC; - iR &= kMsk; - iR |= kExp; - - float r = (*(float*)&iR) - 1.f; - - r = lo + (hi - lo) * r; - - if( t < 0 ) - t = 0; - else if( t > 1.f ) - t = 1.f; - - float tIdx = t * fTableLen; - uint32_t idx = uint32_t(tIdx); - float frac = tIdx - float(idx); - hsAssert((idx >= 0)&&(idx <= fTableLen), "Noise parm t out of range [0..1]"); - - float scale = fTable[idx] + (fTable[idx+1] - fTable[idx]) * frac; - - r *= scale; - - return r; -} diff --git a/Sources/Plasma/PubUtilLib/plMath/hsNoiseFunc.h b/Sources/Plasma/PubUtilLib/plMath/hsNoiseFunc.h deleted file mode 100644 index 69ff288b..00000000 --- a/Sources/Plasma/PubUtilLib/plMath/hsNoiseFunc.h +++ /dev/null @@ -1,82 +0,0 @@ -/*==LICENSE==* - -CyanWorlds.com Engine - MMOG client, server and tools -Copyright (C) 2011 Cyan Worlds, Inc. - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -This program 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 General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . - -Additional permissions under GNU GPL version 3 section 7 - -If you modify this Program, or any covered work, by linking or -combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK, -NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent -JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK -(or a modified version of those libraries), -containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA, -PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG -JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the -licensors of this Program grant you additional -permission to convey the resulting work. Corresponding Source for a -non-source form of such a combination shall include the source code for -the parts of OpenSSL and IJG JPEG Library used as well as that of the covered -work. - -You can contact Cyan Worlds, Inc. by email legal@cyan.com - or by snail mail at: - Cyan Worlds, Inc. - 14617 N Newport Hwy - Mead, WA 99021 - -*==LICENSE==*/ - -#ifndef hsNoiseFunc_inc -#define hsNoiseFunc_inc - -#include "HeadSpin.h" -#include "hsRefCnt.h" - -struct hsPoint3; - -class hsNoiseFunc : public hsRefCnt // should inherit from keyed object -{ -public: - hsNoiseFunc(); - virtual ~hsNoiseFunc(); - - virtual void Seed(uint32_t s); - virtual float Noise(float lo=0, float hi=1.f, float t=0) = 0; // t = [0..1] - returns random num [lo..hi] scaled by fTable[t] - - virtual float NoisePoint(const hsPoint3& p, float lo=0, float hi=1.f, float t=0) = 0; // t = [0..1] - returns random num [lo..hi] scaled by fTable[t] -}; - -class hsTableNoise : public hsNoiseFunc // should inherit from keyed object -{ -protected: - float* fTable; - uint32_t fTableLen; - - -public: - hsTableNoise(); - virtual ~hsTableNoise(); - - void SetTable(int len, float* arr); // copies. arr should be hsScalars in range [0..1] - float* GetTable(int& len) { len = fTableLen; return fTable; } // should be debug only, access through noise func - - virtual float Noise(float lo=0, float hi=1.f, float t=0); // t = [0..1] - returns random num [lo..hi] scaled by fTable[t] - - virtual float NoisePoint(const hsPoint3& p, float lo=0, float hi=1.f, float t=0); // t = [0..1] - returns random num [lo..hi] scaled by fTable[t] -}; - -#endif // hsNoiseFunc_inc diff --git a/Sources/Plasma/PubUtilLib/plMath/hsSearchVersion.h b/Sources/Plasma/PubUtilLib/plMath/hsSearchVersion.h deleted file mode 100644 index ec608cc0..00000000 --- a/Sources/Plasma/PubUtilLib/plMath/hsSearchVersion.h +++ /dev/null @@ -1,181 +0,0 @@ -/*==LICENSE==* - -CyanWorlds.com Engine - MMOG client, server and tools -Copyright (C) 2011 Cyan Worlds, Inc. - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -This program 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 General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . - -Additional permissions under GNU GPL version 3 section 7 - -If you modify this Program, or any covered work, by linking or -combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK, -NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent -JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK -(or a modified version of those libraries), -containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA, -PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG -JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the -licensors of this Program grant you additional -permission to convey the resulting work. Corresponding Source for a -non-source form of such a combination shall include the source code for -the parts of OpenSSL and IJG JPEG Library used as well as that of the covered -work. - -You can contact Cyan Worlds, Inc. by email legal@cyan.com - or by snail mail at: - Cyan Worlds, Inc. - 14617 N Newport Hwy - Mead, WA 99021 - -*==LICENSE==*/ - -#ifndef hsSearchVersion_inc -#define hsSearchVersion_inc - -#include "HeadSpin.h" - -/* -do a template of lists to search for a matching entry. basic idea is that -you start off with an array of buckets and you know that you will get at -least one, possibly several, in each bucket. when you go to search, you already -know which bucket it will be in if it's there. even as the array is being filled, -each filled entry in each bucket has a valid forever index, as well as it's key -value. so array is fixed length, index into array has no bearing on forever index, -elements of array can grow, and at all times the used forever indices form a contiguous -set from 0 to max forever index. -*/ - -template class hsVersionNode { -protected: - T fData; - int32_t fIndex; - hsVersionNode* fNext; -public: - hsVersionNode(const uint32_t idx, const T &data) : fIndex(idx), fNext(nil) { fData = data; } - ~hsVersionNode() { delete fNext; } - - hsVersionNode* Next() const { return fNext; } - - int32_t Index() const { return fIndex; } - - inline void Append(hsVersionNode* next); - inline int operator==(const T& o) const; - - int operator!=(const T& o) const { return !(this->operator==(o)); } - - T& GetData() { return fData; } -}; - -template int hsVersionNode::operator==(const T& data) const -{ - return fData == data; -} - -template void hsVersionNode::Append(hsVersionNode* next) -{ - if( fNext ) - fNext->Append(next); - else - fNext = next; -} - -template class hsSearchVersion { -protected: - uint32_t fLength; - hsVersionNode** fArray; - uint32_t fNextIndex; - uint32_t fNumIndex; - uint32_t fIncIndex; - T** fBackArray; - - void ICheckBackArray(); -public: - hsSearchVersion(uint32_t len, uint32_t inc = 0); - ~hsSearchVersion(); - - T& operator[]( int32_t index ); - - int32_t Find(int where, const T& what, bool forceUnique=false); - - uint32_t GetCount() const { return fNextIndex; } -}; - -template T& hsSearchVersion::operator[]( int32_t index ) -{ - hsDebugCode(hsThrowIfBadParam((uint32_t)index >= (uint32_t)fNextIndex);) - - return *fBackArray[index]; -} - -template hsSearchVersion::hsSearchVersion(uint32_t len, uint32_t inc) - : fNextIndex(0) -{ - fIncIndex = inc ? inc : len; - fLength = len; - fArray = new hsVersionNode*[fLength]; - HSMemory::Clear(fArray, fLength*sizeof(*fArray)); - fBackArray = new T*[fNumIndex = fLength]; -} - -template hsSearchVersion::~hsSearchVersion() -{ - int i; - for( i = 0; i < fLength; i++ ) - delete fArray[i]; - delete [] fArray; - delete [] fBackArray; -} - -template void hsSearchVersion::ICheckBackArray() -{ - if( fNextIndex >= fNumIndex ) - { - T** newBackArray = new T*[fNumIndex + fIncIndex]; - HSMemory::BlockMove(fBackArray, newBackArray, fNextIndex*sizeof(T*)); - delete [] fBackArray; - fBackArray = newBackArray; - fNumIndex += fIncIndex; - } -} - -template int32_t hsSearchVersion::Find(int where, const T&what, bool forceUnique) -{ - hsVersionNode* curr = fArray[where]; - - ICheckBackArray(); - - if( !curr ) - { - hsVersionNode* next = new hsVersionNode(fNextIndex, what); - fArray[where] = next; - fBackArray[fNextIndex] = &next->GetData(); - return fNextIndex++; - } - if( *curr == what ) - return curr->Index(); - - while( curr->Next() - && (forceUnique || (*curr->Next() != what)) ) - curr = curr->Next(); - - if( curr->Next() ) - return curr->Next()->Index(); - - hsVersionNode* next = new hsVersionNode(fNextIndex, what); - curr->Append(next); - fBackArray[fNextIndex] = &next->GetData(); - return fNextIndex++; -} - -#endif // hsSearchVersion_inc diff --git a/Sources/Plasma/PubUtilLib/plMath/plAvg.cpp b/Sources/Plasma/PubUtilLib/plMath/plAvg.cpp deleted file mode 100644 index 579a5812..00000000 --- a/Sources/Plasma/PubUtilLib/plMath/plAvg.cpp +++ /dev/null @@ -1,160 +0,0 @@ -/*==LICENSE==* - -CyanWorlds.com Engine - MMOG client, server and tools -Copyright (C) 2011 Cyan Worlds, Inc. - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -This program 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 General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . - -Additional permissions under GNU GPL version 3 section 7 - -If you modify this Program, or any covered work, by linking or -combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK, -NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent -JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK -(or a modified version of those libraries), -containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA, -PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG -JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the -licensors of this Program grant you additional -permission to convey the resulting work. Corresponding Source for a -non-source form of such a combination shall include the source code for -the parts of OpenSSL and IJG JPEG Library used as well as that of the covered -work. - -You can contact Cyan Worlds, Inc. by email legal@cyan.com - or by snail mail at: - Cyan Worlds, Inc. - 14617 N Newport Hwy - Mead, WA 99021 - -*==LICENSE==*/ - -#include "HeadSpin.h" -#include "plAvg.h" -#include -#include - -template class TimeBasedAvgRing; -template class TimeBasedAvgRing; - -#define PercisionRoundUp(x) (ceil(x / kPercision) * kPercision) - -template -const float TimeBasedAvgRing::kPercision = 0.001; - -template -void TimeBasedAvgRing::AddItem(T value, double time) -{ - std::lock_guard lock(fLock); - - if ( fList.empty() ) - { - // initialize with the first time and zero the first value - fList.insert(fList.end(),Item(0.0,time)); - fRingStart = fRingEnd = fList.begin(); - fAvg = (float)value; - } - else - { - // if we're within the percision amount subtract the RingEnd value from total - // and update the RingEnd value by adding the current value to it - if (time - (*fRingEnd).GetTime() <= kPercision) - { - fTotal -= PercisionRoundUp((*fRingEnd).GetValue()); - (*fRingEnd).SetValue((*fRingEnd).GetValue() + value); - } - else - { - // clean up the begining of the ring - //// there can be some precision loss in the loop time calc - //// check to see if the difference is within 1 milli - while (time - (*fRingStart).GetTime() > fLen + kPercision - && fRingStart != fRingEnd) - { - // remove RingStart from the avg part of the average calc - fTotal -= (*fRingStart).GetValue(); - - typename TimeList::iterator prev = fRingStart++; - - // loop the ring if needed - if (fRingStart == fList.end()) - fRingStart = fList.begin(); - - - // if the new ring start is in the range, interpolate - // and reuse prev - if (time - (*fRingStart).GetTime() < fLen) - { - // remove RingStart from the avg part of the average calc - fTotal -= PercisionRoundUp((*fRingStart).GetValue()); - - // Set up the interp - double remainder = fLen - (time - (*fRingStart).GetTime()); - double timedelta = (*fRingStart).GetTime() - (*prev).GetTime(); - (*prev).SetTime((*fRingStart).GetTime() - remainder); - (*prev).SetValue(0); - // rounding loss occurs here if T is not floting point - double scale = remainder/timedelta; - hsAssert(scale < 1.0 && scale > 0.0,"Interp Scale Out of Bounds"); - (*fRingStart).SetValue((float)((*fRingStart).GetValue() * scale)); - - // add the new value in - fTotal += (*fRingStart).GetValue(); - - // put prev back as ring start - fRingStart = prev; - } - - } - - // zero total & fAvg if we looped or neg - if (fRingStart == fRingEnd || fTotal < 0.0) - { - fTotal = 0.0; - fAvg = 0.0; - } - - // put the new value in the ring by expanding the ring if needed - // or replacing an empty value - fRingEnd++; - if (fRingEnd == fList.end()) - fRingEnd = fList.begin(); - // Do we have free space? - if (fRingEnd == fRingStart) - { - // no free space - fList.insert(fRingEnd,Item(value,time)); - fRingEnd--; - } - else - { - // yes free space @ fRingEnd - (*fRingEnd) = Item(value,time); - } - } - - //update the avg - fTotal += (*fRingEnd).GetValue(); - double currentLen = (*fRingEnd).GetTime() - (*fRingStart).GetTime(); - if (currentLen < 1.0) - fAvg = (float)fTotal; - else - fAvg = (float)(fTotal / currentLen); - } - - // update the max avg - fMaxAvg = std::max(fMaxAvg, fAvg); - -} - diff --git a/Sources/Plasma/PubUtilLib/plMath/plAvg.h b/Sources/Plasma/PubUtilLib/plMath/plAvg.h deleted file mode 100644 index e4994cf1..00000000 --- a/Sources/Plasma/PubUtilLib/plMath/plAvg.h +++ /dev/null @@ -1,108 +0,0 @@ -/*==LICENSE==* - -CyanWorlds.com Engine - MMOG client, server and tools -Copyright (C) 2011 Cyan Worlds, Inc. - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -This program 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 General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . - -Additional permissions under GNU GPL version 3 section 7 - -If you modify this Program, or any covered work, by linking or -combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK, -NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent -JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK -(or a modified version of those libraries), -containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA, -PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG -JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the -licensors of this Program grant you additional -permission to convey the resulting work. Corresponding Source for a -non-source form of such a combination shall include the source code for -the parts of OpenSSL and IJG JPEG Library used as well as that of the covered -work. - -You can contact Cyan Worlds, Inc. by email legal@cyan.com - or by snail mail at: - Cyan Worlds, Inc. - 14617 N Newport Hwy - Mead, WA 99021 - -*==LICENSE==*/ -#ifndef PL_AVG_H -#define PL_AVG_H - -#include "HeadSpin.h" -#include -#include - -// A Time based Value Averaging class -// implemented in a ring buffer -// Values are averaged over the RingLen -// independant of frame time -// The ring buffer will grow to accomadate -// as many samples as added during the Len -// Only Accurate to kPercision (0.001) of whatever units -// of time are used - -template class TimeBasedAvgRing -{ -/* T must be a simple type - - If T is not a floating point type then rounding - loss may occur when samples are interpolated - at window boundries -*/ -private: - static const float kPercision; - - template class Item - { - private: - T fValue; - double fTime; - public: - Item() { Reset(); } - Item(const T val, const double time) : fValue(val), fTime(time) { } - void Reset() { fValue = 0; fTime = 0; } - void SetValue(const T val) { fValue = val; } - void SetTime(const double time) { fTime = time; } - T GetValue() const { return fValue; } - double GetTime() const { return fTime; } - }; - typedef std::list< Item > TimeList; - typedef typename TimeList::iterator TimeListIterator; // .NET added typename to be C++ ISO compliant - JL - - TimeList fList; - float fLen; // in time - float fAvg; - float fMaxAvg; - double fTotal; - TimeListIterator fRingStart, fRingEnd; - std::mutex fLock; -public: - TimeBasedAvgRing():fLen(0.f),fAvg(0.f),fMaxAvg(0.f),fTotal(0.0) {} - - void SetRingLen(const float len) { fLen = len; } - float GetRingLen() const { return fLen; } - void AddItem(T value, double time); - float GetAvg() const { return fAvg; } - double GetTotal() const { return fTotal; } - float GetMaxAvg() const { return fMaxAvg; } - void ResetMaxAvg() { fMaxAvg=fAvg; } - void Reset() { fRingStart=fRingEnd; ResetMaxAvg(); } -}; - - -#endif // PL_AVG_H -