From 2646bbdccbea62d451391d3512b5a50457a95974 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Mon, 9 Sep 2013 02:11:44 +0000 Subject: move mesh evaluation functions (normal, mapping, smooth group... etc, calculations) into mesh_evaluate.c. mesh.c was over 4k lines and complex functions mixed in with general library management. --- source/blender/blenkernel/BKE_mesh.h | 326 +++++++++++++++++------------------ 1 file changed, 155 insertions(+), 171 deletions(-) (limited to 'source/blender/blenkernel/BKE_mesh.h') diff --git a/source/blender/blenkernel/BKE_mesh.h b/source/blender/blenkernel/BKE_mesh.h index 3d443cbe38c..43e425b5ce1 100644 --- a/source/blender/blenkernel/BKE_mesh.h +++ b/source/blender/blenkernel/BKE_mesh.h @@ -31,8 +31,6 @@ * \ingroup bke */ -/***/ - struct ID; struct BoundBox; struct DispList; @@ -60,108 +58,25 @@ struct UvVertMap; struct UvMapVert; struct UvElementMap; struct UvElement; + #ifdef __cplusplus extern "C" { #endif -struct BMesh *BKE_mesh_to_bmesh(struct Mesh *me, struct Object *ob); - -/* - * this function recreates a tessellation. - * returns number of tessellation faces. - * - * use_poly_origindex sets whether or not the tessellation faces' origindex - * layer should point to original poly indices or real poly indices. - * - * use_face_origindex sets the tessellation faces' origindex layer - * to point to the tessellation faces themselves, not the polys. - * - * if both of the above are 0, it'll use the indices of the mpolys of the MPoly - * data in pdata, and ignore the origindex layer altogether. - */ -int BKE_mesh_recalc_tessellation(struct CustomData *fdata, struct CustomData *ldata, struct CustomData *pdata, - struct MVert *mvert, - int totface, int totloop, int totpoly, - const bool do_face_normals); - -/* for forwards compat only quad->tri polys to mface, skip ngons. - */ -int BKE_mesh_mpoly_to_mface(struct CustomData *fdata, struct CustomData *ldata, - struct CustomData *pdata, int totface, int totloop, int totpoly); - -/*calculates a face normal.*/ -void BKE_mesh_calc_poly_normal(struct MPoly *mpoly, struct MLoop *loopstart, - struct MVert *mvarray, float no[3]); - -void BKE_mesh_calc_poly_normal_coords(struct MPoly *mpoly, struct MLoop *loopstart, - const float (*vertex_coords)[3], float no[3]); - -void BKE_mesh_calc_poly_center(struct MPoly *mpoly, struct MLoop *loopstart, - struct MVert *mvarray, float cent[3]); - -float BKE_mesh_calc_poly_area(struct MPoly *mpoly, struct MLoop *loopstart, - struct MVert *mvarray, const float polynormal[3]); - -void BKE_mesh_calc_poly_angles(struct MPoly *mpoly, struct MLoop *loopstart, - struct MVert *mvarray, float angles[]); -int *BKE_mesh_calc_smoothgroups(const struct MEdge *medge, const int totedge, - const struct MPoly *mpoly, const int totpoly, - const struct MLoop *mloop, const int totloop, - int *r_totgroup, const bool use_bitflags); +/* *** mesh.c *** */ -void BKE_mesh_calc_relative_deform( - const struct MPoly *mpoly, const int totpoly, - const struct MLoop *mloop, const int totvert, - - const float (*vert_cos_src)[3], - const float (*vert_cos_dst)[3], - - const float (*vert_cos_org)[3], - float (*vert_cos_new)[3]); +struct BMesh *BKE_mesh_to_bmesh(struct Mesh *me, struct Object *ob); -/* Find the index of the loop in 'poly' which references vertex, - * returns -1 if not found */ int poly_find_loop_from_vert(const struct MPoly *poly, const struct MLoop *loopstart, unsigned vert); -/* Fill 'adj_r' with the loop indices in 'poly' adjacent to the - * vertex. Returns the index of the loop matching vertex, or -1 if the - * vertex is not in 'poly' */ int poly_get_adj_loops_from_vert(unsigned adj_r[3], const struct MPoly *poly, const struct MLoop *mloop, unsigned vert); -/* Return the index of the edge vert that is not equal to 'v'. If - * neither edge vertex is equal to 'v', returns -1. */ int BKE_mesh_edge_other_vert(const struct MEdge *e, int v); -/* update the hide flag for edges and polys from the corresponding - * flag in verts */ -void BKE_mesh_flush_hidden_from_verts_ex(const struct MVert *mvert, - const struct MLoop *mloop, - struct MEdge *medge, const int totedge, - struct MPoly *mpoly, const int totpoly); -void BKE_mesh_flush_hidden_from_verts(struct Mesh *me); - -void BKE_mesh_flush_hidden_from_polys_ex(struct MVert *mvert, - const struct MLoop *mloop, - struct MEdge *medge, const int totedge, - const struct MPoly *mpoly, const int totpoly); -void BKE_mesh_flush_hidden_from_polys(struct Mesh *me); - - -void BKE_mesh_flush_select_from_polys_ex(struct MVert *mvert, const int totvert, - const struct MLoop *mloop, - struct MEdge *medge, const int totedge, - const struct MPoly *mpoly, const int totpoly); -void BKE_mesh_flush_select_from_polys(struct Mesh *me); -void BKE_mesh_flush_select_from_verts_ex(const struct MVert *mvert, const int totvert, - const struct MLoop *mloop, - struct MEdge *medge, const int totedge, - struct MPoly *mpoly, const int totpoly); -void BKE_mesh_flush_select_from_verts(struct Mesh *me); - void BKE_mesh_unlink(struct Mesh *me); void BKE_mesh_free(struct Mesh *me, int unlink); struct Mesh *BKE_mesh_add(struct Main *bmain, const char *name); @@ -191,64 +106,92 @@ void BKE_mesh_to_curve(struct Scene *scene, struct Object *ob); void BKE_mesh_material_index_remove(struct Mesh *me, short index); void BKE_mesh_material_index_clear(struct Mesh *me); void BKE_mesh_smooth_flag_set(struct Object *meshOb, int enableSmooth); -void BKE_mesh_convert_mfaces_to_mpolys(struct Mesh *mesh); -void BKE_mesh_do_versions_convert_mfaces_to_mpolys(struct Mesh *mesh); -void BKE_mesh_convert_mfaces_to_mpolys_ex(struct ID *id, - struct CustomData *fdata, struct CustomData *ldata, struct CustomData *pdata, - int totedge_i, int totface_i, int totloop_i, int totpoly_i, - struct MEdge *medge, struct MFace *mface, - int *totloop_r, int *totpoly_r, - struct MLoop **mloop_r, struct MPoly **mpoly_r); - -void BKE_mesh_calc_normals_tessface(struct MVert *mverts, int numVerts, struct MFace *mfaces, int numFaces, float (*faceNors_r)[3]); - -/* used for unit testing; compares two meshes, checking only - * differences we care about. should be usable with leaf's - * testing framework I get RNA work done, will use hackish - * testing code for now.*/ + const char *BKE_mesh_cmp(struct Mesh *me1, struct Mesh *me2, float thresh); struct BoundBox *BKE_mesh_boundbox_get(struct Object *ob); void BKE_mesh_texspace_get(struct Mesh *me, float r_loc[3], float r_rot[3], float r_size[3]); void BKE_mesh_texspace_copy_from_object(struct Mesh *me, struct Object *ob); -/* if old, it converts mface->edcode to edge drawflags */ -void BKE_mesh_make_edges(struct Mesh *me, const bool use_old); +float (*BKE_mesh_vertexCos_get(struct Mesh *me, int *r_numVerts))[3]; -void BKE_mesh_strip_loose_faces(struct Mesh *me); /* Needed for compatibility (some old read code). */ -void BKE_mesh_strip_loose_polysloops(struct Mesh *me); -void BKE_mesh_strip_loose_edges(struct Mesh *me); +/* vertex level transformations & checks (no derived mesh) */ + +bool BKE_mesh_minmax(struct Mesh *me, float r_min[3], float r_max[3]); +void BKE_mesh_translate(struct Mesh *me, const float offset[3], const bool do_keys); + +void BKE_mesh_ensure_navmesh(struct Mesh *me); + +void BKE_mesh_tessface_calc(struct Mesh *mesh); +void BKE_mesh_tessface_ensure(struct Mesh *mesh); +void BKE_mesh_tessface_clear(struct Mesh *mesh); + +void BKE_mesh_do_versions_cd_flag_init(struct Mesh *mesh); + + +void BKE_mesh_mselect_clear(struct Mesh *me); +void BKE_mesh_mselect_validate(struct Mesh *me); +int BKE_mesh_mselect_find(struct Mesh *me, int index, int type); +int BKE_mesh_mselect_active_get(struct Mesh *me, int type); +void BKE_mesh_mselect_active_set(struct Mesh *me, int index, int type); + + + +/* *** mesh_evaluate.c *** */ -/* Calculate vertex and face normals, face normals are returned in *faceNors_r if non-NULL - * and vertex normals are stored in actual mverts. - */ void BKE_mesh_calc_normals_mapping( struct MVert *mverts, int numVerts, struct MLoop *mloop, struct MPoly *mpolys, int numLoops, int numPolys, float (*polyNors_r)[3], struct MFace *mfaces, int numFaces, int *origIndexFace, float (*faceNors_r)[3]); -/* extended version of 'BKE_mesh_calc_normals_poly' with option not to calc vertex normals */ void BKE_mesh_calc_normals_mapping_ex( struct MVert *mverts, int numVerts, struct MLoop *mloop, struct MPoly *mpolys, int numLoops, int numPolys, float (*polyNors_r)[3], struct MFace *mfaces, int numFaces, int *origIndexFace, float (*faceNors_r)[3], const bool only_face_normals); - void BKE_mesh_calc_normals_poly( struct MVert *mverts, int numVerts, struct MLoop *mloop, struct MPoly *mpolys, int numLoops, int numPolys, float (*polyNors_r)[3], const bool only_face_normals); - void BKE_mesh_calc_normals(struct Mesh *me); +void BKE_mesh_calc_normals_tessface( + struct MVert *mverts, int numVerts, + struct MFace *mfaces, int numFaces, + float (*faceNors_r)[3]); + + +void BKE_mesh_calc_poly_normal( + struct MPoly *mpoly, struct MLoop *loopstart, + struct MVert *mvarray, float no[3]); +void BKE_mesh_calc_poly_normal_coords( + struct MPoly *mpoly, struct MLoop *loopstart, + const float (*vertex_coords)[3], float no[3]); +void BKE_mesh_calc_poly_center( + struct MPoly *mpoly, struct MLoop *loopstart, + struct MVert *mvarray, float cent[3]); +float BKE_mesh_calc_poly_area( + struct MPoly *mpoly, struct MLoop *loopstart, + struct MVert *mvarray, const float polynormal[3]); +void BKE_mesh_calc_poly_angles( + struct MPoly *mpoly, struct MLoop *loopstart, + struct MVert *mvarray, float angles[]); + +void BKE_mesh_poly_edgehash_insert( + struct EdgeHash *ehash, + const struct MPoly *mp, const struct MLoop *mloop); +void BKE_mesh_poly_edgebitmap_insert( + unsigned int *edge_bitmap, + const struct MPoly *mp, const struct MLoop *mloop); + + +bool BKE_mesh_center_median(struct Mesh *me, float cent[3]); +bool BKE_mesh_center_bounds(struct Mesh *me, float cent[3]); +bool BKE_mesh_center_centroid(struct Mesh *me, float cent[3]); -/* Return a newly MEM_malloc'd array of all the mesh vertex locations - * (_numVerts_r_ may be NULL) */ -float (*BKE_mesh_vertexCos_get(struct Mesh *me, int *r_numVerts))[3]; /* map from uv vertex to face (for select linked, stitch, uv suburf) */ /* UvVertMap */ - #define STD_UV_CONNECT_LIMIT 0.0001f typedef struct UvVertMap { @@ -302,45 +245,107 @@ typedef struct UvElementMap { * to make that many islands, he can bite me :p */ #define INVALID_ISLAND 0xFFFF -UvVertMap *BKE_mesh_uv_vert_map_create(struct MPoly *mpoly, struct MLoop *mloop, struct MLoopUV *mloopuv, - unsigned int totpoly, unsigned int totvert, int selected, float *limit); -UvMapVert *BKE_mesh_uv_vert_map_get_vert(UvVertMap *vmap, unsigned int v); -void BKE_mesh_uv_vert_map_free(UvVertMap *vmap); - /* Connectivity data */ typedef struct MeshElemMap { int *indices; int count; } MeshElemMap; - -typedef struct IndexNode { - struct IndexNode *next, *prev; - int index; -} IndexNode; -void BKE_mesh_vert_poly_map_create(MeshElemMap **r_map, int **r_mem, - const struct MPoly *mface, const struct MLoop *mloop, - int totvert, int totface, int totloop); +/* mapping */ +UvVertMap *BKE_mesh_uv_vert_map_create( + struct MPoly *mpoly, struct MLoop *mloop, struct MLoopUV *mloopuv, + unsigned int totpoly, unsigned int totvert, int selected, float *limit); +UvMapVert *BKE_mesh_uv_vert_map_get_vert(UvVertMap *vmap, unsigned int v); +void BKE_mesh_uv_vert_map_free(UvVertMap *vmap); -void BKE_mesh_vert_edge_map_create(MeshElemMap **r_map, int **r_mem, - const struct MEdge *medge, int totvert, int totedge); +void BKE_mesh_vert_poly_map_create( + MeshElemMap **r_map, int **r_mem, + const struct MPoly *mface, const struct MLoop *mloop, + int totvert, int totface, int totloop); +void BKE_mesh_vert_edge_map_create( + MeshElemMap **r_map, int **r_mem, + const struct MEdge *medge, int totvert, int totedge); +void BKE_mesh_edge_poly_map_create( + MeshElemMap **r_map, int **r_mem, + const struct MEdge *medge, const int totedge, + const struct MPoly *mpoly, const int totpoly, + const struct MLoop *mloop, const int totloop); + +/* tessface */ +void BKE_mesh_loops_to_mface_corners( + struct CustomData *fdata, struct CustomData *ldata, + struct CustomData *pdata, int lindex[4], int findex, + const int polyindex, const int mf_len, + const int numTex, const int numCol, + const bool hasPCol, const bool hasOrigSpace); +int BKE_mesh_recalc_tessellation( + struct CustomData *fdata, struct CustomData *ldata, struct CustomData *pdata, + struct MVert *mvert, + int totface, int totloop, int totpoly, + const bool do_face_normals); +int BKE_mesh_mpoly_to_mface( + struct CustomData *fdata, struct CustomData *ldata, + struct CustomData *pdata, int totface, int totloop, int totpoly); +void BKE_mesh_convert_mfaces_to_mpolys(struct Mesh *mesh); +void BKE_mesh_do_versions_convert_mfaces_to_mpolys(struct Mesh *mesh); +void BKE_mesh_convert_mfaces_to_mpolys_ex( + struct ID *id, + struct CustomData *fdata, struct CustomData *ldata, struct CustomData *pdata, + int totedge_i, int totface_i, int totloop_i, int totpoly_i, + struct MEdge *medge, struct MFace *mface, + int *totloop_r, int *totpoly_r, + struct MLoop **mloop_r, struct MPoly **mpoly_r); + +/* flush flags */ +void BKE_mesh_flush_hidden_from_verts_ex( + const struct MVert *mvert, + const struct MLoop *mloop, + struct MEdge *medge, const int totedge, + struct MPoly *mpoly, const int totpoly); +void BKE_mesh_flush_hidden_from_verts(struct Mesh *me); +void BKE_mesh_flush_hidden_from_polys_ex( + struct MVert *mvert, + const struct MLoop *mloop, + struct MEdge *medge, const int totedge, + const struct MPoly *mpoly, const int totpoly); +void BKE_mesh_flush_hidden_from_polys(struct Mesh *me); +void BKE_mesh_flush_select_from_polys_ex( + struct MVert *mvert, const int totvert, + const struct MLoop *mloop, + struct MEdge *medge, const int totedge, + const struct MPoly *mpoly, const int totpoly); +void BKE_mesh_flush_select_from_polys(struct Mesh *me); +void BKE_mesh_flush_select_from_verts_ex( + const struct MVert *mvert, const int totvert, + const struct MLoop *mloop, + struct MEdge *medge, const int totedge, + struct MPoly *mpoly, const int totpoly); +void BKE_mesh_flush_select_from_verts(struct Mesh *me); -void BKE_mesh_edge_poly_map_create(MeshElemMap **r_map, int **r_mem, - const struct MEdge *medge, const int totedge, - const struct MPoly *mpoly, const int totpoly, - const struct MLoop *mloop, const int totloop); +/* smoothgroups */ +int *BKE_mesh_calc_smoothgroups( + const struct MEdge *medge, const int totedge, + const struct MPoly *mpoly, const int totpoly, + const struct MLoop *mloop, const int totloop, + int *r_totgroup, const bool use_bitflags); + +/* spatial evaluation */ +void BKE_mesh_calc_relative_deform( + const struct MPoly *mpoly, const int totpoly, + const struct MLoop *mloop, const int totvert, + + const float (*vert_cos_src)[3], + const float (*vert_cos_dst)[3], + + const float (*vert_cos_org)[3], + float (*vert_cos_new)[3]); -/* vertex level transformations & checks (no derived mesh) */ -bool BKE_mesh_minmax(struct Mesh *me, float r_min[3], float r_max[3]); -bool BKE_mesh_center_median(struct Mesh *me, float cent[3]); -bool BKE_mesh_center_bounds(struct Mesh *me, float cent[3]); -bool BKE_mesh_center_centroid(struct Mesh *me, float cent[3]); -void BKE_mesh_translate(struct Mesh *me, const float offset[3], const bool do_keys); -/* mesh_validate.c */ -/* XXX Loop v/e are unsigned, so using max uint_32 value as invalid marker... */ -#define INVALID_LOOP_EDGE_MARKER 4294967295u +/* *** mesh_validate.c *** */ + +int BKE_mesh_validate(struct Mesh *me, const int do_verbose); + bool BKE_mesh_validate_arrays( struct Mesh *me, struct MVert *mverts, unsigned int totvert, @@ -359,34 +364,13 @@ bool BKE_mesh_validate_all_customdata( const bool do_verbose, const bool do_fixes, bool *r_change); -int BKE_mesh_validate(struct Mesh *me, const int do_verbose); +void BKE_mesh_strip_loose_faces(struct Mesh *me); +void BKE_mesh_strip_loose_polysloops(struct Mesh *me); +void BKE_mesh_strip_loose_edges(struct Mesh *me); +void BKE_mesh_calc_edges_legacy(struct Mesh *me, const bool use_old); void BKE_mesh_calc_edges(struct Mesh *mesh, bool update, const bool select); -void BKE_mesh_ensure_navmesh(struct Mesh *me); - -void BKE_mesh_tessface_calc(struct Mesh *mesh); -void BKE_mesh_tessface_ensure(struct Mesh *mesh); -void BKE_mesh_tessface_clear(struct Mesh *mesh); - -/* Convert a triangle or quadrangle of loop/poly data to tessface data */ -void BKE_mesh_loops_to_mface_corners(struct CustomData *fdata, struct CustomData *ldata, - struct CustomData *pdata, int lindex[4], int findex, - const int polyindex, const int mf_len, - const int numTex, const int numCol, const int hasPCol, const int hasOrigSpace); - -void BKE_mesh_poly_edgehash_insert(struct EdgeHash *ehash, const struct MPoly *mp, const struct MLoop *mloop); -void BKE_mesh_poly_edgebitmap_insert(unsigned int *edge_bitmap, const struct MPoly *mp, const struct MLoop *mloop); - -void BKE_mesh_do_versions_cd_flag_init(struct Mesh *mesh); - - -void BKE_mesh_mselect_clear(struct Mesh *me); -void BKE_mesh_mselect_validate(struct Mesh *me); -int BKE_mesh_mselect_find(struct Mesh *me, int index, int type); -int BKE_mesh_mselect_active_get(struct Mesh *me, int type); -void BKE_mesh_mselect_active_set(struct Mesh *me, int index, int type); - #ifdef __cplusplus } #endif -- cgit v1.2.3