Blender  V2.93
Classes | Typedefs | Enumerations | Functions
BKE_DerivedMesh.h File Reference
#include "DNA_customdata_types.h"
#include "DNA_defs.h"
#include "DNA_meshdata_types.h"
#include "BLI_compiler_attrs.h"
#include "BKE_bvhutils.h"
#include "BKE_customdata.h"

Go to the source code of this file.

Classes

struct  DMFlagMat
 
struct  DerivedMesh
 

Typedefs

typedef struct DMFlagMat DMFlagMat
 
typedef enum DerivedMeshType DerivedMeshType
 
typedef enum DMDirtyFlag DMDirtyFlag
 
typedef struct DerivedMesh DerivedMesh
 

Enumerations

enum  DerivedMeshType { DM_TYPE_CDDM , DM_TYPE_CCGDM }
 
enum  DMDirtyFlag { DM_DIRTY_TESS_CDLAYERS = 1 << 0 , DM_DIRTY_NORMALS = 1 << 1 }
 

Functions

void DM_init_funcs (DerivedMesh *dm)
 
void DM_init (DerivedMesh *dm, DerivedMeshType type, int numVerts, int numEdges, int numTessFaces, int numLoops, int numPolys)
 
void DM_from_template_ex (DerivedMesh *dm, DerivedMesh *source, DerivedMeshType type, int numVerts, int numEdges, int numTessFaces, int numLoops, int numPolys, const struct CustomData_MeshMasks *mask)
 
void DM_from_template (DerivedMesh *dm, DerivedMesh *source, DerivedMeshType type, int numVerts, int numEdges, int numTessFaces, int numLoops, int numPolys)
 
bool DM_release (DerivedMesh *dm)
 
void DM_set_only_copy (DerivedMesh *dm, const struct CustomData_MeshMasks *mask)
 
void DM_add_vert_layer (struct DerivedMesh *dm, int type, eCDAllocType alloctype, void *layer)
 
void DM_add_edge_layer (struct DerivedMesh *dm, int type, eCDAllocType alloctype, void *layer)
 
void DM_add_tessface_layer (struct DerivedMesh *dm, int type, eCDAllocType alloctype, void *layer)
 
void DM_add_loop_layer (DerivedMesh *dm, int type, eCDAllocType alloctype, void *layer)
 
void DM_add_poly_layer (struct DerivedMesh *dm, int type, eCDAllocType alloctype, void *layer)
 
void * DM_get_vert_data (struct DerivedMesh *dm, int index, int type)
 
void * DM_get_edge_data (struct DerivedMesh *dm, int index, int type)
 
void * DM_get_tessface_data (struct DerivedMesh *dm, int index, int type)
 
void * DM_get_poly_data (struct DerivedMesh *dm, int index, int type)
 
void * DM_get_vert_data_layer (struct DerivedMesh *dm, int type)
 
void * DM_get_edge_data_layer (struct DerivedMesh *dm, int type)
 
void * DM_get_tessface_data_layer (struct DerivedMesh *dm, int type)
 
void * DM_get_poly_data_layer (struct DerivedMesh *dm, int type)
 
void * DM_get_loop_data_layer (struct DerivedMesh *dm, int type)
 
void DM_copy_vert_data (struct DerivedMesh *source, struct DerivedMesh *dest, int source_index, int dest_index, int count)
 
void DM_DupPolys (DerivedMesh *source, DerivedMesh *target)
 
void DM_ensure_normals (DerivedMesh *dm)
 
void DM_ensure_looptri_data (DerivedMesh *dm)
 
void DM_interp_vert_data (struct DerivedMesh *source, struct DerivedMesh *dest, int *src_indices, float *weights, int count, int dest_index)
 
void mesh_get_mapped_verts_coords (struct Mesh *me_eval, float(*r_cos)[3], const int totcos)
 
struct Mesheditbmesh_get_eval_cage (struct Depsgraph *depsgraph, struct Scene *scene, struct Object *, struct BMEditMesh *em, const struct CustomData_MeshMasks *dataMask)
 
struct Mesheditbmesh_get_eval_cage_from_orig (struct Depsgraph *depsgraph, struct Scene *scene, struct Object *obedit, const struct CustomData_MeshMasks *dataMask)
 
