24 #ifndef PXR_IMAGING_HD_EXT_COMPUTATION_UTILS_H
25 #define PXR_IMAGING_HD_EXT_COMPUTATION_UTILS_H
28 #include "pxr/imaging/hd/api.h"
29 #include "pxr/imaging/hd/extComputation.h"
30 #include "pxr/imaging/hd/sceneDelegate.h"
34 #include "pxr/base/vt/value.h"
36 #include <unordered_map>
38 PXR_NAMESPACE_OPEN_SCOPE
41 using HdExtComputationConstPtrVector = std::vector<HdExtComputationConstPtr>;
50 class HdExtComputationUtils {
53 std::unordered_map<TfToken, VtValue, TfToken::HashFunctor>;
61 GetComputedPrimvarValues(
62 HdExtComputationPrimvarDescriptorVector
const& compPrimvars,
65 template <
unsigned int CAPACITY>
66 using SampledValueStore =
67 std::unordered_map<TfToken, HdTimeSampleArray<VtValue, CAPACITY>,
74 template <
unsigned int CAPACITY>
76 SampleComputedPrimvarValues(
77 HdExtComputationPrimvarDescriptorVector
const& compPrimvars,
79 size_t maxSampleCount,
80 SampledValueStore<CAPACITY> *computedPrimvarValueStore);
83 using ComputationDependencyMap =
85 HdExtComputationConstPtrVector>;
94 DependencySort(ComputationDependencyMap cdm,
95 HdExtComputationConstPtrVector* sortedComps);
99 PrintDependencyMap(ComputationDependencyMap
const& cdm);
103 static ComputationDependencyMap
104 _GenerateDependencyMap(
105 HdExtComputationPrimvarDescriptorVector
const& compPrimvars,
108 template <
unsigned int CAPACITY>
110 _ExecuteSampledComputations(
111 HdExtComputationConstPtrVector computations,
113 size_t maxSampleCount,
114 SampledValueStore<CAPACITY>* valueStore);
120 _LimitTimeSamples(
size_t maxSampleCount, std::vector<double>* times);
137 template <
unsigned int CAPACITY>
139 HdExtComputationUtils::SampleComputedPrimvarValues(
140 HdExtComputationPrimvarDescriptorVector
const& compPrimvars,
142 size_t maxSampleCount,
143 SampledValueStore<CAPACITY> *computedPrimvarValueStore
149 ComputationDependencyMap cdm =
150 _GenerateDependencyMap(compPrimvars, sceneDelegate);
153 HdExtComputationConstPtrVector sortedComputations;
154 bool success = DependencySort(cdm, &sortedComputations);
160 SampledValueStore<CAPACITY> valueStore;
161 _ExecuteSampledComputations<CAPACITY>(sortedComputations, sceneDelegate,
162 maxSampleCount, &valueStore);
165 for (
auto const& pv : compPrimvars) {
166 TfToken const& compOutputName = pv.sourceComputationOutputName;
167 (*computedPrimvarValueStore)[pv.name] = valueStore[compOutputName];
171 template <
unsigned int CAPACITY>
173 HdExtComputationUtils::_ExecuteSampledComputations(
174 HdExtComputationConstPtrVector computations,
176 size_t maxSampleCount,
177 SampledValueStore<CAPACITY> *valueStore
182 for (
auto const& comp : computations) {
183 SdfPath const& compId = comp->GetId();
185 TfTokenVector const& sceneInputNames = comp->GetSceneInputNames();
186 HdExtComputationInputDescriptorVector
const& compInputs =
187 comp->GetComputationInputs();
188 HdExtComputationOutputDescriptorVector
const& compOutputs =
189 comp->GetComputationOutputs();
192 std::vector<double> times;
193 for (
TfToken const& input : sceneInputNames) {
194 auto &samples = (*valueStore)[input];
197 for (
size_t i = 0; i < samples.count; ++i)
198 times.push_back(samples.times[i]);
201 if (comp->IsInputAggregation()) {
208 for (
auto const& computedInput : compInputs) {
209 auto const& samples =
210 valueStore->at(computedInput.sourceComputationOutputName);
211 for (
size_t i = 0; i < samples.count; ++i) {
212 times.push_back(samples.times[i]);
217 _LimitTimeSamples(maxSampleCount, ×);
220 for (
const TfToken &name : comp->GetOutputNames())
222 auto &output_samples = (*valueStore)[name];
223 output_samples.Resize(times.size());
224 output_samples.count = 0;
228 sceneInputValues.
reserve(sceneInputNames.size());
231 compInputValues.
reserve(compInputs.size());
236 for (
double t : times) {
240 sceneInputValues.
clear();
241 for (
auto const& sceneInput : comp->GetSceneInputNames()) {
242 auto const& samples = valueStore->at(sceneInput);
243 sceneInputValues.
push_back(samples.Resample(t));
246 compInputValues.
clear();
247 for (
auto const& computedInput : compInputs) {
248 auto const& samples =
249 valueStore->at(computedInput.sourceComputationOutputName);
250 compInputValues.
push_back(samples.Resample(t));
253 compOutputValues.
resize(compOutputs.size());
254 if (!_InvokeComputation(*sceneDelegate, *comp,
265 for (
size_t i = 0; i < compOutputValues.
size(); ++i) {
266 auto &output_samples = (*valueStore)[compOutputs[i].name];
268 output_samples.times[output_samples.count] = t;
269 output_samples.values[output_samples.count] =
270 std::move(compOutputValues[i]);
271 ++output_samples.count;
278 PXR_NAMESPACE_CLOSE_SCOPE
280 #endif // PXR_IMAGING_HD_EXT_COMPUTATION_UTILS_H
Hydra Representation of a Client defined computation.
void reserve(size_type newCapacity)
Reserve storage for newCapacity entries.
This is a small-vector class with local storage optimization, the local storage can be specified via ...
Functor to use for hash maps from tokens to other things.
virtual HD_API size_t SampleExtComputationInput(SdfPath const &computationId, TfToken const &input, size_t maxSampleCount, float *sampleTimes, VtValue *sampleValues)
Return up to maxSampleCount samples for a given computation id and input token.
Token for efficient comparison, assignment, and hashing of known strings.
void resize(size_type newSize, const value_type &v=value_type())
Resize the vector to newSize and insert copies of .
Represents a range of contiguous elements.
size_type size() const
Returns the current size of the vector.
Adapter class providing data exchange with the client scene graph.
void clear()
Clear the entries in the vector.
std::vector< TfToken > TfTokenVector
Convenience types.
A path value used to locate objects in layers or scenegraphs.
void push_back(const value_type &v)
Copy an entry to the back of the vector,.
TfSpan< typename Container::value_type > TfMakeSpan(Container &cont)
Helper for constructing a non-const TfSpan from a container.
TfToken class for efficient string referencing and hashing, plus conversions to and from stl string c...