8#include <pxr/base/gf/quatd.h>
9#include <pxr/imaging/hd/sceneDelegate.h>
14 const SdfPath &instancerId
15#
if PXR_VERSION <= 2011
17 const SdfPath &parentId
20 : HdInstancer(delegate,
22#if PXR_VERSION <= 2011
33void HdCyclesInstancer::Sync(HdSceneDelegate *sceneDelegate,
35 HdDirtyBits *dirtyBits)
37 _UpdateInstancer(sceneDelegate, dirtyBits);
39 if (HdChangeTracker::IsAnyPrimvarDirty(*dirtyBits, GetId())) {
45void HdCyclesInstancer::SyncPrimvars()
47 HdSceneDelegate *
const sceneDelegate = GetDelegate();
48 const HdDirtyBits dirtyBits =
49 sceneDelegate->GetRenderIndex().GetChangeTracker().GetInstancerDirtyBits(GetId());
51 for (
const HdPrimvarDescriptor &desc :
52 sceneDelegate->GetPrimvarDescriptors(GetId(), HdInterpolationInstance))
54 if (!HdChangeTracker::IsPrimvarDirty(dirtyBits, GetId(), desc.name)) {
58 const VtValue value = sceneDelegate->Get(GetId(), desc.name);
59 if (value.IsEmpty()) {
64 if (desc.name == HdInstancerTokens->translate) {
65 _translate = value.Get<VtVec3fArray>();
67 else if (desc.name == HdInstancerTokens->rotate) {
68 _rotate = value.Get<VtVec4fArray>();
70 else if (desc.name == HdInstancerTokens->scale) {
71 _scale = value.Get<VtVec3fArray>();
73 else if (desc.name == HdInstancerTokens->instanceTransform) {
74 _instanceTransform = value.Get<VtMatrix4dArray>();
77 if (desc.name == HdInstancerTokens->instanceTranslations) {
78 _translate = value.Get<VtVec3fArray>();
80 else if (desc.name == HdInstancerTokens->instanceRotations) {
81 _rotate = value.Get<VtVec4fArray>();
83 else if (desc.name == HdInstancerTokens->instanceScales) {
84 _scale = value.Get<VtVec3fArray>();
86 else if (desc.name == HdInstancerTokens->instanceTransforms) {
87 _instanceTransform = value.Get<VtMatrix4dArray>();
92 sceneDelegate->GetRenderIndex().GetChangeTracker().MarkInstancerClean(GetId());
97#if PXR_VERSION <= 2011
101 const VtIntArray instanceIndices = GetDelegate()->GetInstanceIndices(GetId(), prototypeId);
102 const GfMatrix4d instanceTransform = GetDelegate()->GetInstancerTransform(GetId());
104 VtMatrix4dArray transforms;
105 transforms.reserve(instanceIndices.size());
107 for (
int index : instanceIndices) {
108 GfMatrix4d transform = instanceTransform;
110 if (index < _translate.size()) {
111 GfMatrix4d translateMat(1);
112 translateMat.SetTranslate(_translate[index]);
113 transform *= translateMat;
116 if (index < _rotate.size()) {
117 GfMatrix4d rotateMat(1);
118 const GfVec4f &quat = _rotate[index];
119 rotateMat.SetRotate(GfQuatd(quat[0], quat[1], quat[2], quat[3]));
120 transform *= rotateMat;
123 if (index < _scale.size()) {
124 GfMatrix4d scaleMat(1);
125 scaleMat.SetScale(_scale[index]);
126 transform *= scaleMat;
129 if (index < _instanceTransform.size()) {
130 transform *= _instanceTransform[index];
133 transforms.push_back(transform);
136 VtMatrix4dArray resultTransforms;
139 GetDelegate()->GetRenderIndex().GetInstancer(GetParentId())))
141 for (
const GfMatrix4d &parentTransform : instancer->ComputeInstanceTransforms(GetId())) {
142 for (
const GfMatrix4d &localTransform : transforms) {
143 resultTransforms.push_back(parentTransform * localTransform);
148 resultTransforms = std::move(transforms);
151 return resultTransforms;
HdCyclesInstancer(PXR_NS::HdSceneDelegate *delegate, const PXR_NS::SdfPath &instancerId, const PXR_NS::SdfPath &parentId)
PXR_NS::VtMatrix4dArray ComputeInstanceTransforms(const PXR_NS::SdfPath &prototypeId)
~HdCyclesInstancer() override
#define HDCYCLES_NAMESPACE_CLOSE_SCOPE