Blender  V3.3
Classes | Macros | Functions
bmesh_log.c File Reference
#include "MEM_guardedalloc.h"
#include "BLI_ghash.h"
#include "BLI_listbase.h"
#include "BLI_math.h"
#include "BLI_mempool.h"
#include "BLI_utildefines.h"
#include "BKE_customdata.h"
#include "bmesh.h"
#include "bmesh_log.h"
#include "range_tree.h"
#include "BLI_strict_flags.h"

Go to the source code of this file.

Classes

struct  BMLogEntry
 
struct  BMLog
 
struct  BMLogVert
 
struct  BMLogFace
 

Macros

#define logkey_hash   BLI_ghashutil_inthash_p_simple
 
#define logkey_cmp   BLI_ghashutil_intcmp
 

Functions

static uint bm_log_vert_id_get (BMLog *log, BMVert *v)
 
static void bm_log_vert_id_set (BMLog *log, BMVert *v, uint id)
 
static BMVertbm_log_vert_from_id (BMLog *log, uint id)
 
static uint bm_log_face_id_get (BMLog *log, BMFace *f)
 
static void bm_log_face_id_set (BMLog *log, BMFace *f, uint id)
 
static BMFacebm_log_face_from_id (BMLog *log, uint id)
 
static float vert_mask_get (BMVert *v, const int cd_vert_mask_offset)
 
static void vert_mask_set (BMVert *v, const float new_mask, const int cd_vert_mask_offset)
 
static void bm_log_vert_bmvert_copy (BMLogVert *lv, BMVert *v, const int cd_vert_mask_offset)
 
static BMLogVertbm_log_vert_alloc (BMLog *log, BMVert *v, const int cd_vert_mask_offset)
 
static BMLogFacebm_log_face_alloc (BMLog *log, BMFace *f)
 
static void bm_log_verts_unmake (BMesh *bm, BMLog *log, GHash *verts)
 
static void bm_log_faces_unmake (BMesh *bm, BMLog *log, GHash *faces)
 
static void bm_log_verts_restore (BMesh *bm, BMLog *log, GHash *verts)
 
static void bm_log_faces_restore (BMesh *bm, BMLog *log, GHash *faces)
 
static void bm_log_vert_values_swap (BMesh *bm, BMLog *log, GHash *verts)
 
static void bm_log_face_values_swap (BMLog *log, GHash *faces)
 
static void bm_log_assign_ids (BMesh *bm, BMLog *log)
 
static BMLogEntrybm_log_entry_create (void)
 
static void bm_log_entry_free (BMLogEntry *entry)
 
static void bm_log_id_ghash_retake (RangeTreeUInt *unused_ids, GHash *id_ghash)
 
static int uint_compare (const void *a_v, const void *b_v)
 
static GHashbm_log_compress_ids_to_indices (uint *ids, uint totid)
 
static void bm_log_id_ghash_release (BMLog *log, GHash *id_ghash)
 
BMLogBM_log_create (BMesh *bm)
 
void BM_log_cleanup_entry (BMLogEntry *entry)
 
BMLogBM_log_from_existing_entries_create (BMesh *bm, BMLogEntry *entry)
 
void BM_log_free (BMLog *log)
 
int BM_log_length (const BMLog *log)
 
void BM_log_mesh_elems_reorder (BMesh *bm, BMLog *log)
 
BMLogEntryBM_log_entry_add (BMLog *log)
 
void BM_log_entry_drop (BMLogEntry *entry)
 
void BM_log_undo (BMesh *bm, BMLog *log)
 
void BM_log_redo (BMesh *bm, BMLog *log)
 
void BM_log_vert_before_modified (BMLog *log, BMVert *v, const int cd_vert_mask_offset)
 
void BM_log_vert_added (BMLog *log, BMVert *v, const int cd_vert_mask_offset)
 
void BM_log_face_modified (BMLog *log, BMFace *f)
 
void BM_log_face_added (BMLog *log, BMFace *f)
 
