11#include <pxr/imaging/hd/extComputationUtils.h>
18 const SdfPath &instancerId
35 bits |= HdChangeTracker::DirtyPoints | HdChangeTracker::DirtyWidths |
36 HdChangeTracker::DirtyPrimvar | HdChangeTracker::DirtyTopology;
40HdDirtyBits HdCyclesCurves::_PropagateDirtyBits(HdDirtyBits bits)
const
42 if (bits & (HdChangeTracker::DirtyTopology)) {
44 bits |= HdChangeTracker::DirtyPoints | HdChangeTracker::DirtyWidths |
45 HdChangeTracker::DirtyPrimvar;
51void HdCyclesCurves::Populate(HdSceneDelegate *sceneDelegate, HdDirtyBits dirtyBits,
bool &rebuild)
53 if (HdChangeTracker::IsTopologyDirty(dirtyBits, GetId())) {
54 PopulateTopology(sceneDelegate);
57 if (dirtyBits & HdChangeTracker::DirtyPoints) {
58 PopulatePoints(sceneDelegate);
61 if (dirtyBits & HdChangeTracker::DirtyWidths) {
62 PopulateWidths(sceneDelegate);
65 if (dirtyBits & HdChangeTracker::DirtyPrimvar) {
66 PopulatePrimvars(sceneDelegate);
69 rebuild = (
_geom->curve_keys_is_modified()) || (
_geom->curve_radius_is_modified());
72void HdCyclesCurves::PopulatePoints(HdSceneDelegate *sceneDelegate)
76 for (
const HdExtComputationPrimvarDescriptor &desc :
77 sceneDelegate->GetExtComputationPrimvarDescriptors(GetId(), HdInterpolationVertex))
79 if (desc.name == HdTokens->points) {
80 auto valueStore = HdExtComputationUtils::GetComputedPrimvarValues({desc}, sceneDelegate);
81 const auto valueStoreIt = valueStore.find(desc.name);
82 if (valueStoreIt != valueStore.end()) {
83 value = std::move(valueStoreIt->second);
89 if (value.IsEmpty()) {
90 value = GetPrimvar(sceneDelegate, HdTokens->points);
93 if (!value.IsHolding<VtVec3fArray>()) {
94 TF_WARN(
"Invalid points data for %s", GetId().GetText());
98 const auto &points = value.UncheckedGet<VtVec3fArray>();
100 array<float3> pointsDataCycles;
101 pointsDataCycles.reserve(points.size());
103 for (
const GfVec3f &point : points) {
104 pointsDataCycles.push_back_reserved(
make_float3(point[0], point[1], point[2]));
107 _geom->set_curve_keys(pointsDataCycles);
110void HdCyclesCurves::PopulateWidths(HdSceneDelegate *sceneDelegate)
112 const VtValue value = GetPrimvar(sceneDelegate, HdTokens->widths);
115 if (!value.IsHolding<VtFloatArray>()) {
116 TF_WARN(
"Invalid widths data for %s", GetId().GetText());
120 const auto &widths = value.UncheckedGet<VtFloatArray>();
122 array<float> radiusDataCycles;
123 radiusDataCycles.reserve(widths.size());
125 if (interpolation == HdInterpolationConstant) {
126 TF_VERIFY(widths.size() == 1);
128 const float constantRadius = widths[0] * 0.5f;
130 for (
size_t i = 0;
i <
_geom->num_keys(); ++
i) {
131 radiusDataCycles.push_back_reserved(constantRadius);
134 else if (interpolation == HdInterpolationVertex) {
135 TF_VERIFY(widths.size() ==
_geom->num_keys());
137 for (
size_t i = 0;
i <
_geom->num_keys(); ++
i) {
138 radiusDataCycles.push_back_reserved(widths[
i] * 0.5f);
142 _geom->set_curve_radius(radiusDataCycles);
145void HdCyclesCurves::PopulatePrimvars(HdSceneDelegate *sceneDelegate)
149 const std::pair<HdInterpolation, AttributeElement> interpolations[] = {
156 for (
const auto &interpolation : interpolations) {
157 for (
const HdPrimvarDescriptor &desc :
158 GetPrimvarDescriptors(sceneDelegate, interpolation.first))
161 if (desc.name == HdTokens->points || desc.name == HdTokens->widths) {
165 const VtValue value = GetPrimvar(sceneDelegate, desc.name);
166 if (value.IsEmpty()) {
170 const ustring
name(desc.name.GetString());
173 if (desc.role == HdPrimvarRoleTokens->textureCoordinate) {
176 else if (desc.name == HdTokens->displayColor &&
177 interpolation.first == HdInterpolationConstant)
179 if (value.IsHolding<VtVec3fArray>() && value.GetArraySize() == 1) {
180 const GfVec3f color = value.UncheckedGet<VtVec3fArray>()[0];
195void HdCyclesCurves::PopulateTopology(HdSceneDelegate *sceneDelegate)
200 const HdBasisCurvesTopology topology = GetBasisCurvesTopology(sceneDelegate);
202 _geom->reserve_curves(topology.GetNumCurves(), topology.CalculateNeededNumberOfControlPoints());
204 const VtIntArray vertCounts = topology.GetCurveVertexCounts();
206 for (
int curve = 0, key = 0; curve < topology.GetNumCurves(); ++curve) {
208 _geom->add_curve(key, 0);
210 key += vertCounts[curve];
HdCyclesCurves(const PXR_NS::SdfPath &rprimId, const PXR_NS::SdfPath &instancerId={})
PXR_NS::HdDirtyBits GetInitialDirtyBitsMask() const override
~HdCyclesCurves() override
HdCyclesGeometry(const PXR_NS::SdfPath &rprimId, const PXR_NS::SdfPath &instancerId)
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
HDCYCLES_NAMESPACE_OPEN_SCOPE void ApplyPrimvars(AttributeSet &attributes, const ustring &name, VtValue value, AttributeElement elem, AttributeStandard std)
#define HDCYCLES_NAMESPACE_CLOSE_SCOPE