//////////////////////////////////////////////////////////////////////////////////
// SPARK particle engine //
// Copyright (C) 2008-2009 - Julien Fryer - julienfryer@gmail.com //
// //
// This software is provided 'as-is', without any express or implied //
// warranty. In no event will the authors be held liable for any damages //
// arising from the use of this software. //
// //
// Permission is granted to anyone to use this software for any purpose, //
// including commercial applications, and to alter it and redistribute it //
// freely, subject to the following restrictions: //
// //
// 1. The origin of this software must not be misrepresented; you must not //
// claim that you wrote the original software. If you use this software //
// in a product, an acknowledgment in the product documentation would be //
// appreciated but is not required. //
// 2. Altered source versions must be plainly marked as such, and must not be //
// misrepresented as being the original software. //
// 3. This notice may not be removed or altered from any source distribution. //
//////////////////////////////////////////////////////////////////////////////////
#ifndef H_SPK_BUFFER
#define H_SPK_BUFFER
namespace SPK
{
class Particle;
class Group;
/**
* @brief An abstract class that defines the interface for the additional buffers of Group
*
* A buffer allows a Group to hold additional data.
* Typically, they are used for rendering as the GPU or the rendering engine needs data to be organized in a specific way.
*
* Their use can be extended to anything to store data within a group.
* Buffers can also be swapped as particles are swap within a group. This allows to have the ordering of data consistent with the ordering of particles.
* However, if the buffers are only used for temporary storage on a single frame (most of the renderers), it is not necessary to swap the data.
*
* A buffer also contains a flag which is an unsigned integer that can be used to check the validity of the buffer from frame to frame.
*
* Note that only a group can create and delete a buffer. The user can ask a group to create a new buffer by passing a BufferCreator object to it.
* Check out the group interface about buffers for more info.
*
* @since 1.03.02
*/
class Buffer
{
friend class BufferCreator;
friend class Group;
friend void swapParticles(Particle& a,Particle& b);
public :
/**
* @brief Gets the current flag of this buffer
* @return the current flag of this buffer
*/
inline unsigned int getFlag() const;
/**
* @brief Tells whether data is swapped as particles in the group are swapped
* @return true if data must be swapped with particles, false if not
*/
inline bool isSwapEnabled() const;
protected :
Buffer() {};
virtual ~Buffer() {};
private :
unsigned int flag;
bool swapEnabled;
/**
* @brief Swaps 2 particles data in this buffer
*
* This is a pure virtual method that must be implemented by inherited classes of buffer.
*
* @param index0 : the index of the first particle to swap
* @param index1 : the index of the second particle to swap
*/
virtual void swap(size_t index0,size_t index1) = 0;
};
/**
* @brief A class used by a Group to create an additional Buffer
*
* This class defines a temporary object to pass to a Group so that it can create and store a new buffer.
* Check out the method Group::createBuffer(const std::string&,const BufferCreator&,unsigned int,bool) for more information.
*
* @since 1.03.02
*/
class BufferCreator
{
friend class Group;
/**
* @brief Creates a new buffer
*
* This method is called internally by a group to create and store an new buffer.
* This is a pure virtual method that must be implemented by inherited classes of buffer.
*
* @param nbParticles : the number of particles the buffer must be able to store
* @param group : the group which contains the buffer
*/
virtual Buffer* createBuffer(size_t nbParticles,const Group& group) const = 0;
};
inline unsigned int Buffer::getFlag() const
{
return flag;
}
inline bool Buffer::isSwapEnabled() const
{
return swapEnabled;
}
}
#endif