1/*
2 * Copyright (c) 2008-2015, NVIDIA CORPORATION. All rights reserved.
3 *
4 * NVIDIA CORPORATION and its licensors retain all intellectual property
5 * and proprietary rights in and to this software, related documentation
6 * and any modifications thereto. Any use, reproduction, disclosure or
7 * distribution of this software and related documentation without an express
8 * license agreement from NVIDIA CORPORATION is strictly prohibited.
9 */
10// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved.
11// Copyright (c) 2001-2004 NovodeX AG. All rights reserved.
12
13
14#ifndef PX_PARTICLESYSTEM_NXPARTICLEREADDATA
15#define PX_PARTICLESYSTEM_NXPARTICLEREADDATA
16/** \addtogroup particles
17 @{
18*/
19
20#include "foundation/PxStrideIterator.h"
21#include "PxLockedData.h"
22#include "foundation/PxFlags.h"
23#include "PxParticleFlag.h"
24
25#ifndef PX_DOXYGEN
26namespace physx
27{
28#endif
29
30/**
31Flags to configure PxParticleBase simulation output that can be read by the application.
32Disabling unneeded buffers saves memory and improves performance.
33*/
34struct PxParticleReadDataFlag
35 {
36 enum Enum
37 {
38 /**
39 Enables reading particle positions from the SDK.
40 @see PxParticleReadData.positionBuffer
41 */
42 ePOSITION_BUFFER = (1<<0),
43
44 /**
45 Enables reading particle velocities from the SDK.
46 @see PxParticleReadData.velocityBuffer
47 */
48 eVELOCITY_BUFFER = (1<<1),
49
50 /**
51 Enables reading per particle rest offsets from the SDK.
52 Per particle rest offsets are never changed by the simulation.
53 This option may only be used on particle systems that have
54 PxParticleBaseFlag.ePER_PARTICLE_REST_OFFSET enabled.
55 @see PxParticleBaseFlag.ePER_PARTICLE_REST_OFFSET
56 */
57 eREST_OFFSET_BUFFER = (1<<2),
58
59 /**
60 Enables reading particle flags from the SDK.
61 @see PxParticleReadData.flagsBuffer
62 */
63 eFLAGS_BUFFER = (1<<3),
64
65 /**
66 Enables reading particle collision normals from the SDK.
67 @see PxParticleReadData.collisionNormalBuffer
68 */
69 eCOLLISION_NORMAL_BUFFER = (1<<4),
70
71 /**
72 Enables reading particle collision velocities from the SDK.
73 @see PxParticleReadData.collisionVelocity
74 */
75 eCOLLISION_VELOCITY_BUFFER = (1<<5),
76
77 /**
78 Enables reading particle densities from the SDK. (PxParticleFluid only)
79 @see PxParticleFluidReadData.densityBuffer
80 */
81 eDENSITY_BUFFER = (1<<6)
82 };
83 };
84
85/**
86\brief collection of set bits defined in PxParticleReadDataFlag.
87
88@see PxParticleReadDataFlag
89*/
90typedef PxFlags<PxParticleReadDataFlag::Enum,PxU16> PxParticleReadDataFlags;
91PX_FLAGS_OPERATORS(PxParticleReadDataFlag::Enum,PxU16)
92
93/**
94\brief collection of set bits defined in PxParticleFlag.
95
96@see PxParticleFlag
97*/
98typedef PxFlags<PxParticleFlag::Enum,PxU16> PxParticleFlags;
99PX_FLAGS_OPERATORS(PxParticleFlag::Enum,PxU16)
100
101/**
102\brief Data layout descriptor for reading particle data from the SDK.
103
104PxParticleReadData is used to retrieve information about simulated particles. It can be accessed by calling PxParticleBase.lockParticleReadData().
105
106Each particle is described by its position, velocity, a set of (PxParticleFlag) flags and information on collisions (collision normal).
107The particle buffers are sparse, i.e. occupied particle indices will have PxParticleFlag.eVALID set in the corresponding entry of
108PxParticleReadData.flagsBuffer. Alternatively valid particles can be identified with the bitmap PxParticleReadData.validParticleBitmap.
109If (and only if) the index range of valid particles PxParticleReadData.validParticleRange is greater 0, i.e. any particles are present,
110data can be read from the particle buffers. Additionally individual particle buffers can only be read if the corresponding
111PxParticleReadDataFlag in particleReadDataFlags is set.
112
113The particle data buffer are defined in the range [0, PxParticleReadData.validParticleRange-1].
114The bitmap words are defined in the range [0, (PxParticleReadData.validParticleRange-1) >> 5].
115
116@see PxParticleBase::lockParticleReadData()
117*/
118class PxParticleReadData : public PxLockedData
119 {
120 public:
121
122 /**
123 \brief Number of particles (only including particles with PxParticleFlag.eVALID set).
124 */
125 PxU32 nbValidParticles;
126
127 /**
128 \brief Index after the last valid particle (PxParticleFlag.eVALID set). Its 0 if there are no valid particles.
129 */
130 PxU32 validParticleRange;
131
132 /**
133 \brief Bitmap marking valid particle indices. The bitmap is defined between [0, (PxParticleReadData.validParticleRange-1) >> 5].
134 \note Might be NULL if PxParticleReadData.validParticleRange == 0.
135 */
136 const PxU32* validParticleBitmap;
137
138 /**
139 \brief Particle position data.
140 */
141 PxStrideIterator<const PxVec3> positionBuffer;
142
143 /**
144 \brief Particle velocity data.
145 */
146 PxStrideIterator<const PxVec3> velocityBuffer;
147
148 /**
149 \brief Particle rest offset data.
150 */
151 PxStrideIterator<const PxF32> restOffsetBuffer;
152
153 /**
154 \brief Particle flags.
155 */
156 PxStrideIterator<const PxParticleFlags> flagsBuffer;
157
158 /**
159 \brief Collision normals of colliding particles.
160 The collision normal buffer is only guaranteed to be valid after the particle
161 system has been simulated. Otherwise collisionNormalBuffer.ptr() is NULL. This also
162 applies to particle systems that are not assigned to a scene.
163 */
164 PxStrideIterator<const PxVec3> collisionNormalBuffer;
165
166 /**
167 \brief Velocities of particles relative to shapes they collide with.
168 The collision velocity buffer is only guaranteed to be valid after the particle
169 system has been simulated. Otherwise collisionVelocityBuffer.ptr() is NULL. This also
170 applies to particle systems that are not assigned to a scene.
171 The collision velocity is identical to the particle velocity if the particle is not colliding.
172 */
173 PxStrideIterator<const PxVec3> collisionVelocityBuffer;
174
175 /**
176 \brief Returns PxDataAccessFlag::eREADABLE, since PxParticleReadData is read only data
177 @see PxLockedData
178 */
179 virtual PxDataAccessFlags getDataAccessFlags() = 0;
180
181 /**
182 \brief Unlocks the data.
183 @see PxLockedData
184 */
185 virtual void unlock() = 0;
186
187 /**
188 \brief virtual destructor
189 */
190 virtual ~PxParticleReadData() {}
191
192 };
193
194#ifndef PX_DOXYGEN
195} // namespace physx
196#endif
197
198/** @} */
199#endif
200