struct Mesheditbmesh_get_eval_cage_and_final (struct Depsgraph *depsgraph, struct Scene *scene, struct Object *, struct BMEditMesh *em, const struct CustomData_MeshMasks *dataMask, struct Mesh **r_final)
 
float(* editbmesh_vert_coords_alloc (struct BMEditMesh *em, int *r_vert_len))[3]
 
bool editbmesh_modifier_is_enabled (struct Scene *scene, const struct Object *ob, struct ModifierData *md, bool has_prev_mesh)
 
void makeDerivedMesh (struct Depsgraph *depsgraph, struct Scene *scene, struct Object *ob, struct BMEditMesh *em, const struct CustomData_MeshMasks *dataMask)
 
void DM_calc_loop_tangents (DerivedMesh *dm, bool calc_active_tangent, const char(*tangent_names)[MAX_NAME], int tangent_names_len)
 
char * DM_debug_info (DerivedMesh *dm)
 
void DM_debug_print (DerivedMesh *dm)
 
bool DM_is_valid (DerivedMesh *dm)
 

Detailed Description

Basic design of the DerivedMesh system:

DerivedMesh is a common set of interfaces for mesh systems.

There are three main mesh data structures in Blender: Mesh, CDDerivedMesh and BMesh.

These, and a few others, all implement DerivedMesh interfaces, which contains unified drawing interfaces, a few utility interfaces, and a bunch of read-only interfaces intended mostly for conversion from one format to another.

All Mesh structures in blender make use of CustomData, which is used to store per-element attributes and interpolate them (e.g. uvs, vcols, vgroups, etc).

Mesh is the "serialized" structure, used for storing object-mode mesh data and also for saving stuff to disk. Its interfaces are also what DerivedMesh uses to communicate with.

CDDM is a little mesh library, that uses Mesh data structures in the backend. It's mostly used for modifiers, and has the advantages of not taking much resources.

BMesh is a full-on brep, used for editmode, some modifiers, etc. It's much more capable (if memory-intensive) then CDDM.

DerivedMesh is somewhat hackish. Many places assumes that a DerivedMesh is a CDDM (most of the time by simply copying it and converting it to one). CDDM is the original structure for modifiers, but has since been superseded by BMesh, at least for the foreseeable future.

Definition in file BKE_DerivedMesh.h.

Typedef Documentation

◆ DerivedMesh

typedef struct DerivedMesh DerivedMesh

Definition at line 1 of file BKE_DerivedMesh.h.

◆ DerivedMeshType

◆ DMDirtyFlag

typedef enum DMDirtyFlag DMDirtyFlag

◆ DMFlagMat

typedef struct DMFlagMat DMFlagMat

Enumeration Type Documentation

◆ DerivedMeshType

Enumerator
DM_TYPE_CDDM 
DM_TYPE_CCGDM 

Definition at line 102 of file BKE_DerivedMesh.h.

◆ DMDirtyFlag

Enumerator
DM_DIRTY_TESS_CDLAYERS 
DM_DIRTY_NORMALS 

Definition at line 107 of file BKE_DerivedMesh.h.

Function Documentation

◆ DM_add_edge_layer()

void DM_add_edge_layer ( struct DerivedMesh dm,
int  type,
eCDAllocType  alloctype,
void *  layer 
)

◆ DM_add_loop_layer()

void DM_add_loop_layer ( DerivedMesh dm,
int  type,
eCDAllocType  alloctype,
void *  layer 
)

◆ DM_add_poly_layer()

void DM_add_poly_layer ( struct DerivedMesh dm,
int  type,
eCDAllocType  alloctype,
void *  layer 
)

◆ DM_add_tessface_layer()

void DM_add_tessface_layer ( struct DerivedMesh dm,
int  type,
eCDAllocType  alloctype,
void *  layer 
)

◆ DM_add_vert_layer()

void DM_add_vert_layer ( struct DerivedMesh dm,
int  type,
eCDAllocType  alloctype,
void *  layer 
)

◆ DM_calc_loop_tangents()

void DM_calc_loop_tangents ( DerivedMesh dm,
bool  calc_active_tangent,
const char(*)  tangent_names[MAX_NAME],
int  tangent_names_len 
)

◆ DM_copy_vert_data()

void DM_copy_vert_data ( struct DerivedMesh source,
struct DerivedMesh dest,
int  source_index,
int  dest_index,
int  count 
)

Definition at line 654 of file DerivedMesh.cc.

