diff options
Diffstat (limited to 'source/blender/blenkernel/BKE_mesh.h')
-rw-r--r-- | source/blender/blenkernel/BKE_mesh.h | 125 |
1 files changed, 97 insertions, 28 deletions
diff --git a/source/blender/blenkernel/BKE_mesh.h b/source/blender/blenkernel/BKE_mesh.h index ba6bf330b1e..39e5a32404e 100644 --- a/source/blender/blenkernel/BKE_mesh.h +++ b/source/blender/blenkernel/BKE_mesh.h @@ -36,7 +36,8 @@ struct BoundBox; struct DispList; struct ListBase; -struct EditMesh; +struct BMEditMesh; +struct BMesh; struct Mesh; struct MPoly; struct MLoop; @@ -60,19 +61,50 @@ struct UvElement; extern "C" { #endif -struct EditMesh *BKE_mesh_get_editmesh(struct Mesh *me); -void BKE_mesh_end_editmesh(struct Mesh *me, struct EditMesh *em); +struct BMesh *BKE_mesh_to_bmesh(struct Mesh *me, struct Object *ob); + +/* + * this function recreates a tesselation. + * returns number of tesselation faces. + * + * use_poly_origindex sets whether or not the tesselation faces' origindex + * layer should point to original poly indices or real poly indices. + * + * use_face_origindex sets the tesselation faces' origindex layer + * to point to the tesselation 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 mesh_recalcTesselation(struct CustomData *fdata, struct CustomData *ldata, struct CustomData *pdata, + struct MVert *mvert, + int totface, int totloop, int totpoly, + const int do_face_normals); /* for forwards compat only quad->tri polys to mface, skip ngons. */ int mesh_mpoly_to_mface(struct CustomData *fdata, struct CustomData *ldata, struct CustomData *pdata, int totface, int totloop, int totpoly); +/*calculates a face normal.*/ +void mesh_calc_poly_normal(struct MPoly *mpoly, struct MLoop *loopstart, + struct MVert *mvarray, float no[3]); + +void mesh_calc_poly_normal_coords(struct MPoly *mpoly, struct MLoop *loopstart, + const float (*vertex_coords)[3], float no[3]); + +void mesh_calc_poly_center(struct MPoly *mpoly, struct MLoop *loopstart, + struct MVert *mvarray, float cent[3]); + +float mesh_calc_poly_area(struct MPoly *mpoly, struct MLoop *loopstart, + struct MVert *mvarray, float polynormal[3]); + void unlink_mesh(struct Mesh *me); -void free_mesh(struct Mesh *me); +void free_mesh(struct Mesh *me, int unlink); struct Mesh *add_mesh(const char *name); struct Mesh *copy_mesh(struct Mesh *me); -void mesh_update_customdata_pointers(struct Mesh *me); +void mesh_update_customdata_pointers(struct Mesh *me, const short do_ensure_tess_cd); + void make_local_mesh(struct Mesh *me); void boundbox_mesh(struct Mesh *me, float *loc, float *size); void tex_space_mesh(struct Mesh *me); @@ -82,17 +114,26 @@ int test_index_face(struct MFace *mface, struct CustomData *mfdata, int mfindex, struct Mesh *get_mesh(struct Object *ob); void set_mesh(struct Object *ob, struct Mesh *me); void mball_to_mesh(struct ListBase *lb, struct Mesh *me); -int nurbs_to_mdata(struct Object *ob, struct MVert **allvert, int *_totvert, - struct MEdge **alledge, int *_totedge, struct MFace **allface, int *_totface); -int nurbs_to_mdata_customdb(struct Object *ob, struct ListBase *dispbase, - struct MVert **allvert, int *_totvert, struct MEdge **alledge, int *_totedge, - struct MFace **allface, int *_totface); +int nurbs_to_mdata(struct Object *ob, struct MVert **allvert, int *totvert, + struct MEdge **alledge, int *totedge, struct MLoop **allloop, struct MPoly **allpoly, + int *totloop, int *totpoly); +int nurbs_to_mdata_customdb(struct Object *ob, struct ListBase *dispbase, struct MVert **allvert, int *_totvert, + struct MEdge **alledge, int *_totedge, struct MLoop **allloop, struct MPoly **allpoly, + int *_totloop, int *_totpoly); void nurbs_to_mesh(struct Object *ob); void mesh_to_curve(struct Scene *scene, struct Object *ob); void free_dverts(struct MDeformVert *dvert, int totvert); void copy_dverts(struct MDeformVert *dst, struct MDeformVert *src, int totvert); /* __NLA */ void mesh_delete_material_index(struct Mesh *me, short index); void mesh_set_smooth_flag(struct Object *meshOb, int enableSmooth); +void convert_mfaces_to_mpolys(struct Mesh *mesh); +void 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 *mesh_cmp(struct Mesh *me1, struct Mesh *me2, float thresh); struct BoundBox *mesh_get_bb(struct Object *ob); void mesh_get_texspace(struct Mesh *me, float *loc_r, float *rot_r, float *size_r); @@ -106,7 +147,21 @@ void mesh_strip_loose_edges(struct Mesh *me); /* Calculate vertex and face normals, face normals are returned in *faceNors_r if non-NULL * and vertex normals are stored in actual mverts. */ -void mesh_calc_normals(struct MVert *mverts, int numVerts, struct MFace *mfaces, int numFaces, float (*faceNors_r)[3]); +void 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 'mesh_calc_normals' with option not to calc vertex normals */ +void 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 short only_face_normals); + +void mesh_calc_normals( + struct MVert *mverts, int numVerts, + struct MLoop *mloop, struct MPoly *mpolys, + int numLoops, int numPolys, float (*polyNors_r)[3]); /* Return a newly MEM_malloc'd array of all the mesh vertex locations * (_numVerts_r_ may be NULL) */ @@ -129,24 +184,14 @@ typedef struct UvMapVert { unsigned char tfindex, separate, flag; } UvMapVert; -typedef struct UvElementMap { - /* address UvElements by their vertex */ - struct UvElement **vert; - /* UvElement Store */ - struct UvElement *buf; - /* Total number of UVs in the layer. Useful to know */ - int totalUVs; - /* Number of Islands in the mesh */ - int totalIslands; - /* Stores the starting index in buf where each island begins */ - int *islandIndices; -} UvElementMap; - +/* UvElement stores per uv information so that we can quickly access information for a uv. + * it is actually an improved UvMapVert, including an island and a direct pointer to the face + * to avoid initialising face arrays */ typedef struct UvElement { /* Next UvElement corresponding to same vertex */ struct UvElement *next; /* Face the element belongs to */ - struct EditFace *face; + struct BMFace *face; /* Index in the editFace of the uv */ unsigned char tfindex; /* Whether this element is the first of coincident elements */ @@ -157,12 +202,29 @@ typedef struct UvElement { unsigned short island; } UvElement; + +/* UvElementMap is a container for UvElements of a mesh. It stores some UvElements belonging to the + * same uv island in sequence and the number of uvs per island so it is possible to access all uvs + * belonging to an island directly by iterating through the buffer. + */ +typedef struct UvElementMap { + /* address UvElements by their vertex */ + struct UvElement **vert; + /* UvElement Store */ + struct UvElement *buf; + /* Total number of UVs in the layer. Useful to know */ + int totalUVs; + /* Number of Islands in the mesh */ + int totalIslands; + /* Stores the starting index in buf where each island begins */ + int *islandIndices; +} UvElementMap; + /* invalid island index is max short. If any one has the patience * to make that many islands, he can bite me :p */ #define INVALID_ISLAND 0xFFFF - -UvVertMap *make_uv_vert_map(struct MFace *mface, struct MTFace *tface, unsigned int totface, unsigned int totvert, int selected, float *limit); +UvVertMap *make_uv_vert_map(struct MPoly *mpoly, struct MLoop *mloop, struct MLoopUV *mloopuv, unsigned int totpoly, unsigned int totvert, int selected, float *limit); UvMapVert *get_uv_map_vert(UvVertMap *vmap, unsigned int v); void free_uv_vert_map(UvVertMap *vmap); @@ -171,6 +233,9 @@ typedef struct IndexNode { struct IndexNode *next, *prev; int index; } IndexNode; +void create_vert_poly_map(struct ListBase **map, IndexNode **mem, + struct MPoly *mface, struct MLoop *mloop, + const int totvert, const int totface, const int totloop); void create_vert_face_map(struct ListBase **map, IndexNode **mem, const struct MFace *mface, const int totvert, const int totface); void create_vert_edge_map(struct ListBase **map, IndexNode **mem, const struct MEdge *medge, @@ -203,11 +268,15 @@ void BKE_mesh_calc_edges(struct Mesh *mesh, int update); 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 of loop facedata to mface facedata*/ void 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 hasWCol); + const int numTex, const int numCol, const int hasWCol, const int hasOrigSpace); #ifdef __cplusplus } |