7 #ifndef PXR_IMAGING_HD_EXT_COMPUTATION_UTILS_H
8 #define PXR_IMAGING_HD_EXT_COMPUTATION_UTILS_H
20 #include <unordered_map>
37 std::unordered_map<TfToken, VtValue, TfToken::HashFunctor>;
49 template <
unsigned int CAPACITY>
51 std::unordered_map<TfToken, HdTimeSampleArray<VtValue, CAPACITY>,
58 template <
unsigned int CAPACITY>
63 size_t maxSampleCount,
67 template <
unsigned int CAPACITY>
72 float startTime,
float endTime,
73 size_t maxSampleCount,
96 template <
unsigned int CAPACITY>
98 _SampleComputedPrimvarValues(
101 std::optional<std::pair<float, float>> startAndEndTime,
102 size_t maxSampleCount,
107 _GenerateDependencyMap(
111 template <
unsigned int CAPACITY>
113 _ExecuteSampledComputations(
116 std::optional<std::pair<float, float>> startAndEndTime,
117 size_t maxSampleCount,
124 _LimitTimeSamples(
size_t maxSampleCount, std::vector<double>* times);
141 template <
unsigned int CAPACITY>
146 size_t maxSampleCount,
150 _SampleComputedPrimvarValues<CAPACITY>(
155 computedPrimvarValueStore);
158 template <
unsigned int CAPACITY>
163 float startTime,
float endTime,
164 size_t maxSampleCount,
168 _SampleComputedPrimvarValues<CAPACITY>(
171 { {startTime, endTime }},
173 computedPrimvarValueStore);
176 template <
unsigned int CAPACITY>
178 HdExtComputationUtils::_SampleComputedPrimvarValues(
181 std::optional<std::pair<float, float>> startAndEndTime,
182 size_t maxSampleCount,
183 SampledValueStore<CAPACITY> *computedPrimvarValueStore
190 _GenerateDependencyMap(compPrimvars, sceneDelegate);
200 SampledValueStore<CAPACITY> valueStore;
201 _ExecuteSampledComputations<CAPACITY>(sortedComputations, sceneDelegate,
207 for (
auto const& pv : compPrimvars) {
208 TfToken const& compOutputName = pv.sourceComputationOutputName;
209 (*computedPrimvarValueStore)[pv.name] = valueStore[compOutputName];
213 template <
unsigned int CAPACITY>
215 HdExtComputationUtils::_ExecuteSampledComputations(
218 std::optional<std::pair<float, float>> startAndEndTime,
219 size_t maxSampleCount,
220 SampledValueStore<CAPACITY> *valueStore
225 for (
auto const& comp : computations) {
226 SdfPath const& compId = comp->GetId();
228 TfTokenVector const& sceneInputNames = comp->GetSceneInputNames();
230 comp->GetComputationInputs();
232 comp->GetComputationOutputs();
235 std::vector<double> times;
236 for (
TfToken const& input : sceneInputNames) {
237 auto &
samples = (*valueStore)[input];
238 if (startAndEndTime) {
241 startAndEndTime->first, startAndEndTime->second,
249 for (
size_t i = 0; i <
samples.count; ++i)
250 times.push_back(
samples.times[i]);
253 if (comp->IsInputAggregation()) {
260 for (
auto const& computedInput : compInputs) {
262 valueStore->at(computedInput.sourceComputationOutputName);
263 for (
size_t i = 0; i <
samples.count; ++i) {
264 times.push_back(
samples.times[i]);
269 _LimitTimeSamples(maxSampleCount, ×);
274 auto &output_samples = (*valueStore)[
name];
275 output_samples.Resize(times.size());
276 output_samples.count = 0;
280 sceneInputValues.
reserve(sceneInputNames.size());
283 compInputValues.
reserve(compInputs.size());
288 for (
double t : times) {
292 sceneInputValues.
clear();
293 for (
auto const& sceneInput : comp->GetSceneInputNames()) {
294 auto const&
samples = valueStore->at(sceneInput);
298 compInputValues.
clear();
299 for (
auto const& computedInput : compInputs) {
301 valueStore->at(computedInput.sourceComputationOutputName);
305 compOutputValues.
resize(compOutputs.size());
306 if (!_InvokeComputation(*sceneDelegate, *comp,
317 for (
size_t i = 0; i < compOutputValues.
size(); ++i) {
318 auto &output_samples = (*valueStore)[compOutputs[i].name];
320 output_samples.times[output_samples.count] =
t;
321 output_samples.values[output_samples.count] =
322 std::move(compOutputValues[i]);
323 ++output_samples.count;
332 #endif // PXR_IMAGING_HD_EXT_COMPUTATION_UTILS_H
std::unordered_map< TfToken, HdTimeSampleArray< VtValue, CAPACITY >, TfToken::HashFunctor > SampledValueStore
void push_back(const value_type &v)
void resize(size_type newSize, const value_type &v=value_type())
void reserve(size_type newCapacity)
std::vector< HdExtComputationInputDescriptor > HdExtComputationInputDescriptorVector
static HD_API void PrintDependencyMap(ComputationDependencyMap const &cdm)
Functor to use for hash maps from tokens to other things.
std::vector< HdExtComputationOutputDescriptor > HdExtComputationOutputDescriptorVector
std::unordered_map< HdExtComputation const *, HdExtComputationConstPtrVector > ComputationDependencyMap
static HD_API ValueStore GetComputedPrimvarValues(HdExtComputationPrimvarDescriptorVector const &compPrimvars, HdSceneDelegate *sceneDelegate)
#define HD_TRACE_FUNCTION()
std::vector< TfToken > TfTokenVector
Convenience types.
GLuint const GLchar * name
static void SampleComputedPrimvarValues(HdExtComputationPrimvarDescriptorVector const &compPrimvars, HdSceneDelegate *sceneDelegate, size_t maxSampleCount, SampledValueStore< CAPACITY > *computedPrimvarValueStore)
virtual HD_API size_t SampleExtComputationInput(SdfPath const &computationId, TfToken const &input, size_t maxSampleCount, float *sampleTimes, VtValue *sampleValues)
PXR_NAMESPACE_CLOSE_SCOPE PXR_NAMESPACE_OPEN_SCOPE
std::unordered_map< TfToken, VtValue, TfToken::HashFunctor > ValueStore
TfSpan< typename Container::value_type > TfMakeSpan(Container &cont)
Helper for constructing a non-const TfSpan from a container.
#define PXR_NAMESPACE_CLOSE_SCOPE
static HD_API bool DependencySort(ComputationDependencyMap cdm, HdExtComputationConstPtrVector *sortedComps)
std::vector< HdExtComputationConstPtr > HdExtComputationConstPtrVector
HdExtComputation const * HdExtComputationConstPtr
std::vector< HdExtComputationPrimvarDescriptor > HdExtComputationPrimvarDescriptorVector