void BM_log_vert_removed (BMLog *log, BMVert *v, const int cd_vert_mask_offset)
 
void BM_log_face_removed (BMLog *log, BMFace *f)
 
void BM_log_all_added (BMesh *bm, BMLog *log)
 
void BM_log_before_all_removed (BMesh *bm, BMLog *log)
 
const floatBM_log_original_vert_co (BMLog *log, BMVert *v)
 
const floatBM_log_original_vert_no (BMLog *log, BMVert *v)
 
float BM_log_original_mask (BMLog *log, BMVert *v)
 
void BM_log_original_vert_data (BMLog *log, BMVert *v, const float **r_co, const float **r_no)
 
BMLogEntryBM_log_current_entry (BMLog *log)
 
RangeTreeUInt * BM_log_unused_ids (BMLog *log)
 

Detailed Description

The BMLog is an interface for storing undo/redo steps as a BMesh is modified. It only stores changes to the BMesh, not full copies.

Currently it supports the following types of changes:

Definition in file bmesh_log.c.

Macro Definition Documentation

◆ logkey_cmp

#define logkey_cmp   BLI_ghashutil_intcmp

Definition at line 112 of file bmesh_log.c.

◆ logkey_hash

Definition at line 111 of file bmesh_log.c.

Function Documentation

◆ BM_log_all_added()

void BM_log_all_added ( BMesh bm,
BMLog log 
)

◆ bm_log_assign_ids()

static void bm_log_assign_ids ( BMesh bm,
BMLog log 
)
static

◆ BM_log_before_all_removed()

void BM_log_before_all_removed ( BMesh bm,
BMLog log 
)

◆ BM_log_cleanup_entry()

void BM_log_cleanup_entry ( BMLogEntry entry)

◆ bm_log_compress_ids_to_indices()

static GHash* bm_log_compress_ids_to_indices ( uint ids,
uint  totid 
)
static

◆ BM_log_create()

BMLog* BM_log_create ( BMesh bm)

◆ BM_log_current_entry()

BMLogEntry* BM_log_current_entry ( BMLog log)

For internal use only (unit testing).

Definition at line 978 of file bmesh_log.c.

References log().

◆ BM_log_entry_add()

BMLogEntry* BM_log_entry_add ( BMLog log)

Start a new log entry and update the log entry list.

If the log entry list is empty, or if the current log entry is the last entry, the new entry is simply appended to the end.

Otherwise, the new entry is added after the current entry and all following entries are deleted.

In either case, the new entry is set as the current log entry.

Definition at line 620 of file bmesh_log.c.

References BLI_addtail(), BLI_freelinkN(), bm_log_entry_create(), bm_log_entry_free(), log(), BMLogEntry::log, BMLogEntry::next, and next.

Referenced by sculpt_undo_bmesh_push().

◆ bm_log_entry_create()

static BMLogEntry* bm_log_entry_create ( void  )
static

◆ BM_log_entry_drop()

void BM_log_entry_drop ( BMLogEntry entry)

Remove an entry from the log.

Uses entry->log as the log. If the log is NULL, the entry will be free'd but not removed from any list, nor shall its IDs be released.

This operation is only valid on the first and last entries in the log. Deleting from the middle will assert.

Definition at line 647 of file bmesh_log.c.

References BMLogEntry::added_faces, BMLogEntry::added_verts, BLI_assert, BLI_assert_msg, BLI_freelinkN(), bm_log_entry_free(), bm_log_id_ghash_release(), log(), BMLogEntry::log, MEM_freeN, BMLogEntry::next, NULL, and BMLogEntry::prev.

Referenced by sculpt_undo_free_list().

◆ bm_log_entry_free()

static void bm_log_entry_free ( BMLogEntry entry)
static

◆ BM_log_face_added()

void BM_log_face_added ( BMLog log,
struct BMFace f 
)

Log a new face as added to the BMesh.

