Blender V4.3
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#include "DNA_volume_types.h"
11
12#include "BLI_path_utils.hh"
13#include "BLI_string.h"
14
15#include "BKE_mesh.h"
16#include "BKE_modifier.hh"
17
19
20namespace blender::io::hydra {
21
23 const Object *object,
24 pxr::SdfPath const &prim_id)
25 : VolumeData(scene_delegate, object, prim_id)
26{
27}
28
30{
31 if (object->type != OB_MESH) {
32 return false;
33 }
34
36 object, eModifierType_Fluid);
37 return modifier && modifier->type & MOD_FLUID_TYPE_DOMAIN &&
38 modifier->domain->type == FLUID_DOMAIN_TYPE_GAS;
39}
40
42{
43 field_descriptors_.clear();
44
45 const Object *object = (const Object *)this->id;
48 scene_delegate_->depsgraph, const_cast<Object *>(object), const_cast<ModifierData *>(md));
49
50 if ((modifier_->domain->cache_data_format & FLUID_DOMAIN_FILE_OPENVDB) == 0) {
52 "Volume %s is't exported: only OpenVDB file format supported",
53 prim_id.GetText());
54 return;
55 }
56
57 filepath_ = get_cached_file_path(modifier_->domain->cache_directory,
59 ID_LOG(1, "%s", filepath_.c_str());
60
61 static const pxr::TfToken grid_tokens[] = {pxr::TfToken("density", pxr::TfToken::Immortal),
62 pxr::TfToken("flame", pxr::TfToken::Immortal),
63 pxr::TfToken("shadow", pxr::TfToken::Immortal),
64 pxr::TfToken("temperature", pxr::TfToken::Immortal),
65 pxr::TfToken("velocity", pxr::TfToken::Immortal)};
66
67 for (const auto &grid_name : grid_tokens) {
68 field_descriptors_.emplace_back(grid_name,
69 pxr::UsdVolImagingTokens->openvdbAsset,
70 prim_id.AppendElementString("VF_" + grid_name.GetString()));
71 }
72
75}
76
78{
79 Object *object = (Object *)id;
80 if ((id->recalc & ID_RECALC_GEOMETRY) || (((ID *)object->data)->recalc & ID_RECALC_GEOMETRY)) {
81 remove();
82 init();
83 insert();
84 return;
85 }
86 pxr::HdDirtyBits bits = pxr::HdChangeTracker::Clean;
87 if (id->recalc & ID_RECALC_SHADING) {
89 bits |= pxr::HdChangeTracker::DirtyMaterialId | pxr::HdChangeTracker::DirtyDoubleSided;
90 }
91 if (id->recalc & ID_RECALC_TRANSFORM) {
93 bits |= pxr::HdChangeTracker::DirtyTransform;
94 }
95
96 if (bits == pxr::HdChangeTracker::Clean) {
97 return;
98 }
99
100 scene_delegate_->GetRenderIndex().GetChangeTracker().MarkRprimDirty(prim_id, bits);
101 ID_LOG(1, "");
102}
103
105{
106 Object *object = (Object *)this->id;
107
108 /* set base scaling */
109 transform = pxr::GfMatrix4d().SetScale(
110 pxr::GfVec3d(modifier_->domain->scale / modifier_->domain->global_size[0],
111 modifier_->domain->scale / modifier_->domain->global_size[1],
112 modifier_->domain->scale / modifier_->domain->global_size[2]));
113 /* positioning to center */
114 transform *= pxr::GfMatrix4d().SetTranslate(pxr::GfVec3d(-1, -1, -1));
115
116 /* including texspace transform */
117 float texspace_loc[3] = {0.0f, 0.0f, 0.0f}, texspace_scale[3] = {1.0f, 1.0f, 1.0f};
118 BKE_mesh_texspace_get((Mesh *)object->data, texspace_loc, texspace_scale);
119 transform *= pxr::GfMatrix4d(1.0f).SetScale(pxr::GfVec3d(texspace_scale)) *
120 pxr::GfMatrix4d(1.0f).SetTranslate(pxr::GfVec3d(texspace_loc));
121
122 /* applying object transform */
123 transform *= gf_matrix_from_transform(object->object_to_world().ptr());
124}
125
126std::string VolumeModifierData::get_cached_file_path(const std::string &directory, int frame)
127{
128 char file_path[FILE_MAX];
129 char file_name[32];
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(dst, format,...)
Definition BLI_string.h:597
#define CLOG_WARN(clg_ref,...)
Definition CLG_log.h:181
@ ID_RECALC_TRANSFORM
Definition DNA_ID.h:1021
@ ID_RECALC_SHADING
Definition DNA_ID.h:1061
@ ID_RECALC_GEOMETRY
Definition DNA_ID.h:1041
#define FLUID_DOMAIN_DIR_DATA
#define FLUID_NAME_DATA
@ FLUID_DOMAIN_TYPE_GAS
#define FLUID_DOMAIN_EXTENSION_OPENVDB
@ 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::HdVolumeFieldDescriptorVector field_descriptors_
Definition volume.hh:16
VolumeModifierData(HydraSceneDelegate *scene_delegate, const Object *object, pxr::SdfPath const &prim_id)
static bool is_volume_modifier(const Object *object)
#define ID_LOG(level, msg,...)
Definition id.hh:53
struct CLG_LogRef * LOG_HYDRA_SCENE
pxr::GfMatrix4d gf_matrix_from_transform(const float m[4][4])
struct FluidDomainSettings * domain
Definition DNA_ID.h:413
struct RenderData r