55 #define USE_ARRAY_STORE
57 #ifdef USE_ARRAY_STORE
67 # define ARRAY_CHUNK_SIZE 256
69 # define USE_ARRAY_STORE_THREAD
72 #ifdef USE_ARRAY_STORE_THREAD
83 #ifdef USE_ARRAY_STORE
109 #ifdef USE_ARRAY_STORE
121 #ifdef USE_ARRAY_STORE
134 # ifdef USE_ARRAY_STORE_THREAD
141 const size_t data_len,
154 for (
int layer_start = 0, layer_end; layer_start < cdata->
totlayer; layer_start = layer_end) {
174 layer_end = layer_start + 1;
175 while ((layer_end < cdata->totlayer) && (
type == cdata->
layers[layer_end].
type)) {
183 const int layer_len = layer_end - layer_start;
186 if (bcd_reference_current && (bcd_reference_current->
type ==
type)) {
190 bcd_reference_current =
NULL;
197 bcd_reference_current = bcd_iter;
200 bcd_iter = bcd_iter->
next;
213 bcd_prev->next = bcd;
223 for (
int i = 0; i < layer_len; i++, layer++) {
226 BArrayState *state_reference = (bcd_reference_current &&
228 bcd_reference_current->
states[i] :
231 if (layer_type_is_dynamic) {
232 state_reference =
NULL;
236 bs, layer->
data, (
size_t)data_len *
stride, state_reference);
250 if (bcd_reference_current) {
251 bcd_reference_current = bcd_reference_current->
next;
257 *r_bcd_first = bcd_first;
267 const size_t data_len)
332 for (
int i = 0; i < me->
key->
totkey; i++, keyblock = keyblock->
next) {
341 if (keyblock->
data) {
382 size_t size_expanded_prev, size_compacted_prev;
384 &
um_arraystore.bs_stride, &size_expanded_prev, &size_compacted_prev);
399 size_t size_expanded, size_compacted;
403 const double percent_total = size_expanded ?
404 (((
double)size_compacted / (
double)size_expanded) * 100.0) :
407 size_t size_expanded_step = size_expanded - size_expanded_prev;
408 size_t size_compacted_step = size_compacted - size_compacted_prev;
409 const double percent_step = size_expanded_step ?
410 (((
double)size_compacted_step / (
double)size_expanded_step) *
414 printf(
"overall memory use: %.8f%% of expanded size\n", percent_total);
415 printf(
"step memory use: %.8f%% of expanded size\n", percent_step);
420 # ifdef USE_ARRAY_STORE_THREAD
454 for (
int i = 0; i < me->
key->
totkey; i++, keyblock = keyblock->
next) {
488 for (
int i = 0; i < me->
key->
totkey; i++) {
510 printf(
"mesh undo store: freeing all data!\n");
514 # ifdef USE_ARRAY_STORE_THREAD
530 #ifdef USE_ARRAY_STORE_THREAD
553 .calc_object_remap = false,
554 .update_shapekey_indices = false,
555 .cd_mask_extra = {.vmask = CD_MASK_SHAPE_KEYINDEX},
561 #ifdef USE_ARRAY_STORE
572 # ifdef USE_ARRAY_STORE_THREAD
596 #ifdef USE_ARRAY_STORE
597 # ifdef USE_ARRAY_STORE_THREAD
621 .use_toolflags =
true,
627 .calc_face_normal = true,
628 .active_shapekey = um->shapenr,
644 const int kb_act_idx = ob->
shapenr - 1;
666 #ifdef USE_ARRAY_STORE
675 #ifdef USE_ARRAY_STORE
677 # ifdef USE_ARRAY_STORE_THREAD
746 uint objects_len = 0;
752 for (
uint i = 0; i < objects_len; i++) {
790 "name='%s', failed to enter edit-mode for object '%s', undo state invalid",
842 ut->
name =
"Edit Mesh";
struct Scene * CTX_data_scene(const bContext *C)
struct ViewLayer * CTX_data_view_layer(const bContext *C)
bool CustomData_layertype_is_dynamic(int type)
int CustomData_sizeof(int type)
BMEditMesh * BKE_editmesh_create(BMesh *bm, const bool do_tessellate)
bool BKE_keyblock_is_basis(struct Key *key, const int index)
void BKE_keyblock_update_from_mesh(struct Mesh *me, struct KeyBlock *kb)
void BKE_key_free(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, const int flag)
void BKE_mesh_free_data(struct Mesh *me)
void BKE_mesh_update_customdata_pointers(struct Mesh *me, const bool do_ensure_tess_cd)
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, const 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, const int stride, const int chunk_size)
BArrayStore * BLI_array_store_at_size_get(struct BArrayStore_AtSize *bs_stride, const int stride)
Generic array manipulation API.
#define BLI_array_is_zeroed(arr, arr_len)
struct LinkData * BLI_genericNodeN(void *data)
void BLI_addtail(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
void BLI_remlink(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
void * BLI_findlink(const struct ListBase *listbase, int number) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
void * BLI_findptr(const struct ListBase *listbase, const void *ptr, const int offset) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
TaskPool * BLI_task_pool_create_background(void *userdata, TaskPriority priority)
void BLI_task_pool_work_and_wait(TaskPool *pool)
void BLI_task_pool_free(TaskPool *pool)
void BLI_task_pool_push(TaskPool *pool, TaskRunFunction run, void *taskdata, bool free_taskdata, TaskFreeFunction freedata)
#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(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)
BMesh Make Mesh.
#define BMALLOC_TEMPLATE_FROM_ME(...)
void BM_mesh_bm_from_me(BMesh *bm, const Mesh *me, const struct BMeshFromMeshParams *params)
Mesh -> BMesh.
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 void um_arraystore_free(UndoMesh *um)
struct MeshUndoStep MeshUndoStep
struct MeshUndoStep_Elem MeshUndoStep_Elem
static void undomesh_free_data(UndoMesh *um)
static void * undomesh_from_editmesh(UndoMesh *um, BMEditMesh *em, Key *key)
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 struct @458 um_arraystore
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 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 Object * editmesh_object_from_context(bContext *C)
static void undomesh_to_editmesh(UndoMesh *um, Object *ob, BMEditMesh *em, Key *key)
static void mesh_undosys_step_free(UndoStep *us_p)
struct BArrayStore_AtSize bs_stride
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)
struct BArrayCustomData * next
char is_memfile_undo_flush_needed
struct MeshUndoStep_Elem * prev
UndoRefID_Object obedit_ref
struct MeshUndoStep_Elem * next
MeshUndoStep_Elem * elems
struct BMEditMesh * edit_mesh
struct CustomData pdata ldata
struct ToolSettings * toolsettings
struct UndoMesh::@459 store
void(* step_decode)(struct bContext *C, struct Main *bmain, UndoStep *us, const 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)