]> git.lizzy.rs Git - minetest.git/blobdiff - src/particles.h
Closed add object <-> object collision handling
[minetest.git] / src / particles.h
index a9d189e4e5c6ffe5b0724b43ec3414110a2039b2..308da551f997825c33febb3aa3ee856f1ba449bd 100644 (file)
@@ -1,6 +1,6 @@
 /*
 Minetest
-Copyright (C) 2012 celeron55, Perttu Ahola <celeron55@gmail.com>
+Copyright (C) 2013 celeron55, Perttu Ahola <celeron55@gmail.com>
 
 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
@@ -35,12 +35,13 @@ class Particle : public scene::ISceneNode
                IGameDef* gamedef,
                scene::ISceneManager* mgr,
                LocalPlayer *player,
-               s32 id,
+               ClientEnvironment &env,
                v3f pos,
                v3f velocity,
                v3f acceleration,
                float expirationtime,
                float size,
+               bool collisiondetection,
                AtlasPointer texture
        );
        ~Particle();
@@ -69,6 +70,10 @@ class Particle : public scene::ISceneNode
        { return m_expiration < m_time; }
 
 private:
+       void updateLight(ClientEnvironment &env);
+       void updateVertices();
+
+       video::S3DVertex m_vertices[4];
        float m_time;
        float m_expiration;
 
@@ -87,12 +92,71 @@ class Particle : public scene::ISceneNode
        float m_size;
        AtlasPointer m_ap;
        u8 m_light;
+       bool m_collisiondetection;
+};
+
+class ParticleSpawner
+{
+       public:
+       ParticleSpawner(IGameDef* gamedef,
+               scene::ISceneManager *smgr,
+               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,
+               AtlasPointer ap,
+               u32 id);
+
+       ~ParticleSpawner();
+
+       void step(float dtime, ClientEnvironment &env);
+
+       bool get_expired ()
+       { return (m_amount <= 0) && m_spawntime != 0; }
+
+       private:
+       float m_time;
+       IGameDef *m_gamedef;
+       scene::ISceneManager *m_smgr;
+       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;
+       AtlasPointer m_ap;
+       std::vector<float> m_spawntimes;
+       bool m_collisiondetection;
 };
 
 void allparticles_step (float dtime, ClientEnvironment &env);
+void allparticlespawners_step (float dtime, ClientEnvironment &env);
+
+void delete_particlespawner (u32 id);
+void clear_particles ();
+
+void addDiggingParticles(IGameDef* gamedef, scene::ISceneManager* smgr,
+       LocalPlayer *player, ClientEnvironment &env, v3s16 pos,
+       const TileSpec tiles[]);
+
+void addPunchingParticles(IGameDef* gamedef, scene::ISceneManager* smgr,
+       LocalPlayer *player, ClientEnvironment &env, v3s16 pos,
+       const TileSpec tiles[]);
 
-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[]);
+void addNodeParticle(IGameDef* gamedef, scene::ISceneManager* smgr,
+       LocalPlayer *player, ClientEnvironment &env, v3s16 pos,
+       const TileSpec tiles[]);
 
 #endif