The Shield Manager manages shields, impacts and rendering those. More...
#include <CShieldManager.h>
Classes | |
struct | SImpact |
Struct to handle the impacts. | |
struct | SShield |
Struct to handle the shield nodes. | |
Public Member Functions | |
CShieldManager (scene::ISceneManager *psmgr, irr::ITimer *ptimer) | |
Constructor. | |
~CShieldManager () | |
Destructor. | |
void | drawAll () |
Renders the shields. | |
virtual void | OnSetConstants (video::IMaterialRendererServices *services, s32 userData) |
Sets the uniform variables for the shader. | |
bool | addShield (scene::ISceneNode *node) |
Add a new shield. | |
bool | removeShield (scene::ISceneNode *node) |
Remove a shield. | |
bool | addLocalImpact (const scene::ISceneNode *node, const core::vector3df position, const f32 radius=1, const u32 duration=500, const video::SColorf color=video::SColorf(1, 1, 1, 1)) |
Add an impact in object space to the shield. | |
bool | addGlobalImpact (const scene::ISceneNode *node, core::vector3df &position, const f32 radius=1, const u32 duration=500, const video::SColorf color=video::SColorf(1, 1, 1, 1)) |
Add an impact in global space to the shield. | |
core::vector3df | addImpact (const scene::ISceneNode *node, const core::line3df ray, const f32 radius=1, const u32 duration=500, const video::SColorf color=video::SColorf(1, 1, 1, 1)) |
Let the manager determine the impact position by using a given ray. |
The Shield Manager manages shields, impacts and rendering those.
All shields and impacts are structs sorted in an array. The shields are managed in an array attribute of the manager and the impact in an array of the respective shield. The manager also has a drawAll method like the scene manager. It is used the same way. You can add any mesh node as a shield. However, it is recomended that you use nodes that are transparent with EMT_TRANSPARENT_ADD_COLOR or EMT_TRANSPARENT_ALPHA_CHANNEL.
The first texture of the node should be completely transparent (layer 0).
The second will be used as a base color map by the shader (layer 1).
The third texture will be used for a gradient effect (layer 2).
CShieldManager::CShieldManager | ( | scene::ISceneManager * | psmgr, | |
irr::ITimer * | ptimer | |||
) |
Constructor.
Sets up the manager and creates the shader
psmgr | SceneManager of the device | |
ptimer | Timer of the device |
GLSL Shader Code
bool CShieldManager::addGlobalImpact | ( | const scene::ISceneNode * | node, | |
core::vector3df & | position, | |||
const f32 | radius = 1 , |
|||
const u32 | duration = 500 , |
|||
const video::SColorf | color = video::SColorf(1,1,1,1) | |||
) |
Add an impact in global space to the shield.
node | The node that acts as a shield | |
position | The position of the impact on the shield in global space | |
radius | The maximum radius of the impact | |
duration | The impact's lifespan | |
color | The Color of the impact |
core::vector3df CShieldManager::addImpact | ( | const scene::ISceneNode * | node, | |
const core::line3df | ray, | |||
const f32 | radius = 1 , |
|||
const u32 | duration = 500 , |
|||
const video::SColorf | color = video::SColorf(1,1,1,1) | |||
) |
Let the manager determine the impact position by using a given ray.
node | The node that acts as a shield | |
ray | The ray that hits the shield | |
radius | The maximum radius of the impact | |
duration | The impact's lifespan | |
color | The Color of the impact |
bool CShieldManager::addLocalImpact | ( | const scene::ISceneNode * | node, | |
const core::vector3df | position, | |||
const f32 | radius = 1 , |
|||
const u32 | duration = 500 , |
|||
const video::SColorf | color = video::SColorf(1,1,1,1) | |||
) |
Add an impact in object space to the shield.
node | The node that acts as a shield | |
position | The position of the impact on the shield in the shieldnode's local space | |
radius | The maximum radius of the impact | |
duration | The impact's lifespan | |
color | The Color of the impact |
bool CShieldManager::addShield | ( | scene::ISceneNode * | node | ) |
Add a new shield.
node | The node that shall act as a shield |
void CShieldManager::drawAll | ( | ) |
Renders the shields.
Different effects for the shield: You can calculate the impacts radius with a function that uses "dif" as an argument. dif is betweeen 0.0 (life start) and 1.0 (life end)
These are two preset effects:
1. Absorbing effect:
tmp_radius = array_Shields[i].array_Impacts[j].radius*(0.25 - pow((dif-0.5),2)); tmp_color = array_Shields[i].array_Impacts[j].color;
2. Fade-out effect:
tmp_radius = array_Shields[i].array_Impacts[j].radius*dif; tmp_color = array_Shields[i].array_Impacts[j].color; tmp_color.a = 1-dif;
bool CShieldManager::removeShield | ( | scene::ISceneNode * | node | ) |
Remove a shield.
node | The shield that shall be removed |