1//
2// Redistribution and use in source and binary forms, with or without
3// modification, are permitted provided that the following conditions
4// are met:
5// * Redistributions of source code must retain the above copyright
6// notice, this list of conditions and the following disclaimer.
7// * Redistributions in binary form must reproduce the above copyright
8// notice, this list of conditions and the following disclaimer in the
9// documentation and/or other materials provided with the distribution.
10// * Neither the name of NVIDIA CORPORATION nor the names of its
11// contributors may be used to endorse or promote products derived
12// from this software without specific prior written permission.
13//
14// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY
15// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
18// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
20// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
21// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
22// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
24// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25//
26// Copyright (c) 2008-2021 NVIDIA Corporation. All rights reserved.
27// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved.
28// Copyright (c) 2001-2004 NovodeX AG. All rights reserved.
29
30#ifndef PXS_TRANSFORM_CACHE_H
31#define PXS_TRANSFORM_CACHE_H
32
33#include "CmPhysXCommon.h"
34#include "CmIDPool.h"
35#include "CmBitMap.h"
36#include "PsUserAllocated.h"
37#include "PsAllocator.h"
38
39#define PX_DEFAULT_CACHE_SIZE 512
40
41namespace physx
42{
43 struct PxsTransformFlag
44 {
45 enum Flags
46 {
47 eFROZEN = (1 << 0)
48 };
49 };
50
51 struct PX_ALIGN_PREFIX(16) PxsCachedTransform
52 {
53 PxTransform transform;
54 PxU32 flags;
55
56 PX_FORCE_INLINE PxU32 isFrozen() const { return flags & PxsTransformFlag::eFROZEN; }
57 }
58 PX_ALIGN_SUFFIX(16);
59
60
61 class PxsTransformCache : public Ps::UserAllocated
62 {
63 typedef PxU32 RefCountType;
64
65 public:
66 PxsTransformCache(Ps::VirtualAllocatorCallback& allocatorCallback) : mTransformCache(Ps::VirtualAllocator(&allocatorCallback)), mHasAnythingChanged(true)
67 {
68 /*mTransformCache.reserve(PX_DEFAULT_CACHE_SIZE);
69 mTransformCache.forceSize_Unsafe(PX_DEFAULT_CACHE_SIZE);*/
70 mUsedSize = 0;
71 }
72
73 void initEntry(PxU32 index)
74 {
75 PxU32 oldCapacity = mTransformCache.capacity();
76 if (index >= oldCapacity)
77 {
78 PxU32 newCapacity = Ps::nextPowerOfTwo(x: index);
79 mTransformCache.reserve(capacity: newCapacity);
80 mTransformCache.forceSize_Unsafe(size: newCapacity);
81 }
82 mUsedSize = PxMax(a: mUsedSize, b: index + 1u);
83 }
84
85
86 PX_FORCE_INLINE void setTransformCache(const PxTransform& transform, const PxU32 flags, const PxU32 index)
87 {
88 mTransformCache[index].transform = transform;
89 mTransformCache[index].flags = flags;
90 mHasAnythingChanged = true;
91 }
92
93 PX_FORCE_INLINE const PxsCachedTransform& getTransformCache(const PxU32 index) const
94 {
95 return mTransformCache[index];
96 }
97
98
99 PX_FORCE_INLINE PxsCachedTransform& getTransformCache(const PxU32 index)
100 {
101 return mTransformCache[index];
102 }
103
104 PX_FORCE_INLINE void shiftTransforms(const PxVec3& shift)
105 {
106 for (PxU32 i = 0; i < mTransformCache.capacity(); i++)
107 {
108 mTransformCache[i].transform.p += shift;
109 }
110 mHasAnythingChanged = true;
111 }
112
113 PX_FORCE_INLINE PxU32 getTotalSize() const
114 {
115 return mUsedSize;
116 }
117
118 PX_FORCE_INLINE const PxsCachedTransform* getTransforms() const
119 {
120 return mTransformCache.begin();
121 }
122
123 PX_FORCE_INLINE PxsCachedTransform* getTransforms()
124 {
125 return mTransformCache.begin();
126 }
127
128 PX_FORCE_INLINE Ps::Array<PxsCachedTransform, Ps::VirtualAllocator>* getCachedTransformArray()
129 {
130 return &mTransformCache;
131 }
132
133 PX_FORCE_INLINE void resetChangedState() { mHasAnythingChanged = false; }
134 PX_FORCE_INLINE void setChangedState() { mHasAnythingChanged = true; }
135 PX_FORCE_INLINE bool hasChanged() const { return mHasAnythingChanged; }
136
137 private:
138 Ps::Array<PxsCachedTransform, Ps::VirtualAllocator> mTransformCache;
139 PxU32 mUsedSize;
140 bool mHasAnythingChanged;
141 };
142}
143
144#endif
145

source code of qtquick3dphysics/src/3rdparty/PhysX/source/lowlevel/software/include/PxsTransformCache.h