7#ifndef PXR_IMAGING_HD_EXT_COMPUTATION_UTILS_H
8#define PXR_IMAGING_HD_EXT_COMPUTATION_UTILS_H
11#include "pxr/imaging/hd/api.h"
12#include "pxr/imaging/hd/extComputation.h"
13#include "pxr/imaging/hd/sceneDelegate.h"
17#include "pxr/base/vt/value.h"
19#include <unordered_map>
21PXR_NAMESPACE_OPEN_SCOPE
24using HdExtComputationConstPtrVector = std::vector<HdExtComputationConstPtr>;
33class HdExtComputationUtils {
36 std::unordered_map<TfToken, VtValue, TfToken::HashFunctor>;
44 GetComputedPrimvarValues(
45 HdExtComputationPrimvarDescriptorVector
const& compPrimvars,
48 template <
unsigned int CAPACITY>
49 using SampledValueStore =
50 std::unordered_map<TfToken, HdTimeSampleArray<VtValue, CAPACITY>,
57 template <
unsigned int CAPACITY>
59 SampleComputedPrimvarValues(
60 HdExtComputationPrimvarDescriptorVector
const& compPrimvars,
62 size_t maxSampleCount,
63 SampledValueStore<CAPACITY> *computedPrimvarValueStore);
66 using ComputationDependencyMap =
68 HdExtComputationConstPtrVector>;
77 DependencySort(ComputationDependencyMap cdm,
78 HdExtComputationConstPtrVector* sortedComps);
82 PrintDependencyMap(ComputationDependencyMap
const& cdm);
86 static ComputationDependencyMap
87 _GenerateDependencyMap(
88 HdExtComputationPrimvarDescriptorVector
const& compPrimvars,
91 template <
unsigned int CAPACITY>
93 _ExecuteSampledComputations(
94 HdExtComputationConstPtrVector computations,
96 size_t maxSampleCount,
97 SampledValueStore<CAPACITY>* valueStore);
103 _LimitTimeSamples(
size_t maxSampleCount, std::vector<double>* times);
120template <
unsigned int CAPACITY>
122HdExtComputationUtils::SampleComputedPrimvarValues(
123 HdExtComputationPrimvarDescriptorVector
const& compPrimvars,
125 size_t maxSampleCount,
126 SampledValueStore<CAPACITY> *computedPrimvarValueStore
132 ComputationDependencyMap cdm =
133 _GenerateDependencyMap(compPrimvars, sceneDelegate);
136 HdExtComputationConstPtrVector sortedComputations;
137 bool success = DependencySort(cdm, &sortedComputations);
143 SampledValueStore<CAPACITY> valueStore;
144 _ExecuteSampledComputations<CAPACITY>(sortedComputations, sceneDelegate,
145 maxSampleCount, &valueStore);
148 for (
auto const& pv : compPrimvars) {
149 TfToken const& compOutputName = pv.sourceComputationOutputName;
150 (*computedPrimvarValueStore)[pv.name] = valueStore[compOutputName];
154template <
unsigned int CAPACITY>
156HdExtComputationUtils::_ExecuteSampledComputations(
157 HdExtComputationConstPtrVector computations,
159 size_t maxSampleCount,
160 SampledValueStore<CAPACITY> *valueStore
165 for (
auto const& comp : computations) {
166 SdfPath const& compId = comp->GetId();
168 TfTokenVector const& sceneInputNames = comp->GetSceneInputNames();
169 HdExtComputationInputDescriptorVector
const& compInputs =
170 comp->GetComputationInputs();
171 HdExtComputationOutputDescriptorVector
const& compOutputs =
172 comp->GetComputationOutputs();
175 std::vector<double> times;
176 for (
TfToken const& input : sceneInputNames) {
177 auto &samples = (*valueStore)[input];
180 for (
size_t i = 0; i < samples.count; ++i)
181 times.push_back(samples.times[i]);
184 if (comp->IsInputAggregation()) {
191 for (
auto const& computedInput : compInputs) {
192 auto const& samples =
193 valueStore->at(computedInput.sourceComputationOutputName);
194 for (
size_t i = 0; i < samples.count; ++i) {
195 times.push_back(samples.times[i]);
200 _LimitTimeSamples(maxSampleCount, ×);
203 for (
const TfToken &name : comp->GetOutputNames())
205 auto &output_samples = (*valueStore)[name];
206 output_samples.Resize(times.size());
207 output_samples.count = 0;
211 sceneInputValues.
reserve(sceneInputNames.size());
214 compInputValues.
reserve(compInputs.size());
219 for (
double t : times) {
223 sceneInputValues.
clear();
224 for (
auto const& sceneInput : comp->GetSceneInputNames()) {
225 auto const& samples = valueStore->at(sceneInput);
226 sceneInputValues.
push_back(samples.Resample(t));
229 compInputValues.
clear();
230 for (
auto const& computedInput : compInputs) {
231 auto const& samples =
232 valueStore->at(computedInput.sourceComputationOutputName);
233 compInputValues.
push_back(samples.Resample(t));
236 compOutputValues.
resize(compOutputs.size());
237 if (!_InvokeComputation(*sceneDelegate, *comp,
248 for (
size_t i = 0; i < compOutputValues.
size(); ++i) {
249 auto &output_samples = (*valueStore)[compOutputs[i].name];
251 output_samples.times[output_samples.count] = t;
252 output_samples.values[output_samples.count] =
253 std::move(compOutputValues[i]);
254 ++output_samples.count;
261PXR_NAMESPACE_CLOSE_SCOPE
Hydra Representation of a Client defined computation.
Adapter class providing data exchange with the client scene graph.
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.
A path value used to locate objects in layers or scenegraphs.
This is a small-vector class with local storage optimization, the local storage can be specified via ...
void push_back(const value_type &v)
Copy an entry to the back of the vector,.
void reserve(size_type newCapacity)
Reserve storage for newCapacity entries.
size_type size() const
Returns the current size of the vector.
void resize(size_type newSize, const value_type &v=value_type())
Resize the vector to newSize and insert copies of \v.
void clear()
Clear the entries in the vector.
Represents a range of contiguous elements.
Token for efficient comparison, assignment, and hashing of known strings.
TfSpan< typename Container::value_type > TfMakeSpan(Container &cont)
Helper for constructing a non-const TfSpan from a container.
Functor to use for hash maps from tokens to other things.
TfToken class for efficient string referencing and hashing, plus conversions to and from stl string c...
std::vector< TfToken > TfTokenVector
Convenience types.