The new face gets a unique ID assigned. It is then added to a map of added faces, with the key being its ID and the value containing everything needed to reconstruct that face.

Definition at line 807 of file bmesh_log.c.

References BLI_assert, BLI_ghash_insert(), bm_log_face_alloc(), bm_log_face_id_set(), BMFace::len, log(), and POINTER_FROM_UINT.

Referenced by BM_log_all_added(), and pbvh_bmesh_face_create().

◆ bm_log_face_alloc()

static BMLogFace* bm_log_face_alloc ( BMLog log,
BMFace f 
)
static

◆ bm_log_face_from_id()

static BMFace* bm_log_face_from_id ( BMLog log,
uint  id 
)
static

◆ bm_log_face_id_get()

static uint bm_log_face_id_get ( BMLog log,
BMFace f 
)
static

◆ bm_log_face_id_set()

static void bm_log_face_id_set ( BMLog log,
BMFace f,
uint  id 
)
static

◆ BM_log_face_modified()

void BM_log_face_modified ( BMLog log,
struct BMFace f 
)

Log a face before it is modified.

This is intended to handle only header flags and we always assume face has been added before.

Definition at line 797 of file bmesh_log.c.

References BLI_ghash_insert(), bm_log_face_alloc(), bm_log_face_id_get(), log(), and POINTER_FROM_UINT.

Referenced by sculpt_undo_bmesh_push().

◆ BM_log_face_removed()

void BM_log_face_removed ( BMLog log,
struct BMFace f 
)

Log a face as removed from the BMesh.

A couple things can happen here:

If the face was added as part of the current log entry, then it's deleted and forgotten about entirely. Its unique ID is returned to the unused pool.

If the face was already part of the BMesh before the current log entry, it is added to a map of deleted faces, with the key being its ID and the value containing everything needed to reconstruct that face.

Definition at line 849 of file bmesh_log.c.

References BMLogEntry::added_faces, BLI_assert, BLI_ghash_haskey(), BLI_ghash_insert(), BLI_ghash_lookup(), BLI_ghash_remove(), bm_log_face_alloc(), bm_log_face_id_get(), BMLogEntry::deleted_faces, log(), NULL, and POINTER_FROM_UINT.

Referenced by BM_log_before_all_removed(), and pbvh_bmesh_face_remove().

◆ bm_log_face_values_swap()

static void bm_log_face_values_swap ( BMLog log,
GHash faces 
)
static

◆ bm_log_faces_restore()

static void bm_log_faces_restore ( BMesh bm,
BMLog log,
GHash faces 
)
static

◆ bm_log_faces_unmake()

static void bm_log_faces_unmake ( BMesh bm,
BMLog log,
GHash faces 
)
static

◆ BM_log_free()

void BM_log_free ( BMLog log)

Free all the data in a BMLog including the log itself.

Definition at line 539 of file bmesh_log.c.

References BLI_ghash_free(), log(), BMLogEntry::log, MEM_freeN, BMLogEntry::next, and NULL.

Referenced by BKE_sculptsession_free(), and SCULPT_dynamic_topology_disable_ex().

◆ BM_log_from_existing_entries_create()

BMLog* BM_log_from_existing_entries_create ( BMesh bm,
BMLogEntry entry 
)

Allocate and initialize a new BMLog using existing #BMLogEntries

The 'entry' should be the last entry in the BMLog. Its prev pointer will be followed back to find the first entry.

The unused IDs field of the log will be initialized by taking all keys from all GHashes in the log entry.

Definition at line 498 of file bmesh_log.c.

References BMLogEntry::added_faces, BMLogEntry::added_verts, bm, BM_log_create(), bm_log_id_ghash_retake(), BMLogEntry::deleted_faces, BMLogEntry::deleted_verts, log(), BMLogEntry::log, BMLogEntry::modified_faces, BMLogEntry::modified_verts, BMLogEntry::next, NULL, and BMLogEntry::prev.

Referenced by sculpt_undo_bmesh_enable().

◆ bm_log_id_ghash_release()

