• Announcements

    • khawk

      Download the Game Design and Indie Game Marketing Freebook   07/19/17

      GameDev.net and CRC Press have teamed up to bring a free ebook of content curated from top titles published by CRC Press. The freebook, Practices of Game Design & Indie Game Marketing, includes chapters from The Art of Game Design: A Book of Lenses, A Practical Guide to Indie Game Marketing, and An Architectural Approach to Level Design. The GameDev.net FreeBook is relevant to game designers, developers, and those interested in learning more about the challenges in game development. We know game development can be a tough discipline and business, so we picked several chapters from CRC Press titles that we thought would be of interest to you, the GameDev.net audience, in your journey to design, develop, and market your next game. The free ebook is available through CRC Press by clicking here. The Curated Books The Art of Game Design: A Book of Lenses, Second Edition, by Jesse Schell Presents 100+ sets of questions, or different lenses, for viewing a game’s design, encompassing diverse fields such as psychology, architecture, music, film, software engineering, theme park design, mathematics, anthropology, and more. Written by one of the world's top game designers, this book describes the deepest and most fundamental principles of game design, demonstrating how tactics used in board, card, and athletic games also work in video games. It provides practical instruction on creating world-class games that will be played again and again. View it here. A Practical Guide to Indie Game Marketing, by Joel Dreskin Marketing is an essential but too frequently overlooked or minimized component of the release plan for indie games. A Practical Guide to Indie Game Marketing provides you with the tools needed to build visibility and sell your indie games. With special focus on those developers with small budgets and limited staff and resources, this book is packed with tangible recommendations and techniques that you can put to use immediately. As a seasoned professional of the indie game arena, author Joel Dreskin gives you insight into practical, real-world experiences of marketing numerous successful games and also provides stories of the failures. View it here. An Architectural Approach to Level Design This is one of the first books to integrate architectural and spatial design theory with the field of level design. The book presents architectural techniques and theories for level designers to use in their own work. It connects architecture and level design in different ways that address the practical elements of how designers construct space and the experiential elements of how and why humans interact with this space. Throughout the text, readers learn skills for spatial layout, evoking emotion through gamespaces, and creating better levels through architectural theory. View it here. Learn more and download the ebook by clicking here. Did you know? GameDev.net and CRC Press also recently teamed up to bring GDNet+ Members up to a 20% discount on all CRC Press books. Learn more about this and other benefits here.
Sign in to follow this  
Followers 0
smallGame

Particles engine interface feedback

4 posts in this topic

 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,

0

Share this post


Link to post
Share on other sites

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

0

Share this post


Link to post
Share on other sites

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.

 

 

 

 

0

Share this post


Link to post
Share on other sites


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

Share this post


Link to post
Share on other sites

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

0

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now
Sign in to follow this  
Followers 0