Jump to content

  • Log In with Google      Sign In   
  • 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.

  • You cannot reply to this topic
4 replies to this topic

#1 smallGame   Members   -  Reputation: 208

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;
    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,



Sponsor:

#2 Krohm   Crossbones+   -  Reputation: 3049

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".



#3 smallGame   Members   -  Reputation: 208

Like
0Likes
Like

Posted 26 September 2013 - 11:16 AM

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.

 

 

 

 



#4 Krohm   Crossbones+   -  Reputation: 3049

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...

#5 smallGame   Members   -  Reputation: 208

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.



PARTNERS