Reference identifiers instead of "above" in code comments as these tends to become outdated. Even when declarations are removed it's at least clear that the reference no longer exists instead of referring to whatever is currently above the declaration. It's also straightforward to search history for a removed identifier. Corrected 4 cases of references to things that were no longer above the doc-strings. Noticed other references which look to be incorrect but need further investigation.
131 lines
3.2 KiB
C++
131 lines
3.2 KiB
C++
/* SPDX-FileCopyrightText: 2023 Blender Authors
|
|
*
|
|
* SPDX-License-Identifier: GPL-2.0-or-later */
|
|
|
|
#pragma once
|
|
|
|
#include "BKE_bake_data_block_map.hh"
|
|
#include "BKE_geometry_set.hh"
|
|
#include "BKE_volume_grid_fwd.hh"
|
|
|
|
namespace blender::bke::bake {
|
|
|
|
/**
|
|
* A "bake item" contains the baked data of e.g. one node socket at one frame. Typically, multiple
|
|
* bake items form the entire baked state for one frame.
|
|
*
|
|
* Bake items can be serialized. Also see `BKE_bake_items_serialize.hh`.
|
|
*/
|
|
class BakeItem {
|
|
public:
|
|
/**
|
|
* User-defined name. This is not necessarily unique and might change over time. It's purpose is
|
|
* to make bakes more inspectable.
|
|
*/
|
|
std::string name;
|
|
|
|
virtual ~BakeItem() = default;
|
|
};
|
|
|
|
struct BakeState {
|
|
/**
|
|
* The ids are usually correspond to socket ids, so that the mapping stays intact even if socket
|
|
* order changes.
|
|
*/
|
|
Map<int, std::unique_ptr<BakeItem>> items_by_id;
|
|
};
|
|
|
|
/** Same as #BakeState, but does not own the bake items. */
|
|
struct BakeStateRef {
|
|
Map<int, const BakeItem *> items_by_id;
|
|
|
|
BakeStateRef() = default;
|
|
BakeStateRef(const BakeState &bake_state);
|
|
};
|
|
|
|
class GeometryBakeItem : public BakeItem {
|
|
public:
|
|
GeometrySet geometry;
|
|
|
|
GeometryBakeItem(GeometrySet geometry);
|
|
|
|
/**
|
|
* Removes parts of the geometry that can't be baked/cached (anonymous attributes) and replaces
|
|
* data-block pointers with #BakeDataBlockID.
|
|
*/
|
|
static void prepare_geometry_for_bake(GeometrySet &geometry, BakeDataBlockMap *data_block_map);
|
|
|
|
/**
|
|
* The baked data does not have raw pointers to referenced data-blocks because those would become
|
|
* dangling quickly. Instead it has weak name-based references (#BakeDataBlockID). This function
|
|
* attempts to restore the actual data block pointers based on the weak references using the
|
|
* given mapping.
|
|
*/
|
|
static void try_restore_data_blocks(GeometrySet &geometry, BakeDataBlockMap *data_block_map);
|
|
};
|
|
|
|
/**
|
|
* References a field input/output that becomes an attribute as part of the simulation state.
|
|
* The attribute is actually stored in a #GeometryBakeItem, so this just references
|
|
* the attribute's name.
|
|
*/
|
|
class AttributeBakeItem : public BakeItem {
|
|
private:
|
|
std::string name_;
|
|
|
|
public:
|
|
AttributeBakeItem(std::string name) : name_(std::move(name)) {}
|
|
|
|
StringRefNull name() const
|
|
{
|
|
return name_;
|
|
}
|
|
};
|
|
|
|
#ifdef WITH_OPENVDB
|
|
class VolumeGridBakeItem : public BakeItem {
|
|
public:
|
|
/** Using #unique_ptr so that `BKE_volume_grid_fwd.hh` can be used. */
|
|
std::unique_ptr<GVolumeGrid> grid;
|
|
|
|
VolumeGridBakeItem(std::unique_ptr<GVolumeGrid> grid);
|
|
~VolumeGridBakeItem();
|
|
};
|
|
#endif
|
|
|
|
/** Storage for a single value of a trivial type like `float`, `int`, etc. */
|
|
class PrimitiveBakeItem : public BakeItem {
|
|
private:
|
|
const CPPType &type_;
|
|
void *value_;
|
|
|
|
public:
|
|
PrimitiveBakeItem(const CPPType &type, const void *value);
|
|
~PrimitiveBakeItem();
|
|
|
|
const void *value() const
|
|
{
|
|
return value_;
|
|
}
|
|
|
|
const CPPType &type() const
|
|
{
|
|
return type_;
|
|
}
|
|
};
|
|
|
|
class StringBakeItem : public BakeItem {
|
|
private:
|
|
std::string value_;
|
|
|
|
public:
|
|
StringBakeItem(std::string value);
|
|
|
|
StringRefNull value() const
|
|
{
|
|
return value_;
|
|
}
|
|
};
|
|
|
|
} // namespace blender::bke::bake
|