15 #include <pxr/imaging/hd/sceneDelegate.h>
21 template<
typename Base,
typename CyclesBase>
23 #
if PXR_VERSION < 2102
25 const SdfPath &instancerId
29 #
if PXR_VERSION < 2102
39 template<
typename Base,
typename CyclesBase>
41 HdDirtyBits *dirtyBits)
47 template<
typename Base,
typename CyclesBase>
50 return HdChangeTracker::DirtyPrimID | HdChangeTracker::DirtyTransform |
51 HdChangeTracker::DirtyMaterialId | HdChangeTracker::DirtyVisibility |
52 HdChangeTracker::DirtyInstancer;
55 template<
typename Base,
typename CyclesBase>
61 template<
typename Base,
typename CyclesBase>
63 HdRenderParam *renderParam,
64 HdDirtyBits *dirtyBits,
65 const TfToken &reprToken)
69 if (*dirtyBits == HdChangeTracker::Clean) {
75 #if PXR_VERSION >= 2102
76 Base::_UpdateInstancer(sceneDelegate, dirtyBits);
77 HdInstancer::_SyncInstancerAndParents(sceneDelegate->GetRenderIndex(), Base::GetInstancerId());
79 Base::_UpdateVisibility(sceneDelegate, dirtyBits);
83 if (*dirtyBits & HdChangeTracker::DirtyMaterialId) {
84 #if HD_API_VERSION >= 37 && PXR_VERSION >= 2105
85 Base::SetMaterialId(sceneDelegate->GetMaterialId(Base::GetId()));
87 Base::_SetMaterialId(sceneDelegate->GetRenderIndex().GetChangeTracker(),
88 sceneDelegate->GetMaterialId(Base::GetId()));
92 sceneDelegate->GetRenderIndex().GetSprim(HdPrimTypeTokens->material,
93 Base::GetMaterialId()));
97 usedShaders[0] =
material->GetCyclesShader();
100 usedShaders[0] =
lock.scene->default_surface;
103 for (
Node *shader : usedShaders) {
104 static_cast<Shader *
>(shader)->tag_used(
lock.scene);
107 _geom->set_used_shaders(usedShaders);
110 const SdfPath &
id = Base::GetId();
112 if (HdChangeTracker::IsPrimIdDirty(*dirtyBits,
id)) {
114 _instances[0]->set_pass_id(Base::GetPrimId() + 1);
117 if (HdChangeTracker::IsTransformDirty(*dirtyBits,
id)) {
118 _geomTransform = sceneDelegate->GetTransform(
id);
121 if (HdChangeTracker::IsTransformDirty(*dirtyBits,
id) ||
122 HdChangeTracker::IsInstancerDirty(*dirtyBits,
id)) {
124 sceneDelegate->GetRenderIndex().GetInstancer(Base::GetInstancerId()));
127 assert(_instances[0]->attributes.size() >= 1 &&
128 _instances[0]->attributes.front().name() == HdAovTokens->instanceId.GetString());
130 VtMatrix4dArray transforms;
132 transforms = instancer->ComputeInstanceTransforms(
id);
133 _instances[0]->attributes.front() = ParamValue(HdAovTokens->instanceId.GetString(), +0.0f);
137 transforms.push_back(GfMatrix4d(1.0));
138 _instances[0]->attributes.front() = ParamValue(HdAovTokens->instanceId.GetString(), -1.0f);
141 const size_t oldSize = _instances.size();
142 const size_t newSize = transforms.size();
145 for (
size_t i = newSize; i < oldSize; ++i) {
146 lock.scene->delete_node(_instances[i]);
148 _instances.resize(newSize);
149 for (
size_t i = oldSize; i < newSize; ++i) {
150 _instances[i] =
lock.scene->create_node<
Object>();
151 InitializeInstance(
static_cast<int>(i));
155 for (
size_t i = 0; i < transforms.size(); ++i) {
156 const float metersPerUnit =
161 _instances[i]->set_tfm(tfm);
165 if (HdChangeTracker::IsVisibilityDirty(*dirtyBits,
id)) {
167 instance->set_visibility(Base::IsVisible() ? ~0 : 0);
173 bool rebuild =
false;
174 Populate(sceneDelegate, *dirtyBits, rebuild);
176 if (_geom->is_modified() || rebuild) {
177 _geom->tag_update(
lock.scene, rebuild);
184 *dirtyBits = HdChangeTracker::Clean;
187 template<
typename Base,
typename CyclesBase>
190 if (!_geom && _instances.empty()) {
195 const bool keep_nodes =
static_cast<const HdCyclesSession *
>(renderParam)->keep_nodes;
198 lock.scene->delete_node(_geom);
203 lock.scene->delete_nodes(set<Object *>(_instances.begin(), _instances.end()));
206 _instances.shrink_to_fit();
209 template<
typename Base,
typename CyclesBase>
219 _geom =
lock.scene->create_node<CyclesBase>();
220 _geom->name = Base::GetId().GetString();
223 _instances.push_back(
lock.scene->create_node<
Object>());
224 InitializeInstance(0);
227 template<
typename Base,
typename CyclesBase>
233 instance->attributes.emplace_back(HdAovTokens->instanceId.GetString(),
234 _instances.size() == 1 ? -1.0f :
static_cast<float>(index));
240 template<
typename Base,
typename CyclesBase>
242 HdSceneDelegate *sceneDelegate,
const TfToken &name)
const
244 for (
int i = 0; i < HdInterpolationCount; ++i) {
245 for (
const HdPrimvarDescriptor &desc :
246 Base::GetPrimvarDescriptors(sceneDelegate,
static_cast<HdInterpolation
>(i))) {
247 if (desc.name == name) {
248 return static_cast<HdInterpolation
>(i);
253 return HdInterpolationCount;
in reality light always falls off quadratically Particle Retrieve the data of the particle that spawned the object instance
static void Initialize(const btConvexTemplate &a, const btConvexTemplate &b, btGjkEpaSolver3::sResults &results, MinkowskiDiff< btConvexTemplate > &shape)
HdCyclesGeometry(const PXR_NS::SdfPath &rprimId, const PXR_NS::SdfPath &instancerId)
PXR_NS::HdDirtyBits _PropagateDirtyBits(PXR_NS::HdDirtyBits bits) const override
virtual void Finalize(PXR_NS::HdRenderParam *renderParam) override
void _InitRepr(const PXR_NS::TfToken &reprToken, PXR_NS::HdDirtyBits *dirtyBits) override
PXR_NS::HdInterpolation GetPrimvarInterpolation(PXR_NS::HdSceneDelegate *sceneDelegate, const PXR_NS::TfToken &name) const
PXR_NS::HdDirtyBits GetInitialDirtyBitsMask() const override
void Sync(PXR_NS::HdSceneDelegate *sceneDelegate, PXR_NS::HdRenderParam *renderParam, PXR_NS::HdDirtyBits *dirtyBits, const PXR_NS::TfToken &reprToken) override
HDCYCLES_NAMESPACE_OPEN_SCOPE Transform convert_transform(const GfMatrix4d &matrix)
static uint hash_string(const char *str)
ccl_device_inline uint hash_uint2(uint kx, uint ky)
#define HDCYCLES_NAMESPACE_CLOSE_SCOPE