• Create Account

## Particles engine interface feedback

Old topic!

Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

4 replies to this topic

### #1smallGame  Members

211
Like
0Likes
Like

Posted 24 September 2013 - 07:20 PM

Hi,

I started to write a physics particle engine, I still have to finish a lot of stuff before releasing the 0.1 version.

I d like to have some feedback on the interface I provide at this stage.

#ifndef PHYSICS_PARTICLE
#define PHYSICS_PARTICLE

#ifdef EXPORT_DLL
#define MYPROJECT_API __declspec(dllexport)
#else
#define MYPROJECT_API __declspec(dllimport)
#endif

struct ID3D11Device;
struct ID3D11Buffer;

// A vector 3
struct MYPROJECT_API vrVec3
{
float x, y, z;
};

// A vector 4
struct MYPROJECT_API vrVec4 : public vrVec3
{
float w;
};

// An Axis Aligned Bounding Volume
struct MYPROJECT_API vrAabb
{
vrVec4 m_Min;
vrVec4 m_Max;
};

// A sphere
struct MYPROJECT_API vrSphere
{
vrVec3  m_Position;
};

// A distance constraint between two paricles
struct MYPROJECT_API vrSpring
{
int     m_ParticleIndex1;
int     m_ParticleIndex2;
float   m_Distance;

};

// A particle accelerator
// Type 0 is a force field,
// Type 1 is a simple force, that uses only the directionvector
struct MYPROJECT_API vrAccelerator
{
enum { FORCE_FIELD = 0, SIMPLE_FORCE = 1, ACCELRATOR_TYPES_COUNT};
vrVec4          m_Position;
vrVec4          m_Direction;
unsigned int    m_Type;
};

class MYPROJECT_API PhysicsParticle
{

public:
PhysicsParticle();
~PhysicsParticle();

// Particles positions accesor
vrVec4 *GetParticlePositions() const;
vrVec4 *GetPreviousPositions() const;
int GetParticlesCount() const;

// Setters
void SetParticlesMass(float mass);
void SetParticlesGazConstant(float mass);
void SetParticlesViscosity(float viscosity);
void SetParticlesAcceleration(const vrVec4 &acceleration);
void SetDamping(float damping);

// Getters
float GetParticlesMass() const;
float GetParticlesGazConstant() const;
float GetParticlesViscosity() const;

// Initialize particles start position
void Initialize(vrVec4 *positions,int positionsCount);

// Intialize openCL device
void InitializeOpenCL(  ID3D11Device *d3D11Device = 0 ,
ID3D11Buffer *d3D11buffer = 0);

// Initialize data to the device
void InitializeOpenClData();

// Physics step
void Simulate();

// Release allocated memory
void Release();

// Dynamic grid used to test or to get neighbors information
void CreateGrid(vrVec4 *positions, int positionsCount);
void CreateGrid();
int GetNeighbors(int currentIndex,  int *neighbors, int neighborsMaxCount);

// Accesor to modify them, the returned ponters could change when
vrAabb    *GetInsideAabbs();
vrSphere  *GetOutsideSpheres();
int GetInsideAabbsCount() const;
int GetOutsideSpheresCount() const;

// Add a constraint between two particles

// Accelerators
// Add an accelerator, to use to setup a force field or simple gravity
// Removes all accelerator
void ClearAccelerators();
void UpdateAccelerator(int index, const vrAccelerator& accelerator);

// Physcal parameter
// Grid and sph
void SetEnableGridOnGPU(bool isCreatingGridOnGPU);
void SetEnableSPHAndIntegrateOnGPU(bool sphAndIntegrateOnGPU);
void SetEnableCollisionOnGPU(bool collisionOnGPU);
void SetEnableSpringOnGPU(bool springOnGPU);
void SetEnableAcceleratorOnGPU(bool acceleratorOnGPU);

// Cloth only for springs
void SetClothCount(int clothCount);

// Enabling interoperability
void SetIsUsingInteroperability(bool isUsingInteroperability);
bool IsUsingInteroperability() const;

// Running physics on the CPU, GPU is used by default
void SetIsUsingCPU(bool isUsingCPU);
};

#endif // PHYSICS_PARTICLE


I also have a Youtube channel where you can see some samples : http://www.youtube.com/user/uuuq78/videos perf in description.

Cheers,

### #2MaxDZ8  Members

4976
Like
0Likes
Like

Posted 26 September 2013 - 01:19 AM

Take a look at Bullet source code (or any other performance-oriented library) to set up your data in SIMD-friendly way. The performance benefit is significant. I have no understanding what PhysicsParticle is because some methods seems to suggest it's a set of interacting particles, and they are quite explicit, not to mention we have particle indices in vrSpring. Some renaming appears to be needed.

I see you have a lot of raw numbers in your youtube channel. That's good, but without a correlation to hardware in use they mean "runs".

Previously "Krohm"

### #3smallGame  Members

211
Like
0Likes
Like

Posted 26 September 2013 - 11:16 AM

set up your data in SIMD-friendly way

Internally my data are SIMD friendly, I use SIMD vector, and allocations are aligned. I copy the given vectors, the user can delete or do whatever with the given data I don't keep any reference on it. Anyway it won't changed anything because internally I am using float4 from openCL. The use of the

SetIsUsingCPU (true);

function also use openCL.

Why are you telling me about SIMD ? Do you think my perfs are terrible ?

I have no understanding what PhysicsParticle is because some methods seems to suggest it's a set of interacting particles

Yes it is. And you point out what is really bad; at this stage I only handle one set of particles, I have to remove this limitation...

not to mention we have particle indices in vrSpring. Some renaming appears to be needed.

The indices are referencing the particles positions set  by:

Initialize(vrVec4 *positions, int positionsCount);

0 -> first particle position.

Not sure to see what it is not clear there. but for sure there are some missing comments.

By the way I have done some other tests and I solve about 24 000 constraints (vrSpring) in 0.17ms, by removing a CPU transfer...

I see you have a lot of raw numbers in your youtube channel. That's good, but without a correlation to hardware in use they mean "runs".

Yes you're completely right I have a Radeon serie 79 something.I also have to use a a real profiler maybe. I am using my own at this stage...

Thanks for your comments, and if you want to try it I can give it.

I have a particle renderer, this particle interface and a framework which has a keyboard, a mouse control, a basic camera, and that use the physics output to give it to the renderer. I also have the different sample we can see on my Youtube channel.

### #4MaxDZ8  Members

4976
Like
0Likes
Like

Posted 26 September 2013 - 11:54 AM

Why are you telling me about SIMD ? Do you think my perfs are terrible ?
No, I see
// A vector 3
struct MYPROJECT_API vrVec3
{
float x, y, z;
};


If you have SIMD in, just have SIMD out. It's ok.

0 -> first particle position.
Not sure to see what it is not clear there. but for sure there are some missing comments.

The thing that is not clear is: why do you call it PhysicsParticle while it's clear it's a whole particle system? Just call it ParticleSystem. ParticleSet...

Previously "Krohm"

### #5smallGame  Members

211
Like
0Likes
Like

Posted 26 September 2013 - 04:07 PM

The thing that is not clear is: why do you call it PhysicsParticle while it's clear it's a whole particle system? Just call it ParticleSystem. ParticleSet...

Good point

Old topic!

Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.