X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Fparticles.h;h=11ccd6218c4c163f0c1b9c7178b9205724942b51;hb=45e9f8081140bfcf45f83508621a94df8f2bce20;hp=3ed9dfdc8bdad44817aa21ecd7d722ff7a196ca6;hpb=61f5ca6b164b035de41bd32bb9409c7e04ea0d41;p=dragonfireclient.git diff --git a/src/particles.h b/src/particles.h index 3ed9dfdc8..11ccd6218 100644 --- a/src/particles.h +++ b/src/particles.h @@ -1,6 +1,6 @@ /* -Minetest-c55 -Copyright (C) 2012 celeron55, Perttu Ahola +Minetest +Copyright (C) 2013 celeron55, Perttu Ahola This program is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by @@ -17,35 +17,45 @@ with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#ifndef PARTICLES_HEADER -#define PARTICLES_HEADER - -#define DIGGING_PARTICLES_AMOUNT 10 +#pragma once #include #include "irrlichttypes_extrabloated.h" -#include "tile.h" +#include "client/tile.h" #include "localplayer.h" -#include "environment.h" +#include "tileanimation.h" + +struct ClientEvent; +class ParticleManager; +class ClientEnvironment; +struct MapNode; +struct ContentFeatures; class Particle : public scene::ISceneNode { public: Particle( IGameDef* gamedef, - scene::ISceneManager* mgr, LocalPlayer *player, - s32 id, + ClientEnvironment *env, v3f pos, v3f velocity, v3f acceleration, float expirationtime, float size, - AtlasPointer texture + bool collisiondetection, + bool collision_removal, + bool vertical, + video::ITexture *texture, + v2f texpos, + v2f texsize, + const struct TileAnimationParams &anim, + u8 glow, + video::SColor color = video::SColor(0xFFFFFFFF) ); - ~Particle(); + ~Particle() = default; - virtual const core::aabbox3d& getBoundingBox() const + virtual const aabb3f &getBoundingBox() const { return m_box; } @@ -63,36 +73,135 @@ class Particle : public scene::ISceneNode virtual void OnRegisterSceneNode(); virtual void render(); - void step(float dtime, ClientEnvironment &env); + void step(float dtime); bool get_expired () { return m_expiration < m_time; } private: - float m_time; + void updateLight(); + void updateVertices(); + + video::S3DVertex m_vertices[4]; + float m_time = 0.0f; float m_expiration; + ClientEnvironment *m_env; IGameDef *m_gamedef; - core::aabbox3d m_box; - core::aabbox3d m_collisionbox; + aabb3f m_box; + aabb3f m_collisionbox; video::SMaterial m_material; + v2f m_texpos; + v2f m_texsize; v3f m_pos; v3f m_velocity; v3f m_acceleration; - float tex_x0; - float tex_x1; - float tex_y0; - float tex_y1; LocalPlayer *m_player; float m_size; - AtlasPointer m_ap; - u8 m_light; + //! Color without lighting + video::SColor m_base_color; + //! Final rendered color + video::SColor m_color; + bool m_collisiondetection; + bool m_collision_removal; + bool m_vertical; + v3s16 m_camera_offset; + struct TileAnimationParams m_animation; + float m_animation_time = 0.0f; + int m_animation_frame = 0; + u8 m_glow; +}; + +class ParticleSpawner +{ + public: + ParticleSpawner(IGameDef* gamedef, + LocalPlayer *player, + u16 amount, + float time, + v3f minp, v3f maxp, + v3f minvel, v3f maxvel, + v3f minacc, v3f maxacc, + float minexptime, float maxexptime, + float minsize, float maxsize, + bool collisiondetection, + bool collision_removal, + u16 attached_id, + bool vertical, + video::ITexture *texture, + u32 id, + const struct TileAnimationParams &anim, u8 glow, + ParticleManager* p_manager); + + ~ParticleSpawner() = default; + + void step(float dtime, ClientEnvironment *env); + + bool get_expired () + { return (m_amount <= 0) && m_spawntime != 0; } + + private: + ParticleManager* m_particlemanager; + float m_time; + IGameDef *m_gamedef; + LocalPlayer *m_player; + u16 m_amount; + float m_spawntime; + v3f m_minpos; + v3f m_maxpos; + v3f m_minvel; + v3f m_maxvel; + v3f m_minacc; + v3f m_maxacc; + float m_minexptime; + float m_maxexptime; + float m_minsize; + float m_maxsize; + video::ITexture *m_texture; + std::vector m_spawntimes; + bool m_collisiondetection; + bool m_collision_removal; + bool m_vertical; + u16 m_attached_id; + struct TileAnimationParams m_animation; + u8 m_glow; }; -void allparticles_step (float dtime, ClientEnvironment &env); +/** + * Class doing particle as well as their spawners handling + */ +class ParticleManager +{ +friend class ParticleSpawner; +public: + ParticleManager(ClientEnvironment* env); + ~ParticleManager(); + + void step (float dtime); + + void handleParticleEvent(ClientEvent *event, Client *client, + LocalPlayer *player); + + void addDiggingParticles(IGameDef *gamedef, LocalPlayer *player, v3s16 pos, + const MapNode &n, const ContentFeatures &f); + + void addNodeParticle(IGameDef *gamedef, LocalPlayer *player, v3s16 pos, + const MapNode &n, const ContentFeatures &f); -void addDiggingParticles(IGameDef* gamedef, scene::ISceneManager* smgr, LocalPlayer *player, v3s16 pos, const TileSpec tiles[]); -void addPunchingParticles(IGameDef* gamedef, scene::ISceneManager* smgr, LocalPlayer *player, v3s16 pos, const TileSpec tiles[]); -void addNodeParticle(IGameDef* gamedef, scene::ISceneManager* smgr, LocalPlayer *player, v3s16 pos, const TileSpec tiles[]); +protected: + void addParticle(Particle* toadd); -#endif +private: + + void stepParticles (float dtime); + void stepSpawners (float dtime); + + void clearAll (); + + std::vector m_particles; + std::map m_particle_spawners; + + ClientEnvironment* m_env; + std::mutex m_particle_list_lock; + std::mutex m_spawner_list_lock; +};