Particles engine interface feedback

Started by
3 comments, last by smallGame 10 years, 6 months ago

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;
    float   m_Radius;
};

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

    vrSpring():m_Pad(0) {}
};

// 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;
    float           m_Radius;
    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);

    // Add collision geometry
    void AddInsideAabb(const vrAabb& aabb);
    void AddOutsideAabb(const vrAabb& aabb);
    void AddInsideSphere(const vrSphere& sphere);
    void AddOutsideSphere(const vrSphere& sphere);

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

    // Add a constraint between two particles
    void AddSpring(const vrSpring& spring);

    // Accelerators
    // Add an accelerator, to use to setup a force field or simple gravity
    void AddAccelerator(const vrAccelerator & accelerator);
    // 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,

Advertisement

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"

Thanks for your feedback,

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.


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"


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 :)

This topic is closed to new replies.

Advertisement