7 #include <pxr/base/gf/quatd.h>
8 #include <pxr/imaging/hd/sceneDelegate.h>
13 const SdfPath &instancerId
14 #
if PXR_VERSION <= 2011
16 const SdfPath &parentId
19 : HdInstancer(delegate,
21 #
if PXR_VERSION <= 2011
33 #if PXR_VERSION > 2011
34 void HdCyclesInstancer::Sync(HdSceneDelegate *sceneDelegate,
35 HdRenderParam *renderParam,
36 HdDirtyBits *dirtyBits)
38 _UpdateInstancer(sceneDelegate, dirtyBits);
40 if (HdChangeTracker::IsAnyPrimvarDirty(*dirtyBits, GetId())) {
46 void HdCyclesInstancer::SyncPrimvars()
48 HdSceneDelegate *
const sceneDelegate = GetDelegate();
49 const HdDirtyBits dirtyBits =
50 sceneDelegate->GetRenderIndex().GetChangeTracker().GetInstancerDirtyBits(GetId());
52 for (
const HdPrimvarDescriptor &desc :
53 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()) {
63 if (desc.name == HdInstancerTokens->translate) {
64 _translate = value.Get<VtVec3fArray>();
66 else if (desc.name == HdInstancerTokens->rotate) {
67 _rotate = value.Get<VtVec4fArray>();
69 else if (desc.name == HdInstancerTokens->scale) {
70 _scale = value.Get<VtVec3fArray>();
72 else if (desc.name == HdInstancerTokens->instanceTransform) {
73 _instanceTransform = value.Get<VtMatrix4dArray>();
77 sceneDelegate->GetRenderIndex().GetChangeTracker().MarkInstancerClean(GetId());
82 #if PXR_VERSION <= 2011
86 const VtIntArray instanceIndices = GetDelegate()->GetInstanceIndices(GetId(), prototypeId);
87 const GfMatrix4d instanceTransform = GetDelegate()->GetInstancerTransform(GetId());
89 VtMatrix4dArray transforms;
90 transforms.reserve(instanceIndices.size());
92 for (
int index : instanceIndices) {
95 if (index < _translate.size()) {
96 GfMatrix4d translateMat(1);
97 translateMat.SetTranslate(_translate[index]);
101 if (index < _rotate.size()) {
102 GfMatrix4d rotateMat(1);
103 const GfVec4f &quat = _rotate[index];
104 rotateMat.SetRotate(GfQuatd(quat[0], quat[1], quat[2], quat[3]));
108 if (index < _scale.size()) {
109 GfMatrix4d scaleMat(1);
110 scaleMat.SetScale(_scale[index]);
114 if (index < _instanceTransform.size()) {
121 VtMatrix4dArray resultTransforms;
124 GetDelegate()->GetRenderIndex().GetInstancer(GetParentId()))) {
125 for (
const GfMatrix4d &parentTransform : instancer->ComputeInstanceTransforms(GetId())) {
126 for (
const GfMatrix4d &localTransform : transforms) {
127 resultTransforms.push_back(parentTransform * localTransform);
132 resultTransforms = std::move(transforms);
135 return resultTransforms;
SIMD_FORCE_INLINE btVector3 transform(const btVector3 &point) const
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