Overte C++ Documentation
FadeEffectJobs.h
1 //
2 // FadeEffectJobs.h
3 
4 // Created by Olivier Prat on 07/07/2017.
5 // Copyright 2017 High Fidelity, Inc.
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_render_utils_FadeEffectJobs_h
12 #define hifi_render_utils_FadeEffectJobs_h
13 
14 #include "FadeEffect.h"
15 
16 #include <gpu/Pipeline.h>
17 #include <render/ShapePipeline.h>
18 #include <render/RenderFetchCullSortTask.h>
19 #include <render/Transition.h>
20 
21 enum FadeCategory {
22  FADE_ELEMENT_ENTER_LEAVE_DOMAIN = 0,
23  FADE_BUBBLE_ISECT_OWNER,
24  FADE_BUBBLE_ISECT_TRESPASSER,
25  FADE_USER_ENTER_LEAVE_DOMAIN,
26  FADE_AVATAR_CHANGE,
27 
28  // Don't forget to modify Fade.slh to reflect the change in number of categories
29  FADE_CATEGORY_COUNT,
30 };
31 
32 class FadeEditConfig : public render::Job::Config {
33  Q_OBJECT
34  Q_PROPERTY(bool editFade MEMBER editFade NOTIFY dirty)
35 
36 public:
37 
38  bool editFade{ false };
39 
40 signals:
41 
42  void dirty();
43 };
44 
45 class FadeConfig : public render::Job::Config {
46  Q_OBJECT
47  Q_PROPERTY(int editedCategory MEMBER editedCategory WRITE setEditedCategory NOTIFY dirtyCategory)
48  Q_PROPERTY(float duration READ getDuration WRITE setDuration NOTIFY dirty)
49  Q_PROPERTY(float baseSizeX READ getBaseSizeX WRITE setBaseSizeX NOTIFY dirty)
50  Q_PROPERTY(float baseSizeY READ getBaseSizeY WRITE setBaseSizeY NOTIFY dirty)
51  Q_PROPERTY(float baseSizeZ READ getBaseSizeZ WRITE setBaseSizeZ NOTIFY dirty)
52  Q_PROPERTY(float baseLevel READ getBaseLevel WRITE setBaseLevel NOTIFY dirty)
53  Q_PROPERTY(bool isInverted READ isInverted WRITE setInverted NOTIFY dirty)
54  Q_PROPERTY(float noiseSizeX READ getNoiseSizeX WRITE setNoiseSizeX NOTIFY dirty)
55  Q_PROPERTY(float noiseSizeY READ getNoiseSizeY WRITE setNoiseSizeY NOTIFY dirty)
56  Q_PROPERTY(float noiseSizeZ READ getNoiseSizeZ WRITE setNoiseSizeZ NOTIFY dirty)
57  Q_PROPERTY(float noiseLevel READ getNoiseLevel WRITE setNoiseLevel NOTIFY dirty)
58  Q_PROPERTY(float edgeWidth READ getEdgeWidth WRITE setEdgeWidth NOTIFY dirty)
59  Q_PROPERTY(QColor edgeInnerColor READ getEdgeInnerColor WRITE setEdgeInnerColor NOTIFY dirty)
60  Q_PROPERTY(float edgeInnerIntensity READ getEdgeInnerIntensity WRITE setEdgeInnerIntensity NOTIFY dirty)
61  Q_PROPERTY(QColor edgeOuterColor READ getEdgeOuterColor WRITE setEdgeOuterColor NOTIFY dirty)
62  Q_PROPERTY(float edgeOuterIntensity READ getEdgeOuterIntensity WRITE setEdgeOuterIntensity NOTIFY dirty)
63  Q_PROPERTY(int timing READ getTiming WRITE setTiming NOTIFY dirty)
64  Q_PROPERTY(float noiseSpeedX READ getNoiseSpeedX WRITE setNoiseSpeedX NOTIFY dirty)
65  Q_PROPERTY(float noiseSpeedY READ getNoiseSpeedY WRITE setNoiseSpeedY NOTIFY dirty)
66  Q_PROPERTY(float noiseSpeedZ READ getNoiseSpeedZ WRITE setNoiseSpeedZ NOTIFY dirty)
67  Q_PROPERTY(float threshold MEMBER threshold NOTIFY dirty)
68  Q_PROPERTY(bool manualFade MEMBER manualFade NOTIFY dirty)
69  Q_PROPERTY(float manualThreshold MEMBER manualThreshold NOTIFY dirty)
70 
71 public:
72 
73  enum Timing {
74  LINEAR,
75  EASE_IN,
76  EASE_OUT,
77  EASE_IN_OUT,
78 
79  TIMING_COUNT
80  };
81 
82  FadeConfig();
83 
84  void setEditedCategory(int value);
85 
86  void setDuration(float value);
87  float getDuration() const;
88 
89  void setBaseSizeX(float value);
90  float getBaseSizeX() const;
91 
92  void setBaseSizeY(float value);
93  float getBaseSizeY() const;
94 
95  void setBaseSizeZ(float value);
96  float getBaseSizeZ() const;
97 
98  void setBaseLevel(float value);
99  float getBaseLevel() const { return events[editedCategory].baseLevel; }
100 
101  void setInverted(bool value);
102  bool isInverted() const;
103 
104  void setNoiseSizeX(float value);
105  float getNoiseSizeX() const;
106 
107  void setNoiseSizeY(float value);
108  float getNoiseSizeY() const;
109 
110  void setNoiseSizeZ(float value);
111  float getNoiseSizeZ() const;
112 
113  void setNoiseLevel(float value);
114  float getNoiseLevel() const { return events[editedCategory].noiseLevel; }
115 
116  void setNoiseSpeedX(float value);
117  float getNoiseSpeedX() const;
118 
119  void setNoiseSpeedY(float value);
120  float getNoiseSpeedY() const;
121 
122  void setNoiseSpeedZ(float value);
123  float getNoiseSpeedZ() const;
124 
125  void setEdgeWidth(float value);
126  float getEdgeWidth() const;
127 
128  void setEdgeInnerColor(const QColor& value);
129  QColor getEdgeInnerColor() const;
130 
131  void setEdgeInnerIntensity(float value);
132  float getEdgeInnerIntensity() const { return events[editedCategory].edgeInnerColor.a; }
133 
134  void setEdgeOuterColor(const QColor& value);
135  QColor getEdgeOuterColor() const;
136 
137  void setEdgeOuterIntensity(float value);
138  float getEdgeOuterIntensity() const { return events[editedCategory].edgeOuterColor.a; }
139 
140  void setTiming(int value);
141  int getTiming() const { return events[editedCategory].timing; }
142 
143  struct Event {
144  glm::vec4 edgeInnerColor;
145  glm::vec4 edgeOuterColor;
146  glm::vec3 noiseSize;
147  glm::vec3 noiseSpeed;
148  glm::vec3 baseSize;
149  float noiseLevel;
150  float baseLevel;
151  float duration;
152  float edgeWidth;
153  int timing;
154  bool isInverted;
155  };
156 
157  Event events[FADE_CATEGORY_COUNT];
158  int editedCategory{ FADE_ELEMENT_ENTER_LEAVE_DOMAIN };
159  float threshold{ 0.f };
160  float manualThreshold{ 0.f };
161  bool manualFade{ false };
162 
163  Q_INVOKABLE void save(const QString& filePath) const;
164  Q_INVOKABLE void load(const QString& filePath);
165 
166  static QString eventNames[FADE_CATEGORY_COUNT];
167 
168 signals:
169 
170  void dirty();
171  void dirtyCategory();
172 
173 };
174 
175 class FadeEditJob {
176 
177 public:
178 
179  using Config = FadeEditConfig;
180  using Input = render::VaryingSet2<render::ItemBounds, FadeCategory>;
181  using JobModel = render::Job::ModelI<FadeEditJob, Input, Config>;
182 
183  FadeEditJob() {}
184 
185  void configure(const Config& config);
186  void run(const render::RenderContextPointer& renderContext, const FadeEditJob::Input& inputs);
187 
188 private:
189 
190  bool _isEditEnabled{ false };
191  render::ItemID _editedItem{ render::Item::INVALID_ITEM_ID };
192 
193 };
194 
195 class FadeJob {
196 
197 public:
198 
199  static const FadeCategory transitionToCategory[render::Transition::TYPE_COUNT];
200 
201  using Config = FadeConfig;
202  using Output = FadeCategory;
203  using JobModel = render::Job::ModelO<FadeJob, Output, Config>;
204 
205  FadeJob();
206 
207  void configure(const Config& config);
208  void run(const render::RenderContextPointer& renderContext, FadeJob::Output& output);
209 
210  gpu::BufferView getConfigurationBuffer() const { return _configurations; }
211 
212 private:
213 
214 #include "Fade_shared.slh"
215 
216  struct FadeConfiguration
217  {
218  FadeParameters parameters[FADE_CATEGORY_COUNT];
219  };
220  using FadeConfigurationBuffer = gpu::StructBuffer<FadeConfiguration>;
221 
222  FadeConfigurationBuffer _configurations;
223  float _thresholdScale[FADE_CATEGORY_COUNT];
224  uint64_t _previousTime{ 0 };
225 
226  bool update(RenderArgs* args, const Config& config, const render::ScenePointer& scene, render::Transaction& transaction, render::Transition& transition, const double deltaTime) const;
227  static float computeElementEnterRatio(double time, const double period, FadeConfig::Timing timing);
228 
229 };
230 
231 #endif // hifi_render_utils_FadeEffectJobs_h