]> git.lizzy.rs Git - irrlicht.git/blob - source/Irrlicht/CParticlePointEmitter.cpp
Set includes and libs on object targets
[irrlicht.git] / source / Irrlicht / CParticlePointEmitter.cpp
1 // Copyright (C) 2002-2012 Nikolaus Gebhardt\r
2 // This file is part of the "Irrlicht Engine".\r
3 // For conditions of distribution and use, see copyright notice in irrlicht.h\r
4 \r
5 #include "CParticlePointEmitter.h"\r
6 \r
7 #ifdef _IRR_COMPILE_WITH_PARTICLES_\r
8 \r
9 #include "os.h"\r
10 #include "IAttributes.h"\r
11 \r
12 namespace irr\r
13 {\r
14 namespace scene\r
15 {\r
16 \r
17 //! constructor\r
18 CParticlePointEmitter::CParticlePointEmitter(\r
19         const core::vector3df& direction, u32 minParticlesPerSecond,\r
20         u32 maxParticlesPerSecond, video::SColor minStartColor,\r
21         video::SColor maxStartColor, u32 lifeTimeMin, u32 lifeTimeMax,\r
22         s32 maxAngleDegrees,\r
23         const core::dimension2df& minStartSize,\r
24         const core::dimension2df& maxStartSize)\r
25  : Direction(direction),\r
26         MinStartSize(minStartSize), MaxStartSize(maxStartSize),\r
27         MinParticlesPerSecond(minParticlesPerSecond),\r
28         MaxParticlesPerSecond(maxParticlesPerSecond),\r
29         MinStartColor(minStartColor), MaxStartColor(maxStartColor),\r
30         MinLifeTime(lifeTimeMin), MaxLifeTime(lifeTimeMax),\r
31         MaxAngleDegrees(maxAngleDegrees), Time(0)\r
32 {\r
33         #ifdef _DEBUG\r
34         setDebugName("CParticlePointEmitter");\r
35         #endif\r
36 }\r
37 \r
38 \r
39 //! Prepares an array with new particles to emitt into the system\r
40 //! and returns how much new particles there are.\r
41 s32 CParticlePointEmitter::emitt(u32 now, u32 timeSinceLastCall, SParticle*& outArray)\r
42 {\r
43         Time += timeSinceLastCall;\r
44 \r
45         const u32 pps = (MaxParticlesPerSecond - MinParticlesPerSecond);\r
46         const f32 perSecond = pps ? ((f32)MinParticlesPerSecond + os::Randomizer::frand() * pps) : MinParticlesPerSecond;\r
47         const f32 everyWhatMillisecond = 1000.0f / perSecond;\r
48 \r
49         if (Time > everyWhatMillisecond)\r
50         {\r
51                 Time = 0;\r
52                 Particle.startTime = now;\r
53                 Particle.vector = Direction;\r
54 \r
55                 if (MaxAngleDegrees)\r
56                 {\r
57                         core::vector3df tgt = Direction;\r
58                         tgt.rotateXYBy(os::Randomizer::frand() * MaxAngleDegrees);\r
59                         tgt.rotateYZBy(os::Randomizer::frand() * MaxAngleDegrees);\r
60                         tgt.rotateXZBy(os::Randomizer::frand() * MaxAngleDegrees);\r
61                         Particle.vector = tgt;\r
62                 }\r
63 \r
64                 Particle.endTime = now + MinLifeTime;\r
65                 if (MaxLifeTime != MinLifeTime)\r
66                         Particle.endTime += os::Randomizer::rand() % (MaxLifeTime - MinLifeTime);\r
67 \r
68                 if (MinStartColor==MaxStartColor)\r
69                         Particle.color=MinStartColor;\r
70                 else\r
71                         Particle.color = MinStartColor.getInterpolated(MaxStartColor, os::Randomizer::frand());\r
72 \r
73                 Particle.startColor = Particle.color;\r
74                 Particle.startVector = Particle.vector;\r
75 \r
76                 if (MinStartSize==MaxStartSize)\r
77                         Particle.startSize = MinStartSize;\r
78                 else\r
79                         Particle.startSize = MinStartSize.getInterpolated(MaxStartSize, os::Randomizer::frand());\r
80                 Particle.size = Particle.startSize;\r
81 \r
82                 outArray = &Particle;\r
83                 return 1;\r
84         }\r
85 \r
86         return 0;\r
87 }\r
88 \r
89 \r
90 //! Writes attributes of the object.\r
91 void CParticlePointEmitter::serializeAttributes(io::IAttributes* out, io::SAttributeReadWriteOptions* options) const\r
92 {\r
93         out->addVector3d("Direction", Direction);\r
94         out->addFloat("MinStartSizeWidth", MinStartSize.Width);\r
95         out->addFloat("MinStartSizeHeight", MinStartSize.Height);\r
96         out->addFloat("MaxStartSizeWidth", MaxStartSize.Width);\r
97         out->addFloat("MaxStartSizeHeight", MaxStartSize.Height);\r
98         out->addInt("MinParticlesPerSecond", MinParticlesPerSecond);\r
99         out->addInt("MaxParticlesPerSecond", MaxParticlesPerSecond);\r
100         out->addColor("MinStartColor", MinStartColor);\r
101         out->addColor("MaxStartColor", MaxStartColor);\r
102         out->addInt("MinLifeTime", MinLifeTime);\r
103         out->addInt("MaxLifeTime", MaxLifeTime);\r
104         out->addInt("MaxAngleDegrees", MaxAngleDegrees);\r
105 }\r
106 \r
107 //! Reads attributes of the object.\r
108 void CParticlePointEmitter::deserializeAttributes(io::IAttributes* in, io::SAttributeReadWriteOptions* options)\r
109 {\r
110         Direction = in->getAttributeAsVector3d("Direction");\r
111         if (Direction.getLength() == 0)\r
112                 Direction.set(0,0.01f,0);\r
113 \r
114         int idx = -1;\r
115         idx = in->findAttribute("MinStartSizeWidth");\r
116         if ( idx >= 0 )\r
117                 MinStartSize.Width = in->getAttributeAsFloat(idx);\r
118         idx = in->findAttribute("MinStartSizeHeight");\r
119         if ( idx >= 0 )\r
120                 MinStartSize.Height = in->getAttributeAsFloat(idx);\r
121         idx = in->findAttribute("MaxStartSizeWidth");\r
122         if ( idx >= 0 )\r
123                 MaxStartSize.Width = in->getAttributeAsFloat(idx);\r
124         idx = in->findAttribute("MaxStartSizeHeight");\r
125         if ( idx >= 0 )\r
126                 MaxStartSize.Height = in->getAttributeAsFloat(idx);\r
127 \r
128         MinParticlesPerSecond = in->getAttributeAsInt("MinParticlesPerSecond");\r
129         MaxParticlesPerSecond = in->getAttributeAsInt("MaxParticlesPerSecond");\r
130 \r
131         MinParticlesPerSecond = core::max_(1u, MinParticlesPerSecond);\r
132         MaxParticlesPerSecond = core::max_(MaxParticlesPerSecond, 1u);\r
133         MaxParticlesPerSecond = core::min_(MaxParticlesPerSecond, 200u);\r
134         MinParticlesPerSecond = core::min_(MinParticlesPerSecond, MaxParticlesPerSecond);\r
135 \r
136         MinStartColor = in->getAttributeAsColor("MinStartColor");\r
137         MaxStartColor = in->getAttributeAsColor("MaxStartColor");\r
138         MinLifeTime = in->getAttributeAsInt("MinLifeTime");\r
139         MaxLifeTime = in->getAttributeAsInt("MaxLifeTime");\r
140         MaxAngleDegrees = in->getAttributeAsInt("MaxAngleDegrees");\r
141 \r
142         MinLifeTime = core::max_(0u, MinLifeTime);\r
143         MaxLifeTime = core::max_(MaxLifeTime, MinLifeTime);\r
144         MinLifeTime = core::min_(MinLifeTime, MaxLifeTime);\r
145 }\r
146 \r
147 \r
148 } // end namespace scene\r
149 } // end namespace irr\r
150 \r
151 #endif // _IRR_COMPILE_WITH_PARTICLES_\r