Blender V4.3
io/usd/hydra/volume.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2011-2022 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
5#include <pxr/imaging/hd/bprim.h>
6#include <pxr/imaging/hd/tokens.h>
7#include <pxr/imaging/hd/volumeFieldSchema.h>
8#include <pxr/usd/usdHydra/tokens.h>
9#include <pxr/usd/usdVol/tokens.h>
10#include <pxr/usdImaging/usdVolImaging/tokens.h>
11
12#include "BKE_material.h"
13#include "BKE_volume.hh"
14#include "BLI_index_range.hh"
15#include "DNA_volume_types.h"
16
18#include "volume.hh"
19
20namespace blender::io::hydra {
21
23 const Object *object,
24 pxr::SdfPath const &prim_id)
25 : ObjectData(scene_delegate, object, prim_id)
26{
27}
28
30{
31 field_descriptors_.clear();
32
33 Volume *volume = (Volume *)((const Object *)this->id)->data;
34 if (!BKE_volume_load(volume, scene_delegate_->bmain)) {
35 return;
36 }
38 ID_LOGN(1, "%s", filepath_.c_str());
39
40 if (volume->runtime->grids) {
41 const int num_grids = BKE_volume_num_grids(volume);
42 if (num_grids) {
43 for (const int i : IndexRange(num_grids)) {
44 const bke::VolumeGridData *grid = BKE_volume_grid_get(volume, i);
45 const std::string grid_name = bke::volume_grid::get_name(*grid);
46
47 field_descriptors_.emplace_back(pxr::TfToken(grid_name),
48 pxr::UsdVolImagingTokens->openvdbAsset,
49 prim_id.AppendElementString("VF_" + grid_name));
50 }
51 }
52 }
55
56 BKE_volume_unload(volume);
57}
58
60{
61 scene_delegate_->GetRenderIndex().InsertRprim(
62 pxr::HdPrimTypeTokens->volume, scene_delegate_, prim_id);
63
64 ID_LOGN(1, "");
65
66 for (auto &desc : field_descriptors_) {
67 scene_delegate_->GetRenderIndex().InsertBprim(
68 desc.fieldPrimType, scene_delegate_, desc.fieldId);
69 ID_LOGN(2, "Volume field %s", desc.fieldId.GetText());
70 }
71}
72
74{
75 for (auto &desc : field_descriptors_) {
76 ID_LOG(2, "%s", desc.fieldId.GetText());
77 scene_delegate_->GetRenderIndex().RemoveBprim(desc.fieldPrimType, desc.fieldId);
78 }
79 ID_LOG(1, "");
80 scene_delegate_->GetRenderIndex().RemoveRprim(prim_id);
81}
82
84{
85 const Object *object = (const Object *)id;
86 pxr::HdDirtyBits bits = pxr::HdChangeTracker::Clean;
87 if ((id->recalc & ID_RECALC_GEOMETRY) || (((ID *)object->data)->recalc & ID_RECALC_GEOMETRY)) {
88 init();
89 bits = pxr::HdChangeTracker::AllDirty;
90 }
91 if (id->recalc & ID_RECALC_SHADING) {
93 bits |= pxr::HdChangeTracker::DirtyMaterialId | pxr::HdChangeTracker::DirtyDoubleSided;
94 }
95 if (id->recalc & ID_RECALC_TRANSFORM) {
97 bits |= pxr::HdChangeTracker::DirtyTransform;
98 }
99
100 if (bits == pxr::HdChangeTracker::Clean) {
101 return;
102 }
103
104 scene_delegate_->GetRenderIndex().GetChangeTracker().MarkRprimDirty(prim_id, bits);
105 ID_LOGN(1, "");
106}
107
108pxr::VtValue VolumeData::get_data(pxr::TfToken const &key) const
109{
110 if (key == pxr::HdVolumeFieldSchemaTokens->filePath) {
111 return pxr::VtValue(pxr::SdfAssetPath(filepath_, filepath_));
112 }
113 if (key == pxr::HdVolumeFieldSchemaTokens->fieldIndex) {
114 return pxr::VtValue(0);
115 }
116 if (key == pxr::UsdHydraTokens->textureMemory) {
117 return pxr::VtValue(0.0f);
118 }
119 return pxr::VtValue();
120}
121
122pxr::VtValue VolumeData::get_data(pxr::SdfPath const &id, pxr::TfToken const &key) const
123{
124 if (key == pxr::HdVolumeFieldSchemaTokens->fieldName) {
125 std::string name = id.GetName();
126 return pxr::VtValue(pxr::TfToken(name.substr(name.find("VF_") + 3)));
127 }
128
129 return get_data(key);
130}
131
132pxr::SdfPath VolumeData::material_id() const
133{
134 if (!mat_data_) {
135 return pxr::SdfPath();
136 }
137 return mat_data_->prim_id;
138}
139
141{
142 if (mat_data_ && !mat_data_->prim_id.IsEmpty()) {
143 paths.add(mat_data_->prim_id);
144 }
145}
146
147pxr::HdVolumeFieldDescriptorVector VolumeData::field_descriptors() const
148{
149 return field_descriptors_;
150}
151
153{
154 const Object *object = (Object *)id;
155 const Material *mat = nullptr;
156 /* TODO: Using only first material. Add support for multi-material. */
157 if (BKE_object_material_count_eval(object) > 0) {
158 mat = BKE_object_material_get_eval(const_cast<Object *>(object), 0);
159 }
161}
162
163} // namespace blender::io::hydra
General operations, lookup, etc. for materials.
int BKE_object_material_count_eval(const struct Object *ob)
struct Material * BKE_object_material_get_eval(struct Object *ob, short act)
Volume data-block.
int BKE_volume_num_grids(const Volume *volume)
bool BKE_volume_load(const Volume *volume, const Main *bmain)
const char * BKE_volume_grids_frame_filepath(const Volume *volume)
const blender::bke::VolumeGridData * BKE_volume_grid_get(const Volume *volume, int grid_index)
void BKE_volume_unload(Volume *volume)
@ ID_RECALC_TRANSFORM
Definition DNA_ID.h:1021
@ ID_RECALC_SHADING
Definition DNA_ID.h:1061
@ ID_RECALC_GEOMETRY
Definition DNA_ID.h:1041
pxr::SdfPath prim_id
Definition id.hh:36
HydraSceneDelegate * scene_delegate_
Definition id.hh:39
MaterialData * get_or_create_material(const Material *mat)
pxr::SdfPath material_id() const override
pxr::HdVolumeFieldDescriptorVector field_descriptors_
Definition volume.hh:16
void available_materials(Set< pxr::SdfPath > &paths) const override
pxr::HdVolumeFieldDescriptorVector field_descriptors() const
pxr::VtValue get_data(pxr::TfToken const &key) const override
VolumeData(HydraSceneDelegate *scene_delegate, const Object *object, pxr::SdfPath const &prim_id)
#define ID_LOG(level, msg,...)
Definition id.hh:53
#define ID_LOGN(level, msg,...)
Definition id.hh:56
std::string get_name(const VolumeGridData &grid)
Definition DNA_ID.h:413