static void bm_log_id_ghash_release ( BMLog log,
GHash id_ghash 
)
static

Definition at line 448 of file bmesh_log.c.

References BLI_ghashIterator_getKey(), GHASH_ITER, log(), and POINTER_AS_UINT.

Referenced by BM_log_entry_drop().

◆ bm_log_id_ghash_retake()

static void bm_log_id_ghash_retake ( RangeTreeUInt *  unused_ids,
GHash id_ghash 
)
static

◆ BM_log_length()

int BM_log_length ( const BMLog log)

Get the number of log entries.

Definition at line 564 of file bmesh_log.c.

References BLI_listbase_count(), and log().

◆ BM_log_mesh_elems_reorder()

void BM_log_mesh_elems_reorder ( BMesh bm,
BMLog log 
)

◆ BM_log_original_mask()

float BM_log_original_mask ( BMLog log,
BMVert v 
)

Get the logged mask of a vertex

Does not modify the log or the vertex.

Definition at line 945 of file bmesh_log.c.

References BLI_assert, BLI_ghash_haskey(), BLI_ghash_lookup(), bm_log_vert_id_get(), log(), BMLogVert::mask, BMLogEntry::modified_verts, POINTER_FROM_UINT, and v.

Referenced by SCULPT_orig_vert_data_update().

◆ BM_log_original_vert_co()

const float* BM_log_original_vert_co ( BMLog log,
BMVert v 
)

Get the logged coordinates of a vertex.

Does not modify the log or the vertex.

Definition at line 915 of file bmesh_log.c.

References BLI_assert, BLI_ghash_haskey(), BLI_ghash_lookup(), bm_log_vert_id_get(), BMLogVert::co, log(), BMLogEntry::modified_verts, POINTER_FROM_UINT, and v.

Referenced by sculpt_combine_proxies_task_cb().

◆ BM_log_original_vert_data()

void BM_log_original_vert_data ( BMLog log,
BMVert v,
const float **  r_co,
const float **  r_no 
)

◆ BM_log_original_vert_no()

const float* BM_log_original_vert_no ( BMLog log,
BMVert v 
)

Get the logged normal of a vertex

Does not modify the log or the vertex.

Definition at line 930 of file bmesh_log.c.

References BLI_assert, BLI_ghash_haskey(), BLI_ghash_lookup(), bm_log_vert_id_get(), log(), BMLogEntry::modified_verts, BMLogVert::no, POINTER_FROM_UINT, and v.

◆ BM_log_redo()

void BM_log_redo ( BMesh bm,
BMLog log 
)

◆ BM_log_undo()

void BM_log_undo ( BMesh bm,
BMLog log 
)

◆ BM_log_unused_ids()

RangeTreeUInt* BM_log_unused_ids ( BMLog log)

For internal use only (unit testing)

Definition at line 983 of file bmesh_log.c.

References log().

◆ BM_log_vert_added()

void BM_log_vert_added ( BMLog log,
struct BMVert v,
int  cd_vert_mask_offset 
)

Log a new vertex as added to the BMesh.

The new vertex gets a unique ID assigned. It is then added to a map of added vertices, with the key being its ID and the value containing everything needed to reconstruct that vertex.

Definition at line 786 of file bmesh_log.c.

References BLI_ghash_insert(), bm_log_vert_alloc(), bm_log_vert_id_set(), log(), POINTER_FROM_UINT, and v.

Referenced by BM_log_all_added(), and pbvh_bmesh_vert_create().

◆ bm_log_vert_alloc()

static BMLogVert* bm_log_vert_alloc ( BMLog log,
BMVert v,
const int  cd_vert_mask_offset 
)
static

◆ BM_log_vert_before_modified()

void BM_log_vert_before_modified ( BMLog log,
struct BMVert v,
int  cd_vert_mask_offset 
)

Log a vertex before it is modified.

Before modifying vertex coordinates, masks, or hflags, call this function to log its current values. This is better than logging after the coordinates have been modified, because only those vertices that are modified need to have their original values stored.

