X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Fparticles.h;h=6f518b7710056ae6bfe1d7f21d413a4636a29809;hb=f2fd4432625ee5cf0380bdd006cd1f15d053b12f;hp=64b4db0c400aa500c417eb2da90c16a2d7200e0b;hpb=fd3afbced5410639325e730d5710b8b5039b320e;p=dragonfireclient.git diff --git a/src/particles.h b/src/particles.h index 64b4db0c4..6f518b771 100644 --- a/src/particles.h +++ b/src/particles.h @@ -19,192 +19,61 @@ with this program; if not, write to the Free Software Foundation, Inc., #pragma once -#include -#include "irrlichttypes_extrabloated.h" -#include "client/tile.h" -#include "localplayer.h" +#include +#include "irrlichttypes_bloated.h" #include "tileanimation.h" - -struct ClientEvent; -class ParticleManager; -class ClientEnvironment; -struct MapNode; -struct ContentFeatures; - -class Particle : public scene::ISceneNode -{ - public: - Particle( - IGameDef* gamedef, - LocalPlayer *player, - ClientEnvironment *env, - v3f pos, - v3f velocity, - v3f acceleration, - float expirationtime, - float size, - 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(); - - virtual const aabb3f &getBoundingBox() const - { - return m_box; +#include "mapnode.h" + +// This file defines the particle-related structures that both the server and +// client need. The ParticleManager and rendering is in client/particles.h + +struct CommonParticleParams { + bool collisiondetection = false; + bool collision_removal = false; + bool object_collision = false; + bool vertical = false; + std::string texture; + struct TileAnimationParams animation; + u8 glow = 0; + MapNode node; + u8 node_tile = 0; + + CommonParticleParams() { + animation.type = TAT_NONE; + node.setContent(CONTENT_IGNORE); } - virtual u32 getMaterialCount() const - { - return 1; + /* This helper is useful for copying params from + * ParticleSpawnerParameters to ParticleParameters */ + inline void copyCommon(CommonParticleParams &to) const { + to.collisiondetection = collisiondetection; + to.collision_removal = collision_removal; + to.object_collision = object_collision; + to.vertical = vertical; + to.texture = texture; + to.animation = animation; + to.glow = glow; + to.node = node; + to.node_tile = node_tile; } - - virtual video::SMaterial& getMaterial(u32 i) - { - return m_material; - } - - virtual void OnRegisterSceneNode(); - virtual void render(); - - void step(float dtime); - - bool get_expired () - { return m_expiration < m_time; } - -private: - void updateLight(); - void updateVertices(); - - video::S3DVertex m_vertices[4]; - float m_time = 0.0f; - float m_expiration; - - ClientEnvironment *m_env; - IGameDef *m_gamedef; - 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; - LocalPlayer *m_player; - float m_size; - //! 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(); +struct ParticleParameters : CommonParticleParams { + v3f pos; + v3f vel; + v3f acc; + f32 expirationtime = 1; + f32 size = 1; - 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 serialize(std::ostream &os, u16 protocol_ver) const; + void deSerialize(std::istream &is, u16 protocol_ver); }; -/** - * 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 addPunchingParticles(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); - -protected: - void addParticle(Particle* toadd); - -private: - - void stepParticles (float dtime); - void stepSpawners (float dtime); - - void clearAll (); - - std::vector m_particles; - std::map m_particle_spawners; +struct ParticleSpawnerParameters : CommonParticleParams { + u16 amount = 1; + v3f minpos, maxpos, minvel, maxvel, minacc, maxacc; + f32 time = 1; + f32 minexptime = 1, maxexptime = 1, minsize = 1, maxsize = 1; - ClientEnvironment* m_env; - std::mutex m_particle_list_lock; - std::mutex m_spawner_list_lock; + // For historical reasons no (de-)serialization methods here };