References count, CustomData_copy_data(), and DerivedMesh::vertData.

Referenced by set_ccgdm_all_geometry().

◆ DM_debug_info()

char* DM_debug_info ( DerivedMesh dm)

◆ DM_debug_print()

void DM_debug_print ( DerivedMesh dm)

Definition at line 2496 of file DerivedMesh.cc.

References DM_debug_info(), MEM_freeN, and str.

◆ DM_DupPolys()

void DM_DupPolys ( DerivedMesh source,
DerivedMesh target 
)

◆ DM_ensure_looptri_data()

void DM_ensure_looptri_data ( DerivedMesh dm)

Ensure the array is large enough

Note
This function must always be thread-protected by caller. It should only be used by internal code.

Definition at line 493 of file DerivedMesh.cc.

References DerivedMesh::array, DerivedMesh::array_wip, BLI_assert, DerivedMesh::looptris, MEM_malloc_arrayN, MEM_SAFE_FREE, DerivedMesh::num, DerivedMesh::num_alloc, DerivedMesh::numLoopData, DerivedMesh::numPolyData, poly_to_tri_count(), and SWAP.

Referenced by ccgDM_recalcLoopTri(), and cdDM_recalc_looptri().

◆ DM_ensure_normals()

void DM_ensure_normals ( DerivedMesh dm)

◆ DM_from_template()

void DM_from_template ( DerivedMesh dm,
DerivedMesh source,
DerivedMeshType  type,
int  numVerts,
int  numEdges,
int  numTessFaces,
int  numLoops,
int  numPolys 
)

Definition at line 404 of file DerivedMesh.cc.

References CD_MASK_DERIVEDMESH, DM_from_template_ex(), and type.

Referenced by CDDM_copy(), and getCCGDerivedMesh().

◆ DM_from_template_ex()

void DM_from_template_ex ( DerivedMesh dm,
DerivedMesh source,
DerivedMeshType  type,
int  numVerts,
int  numEdges,
int  numTessFaces,
int  numLoops,
int  numPolys,
const struct CustomData_MeshMasks mask 
)

◆ DM_get_edge_data()

void* DM_get_edge_data ( struct DerivedMesh dm,
int  index,
int  type 
)

◆ DM_get_edge_data_layer()

void* DM_get_edge_data_layer ( struct DerivedMesh dm,
int  type 
)

◆ DM_get_loop_data_layer()

void* DM_get_loop_data_layer ( struct DerivedMesh dm,
int  type 
)

Definition at line 649 of file DerivedMesh.cc.

References CustomData_get_layer(), DerivedMesh::loopData, and type.

Referenced by DM_init_funcs(), and do_multires_bake().

◆ DM_get_poly_data()

void* DM_get_poly_data ( struct DerivedMesh dm,
int  index,
int  type 
)

Definition at line 611 of file DerivedMesh.cc.

References BLI_assert, CustomData_get(), DerivedMesh::polyData, and type.

Referenced by ccgDM_get_poly_data(), and DM_init_funcs().

◆ DM_get_poly_data_layer()

void* DM_get_poly_data_layer ( struct DerivedMesh dm,
int  type 
)

◆ DM_get_tessface_data()

void* DM_get_tessface_data ( struct DerivedMesh dm,
int  index,
int  type 
)

◆ DM_get_tessface_data_layer()

void* DM_get_tessface_data_layer ( struct DerivedMesh dm,
int  type 
)

◆ DM_get_vert_data()

void* DM_get_vert_data ( struct DerivedMesh dm,
int  index,
int  type 
)

Definition at line 593 of file DerivedMesh.cc.

References BLI_assert, CustomData_get(), type, and DerivedMesh::vertData.

Referenced by ccgDM_get_vert_data(), cdDM_create(), and DM_init_funcs().

◆ DM_get_vert_data_layer()

void* DM_get_vert_data_layer ( struct DerivedMesh dm,
int  type 
)

◆ DM_init()

void DM_init ( DerivedMesh dm,
DerivedMeshType  type,
int  numVerts,
int  numEdges,
int  numTessFaces,
int  numLoops,
int  numPolys 
)

◆ DM_init_funcs()

void DM_init_funcs ( DerivedMesh dm)

Utility function to initialize a DerivedMesh's function pointers to the default implementation (for those functions which have a default)

Definition at line 301 of file DerivedMesh.cc.

