62 pxr::UsdGeomPointInstancer point_instancer_prim(
prim_);
64 if (!point_instancer_prim) {
68 pxr::VtArray<pxr::GfVec3f> positions;
69 pxr::VtArray<pxr::GfVec3f> scales;
70 pxr::VtArray<pxr::GfQuath> orientations;
71 pxr::VtArray<int> proto_indices;
72 std::vector<double> time_samples;
74 point_instancer_prim.GetPositionsAttr().GetTimeSamples(&time_samples);
76 double sample_time = motionSampleTime;
78 if (!time_samples.empty()) {
79 sample_time = time_samples[0];
82 point_instancer_prim.GetPositionsAttr().Get(&positions, sample_time);
83 point_instancer_prim.GetScalesAttr().Get(&scales, sample_time);
84 point_instancer_prim.GetOrientationsAttr().Get(&orientations, sample_time);
85 point_instancer_prim.GetProtoIndicesAttr().Get(&proto_indices, sample_time);
87 std::vector<bool> mask = point_instancer_prim.ComputeMaskAtTime(sample_time);
101 if (scales.size() < positions.size()) {
105 for (
const int i :
IndexRange(std::min(scales.size(), positions.size()))) {
106 scales_attribute.
span[i] =
float3(scales[i][0], scales[i][1], scales[i][2]);
109 scales_attribute.
finish();
112 attributes.lookup_or_add_for_write_only_span<
math::Quaternion>(
"orientation",
115 if (orientations.size() < positions.size()) {
119 for (
const int i :
IndexRange(std::min(orientations.size(), positions.size()))) {
121 orientations[i].GetImaginary()[0],
122 orientations[i].GetImaginary()[1],
123 orientations[i].GetImaginary()[2]);
126 orientations_attribute.
finish();
131 if (proto_indices.size() < positions.size()) {
132 proto_indices_attribute.
span.fill(0);
135 for (
const int i :
IndexRange(std::min(proto_indices.size(), positions.size()))) {
136 proto_indices_attribute.
span[i] = proto_indices[i];
139 proto_indices_attribute.
finish();
144 if (mask.size() < positions.size()) {
145 mask_attribute.
span.fill(
true);
148 for (
const int i :
IndexRange(std::min(mask.size(), positions.size()))) {
149 mask_attribute.
span[i] = mask[i];
170 group_input->
locx = -400.0f;
172 group_output->
locx = 500.0f;
176 nullptr, ntree, GEO_NODE_INSTANCE_ON_POINTS);
177 instance_on_points_node->
locx = 300.0f;
182 mask_attrib_node->locx = 100.0f;
183 mask_attrib_node->locy = -100.0f;
186 nullptr, ntree, GEO_NODE_COLLECTION_INFO);
187 collection_info_node->
locx = 100.0f;
188 collection_info_node->
locy = -300.0f;
193 indices_attrib_node->locx = 100.0f;
194 indices_attrib_node->locy = -500.0f;
198 rotation_attrib_node->
locx = 100.0f;
199 rotation_attrib_node->
locy = -700.0f;
202 scale_attrib_node->
locx = 100.0f;
203 scale_attrib_node->
locy = -900.0f;
208 instance_on_points_node,
214 instance_on_points_node,
220 instance_on_points_node,
226 instance_on_points_node,
230 rotation_attrib_node,
232 instance_on_points_node,
236 collection_info_node,
238 instance_on_points_node,
242 instance_on_points_node,