[DEV] display of the first particule done
This commit is contained in:
parent
013e809172
commit
912f4b8316
@ -13,6 +13,7 @@ namespace ege {
|
|||||||
class Environement;
|
class Environement;
|
||||||
class ElementInteraction;
|
class ElementInteraction;
|
||||||
};
|
};
|
||||||
|
#include <ege/Camera.h>
|
||||||
|
|
||||||
#include <etk/UString.h>
|
#include <etk/UString.h>
|
||||||
#include <BulletDynamics/Dynamics/btActionInterface.h>
|
#include <BulletDynamics/Dynamics/btActionInterface.h>
|
||||||
|
@ -15,6 +15,7 @@ namespace ege {
|
|||||||
|
|
||||||
#include <etk/UString.h>
|
#include <etk/UString.h>
|
||||||
#include <ege/Environement.h>
|
#include <ege/Environement.h>
|
||||||
|
#include <ege/Camera.h>
|
||||||
|
|
||||||
|
|
||||||
namespace ege {
|
namespace ege {
|
||||||
@ -31,9 +32,10 @@ namespace ege {
|
|||||||
public:
|
public:
|
||||||
/**
|
/**
|
||||||
* @brief Constructor.
|
* @brief Constructor.
|
||||||
* @param[in] _env reference on the envorionement ...
|
* @param[in] _particuleEngine reference on the particule engine ...
|
||||||
|
* @param[in] _particuleType Type of the particule (Set NULL if you did not want to use the respowner ...)
|
||||||
*/
|
*/
|
||||||
Particule(ege::ParticuleEngine& _particuleEngine, const char* _particuleType);
|
Particule(ege::ParticuleEngine& _particuleEngine, const char* _particuleType = NULL);
|
||||||
/**
|
/**
|
||||||
* @brief Destructor.
|
* @brief Destructor.
|
||||||
*/
|
*/
|
||||||
@ -54,13 +56,18 @@ namespace ege {
|
|||||||
/**
|
/**
|
||||||
* @brief Draw the current particule
|
* @brief Draw the current particule
|
||||||
*/
|
*/
|
||||||
virtual void Draw(void) { };
|
virtual void Draw(const ege::Camera& _camera) { };
|
||||||
/**
|
/**
|
||||||
* @brief Check if the element might be removed
|
* @brief Check if the element might be removed
|
||||||
* @return true : The element might be removed
|
* @return true : The element might be removed
|
||||||
* @return false : The element might be keeped
|
* @return false : The element might be keeped
|
||||||
*/
|
*/
|
||||||
virtual bool NeedRemove(void) { return false; };
|
virtual bool NeedRemove(void) { return false; };
|
||||||
|
/**
|
||||||
|
* @brief Get the type of the particule
|
||||||
|
* @return Type of the current particule
|
||||||
|
*/
|
||||||
|
const char* GetParticuleType(void) { return m_particuleType; };
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -20,7 +20,7 @@ ege::ParticuleEngine::ParticuleEngine(ege::Environement& _env) :
|
|||||||
|
|
||||||
ege::ParticuleEngine::~ParticuleEngine(void)
|
ege::ParticuleEngine::~ParticuleEngine(void)
|
||||||
{
|
{
|
||||||
|
Clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ege::ParticuleEngine::Add(Particule* _particule)
|
void ege::ParticuleEngine::Add(Particule* _particule)
|
||||||
@ -40,8 +40,47 @@ void ege::ParticuleEngine::Add(Particule* _particule)
|
|||||||
m_particuleList.PushBack(_particule);
|
m_particuleList.PushBack(_particule);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ege::ParticuleEngine::AddRemoved(Particule* _particule)
|
||||||
|
{
|
||||||
|
if (_particule==NULL) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
for (esize_t iii=0; iii<m_particuleRemoved.Size(); ++iii) {
|
||||||
|
if (m_particuleRemoved[iii] != NULL) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
m_particuleRemoved[iii] = _particule;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// Just add it at the end ...
|
||||||
|
m_particuleRemoved.PushBack(_particule);
|
||||||
|
}
|
||||||
|
|
||||||
|
ege::Particule* ege::ParticuleEngine::Respown(const char* _particuleType)
|
||||||
|
{
|
||||||
|
if (_particuleType == NULL) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
for (esize_t iii=0; iii<m_particuleRemoved.Size(); ++iii) {
|
||||||
|
if (m_particuleRemoved[iii] == NULL) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (m_particuleRemoved[iii]->GetParticuleType()==_particuleType) {
|
||||||
|
Add(m_particuleRemoved[iii]);
|
||||||
|
ege::Particule* tmpParticule = m_particuleRemoved[iii];
|
||||||
|
m_particuleRemoved[iii]=NULL;
|
||||||
|
tmpParticule->Init();
|
||||||
|
return tmpParticule;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
void ege::ParticuleEngine::Update(float _deltaTime)
|
void ege::ParticuleEngine::Update(float _deltaTime)
|
||||||
{
|
{
|
||||||
|
if (_deltaTime>(1.0f/60.0f)) {
|
||||||
|
_deltaTime = (1.0f/60.0f);
|
||||||
|
}
|
||||||
for (esize_t iii=0; iii<m_particuleList.Size(); ++iii) {
|
for (esize_t iii=0; iii<m_particuleList.Size(); ++iii) {
|
||||||
if (m_particuleList[iii] == NULL) {
|
if (m_particuleList[iii] == NULL) {
|
||||||
continue;
|
continue;
|
||||||
@ -54,24 +93,40 @@ void ege::ParticuleEngine::Update(float _deltaTime)
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (m_particuleList[iii]->NeedRemove()) {
|
if (m_particuleList[iii]->NeedRemove()) {
|
||||||
delete m_particuleList[iii];
|
if (m_particuleList[iii]->GetParticuleType()==NULL) {
|
||||||
|
// Real remove particule ...
|
||||||
|
delete (m_particuleList[iii]);
|
||||||
|
} else {
|
||||||
|
AddRemoved(m_particuleList[iii]);
|
||||||
|
}
|
||||||
m_particuleList[iii] = NULL;
|
m_particuleList[iii] = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
/*
|
||||||
|
int32_t nbParticule = 0;
|
||||||
|
for (esize_t iii=0; iii<m_particuleList.Size(); ++iii) {
|
||||||
|
if (m_particuleList[iii] == NULL) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
nbParticule++;
|
||||||
|
}
|
||||||
|
EGE_DEBUG("number of particule : " << nbParticule);
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
void ege::ParticuleEngine::Draw(void)
|
void ege::ParticuleEngine::Draw(const ege::Camera& _camera)
|
||||||
{
|
{
|
||||||
for (esize_t iii=0; iii<m_particuleList.Size(); ++iii) {
|
for (esize_t iii=0; iii<m_particuleList.Size(); ++iii) {
|
||||||
if (m_particuleList[iii] == NULL) {
|
if (m_particuleList[iii] == NULL) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
m_particuleList[iii]->Draw();
|
m_particuleList[iii]->Draw(_camera);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ege::ParticuleEngine::Clear(void)
|
void ege::ParticuleEngine::Clear(void)
|
||||||
{
|
{
|
||||||
|
// clear element not removed
|
||||||
for (esize_t iii=0; iii<m_particuleList.Size(); ++iii) {
|
for (esize_t iii=0; iii<m_particuleList.Size(); ++iii) {
|
||||||
if (m_particuleList[iii] == NULL) {
|
if (m_particuleList[iii] == NULL) {
|
||||||
continue;
|
continue;
|
||||||
@ -80,4 +135,13 @@ void ege::ParticuleEngine::Clear(void)
|
|||||||
m_particuleList[iii] = NULL;
|
m_particuleList[iii] = NULL;
|
||||||
}
|
}
|
||||||
m_particuleList.Clear();
|
m_particuleList.Clear();
|
||||||
|
// clear element that are auto-removed
|
||||||
|
for (esize_t iii=0; iii<m_particuleRemoved.Size(); ++iii) {
|
||||||
|
if (m_particuleRemoved[iii] == NULL) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
delete m_particuleRemoved[iii];
|
||||||
|
m_particuleRemoved[iii] = NULL;
|
||||||
|
}
|
||||||
|
m_particuleRemoved.Clear();
|
||||||
}
|
}
|
||||||
|
@ -28,12 +28,44 @@ namespace ege {
|
|||||||
ParticuleEngine(ege::Environement& _env); // note : Need the engine to register has an dynamic element ... (the first ...)
|
ParticuleEngine(ege::Environement& _env); // note : Need the engine to register has an dynamic element ... (the first ...)
|
||||||
~ParticuleEngine(void);
|
~ParticuleEngine(void);
|
||||||
private:
|
private:
|
||||||
etk::Vector<Particule*> m_particuleList;
|
etk::Vector<Particule*> m_particuleList; //!< all particule created and active
|
||||||
|
etk::Vector<Particule*> m_particuleRemoved; //!< removed particule
|
||||||
public:
|
public:
|
||||||
|
/**
|
||||||
|
* @brief Clear the particule engine
|
||||||
|
*/
|
||||||
void Clear(void);
|
void Clear(void);
|
||||||
|
/**
|
||||||
|
* @brief Add a particule in the engine (internal acces only)
|
||||||
|
* @param[in] _particule Pointer on the particule to add
|
||||||
|
*/
|
||||||
void Add(Particule* _particule);
|
void Add(Particule* _particule);
|
||||||
|
private:
|
||||||
|
/**
|
||||||
|
* @brief Add a particule in the removed section ==> this not delete the particule, but just set it in an other list
|
||||||
|
* @param[in] _particule Pointer on the particule to add
|
||||||
|
*/
|
||||||
|
void AddRemoved(Particule* _particule);
|
||||||
|
public:
|
||||||
|
/**
|
||||||
|
* @brief Update particule properties
|
||||||
|
* @param[in] _deltaTime delta time to process
|
||||||
|
*/
|
||||||
void Update(float _deltaTime);
|
void Update(float _deltaTime);
|
||||||
void Draw(void);
|
/**
|
||||||
|
* @brief Draw all the active Particule
|
||||||
|
* @param[in] _camera Reference on the current camera
|
||||||
|
*/
|
||||||
|
void Draw(const ege::Camera& _camera);
|
||||||
|
/**
|
||||||
|
* @brief Get a particue with his type, we get particule that has been already removed, otherwise, you will create new
|
||||||
|
* @param[in] _particuleType Particule type, this chek only the pointer not the data.
|
||||||
|
* @return NULL, the particule has not been removed from the created pool
|
||||||
|
* @return The pointer on the requested element (an Init has been done).
|
||||||
|
* @note If you did not want to use respawn set type at NULL.
|
||||||
|
*/
|
||||||
|
Particule* Respown(const char* _particuleType);
|
||||||
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -22,11 +22,14 @@ ege::ParticuleSimple::ParticuleSimple(ege::ParticuleEngine& _particuleEngine, co
|
|||||||
|
|
||||||
void ege::ParticuleSimple::Init(void)
|
void ege::ParticuleSimple::Init(void)
|
||||||
{
|
{
|
||||||
m_life = 0;
|
m_lifeFull = 3;
|
||||||
|
m_life = m_lifeFull;
|
||||||
m_level = 0;
|
m_level = 0;
|
||||||
m_pos = vec3(0,0,0);
|
m_pos = vec3(0,0,0);
|
||||||
m_angle = vec4(0,0,0,0);
|
m_angle = vec4(0,0,0,0);
|
||||||
m_speed = vec3(0,0,0);
|
m_speed = vec3(0,0,0);
|
||||||
|
m_scale = vec3(1,1,1);
|
||||||
|
m_scaleExpand = vec3(0,0,0);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ege::ParticuleSimple::NeedRemove(void)
|
bool ege::ParticuleSimple::NeedRemove(void)
|
||||||
@ -37,13 +40,16 @@ bool ege::ParticuleSimple::NeedRemove(void)
|
|||||||
|
|
||||||
void ege::ParticuleSimple::Update(float _delta)
|
void ege::ParticuleSimple::Update(float _delta)
|
||||||
{
|
{
|
||||||
|
//EGE_DEBUG("Life : " << m_life << "-" << _delta);
|
||||||
m_life -= _delta;
|
m_life -= _delta;
|
||||||
m_pos += m_speed;
|
m_pos += m_speed*_delta;
|
||||||
|
m_scale += m_scaleExpand*_delta;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ege::ParticuleSimple::SetLife(float _life)
|
void ege::ParticuleSimple::SetLife(float _life)
|
||||||
{
|
{
|
||||||
m_life = _life;
|
m_lifeFull = _life;
|
||||||
|
m_life = m_lifeFull;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ege::ParticuleSimple::SetLevel(float _level)
|
void ege::ParticuleSimple::SetLevel(float _level)
|
||||||
@ -66,3 +72,12 @@ void ege::ParticuleSimple::SetMoveSpeed(const vec3& _speed)
|
|||||||
m_speed = _speed;
|
m_speed = _speed;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ege::ParticuleSimple::SetScale(const vec3& _scale)
|
||||||
|
{
|
||||||
|
m_scale = _scale;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ege::ParticuleSimple::SetScaleExpend(const vec3& _scaleExpand)
|
||||||
|
{
|
||||||
|
m_scaleExpand=_scaleExpand;
|
||||||
|
}
|
||||||
|
@ -46,11 +46,14 @@ namespace ege {
|
|||||||
virtual bool NeedRemove(void);
|
virtual bool NeedRemove(void);
|
||||||
virtual void Init(void);
|
virtual void Init(void);
|
||||||
protected:
|
protected:
|
||||||
|
float m_lifeFull;
|
||||||
float m_life;
|
float m_life;
|
||||||
float m_level;
|
float m_level;
|
||||||
vec3 m_pos;
|
vec3 m_pos;
|
||||||
vec4 m_angle;
|
vec4 m_angle;
|
||||||
vec3 m_speed;
|
vec3 m_speed;
|
||||||
|
vec3 m_scale;
|
||||||
|
vec3 m_scaleExpand;
|
||||||
public:
|
public:
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
@ -60,6 +63,8 @@ namespace ege {
|
|||||||
virtual void SetPosition(const vec3& _pos);
|
virtual void SetPosition(const vec3& _pos);
|
||||||
virtual void SetAngleSpeed(const vec4& _angle);
|
virtual void SetAngleSpeed(const vec4& _angle);
|
||||||
virtual void SetMoveSpeed(const vec3& _speed);
|
virtual void SetMoveSpeed(const vec3& _speed);
|
||||||
|
virtual void SetScale(const vec3& _scale);
|
||||||
|
virtual void SetScaleExpend(const vec3& _scaleExpand);
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -228,7 +228,9 @@ void ege::Scene::OnDraw(void)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
m_env.GetParticuleEngine().Draw();
|
if (NULL!=m_camera) {
|
||||||
|
m_env.GetParticuleEngine().Draw(*m_camera);
|
||||||
|
}
|
||||||
#ifdef SCENE_DISPLAY_SPEED
|
#ifdef SCENE_DISPLAY_SPEED
|
||||||
float localTime = (float)(ewol::GetTime() - g_startTime) / 1000.0f;
|
float localTime = (float)(ewol::GetTime() - g_startTime) / 1000.0f;
|
||||||
if (localTime>1) {
|
if (localTime>1) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user