References dm_dupEdgeArray(), dm_dupFaceArray(), dm_dupLoopArray(), dm_dupPolyArray(), dm_dupVertArray(), DM_get_edge_data(), DM_get_edge_data_layer(), DM_get_loop_data_layer(), DM_get_poly_data(), DM_get_poly_data_layer(), DM_get_tessface_data(), DM_get_tessface_data_layer(), DM_get_vert_data(), DM_get_vert_data_layer(), dm_getEdgeArray(), dm_getEdgeCData(), dm_getLoopArray(), dm_getLoopCData(), dm_getLoopTriArray(), dm_getNumLoopTri(), dm_getPolyArray(), dm_getPolyCData(), dm_getTessFaceArray(), dm_getTessFaceCData(), dm_getVertArray(), dm_getVertCData(), DerivedMesh::dupEdgeArray, DerivedMesh::dupLoopArray, DerivedMesh::dupPolyArray, DerivedMesh::dupTessFaceArray, DerivedMesh::dupVertArray, DerivedMesh::getEdgeArray, DerivedMesh::getEdgeData, DerivedMesh::getEdgeDataArray, DerivedMesh::getEdgeDataLayout, DerivedMesh::getLoopArray, DerivedMesh::getLoopDataArray, DerivedMesh::getLoopDataLayout, DerivedMesh::getLoopTriArray, DerivedMesh::getNumLoopTri, DerivedMesh::getPolyArray, DerivedMesh::getPolyData, DerivedMesh::getPolyDataArray, DerivedMesh::getPolyDataLayout, DerivedMesh::getTessFaceArray, DerivedMesh::getTessFaceData, DerivedMesh::getTessFaceDataArray, DerivedMesh::getTessFaceDataLayout, DerivedMesh::getVertArray, DerivedMesh::getVertData, DerivedMesh::getVertDataArray, and DerivedMesh::getVertDataLayout.

Referenced by DM_from_template_ex(), and DM_init().

◆ DM_interp_vert_data()

void DM_interp_vert_data ( DerivedMesh source,
DerivedMesh dest,
int *  src_indices,
float weights,
int  count,
int  dest_index 
)

interpolates vertex data from the vertices indexed by src_indices in the source mesh using the given weights and stores the result in the vertex indexed by dest_index in the dest mesh

Definition at line 665 of file DerivedMesh.cc.

References count, CustomData_interp(), and DerivedMesh::vertData.

Referenced by set_ccgdm_all_geometry().

◆ DM_is_valid()

bool DM_is_valid ( DerivedMesh dm)

◆ DM_release()

bool DM_release ( DerivedMesh dm)

◆ DM_set_only_copy()

void DM_set_only_copy ( DerivedMesh dm,
const struct CustomData_MeshMasks mask 
)

◆ editbmesh_get_eval_cage()

struct Mesh* editbmesh_get_eval_cage ( struct Depsgraph depsgraph,
struct Scene scene,
struct Object ,
struct BMEditMesh em,
const struct CustomData_MeshMasks dataMask 
)

◆ editbmesh_get_eval_cage_and_final()

struct Mesh* editbmesh_get_eval_cage_and_final ( struct Depsgraph depsgraph,
struct Scene scene,
struct Object ,
struct BMEditMesh em,
const struct CustomData_MeshMasks dataMask,
struct Mesh **  r_final 
)

◆ editbmesh_get_eval_cage_from_orig()

struct Mesh* editbmesh_get_eval_cage_from_orig ( struct Depsgraph depsgraph,
struct Scene scene,
struct Object obedit,
const struct CustomData_MeshMasks dataMask 
)

◆ editbmesh_modifier_is_enabled()

bool editbmesh_modifier_is_enabled ( struct Scene scene,
const struct Object ob,
struct ModifierData md,
bool  has_prev_mesh 
)

◆ editbmesh_vert_coords_alloc()

float(* editbmesh_vert_coords_alloc ( struct BMEditMesh em,
int *  r_vert_len 
) )[3]

◆ makeDerivedMesh()

void makeDerivedMesh ( struct Depsgraph depsgraph,
struct Scene scene,
struct Object ob,
struct BMEditMesh em,
const struct CustomData_MeshMasks dataMask 
)

◆ mesh_get_mapped_verts_coords()

void mesh_get_mapped_verts_coords ( struct Mesh me_eval,
float(*)  r_cos[3],
const int  totcos 
)