diff options
Diffstat (limited to 'libraries/irrlicht-1.8/source/Irrlicht/CParticleBoxEmitter.cpp')
-rw-r--r-- | libraries/irrlicht-1.8/source/Irrlicht/CParticleBoxEmitter.cpp | 376 |
1 files changed, 188 insertions, 188 deletions
diff --git a/libraries/irrlicht-1.8/source/Irrlicht/CParticleBoxEmitter.cpp b/libraries/irrlicht-1.8/source/Irrlicht/CParticleBoxEmitter.cpp index 9728f6f..6191305 100644 --- a/libraries/irrlicht-1.8/source/Irrlicht/CParticleBoxEmitter.cpp +++ b/libraries/irrlicht-1.8/source/Irrlicht/CParticleBoxEmitter.cpp | |||
@@ -1,188 +1,188 @@ | |||
1 | // Copyright (C) 2002-2012 Nikolaus Gebhardt | 1 | // Copyright (C) 2002-2012 Nikolaus Gebhardt |
2 | // This file is part of the "Irrlicht Engine". | 2 | // This file is part of the "Irrlicht Engine". |
3 | // For conditions of distribution and use, see copyright notice in irrlicht.h | 3 | // For conditions of distribution and use, see copyright notice in irrlicht.h |
4 | 4 | ||
5 | #include "CParticleBoxEmitter.h" | 5 | #include "CParticleBoxEmitter.h" |
6 | #include "os.h" | 6 | #include "os.h" |
7 | #include "IAttributes.h" | 7 | #include "IAttributes.h" |
8 | #include "irrMath.h" | 8 | #include "irrMath.h" |
9 | 9 | ||
10 | namespace irr | 10 | namespace irr |
11 | { | 11 | { |
12 | namespace scene | 12 | namespace scene |
13 | { | 13 | { |
14 | 14 | ||
15 | //! constructor | 15 | //! constructor |
16 | CParticleBoxEmitter::CParticleBoxEmitter( | 16 | CParticleBoxEmitter::CParticleBoxEmitter( |
17 | const core::aabbox3df& box, const core::vector3df& direction, | 17 | const core::aabbox3df& box, const core::vector3df& direction, |
18 | u32 minParticlesPerSecond, u32 maxParticlesPerSecond, | 18 | u32 minParticlesPerSecond, u32 maxParticlesPerSecond, |
19 | video::SColor minStartColor, video::SColor maxStartColor, | 19 | video::SColor minStartColor, video::SColor maxStartColor, |
20 | u32 lifeTimeMin, u32 lifeTimeMax, s32 maxAngleDegrees, | 20 | u32 lifeTimeMin, u32 lifeTimeMax, s32 maxAngleDegrees, |
21 | const core::dimension2df& minStartSize, const core::dimension2df& maxStartSize) | 21 | const core::dimension2df& minStartSize, const core::dimension2df& maxStartSize) |
22 | : Box(box), Direction(direction), | 22 | : Box(box), Direction(direction), |
23 | MaxStartSize(maxStartSize), MinStartSize(minStartSize), | 23 | MaxStartSize(maxStartSize), MinStartSize(minStartSize), |
24 | MinParticlesPerSecond(minParticlesPerSecond), | 24 | MinParticlesPerSecond(minParticlesPerSecond), |
25 | MaxParticlesPerSecond(maxParticlesPerSecond), | 25 | MaxParticlesPerSecond(maxParticlesPerSecond), |
26 | MinStartColor(minStartColor), MaxStartColor(maxStartColor), | 26 | MinStartColor(minStartColor), MaxStartColor(maxStartColor), |
27 | MinLifeTime(lifeTimeMin), MaxLifeTime(lifeTimeMax), | 27 | MinLifeTime(lifeTimeMin), MaxLifeTime(lifeTimeMax), |
28 | Time(0), Emitted(0), MaxAngleDegrees(maxAngleDegrees) | 28 | Time(0), Emitted(0), MaxAngleDegrees(maxAngleDegrees) |
29 | { | 29 | { |
30 | #ifdef _DEBUG | 30 | #ifdef _DEBUG |
31 | setDebugName("CParticleBoxEmitter"); | 31 | setDebugName("CParticleBoxEmitter"); |
32 | #endif | 32 | #endif |
33 | } | 33 | } |
34 | 34 | ||
35 | 35 | ||
36 | //! Prepares an array with new particles to emitt into the system | 36 | //! Prepares an array with new particles to emitt into the system |
37 | //! and returns how much new particles there are. | 37 | //! and returns how much new particles there are. |
38 | s32 CParticleBoxEmitter::emitt(u32 now, u32 timeSinceLastCall, SParticle*& outArray) | 38 | s32 CParticleBoxEmitter::emitt(u32 now, u32 timeSinceLastCall, SParticle*& outArray) |
39 | { | 39 | { |
40 | Time += timeSinceLastCall; | 40 | Time += timeSinceLastCall; |
41 | 41 | ||
42 | const u32 pps = (MaxParticlesPerSecond - MinParticlesPerSecond); | 42 | const u32 pps = (MaxParticlesPerSecond - MinParticlesPerSecond); |
43 | const f32 perSecond = pps ? ((f32)MinParticlesPerSecond + os::Randomizer::frand() * pps) : MinParticlesPerSecond; | 43 | const f32 perSecond = pps ? ((f32)MinParticlesPerSecond + os::Randomizer::frand() * pps) : MinParticlesPerSecond; |
44 | const f32 everyWhatMillisecond = 1000.0f / perSecond; | 44 | const f32 everyWhatMillisecond = 1000.0f / perSecond; |
45 | 45 | ||
46 | if (Time > everyWhatMillisecond) | 46 | if (Time > everyWhatMillisecond) |
47 | { | 47 | { |
48 | Particles.set_used(0); | 48 | Particles.set_used(0); |
49 | u32 amount = (u32)((Time / everyWhatMillisecond) + 0.5f); | 49 | u32 amount = (u32)((Time / everyWhatMillisecond) + 0.5f); |
50 | Time = 0; | 50 | Time = 0; |
51 | SParticle p; | 51 | SParticle p; |
52 | const core::vector3df& extent = Box.getExtent(); | 52 | const core::vector3df& extent = Box.getExtent(); |
53 | 53 | ||
54 | if (amount > MaxParticlesPerSecond*2) | 54 | if (amount > MaxParticlesPerSecond*2) |
55 | amount = MaxParticlesPerSecond * 2; | 55 | amount = MaxParticlesPerSecond * 2; |
56 | 56 | ||
57 | for (u32 i=0; i<amount; ++i) | 57 | for (u32 i=0; i<amount; ++i) |
58 | { | 58 | { |
59 | p.pos.X = Box.MinEdge.X + os::Randomizer::frand() * extent.X; | 59 | p.pos.X = Box.MinEdge.X + os::Randomizer::frand() * extent.X; |
60 | p.pos.Y = Box.MinEdge.Y + os::Randomizer::frand() * extent.Y; | 60 | p.pos.Y = Box.MinEdge.Y + os::Randomizer::frand() * extent.Y; |
61 | p.pos.Z = Box.MinEdge.Z + os::Randomizer::frand() * extent.Z; | 61 | p.pos.Z = Box.MinEdge.Z + os::Randomizer::frand() * extent.Z; |
62 | 62 | ||
63 | p.startTime = now; | 63 | p.startTime = now; |
64 | p.vector = Direction; | 64 | p.vector = Direction; |
65 | 65 | ||
66 | if (MaxAngleDegrees) | 66 | if (MaxAngleDegrees) |
67 | { | 67 | { |
68 | core::vector3df tgt = Direction; | 68 | core::vector3df tgt = Direction; |
69 | tgt.rotateXYBy(os::Randomizer::frand() * MaxAngleDegrees); | 69 | tgt.rotateXYBy(os::Randomizer::frand() * MaxAngleDegrees); |
70 | tgt.rotateYZBy(os::Randomizer::frand() * MaxAngleDegrees); | 70 | tgt.rotateYZBy(os::Randomizer::frand() * MaxAngleDegrees); |
71 | tgt.rotateXZBy(os::Randomizer::frand() * MaxAngleDegrees); | 71 | tgt.rotateXZBy(os::Randomizer::frand() * MaxAngleDegrees); |
72 | p.vector = tgt; | 72 | p.vector = tgt; |
73 | } | 73 | } |
74 | 74 | ||
75 | p.endTime = now + MinLifeTime; | 75 | p.endTime = now + MinLifeTime; |
76 | if (MaxLifeTime != MinLifeTime) | 76 | if (MaxLifeTime != MinLifeTime) |
77 | p.endTime += os::Randomizer::rand() % (MaxLifeTime - MinLifeTime); | 77 | p.endTime += os::Randomizer::rand() % (MaxLifeTime - MinLifeTime); |
78 | 78 | ||
79 | if (MinStartColor==MaxStartColor) | 79 | if (MinStartColor==MaxStartColor) |
80 | p.color=MinStartColor; | 80 | p.color=MinStartColor; |
81 | else | 81 | else |
82 | p.color = MinStartColor.getInterpolated(MaxStartColor, os::Randomizer::frand()); | 82 | p.color = MinStartColor.getInterpolated(MaxStartColor, os::Randomizer::frand()); |
83 | 83 | ||
84 | p.startColor = p.color; | 84 | p.startColor = p.color; |
85 | p.startVector = p.vector; | 85 | p.startVector = p.vector; |
86 | 86 | ||
87 | if (MinStartSize==MaxStartSize) | 87 | if (MinStartSize==MaxStartSize) |
88 | p.startSize = MinStartSize; | 88 | p.startSize = MinStartSize; |
89 | else | 89 | else |
90 | p.startSize = MinStartSize.getInterpolated(MaxStartSize, os::Randomizer::frand()); | 90 | p.startSize = MinStartSize.getInterpolated(MaxStartSize, os::Randomizer::frand()); |
91 | p.size = p.startSize; | 91 | p.size = p.startSize; |
92 | 92 | ||
93 | Particles.push_back(p); | 93 | Particles.push_back(p); |
94 | } | 94 | } |
95 | 95 | ||
96 | outArray = Particles.pointer(); | 96 | outArray = Particles.pointer(); |
97 | 97 | ||
98 | return Particles.size(); | 98 | return Particles.size(); |
99 | } | 99 | } |
100 | 100 | ||
101 | return 0; | 101 | return 0; |
102 | } | 102 | } |
103 | 103 | ||
104 | 104 | ||
105 | //! Writes attributes of the object. | 105 | //! Writes attributes of the object. |
106 | void CParticleBoxEmitter::serializeAttributes(io::IAttributes* out, io::SAttributeReadWriteOptions* options) const | 106 | void CParticleBoxEmitter::serializeAttributes(io::IAttributes* out, io::SAttributeReadWriteOptions* options) const |
107 | { | 107 | { |
108 | core::vector3df b = Box.getExtent(); | 108 | core::vector3df b = Box.getExtent(); |
109 | b *= 0.5f; | 109 | b *= 0.5f; |
110 | out->addVector3d("Box", b); | 110 | out->addVector3d("Box", b); |
111 | out->addVector3d("Direction", Direction); | 111 | out->addVector3d("Direction", Direction); |
112 | out->addFloat("MinStartSizeWidth", MinStartSize.Width); | 112 | out->addFloat("MinStartSizeWidth", MinStartSize.Width); |
113 | out->addFloat("MinStartSizeHeight", MinStartSize.Height); | 113 | out->addFloat("MinStartSizeHeight", MinStartSize.Height); |
114 | out->addFloat("MaxStartSizeWidth", MaxStartSize.Width); | 114 | out->addFloat("MaxStartSizeWidth", MaxStartSize.Width); |
115 | out->addFloat("MaxStartSizeHeight", MaxStartSize.Height); | 115 | out->addFloat("MaxStartSizeHeight", MaxStartSize.Height); |
116 | out->addInt("MinParticlesPerSecond", MinParticlesPerSecond); | 116 | out->addInt("MinParticlesPerSecond", MinParticlesPerSecond); |
117 | out->addInt("MaxParticlesPerSecond", MaxParticlesPerSecond); | 117 | out->addInt("MaxParticlesPerSecond", MaxParticlesPerSecond); |
118 | out->addColor("MinStartColor", MinStartColor); | 118 | out->addColor("MinStartColor", MinStartColor); |
119 | out->addColor("MaxStartColor", MaxStartColor); | 119 | out->addColor("MaxStartColor", MaxStartColor); |
120 | out->addInt("MinLifeTime", MinLifeTime); | 120 | out->addInt("MinLifeTime", MinLifeTime); |
121 | out->addInt("MaxLifeTime", MaxLifeTime); | 121 | out->addInt("MaxLifeTime", MaxLifeTime); |
122 | out->addInt("MaxAngleDegrees", MaxAngleDegrees); | 122 | out->addInt("MaxAngleDegrees", MaxAngleDegrees); |
123 | } | 123 | } |
124 | 124 | ||
125 | 125 | ||
126 | //! Reads attributes of the object. | 126 | //! Reads attributes of the object. |
127 | void CParticleBoxEmitter::deserializeAttributes(io::IAttributes* in, io::SAttributeReadWriteOptions* options) | 127 | void CParticleBoxEmitter::deserializeAttributes(io::IAttributes* in, io::SAttributeReadWriteOptions* options) |
128 | { | 128 | { |
129 | // read data and correct input values here | 129 | // read data and correct input values here |
130 | 130 | ||
131 | core::vector3df b = in->getAttributeAsVector3d("Box"); | 131 | core::vector3df b = in->getAttributeAsVector3d("Box"); |
132 | 132 | ||
133 | if (b.X <= 0) | 133 | if (b.X <= 0) |
134 | b.X = 1.0f; | 134 | b.X = 1.0f; |
135 | if (b.Y <= 0) | 135 | if (b.Y <= 0) |
136 | b.Y = 1.0f; | 136 | b.Y = 1.0f; |
137 | if (b.Z <= 0) | 137 | if (b.Z <= 0) |
138 | b.Z = 1.0f; | 138 | b.Z = 1.0f; |
139 | 139 | ||
140 | Box.MinEdge.X = -b.X; | 140 | Box.MinEdge.X = -b.X; |
141 | Box.MinEdge.Y = -b.Y; | 141 | Box.MinEdge.Y = -b.Y; |
142 | Box.MinEdge.Z = -b.Z; | 142 | Box.MinEdge.Z = -b.Z; |
143 | Box.MaxEdge.X = b.X; | 143 | Box.MaxEdge.X = b.X; |
144 | Box.MaxEdge.Y = b.Y; | 144 | Box.MaxEdge.Y = b.Y; |
145 | Box.MaxEdge.Z = b.Z; | 145 | Box.MaxEdge.Z = b.Z; |
146 | 146 | ||
147 | Direction = in->getAttributeAsVector3d("Direction"); | 147 | Direction = in->getAttributeAsVector3d("Direction"); |
148 | if (Direction.getLength() == 0) | 148 | if (Direction.getLength() == 0) |
149 | Direction.set(0,0.01f,0); | 149 | Direction.set(0,0.01f,0); |
150 | 150 | ||
151 | int idx = -1; | 151 | int idx = -1; |
152 | idx = in->findAttribute("MinStartSizeWidth"); | 152 | idx = in->findAttribute("MinStartSizeWidth"); |
153 | if ( idx >= 0 ) | 153 | if ( idx >= 0 ) |
154 | MinStartSize.Width = in->getAttributeAsFloat(idx); | 154 | MinStartSize.Width = in->getAttributeAsFloat(idx); |
155 | idx = in->findAttribute("MinStartSizeHeight"); | 155 | idx = in->findAttribute("MinStartSizeHeight"); |
156 | if ( idx >= 0 ) | 156 | if ( idx >= 0 ) |
157 | MinStartSize.Height = in->getAttributeAsFloat(idx); | 157 | MinStartSize.Height = in->getAttributeAsFloat(idx); |
158 | idx = in->findAttribute("MaxStartSizeWidth"); | 158 | idx = in->findAttribute("MaxStartSizeWidth"); |
159 | if ( idx >= 0 ) | 159 | if ( idx >= 0 ) |
160 | MaxStartSize.Width = in->getAttributeAsFloat(idx); | 160 | MaxStartSize.Width = in->getAttributeAsFloat(idx); |
161 | idx = in->findAttribute("MaxStartSizeHeight"); | 161 | idx = in->findAttribute("MaxStartSizeHeight"); |
162 | if ( idx >= 0 ) | 162 | if ( idx >= 0 ) |
163 | MaxStartSize.Height = in->getAttributeAsFloat(idx); | 163 | MaxStartSize.Height = in->getAttributeAsFloat(idx); |
164 | 164 | ||
165 | MinParticlesPerSecond = in->getAttributeAsInt("MinParticlesPerSecond"); | 165 | MinParticlesPerSecond = in->getAttributeAsInt("MinParticlesPerSecond"); |
166 | MaxParticlesPerSecond = in->getAttributeAsInt("MaxParticlesPerSecond"); | 166 | MaxParticlesPerSecond = in->getAttributeAsInt("MaxParticlesPerSecond"); |
167 | 167 | ||
168 | MinParticlesPerSecond = core::max_(1u, MinParticlesPerSecond); | 168 | MinParticlesPerSecond = core::max_(1u, MinParticlesPerSecond); |
169 | MaxParticlesPerSecond = core::max_(MaxParticlesPerSecond, 1u); | 169 | MaxParticlesPerSecond = core::max_(MaxParticlesPerSecond, 1u); |
170 | MaxParticlesPerSecond = core::min_(MaxParticlesPerSecond, 200u); | 170 | MaxParticlesPerSecond = core::min_(MaxParticlesPerSecond, 200u); |
171 | MinParticlesPerSecond = core::min_(MinParticlesPerSecond, MaxParticlesPerSecond); | 171 | MinParticlesPerSecond = core::min_(MinParticlesPerSecond, MaxParticlesPerSecond); |
172 | 172 | ||
173 | MinStartColor = in->getAttributeAsColor("MinStartColor"); | 173 | MinStartColor = in->getAttributeAsColor("MinStartColor"); |
174 | MaxStartColor = in->getAttributeAsColor("MaxStartColor"); | 174 | MaxStartColor = in->getAttributeAsColor("MaxStartColor"); |
175 | MinLifeTime = in->getAttributeAsInt("MinLifeTime"); | 175 | MinLifeTime = in->getAttributeAsInt("MinLifeTime"); |
176 | MaxLifeTime = in->getAttributeAsInt("MaxLifeTime"); | 176 | MaxLifeTime = in->getAttributeAsInt("MaxLifeTime"); |
177 | MaxAngleDegrees = in->getAttributeAsInt("MaxAngleDegrees"); | 177 | MaxAngleDegrees = in->getAttributeAsInt("MaxAngleDegrees"); |
178 | 178 | ||
179 | MinLifeTime = core::max_(0u, MinLifeTime); | 179 | MinLifeTime = core::max_(0u, MinLifeTime); |
180 | MaxLifeTime = core::max_(MaxLifeTime, MinLifeTime); | 180 | MaxLifeTime = core::max_(MaxLifeTime, MinLifeTime); |
181 | MinLifeTime = core::min_(MinLifeTime, MaxLifeTime); | 181 | MinLifeTime = core::min_(MinLifeTime, MaxLifeTime); |
182 | 182 | ||
183 | } | 183 | } |
184 | 184 | ||
185 | 185 | ||
186 | } // end namespace scene | 186 | } // end namespace scene |
187 | } // end namespace irr | 187 | } // end namespace irr |
188 | 188 | ||