Loading...
Searching...
No Matches
dataSourceAttribute.h
1//
2// Copyright 2020 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_USD_IMAGING_USD_IMAGING_DATA_SOURCE_ATTRIBUTE_H
8#define PXR_USD_IMAGING_USD_IMAGING_DATA_SOURCE_ATTRIBUTE_H
9
10#include "pxr/usd/usd/attribute.h"
11#include "pxr/usd/usd/attributeQuery.h"
12#include "pxr/usdImaging/usdImaging/api.h"
13#include "pxr/usdImaging/usdImaging/dataSourceStageGlobals.h"
14#include "pxr/imaging/hd/dataSource.h"
15#include "pxr/imaging/hd/dataSourceTypeDefs.h"
16
17#include <algorithm>
18
19PXR_NAMESPACE_OPEN_SCOPE
20
25template <typename T>
26class UsdImagingDataSourceAttribute : public HdTypedSampledDataSource<T>
27{
28public:
29
30 HD_DECLARE_DATASOURCE(UsdImagingDataSourceAttribute<T>);
31
34 VtValue GetValue(HdSampledDataSource::Time shutterOffset) override
35 {
36 return VtValue(GetTypedValue(shutterOffset));
37 }
38
41 T GetTypedValue(HdSampledDataSource::Time shutterOffset) override
42 {
43 // Zero-initialization for numerical types.
44 T result{};
45 if (!_usdAttrQuery) {
46 return result;
47 }
48 UsdTimeCode time = _stageGlobals.GetTime();
49 if (time.IsNumeric()) {
50 time = UsdTimeCode(time.GetValue() + shutterOffset);
51 }
52
53 bool valueRetrieved = _usdAttrQuery.Get<T>(&result, time);
54 if (valueRetrieved) {
55 return result;
56 }
57
58 // No value of expected type T could be retrieved. Try schema default
59 // and if that fails return zero-initialized result.
60 valueRetrieved = _usdAttrQuery.GetFallbackValue<T>(&result);
61 if (valueRetrieved) {
62 return result;
63 }
64
65 return result;
66 }
67
72 HdSampledDataSource::Time startTime,
73 HdSampledDataSource::Time endTime,
74 std::vector<HdSampledDataSource::Time> *outSampleTimes) override
75 {
76 if (!_usdAttrQuery) {
77 return false;
78 }
79
80 UsdTimeCode time = _stageGlobals.GetTime();
81 if (!_usdAttrQuery.ValueMightBeTimeVarying() ||
82 !time.IsNumeric()) {
83 return false;
84 }
85
86 GfInterval interval(
87 time.GetValue() + startTime,
88 time.GetValue() + endTime);
89 std::vector<double> timeSamples;
90
91 // Start with the times that fall within the interval
92 _usdAttrQuery.GetTimeSamplesInInterval(interval, &timeSamples);
93 // Add bracketing sample times for the leading and trailing edges of the
94 // interval.
95 double first, ignore, last;
96 bool hasFirst, hasLast;
97 // If hasFirst/hasLast comes back false for an edge, or if both the left and
98 // right bracketing times for the edge are the same, it means there's no
99 // bracketing sample time anywhere beyond that edge, so we fall back to the
100 // interval's edge.
101 _usdAttrQuery.GetBracketingTimeSamples(interval.GetMin(), &first, &ignore, &hasFirst);
102 if (!hasFirst || first == ignore) {
103 first = interval.GetMin();
104 }
105 _usdAttrQuery.GetBracketingTimeSamples(interval.GetMax(), &ignore, &last, &hasLast);
106 if (!hasLast || last == ignore ) {
107 last = interval.GetMax();
108 }
109 // Add the bracketing sample times only if they actually fall outside the
110 // interval. This maintains ordering and uniqueness.
111 if (timeSamples.empty() || first < timeSamples.front()) {
112 timeSamples.insert(timeSamples.begin(), first);
113 }
114 if (last > timeSamples.back()) {
115 timeSamples.insert(timeSamples.end(), last);
116 }
117
118 // We need to convert the time array because usd uses double and
119 // hydra (and prman) use float :/.
120 outSampleTimes->resize(timeSamples.size());
121 for (size_t i = 0; i < timeSamples.size(); ++i) {
122 (*outSampleTimes)[i] = timeSamples[i] - time.GetValue();
123 }
124
125 return outSampleTimes->size() > 1;
126 }
127
128protected:
132
147 UsdImagingDataSourceAttribute(
148 const UsdAttribute &usdAttr,
149 const UsdImagingDataSourceStageGlobals &stageGlobals,
150 const SdfPath &sceneIndexPath = SdfPath::EmptyPath(),
151 const HdDataSourceLocator &timeVaryingFlagLocator =
153
155 UsdImagingDataSourceAttribute(
156 const UsdAttributeQuery &usdAttrQuery,
157 const UsdImagingDataSourceStageGlobals &stageGlobals,
158 const SdfPath &sceneIndexPath = SdfPath::EmptyPath(),
159 const HdDataSourceLocator &timeVaryingFlagLocator =
161
162 UsdAttributeQuery _usdAttrQuery;
163 const UsdImagingDataSourceStageGlobals &_stageGlobals;
164};
165
166// ----------------------------------------------------------------------------
167
168
172USDIMAGING_API
173HdSampledDataSourceHandle
174UsdImagingDataSourceAttributeNew(
175 const UsdAttribute &usdAttr,
176 const UsdImagingDataSourceStageGlobals &stageGlobals,
177 const SdfPath &sceneIndexPath = SdfPath::EmptyPath(),
178 const HdDataSourceLocator &timeVaryingFlagLocator =
180
182USDIMAGING_API
183HdSampledDataSourceHandle
184UsdImagingDataSourceAttributeNew(
185 const UsdAttributeQuery &usdAttrQuery,
186 const UsdImagingDataSourceStageGlobals &stageGlobals,
187 const SdfPath &sceneIndexPath = SdfPath::EmptyPath(),
188 const HdDataSourceLocator &timeVaryingFlagLocator =
190
191// ----------------------------------------------------------------------------
192
193
194template<typename T>
195inline void
196UsdImagingDataSourceAttribute_RecordObjectInStageGlobals(
197 const UsdImagingDataSourceStageGlobals *stageGlobals,
198 const SdfPath &objPath)
199{
200 // By default nothing to record.
201}
202
203template<>
204inline void
205UsdImagingDataSourceAttribute_RecordObjectInStageGlobals<SdfAssetPath>(
206 const UsdImagingDataSourceStageGlobals *stageGlobals,
207 const SdfPath &objPath)
208{
209 // Record asset path-valued attributes.
210 stageGlobals->FlagAsAssetPathDependent(objPath);
211}
212
213template<typename T>
214UsdImagingDataSourceAttribute<T>::UsdImagingDataSourceAttribute(
215 const UsdAttribute &usdAttr,
216 const UsdImagingDataSourceStageGlobals &stageGlobals,
217 const SdfPath &sceneIndexPath,
218 const HdDataSourceLocator &timeVaryingFlagLocator)
219 : UsdImagingDataSourceAttribute(
220 UsdAttributeQuery(usdAttr), stageGlobals,
221 sceneIndexPath, timeVaryingFlagLocator)
222{
223}
224
225template<typename T>
226UsdImagingDataSourceAttribute<T>::UsdImagingDataSourceAttribute(
227 const UsdAttributeQuery &usdAttrQuery,
228 const UsdImagingDataSourceStageGlobals &stageGlobals,
229 const SdfPath &sceneIndexPath,
230 const HdDataSourceLocator &timeVaryingFlagLocator)
231 : _usdAttrQuery(usdAttrQuery)
232 , _stageGlobals(stageGlobals)
233{
234 if (!timeVaryingFlagLocator.IsEmpty()) {
235 if (_usdAttrQuery.ValueMightBeTimeVarying()) {
236 _stageGlobals.FlagAsTimeVarying(
237 sceneIndexPath, timeVaryingFlagLocator);
238 }
239 }
240
241 UsdImagingDataSourceAttribute_RecordObjectInStageGlobals<T>(
242 &_stageGlobals, usdAttrQuery.GetAttribute().GetPath());
243}
244
245PXR_NAMESPACE_CLOSE_SCOPE
246
247#endif // PXR_USD_IMAGING_USD_IMAGING_DATA_SOURCE_ATTRIBUTE_H
A basic mathematical interval class.
Definition: interval.h:33
Represents an object that can identify the location of a data source.
static HD_API const HdDataSourceLocator & EmptyLocator()
Returns a common empty locator.
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 path value used to locate objects in layers or scenegraphs.
Definition: path.h:280
static SDF_API const SdfPath & EmptyPath()
The empty path value, equivalent to SdfPath().
Scenegraph object for authoring and retrieving numeric, string, and array valued data,...
Definition: attribute.h:183
Object for efficiently making repeated queries for attribute values.
USD_API const UsdAttribute & GetAttribute() const
Return the attribute associated with this query.
This class is used as a context object with global stage information, that gets passed down to dataso...
virtual void FlagAsAssetPathDependent(const SdfPath &usdPath) const =0
Flags the object at usdPath as dependent on an asset path.
SdfPath GetPath() const
Return the complete scene path to this object on its UsdStage, which may (UsdPrim) or may not (all ot...
Definition: object.h:187
Represent a time value, which may be either numeric, holding a double value, or a sentinel value UsdT...
Definition: timeCode.h:72
double GetValue() const
Return the numeric value for this time.
Definition: timeCode.h:157
bool IsNumeric() const
Return true if this time represents a numeric value, false otherwise.
Definition: timeCode.h:151
Provides a container which may hold any type, and provides introspection and iteration over array typ...
Definition: value.h:90