diff options
Diffstat (limited to 'source/blender/blenkernel')
-rw-r--r-- | source/blender/blenkernel/BKE_mesh.h | 84 | ||||
-rw-r--r-- | source/blender/blenkernel/BKE_pbvh.h | 5 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/mesh.c | 66 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/mesh_evaluate.c | 252 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/pbvh.c | 21 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/pbvh_intern.h | 2 |
6 files changed, 235 insertions, 195 deletions
diff --git a/source/blender/blenkernel/BKE_mesh.h b/source/blender/blenkernel/BKE_mesh.h index 287152baf0a..1ff2c6bc862 100644 --- a/source/blender/blenkernel/BKE_mesh.h +++ b/source/blender/blenkernel/BKE_mesh.h @@ -71,11 +71,11 @@ struct BMesh *BKE_mesh_to_bmesh(struct Mesh *me, struct Object *ob); int poly_find_loop_from_vert( const struct MPoly *poly, - const struct MLoop *loopstart, - unsigned vert); + const struct MLoop *loopstart, unsigned vert); int poly_get_adj_loops_from_vert( - unsigned r_adj[2], const struct MPoly *poly, - const struct MLoop *mloop, unsigned vert); + const struct MPoly *poly, + const struct MLoop *mloop, unsigned int vert, + unsigned int r_adj[2]); int BKE_mesh_edge_other_vert(const struct MEdge *e, int v); @@ -96,12 +96,16 @@ int test_index_face(struct MFace *mface, struct CustomData *mfdata, int mfindex, struct Mesh *BKE_mesh_from_object(struct Object *ob); void BKE_mesh_assign_object(struct Object *ob, struct Mesh *me); void BKE_mesh_from_metaball(struct ListBase *lb, struct Mesh *me); -int BKE_mesh_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 BKE_mesh_nurbs_displist_to_mdata(struct Object *ob, struct ListBase *dispbase, struct MVert **allvert, int *_totvert, - struct MEdge **alledge, int *_totedge, struct MLoop **allloop, struct MPoly **allpoly, - struct MLoopUV **alluv, int *_totloop, int *_totpoly); +int BKE_mesh_nurbs_to_mdata( + struct Object *ob, struct MVert **r_allvert, int *r_totvert, + struct MEdge **r_alledge, int *r_totedge, struct MLoop **r_allloop, struct MPoly **r_allpoly, + int *r_totloop, int *r_totpoly); +int BKE_mesh_nurbs_displist_to_mdata( + struct Object *ob, const struct ListBase *dispbase, + struct MVert **r_allvert, int *r_totvert, + struct MEdge **r_alledge, int *r_totedge, + struct MLoop **r_allloop, struct MPoly **r_allpoly, + struct MLoopUV **r_alluv, int *r_totloop, int *r_totpoly); void BKE_mesh_from_nurbs_displist(struct Object *ob, struct ListBase *dispbase, const bool use_orco_uv); void BKE_mesh_from_nurbs(struct Object *ob); void BKE_mesh_to_curve_nurblist(struct DerivedMesh *dm, struct ListBase *nurblist, const int edge_users_test); @@ -131,7 +135,7 @@ struct Mesh *BKE_mesh_new_from_object(struct Main *bmain, struct Scene *sce, str /* 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_minmax(const struct Mesh *me, float r_min[3], float r_max[3]); void BKE_mesh_transform(struct Mesh *me, float mat[4][4], bool do_keys); void BKE_mesh_translate(struct Mesh *me, const float offset[3], const bool do_keys); @@ -156,26 +160,28 @@ void BKE_mesh_mselect_active_set(struct Mesh *me, int index, int type); void BKE_mesh_calc_normals_mapping( struct MVert *mverts, int numVerts, - struct MLoop *mloop, struct MPoly *mpolys, int numLoops, int numPolys, float (*r_polyNors)[3], - struct MFace *mfaces, int numFaces, const int *origIndexFace, float (*r_faceNors)[3]); + const struct MLoop *mloop, const struct MPoly *mpolys, int numLoops, int numPolys, float (*r_polyNors)[3], + const struct MFace *mfaces, int numFaces, const int *origIndexFace, float (*r_faceNors)[3]); void BKE_mesh_calc_normals_mapping_ex( struct MVert *mverts, int numVerts, - struct MLoop *mloop, struct MPoly *mpolys, int numLoops, int numPolys, float (*r_polyNors)[3], - struct MFace *mfaces, int numFaces, const int *origIndexFace, float (*r_faceNors)[3], + const struct MLoop *mloop, const struct MPoly *mpolys, + int numLoops, int numPolys, float (*r_polyNors)[3], + const struct MFace *mfaces, int numFaces, const int *origIndexFace, float (*r_faceNors)[3], const bool only_face_normals); void BKE_mesh_calc_normals_poly( struct MVert *mverts, int numVerts, - struct MLoop *mloop, struct MPoly *mpolys, + const struct MLoop *mloop, const struct MPoly *mpolys, int numLoops, int numPolys, float (*r_polyNors)[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, + const struct MFace *mfaces, int numFaces, float (*r_faceNors)[3]); void BKE_mesh_loop_tangents_ex( - struct MVert *mverts, const int numVerts, struct MLoop *mloops, float (*r_looptangent)[4], float (*loopnors)[3], - struct MLoopUV *loopuv, const int numLoops, struct MPoly *mpolys, const int numPolys, + const struct MVert *mverts, const int numVerts, const struct MLoop *mloops, + float (*r_looptangent)[4], float (*loopnors)[3], const struct MLoopUV *loopuv, + const int numLoops, const struct MPoly *mpolys, const int numPolys, struct ReportList *reports); void BKE_mesh_loop_tangents( struct Mesh *mesh, const char *uvmap, float (*r_looptangents)[4], struct ReportList *reports); @@ -213,38 +219,39 @@ void BKE_lnor_space_custom_normal_to_data(MLoopNorSpace *lnor_space, const float bool BKE_mesh_has_custom_loop_normals(struct Mesh *me); -void BKE_mesh_normals_loop_split(struct MVert *mverts, const int numVerts, struct MEdge *medges, const int numEdges, +void BKE_mesh_normals_loop_split( + const struct MVert *mverts, const int numVerts, struct MEdge *medges, const int numEdges, struct MLoop *mloops, float (*r_loopnors)[3], const int numLoops, struct MPoly *mpolys, const float (*polynors)[3], const int numPolys, const bool use_split_normals, float split_angle, MLoopNorSpaceArray *r_lnors_spacearr, short (*clnors_data)[2], int *r_loop_to_poly); void BKE_mesh_normals_loop_custom_set( - struct MVert *mverts, const int numVerts, struct MEdge *medges, const int numEdges, + const struct MVert *mverts, const int numVerts, struct MEdge *medges, const int numEdges, struct MLoop *mloops, float (*custom_loopnors)[3], const int numLoops, struct MPoly *mpolys, const float (*polynors)[3], const int numPolys, short (*r_clnors_data)[2]); void BKE_mesh_normals_loop_custom_from_vertices_set( - struct MVert *mverts, float (*custom_vertnors)[3], const int numVerts, + const struct MVert *mverts, float (*custom_vertnors)[3], const int numVerts, struct MEdge *medges, const int numEdges, struct MLoop *mloops, const int numLoops, struct MPoly *mpolys, const float (*polynors)[3], const int numPolys, short (*r_clnors_data)[2]); void BKE_mesh_calc_poly_normal( - struct MPoly *mpoly, struct MLoop *loopstart, - struct MVert *mvarray, float no[3]); + const struct MPoly *mpoly, const struct MLoop *loopstart, + const struct MVert *mvarray, float r_no[3]); void BKE_mesh_calc_poly_normal_coords( - struct MPoly *mpoly, struct MLoop *loopstart, - const float (*vertex_coords)[3], float no[3]); + const struct MPoly *mpoly, const struct MLoop *loopstart, + const float (*vertex_coords)[3], float r_no[3]); void BKE_mesh_calc_poly_center( - struct MPoly *mpoly, struct MLoop *loopstart, - struct MVert *mvarray, float cent[3]); + const struct MPoly *mpoly, const struct MLoop *loopstart, + const struct MVert *mvarray, float r_cent[3]); float BKE_mesh_calc_poly_area( - struct MPoly *mpoly, struct MLoop *loopstart, - struct MVert *mvarray); + const struct MPoly *mpoly, const struct MLoop *loopstart, + const struct MVert *mvarray); void BKE_mesh_calc_poly_angles( - struct MPoly *mpoly, struct MLoop *loopstart, - struct MVert *mvarray, float angles[]); + const struct MPoly *mpoly, const struct MLoop *loopstart, + const struct MVert *mvarray, float angles[]); void BKE_mesh_poly_edgehash_insert( struct EdgeHash *ehash, @@ -254,13 +261,14 @@ void BKE_mesh_poly_edgebitmap_insert( 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]); +bool BKE_mesh_center_median(const struct Mesh *me, float r_cent[3]); +bool BKE_mesh_center_bounds(const struct Mesh *me, float r_cent[3]); +bool BKE_mesh_center_centroid(const struct Mesh *me, float r_cent[3]); -void BKE_mesh_calc_volume(struct MVert *mverts, int numVerts, - struct MFace *mfaces, int numFaces, - float *r_vol, float *r_com); +void BKE_mesh_calc_volume( + const struct MVert *mverts, const int numVerts, + const struct MFace *mfaces, const int numFaces, + float *r_vol, float *r_com); /* tessface */ void BKE_mesh_loops_to_mface_corners( diff --git a/source/blender/blenkernel/BKE_pbvh.h b/source/blender/blenkernel/BKE_pbvh.h index 227994b73ee..9cefdd4f28e 100644 --- a/source/blender/blenkernel/BKE_pbvh.h +++ b/source/blender/blenkernel/BKE_pbvh.h @@ -59,8 +59,9 @@ typedef void (*BKE_pbvh_HitOccludedCallback)(PBVHNode *node, void *data, float * /* Building */ PBVH *BKE_pbvh_new(void); -void BKE_pbvh_build_mesh(PBVH *bvh, struct MFace *faces, struct MVert *verts, - int totface, int totvert, struct CustomData *vdata); +void BKE_pbvh_build_mesh( + PBVH *bvh, const struct MFace *faces, struct MVert *verts, + int totface, int totvert, struct CustomData *vdata); void BKE_pbvh_build_grids(PBVH *bvh, struct CCGElem **grid_elems, int totgrid, struct CCGKey *key, void **gridfaces, struct DMFlagMat *flagmats, diff --git a/source/blender/blenkernel/intern/mesh.c b/source/blender/blenkernel/intern/mesh.c index 37a98eae58b..f7bedc3c9f9 100644 --- a/source/blender/blenkernel/intern/mesh.c +++ b/source/blender/blenkernel/intern/mesh.c @@ -1175,9 +1175,10 @@ static void make_edges_mdata_extend(MEdge **r_alledge, int *r_totedge, /* Initialize mverts, medges and, faces for converting nurbs to mesh and derived mesh */ /* return non-zero on error */ -int BKE_mesh_nurbs_to_mdata(Object *ob, MVert **allvert, int *totvert, - MEdge **alledge, int *totedge, MLoop **allloop, MPoly **allpoly, - int *totloop, int *totpoly) +int BKE_mesh_nurbs_to_mdata( + Object *ob, MVert **r_allvert, int *r_totvert, + MEdge **r_alledge, int *r_totedge, MLoop **r_allloop, MPoly **r_allpoly, + int *r_totloop, int *r_totpoly) { ListBase disp = {NULL, NULL}; @@ -1185,11 +1186,12 @@ int BKE_mesh_nurbs_to_mdata(Object *ob, MVert **allvert, int *totvert, disp = ob->curve_cache->disp; } - return BKE_mesh_nurbs_displist_to_mdata(ob, &disp, - allvert, totvert, - alledge, totedge, - allloop, allpoly, NULL, - totloop, totpoly); + return BKE_mesh_nurbs_displist_to_mdata( + ob, &disp, + r_allvert, r_totvert, + r_alledge, r_totedge, + r_allloop, r_allpoly, NULL, + r_totloop, r_totpoly); } /* BMESH: this doesn't calculate all edges from polygons, @@ -1197,12 +1199,13 @@ int BKE_mesh_nurbs_to_mdata(Object *ob, MVert **allvert, int *totvert, /* Initialize mverts, medges and, faces for converting nurbs to mesh and derived mesh */ /* use specified dispbase */ -int BKE_mesh_nurbs_displist_to_mdata(Object *ob, ListBase *dispbase, - MVert **allvert, int *_totvert, - MEdge **alledge, int *_totedge, - MLoop **allloop, MPoly **allpoly, - MLoopUV **alluv, - int *_totloop, int *_totpoly) +int BKE_mesh_nurbs_displist_to_mdata( + Object *ob, const ListBase *dispbase, + MVert **r_allvert, int *r_totvert, + MEdge **r_alledge, int *r_totedge, + MLoop **r_allloop, MPoly **r_allpoly, + MLoopUV **r_alluv, + int *r_totloop, int *r_totpoly) { Curve *cu = ob->data; DispList *dl; @@ -1253,13 +1256,13 @@ int BKE_mesh_nurbs_displist_to_mdata(Object *ob, ListBase *dispbase, return -1; } - *allvert = mvert = MEM_callocN(sizeof(MVert) * totvert, "nurbs_init mvert"); - *alledge = medge = MEM_callocN(sizeof(MEdge) * totedge, "nurbs_init medge"); - *allloop = mloop = MEM_callocN(sizeof(MLoop) * totvlak * 4, "nurbs_init mloop"); // totloop - *allpoly = mpoly = MEM_callocN(sizeof(MPoly) * totvlak, "nurbs_init mloop"); + *r_allvert = mvert = MEM_callocN(sizeof(MVert) * totvert, "nurbs_init mvert"); + *r_alledge = medge = MEM_callocN(sizeof(MEdge) * totedge, "nurbs_init medge"); + *r_allloop = mloop = MEM_callocN(sizeof(MLoop) * totvlak * 4, "nurbs_init mloop"); // totloop + *r_allpoly = mpoly = MEM_callocN(sizeof(MPoly) * totvlak, "nurbs_init mloop"); - if (alluv) - *alluv = mloopuv = MEM_callocN(sizeof(MLoopUV) * totvlak * 4, "nurbs_init mloopuv"); + if (r_alluv) + *r_alluv = mloopuv = MEM_callocN(sizeof(MLoopUV) * totvlak * 4, "nurbs_init mloopuv"); /* verts and faces */ vertcount = 0; @@ -1332,7 +1335,7 @@ int BKE_mesh_nurbs_displist_to_mdata(Object *ob, ListBase *dispbase, mloop[0].v = startvert + index[0]; mloop[1].v = startvert + index[2]; mloop[2].v = startvert + index[1]; - mpoly->loopstart = (int)(mloop - (*allloop)); + mpoly->loopstart = (int)(mloop - (*r_allloop)); mpoly->totloop = 3; mpoly->mat_nr = dl->col; @@ -1390,7 +1393,7 @@ int BKE_mesh_nurbs_displist_to_mdata(Object *ob, ListBase *dispbase, mloop[1].v = p3; mloop[2].v = p4; mloop[3].v = p2; - mpoly->loopstart = (int)(mloop - (*allloop)); + mpoly->loopstart = (int)(mloop - (*r_allloop)); mpoly->totloop = 4; mpoly->mat_nr = dl->col; @@ -1440,14 +1443,14 @@ int BKE_mesh_nurbs_displist_to_mdata(Object *ob, ListBase *dispbase, } if (totvlak) { - make_edges_mdata_extend(alledge, &totedge, - *allpoly, *allloop, totvlak); + make_edges_mdata_extend(r_alledge, &totedge, + *r_allpoly, *r_allloop, totvlak); } - *_totpoly = totvlak; - *_totloop = totloop; - *_totedge = totedge; - *_totvert = totvert; + *r_totpoly = totvlak; + *r_totloop = totloop; + *r_totedge = totedge; + *r_totvert = totvert; return 0; } @@ -1871,8 +1874,9 @@ int poly_find_loop_from_vert( * vertex is not in \a poly */ int poly_get_adj_loops_from_vert( - unsigned r_adj[2], const MPoly *poly, - const MLoop *mloop, unsigned vert) + const MPoly *poly, + const MLoop *mloop, unsigned int vert, + unsigned int r_adj[2]) { int corner = poly_find_loop_from_vert(poly, &mloop[poly->loopstart], @@ -1906,7 +1910,7 @@ int BKE_mesh_edge_other_vert(const MEdge *e, int v) } /* basic vertex data functions */ -bool BKE_mesh_minmax(Mesh *me, float r_min[3], float r_max[3]) +bool BKE_mesh_minmax(const Mesh *me, float r_min[3], float r_max[3]) { int i = me->totvert; MVert *mvert; diff --git a/source/blender/blenkernel/intern/mesh_evaluate.c b/source/blender/blenkernel/intern/mesh_evaluate.c index 5ba72ccac82..00a82727e59 100644 --- a/source/blender/blenkernel/intern/mesh_evaluate.c +++ b/source/blender/blenkernel/intern/mesh_evaluate.c @@ -89,26 +89,28 @@ static void mesh_calc_normals_vert_fallback(MVert *mverts, int numVerts) /* Calculate vertex and face normals, face normals are returned in *r_faceNors if non-NULL * and vertex normals are stored in actual mverts. */ -void BKE_mesh_calc_normals_mapping(MVert *mverts, int numVerts, - MLoop *mloop, MPoly *mpolys, int numLoops, int numPolys, float (*r_polyNors)[3], - MFace *mfaces, int numFaces, const int *origIndexFace, float (*r_faceNors)[3]) +void BKE_mesh_calc_normals_mapping( + MVert *mverts, int numVerts, + const MLoop *mloop, const MPoly *mpolys, int numLoops, int numPolys, float (*r_polyNors)[3], + const MFace *mfaces, int numFaces, const int *origIndexFace, float (*r_faceNors)[3]) { - BKE_mesh_calc_normals_mapping_ex(mverts, numVerts, mloop, mpolys, - numLoops, numPolys, r_polyNors, mfaces, numFaces, - origIndexFace, r_faceNors, false); + BKE_mesh_calc_normals_mapping_ex( + mverts, numVerts, mloop, mpolys, + numLoops, numPolys, r_polyNors, mfaces, numFaces, + origIndexFace, r_faceNors, false); } /* extended version of 'BKE_mesh_calc_normals_poly' with option not to calc vertex normals */ void BKE_mesh_calc_normals_mapping_ex( MVert *mverts, int numVerts, - MLoop *mloop, MPoly *mpolys, + const MLoop *mloop, const MPoly *mpolys, int numLoops, int numPolys, float (*r_polyNors)[3], - MFace *mfaces, int numFaces, const int *origIndexFace, float (*r_faceNors)[3], + const MFace *mfaces, int numFaces, const int *origIndexFace, float (*r_faceNors)[3], const bool only_face_normals) { float (*pnors)[3] = r_polyNors, (*fnors)[3] = r_faceNors; int i; - MFace *mf; - MPoly *mp; + const MFace *mf; + const MPoly *mp; if (numPolys == 0) { if (only_face_normals == false) { @@ -164,8 +166,10 @@ void BKE_mesh_calc_normals_mapping_ex( } -static void mesh_calc_normals_poly_accum(MPoly *mp, MLoop *ml, - MVert *mvert, float polyno[3], float (*tnorms)[3]) +static void mesh_calc_normals_poly_accum( + const MPoly *mp, const MLoop *ml, + const MVert *mvert, + float r_polyno[3], float (*r_tnorms)[3]) { const int nverts = mp->totloop; float (*edgevecbuf)[3] = BLI_array_alloca(edgevecbuf, (size_t)nverts); @@ -178,11 +182,11 @@ static void mesh_calc_normals_poly_accum(MPoly *mp, MLoop *ml, const float *v_prev = mvert[ml[i_prev].v].co; const float *v_curr; - zero_v3(polyno); + zero_v3(r_polyno); /* Newell's Method */ for (i = 0; i < nverts; i++) { v_curr = mvert[ml[i].v].co; - add_newell_cross_v3_v3v3(polyno, v_prev, v_curr); + add_newell_cross_v3_v3v3(r_polyno, v_prev, v_curr); /* Unrelated to normalize, calculate edge-vector */ sub_v3_v3v3(edgevecbuf[i_prev], v_prev, v_curr); @@ -191,8 +195,8 @@ static void mesh_calc_normals_poly_accum(MPoly *mp, MLoop *ml, v_prev = v_curr; } - if (UNLIKELY(normalize_v3(polyno) == 0.0f)) { - polyno[2] = 1.0f; /* other axis set to 0.0 */ + if (UNLIKELY(normalize_v3(r_polyno) == 0.0f)) { + r_polyno[2] = 1.0f; /* other axis set to 0.0 */ } } @@ -209,21 +213,23 @@ static void mesh_calc_normals_poly_accum(MPoly *mp, MLoop *ml, const float fac = saacos(-dot_v3v3(cur_edge, prev_edge)); /* accumulate */ - madd_v3_v3fl(tnorms[ml[i].v], polyno, fac); + madd_v3_v3fl(r_tnorms[ml[i].v], r_polyno, fac); prev_edge = cur_edge; } } } -void BKE_mesh_calc_normals_poly(MVert *mverts, int numVerts, MLoop *mloop, MPoly *mpolys, - int UNUSED(numLoops), int numPolys, float (*r_polynors)[3], - const bool only_face_normals) +void BKE_mesh_calc_normals_poly( + MVert *mverts, int numVerts, + const MLoop *mloop, const MPoly *mpolys, + int UNUSED(numLoops), int numPolys, float (*r_polynors)[3], + const bool only_face_normals) { float (*pnors)[3] = r_polynors; float (*tnorms)[3]; int i; - MPoly *mp; + const MPoly *mp; if (only_face_normals) { BLI_assert((pnors != NULL) || (numPolys == 0)); @@ -280,14 +286,17 @@ void BKE_mesh_calc_normals(Mesh *mesh) #endif } -void BKE_mesh_calc_normals_tessface(MVert *mverts, int numVerts, MFace *mfaces, int numFaces, float (*r_faceNors)[3]) +void BKE_mesh_calc_normals_tessface( + MVert *mverts, int numVerts, + const MFace *mfaces, int numFaces, + float (*r_faceNors)[3]) { float (*tnorms)[3] = MEM_callocN(sizeof(*tnorms) * (size_t)numVerts, "tnorms"); float (*fnors)[3] = (r_faceNors) ? r_faceNors : MEM_callocN(sizeof(*fnors) * (size_t)numFaces, "meshnormals"); int i; for (i = 0; i < numFaces; i++) { - MFace *mf = &mfaces[i]; + const MFace *mf = &mfaces[i]; float *f_no = fnors[i]; float *n4 = (mf->v4) ? tnorms[mf->v4] : NULL; const float *c4 = (mf->v4) ? mverts[mf->v4].co : NULL; @@ -1061,7 +1070,7 @@ static void loop_split_generator(TaskPool *UNUSED(pool), void *taskdata, int UNU * Useful to materialize sharp edges (or non-smooth faces) without actually modifying the geometry (splitting edges). */ void BKE_mesh_normals_loop_split( - MVert *mverts, const int numVerts, MEdge *medges, const int numEdges, + const MVert *mverts, const int numVerts, MEdge *medges, const int numEdges, MLoop *mloops, float (*r_loopnors)[3], const int numLoops, MPoly *mpolys, const float (*polynors)[3], const int numPolys, const bool use_split_normals, float split_angle, @@ -1287,7 +1296,7 @@ void BKE_mesh_normals_loop_split( * (this allows to set whole vert's normals at once, useful in some cases). */ static void mesh_normals_loop_custom_set( - MVert *mverts, const int numVerts, MEdge *medges, const int numEdges, + const MVert *mverts, const int numVerts, MEdge *medges, const int numEdges, MLoop *mloops, float (*custom_loopnors)[3], const int numLoops, MPoly *mpolys, const float (*polynors)[3], const int numPolys, short (*r_clnors_data)[2], const bool use_vertices) @@ -1453,7 +1462,7 @@ static void mesh_normals_loop_custom_set( } void BKE_mesh_normals_loop_custom_set( - MVert *mverts, const int numVerts, MEdge *medges, const int numEdges, + const MVert *mverts, const int numVerts, MEdge *medges, const int numEdges, MLoop *mloops, float (*custom_loopnors)[3], const int numLoops, MPoly *mpolys, const float (*polynors)[3], const int numPolys, short (*r_clnors_data)[2]) @@ -1463,7 +1472,7 @@ void BKE_mesh_normals_loop_custom_set( } void BKE_mesh_normals_loop_custom_from_vertices_set( - MVert *mverts, float (*custom_vertnors)[3], const int numVerts, + const MVert *mverts, float (*custom_vertnors)[3], const int numVerts, MEdge *medges, const int numEdges, MLoop *mloops, const int numLoops, MPoly *mpolys, const float (*polynors)[3], const int numPolys, short (*r_clnors_data)[2]) @@ -1486,10 +1495,10 @@ void BKE_mesh_normals_loop_custom_from_vertices_set( /* User data. */ typedef struct { - MPoly *mpolys; /* faces */ - MLoop *mloops; /* faces's vertices */ - MVert *mverts; /* vertices */ - MLoopUV *luvs; /* texture coordinates */ + const MPoly *mpolys; /* faces */ + const MLoop *mloops; /* faces's vertices */ + const MVert *mverts; /* vertices */ + const MLoopUV *luvs; /* texture coordinates */ float (*lnors)[3]; /* loops' normals */ float (*tangents)[4]; /* output tangents */ int num_polys; /* number of polygons */ @@ -1542,15 +1551,17 @@ static void set_tspace(const SMikkTSpaceContext *pContext, const float fv_tangen * split normals can be used to recreate the full tangent space. * Note: * The mesh should be made of only tris and quads! */ -void BKE_mesh_loop_tangents_ex(MVert *mverts, const int UNUSED(numVerts), MLoop *mloops, - float (*r_looptangent)[4], float (*loopnors)[3], MLoopUV *loopuvs, - const int UNUSED(numLoops), MPoly *mpolys, const int numPolys, ReportList *reports) +void BKE_mesh_loop_tangents_ex( + const MVert *mverts, const int UNUSED(numVerts), const MLoop *mloops, + float (*r_looptangent)[4], float (*loopnors)[3], const MLoopUV *loopuvs, + const int UNUSED(numLoops), const MPoly *mpolys, const int numPolys, + ReportList *reports) { BKEMeshToTangent mesh_to_tangent = {NULL}; SMikkTSpaceContext s_context = {NULL}; SMikkTSpaceInterface s_interface = {NULL}; - MPoly *mp; + const MPoly *mp; int mp_index; /* First check we do have a tris/quads only mesh. */ @@ -1587,8 +1598,9 @@ void BKE_mesh_loop_tangents_ex(MVert *mverts, const int UNUSED(numVerts), MLoop /** * Wrapper around BKE_mesh_loop_tangents_ex, which takes care of most boiling code. - * Note: * There must be a valid loop's CD_NORMALS available. - * * The mesh should be made of only tris and quads! + * \note + * - There must be a valid loop's CD_NORMALS available. + * - The mesh should be made of only tris and quads! */ void BKE_mesh_loop_tangents(Mesh *mesh, const char *uvmap, float (*r_looptangents)[4], ReportList *reports) { @@ -1633,8 +1645,9 @@ void BKE_mesh_loop_tangents(Mesh *mesh, const char *uvmap, float (*r_looptangent * computing newell normal. * */ -static void mesh_calc_ngon_normal(MPoly *mpoly, MLoop *loopstart, - MVert *mvert, float normal[3]) +static void mesh_calc_ngon_normal( + const MPoly *mpoly, const MLoop *loopstart, + const MVert *mvert, float normal[3]) { const int nverts = mpoly->totloop; const float *v_prev = mvert[loopstart[nverts - 1].v].co; @@ -1655,21 +1668,22 @@ static void mesh_calc_ngon_normal(MPoly *mpoly, MLoop *loopstart, } } -void BKE_mesh_calc_poly_normal(MPoly *mpoly, MLoop *loopstart, - MVert *mvarray, float no[3]) +void BKE_mesh_calc_poly_normal( + const MPoly *mpoly, const MLoop *loopstart, + const MVert *mvarray, float r_no[3]) { if (mpoly->totloop > 4) { - mesh_calc_ngon_normal(mpoly, loopstart, mvarray, no); + mesh_calc_ngon_normal(mpoly, loopstart, mvarray, r_no); } else if (mpoly->totloop == 3) { - normal_tri_v3(no, + normal_tri_v3(r_no, mvarray[loopstart[0].v].co, mvarray[loopstart[1].v].co, mvarray[loopstart[2].v].co ); } else if (mpoly->totloop == 4) { - normal_quad_v3(no, + normal_quad_v3(r_no, mvarray[loopstart[0].v].co, mvarray[loopstart[1].v].co, mvarray[loopstart[2].v].co, @@ -1677,49 +1691,51 @@ void BKE_mesh_calc_poly_normal(MPoly *mpoly, MLoop *loopstart, ); } else { /* horrible, two sided face! */ - no[0] = 0.0; - no[1] = 0.0; - no[2] = 1.0; + r_no[0] = 0.0; + r_no[1] = 0.0; + r_no[2] = 1.0; } } /* duplicate of function above _but_ takes coords rather then mverts */ -static void mesh_calc_ngon_normal_coords(MPoly *mpoly, MLoop *loopstart, - const float (*vertex_coords)[3], float normal[3]) +static void mesh_calc_ngon_normal_coords( + const MPoly *mpoly, const MLoop *loopstart, + const float (*vertex_coords)[3], float r_normal[3]) { const int nverts = mpoly->totloop; const float *v_prev = vertex_coords[loopstart[nverts - 1].v]; const float *v_curr; int i; - zero_v3(normal); + zero_v3(r_normal); /* Newell's Method */ for (i = 0; i < nverts; i++) { v_curr = vertex_coords[loopstart[i].v]; - add_newell_cross_v3_v3v3(normal, v_prev, v_curr); + add_newell_cross_v3_v3v3(r_normal, v_prev, v_curr); v_prev = v_curr; } - if (UNLIKELY(normalize_v3(normal) == 0.0f)) { - normal[2] = 1.0f; /* other axis set to 0.0 */ + if (UNLIKELY(normalize_v3(r_normal) == 0.0f)) { + r_normal[2] = 1.0f; /* other axis set to 0.0 */ } } -void BKE_mesh_calc_poly_normal_coords(MPoly *mpoly, MLoop *loopstart, - const float (*vertex_coords)[3], float no[3]) +void BKE_mesh_calc_poly_normal_coords( + const MPoly *mpoly, const MLoop *loopstart, + const float (*vertex_coords)[3], float r_no[3]) { if (mpoly->totloop > 4) { - mesh_calc_ngon_normal_coords(mpoly, loopstart, vertex_coords, no); + mesh_calc_ngon_normal_coords(mpoly, loopstart, vertex_coords, r_no); } else if (mpoly->totloop == 3) { - normal_tri_v3(no, + normal_tri_v3(r_no, vertex_coords[loopstart[0].v], vertex_coords[loopstart[1].v], vertex_coords[loopstart[2].v] ); } else if (mpoly->totloop == 4) { - normal_quad_v3(no, + normal_quad_v3(r_no, vertex_coords[loopstart[0].v], vertex_coords[loopstart[1].v], vertex_coords[loopstart[2].v], @@ -1727,14 +1743,15 @@ void BKE_mesh_calc_poly_normal_coords(MPoly *mpoly, MLoop *loopstart, ); } else { /* horrible, two sided face! */ - no[0] = 0.0; - no[1] = 0.0; - no[2] = 1.0; + r_no[0] = 0.0; + r_no[1] = 0.0; + r_no[2] = 1.0; } } -static void mesh_calc_ngon_center(MPoly *mpoly, MLoop *loopstart, - MVert *mvert, float cent[3]) +static void mesh_calc_ngon_center( + const MPoly *mpoly, const MLoop *loopstart, + const MVert *mvert, float cent[3]) { const float w = 1.0f / (float)mpoly->totloop; int i; @@ -1746,18 +1763,19 @@ static void mesh_calc_ngon_center(MPoly *mpoly, MLoop *loopstart, } } -void BKE_mesh_calc_poly_center(MPoly *mpoly, MLoop *loopstart, - MVert *mvarray, float cent[3]) +void BKE_mesh_calc_poly_center( + const MPoly *mpoly, const MLoop *loopstart, + const MVert *mvarray, float r_cent[3]) { if (mpoly->totloop == 3) { - cent_tri_v3(cent, + cent_tri_v3(r_cent, mvarray[loopstart[0].v].co, mvarray[loopstart[1].v].co, mvarray[loopstart[2].v].co ); } else if (mpoly->totloop == 4) { - cent_quad_v3(cent, + cent_quad_v3(r_cent, mvarray[loopstart[0].v].co, mvarray[loopstart[1].v].co, mvarray[loopstart[2].v].co, @@ -1765,13 +1783,14 @@ void BKE_mesh_calc_poly_center(MPoly *mpoly, MLoop *loopstart, ); } else { - mesh_calc_ngon_center(mpoly, loopstart, mvarray, cent); + mesh_calc_ngon_center(mpoly, loopstart, mvarray, r_cent); } } /* note, passing polynormal is only a speedup so we can skip calculating it */ -float BKE_mesh_calc_poly_area(MPoly *mpoly, MLoop *loopstart, - MVert *mvarray) +float BKE_mesh_calc_poly_area( + const MPoly *mpoly, const MLoop *loopstart, + const MVert *mvarray) { if (mpoly->totloop == 3) { return area_tri_v3(mvarray[loopstart[0].v].co, @@ -1781,7 +1800,7 @@ float BKE_mesh_calc_poly_area(MPoly *mpoly, MLoop *loopstart, } else { int i; - MLoop *l_iter = loopstart; + const MLoop *l_iter = loopstart; float area; float (*vertexcos)[3] = BLI_array_alloca(vertexcos, (size_t)mpoly->totloop); @@ -1798,7 +1817,9 @@ float BKE_mesh_calc_poly_area(MPoly *mpoly, MLoop *loopstart, } /* note, results won't be correct if polygon is non-planar */ -static float mesh_calc_poly_planar_area_centroid(MPoly *mpoly, MLoop *loopstart, MVert *mvarray, float cent[3]) +static float mesh_calc_poly_planar_area_centroid( + const MPoly *mpoly, const MLoop *loopstart, const MVert *mvarray, + float r_cent[3]) { int i; float tri_area; @@ -1808,7 +1829,7 @@ static float mesh_calc_poly_planar_area_centroid(MPoly *mpoly, MLoop *loopstart, BKE_mesh_calc_poly_normal(mpoly, loopstart, mvarray, normal); copy_v3_v3(v1, mvarray[loopstart[0].v].co); copy_v3_v3(v2, mvarray[loopstart[1].v].co); - zero_v3(cent); + zero_v3(r_cent); for (i = 2; i < mpoly->totloop; i++) { copy_v3_v3(v3, mvarray[loopstart[i].v].co); @@ -1817,12 +1838,12 @@ static float mesh_calc_poly_planar_area_centroid(MPoly *mpoly, MLoop *loopstart, total_area += tri_area; cent_tri_v3(tri_cent, v1, v2, v3); - madd_v3_v3fl(cent, tri_cent, tri_area); + madd_v3_v3fl(r_cent, tri_cent, tri_area); copy_v3_v3(v2, v3); } - mul_v3_fl(cent, 1.0f / total_area); + mul_v3_fl(r_cent, 1.0f / total_area); return total_area; } @@ -1850,8 +1871,9 @@ void BKE_mesh_calc_poly_angles(MPoly *mpoly, MLoop *loopstart, #else /* equivalent the function above but avoid multiple subtractions + normalize */ -void BKE_mesh_calc_poly_angles(MPoly *mpoly, MLoop *loopstart, - MVert *mvarray, float angles[]) +void BKE_mesh_calc_poly_angles( + const MPoly *mpoly, const MLoop *loopstart, + const MVert *mvarray, float angles[]) { float nor_prev[3]; float nor_next[3]; @@ -1912,35 +1934,35 @@ void BKE_mesh_poly_edgebitmap_insert(unsigned int *edge_bitmap, const MPoly *mp, /** \name Mesh Center Calculation * \{ */ -bool BKE_mesh_center_median(Mesh *me, float cent[3]) +bool BKE_mesh_center_median(const Mesh *me, float r_cent[3]) { int i = me->totvert; - MVert *mvert; - zero_v3(cent); + const MVert *mvert; + zero_v3(r_cent); for (mvert = me->mvert; i--; mvert++) { - add_v3_v3(cent, mvert->co); + add_v3_v3(r_cent, mvert->co); } /* otherwise we get NAN for 0 verts */ if (me->totvert) { - mul_v3_fl(cent, 1.0f / (float)me->totvert); + mul_v3_fl(r_cent, 1.0f / (float)me->totvert); } return (me->totvert != 0); } -bool BKE_mesh_center_bounds(Mesh *me, float cent[3]) +bool BKE_mesh_center_bounds(const Mesh *me, float r_cent[3]) { float min[3], max[3]; INIT_MINMAX(min, max); if (BKE_mesh_minmax(me, min, max)) { - mid_v3_v3v3(cent, min, max); + mid_v3_v3v3(r_cent, min, max); return true; } return false; } -bool BKE_mesh_center_centroid(Mesh *me, float cent[3]) +bool BKE_mesh_center_centroid(const Mesh *me, float r_cent[3]) { int i = me->totpoly; MPoly *mpoly; @@ -1948,23 +1970,23 @@ bool BKE_mesh_center_centroid(Mesh *me, float cent[3]) float total_area = 0.0f; float poly_cent[3]; - zero_v3(cent); + zero_v3(r_cent); /* calculate a weighted average of polygon centroids */ for (mpoly = me->mpoly; i--; mpoly++) { poly_area = mesh_calc_poly_planar_area_centroid(mpoly, me->mloop + mpoly->loopstart, me->mvert, poly_cent); - madd_v3_v3fl(cent, poly_cent, poly_area); + madd_v3_v3fl(r_cent, poly_cent, poly_area); total_area += poly_area; } /* otherwise we get NAN for 0 polys */ if (me->totpoly) { - mul_v3_fl(cent, 1.0f / total_area); + mul_v3_fl(r_cent, 1.0f / total_area); } /* zero area faces cause this, fallback to median */ - if (UNLIKELY(!is_finite_v3(cent))) { - return BKE_mesh_center_median(me, cent); + if (UNLIKELY(!is_finite_v3(r_cent))) { + return BKE_mesh_center_median(me, r_cent); } return (me->totpoly != 0); @@ -1977,52 +1999,54 @@ bool BKE_mesh_center_centroid(Mesh *me, float cent[3]) /** \name Mesh Volume Calculation * \{ */ -static bool mesh_calc_center_centroid_ex(MVert *mverts, int UNUSED(numVerts), - MFace *mfaces, int numFaces, - float center[3]) +static bool mesh_calc_center_centroid_ex( + const MVert *mverts, int UNUSED(numVerts), + const MFace *mfaces, int numFaces, + float r_center[3]) { float totweight; int f; - zero_v3(center); + zero_v3(r_center); if (numFaces == 0) return false; totweight = 0.0f; for (f = 0; f < numFaces; ++f) { - MFace *face = &mfaces[f]; - MVert *v1 = &mverts[face->v1]; - MVert *v2 = &mverts[face->v2]; - MVert *v3 = &mverts[face->v3]; - MVert *v4 = &mverts[face->v4]; + const MFace *face = &mfaces[f]; + const MVert *v1 = &mverts[face->v1]; + const MVert *v2 = &mverts[face->v2]; + const MVert *v3 = &mverts[face->v3]; + const MVert *v4 = &mverts[face->v4]; float area; area = area_tri_v3(v1->co, v2->co, v3->co); - madd_v3_v3fl(center, v1->co, area); - madd_v3_v3fl(center, v2->co, area); - madd_v3_v3fl(center, v3->co, area); + madd_v3_v3fl(r_center, v1->co, area); + madd_v3_v3fl(r_center, v2->co, area); + madd_v3_v3fl(r_center, v3->co, area); totweight += area; if (face->v4) { area = area_tri_v3(v3->co, v4->co, v1->co); - madd_v3_v3fl(center, v3->co, area); - madd_v3_v3fl(center, v4->co, area); - madd_v3_v3fl(center, v1->co, area); + madd_v3_v3fl(r_center, v3->co, area); + madd_v3_v3fl(r_center, v4->co, area); + madd_v3_v3fl(r_center, v1->co, area); totweight += area; } } if (totweight == 0.0f) return false; - mul_v3_fl(center, 1.0f / (3.0f * totweight)); + mul_v3_fl(r_center, 1.0f / (3.0f * totweight)); return true; } -void BKE_mesh_calc_volume(MVert *mverts, int numVerts, - MFace *mfaces, int numFaces, - float *r_vol, float *r_com) +void BKE_mesh_calc_volume( + const MVert *mverts, const int numVerts, + const MFace *mfaces, const int numFaces, + float *r_vol, float *r_com) { float center[3]; float totvol; @@ -2039,11 +2063,11 @@ void BKE_mesh_calc_volume(MVert *mverts, int numVerts, totvol = 0.0f; for (f = 0; f < numFaces; ++f) { - MFace *face = &mfaces[f]; - MVert *v1 = &mverts[face->v1]; - MVert *v2 = &mverts[face->v2]; - MVert *v3 = &mverts[face->v3]; - MVert *v4 = &mverts[face->v4]; + const MFace *face = &mfaces[f]; + const MVert *v1 = &mverts[face->v1]; + const MVert *v2 = &mverts[face->v2]; + const MVert *v3 = &mverts[face->v3]; + const MVert *v4 = &mverts[face->v4]; float vol; vol = volume_tetrahedron_signed_v3(center, v1->co, v2->co, v3->co); diff --git a/source/blender/blenkernel/intern/pbvh.c b/source/blender/blenkernel/intern/pbvh.c index 95d8e37d1c7..a015e8427c2 100644 --- a/source/blender/blenkernel/intern/pbvh.c +++ b/source/blender/blenkernel/intern/pbvh.c @@ -291,7 +291,7 @@ static void build_mesh_leaf_node(PBVH *bvh, PBVHNode *node) "bvh node face vert indices"); for (i = 0; i < totface; ++i) { - MFace *f = bvh->faces + node->prim_indices[i]; + const MFace *f = &bvh->faces[node->prim_indices[i]]; int sides = f->v4 ? 4 : 3; for (j = 0; j < sides; ++j) { @@ -321,7 +321,7 @@ static void build_mesh_leaf_node(PBVH *bvh, PBVHNode *node) } for (i = 0; i < totface; ++i) { - MFace *f = bvh->faces + node->prim_indices[i]; + const MFace *f = &bvh->faces[node->prim_indices[i]]; int sides = f->v4 ? 4 : 3; for (j = 0; j < sides; ++j) { @@ -528,7 +528,9 @@ static void pbvh_build(PBVH *bvh, BB *cb, BBC *prim_bbc, int totprim) } /* Do a full rebuild with on Mesh data structure */ -void BKE_pbvh_build_mesh(PBVH *bvh, MFace *faces, MVert *verts, int totface, int totvert, struct CustomData *vdata) +void BKE_pbvh_build_mesh( + PBVH *bvh, const MFace *faces, MVert *verts, + int totface, int totvert, struct CustomData *vdata) { BBC *prim_bbc = NULL; BB cb; @@ -548,7 +550,7 @@ void BKE_pbvh_build_mesh(PBVH *bvh, MFace *faces, MVert *verts, int totface, int prim_bbc = MEM_mallocN(sizeof(BBC) * totface, "prim_bbc"); for (i = 0; i < totface; ++i) { - MFace *f = faces + i; + const MFace *f = &faces[i]; const int sides = f->v4 ? 4 : 3; BBC *bbc = prim_bbc + i; @@ -649,9 +651,10 @@ void BKE_pbvh_free(PBVH *bvh) if (bvh->verts) { /* if pbvh was deformed, new memory was allocated for verts/faces -- free it */ - MEM_freeN(bvh->verts); - if (bvh->faces) - MEM_freeN(bvh->faces); + MEM_freeN((void *)bvh->verts); + if (bvh->faces) { + MEM_freeN((void *)bvh->faces); + } } } @@ -975,9 +978,9 @@ static void pbvh_update_normals(PBVH *bvh, PBVHNode **nodes, totface = node->totprim; for (i = 0; i < totface; ++i) { - MFace *f = bvh->faces + faces[i]; + const MFace *f = &bvh->faces[faces[i]]; float fn[3]; - unsigned int *fv = &f->v1; + const unsigned int *fv = &f->v1; int sides = (f->v4) ? 4 : 3; if (f->v4) diff --git a/source/blender/blenkernel/intern/pbvh_intern.h b/source/blender/blenkernel/intern/pbvh_intern.h index 7daccb47c92..5bb90af889e 100644 --- a/source/blender/blenkernel/intern/pbvh_intern.h +++ b/source/blender/blenkernel/intern/pbvh_intern.h @@ -133,7 +133,7 @@ struct PBVH { /* Mesh data */ MVert *verts; - MFace *faces; + const MFace *faces; CustomData *vdata; /* Grid Data */ |