Handles two separate cases:

If the vertex was added in the current log entry, update the vertex in the map of added vertices.

If the vertex already existed prior to the current log entry, a separate key/value map of modified vertices is used (using the vertex's ID as the key). The values stored in that case are the vertex's original state so that an undo can restore the previous state.

On undo, the current vertex state will be swapped with the stored state so that a subsequent redo operation will restore the newer vertex state.

Definition at line 768 of file bmesh_log.c.

References BMLogEntry::added_verts, BLI_ghash_ensure_p(), BLI_ghash_lookup(), bm_log_vert_alloc(), bm_log_vert_bmvert_copy(), bm_log_vert_id_get(), log(), BMLogEntry::modified_verts, POINTER_FROM_UINT, and v.

Referenced by pbvh_bmesh_collapse_edge(), and sculpt_undo_bmesh_push().

◆ bm_log_vert_bmvert_copy()

static void bm_log_vert_bmvert_copy ( BMLogVert lv,
BMVert v,
const int  cd_vert_mask_offset 
)
static

◆ bm_log_vert_from_id()

static BMVert* bm_log_vert_from_id ( BMLog log,
uint  id 
)
static

◆ bm_log_vert_id_get()

static uint bm_log_vert_id_get ( BMLog log,
BMVert v 
)
static

◆ bm_log_vert_id_set()

static void bm_log_vert_id_set ( BMLog log,
BMVert v,
uint  id 
)
static

◆ BM_log_vert_removed()

void BM_log_vert_removed ( BMLog log,
struct BMVert v,
int  cd_vert_mask_offset 
)

Log a vertex as removed from the BMesh.

A couple things can happen here:

If the vertex was added as part of the current log entry, then it's deleted and forgotten about entirely. Its unique ID is returned to the unused pool.

If the vertex was already part of the BMesh before the current log entry, it is added to a map of deleted vertices, with the key being its ID and the value containing everything needed to reconstruct that vertex.

If there's a move record for the vertex, that's used as the vertices original location, then the move record is deleted.

Definition at line 821 of file bmesh_log.c.

References BMLogEntry::added_verts, BLI_assert, BLI_ghash_haskey(), BLI_ghash_insert(), BLI_ghash_lookup(), BLI_ghash_remove(), bm_log_vert_alloc(), bm_log_vert_id_get(), BMLogEntry::deleted_verts, log(), BMLogEntry::modified_verts, NULL, POINTER_FROM_UINT, and v.

Referenced by BM_log_before_all_removed(), and pbvh_bmesh_collapse_edge().

◆ bm_log_vert_values_swap()

static void bm_log_vert_values_swap ( BMesh bm,
BMLog log,
GHash verts 
)
static

◆ bm_log_verts_restore()

static void bm_log_verts_restore ( BMesh bm,
BMLog log,
GHash verts 
)
static

◆ bm_log_verts_unmake()

static void bm_log_verts_unmake ( BMesh bm,
BMLog log,
GHash verts 
)
static

◆ uint_compare()

static int uint_compare ( const void a_v,
const void b_v 
)
static

Definition at line 416 of file bmesh_log.c.

References Freestyle::a, and usdtokens::b().

Referenced by bm_log_compress_ids_to_indices().

◆ vert_mask_get()

static float vert_mask_get ( BMVert v,
const int  cd_vert_mask_offset 
)
static

Definition at line 167 of file bmesh_log.c.

References BM_ELEM_CD_GET_FLOAT, and v.

Referenced by bm_log_vert_bmvert_copy(), and bm_log_vert_values_swap().

◆ vert_mask_set()

static void vert_mask_set ( BMVert v,
const float  new_mask,
const int  cd_vert_mask_offset 
)
static

Definition at line 178 of file bmesh_log.c.

References BM_ELEM_CD_SET_FLOAT, and v.

Referenced by bm_log_vert_values_swap(), and bm_log_verts_restore().