Loading...
Searching...
No Matches
retainedDataSource.h
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"
13#include "pxr/imaging/hd/dataSource.h"
14
15#include "pxr/usd/sdf/pathExpression.h"
16
19
20PXR_NAMESPACE_OPEN_SCOPE
21
31{
32public:
33 HD_DECLARE_DATASOURCE_ABSTRACT(HdRetainedContainerDataSource);
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
105HD_DECLARE_DATASOURCE_HANDLES(HdRetainedContainerDataSource);
106
107//-----------------------------------------------------------------------------
108
115{
116public:
117 HD_DECLARE_DATASOURCE(HdRetainedSampledDataSource);
118
120 : _value(value) {}
121
123 HdSampledDataSource::Time startTime,
124 HdSampledDataSource::Time endTime,
125 std::vector<HdSampledDataSource::Time> *outSampleTimes) override
126 {
127 return false;
128 }
129
130 VtValue GetValue(HdSampledDataSource::Time shutterOffset) override
131 {
132 return _value;
133 }
134
135private:
136 VtValue _value;
137};
138
139HD_DECLARE_DATASOURCE_HANDLES(HdRetainedSampledDataSource);
140
141//-----------------------------------------------------------------------------
142
148template <typename T>
150{
151public:
152 //abstract to implement New outside in service of specialization
153 HD_DECLARE_DATASOURCE_ABSTRACT(HdRetainedTypedSampledDataSource<T>);
154
156 : _value(value) {}
157
159 HdSampledDataSource::Time startTime,
160 HdSampledDataSource::Time endTime,
161 std::vector<HdSampledDataSource::Time> *outSampleTimes) override
162 {
163 return false;
164 }
165
166 VtValue GetValue(HdSampledDataSource::Time shutterOffset) override
167 {
168 return VtValue(_value);
169 }
170
171 T GetTypedValue(HdSampledDataSource::Time shutterOffset) override
172 {
173 return _value;
174 }
175
176 static
177 typename HdRetainedTypedSampledDataSource<T>::Handle New(const T &value);
178
179protected:
180 T _value;
181};
182
183// New is specializable for cases where instances may be shared for efficiency
184template <typename T>
187{
190}
191
192template <>
195
196//-----------------------------------------------------------------------------
197
203template <typename T>
204class HdRetainedTypedMultisampledDataSource : public HdTypedSampledDataSource<T>
205{
206public:
207 HD_DECLARE_DATASOURCE(HdRetainedTypedMultisampledDataSource<T>);
208
209 HdRetainedTypedMultisampledDataSource(
210 size_t count,
211 HdSampledDataSource::Time *sampleTimes,
212 T *sampleValues);
213
215 HdSampledDataSource::Time startTime,
216 HdSampledDataSource::Time endTime,
217 std::vector<HdSampledDataSource::Time> *outSampleTimes) override;
218
219 VtValue GetValue(HdSampledDataSource::Time shutterOffset) override
220 {
221 return VtValue(GetTypedValue(shutterOffset));
222 }
223
224 T GetTypedValue(HdSampledDataSource::Time shutterOffset) override;
225
226private:
227 typedef std::pair<HdSampledDataSource::Time, T> _SamplePair;
228 TfSmallVector<_SamplePair, 6> _sampledValues;
229};
230
231template <typename T>
232HdRetainedTypedMultisampledDataSource<T>::HdRetainedTypedMultisampledDataSource(
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
246template <typename T>
247bool
248HdRetainedTypedMultisampledDataSource<T>::GetContributingSampleTimesForInterval(
249 HdSampledDataSource::Time startTime,
250 HdSampledDataSource::Time endTime,
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
271template <typename T>
272T
273HdRetainedTypedMultisampledDataSource<T>::GetTypedValue(
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
335{
336public:
337 HD_DECLARE_DATASOURCE(HdRetainedSmallVectorDataSource);
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
350private:
352};
353
354HD_DECLARE_DATASOURCE_HANDLES(HdRetainedSmallVectorDataSource);
355
356// Utilities //////////////////////////////////////////////////////////////////
357
360HD_API
361HdSampledDataSourceHandle
362HdCreateTypedRetainedDataSource(VtValue const &v);
363
366HD_API
367HdDataSourceBaseHandle
368HdMakeStaticCopy(HdDataSourceBaseHandle const &ds);
369
372HD_API
373HdContainerDataSourceHandle
374HdMakeStaticCopy(HdContainerDataSourceHandle const &ds);
375
376PXR_NAMESPACE_CLOSE_SCOPE
377
378#endif // PXR_IMAGING_HD_RETAINEDDATASOURCE_H
A datasource representing structured (named, hierarchical) data, for example a geometric primitive or...
Definition: dataSource.h:99
A retained container data source is a data source whose data are available locally,...
A retained data source for sampled data.
bool GetContributingSampleTimesForInterval(HdSampledDataSource::Time startTime, HdSampledDataSource::Time endTime, std::vector< HdSampledDataSource::Time > *outSampleTimes) override
Given a shutter window of interest (startTime and endTime relative to the current frame),...
VtValue GetValue(HdSampledDataSource::Time shutterOffset) override
Returns the value of this data source at frame-relative time shutterOffset.
A retained data source version of HdVectorDataSource.
HD_API HdDataSourceBaseHandle GetElement(size_t element) override
Return the element at position element in this datasource.
HD_API size_t GetNumElements() override
Return the number of elements in this datasource.
Similar to HdRetainedSampledDataSource but provides strongly typed semantics.
bool GetContributingSampleTimesForInterval(HdSampledDataSource::Time startTime, HdSampledDataSource::Time endTime, std::vector< HdSampledDataSource::Time > *outSampleTimes) override
Given a shutter window of interest (startTime and endTime relative to the current frame),...
VtValue GetValue(HdSampledDataSource::Time shutterOffset) override
Returns the value of this data source at frame-relative time shutterOffset.
T GetTypedValue(HdSampledDataSource::Time shutterOffset) override
Returns the value of this data source at frame-relative time shutterOffset, as type T.
A datasource representing time-sampled values.
Definition: dataSource.h:153
virtual bool GetContributingSampleTimesForInterval(Time startTime, Time endTime, std::vector< Time > *outSampleTimes)=0
Given a shutter window of interest (startTime and endTime relative to the current frame),...
virtual VtValue GetValue(Time shutterOffset)=0
Returns the value of this data source at frame-relative time shutterOffset.
A datasource representing a concretely-typed sampled value.
Definition: dataSource.h:193
virtual T GetTypedValue(Time shutterOffset)=0
Returns the value of this data source at frame-relative time shutterOffset, as type T.
A datasource representing indexed data.
Definition: dataSource.h:131
This is a small-vector class with local storage optimization, the local storage can be specified via ...
Definition: smallVector.h:157
void reserve(size_type newCapacity)
Reserve storage for newCapacity entries.
Definition: smallVector.h:410
Token for efficient comparison, assignment, and hashing of known strings.
Definition: token.h:71
Provides a container which may hold any type, and provides introspection and iteration over array typ...
Definition: value.h:152