|
| ParticleSystemCPU (size_t particleCount, const std::string &name, Scene *scene=0, Model *model=0, const glm::mat4 &modelMatrix=glm::mat4(1.0f)) |
|
virtual | ~ParticleSystemCPU () |
|
void | push (const glm::vec3 &pos) |
|
void | draw () const |
|
bool | animate (double time) |
|
void | update (double deltaT) |
|
void | setShader (Shader *val) |
|
| SceneObject (std::shared_ptr< SceneObject > &effectParent, const glm::mat4 &modelMatrix=glm::mat4(1)) |
|
| SceneObject (const std::string &name, Scene *scene=0, Model *model=0, const glm::mat4 &modelMatrix=glm::mat4(1)) |
|
virtual | ~SceneObject () |
|
Model * | getModel () const |
|
Shader * | getShader () const |
|
glm::mat4 | getModelMatrix () const |
|
glm::mat4 | getGlobalModelMatrix () const |
|
std::string | getName () const |
|
std::shared_ptr< SceneObject > | getParent () const |
|
void | setAnimationTime (double time) |
|
bool | setAnimation (const Animation &anim) |
|
bool | delChild (size_t idx) |
|
bool | getChild (size_t idx, std::shared_ptr< SceneObject > &child) const |
|
bool | addChild (std::shared_ptr< SceneObject > &child) |
|
bool | remEffect (const std::string &name) |
|
SceneObject * | getEffect (const std::string &name) const |
|
bool | addEffect (const std::string &name, std::unique_ptr< SceneObject > &effect) |
|
bool | doNotRender () |
|
bool | getIsVolSun () |
|
virtual void | reset () |
|
Implementation of CPU particle system.
- Author
- Adam
When a tank is moving, it is leaving trail after itself. Each trail is a simple quad. When a new trail is added, it's position is written into a buffer and it's transparency is 1. During each update(), the transparency is decreased with a factor until it reaches 0. On zero the particle is dead and not updated. It uses transparency therefore sorting is needed based on the camera distance. Transparent objects must be rendered in the order of their distance from the camera. The highest is rendered first. This must be done, because if a transparent object is rendered, then later an object is rendered which is occluded by the transparent one, then because of the depth test, the later object would not be rendered. On each draw() the position and the transparency of each living particle is uploaded and drawn with instancing.
- See also
- http://www.opengl-tutorial.org/intermediate-tutorials/billboards-particles/particles-instancing/