Blender  V3.3
field.cpp
Go to the documentation of this file.
1 /* SPDX-License-Identifier: Apache-2.0
2  * Copyright 2022 NVIDIA Corporation
3  * Copyright 2022 Blender Foundation */
4 
5 #include "hydra/field.h"
6 #include "hydra/session.h"
7 #include "scene/image_vdb.h"
8 #include "scene/scene.h"
9 
10 #include <pxr/imaging/hd/sceneDelegate.h>
11 #include <pxr/usd/sdf/assetPath.h>
12 
14 
15 #if PXR_VERSION < 2108
16 // clang-format off
18  (fieldName)
19 );
20 // clang-format on
21 #endif
22 
23 #ifdef WITH_OPENVDB
24 class HdCyclesVolumeLoader : public VDBImageLoader {
25  public:
26  HdCyclesVolumeLoader(const std::string &filePath, const std::string &gridName)
27  : VDBImageLoader(gridName)
28  {
29  /* Disably delay loading and file copying, this has poor performance
30  * on network drivers. */
31  const bool delay_load = false;
32  openvdb::io::File file(filePath);
33  file.setCopyMaxBytes(0);
34  if (file.open(delay_load)) {
35  grid = file.readGrid(gridName);
36  }
37  }
38 };
39 #endif
40 
41 HdCyclesField::HdCyclesField(const SdfPath &bprimId, const TfToken &typeId) : HdField(bprimId)
42 {
43 }
44 
46 {
47 }
48 
50 {
51  return DirtyBits::DirtyParams;
52 }
53 
54 void HdCyclesField::Sync(HdSceneDelegate *sceneDelegate,
55  HdRenderParam *renderParam,
56  HdDirtyBits *dirtyBits)
57 {
58 #ifdef WITH_OPENVDB
59  VtValue value;
60  const SdfPath &id = GetId();
61 
62  if (*dirtyBits & DirtyBits::DirtyParams) {
63  value = sceneDelegate->Get(id, HdFieldTokens->filePath);
64  if (value.IsHolding<SdfAssetPath>()) {
65  std::string filename = value.UncheckedGet<SdfAssetPath>().GetResolvedPath();
66  if (filename.empty()) {
67  filename = value.UncheckedGet<SdfAssetPath>().GetAssetPath();
68  }
69 
70 # if PXR_VERSION >= 2108
71  value = sceneDelegate->Get(id, HdFieldTokens->fieldName);
72 # else
73  value = sceneDelegate->Get(id, _tokens->fieldName);
74 # endif
75  if (value.IsHolding<TfToken>()) {
76  ImageLoader *const loader = new HdCyclesVolumeLoader(
77  filename, value.UncheckedGet<TfToken>().GetString());
78 
79  const SceneLock lock(renderParam);
80 
82  params.frame = 0.0f;
83 
84  _handle = lock.scene->image_manager->add_image(loader, params, false);
85  }
86  }
87  }
88 #endif
89 
90  *dirtyBits = DirtyBits::Clean;
91 }
92 
volatile int lock
~HdCyclesField() override
Definition: field.cpp:45
void Sync(PXR_NS::HdSceneDelegate *sceneDelegate, PXR_NS::HdRenderParam *renderParam, PXR_NS::HdDirtyBits *dirtyBits) override
Definition: field.cpp:54
HdCyclesField(const PXR_NS::SdfPath &bprimId, const PXR_NS::TfToken &typeId)
Definition: field.cpp:41
PXR_NS::HdDirtyBits GetInitialDirtyBitsMask() const override
Definition: field.cpp:49
FILE * file
HDCYCLES_NAMESPACE_OPEN_SCOPE TF_DEFINE_PRIVATE_TOKENS(_tokens,(fieldName))
#define HDCYCLES_NAMESPACE_CLOSE_SCOPE
Definition: hydra/config.h:17
uiWidgetBaseParameters params[MAX_WIDGET_BASE_BATCH]