11 #ifndef hifi_ParticleEffectEntityItem_h
12 #define hifi_ParticleEffectEntityItem_h
16 #include "EntityItem.h"
18 #include "ColorUtils.h"
19 #include "PulsePropertyGroup.h"
22 static const float SCRIPT_MAXIMUM_PI = 3.1416f;
23 static const float UNINITIALIZED = NAN;
24 static const u8vec3 DEFAULT_COLOR = ENTITY_ITEM_DEFAULT_COLOR;
25 static const vec3 DEFAULT_COLOR_UNINITIALIZED = { UNINITIALIZED, UNINITIALIZED, UNINITIALIZED };
26 static const u8vec3 DEFAULT_COLOR_SPREAD = { 0, 0, 0 };
27 static const float DEFAULT_ALPHA = ENTITY_ITEM_DEFAULT_ALPHA;
28 static const float DEFAULT_ALPHA_SPREAD = 0.0f;
29 static const float DEFAULT_ALPHA_START = UNINITIALIZED;
30 static const float DEFAULT_ALPHA_FINISH = UNINITIALIZED;
31 static const float MINIMUM_ALPHA = 0.0f;
32 static const float MAXIMUM_ALPHA = 1.0f;
33 static const quint32 DEFAULT_MAX_PARTICLES = 1000;
34 static const quint32 MINIMUM_MAX_PARTICLES = 1;
35 static const quint32 MAXIMUM_MAX_PARTICLES = 100000;
36 static const float DEFAULT_LIFESPAN = 3.0f;
37 static const float MINIMUM_LIFESPAN = 0.0f;
38 static const float MAXIMUM_LIFESPAN = 86400.0f;
39 static const float DEFAULT_EMIT_RATE = 15.0f;
40 static const float MINIMUM_EMIT_RATE = 0.0f;
41 static const float MAXIMUM_EMIT_RATE = 100000.0f;
42 static const float DEFAULT_EMIT_SPEED = 5.0f;
43 static const float MINIMUM_EMIT_SPEED = -1000.0f;
44 static const float MAXIMUM_EMIT_SPEED = 1000.0f;
45 static const float DEFAULT_SPEED_SPREAD = 1.0f;
46 static const quat DEFAULT_EMIT_ORIENTATION = glm::angleAxis(-PI_OVER_TWO, Vectors::UNIT_X);
47 static const vec3 DEFAULT_EMIT_DIMENSIONS = Vectors::ZERO;
48 static const float MINIMUM_EMIT_DIMENSION = 0.0f;
49 static const float MAXIMUM_EMIT_DIMENSION = (float)TREE_SCALE;
50 static const float DEFAULT_EMIT_RADIUS_START = 1.0f;
51 static const float MINIMUM_EMIT_RADIUS_START = 0.0f;
52 static const float MAXIMUM_EMIT_RADIUS_START = 1.0f;
53 static const float MINIMUM_POLAR = 0.0f;
54 static const float MAXIMUM_POLAR = SCRIPT_MAXIMUM_PI;
55 static const float DEFAULT_POLAR_START = 0.0f;
56 static const float DEFAULT_POLAR_FINISH = 0.0f;
57 static const float MINIMUM_AZIMUTH = -SCRIPT_MAXIMUM_PI;
58 static const float MAXIMUM_AZIMUTH = SCRIPT_MAXIMUM_PI;
59 static const float DEFAULT_AZIMUTH_START = -PI;
60 static const float DEFAULT_AZIMUTH_FINISH = PI;
61 static const vec3 DEFAULT_EMIT_ACCELERATION(0.0f, -9.8f, 0.0f);
62 static const float MINIMUM_EMIT_ACCELERATION = -100.0f;
63 static const float MAXIMUM_EMIT_ACCELERATION = 100.0f;
64 static const vec3 DEFAULT_ACCELERATION_SPREAD(0.0f, 0.0f, 0.0f);
65 static const float MINIMUM_ACCELERATION_SPREAD = 0.0f;
66 static const float MAXIMUM_ACCELERATION_SPREAD = 100.0f;
67 static const float DEFAULT_PARTICLE_RADIUS = 0.025f;
68 static const float MINIMUM_PARTICLE_RADIUS = 0.0f;
69 static const float MAXIMUM_PARTICLE_RADIUS = (float)TREE_SCALE;
70 static const float DEFAULT_RADIUS_SPREAD = 0.0f;
71 static const float DEFAULT_RADIUS_START = UNINITIALIZED;
72 static const float DEFAULT_RADIUS_FINISH = UNINITIALIZED;
73 static const float DEFAULT_PARTICLE_SPIN = 0.0f;
74 static const float DEFAULT_SPIN_START = UNINITIALIZED;
75 static const float DEFAULT_SPIN_FINISH = UNINITIALIZED;
76 static const float DEFAULT_SPIN_SPREAD = 0.0f;
77 static const float MINIMUM_PARTICLE_SPIN = -2.0f * SCRIPT_MAXIMUM_PI;
78 static const float MAXIMUM_PARTICLE_SPIN = 2.0f * SCRIPT_MAXIMUM_PI;
79 static const QString DEFAULT_TEXTURES =
"";
80 static const bool DEFAULT_EMITTER_SHOULD_TRAIL =
false;
81 static const bool DEFAULT_ROTATE_WITH_ENTITY =
false;
82 static const ShapeType DEFAULT_SHAPE_TYPE = ShapeType::SHAPE_TYPE_ELLIPSOID;
87 Range(
const Range& other) { *
this = other; }
88 Range(
const T& defaultStart,
const T& defaultFinish)
89 : start(defaultStart), finish(defaultFinish) {
92 Range& operator=(
const Range& other) {
94 finish = other.finish;
102 template <
typename T>
105 Gradient(
const Gradient& other) { *
this = other; }
106 Gradient(
const T& defaultTarget,
const T& defaultSpread)
107 : target(defaultTarget), spread(defaultSpread) {}
109 Gradient& operator=(
const Gradient& other) {
110 target = other.target;
111 spread = other.spread;
119 template <
typename T>
120 struct RangeGradient {
122 RangeGradient(
const RangeGradient& other) { *
this = other; }
123 RangeGradient(
const T& defaultValue,
const T& defaultStart,
const T& defaultFinish,
const T& defaultSpread)
124 : range(defaultStart, defaultFinish), gradient(defaultValue, defaultSpread) {
127 RangeGradient& operator=(
const RangeGradient& other) {
129 gradient = other.gradient;
134 Gradient<T> gradient;
137 struct EmitProperties {
138 float rate { DEFAULT_EMIT_RATE };
139 Gradient<float> speed { DEFAULT_EMIT_SPEED, DEFAULT_SPEED_SPREAD };
140 Gradient<vec3> acceleration { DEFAULT_EMIT_ACCELERATION, DEFAULT_ACCELERATION_SPREAD };
141 glm::quat orientation { DEFAULT_EMIT_ORIENTATION };
142 glm::vec3 dimensions { DEFAULT_EMIT_DIMENSIONS };
143 bool shouldTrail { DEFAULT_EMITTER_SHOULD_TRAIL };
146 EmitProperties(
const EmitProperties& other) { *
this = other; }
147 EmitProperties& operator=(
const EmitProperties& other) {
150 acceleration = other.acceleration;
151 orientation = other.orientation;
152 dimensions = other.dimensions;
153 shouldTrail = other.shouldTrail;
159 RangeGradient<vec3> color { DEFAULT_COLOR, DEFAULT_COLOR_UNINITIALIZED, DEFAULT_COLOR_UNINITIALIZED, DEFAULT_COLOR_SPREAD };
160 RangeGradient<float> alpha { DEFAULT_ALPHA, DEFAULT_ALPHA_START, DEFAULT_ALPHA_FINISH, DEFAULT_ALPHA_SPREAD };
161 float radiusStart { DEFAULT_EMIT_RADIUS_START };
162 RangeGradient<float> radius { DEFAULT_PARTICLE_RADIUS, DEFAULT_RADIUS_START, DEFAULT_RADIUS_FINISH, DEFAULT_RADIUS_SPREAD };
163 RangeGradient<float> spin { DEFAULT_PARTICLE_SPIN, DEFAULT_SPIN_START, DEFAULT_SPIN_FINISH, DEFAULT_SPIN_SPREAD };
164 bool rotateWithEntity { DEFAULT_ROTATE_WITH_ENTITY };
165 float lifespan { DEFAULT_LIFESPAN };
166 uint32_t maxParticles { DEFAULT_MAX_PARTICLES };
167 EmitProperties emission;
168 Range<float> polar { DEFAULT_POLAR_START, DEFAULT_POLAR_FINISH };
169 Range<float> azimuth { DEFAULT_AZIMUTH_START, DEFAULT_AZIMUTH_FINISH };
174 Properties(
const Properties& other) { *
this = other; }
176 bool emitting()
const;
177 uint64_t emitIntervalUsecs()
const;
179 Properties& operator =(
const Properties& other) {
182 radiusStart = other.radiusStart;
183 radius = other.radius;
185 rotateWithEntity = other.rotateWithEntity;
186 lifespan = other.lifespan;
187 maxParticles = other.maxParticles;
188 emission = other.emission;
190 azimuth = other.azimuth;
191 textures = other.textures;
195 vec4 getColorStart()
const {
return vec4(ColorUtils::sRGBToLinearVec3(toGlm(color.range.start)), alpha.range.start); }
196 vec4 getColorMiddle()
const {
return vec4(ColorUtils::sRGBToLinearVec3(toGlm(color.gradient.target)), alpha.gradient.target); }
197 vec4 getColorFinish()
const {
return vec4(ColorUtils::sRGBToLinearVec3(toGlm(color.range.finish)), alpha.range.finish); }
198 vec4 getColorSpread()
const {
return vec4(ColorUtils::sRGBToLinearVec3(toGlm(color.gradient.spread)), alpha.gradient.spread); }
203 bool operator==(
const particle::Properties& a,
const particle::Properties& b);
204 bool operator!=(
const particle::Properties& a,
const particle::Properties& b);
207 class ParticleEffectEntityItem :
public EntityItem {
213 ParticleEffectEntityItem(
const EntityItemID& entityItemID);
216 virtual EntityItemProperties getProperties(
const EntityPropertyFlags& desiredProperties,
bool allowEmptyDesiredProperties)
const override;
219 virtual EntityPropertyFlags getEntityProperties(EncodeBitstreamParams& params)
const override;
221 virtual void appendSubclassData(
OctreePacketData* packetData, EncodeBitstreamParams& params,
222 EntityTreeElementExtraEncodeDataPointer entityTreeElementExtraEncodeData,
223 EntityPropertyFlags& requestedProperties,
224 EntityPropertyFlags& propertyFlags,
225 EntityPropertyFlags& propertiesDidntFit,
227 OctreeElement::AppendState& appendState)
const override;
229 virtual int readEntitySubclassDataFromBuffer(
const unsigned char* data,
int bytesLeftToRead,
230 ReadBitstreamToTreeParams& args,
231 EntityPropertyFlags& propertyFlags,
bool overwriteLocalData,
232 bool& somethingChanged)
override;
234 bool shouldBePhysical()
const override {
return false; }
236 virtual void debugDump()
const override;
238 void setColor(
const glm::u8vec3& value);
239 glm::u8vec3 getColor()
const;
241 void setColorStart(
const vec3& colorStart);
242 vec3 getColorStart()
const;
244 void setColorFinish(
const vec3& colorFinish);
245 vec3 getColorFinish()
const;
247 void setColorSpread(
const glm::u8vec3& colorSpread);
248 glm::u8vec3 getColorSpread()
const;
250 void setAlpha(
float alpha);
251 float getAlpha()
const;
253 void setAlphaStart(
float alphaStart);
254 float getAlphaStart()
const;
256 void setAlphaFinish(
float alphaFinish);
257 float getAlphaFinish()
const;
259 void setAlphaSpread(
float alphaSpread);
260 float getAlphaSpread()
const;
262 void setShapeType(ShapeType type)
override;
265 QString getCompoundShapeURL()
const;
266 virtual void setCompoundShapeURL(
const QString& url);
268 bool getIsEmitting()
const {
return _isEmitting; }
269 void setIsEmitting(
bool isEmitting);
271 void setMaxParticles(quint32 maxParticles);
272 quint32 getMaxParticles()
const;
274 void setLifespan(
float lifespan);
275 float getLifespan()
const;
277 void setEmitRate(
float emitRate);
278 float getEmitRate()
const;
280 void setEmitSpeed(
float emitSpeed);
281 float getEmitSpeed()
const;
283 void setSpeedSpread(
float speedSpread);
284 float getSpeedSpread()
const;
286 void setEmitOrientation(
const glm::quat& emitOrientation);
287 glm::quat getEmitOrientation()
const;
289 void setEmitDimensions(
const glm::vec3& emitDimensions);
290 glm::vec3 getEmitDimensions()
const;
292 void setEmitRadiusStart(
float emitRadiusStart);
293 float getEmitRadiusStart()
const;
295 void setPolarStart(
float polarStart);
296 float getPolarStart()
const;
298 void setPolarFinish(
float polarFinish);
299 float getPolarFinish()
const;
301 void setAzimuthStart(
float azimuthStart);
302 float getAzimuthStart()
const;
304 void setAzimuthFinish(
float azimuthFinish);
305 float getAzimuthFinish()
const;
307 void setEmitAcceleration(
const glm::vec3& emitAcceleration);
308 glm::vec3 getEmitAcceleration()
const;
310 void setAccelerationSpread(
const glm::vec3& accelerationSpread);
311 glm::vec3 getAccelerationSpread()
const;
313 void setParticleRadius(
float particleRadius);
314 float getParticleRadius()
const;
316 void setRadiusStart(
float radiusStart);
317 float getRadiusStart()
const;
319 void setRadiusFinish(
float radiusFinish);
320 float getRadiusFinish()
const;
322 void setRadiusSpread(
float radiusSpread);
323 float getRadiusSpread()
const;
325 void setParticleSpin(
float particleSpin);
326 float getParticleSpin()
const;
328 void setSpinStart(
float spinStart);
329 float getSpinStart()
const;
331 void setSpinFinish(
float spinFinish);
332 float getSpinFinish()
const;
334 void setSpinSpread(
float spinSpread);
335 float getSpinSpread()
const;
337 void setRotateWithEntity(
bool rotateWithEntity);
338 bool getRotateWithEntity()
const {
return _particleProperties.rotateWithEntity; }
340 void computeAndUpdateDimensions();
342 void setTextures(
const QString& textures);
343 QString getTextures()
const;
345 void setEmitterShouldTrail(
bool emitterShouldTrail);
346 bool getEmitterShouldTrail()
const {
return _particleProperties.emission.shouldTrail; }
348 virtual bool supportsDetailedIntersection()
const override {
return false; }
350 particle::Properties getParticleProperties()
const;
351 PulsePropertyGroup getPulseProperties()
const;
354 particle::Properties _particleProperties;
355 PulsePropertyGroup _pulseProperties;
356 bool _isEmitting {
true };
358 ShapeType _shapeType{ particle::DEFAULT_SHAPE_TYPE };
359 QString _compoundShapeURL {
"" };
Definition: EntityItem.h:82
virtual ShapeType getShapeType() const
return preferred shape type (actual physical shape may differ)
Definition: EntityItem.h:390
Abstract ID for editing model items. Used in EntityItem JS API.
Definition: EntityItemID.h:28
Definition: EntityItemProperties.h:106
Handles packing of the data portion of PacketType_OCTREE_DATA messages.
Definition: OctreePacketData.h:93