Blender V5.0
volume_modifier.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 "volume_modifier.hh"
6
7#include <pxr/usdImaging/usdVolImaging/tokens.h>
8
9#include "DNA_scene_types.h"
10
11#include "BLI_path_utils.hh"
12#include "BLI_string_utf8.h"
13
14#include "BKE_mesh.h"
15#include "BKE_modifier.hh"
16
18
19namespace blender::io::hydra {
20
22 const Object *object,
23 pxr::SdfPath const &prim_id)
24 : VolumeData(scene_delegate, object, prim_id)
25{
26}
27
29{
30 if (object->type != OB_MESH) {
31 return false;
32 }
33
35 object, eModifierType_Fluid);
36 return modifier && modifier->type & MOD_FLUID_TYPE_DOMAIN &&
37 modifier->domain->type == FLUID_DOMAIN_TYPE_GAS;
38}
39
41{
42 field_descriptors_.clear();
43
44 const Object *object = (const Object *)this->id;
47 scene_delegate_->depsgraph, const_cast<Object *>(object), const_cast<ModifierData *>(md));
48
49 if ((modifier_->domain->cache_data_format & FLUID_DOMAIN_FILE_OPENVDB) == 0) {
51 "Volume %s is't exported: only OpenVDB file format supported",
52 prim_id.GetText());
53 return;
54 }
55
56 filepath_ = get_cached_file_path(modifier_->domain->cache_directory,
57 scene_delegate_->scene->r.cfra);
58 ID_LOG("%s", filepath_.c_str());
59
60 static const pxr::TfToken grid_tokens[] = {pxr::TfToken("density", pxr::TfToken::Immortal),
61 pxr::TfToken("flame", pxr::TfToken::Immortal),
62 pxr::TfToken("shadow", pxr::TfToken::Immortal),
63 pxr::TfToken("temperature", pxr::TfToken::Immortal),
64 pxr::TfToken("velocity", pxr::TfToken::Immortal)};
65
66 for (const auto &grid_name : grid_tokens) {
67 field_descriptors_.emplace_back(grid_name,
68 pxr::UsdVolImagingTokens->openvdbAsset,
69 prim_id.AppendElementString("VF_" + grid_name.GetString()));
70 }
71
74}
75
77{
78 Object *object = (Object *)id;
79 if ((id->recalc & ID_RECALC_GEOMETRY) || (((ID *)object->data)->recalc & ID_RECALC_GEOMETRY)) {
80 remove();
81 init();
82 insert();
83 return;
84 }
85 pxr::HdDirtyBits bits = pxr::HdChangeTracker::Clean;
86 if (id->recalc & ID_RECALC_SHADING) {
88 bits |= pxr::HdChangeTracker::DirtyMaterialId | pxr::HdChangeTracker::DirtyDoubleSided;
89 }
90 if (id->recalc & ID_RECALC_TRANSFORM) {
92 bits |= pxr::HdChangeTracker::DirtyTransform;
93 }
94
95 if (bits == pxr::HdChangeTracker::Clean) {
96 return;
97 }
98
99 scene_delegate_->GetRenderIndex().GetChangeTracker().MarkRprimDirty(prim_id, bits);
100 ID_LOG("");
101}
102
104{
105 Object *object = (Object *)this->id;
106
107 /* set base scaling */
108 transform = pxr::GfMatrix4d().SetScale(
109 pxr::GfVec3d(modifier_->domain->scale / modifier_->domain->global_size[0],
110 modifier_->domain->scale / modifier_->domain->global_size[1],
111 modifier_->domain->scale / modifier_->domain->global_size[2]));
112 /* positioning to center */
113 transform *= pxr::GfMatrix4d().SetTranslate(pxr::GfVec3d(-1, -1, -1));
114
115 /* including texspace transform */
116 float texspace_loc[3] = {0.0f, 0.0f, 0.0f}, texspace_scale[3] = {1.0f, 1.0f, 1.0f};
117 BKE_mesh_texspace_get((Mesh *)object->data, texspace_loc, texspace_scale);
118 transform *= pxr::GfMatrix4d(1.0f).SetScale(pxr::GfVec3d(texspace_scale)) *
119 pxr::GfMatrix4d(1.0f).SetTranslate(pxr::GfVec3d(texspace_loc));
120
121 /* applying object transform */
122 transform *= gf_matrix_from_transform(object->object_to_world().ptr());
123}
124
125std::string VolumeModifierData::get_cached_file_path(const std::string &directory, int frame)
126{
127 char file_path[FILE_MAX];
128 char file_name[32];
129 /* While a filename need not be UTF8, at this point the constructed name should be UTF8. */
131 BLI_path_frame(file_name, sizeof(file_name), frame, 0);
132 BLI_path_join(file_path, sizeof(file_path), directory.c_str(), FLUID_DOMAIN_DIR_DATA, file_name);
133
134 return file_path;
135}
136
137} // namespace blender::io::hydra
void BKE_mesh_texspace_get(Mesh *mesh, float r_texspace_location[3], float r_texspace_size[3])
ModifierData * BKE_modifiers_findby_type(const Object *ob, ModifierType type)
ModifierData * BKE_modifier_get_evaluated(Depsgraph *depsgraph, Object *object, ModifierData *md)
#define FILE_MAX
#define BLI_path_join(...)
bool BLI_path_frame(char *path, size_t path_maxncpy, int frame, int digits) ATTR_NONNULL(1)
#define SNPRINTF_UTF8(dst, format,...)
#define CLOG_WARN(clg_ref,...)
Definition CLG_log.h:189
@ ID_RECALC_TRANSFORM
Definition DNA_ID.h:1054
@ ID_RECALC_SHADING
Definition DNA_ID.h:1094
@ ID_RECALC_GEOMETRY
Definition DNA_ID.h:1074
#define FLUID_DOMAIN_DIR_DATA
#define FLUID_NAME_DATA
#define FLUID_DOMAIN_EXTENSION_OPENVDB
@ FLUID_DOMAIN_TYPE_GAS
@ FLUID_DOMAIN_FILE_OPENVDB
@ MOD_FLUID_TYPE_DOMAIN
@ eModifierType_Fluid
@ OB_MESH
pxr::SdfPath prim_id
Definition id.hh:36
HydraSceneDelegate * scene_delegate_
Definition id.hh:39
pxr::GfMatrix4d transform
Definition object.hh:24
pxr::HdVolumeFieldDescriptorVector field_descriptors_
Definition volume.hh:16
VolumeData(HydraSceneDelegate *scene_delegate, const Object *object, pxr::SdfPath const &prim_id)
VolumeModifierData(HydraSceneDelegate *scene_delegate, const Object *object, pxr::SdfPath const &prim_id)
static bool is_volume_modifier(const Object *object)
#define ID_LOG(msg,...)
Definition id.hh:53
struct CLG_LogRef * LOG_HYDRA_SCENE
pxr::GfMatrix4d gf_matrix_from_transform(const float m[4][4])
Definition DNA_ID.h:414