11#include <pxr/imaging/hd/extComputationUtils.h>
18 const SdfPath &instancerId
35 bits |= HdChangeTracker::DirtyPoints | HdChangeTracker::DirtyWidths |
36 HdChangeTracker::DirtyPrimvar;
40HdDirtyBits HdCyclesPoints::_PropagateDirtyBits(HdDirtyBits bits)
const
43 if (bits & (HdChangeTracker::DirtyPoints | HdChangeTracker::DirtyWidths)) {
44 bits |= HdChangeTracker::DirtyPoints | HdChangeTracker::DirtyWidths;
50void HdCyclesPoints::Populate(HdSceneDelegate *sceneDelegate, HdDirtyBits dirtyBits,
bool &rebuild)
52 if (dirtyBits & (HdChangeTracker::DirtyPoints | HdChangeTracker::DirtyWidths)) {
53 const size_t numPoints =
_geom->num_points();
55 PopulatePoints(sceneDelegate);
56 PopulateWidths(sceneDelegate);
58 rebuild =
_geom->num_points() != numPoints;
62 for (
size_t i = 0;
i <
_geom->num_points(); ++
i) {
66 _geom->set_shader(shaders);
69 if (dirtyBits & HdChangeTracker::DirtyPrimvar) {
70 PopulatePrimvars(sceneDelegate);
74void HdCyclesPoints::PopulatePoints(HdSceneDelegate *sceneDelegate)
78 for (
const HdExtComputationPrimvarDescriptor &desc :
79 sceneDelegate->GetExtComputationPrimvarDescriptors(GetId(), HdInterpolationVertex))
81 if (desc.name == HdTokens->points) {
82 auto valueStore = HdExtComputationUtils::GetComputedPrimvarValues({desc}, sceneDelegate);
83 const auto valueStoreIt = valueStore.find(desc.name);
84 if (valueStoreIt != valueStore.end()) {
85 value = std::move(valueStoreIt->second);
91 if (value.IsEmpty()) {
92 value = GetPrimvar(sceneDelegate, HdTokens->points);
95 if (!value.IsHolding<VtVec3fArray>()) {
96 TF_WARN(
"Invalid points data for %s", GetId().GetText());
100 const auto &points = value.UncheckedGet<VtVec3fArray>();
102 array<float3> pointsDataCycles;
103 pointsDataCycles.reserve(points.size());
105 for (
const GfVec3f &point : points) {
106 pointsDataCycles.push_back_reserved(
make_float3(point[0], point[1], point[2]));
109 _geom->set_points(pointsDataCycles);
112void HdCyclesPoints::PopulateWidths(HdSceneDelegate *sceneDelegate)
114 const VtValue value = GetPrimvar(sceneDelegate, HdTokens->widths);
117 if (!value.IsHolding<VtFloatArray>()) {
118 TF_WARN(
"Invalid widths data for %s", GetId().GetText());
122 const auto &widths = value.UncheckedGet<VtFloatArray>();
124 array<float> radiusDataCycles;
125 radiusDataCycles.reserve(
_geom->num_points());
127 if (interpolation == HdInterpolationConstant) {
128 TF_VERIFY(widths.size() == 1);
130 const float constantRadius = widths[0] * 0.5f;
132 for (
size_t i = 0;
i <
_geom->num_points(); ++
i) {
133 radiusDataCycles.push_back_reserved(constantRadius);
136 else if (interpolation == HdInterpolationVertex) {
137 TF_VERIFY(widths.size() ==
_geom->num_points());
139 for (
size_t i = 0;
i <
_geom->num_points(); ++
i) {
140 radiusDataCycles.push_back_reserved(widths[
i] * 0.5f);
144 _geom->set_radius(radiusDataCycles);
147void HdCyclesPoints::PopulatePrimvars(HdSceneDelegate *sceneDelegate)
151 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 (interpolation.first == HdInterpolationVertex) {
177 if (desc.name == HdTokens->displayColor || desc.role == HdPrimvarRoleTokens->color) {
180 else if (desc.name == HdTokens->normals) {
184 else if (desc.name == HdTokens->displayColor &&
185 interpolation.first == HdInterpolationConstant)
187 if (value.IsHolding<VtVec3fArray>() && value.GetArraySize() == 1) {
188 const GfVec3f color = value.UncheckedGet<VtVec3fArray>()[0];
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
CCL_NS::PointCloud * _geom
PXR_NS::HdDirtyBits GetInitialDirtyBitsMask() const override
std::vector< CCL_NS::Object * > _instances
HdCyclesPoints(const PXR_NS::SdfPath &rprimId, const PXR_NS::SdfPath &instancerId={})
~HdCyclesPoints() override
PXR_NS::HdDirtyBits GetInitialDirtyBitsMask() const override
void push_back_reserved(const T &t)
void reserve(const 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