10#include <pxr/imaging/hd/extComputationUtils.h>
17 const SdfPath &instancerId
34 bits |= HdChangeTracker::DirtyPoints | HdChangeTracker::DirtyWidths |
35 HdChangeTracker::DirtyPrimvar | HdChangeTracker::DirtyTopology;
39HdDirtyBits HdCyclesCurves::_PropagateDirtyBits(HdDirtyBits bits)
const
41 if (bits & (HdChangeTracker::DirtyTopology)) {
43 bits |= HdChangeTracker::DirtyPoints | HdChangeTracker::DirtyWidths |
44 HdChangeTracker::DirtyPrimvar;
50void HdCyclesCurves::Populate(HdSceneDelegate *sceneDelegate, HdDirtyBits dirtyBits,
bool &rebuild)
52 if (HdChangeTracker::IsTopologyDirty(dirtyBits, GetId())) {
53 PopulateTopology(sceneDelegate);
56 if (dirtyBits & HdChangeTracker::DirtyPoints) {
57 PopulatePoints(sceneDelegate);
60 if (dirtyBits & HdChangeTracker::DirtyWidths) {
61 PopulateWidths(sceneDelegate);
64 if (dirtyBits & HdChangeTracker::DirtyPrimvar) {
65 PopulatePrimvars(sceneDelegate);
68 rebuild = (
_geom->curve_keys_is_modified()) || (
_geom->curve_radius_is_modified());
71void HdCyclesCurves::PopulatePoints(HdSceneDelegate *sceneDelegate)
75 for (
const HdExtComputationPrimvarDescriptor &desc :
76 sceneDelegate->GetExtComputationPrimvarDescriptors(GetId(), HdInterpolationVertex))
78 if (desc.name == HdTokens->points) {
79 auto valueStore = HdExtComputationUtils::GetComputedPrimvarValues({desc}, sceneDelegate);
80 const auto valueStoreIt = valueStore.find(desc.name);
81 if (valueStoreIt != valueStore.end()) {
82 value = std::move(valueStoreIt->second);
88 if (value.IsEmpty()) {
89 value = GetPrimvar(sceneDelegate, HdTokens->points);
92 if (!value.IsHolding<VtVec3fArray>()) {
93 TF_WARN(
"Invalid points data for %s", GetId().GetText());
97 const auto &points = value.UncheckedGet<VtVec3fArray>();
100 pointsDataCycles.
reserve(points.size());
102 for (
const GfVec3f &point : points) {
103 pointsDataCycles.push_back_reserved(
make_float3(point[0], point[1], point[2]));
106 _geom->set_curve_keys(pointsDataCycles);
109void HdCyclesCurves::PopulateWidths(HdSceneDelegate *sceneDelegate)
111 VtValue value = GetPrimvar(sceneDelegate, HdTokens->widths);
114 if (!value.IsHolding<VtFloatArray>()) {
115 TF_WARN(
"Invalid widths data for %s", GetId().GetText());
119 const auto &widths = value.UncheckedGet<VtFloatArray>();
122 radiusDataCycles.
reserve(widths.size());
124 if (interpolation == HdInterpolationConstant) {
125 TF_VERIFY(widths.size() == 1);
127 const float constantRadius = widths[0] * 0.5f;
129 for (
size_t i = 0; i <
_geom->num_keys(); ++i) {
130 radiusDataCycles.push_back_reserved(constantRadius);
133 else if (interpolation == HdInterpolationVertex) {
134 TF_VERIFY(widths.size() ==
_geom->num_keys());
136 for (
size_t i = 0; i <
_geom->num_keys(); ++i) {
137 radiusDataCycles.push_back_reserved(widths[i] * 0.5f);
141 _geom->set_curve_radius(radiusDataCycles);
144void HdCyclesCurves::PopulatePrimvars(HdSceneDelegate *sceneDelegate)
148 const std::pair<HdInterpolation, AttributeElement> interpolations[] = {
155 for (
const auto &interpolation : interpolations) {
156 for (
const HdPrimvarDescriptor &desc :
157 GetPrimvarDescriptors(sceneDelegate, interpolation.first))
160 if (desc.name == HdTokens->points || desc.name == HdTokens->widths) {
164 VtValue value = GetPrimvar(sceneDelegate, desc.name);
165 if (value.IsEmpty()) {
169 const ustring name(desc.name.GetString());
172 if (desc.role == HdPrimvarRoleTokens->textureCoordinate) {
175 else if (desc.name == HdTokens->displayColor &&
176 interpolation.first == HdInterpolationConstant)
178 if (value.IsHolding<VtVec3fArray>() && value.GetArraySize() == 1) {
179 const GfVec3f color = value.UncheckedGet<VtVec3fArray>()[0];
186 _geom->need_attribute(scene, name))
194void HdCyclesCurves::PopulateTopology(HdSceneDelegate *sceneDelegate)
199 HdBasisCurvesTopology topology = GetBasisCurvesTopology(sceneDelegate);
201 _geom->reserve_curves(topology.GetNumCurves(), topology.CalculateNeededNumberOfControlPoints());
203 const VtIntArray vertCounts = topology.GetCurveVertexCounts();
205 for (
int curve = 0, key = 0; curve < topology.GetNumCurves(); ++
curve) {
207 _geom->add_curve(key, 0);
209 key += vertCounts[
curve];
HdCyclesCurves(const PXR_NS::SdfPath &rprimId, const PXR_NS::SdfPath &instancerId={})
PXR_NS::HdDirtyBits GetInitialDirtyBitsMask() const override
~HdCyclesCurves() override
PXR_NS::HdInterpolation GetPrimvarInterpolation(PXR_NS::HdSceneDelegate *sceneDelegate, const PXR_NS::TfToken &name) const
PXR_NS::HdDirtyBits GetInitialDirtyBitsMask() const override
std::vector< CCL_NS::Object * > _instances
void reserve(size_t newcapacity)
HDCYCLES_NAMESPACE_OPEN_SCOPE void ApplyPrimvars(AttributeSet &attributes, const ustring &name, VtValue value, AttributeElement elem, AttributeStandard std)
#define HDCYCLES_NAMESPACE_CLOSE_SCOPE