Overte C++ Documentation
RenderableParticleEffectEntityItem.h
1 //
2 // RenderableParticleEffectEntityItem.h
3 // interface/src/entities
4 //
5 // Created by Jason Rickwald on 3/2/15.
6 //
7 // Distributed under the Apache License, Version 2.0.
8 // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
9 //
10 
11 #ifndef hifi_RenderableParticleEffectEntityItem_h
12 #define hifi_RenderableParticleEffectEntityItem_h
13 
14 #include "RenderableEntityItem.h"
15 #include <ParticleEffectEntityItem.h>
16 #include <TextureCache.h>
17 
18 namespace render { namespace entities {
19 
20 class ParticleEffectEntityRenderer : public TypedEntityRenderer<ParticleEffectEntityItem> {
21  using Parent = TypedEntityRenderer<ParticleEffectEntityItem>;
22  friend class EntityRenderer;
23 
24 public:
25  ParticleEffectEntityRenderer(const EntityItemPointer& entity);
26 
27  virtual void renderSimulate(RenderArgs* args) override;
28 
29  ComponentMode getFadeOutMode() const override { return ComponentMode::COMPONENT_MODE_DISABLED; }
30 
31 protected:
32  virtual void doRenderUpdateSynchronousTyped(const ScenePointer& scene, Transaction& transaction, const TypedEntityPointer& entity) override;
33  virtual void doRenderUpdateAsynchronousTyped(const TypedEntityPointer& entity) override;
34 
35  bool isTransparent() const override;
36  virtual ItemKey getKey() override;
37  virtual ShapeKey getShapeKey() override;
38  virtual Item::Bound getBound(RenderArgs* args) override;
39  virtual void doRender(RenderArgs* args) override;
40 
41 private:
42  using PipelinePointer = gpu::PipelinePointer;
43  using BufferPointer = gpu::BufferPointer;
44  using TexturePointer = gpu::TexturePointer;
45  using Format = gpu::Stream::Format;
46  using Buffer = gpu::Buffer;
47  using BufferView = gpu::BufferView;
48 
49  // CPU particles
50  // FIXME either switch to GPU compute particles or switch to simd updating of the particles
51  struct CpuParticle {
52  float seed { 0.0f };
53  uint64_t expiration { 0 };
54  float lifetime { 0.0f };
55  glm::vec3 basePosition;
56  glm::vec3 relativePosition;
57  glm::vec3 velocity;
58  glm::vec3 acceleration;
59 
60  void integrate(float deltaTime) {
61  glm::vec3 atSquared = (0.5f * deltaTime * deltaTime) * acceleration;
62  relativePosition += velocity * deltaTime + atSquared;
63  velocity += acceleration * deltaTime;
64  lifetime += deltaTime;
65  }
66  };
67  using CpuParticles = std::deque<CpuParticle>;
68 
69 
70  template<typename T>
71  struct InterpolationData {
72  T start;
73  T middle;
74  T finish;
75  T spread;
76  };
77 
78  struct ParticleUniforms {
79  InterpolationData<float> radius;
80  InterpolationData<glm::vec4> color; // rgba
81  InterpolationData<float> spin;
82  float lifespan;
83  int rotateWithEntity;
84  glm::vec2 spare;
85  };
86 
87  void computeTriangles(const hfm::Model& hfmModel);
88  bool _hasComputedTriangles{ false };
89  struct TriangleInfo {
90  std::vector<Triangle> triangles;
91  std::vector<size_t> samplesPerTriangle;
92  size_t totalSamples;
93  glm::mat4 transform;
94  } _triangleInfo;
95 
96  static CpuParticle createParticle(const Transform& baseTransform, const particle::Properties& particleProperties,
97  const ShapeType& shapeType, const GeometryResource::Pointer& geometryResource,
98  const TriangleInfo& triangleInfo);
99  void stepSimulation();
100 
101  particle::Properties _particleProperties;
102  bool _prevEmitterShouldTrail;
103  bool _prevEmitterShouldTrailInitialized { false };
104  CpuParticles _cpuParticles;
105  bool _emitting { false };
106  uint64_t _timeUntilNextEmit { 0 };
107  BufferPointer _particleBuffer { std::make_shared<Buffer>(gpu::Buffer::VertexBuffer) };
108  BufferView _uniformBuffer;
109  quint64 _lastSimulated { 0 };
110 
111  PulsePropertyGroup _pulseProperties;
112  ShapeType _shapeType;
113  QString _compoundShapeURL;
114 
115  void fetchGeometryResource();
116  GeometryResource::Pointer _geometryResource;
117 
118  NetworkTexturePointer _networkTexture;
119  bool _textureLoaded { false };
120  ScenePointer _scene;
121 };
122 
123 } } // namespace
124 
125 #endif // hifi_RenderableParticleEffectEntityItem_h
The runtime model format.
Definition: HFM.h:305