Blender V4.5
bake_items.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2023 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
5#include "BKE_bake_items.hh"
6#include "BKE_curves.hh"
8#include "BKE_instances.hh"
9#include "BKE_mesh.hh"
10#include "BKE_pointcloud.hh"
11#include "BKE_volume.hh"
12#include "BKE_volume_grid.hh"
13
14#include "BLI_memory_counter.hh"
15#include "BLI_serialize.hh"
16
17#include "DNA_material_types.h"
18#include "DNA_volume_types.h"
19
20namespace blender::bke::bake {
21
22using namespace io::serialize;
23using DictionaryValuePtr = std::shared_ptr<DictionaryValue>;
24
26
28{
29 this->geometry.count_memory(memory);
30}
31
32static std::unique_ptr<BakeMaterialsList> materials_to_weak_references(
33 Material ***materials, short *materials_num, BakeDataBlockMap *data_block_map)
34{
35 if (*materials_num == 0) {
36 return {};
37 }
38 auto materials_list = std::make_unique<BakeMaterialsList>();
39 materials_list->resize(*materials_num);
40 for (const int i : materials_list->index_range()) {
41 Material *material = (*materials)[i];
42 if (material) {
43 (*materials_list)[i] = BakeDataBlockID(material->id);
44 if (data_block_map) {
45 data_block_map->try_add(material->id);
46 }
47 }
48 }
49
50 MEM_SAFE_FREE(*materials);
51 *materials_num = 0;
52
53 return materials_list;
54}
55
57 BakeDataBlockMap *data_block_map)
58{
59 main_geometry.ensure_owns_all_data();
60 main_geometry.modify_geometry_sets([&](GeometrySet &geometry) {
61 if (Mesh *mesh = geometry.get_mesh_for_write()) {
62 mesh->attributes_for_write().remove_anonymous();
63 mesh->runtime->bake_materials = materials_to_weak_references(
64 &mesh->mat, &mesh->totcol, data_block_map);
65 }
66 if (Curves *curves = geometry.get_curves_for_write()) {
67 curves->geometry.wrap().attributes_for_write().remove_anonymous();
68 curves->geometry.runtime->bake_materials = materials_to_weak_references(
69 &curves->mat, &curves->totcol, data_block_map);
70 }
71 if (GreasePencil *grease_pencil = geometry.get_grease_pencil_for_write()) {
72 for (GreasePencilDrawingBase *base : grease_pencil->drawings()) {
73 if (base->type != GP_DRAWING) {
74 continue;
75 }
76 greasepencil::Drawing &drawing = reinterpret_cast<GreasePencilDrawing *>(base)->wrap();
78 }
79 grease_pencil->attributes_for_write().remove_anonymous();
80 grease_pencil->runtime->bake_materials = materials_to_weak_references(
81 &grease_pencil->material_array, &grease_pencil->material_array_num, data_block_map);
82 }
83 if (PointCloud *pointcloud = geometry.get_pointcloud_for_write()) {
84 pointcloud->attributes_for_write().remove_anonymous();
85 pointcloud->runtime->bake_materials = materials_to_weak_references(
86 &pointcloud->mat, &pointcloud->totcol, data_block_map);
87 }
88 if (Volume *volume = geometry.get_volume_for_write()) {
89 volume->runtime->bake_materials = materials_to_weak_references(
90 &volume->mat, &volume->totcol, data_block_map);
91 }
92 if (bke::Instances *instances = geometry.get_instances_for_write()) {
93 instances->attributes_for_write().remove_anonymous();
94 }
95 geometry.keep_only_during_modify({GeometryComponent::Type::Mesh,
101 });
102}
103
104static void restore_materials(Material ***materials,
105 short *materials_num,
106 std::unique_ptr<BakeMaterialsList> materials_list,
107 BakeDataBlockMap *data_block_map)
108{
109 if (!materials_list) {
110 return;
111 }
112 BLI_assert(*materials == nullptr);
113 *materials_num = materials_list->size();
114 *materials = MEM_calloc_arrayN<Material *>(materials_list->size(), __func__);
115 if (!data_block_map) {
116 return;
117 }
118
119 for (const int i : materials_list->index_range()) {
120 const std::optional<BakeDataBlockID> &data_block_id = (*materials_list)[i];
121 if (data_block_id) {
122 (*materials)[i] = reinterpret_cast<Material *>(
123 data_block_map->lookup_or_remember_missing(*data_block_id));
124 }
125 }
126}
127
129 BakeDataBlockMap *data_block_map)
130{
131 main_geometry.modify_geometry_sets([&](GeometrySet &geometry) {
132 if (Mesh *mesh = geometry.get_mesh_for_write()) {
134 &mesh->mat, &mesh->totcol, std::move(mesh->runtime->bake_materials), data_block_map);
135 }
136 if (Curves *curves = geometry.get_curves_for_write()) {
138 &curves->totcol,
139 std::move(curves->geometry.runtime->bake_materials),
140 data_block_map);
141 }
142 if (GreasePencil *grease_pencil = geometry.get_grease_pencil_for_write()) {
143 restore_materials(&grease_pencil->material_array,
144 &grease_pencil->material_array_num,
145 std::move(grease_pencil->runtime->bake_materials),
146 data_block_map);
147 }
148 if (PointCloud *pointcloud = geometry.get_pointcloud_for_write()) {
149 restore_materials(&pointcloud->mat,
150 &pointcloud->totcol,
151 std::move(pointcloud->runtime->bake_materials),
152 data_block_map);
153 }
154 if (Volume *volume = geometry.get_volume_for_write()) {
155 restore_materials(&volume->mat,
156 &volume->totcol,
157 std::move(volume->runtime->bake_materials),
158 data_block_map);
159 }
160 });
161}
162
163#ifdef WITH_OPENVDB
164VolumeGridBakeItem::VolumeGridBakeItem(std::unique_ptr<GVolumeGrid> grid) : grid(std::move(grid))
165{
166}
167
168VolumeGridBakeItem::~VolumeGridBakeItem() = default;
169
170void VolumeGridBakeItem::count_memory(MemoryCounter &memory) const
171{
172 if (grid && *grid) {
173 grid->get().count_memory(memory);
174 }
175}
176
177#endif
178
180{
181 value_ = MEM_mallocN_aligned(type.size, type.alignment, __func__);
182 type.copy_construct(value, value_);
183}
184
186{
187 type_.destruct(value_);
188 MEM_freeN(value_);
189}
190
191StringBakeItem::StringBakeItem(std::string value) : value_(std::move(value)) {}
192
194{
195 memory.add(value_.size());
196}
197
199{
200 this->items_by_id.reserve(bake_state.items_by_id.size());
201 for (auto item : bake_state.items_by_id.items()) {
202 this->items_by_id.add_new(item.key, item.value.get());
203 }
204}
205
207{
208 for (const std::unique_ptr<BakeItem> &item : items_by_id.values()) {
209 if (item) {
210 item->count_memory(memory);
211 }
212 }
213}
214
215void BakeItem::count_memory(MemoryCounter & /*memory*/) const {}
216
217} // namespace blender::bke::bake
Low-level operations for curves.
Low-level operations for grease pencil.
General operations for point clouds.
Volume data-block.
#define BLI_assert(a)
Definition BLI_assert.h:46
MutableAttributeAccessor attributes_for_write()
virtual void count_memory(MemoryCounter &memory) const
static void prepare_geometry_for_bake(GeometrySet &geometry, BakeDataBlockMap *data_block_map)
Definition bake_items.cc:56
GeometryBakeItem(GeometrySet geometry)
Definition bake_items.cc:25
void count_memory(MemoryCounter &memory) const override
Definition bake_items.cc:27
static void try_restore_data_blocks(GeometrySet &geometry, BakeDataBlockMap *data_block_map)
PrimitiveBakeItem(const CPPType &type, const void *value)
void count_memory(MemoryCounter &memory) const override
bke::CurvesGeometry & strokes_for_write()
#define MEM_SAFE_FREE(v)
void * MEM_calloc_arrayN(size_t len, size_t size, const char *str)
Definition mallocn.cc:123
void * MEM_mallocN_aligned(size_t len, size_t alignment, const char *str)
Definition mallocn.cc:138
void MEM_freeN(void *vmemh)
Definition mallocn.cc:113
std::shared_ptr< DictionaryValue > DictionaryValuePtr
Definition bake_items.cc:23
static std::unique_ptr< BakeMaterialsList > materials_to_weak_references(Material ***materials, short *materials_num, BakeDataBlockMap *data_block_map)
Definition bake_items.cc:32
static void restore_materials(Material ***materials, short *materials_num, std::unique_ptr< BakeMaterialsList > materials_list, BakeDataBlockMap *data_block_map)
float wrap(float value, float max, float min)
Definition node_math.h:71
void modify_geometry_sets(ForeachSubGeometryCallback callback)
virtual void try_add(ID &id)=0
virtual ID * lookup_or_remember_missing(const BakeDataBlockID &key)=0
Map< int, const BakeItem * > items_by_id
Map< int, std::unique_ptr< BakeItem > > items_by_id
void count_memory(MemoryCounter &memory) const
i
Definition text_draw.cc:230