Blender V5.0
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 if (Mesh *mesh = geometry.get_mesh_for_write()) {
60 mesh->attributes_for_write().remove_anonymous();
61 mesh->runtime->bake_materials = materials_to_weak_references(
62 &mesh->mat, &mesh->totcol, data_block_map);
63 }
64 if (Curves *curves = geometry.get_curves_for_write()) {
65 curves->geometry.wrap().attributes_for_write().remove_anonymous();
66 curves->geometry.runtime->bake_materials = materials_to_weak_references(
67 &curves->mat, &curves->totcol, data_block_map);
68 }
69 if (GreasePencil *grease_pencil = geometry.get_grease_pencil_for_write()) {
70 for (GreasePencilDrawingBase *base : grease_pencil->drawings()) {
71 if (base->type != GP_DRAWING) {
72 continue;
73 }
74 greasepencil::Drawing &drawing = reinterpret_cast<GreasePencilDrawing *>(base)->wrap();
76 }
77 grease_pencil->attributes_for_write().remove_anonymous();
78 grease_pencil->runtime->bake_materials = materials_to_weak_references(
79 &grease_pencil->material_array, &grease_pencil->material_array_num, data_block_map);
80 }
81 if (PointCloud *pointcloud = geometry.get_pointcloud_for_write()) {
82 pointcloud->attributes_for_write().remove_anonymous();
83 pointcloud->runtime->bake_materials = materials_to_weak_references(
84 &pointcloud->mat, &pointcloud->totcol, data_block_map);
85 }
86 if (Volume *volume = geometry.get_volume_for_write()) {
87 volume->runtime->bake_materials = materials_to_weak_references(
88 &volume->mat, &volume->totcol, data_block_map);
89 }
90 if (bke::Instances *instances = geometry.get_instances_for_write()) {
91 instances->attributes_for_write().remove_anonymous();
92 instances->ensure_geometry_instances();
93 for (bke::InstanceReference &reference : instances->references_for_write()) {
94 if (reference.type() == bke::InstanceReference::Type::GeometrySet) {
95 prepare_geometry_for_bake_recursive(reference.geometry_set(), data_block_map);
96 }
97 else {
98 /* Can only bake geometry instances currently. */
99 reference = bke::InstanceReference();
100 }
101 }
102 }
103}
104
106 BakeDataBlockMap *data_block_map)
107{
108 main_geometry.ensure_owns_all_data();
109 prepare_geometry_for_bake_recursive(main_geometry, data_block_map);
110}
111
112static void restore_materials(Material ***materials,
113 short *materials_num,
114 std::unique_ptr<BakeMaterialsList> materials_list,
115 BakeDataBlockMap *data_block_map)
116{
117 if (!materials_list) {
118 return;
119 }
120 BLI_assert(*materials == nullptr);
121 *materials_num = materials_list->size();
122 *materials = MEM_calloc_arrayN<Material *>(materials_list->size(), __func__);
123 if (!data_block_map) {
124 return;
125 }
126
127 for (const int i : materials_list->index_range()) {
128 const std::optional<BakeDataBlockID> &data_block_id = (*materials_list)[i];
129 if (data_block_id) {
130 (*materials)[i] = reinterpret_cast<Material *>(
131 data_block_map->lookup_or_remember_missing(*data_block_id));
132 }
133 }
134}
135
137{
138 if (Mesh *mesh = geometry.get_mesh_for_write()) {
140 &mesh->mat, &mesh->totcol, std::move(mesh->runtime->bake_materials), data_block_map);
141 }
142 if (Curves *curves = geometry.get_curves_for_write()) {
144 &curves->totcol,
145 std::move(curves->geometry.runtime->bake_materials),
146 data_block_map);
147 }
148 if (GreasePencil *grease_pencil = geometry.get_grease_pencil_for_write()) {
149 restore_materials(&grease_pencil->material_array,
150 &grease_pencil->material_array_num,
151 std::move(grease_pencil->runtime->bake_materials),
152 data_block_map);
153 }
154 if (PointCloud *pointcloud = geometry.get_pointcloud_for_write()) {
155 restore_materials(&pointcloud->mat,
156 &pointcloud->totcol,
157 std::move(pointcloud->runtime->bake_materials),
158 data_block_map);
159 }
160 if (Volume *volume = geometry.get_volume_for_write()) {
162 &volume->mat, &volume->totcol, std::move(volume->runtime->bake_materials), data_block_map);
163 }
164 if (bke::Instances *instances = geometry.get_instances_for_write()) {
165 for (bke::InstanceReference &reference : instances->references_for_write()) {
166 if (reference.type() == bke::InstanceReference::Type::GeometrySet) {
167 restore_data_blocks_recursive(reference.geometry_set(), data_block_map);
168 }
169 }
170 }
171}
172
174 BakeDataBlockMap *data_block_map)
175{
176 restore_data_blocks_recursive(main_geometry, data_block_map);
177}
178
179#ifdef WITH_OPENVDB
180VolumeGridBakeItem::VolumeGridBakeItem(std::unique_ptr<GVolumeGrid> grid) : grid(std::move(grid))
181{
182}
183
184VolumeGridBakeItem::~VolumeGridBakeItem() = default;
185
186void VolumeGridBakeItem::count_memory(MemoryCounter &memory) const
187{
188 if (grid && *grid) {
189 grid->get().count_memory(memory);
190 }
191}
192
193#endif
194
196{
197 value_ = MEM_mallocN_aligned(type.size, type.alignment, __func__);
198 type.copy_construct(value, value_);
199}
200
202{
203 type_.destruct(value_);
204 MEM_freeN(value_);
205}
206
207StringBakeItem::StringBakeItem(std::string value) : value_(std::move(value)) {}
208
210{
211 memory.add(value_.size());
212}
213
215{
216 this->items_by_id.reserve(bake_state.items_by_id.size());
217 for (auto item : bake_state.items_by_id.items()) {
218 this->items_by_id.add_new(item.key, item.value.get());
219 }
220}
221
223{
224 for (const std::unique_ptr<BakeItem> &item : items_by_id.values()) {
225 if (item) {
226 item->count_memory(memory);
227 }
228 }
229}
230
231void BakeItem::count_memory(MemoryCounter & /*memory*/) const {}
232
233} // 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
#define MEM_SAFE_FREE(v)
MutableAttributeAccessor attributes_for_write()
virtual void count_memory(MemoryCounter &memory) const
static void prepare_geometry_for_bake(GeometrySet &geometry, BakeDataBlockMap *data_block_map)
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()
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
static void restore_data_blocks_recursive(GeometrySet &geometry, BakeDataBlockMap *data_block_map)
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)
static void prepare_geometry_for_bake_recursive(GeometrySet &geometry, BakeDataBlockMap *data_block_map)
Definition bake_items.cc:56
float wrap(float value, float max, float min)
Definition node_math.h:103
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