42 #define USE_ARRAY_STORE
44 #ifdef USE_ARRAY_STORE
54 # define ARRAY_CHUNK_SIZE 256
56 # define USE_ARRAY_STORE_THREAD
59 #ifdef USE_ARRAY_STORE_THREAD
70 #ifdef USE_ARRAY_STORE
103 #ifdef USE_ARRAY_STORE
115 #ifdef USE_ARRAY_STORE
131 # ifdef USE_ARRAY_STORE_THREAD
138 const size_t data_len,
151 for (
int layer_start = 0, layer_end; layer_start < cdata->
totlayer; layer_start = layer_end) {
171 layer_end = layer_start + 1;
172 while ((layer_end < cdata->totlayer) && (
type == cdata->
layers[layer_end].
type)) {
180 const int layer_len = layer_end - layer_start;
183 if (bcd_reference_current && (bcd_reference_current->
type ==
type)) {
187 bcd_reference_current =
NULL;
194 bcd_reference_current = bcd_iter;
197 bcd_iter = bcd_iter->
next;
210 bcd_prev->next = bcd;
220 for (
int i = 0; i < layer_len; i++, layer++) {
223 BArrayState *state_reference = (bcd_reference_current &&
225 bcd_reference_current->
states[i] :
228 if (layer_type_is_dynamic) {
229 state_reference =
NULL;
233 bs, layer->
data, (
size_t)data_len *
stride, state_reference);
247 if (bcd_reference_current) {
248 bcd_reference_current = bcd_reference_current->
next;
254 *r_bcd_first = bcd_first;
264 const size_t data_len)
329 for (
int i = 0; i < me->
key->
totkey; i++, keyblock = keyblock->
next) {
338 if (keyblock->
data) {
379 size_t size_expanded_prev, size_compacted_prev;
381 &
um_arraystore.bs_stride, &size_expanded_prev, &size_compacted_prev);
396 size_t size_expanded, size_compacted;
400 const double percent_total = size_expanded ?
401 (((
double)size_compacted / (
double)size_expanded) * 100.0) :
404 size_t size_expanded_step = size_expanded - size_expanded_prev;
405 size_t size_compacted_step = size_compacted - size_compacted_prev;
406 const double percent_step = size_expanded_step ?
407 (((
double)size_compacted_step / (
double)size_expanded_step) *
411 printf(
"overall memory use: %.8f%% of expanded size\n", percent_total);
412 printf(
"step memory use: %.8f%% of expanded size\n", percent_step);
417 # ifdef USE_ARRAY_STORE_THREAD
451 for (
int i = 0; i < me->
key->
totkey; i++, keyblock = keyblock->
next) {
485 for (
int i = 0; i < me->
key->
totkey; i++) {
507 printf(
"mesh undo store: freeing all data!\n");
511 # ifdef USE_ARRAY_STORE_THREAD
540 for (
int i = 0; i < object_len; i++) {
541 const Mesh *me =
object[i]->data;
544 int uuid_map_len = object_len;
550 while (um_iter && (uuid_map_len != 0)) {
560 if (uuid_map_len == object_len) {
562 um_references =
NULL;
564 return um_references;
579 #ifdef USE_ARRAY_STORE_THREAD
603 .calc_object_remap = false,
604 .update_shapekey_indices = false,
605 .cd_mask_extra = {.vmask = CD_MASK_SHAPE_KEYINDEX},
606 .active_shapekey_to_mvert =
true,
612 #ifdef USE_ARRAY_STORE
617 # ifdef USE_ARRAY_STORE_THREAD
643 #ifdef USE_ARRAY_STORE
644 # ifdef USE_ARRAY_STORE_THREAD
668 .use_toolflags =
true,
675 .calc_face_normal = false,
676 .calc_vert_normal = false,
677 .active_shapekey = um->shapenr,
699 #ifdef USE_ARRAY_STORE
708 #ifdef USE_ARRAY_STORE
710 # ifdef USE_ARRAY_STORE_THREAD
777 uint objects_len = 0;
785 #ifdef USE_ARRAY_STORE
789 for (
uint i = 0; i < objects_len; i++) {
802 #ifdef USE_ARRAY_STORE
809 if (um_references !=
NULL) {
838 "name='%s', failed to enter edit-mode for object '%s', undo state invalid",
890 ut->
name =
"Edit Mesh";
struct Scene * CTX_data_scene(const bContext *C)
struct ViewLayer * CTX_data_view_layer(const bContext *C)
struct ToolSettings * CTX_data_tool_settings(const bContext *C)
CustomData interface, see also DNA_customdata_types.h.
bool CustomData_layertype_is_dynamic(int type)
int CustomData_sizeof(int type)
void BKE_editmesh_looptri_and_normals_calc(BMEditMesh *em)
BMEditMesh * BKE_editmesh_create(BMesh *bm)
void BKE_key_free_data(struct Key *key)
@ LIB_ID_COPY_NO_ANIMDATA
struct ID * BKE_id_copy_ex(struct Main *bmain, const struct ID *id, struct ID **r_newid, int flag)
void BKE_mesh_update_customdata_pointers(struct Mesh *me, bool do_ensure_tess_cd)
bool BKE_mesh_vertex_normals_are_dirty(const struct Mesh *mesh)
void BKE_mesh_free_data_for_undo(struct Mesh *me)
General operations, lookup, etc. for blender objects.
bool BKE_object_is_in_editmode(const struct Object *ob)
@ UNDOTYPE_FLAG_NEED_CONTEXT_FOR_ENCODE
void(* UndoTypeForEachIDRefFn)(void *user_data, struct UndoRefID *id_ref)
Efficient in-memory storage of multiple similar arrays.
void * BLI_array_store_state_data_get_alloc(BArrayState *state, size_t *r_data_len)
void BLI_array_store_state_remove(BArrayStore *bs, BArrayState *state)
BArrayState * BLI_array_store_state_add(BArrayStore *bs, const void *data, size_t data_len, const BArrayState *state_reference)
void BLI_array_store_at_size_clear(struct BArrayStore_AtSize *bs_stride)
void BLI_array_store_at_size_calc_memory_usage(struct BArrayStore_AtSize *bs_stride, size_t *r_size_expanded, size_t *r_size_compacted)
BArrayStore * BLI_array_store_at_size_ensure(struct BArrayStore_AtSize *bs_stride, int stride, int chunk_size)
BArrayStore * BLI_array_store_at_size_get(struct BArrayStore_AtSize *bs_stride, int stride)
Generic array manipulation API.
#define BLI_array_is_zeroed(arr, arr_len)
unsigned int BLI_ghash_len(const GHash *gh) ATTR_WARN_UNUSED_RESULT
GHash * BLI_ghash_ptr_new_ex(const char *info, unsigned int nentries_reserve) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT
void * BLI_ghash_popkey(GHash *gh, const void *key, GHashKeyFreeFP keyfreefp) ATTR_WARN_UNUSED_RESULT
void BLI_ghash_insert(GHash *gh, void *key, void *val)
void BLI_ghash_free(GHash *gh, GHashKeyFreeFP keyfreefp, GHashValFreeFP valfreefp)
void BLI_addtail(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
void BLI_remlink(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
int BLI_findindex(const struct ListBase *listbase, const void *vlink) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
void BLI_task_pool_work_and_wait(TaskPool *pool)
TaskPool * BLI_task_pool_create_background(void *userdata, eTaskPriority priority)
void BLI_task_pool_free(TaskPool *pool)
void BLI_task_pool_push(TaskPool *pool, TaskRunFunction run, void *taskdata, bool free_taskdata, TaskFreeFunction freedata)
#define POINTER_FROM_INT(i)
#define UNUSED_VARS_NDEBUG(...)
typedef double(DMatrix)[4][4]
#define CLOG_ERROR(clg_ref,...)
void DEG_id_tag_update(struct ID *id, int flag)
Object is a sort of wrapper for general info.
#define OBEDIT_FROM_VIEW_LAYER(view_layer)
void EDBM_mesh_free_data(struct BMEditMesh *em)
void ED_undo_object_editmode_restore_helper(struct bContext *C, struct Object **object_array, uint object_array_len, uint object_array_stride)
void ED_undo_object_set_active_or_warn(struct Scene *scene, struct ViewLayer *view_layer, struct Object *ob, const char *info, struct CLG_LogRef *log)
struct Object ** ED_undo_editmode_objects_from_view_layer(struct ViewLayer *view_layer, uint *r_len)
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum type
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint GLsizei GLsizei GLenum type _GL_VOID_RET _GL_VOID GLsizei GLenum GLenum const void *pixels _GL_VOID_RET _GL_VOID const void *pointer _GL_VOID_RET _GL_VOID GLdouble v _GL_VOID_RET _GL_VOID GLfloat v _GL_VOID_RET _GL_VOID GLint GLint i2 _GL_VOID_RET _GL_VOID GLint j _GL_VOID_RET _GL_VOID GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble GLdouble GLdouble zFar _GL_VOID_RET _GL_UINT GLdouble *equation _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLenum GLfloat *v _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLfloat *values _GL_VOID_RET _GL_VOID GLushort *values _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLenum GLdouble *params _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLsizei stride
Read Guarded memory(de)allocation.
Utility defines for timing/benchmarks.
#define TIMEIT_START(var)
ATTR_WARN_UNUSED_RESULT BMesh * bm
BMesh * BM_mesh_create(const BMAllocTemplate *allocsize, const struct BMeshCreateParams *params)
#define BMALLOC_TEMPLATE_FROM_ME(...)
void BM_mesh_bm_from_me(BMesh *bm, const Mesh *me, const struct BMeshFromMeshParams *params)
void BM_mesh_bm_to_me(Main *bmain, BMesh *bm, Mesh *me, const struct BMeshToMeshParams *params)
static void um_arraystore_expand(UndoMesh *um)
static void um_arraystore_cd_compact(struct CustomData *cdata, const size_t data_len, bool create, const BArrayCustomData *bcd_reference, BArrayCustomData **r_bcd_first)
static UndoMesh ** mesh_undostep_reference_elems_from_objects(Object **object, int object_len)
static void um_arraystore_free(UndoMesh *um)
struct MeshUndoStep MeshUndoStep
struct MeshUndoStep_Elem MeshUndoStep_Elem
static void undomesh_free_data(UndoMesh *um)
static void um_arraystore_compact_cb(TaskPool *__restrict UNUSED(pool), void *taskdata)
struct BArrayCustomData BArrayCustomData
void ED_mesh_undosys_type(UndoType *ut)
static void um_arraystore_compact(UndoMesh *um, const UndoMesh *um_ref)
static void um_arraystore_cd_expand(const BArrayCustomData *bcd, struct CustomData *cdata, const size_t data_len)
static void um_arraystore_cd_free(BArrayCustomData *bcd)
static void mesh_undosys_step_decode(struct bContext *C, struct Main *bmain, UndoStep *us_p, const eUndoStepDir UNUSED(dir), bool UNUSED(is_final))
static void um_arraystore_expand_clear(UndoMesh *um)
static void undomesh_to_editmesh(UndoMesh *um, Object *ob, BMEditMesh *em)
static bool mesh_undosys_poll(bContext *C)
static void mesh_undosys_foreach_ID_ref(UndoStep *us_p, UndoTypeForEachIDRefFn foreach_ID_ref_fn, void *user_data)
static struct @482 um_arraystore
static Object * editmesh_object_from_context(bContext *C)
static void mesh_undosys_step_free(UndoStep *us_p)
struct BArrayStore_AtSize bs_stride
static void * undomesh_from_editmesh(UndoMesh *um, BMEditMesh *em, Key *key, UndoMesh *um_ref)
static void um_arraystore_compact_with_info(UndoMesh *um, const UndoMesh *um_ref)
static bool mesh_undosys_step_encode(struct bContext *C, struct Main *bmain, UndoStep *us_p)
static void um_arraystore_compact_ex(UndoMesh *um, const UndoMesh *um_ref, bool create)
void(* MEM_freeN)(void *vmemh)
void *(* MEM_callocN)(size_t len, const char *str)
void *(* MEM_mallocN)(size_t len, const char *str)
std::unique_ptr< IDProperty, IDPropertyDeleter > create(StringRefNull prop_name, int32_t value)
Allocate a new IDProperty of type IDP_INT, set its name and value.
struct BArrayCustomData * next
unsigned int session_uuid
char is_memfile_undo_flush_needed
UndoRefID_Object obedit_ref
MeshUndoStep_Elem * elems
struct BMEditMesh * edit_mesh
struct ToolSettings * toolsettings
struct UndoMesh * local_next
struct UndoMesh * local_prev
struct UndoMesh::@483 store
void(* step_decode)(struct bContext *C, struct Main *bmain, UndoStep *us, eUndoStepDir dir, bool is_final)
bool(* step_encode)(struct bContext *C, struct Main *bmain, UndoStep *us)
void(* step_foreach_ID_ref)(UndoStep *us, UndoTypeForEachIDRefFn foreach_ID_ref_fn, void *user_data)
void(* step_free)(UndoStep *us)
bool(* poll)(struct bContext *C)
void WM_event_add_notifier(const bContext *C, uint type, void *reference)