HDK
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
retainedDataSource.h
Go to the documentation of this file.
1 //
2 // Copyright 2021 Pixar
3 //
4 // Licensed under the terms set forth in the LICENSE.txt file available at
5 // https://openusd.org/license.
6 //
7 #ifndef PXR_IMAGING_HD_RETAINEDDATASOURCE_H
8 #define PXR_IMAGING_HD_RETAINEDDATASOURCE_H
9 
10 #include "pxr/pxr.h"
11 
12 #include "pxr/imaging/hd/api.h"
14 
16 
19 
21 
22 /// \class HdRetainedContainerDataSource
23 ///
24 /// A retained container data source is a data source whose data are available
25 /// locally, meaning that they are fully stored and contained within the data
26 /// source. These are typically used for the kinds of operations that need to
27 /// break away from the more live data sources (e.g., those that query a
28 /// backing scene).
29 ///
31 {
32 public:
34 
35  HD_API
36  static Handle New();
37 
38  HD_API
39  static Handle New(
40  size_t count,
41  const TfToken *names,
42  const HdDataSourceBaseHandle *values);
43 
44  HD_API
45  static Handle New(
46  const TfToken &name1,
47  const HdDataSourceBaseHandle &value1);
48 
49  HD_API
50  static Handle New(
51  const TfToken &name1,
52  const HdDataSourceBaseHandle &value1,
53  const TfToken &name2,
54  const HdDataSourceBaseHandle &value2);
55 
56  HD_API
57  static Handle New(
58  const TfToken &name1,
59  const HdDataSourceBaseHandle &value1,
60  const TfToken &name2,
61  const HdDataSourceBaseHandle &value2,
62  const TfToken &name3,
63  const HdDataSourceBaseHandle &value3);
64 
65  HD_API
66  static Handle New(
67  const TfToken &name1,
68  const HdDataSourceBaseHandle &value1,
69  const TfToken &name2,
70  const HdDataSourceBaseHandle &value2,
71  const TfToken &name3,
72  const HdDataSourceBaseHandle &value3,
73  const TfToken &name4,
74  const HdDataSourceBaseHandle &value4);
75 
76  HD_API
77  static Handle New(
78  const TfToken &name1,
79  const HdDataSourceBaseHandle &value1,
80  const TfToken &name2,
81  const HdDataSourceBaseHandle &value2,
82  const TfToken &name3,
83  const HdDataSourceBaseHandle &value3,
84  const TfToken &name4,
85  const HdDataSourceBaseHandle &value4,
86  const TfToken &name5,
87  const HdDataSourceBaseHandle &value5);
88 
89  HD_API
90  static Handle New(
91  const TfToken &name1,
92  const HdDataSourceBaseHandle &value1,
93  const TfToken &name2,
94  const HdDataSourceBaseHandle &value2,
95  const TfToken &name3,
96  const HdDataSourceBaseHandle &value3,
97  const TfToken &name4,
98  const HdDataSourceBaseHandle &value4,
99  const TfToken &name5,
100  const HdDataSourceBaseHandle &value5,
101  const TfToken &name6,
102  const HdDataSourceBaseHandle &value6);
103 };
104 
106 
107 //-----------------------------------------------------------------------------
108 
109 /// \class HdRetainedSampledDataSource
110 ///
111 /// A retained data source for sampled data. Typically used when the data needs
112 /// to be locally stored and cut off from any backing scene data.
113 ///
115 {
116 public:
118 
120  : _value(value) {}
121 
123  HdSampledDataSource::Time startTime,
125  std::vector<HdSampledDataSource::Time> *outSampleTimes) override
126  {
127  return false;
128  }
129 
131  {
132  return _value;
133  }
134 
135 private:
136  VtValue _value;
137 };
138 
140 
141 //-----------------------------------------------------------------------------
142 
143 /// \class HdRetainedTypedSampledDataSource
144 ///
145 /// Similar to HdRetainedSampledDataSource but provides strongly typed
146 /// semantics.
147 ///
148 template <typename T>
150 {
151 public:
152  //abstract to implement New outside in service of specialization
154 
156  : _value(value) {}
157 
159  HdSampledDataSource::Time startTime,
161  std::vector<HdSampledDataSource::Time> *outSampleTimes) override
162  {
163  return false;
164  }
165 
167  {
168  return VtValue(_value);
169  }
170 
171  T GetTypedValue(HdSampledDataSource::Time shutterOffset) override
172  {
173  return _value;
174  }
175 
176  static
178 
179 protected:
181 };
182 
183 // New is specializable for cases where instances may be shared for efficiency
184 template <typename T>
187 {
190 }
191 
192 template <>
195 
196 //-----------------------------------------------------------------------------
197 
198 /// \class HdRetainedTypedMultisampleDataSource
199 ///
200 /// Similar to HdRetainedTypedSampledDataSource but is capable of holding on to
201 /// multiple samples at once.
202 ///
203 template <typename T>
205 {
206 public:
208 
210  size_t count,
211  HdSampledDataSource::Time *sampleTimes,
212  T *sampleValues);
213 
215  HdSampledDataSource::Time startTime,
217  std::vector<HdSampledDataSource::Time> *outSampleTimes) override;
218 
220  {
221  return VtValue(GetTypedValue(shutterOffset));
222  }
223 
224  T GetTypedValue(HdSampledDataSource::Time shutterOffset) override;
225 
226 private:
227  typedef std::pair<HdSampledDataSource::Time, T> _SamplePair;
228  TfSmallVector<_SamplePair, 6> _sampledValues;
229 };
230 
231 template <typename T>
233  size_t count,
234  HdSampledDataSource::Time *sampleTimes,
235  T *sampleValues)
236 {
237  _sampledValues.reserve(count);
238 
239  // XXX: For now, assume that sample times are ordered.
240  // We could sort them if needed.
241  for (size_t i = 0; i < count; ++i) {
242  _sampledValues.emplace_back(sampleTimes[i], sampleValues[i]);
243  }
244 }
245 
246 template <typename T>
247 bool
249  HdSampledDataSource::Time startTime,
251  std::vector<HdSampledDataSource::Time> *outSampleTimes)
252 {
253  if (_sampledValues.size() < 2) {
254  return false;
255  }
256 
257  if (outSampleTimes) {
258  outSampleTimes->clear();
259 
260  // XXX: Include all stored samples for now.
261  outSampleTimes->reserve(_sampledValues.size());
262 
263  for (const auto & iter : _sampledValues) {
264  outSampleTimes->push_back(iter.first);
265  }
266  }
267 
268  return true;
269 }
270 
271 template <typename T>
272 T
274  HdSampledDataSource::Time shutterOffset)
275 {
276  if (_sampledValues.empty()) {
277  return T();
278  }
279 
280  const HdSampledDataSource::Time epsilon = 0.0001;
281 
282  for (size_t i = 0, e = _sampledValues.size(); i < e; ++i) {
283 
284  const HdSampledDataSource::Time & sampleTime = _sampledValues[i].first;
285 
286  if (sampleTime > shutterOffset) {
287 
288  // If we're first and we're already bigger, return us.
289  if (i < 1) {
290  return _sampledValues[i].second;
291  } else {
292 
293  // This will always be positive
294  const HdSampledDataSource::Time delta =
295  sampleTime - shutterOffset;
296 
297  // If we're kinda equal, go for it
298  if (delta < epsilon) {
299  return _sampledValues[i].second;
300  }
301 
302  // Since we're already over the requested time, let's see
303  // if it's closer, use it instead of me. In the case of a
304  // tie, use the earlier.
305  const HdSampledDataSource::Time previousDelta =
306  shutterOffset - _sampledValues[i - 1].first;
307 
308  if (previousDelta <= delta) {
309  return _sampledValues[i - 1].second;
310  } else {
311  return _sampledValues[i].second;
312  }
313  }
314  } else {
315  if (fabs(sampleTime - shutterOffset) < epsilon) {
316  return _sampledValues[i].second;
317  }
318  }
319  }
320 
321  // Never were in range, return our last sample
322  return _sampledValues.back().second;
323 }
324 
325 //-----------------------------------------------------------------------------
326 
327 /// \class HdRetainedSmallVectorDataSource
328 ///
329 /// A retained data source version of HdVectorDataSource.
330 ///
331 /// Internally it uses a TfSmallVector with up to 32 locally stored entries
332 /// for storage.
333 ///
335 {
336 public:
338 
339  HD_API
341  size_t count,
342  const HdDataSourceBaseHandle *values);
343 
344  HD_API
345  size_t GetNumElements() override;
346 
347  HD_API
348  HdDataSourceBaseHandle GetElement(size_t element) override;
349 
350 private:
352 };
353 
355 
356 // Utilities //////////////////////////////////////////////////////////////////
357 
358 /// Given a VtValue, attempt to create a RetainedTypedSampledDataSource of
359 /// the appropriate type via type dispatch.
360 HD_API
361 HdSampledDataSourceHandle
363 
364 /// Attempt to make a copy of the given data source using the sample at
365 /// time 0.0f if it or a descendant data source is sampled.
366 HD_API
367 HdDataSourceBaseHandle
368 HdMakeStaticCopy(HdDataSourceBaseHandle const &ds);
369 
370 /// Attempt to make a copy of the given container data source using the sample
371 /// at time 0.0f if a descendant data source is sampled.
372 HD_API
373 HdContainerDataSourceHandle
374 HdMakeStaticCopy(HdContainerDataSourceHandle const &ds);
375 
377 
378 #endif // PXR_IMAGING_HD_RETAINEDDATASOURCE_H
T GetTypedValue(HdSampledDataSource::Time shutterOffset) override
VtValue GetValue(HdSampledDataSource::Time shutterOffset) override
HD_API HdRetainedSmallVectorDataSource(size_t count, const HdDataSourceBaseHandle *values)
HD_DECLARE_DATASOURCE(HdRetainedTypedMultisampledDataSource< T >)
const GLdouble * v
Definition: glcorearb.h:837
GLsizei const GLfloat * value
Definition: glcorearb.h:824
#define HD_API
Definition: api.h:23
static HD_API Handle New()
HD_DECLARE_DATASOURCE_ABSTRACT(HdRetainedContainerDataSource)
HD_API HdDataSourceBaseHandle GetElement(size_t element) override
HD_DECLARE_DATASOURCE_ABSTRACT(HdRetainedTypedSampledDataSource< T >)
Definition: token.h:70
HD_DECLARE_DATASOURCE(HdRetainedSampledDataSource)
VtValue GetValue(HdSampledDataSource::Time shutterOffset) override
HD_DECLARE_DATASOURCE(HdRetainedSmallVectorDataSource)
bool GetContributingSampleTimesForInterval(HdSampledDataSource::Time startTime, HdSampledDataSource::Time endTime, std::vector< HdSampledDataSource::Time > *outSampleTimes) override
HD_API HdDataSourceBaseHandle HdMakeStaticCopy(HdDataSourceBaseHandle const &ds)
static HdRetainedTypedSampledDataSource< T >::Handle New(const T &value)
HD_DECLARE_DATASOURCE_HANDLES(HdRetainedContainerDataSource)
PXR_NAMESPACE_CLOSE_SCOPE PXR_NAMESPACE_OPEN_SCOPE
Definition: path.h:1425
HD_API HdSampledDataSourceHandle HdCreateTypedRetainedDataSource(VtValue const &v)
GLenum GLsizei GLsizei GLint * values
Definition: glcorearb.h:1602
HD_API size_t GetNumElements() override
HdRetainedTypedMultisampledDataSource(size_t count, HdSampledDataSource::Time *sampleTimes, T *sampleValues)
#define PXR_NAMESPACE_CLOSE_SCOPE
Definition: pxr.h:74
bool GetContributingSampleTimesForInterval(HdSampledDataSource::Time startTime, HdSampledDataSource::Time endTime, std::vector< HdSampledDataSource::Time > *outSampleTimes) override
VtValue GetValue(HdSampledDataSource::Time shutterOffset) override
bool GetContributingSampleTimesForInterval(HdSampledDataSource::Time startTime, HdSampledDataSource::Time endTime, std::vector< HdSampledDataSource::Time > *outSampleTimes) override
HdRetainedSampledDataSource(VtValue value)
HdRetainedTypedSampledDataSource(const T &value)
T GetTypedValue(HdSampledDataSource::Time shutterOffset) override
Definition: value.h:146
GLint GLsizei count
Definition: glcorearb.h:405
void * Handle
Definition: plugin.h:27