Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/blenkernel/intern/cdderivedmesh.c')
-rw-r--r--source/blender/blenkernel/intern/cdderivedmesh.c1917
1 files changed, 985 insertions, 932 deletions
diff --git a/source/blender/blenkernel/intern/cdderivedmesh.c b/source/blender/blenkernel/intern/cdderivedmesh.c
index 9634cbccd91..ada746d3fcc 100644
--- a/source/blender/blenkernel/intern/cdderivedmesh.c
+++ b/source/blender/blenkernel/intern/cdderivedmesh.c
@@ -50,1120 +50,1151 @@
#include <math.h>
typedef struct {
- DerivedMesh dm;
-
- /* these point to data in the DerivedMesh custom data layers,
- * they are only here for efficiency and convenience */
- MVert *mvert;
- MEdge *medge;
- MFace *mface;
- MLoop *mloop;
- MPoly *mpoly;
-
- /* Cached */
- struct PBVH *pbvh;
- bool pbvh_draw;
-
- /* Mesh connectivity */
- MeshElemMap *pmap;
- int *pmap_mem;
+ DerivedMesh dm;
+
+ /* these point to data in the DerivedMesh custom data layers,
+ * they are only here for efficiency and convenience */
+ MVert *mvert;
+ MEdge *medge;
+ MFace *mface;
+ MLoop *mloop;
+ MPoly *mpoly;
+
+ /* Cached */
+ struct PBVH *pbvh;
+ bool pbvh_draw;
+
+ /* Mesh connectivity */
+ MeshElemMap *pmap;
+ int *pmap_mem;
} CDDerivedMesh;
/**************** DerivedMesh interface functions ****************/
static int cdDM_getNumVerts(DerivedMesh *dm)
{
- return dm->numVertData;
+ return dm->numVertData;
}
static int cdDM_getNumEdges(DerivedMesh *dm)
{
- return dm->numEdgeData;
+ return dm->numEdgeData;
}
static int cdDM_getNumTessFaces(DerivedMesh *dm)
{
- /* uncomment and add a breakpoint on the printf()
- * to help debug tessfaces issues since BMESH merge. */
+ /* uncomment and add a breakpoint on the printf()
+ * to help debug tessfaces issues since BMESH merge. */
#if 0
- if (dm->numTessFaceData == 0 && dm->numPolyData != 0) {
- printf("%s: has no faces!\n");
- }
+ if (dm->numTessFaceData == 0 && dm->numPolyData != 0) {
+ printf("%s: has no faces!\n");
+ }
#endif
- return dm->numTessFaceData;
+ return dm->numTessFaceData;
}
static int cdDM_getNumLoops(DerivedMesh *dm)
{
- return dm->numLoopData;
+ return dm->numLoopData;
}
static int cdDM_getNumPolys(DerivedMesh *dm)
{
- return dm->numPolyData;
+ return dm->numPolyData;
}
static void cdDM_getVert(DerivedMesh *dm, int index, MVert *r_vert)
{
- CDDerivedMesh *cddm = (CDDerivedMesh *)dm;
- *r_vert = cddm->mvert[index];
+ CDDerivedMesh *cddm = (CDDerivedMesh *)dm;
+ *r_vert = cddm->mvert[index];
}
static void cdDM_getEdge(DerivedMesh *dm, int index, MEdge *r_edge)
{
- CDDerivedMesh *cddm = (CDDerivedMesh *)dm;
- *r_edge = cddm->medge[index];
+ CDDerivedMesh *cddm = (CDDerivedMesh *)dm;
+ *r_edge = cddm->medge[index];
}
static void cdDM_getTessFace(DerivedMesh *dm, int index, MFace *r_face)
{
- CDDerivedMesh *cddm = (CDDerivedMesh *)dm;
- *r_face = cddm->mface[index];
+ CDDerivedMesh *cddm = (CDDerivedMesh *)dm;
+ *r_face = cddm->mface[index];
}
static void cdDM_copyVertArray(DerivedMesh *dm, MVert *r_vert)
{
- CDDerivedMesh *cddm = (CDDerivedMesh *)dm;
- memcpy(r_vert, cddm->mvert, sizeof(*r_vert) * dm->numVertData);
+ CDDerivedMesh *cddm = (CDDerivedMesh *)dm;
+ memcpy(r_vert, cddm->mvert, sizeof(*r_vert) * dm->numVertData);
}
static void cdDM_copyEdgeArray(DerivedMesh *dm, MEdge *r_edge)
{
- CDDerivedMesh *cddm = (CDDerivedMesh *)dm;
- memcpy(r_edge, cddm->medge, sizeof(*r_edge) * dm->numEdgeData);
+ CDDerivedMesh *cddm = (CDDerivedMesh *)dm;
+ memcpy(r_edge, cddm->medge, sizeof(*r_edge) * dm->numEdgeData);
}
static void cdDM_copyTessFaceArray(DerivedMesh *dm, MFace *r_face)
{
- CDDerivedMesh *cddm = (CDDerivedMesh *)dm;
- memcpy(r_face, cddm->mface, sizeof(*r_face) * dm->numTessFaceData);
+ CDDerivedMesh *cddm = (CDDerivedMesh *)dm;
+ memcpy(r_face, cddm->mface, sizeof(*r_face) * dm->numTessFaceData);
}
static void cdDM_copyLoopArray(DerivedMesh *dm, MLoop *r_loop)
{
- CDDerivedMesh *cddm = (CDDerivedMesh *)dm;
- memcpy(r_loop, cddm->mloop, sizeof(*r_loop) * dm->numLoopData);
+ CDDerivedMesh *cddm = (CDDerivedMesh *)dm;
+ memcpy(r_loop, cddm->mloop, sizeof(*r_loop) * dm->numLoopData);
}
static void cdDM_copyPolyArray(DerivedMesh *dm, MPoly *r_poly)
{
- CDDerivedMesh *cddm = (CDDerivedMesh *)dm;
- memcpy(r_poly, cddm->mpoly, sizeof(*r_poly) * dm->numPolyData);
+ CDDerivedMesh *cddm = (CDDerivedMesh *)dm;
+ memcpy(r_poly, cddm->mpoly, sizeof(*r_poly) * dm->numPolyData);
}
static void cdDM_getMinMax(DerivedMesh *dm, float r_min[3], float r_max[3])
{
- CDDerivedMesh *cddm = (CDDerivedMesh *) dm;
- int i;
+ CDDerivedMesh *cddm = (CDDerivedMesh *)dm;
+ int i;
- if (dm->numVertData) {
- for (i = 0; i < dm->numVertData; i++) {
- minmax_v3v3_v3(r_min, r_max, cddm->mvert[i].co);
- }
- }
- else {
- zero_v3(r_min);
- zero_v3(r_max);
- }
+ if (dm->numVertData) {
+ for (i = 0; i < dm->numVertData; i++) {
+ minmax_v3v3_v3(r_min, r_max, cddm->mvert[i].co);
+ }
+ }
+ else {
+ zero_v3(r_min);
+ zero_v3(r_max);
+ }
}
static void cdDM_getVertCo(DerivedMesh *dm, int index, float r_co[3])
{
- CDDerivedMesh *cddm = (CDDerivedMesh *) dm;
+ CDDerivedMesh *cddm = (CDDerivedMesh *)dm;
- copy_v3_v3(r_co, cddm->mvert[index].co);
+ copy_v3_v3(r_co, cddm->mvert[index].co);
}
static void cdDM_getVertCos(DerivedMesh *dm, float (*r_cos)[3])
{
- MVert *mv = CDDM_get_verts(dm);
- int i;
+ MVert *mv = CDDM_get_verts(dm);
+ int i;
- for (i = 0; i < dm->numVertData; i++, mv++)
- copy_v3_v3(r_cos[i], mv->co);
+ for (i = 0; i < dm->numVertData; i++, mv++)
+ copy_v3_v3(r_cos[i], mv->co);
}
static void cdDM_getVertNo(DerivedMesh *dm, int index, float r_no[3])
{
- CDDerivedMesh *cddm = (CDDerivedMesh *) dm;
- normal_short_to_float_v3(r_no, cddm->mvert[index].no);
+ CDDerivedMesh *cddm = (CDDerivedMesh *)dm;
+ normal_short_to_float_v3(r_no, cddm->mvert[index].no);
}
static const MeshElemMap *cdDM_getPolyMap(Object *ob, DerivedMesh *dm)
{
- CDDerivedMesh *cddm = (CDDerivedMesh *) dm;
+ CDDerivedMesh *cddm = (CDDerivedMesh *)dm;
- if (!cddm->pmap && ob->type == OB_MESH) {
- Mesh *me = ob->data;
+ if (!cddm->pmap && ob->type == OB_MESH) {
+ Mesh *me = ob->data;
- BKE_mesh_vert_poly_map_create(
- &cddm->pmap, &cddm->pmap_mem,
- me->mpoly, me->mloop,
- me->totvert, me->totpoly, me->totloop);
- }
+ BKE_mesh_vert_poly_map_create(
+ &cddm->pmap, &cddm->pmap_mem, me->mpoly, me->mloop, me->totvert, me->totpoly, me->totloop);
+ }
- return cddm->pmap;
+ return cddm->pmap;
}
static bool check_sculpt_object_deformed(Object *object, bool for_construction)
{
- bool deformed = false;
+ bool deformed = false;
- /* Active modifiers means extra deformation, which can't be handled correct
- * on birth of PBVH and sculpt "layer" levels, so use PBVH only for internal brush
- * stuff and show final DerivedMesh so user would see actual object shape.
- */
- deformed |= object->sculpt->modifiers_active;
+ /* Active modifiers means extra deformation, which can't be handled correct
+ * on birth of PBVH and sculpt "layer" levels, so use PBVH only for internal brush
+ * stuff and show final DerivedMesh so user would see actual object shape.
+ */
+ deformed |= object->sculpt->modifiers_active;
- if (for_construction) {
- deformed |= object->sculpt->kb != NULL;
- }
- else {
- /* As in case with modifiers, we can't synchronize deformation made against
- * PBVH and non-locked keyblock, so also use PBVH only for brushes and
- * final DM to give final result to user.
- */
- deformed |= object->sculpt->kb && (object->shapeflag & OB_SHAPE_LOCK) == 0;
- }
+ if (for_construction) {
+ deformed |= object->sculpt->kb != NULL;
+ }
+ else {
+ /* As in case with modifiers, we can't synchronize deformation made against
+ * PBVH and non-locked keyblock, so also use PBVH only for brushes and
+ * final DM to give final result to user.
+ */
+ deformed |= object->sculpt->kb && (object->shapeflag & OB_SHAPE_LOCK) == 0;
+ }
- return deformed;
+ return deformed;
}
static bool can_pbvh_draw(Object *ob, DerivedMesh *dm)
{
- CDDerivedMesh *cddm = (CDDerivedMesh *) dm;
- Mesh *me = ob->data;
- bool deformed = check_sculpt_object_deformed(ob, false);
+ CDDerivedMesh *cddm = (CDDerivedMesh *)dm;
+ Mesh *me = ob->data;
+ bool deformed = check_sculpt_object_deformed(ob, false);
- if (deformed) {
- return false;
- }
+ if (deformed) {
+ return false;
+ }
- return cddm->mvert == me->mvert || ob->sculpt->kb;
+ return cddm->mvert == me->mvert || ob->sculpt->kb;
}
static PBVH *cdDM_getPBVH(Object *ob, DerivedMesh *dm)
{
- CDDerivedMesh *cddm = (CDDerivedMesh *) dm;
-
- if (!ob) {
- cddm->pbvh = NULL;
- return NULL;
- }
-
- if (!ob->sculpt)
- return NULL;
-
- if (ob->sculpt->pbvh) {
- cddm->pbvh = ob->sculpt->pbvh;
- cddm->pbvh_draw = can_pbvh_draw(ob, dm);
- }
-
- /* Sculpting on a BMesh (dynamic-topology) gets a special PBVH */
- if (!cddm->pbvh && ob->sculpt->bm) {
- cddm->pbvh = BKE_pbvh_new();
- cddm->pbvh_draw = true;
-
- BKE_pbvh_build_bmesh(cddm->pbvh, ob->sculpt->bm,
- ob->sculpt->bm_smooth_shading,
- ob->sculpt->bm_log, ob->sculpt->cd_vert_node_offset,
- ob->sculpt->cd_face_node_offset);
-
- pbvh_show_diffuse_color_set(cddm->pbvh, ob->sculpt->show_diffuse_color);
- pbvh_show_mask_set(cddm->pbvh, ob->sculpt->show_mask);
- }
-
-
- /* always build pbvh from original mesh, and only use it for drawing if
- * this derivedmesh is just original mesh. it's the multires subsurf dm
- * that this is actually for, to support a pbvh on a modified mesh */
- if (!cddm->pbvh && ob->type == OB_MESH) {
- Mesh *me = BKE_object_get_original_mesh(ob);
- const int looptris_num = poly_to_tri_count(me->totpoly, me->totloop);
- MLoopTri *looptri;
- bool deformed;
-
- cddm->pbvh = BKE_pbvh_new();
- cddm->pbvh_draw = can_pbvh_draw(ob, dm);
-
- looptri = MEM_malloc_arrayN(looptris_num, sizeof(*looptri), __func__);
-
- BKE_mesh_recalc_looptri(
- me->mloop, me->mpoly,
- me->mvert,
- me->totloop, me->totpoly,
- looptri);
-
- BKE_pbvh_build_mesh(
- cddm->pbvh,
- me->mpoly, me->mloop,
- me->mvert, me->totvert, &me->vdata,
- looptri, looptris_num);
-
- pbvh_show_diffuse_color_set(cddm->pbvh, ob->sculpt->show_diffuse_color);
- pbvh_show_mask_set(cddm->pbvh, ob->sculpt->show_mask);
-
- deformed = check_sculpt_object_deformed(ob, true);
-
- if (deformed && ob->derivedDeform) {
- DerivedMesh *deformdm = ob->derivedDeform;
- float (*vertCos)[3];
- int totvert;
-
- totvert = deformdm->getNumVerts(deformdm);
- vertCos = MEM_malloc_arrayN(totvert, sizeof(float[3]), "cdDM_getPBVH vertCos");
- deformdm->getVertCos(deformdm, vertCos);
- BKE_pbvh_apply_vertCos(cddm->pbvh, vertCos, totvert);
- MEM_freeN(vertCos);
- }
- }
-
- return cddm->pbvh;
-}
-
-static void cdDM_foreachMappedVert(
- DerivedMesh *dm,
- void (*func)(void *userData, int index, const float co[3], const float no_f[3], const short no_s[3]),
- void *userData,
- DMForeachFlag flag)
-{
- MVert *mv = CDDM_get_verts(dm);
- const int *index = DM_get_vert_data_layer(dm, CD_ORIGINDEX);
- int i;
-
- if (index) {
- for (i = 0; i < dm->numVertData; i++, mv++) {
- const short *no = (flag & DM_FOREACH_USE_NORMAL) ? mv->no : NULL;
- const int orig = *index++;
- if (orig == ORIGINDEX_NONE) continue;
- func(userData, orig, mv->co, NULL, no);
- }
- }
- else {
- for (i = 0; i < dm->numVertData; i++, mv++) {
- const short *no = (flag & DM_FOREACH_USE_NORMAL) ? mv->no : NULL;
- func(userData, i, mv->co, NULL, no);
- }
- }
+ CDDerivedMesh *cddm = (CDDerivedMesh *)dm;
+
+ if (!ob) {
+ cddm->pbvh = NULL;
+ return NULL;
+ }
+
+ if (!ob->sculpt)
+ return NULL;
+
+ if (ob->sculpt->pbvh) {
+ cddm->pbvh = ob->sculpt->pbvh;
+ cddm->pbvh_draw = can_pbvh_draw(ob, dm);
+ }
+
+ /* Sculpting on a BMesh (dynamic-topology) gets a special PBVH */
+ if (!cddm->pbvh && ob->sculpt->bm) {
+ cddm->pbvh = BKE_pbvh_new();
+ cddm->pbvh_draw = true;
+
+ BKE_pbvh_build_bmesh(cddm->pbvh,
+ ob->sculpt->bm,
+ ob->sculpt->bm_smooth_shading,
+ ob->sculpt->bm_log,
+ ob->sculpt->cd_vert_node_offset,
+ ob->sculpt->cd_face_node_offset);
+
+ pbvh_show_diffuse_color_set(cddm->pbvh, ob->sculpt->show_diffuse_color);
+ pbvh_show_mask_set(cddm->pbvh, ob->sculpt->show_mask);
+ }
+
+ /* always build pbvh from original mesh, and only use it for drawing if
+ * this derivedmesh is just original mesh. it's the multires subsurf dm
+ * that this is actually for, to support a pbvh on a modified mesh */
+ if (!cddm->pbvh && ob->type == OB_MESH) {
+ Mesh *me = BKE_object_get_original_mesh(ob);
+ const int looptris_num = poly_to_tri_count(me->totpoly, me->totloop);
+ MLoopTri *looptri;
+ bool deformed;
+
+ cddm->pbvh = BKE_pbvh_new();
+ cddm->pbvh_draw = can_pbvh_draw(ob, dm);
+
+ looptri = MEM_malloc_arrayN(looptris_num, sizeof(*looptri), __func__);
+
+ BKE_mesh_recalc_looptri(me->mloop, me->mpoly, me->mvert, me->totloop, me->totpoly, looptri);
+
+ BKE_pbvh_build_mesh(cddm->pbvh,
+ me->mpoly,
+ me->mloop,
+ me->mvert,
+ me->totvert,
+ &me->vdata,
+ looptri,
+ looptris_num);
+
+ pbvh_show_diffuse_color_set(cddm->pbvh, ob->sculpt->show_diffuse_color);
+ pbvh_show_mask_set(cddm->pbvh, ob->sculpt->show_mask);
+
+ deformed = check_sculpt_object_deformed(ob, true);
+
+ if (deformed && ob->derivedDeform) {
+ DerivedMesh *deformdm = ob->derivedDeform;
+ float(*vertCos)[3];
+ int totvert;
+
+ totvert = deformdm->getNumVerts(deformdm);
+ vertCos = MEM_malloc_arrayN(totvert, sizeof(float[3]), "cdDM_getPBVH vertCos");
+ deformdm->getVertCos(deformdm, vertCos);
+ BKE_pbvh_apply_vertCos(cddm->pbvh, vertCos, totvert);
+ MEM_freeN(vertCos);
+ }
+ }
+
+ return cddm->pbvh;
+}
+
+static void cdDM_foreachMappedVert(DerivedMesh *dm,
+ void (*func)(void *userData,
+ int index,
+ const float co[3],
+ const float no_f[3],
+ const short no_s[3]),
+ void *userData,
+ DMForeachFlag flag)
+{
+ MVert *mv = CDDM_get_verts(dm);
+ const int *index = DM_get_vert_data_layer(dm, CD_ORIGINDEX);
+ int i;
+
+ if (index) {
+ for (i = 0; i < dm->numVertData; i++, mv++) {
+ const short *no = (flag & DM_FOREACH_USE_NORMAL) ? mv->no : NULL;
+ const int orig = *index++;
+ if (orig == ORIGINDEX_NONE)
+ continue;
+ func(userData, orig, mv->co, NULL, no);
+ }
+ }
+ else {
+ for (i = 0; i < dm->numVertData; i++, mv++) {
+ const short *no = (flag & DM_FOREACH_USE_NORMAL) ? mv->no : NULL;
+ func(userData, i, mv->co, NULL, no);
+ }
+ }
}
static void cdDM_foreachMappedEdge(
- DerivedMesh *dm,
- void (*func)(void *userData, int index, const float v0co[3], const float v1co[3]),
- void *userData)
-{
- CDDerivedMesh *cddm = (CDDerivedMesh *) dm;
- MVert *mv = cddm->mvert;
- MEdge *med = cddm->medge;
- int i, orig, *index = DM_get_edge_data_layer(dm, CD_ORIGINDEX);
-
- for (i = 0; i < dm->numEdgeData; i++, med++) {
- if (index) {
- orig = *index++;
- if (orig == ORIGINDEX_NONE) continue;
- func(userData, orig, mv[med->v1].co, mv[med->v2].co);
- }
- else
- func(userData, i, mv[med->v1].co, mv[med->v2].co);
- }
-}
-
-static void cdDM_foreachMappedLoop(
- DerivedMesh *dm,
- void (*func)(void *userData, int vertex_index, int face_index, const float co[3], const float no[3]),
- void *userData,
- DMForeachFlag flag)
-{
- /* We can't use dm->getLoopDataLayout(dm) here, we want to always access dm->loopData, EditDerivedBMesh would
- * return loop data from bmesh itself. */
- const float (*lnors)[3] = (flag & DM_FOREACH_USE_NORMAL) ? DM_get_loop_data_layer(dm, CD_NORMAL) : NULL;
-
- const MVert *mv = CDDM_get_verts(dm);
- const MLoop *ml = CDDM_get_loops(dm);
- const MPoly *mp = CDDM_get_polys(dm);
- const int *v_index = DM_get_vert_data_layer(dm, CD_ORIGINDEX);
- const int *f_index = DM_get_poly_data_layer(dm, CD_ORIGINDEX);
- int p_idx, i;
-
- for (p_idx = 0; p_idx < dm->numPolyData; ++p_idx, ++mp) {
- for (i = 0; i < mp->totloop; ++i, ++ml) {
- const int v_idx = v_index ? v_index[ml->v] : ml->v;
- const int f_idx = f_index ? f_index[p_idx] : p_idx;
- const float *no = lnors ? *lnors++ : NULL;
- if (!ELEM(ORIGINDEX_NONE, v_idx, f_idx)) {
- func(userData, v_idx, f_idx, mv[ml->v].co, no);
- }
- }
- }
+ DerivedMesh *dm,
+ void (*func)(void *userData, int index, const float v0co[3], const float v1co[3]),
+ void *userData)
+{
+ CDDerivedMesh *cddm = (CDDerivedMesh *)dm;
+ MVert *mv = cddm->mvert;
+ MEdge *med = cddm->medge;
+ int i, orig, *index = DM_get_edge_data_layer(dm, CD_ORIGINDEX);
+
+ for (i = 0; i < dm->numEdgeData; i++, med++) {
+ if (index) {
+ orig = *index++;
+ if (orig == ORIGINDEX_NONE)
+ continue;
+ func(userData, orig, mv[med->v1].co, mv[med->v2].co);
+ }
+ else
+ func(userData, i, mv[med->v1].co, mv[med->v2].co);
+ }
+}
+
+static void cdDM_foreachMappedLoop(DerivedMesh *dm,
+ void (*func)(void *userData,
+ int vertex_index,
+ int face_index,
+ const float co[3],
+ const float no[3]),
+ void *userData,
+ DMForeachFlag flag)
+{
+ /* We can't use dm->getLoopDataLayout(dm) here, we want to always access dm->loopData, EditDerivedBMesh would
+ * return loop data from bmesh itself. */
+ const float(*lnors)[3] = (flag & DM_FOREACH_USE_NORMAL) ? DM_get_loop_data_layer(dm, CD_NORMAL) :
+ NULL;
+
+ const MVert *mv = CDDM_get_verts(dm);
+ const MLoop *ml = CDDM_get_loops(dm);
+ const MPoly *mp = CDDM_get_polys(dm);
+ const int *v_index = DM_get_vert_data_layer(dm, CD_ORIGINDEX);
+ const int *f_index = DM_get_poly_data_layer(dm, CD_ORIGINDEX);
+ int p_idx, i;
+
+ for (p_idx = 0; p_idx < dm->numPolyData; ++p_idx, ++mp) {
+ for (i = 0; i < mp->totloop; ++i, ++ml) {
+ const int v_idx = v_index ? v_index[ml->v] : ml->v;
+ const int f_idx = f_index ? f_index[p_idx] : p_idx;
+ const float *no = lnors ? *lnors++ : NULL;
+ if (!ELEM(ORIGINDEX_NONE, v_idx, f_idx)) {
+ func(userData, v_idx, f_idx, mv[ml->v].co, no);
+ }
+ }
+ }
}
static void cdDM_foreachMappedFaceCenter(
- DerivedMesh *dm,
- void (*func)(void *userData, int index, const float cent[3], const float no[3]),
- void *userData,
- DMForeachFlag flag)
-{
- CDDerivedMesh *cddm = (CDDerivedMesh *)dm;
- MVert *mvert = cddm->mvert;
- MPoly *mp;
- MLoop *ml;
- int i, orig, *index;
-
- index = CustomData_get_layer(&dm->polyData, CD_ORIGINDEX);
- mp = cddm->mpoly;
- for (i = 0; i < dm->numPolyData; i++, mp++) {
- float cent[3];
- float *no, _no[3];
-
- if (index) {
- orig = *index++;
- if (orig == ORIGINDEX_NONE) continue;
- }
- else {
- orig = i;
- }
-
- ml = &cddm->mloop[mp->loopstart];
- BKE_mesh_calc_poly_center(mp, ml, mvert, cent);
-
- if (flag & DM_FOREACH_USE_NORMAL) {
- BKE_mesh_calc_poly_normal(mp, ml, mvert, (no = _no));
- }
- else {
- no = NULL;
- }
-
- func(userData, orig, cent, no);
- }
-
+ DerivedMesh *dm,
+ void (*func)(void *userData, int index, const float cent[3], const float no[3]),
+ void *userData,
+ DMForeachFlag flag)
+{
+ CDDerivedMesh *cddm = (CDDerivedMesh *)dm;
+ MVert *mvert = cddm->mvert;
+ MPoly *mp;
+ MLoop *ml;
+ int i, orig, *index;
+
+ index = CustomData_get_layer(&dm->polyData, CD_ORIGINDEX);
+ mp = cddm->mpoly;
+ for (i = 0; i < dm->numPolyData; i++, mp++) {
+ float cent[3];
+ float *no, _no[3];
+
+ if (index) {
+ orig = *index++;
+ if (orig == ORIGINDEX_NONE)
+ continue;
+ }
+ else {
+ orig = i;
+ }
+
+ ml = &cddm->mloop[mp->loopstart];
+ BKE_mesh_calc_poly_center(mp, ml, mvert, cent);
+
+ if (flag & DM_FOREACH_USE_NORMAL) {
+ BKE_mesh_calc_poly_normal(mp, ml, mvert, (no = _no));
+ }
+ else {
+ no = NULL;
+ }
+
+ func(userData, orig, cent, no);
+ }
}
void CDDM_recalc_tessellation_ex(DerivedMesh *dm, const bool do_face_nor_cpy)
{
- CDDerivedMesh *cddm = (CDDerivedMesh *)dm;
+ CDDerivedMesh *cddm = (CDDerivedMesh *)dm;
- dm->numTessFaceData = BKE_mesh_recalc_tessellation(
- &dm->faceData, &dm->loopData, &dm->polyData,
- cddm->mvert,
- dm->numTessFaceData, dm->numLoopData, dm->numPolyData,
- do_face_nor_cpy);
+ dm->numTessFaceData = BKE_mesh_recalc_tessellation(&dm->faceData,
+ &dm->loopData,
+ &dm->polyData,
+ cddm->mvert,
+ dm->numTessFaceData,
+ dm->numLoopData,
+ dm->numPolyData,
+ do_face_nor_cpy);
- cddm->mface = CustomData_get_layer(&dm->faceData, CD_MFACE);
+ cddm->mface = CustomData_get_layer(&dm->faceData, CD_MFACE);
- /* Tessellation recreated faceData, and the active layer indices need to get re-propagated
- * from loops and polys to faces */
- CustomData_bmesh_update_active_layers(&dm->faceData, &dm->loopData);
+ /* Tessellation recreated faceData, and the active layer indices need to get re-propagated
+ * from loops and polys to faces */
+ CustomData_bmesh_update_active_layers(&dm->faceData, &dm->loopData);
}
void CDDM_recalc_tessellation(DerivedMesh *dm)
{
- CDDM_recalc_tessellation_ex(dm, true);
+ CDDM_recalc_tessellation_ex(dm, true);
}
void CDDM_recalc_looptri(DerivedMesh *dm)
{
- CDDerivedMesh *cddm = (CDDerivedMesh *)dm;
- const unsigned int totpoly = dm->numPolyData;
- const unsigned int totloop = dm->numLoopData;
+ CDDerivedMesh *cddm = (CDDerivedMesh *)dm;
+ const unsigned int totpoly = dm->numPolyData;
+ const unsigned int totloop = dm->numLoopData;
- DM_ensure_looptri_data(dm);
- BLI_assert(totpoly == 0 || cddm->dm.looptris.array_wip != NULL);
+ DM_ensure_looptri_data(dm);
+ BLI_assert(totpoly == 0 || cddm->dm.looptris.array_wip != NULL);
- BKE_mesh_recalc_looptri(
- cddm->mloop, cddm->mpoly,
- cddm->mvert,
- totloop, totpoly,
- cddm->dm.looptris.array_wip);
+ BKE_mesh_recalc_looptri(
+ cddm->mloop, cddm->mpoly, cddm->mvert, totloop, totpoly, cddm->dm.looptris.array_wip);
- BLI_assert(cddm->dm.looptris.array == NULL);
- atomic_cas_ptr((void **)&cddm->dm.looptris.array, cddm->dm.looptris.array, cddm->dm.looptris.array_wip);
- cddm->dm.looptris.array_wip = NULL;
+ BLI_assert(cddm->dm.looptris.array == NULL);
+ atomic_cas_ptr(
+ (void **)&cddm->dm.looptris.array, cddm->dm.looptris.array, cddm->dm.looptris.array_wip);
+ cddm->dm.looptris.array_wip = NULL;
}
static void cdDM_free_internal(CDDerivedMesh *cddm)
{
- if (cddm->pmap) MEM_freeN(cddm->pmap);
- if (cddm->pmap_mem) MEM_freeN(cddm->pmap_mem);
+ if (cddm->pmap)
+ MEM_freeN(cddm->pmap);
+ if (cddm->pmap_mem)
+ MEM_freeN(cddm->pmap_mem);
}
static void cdDM_release(DerivedMesh *dm)
{
- CDDerivedMesh *cddm = (CDDerivedMesh *)dm;
+ CDDerivedMesh *cddm = (CDDerivedMesh *)dm;
- if (DM_release(dm)) {
- cdDM_free_internal(cddm);
- MEM_freeN(cddm);
- }
+ if (DM_release(dm)) {
+ cdDM_free_internal(cddm);
+ MEM_freeN(cddm);
+ }
}
/**************** CDDM interface functions ****************/
static CDDerivedMesh *cdDM_create(const char *desc)
{
- CDDerivedMesh *cddm;
- DerivedMesh *dm;
+ CDDerivedMesh *cddm;
+ DerivedMesh *dm;
- cddm = MEM_callocN(sizeof(*cddm), desc);
- dm = &cddm->dm;
+ cddm = MEM_callocN(sizeof(*cddm), desc);
+ dm = &cddm->dm;
- dm->getMinMax = cdDM_getMinMax;
+ dm->getMinMax = cdDM_getMinMax;
- dm->getNumVerts = cdDM_getNumVerts;
- dm->getNumEdges = cdDM_getNumEdges;
- dm->getNumTessFaces = cdDM_getNumTessFaces;
- dm->getNumLoops = cdDM_getNumLoops;
- dm->getNumPolys = cdDM_getNumPolys;
+ dm->getNumVerts = cdDM_getNumVerts;
+ dm->getNumEdges = cdDM_getNumEdges;
+ dm->getNumTessFaces = cdDM_getNumTessFaces;
+ dm->getNumLoops = cdDM_getNumLoops;
+ dm->getNumPolys = cdDM_getNumPolys;
- dm->getVert = cdDM_getVert;
- dm->getEdge = cdDM_getEdge;
- dm->getTessFace = cdDM_getTessFace;
+ dm->getVert = cdDM_getVert;
+ dm->getEdge = cdDM_getEdge;
+ dm->getTessFace = cdDM_getTessFace;
- dm->copyVertArray = cdDM_copyVertArray;
- dm->copyEdgeArray = cdDM_copyEdgeArray;
- dm->copyTessFaceArray = cdDM_copyTessFaceArray;
- dm->copyLoopArray = cdDM_copyLoopArray;
- dm->copyPolyArray = cdDM_copyPolyArray;
+ dm->copyVertArray = cdDM_copyVertArray;
+ dm->copyEdgeArray = cdDM_copyEdgeArray;
+ dm->copyTessFaceArray = cdDM_copyTessFaceArray;
+ dm->copyLoopArray = cdDM_copyLoopArray;
+ dm->copyPolyArray = cdDM_copyPolyArray;
- dm->getVertData = DM_get_vert_data;
- dm->getEdgeData = DM_get_edge_data;
- dm->getTessFaceData = DM_get_tessface_data;
- dm->getVertDataArray = DM_get_vert_data_layer;
- dm->getEdgeDataArray = DM_get_edge_data_layer;
- dm->getTessFaceDataArray = DM_get_tessface_data_layer;
+ dm->getVertData = DM_get_vert_data;
+ dm->getEdgeData = DM_get_edge_data;
+ dm->getTessFaceData = DM_get_tessface_data;
+ dm->getVertDataArray = DM_get_vert_data_layer;
+ dm->getEdgeDataArray = DM_get_edge_data_layer;
+ dm->getTessFaceDataArray = DM_get_tessface_data_layer;
- dm->calcNormals = CDDM_calc_normals;
- dm->calcLoopNormals = CDDM_calc_loop_normals;
- dm->calcLoopNormalsSpaceArray = CDDM_calc_loop_normals_spacearr;
- dm->calcLoopTangents = DM_calc_loop_tangents;
- dm->recalcTessellation = CDDM_recalc_tessellation;
- dm->recalcLoopTri = CDDM_recalc_looptri;
+ dm->calcNormals = CDDM_calc_normals;
+ dm->calcLoopNormals = CDDM_calc_loop_normals;
+ dm->calcLoopNormalsSpaceArray = CDDM_calc_loop_normals_spacearr;
+ dm->calcLoopTangents = DM_calc_loop_tangents;
+ dm->recalcTessellation = CDDM_recalc_tessellation;
+ dm->recalcLoopTri = CDDM_recalc_looptri;
- dm->getVertCos = cdDM_getVertCos;
- dm->getVertCo = cdDM_getVertCo;
- dm->getVertNo = cdDM_getVertNo;
+ dm->getVertCos = cdDM_getVertCos;
+ dm->getVertCo = cdDM_getVertCo;
+ dm->getVertNo = cdDM_getVertNo;
- dm->getPBVH = cdDM_getPBVH;
- dm->getPolyMap = cdDM_getPolyMap;
+ dm->getPBVH = cdDM_getPBVH;
+ dm->getPolyMap = cdDM_getPolyMap;
- dm->foreachMappedVert = cdDM_foreachMappedVert;
- dm->foreachMappedEdge = cdDM_foreachMappedEdge;
- dm->foreachMappedLoop = cdDM_foreachMappedLoop;
- dm->foreachMappedFaceCenter = cdDM_foreachMappedFaceCenter;
+ dm->foreachMappedVert = cdDM_foreachMappedVert;
+ dm->foreachMappedEdge = cdDM_foreachMappedEdge;
+ dm->foreachMappedLoop = cdDM_foreachMappedLoop;
+ dm->foreachMappedFaceCenter = cdDM_foreachMappedFaceCenter;
- dm->release = cdDM_release;
+ dm->release = cdDM_release;
- return cddm;
+ return cddm;
}
DerivedMesh *CDDM_new(int numVerts, int numEdges, int numTessFaces, int numLoops, int numPolys)
{
- CDDerivedMesh *cddm = cdDM_create("CDDM_new dm");
- DerivedMesh *dm = &cddm->dm;
+ CDDerivedMesh *cddm = cdDM_create("CDDM_new dm");
+ DerivedMesh *dm = &cddm->dm;
- DM_init(dm, DM_TYPE_CDDM, numVerts, numEdges, numTessFaces, numLoops, numPolys);
+ DM_init(dm, DM_TYPE_CDDM, numVerts, numEdges, numTessFaces, numLoops, numPolys);
- CustomData_add_layer(&dm->vertData, CD_ORIGINDEX, CD_CALLOC, NULL, numVerts);
- CustomData_add_layer(&dm->edgeData, CD_ORIGINDEX, CD_CALLOC, NULL, numEdges);
- CustomData_add_layer(&dm->faceData, CD_ORIGINDEX, CD_CALLOC, NULL, numTessFaces);
- CustomData_add_layer(&dm->polyData, CD_ORIGINDEX, CD_CALLOC, NULL, numPolys);
+ CustomData_add_layer(&dm->vertData, CD_ORIGINDEX, CD_CALLOC, NULL, numVerts);
+ CustomData_add_layer(&dm->edgeData, CD_ORIGINDEX, CD_CALLOC, NULL, numEdges);
+ CustomData_add_layer(&dm->faceData, CD_ORIGINDEX, CD_CALLOC, NULL, numTessFaces);
+ CustomData_add_layer(&dm->polyData, CD_ORIGINDEX, CD_CALLOC, NULL, numPolys);
- CustomData_add_layer(&dm->vertData, CD_MVERT, CD_CALLOC, NULL, numVerts);
- CustomData_add_layer(&dm->edgeData, CD_MEDGE, CD_CALLOC, NULL, numEdges);
- CustomData_add_layer(&dm->faceData, CD_MFACE, CD_CALLOC, NULL, numTessFaces);
- CustomData_add_layer(&dm->loopData, CD_MLOOP, CD_CALLOC, NULL, numLoops);
- CustomData_add_layer(&dm->polyData, CD_MPOLY, CD_CALLOC, NULL, numPolys);
+ CustomData_add_layer(&dm->vertData, CD_MVERT, CD_CALLOC, NULL, numVerts);
+ CustomData_add_layer(&dm->edgeData, CD_MEDGE, CD_CALLOC, NULL, numEdges);
+ CustomData_add_layer(&dm->faceData, CD_MFACE, CD_CALLOC, NULL, numTessFaces);
+ CustomData_add_layer(&dm->loopData, CD_MLOOP, CD_CALLOC, NULL, numLoops);
+ CustomData_add_layer(&dm->polyData, CD_MPOLY, CD_CALLOC, NULL, numPolys);
- cddm->mvert = CustomData_get_layer(&dm->vertData, CD_MVERT);
- cddm->medge = CustomData_get_layer(&dm->edgeData, CD_MEDGE);
- cddm->mface = CustomData_get_layer(&dm->faceData, CD_MFACE);
- cddm->mloop = CustomData_get_layer(&dm->loopData, CD_MLOOP);
- cddm->mpoly = CustomData_get_layer(&dm->polyData, CD_MPOLY);
+ cddm->mvert = CustomData_get_layer(&dm->vertData, CD_MVERT);
+ cddm->medge = CustomData_get_layer(&dm->edgeData, CD_MEDGE);
+ cddm->mface = CustomData_get_layer(&dm->faceData, CD_MFACE);
+ cddm->mloop = CustomData_get_layer(&dm->loopData, CD_MLOOP);
+ cddm->mpoly = CustomData_get_layer(&dm->polyData, CD_MPOLY);
- return dm;
+ return dm;
}
DerivedMesh *CDDM_from_mesh(Mesh *mesh)
{
- return CDDM_from_mesh_ex(mesh, CD_REFERENCE, &CD_MASK_MESH);
-}
-
-DerivedMesh *CDDM_from_mesh_ex(Mesh *mesh, eCDAllocType alloctype, const CustomData_MeshMasks *mask)
-{
- CDDerivedMesh *cddm = cdDM_create(__func__);
- DerivedMesh *dm = &cddm->dm;
- CustomData_MeshMasks cddata_masks = *mask;
-
- cddata_masks.lmask &= ~CD_MASK_MDISPS;
-
- /* this does a referenced copy, with an exception for fluidsim */
-
- DM_init(dm, DM_TYPE_CDDM, mesh->totvert, mesh->totedge, 0 /* mesh->totface */,
- mesh->totloop, mesh->totpoly);
-
- /* This should actually be dm->deformedOnly = mesh->runtime.deformed_only,
- * but only if the original mesh had its deformed_only flag correctly set
- * (which isn't generally the case). */
- dm->deformedOnly = 1;
- dm->cd_flag = mesh->cd_flag;
-
- if (mesh->runtime.cd_dirty_vert & CD_MASK_NORMAL) {
- dm->dirty |= DM_DIRTY_NORMALS;
- }
- /* TODO DM_DIRTY_TESS_CDLAYERS ? Maybe not though, since we probably want to switch to looptris ? */
-
- CustomData_merge(&mesh->vdata, &dm->vertData, cddata_masks.vmask, alloctype,
- mesh->totvert);
- CustomData_merge(&mesh->edata, &dm->edgeData, cddata_masks.emask, alloctype,
- mesh->totedge);
- CustomData_merge(&mesh->fdata, &dm->faceData, cddata_masks.fmask | CD_MASK_ORIGINDEX, alloctype,
- 0 /* mesh->totface */);
- CustomData_merge(&mesh->ldata, &dm->loopData, cddata_masks.lmask, alloctype,
- mesh->totloop);
- CustomData_merge(&mesh->pdata, &dm->polyData, cddata_masks.pmask, alloctype,
- mesh->totpoly);
-
- cddm->mvert = CustomData_get_layer(&dm->vertData, CD_MVERT);
- cddm->medge = CustomData_get_layer(&dm->edgeData, CD_MEDGE);
- cddm->mloop = CustomData_get_layer(&dm->loopData, CD_MLOOP);
- cddm->mpoly = CustomData_get_layer(&dm->polyData, CD_MPOLY);
+ return CDDM_from_mesh_ex(mesh, CD_REFERENCE, &CD_MASK_MESH);
+}
+
+DerivedMesh *CDDM_from_mesh_ex(Mesh *mesh,
+ eCDAllocType alloctype,
+ const CustomData_MeshMasks *mask)
+{
+ CDDerivedMesh *cddm = cdDM_create(__func__);
+ DerivedMesh *dm = &cddm->dm;
+ CustomData_MeshMasks cddata_masks = *mask;
+
+ cddata_masks.lmask &= ~CD_MASK_MDISPS;
+
+ /* this does a referenced copy, with an exception for fluidsim */
+
+ DM_init(dm,
+ DM_TYPE_CDDM,
+ mesh->totvert,
+ mesh->totedge,
+ 0 /* mesh->totface */,
+ mesh->totloop,
+ mesh->totpoly);
+
+ /* This should actually be dm->deformedOnly = mesh->runtime.deformed_only,
+ * but only if the original mesh had its deformed_only flag correctly set
+ * (which isn't generally the case). */
+ dm->deformedOnly = 1;
+ dm->cd_flag = mesh->cd_flag;
+
+ if (mesh->runtime.cd_dirty_vert & CD_MASK_NORMAL) {
+ dm->dirty |= DM_DIRTY_NORMALS;
+ }
+ /* TODO DM_DIRTY_TESS_CDLAYERS ? Maybe not though, since we probably want to switch to looptris ? */
+
+ CustomData_merge(&mesh->vdata, &dm->vertData, cddata_masks.vmask, alloctype, mesh->totvert);
+ CustomData_merge(&mesh->edata, &dm->edgeData, cddata_masks.emask, alloctype, mesh->totedge);
+ CustomData_merge(&mesh->fdata,
+ &dm->faceData,
+ cddata_masks.fmask | CD_MASK_ORIGINDEX,
+ alloctype,
+ 0 /* mesh->totface */);
+ CustomData_merge(&mesh->ldata, &dm->loopData, cddata_masks.lmask, alloctype, mesh->totloop);
+ CustomData_merge(&mesh->pdata, &dm->polyData, cddata_masks.pmask, alloctype, mesh->totpoly);
+
+ cddm->mvert = CustomData_get_layer(&dm->vertData, CD_MVERT);
+ cddm->medge = CustomData_get_layer(&dm->edgeData, CD_MEDGE);
+ cddm->mloop = CustomData_get_layer(&dm->loopData, CD_MLOOP);
+ cddm->mpoly = CustomData_get_layer(&dm->polyData, CD_MPOLY);
#if 0
- cddm->mface = CustomData_get_layer(&dm->faceData, CD_MFACE);
+ cddm->mface = CustomData_get_layer(&dm->faceData, CD_MFACE);
#else
- cddm->mface = NULL;
+ cddm->mface = NULL;
#endif
- /* commented since even when CD_ORIGINDEX was first added this line fails
- * on the default cube, (after editmode toggle too) - campbell */
+ /* commented since even when CD_ORIGINDEX was first added this line fails
+ * on the default cube, (after editmode toggle too) - campbell */
#if 0
- BLI_assert(CustomData_has_layer(&cddm->dm.faceData, CD_ORIGINDEX));
+ BLI_assert(CustomData_has_layer(&cddm->dm.faceData, CD_ORIGINDEX));
#endif
- return dm;
+ return dm;
}
DerivedMesh *CDDM_from_curve(Object *ob)
{
- ListBase disp = {NULL, NULL};
+ ListBase disp = {NULL, NULL};
- if (ob->runtime.curve_cache) {
- disp = ob->runtime.curve_cache->disp;
- }
+ if (ob->runtime.curve_cache) {
+ disp = ob->runtime.curve_cache->disp;
+ }
- return CDDM_from_curve_displist(ob, &disp);
+ return CDDM_from_curve_displist(ob, &disp);
}
DerivedMesh *CDDM_from_curve_displist(Object *ob, ListBase *dispbase)
{
- Curve *cu = (Curve *) ob->data;
- DerivedMesh *dm;
- CDDerivedMesh *cddm;
- MVert *allvert;
- MEdge *alledge;
- MLoop *allloop;
- MPoly *allpoly;
- MLoopUV *alluv = NULL;
- int totvert, totedge, totloop, totpoly;
- bool use_orco_uv = (cu->flag & CU_UV_ORCO) != 0;
-
- if (BKE_mesh_nurbs_displist_to_mdata(
- ob, dispbase, &allvert, &totvert, &alledge,
- &totedge, &allloop, &allpoly, (use_orco_uv) ? &alluv : NULL,
- &totloop, &totpoly) != 0)
- {
- /* Error initializing mdata. This often happens when curve is empty */
- return CDDM_new(0, 0, 0, 0, 0);
- }
-
- dm = CDDM_new(totvert, totedge, 0, totloop, totpoly);
- dm->deformedOnly = 1;
- dm->dirty |= DM_DIRTY_NORMALS;
-
- cddm = (CDDerivedMesh *)dm;
-
- memcpy(cddm->mvert, allvert, totvert * sizeof(MVert));
- memcpy(cddm->medge, alledge, totedge * sizeof(MEdge));
- memcpy(cddm->mloop, allloop, totloop * sizeof(MLoop));
- memcpy(cddm->mpoly, allpoly, totpoly * sizeof(MPoly));
-
- if (alluv) {
- const char *uvname = "Orco";
- CustomData_add_layer_named(&cddm->dm.loopData, CD_MLOOPUV, CD_ASSIGN, alluv, totloop, uvname);
- }
-
- MEM_freeN(allvert);
- MEM_freeN(alledge);
- MEM_freeN(allloop);
- MEM_freeN(allpoly);
-
- return dm;
+ Curve *cu = (Curve *)ob->data;
+ DerivedMesh *dm;
+ CDDerivedMesh *cddm;
+ MVert *allvert;
+ MEdge *alledge;
+ MLoop *allloop;
+ MPoly *allpoly;
+ MLoopUV *alluv = NULL;
+ int totvert, totedge, totloop, totpoly;
+ bool use_orco_uv = (cu->flag & CU_UV_ORCO) != 0;
+
+ if (BKE_mesh_nurbs_displist_to_mdata(ob,
+ dispbase,
+ &allvert,
+ &totvert,
+ &alledge,
+ &totedge,
+ &allloop,
+ &allpoly,
+ (use_orco_uv) ? &alluv : NULL,
+ &totloop,
+ &totpoly) != 0) {
+ /* Error initializing mdata. This often happens when curve is empty */
+ return CDDM_new(0, 0, 0, 0, 0);
+ }
+
+ dm = CDDM_new(totvert, totedge, 0, totloop, totpoly);
+ dm->deformedOnly = 1;
+ dm->dirty |= DM_DIRTY_NORMALS;
+
+ cddm = (CDDerivedMesh *)dm;
+
+ memcpy(cddm->mvert, allvert, totvert * sizeof(MVert));
+ memcpy(cddm->medge, alledge, totedge * sizeof(MEdge));
+ memcpy(cddm->mloop, allloop, totloop * sizeof(MLoop));
+ memcpy(cddm->mpoly, allpoly, totpoly * sizeof(MPoly));
+
+ if (alluv) {
+ const char *uvname = "Orco";
+ CustomData_add_layer_named(&cddm->dm.loopData, CD_MLOOPUV, CD_ASSIGN, alluv, totloop, uvname);
+ }
+
+ MEM_freeN(allvert);
+ MEM_freeN(alledge);
+ MEM_freeN(allloop);
+ MEM_freeN(allpoly);
+
+ return dm;
}
static void loops_to_customdata_corners(
- BMesh *bm, CustomData *facedata,
- int cdindex, const BMLoop *l3[3],
- int numCol, int numUV)
-{
- const BMLoop *l;
-// BMFace *f = l3[0]->f;
- MTFace *texface;
- MCol *mcol;
- MLoopCol *mloopcol;
- MLoopUV *mloopuv;
- int i, j, hasPCol = CustomData_has_layer(&bm->ldata, CD_PREVIEW_MLOOPCOL);
-
- for (i = 0; i < numUV; i++) {
- texface = CustomData_get_n(facedata, CD_MTFACE, cdindex, i);
-
- for (j = 0; j < 3; j++) {
- l = l3[j];
- mloopuv = CustomData_bmesh_get_n(&bm->ldata, l->head.data, CD_MLOOPUV, i);
- copy_v2_v2(texface->uv[j], mloopuv->uv);
- }
- }
-
- for (i = 0; i < numCol; i++) {
- mcol = CustomData_get_n(facedata, CD_MCOL, cdindex, i);
-
- for (j = 0; j < 3; j++) {
- l = l3[j];
- mloopcol = CustomData_bmesh_get_n(&bm->ldata, l->head.data, CD_MLOOPCOL, i);
- MESH_MLOOPCOL_TO_MCOL(mloopcol, &mcol[j]);
- }
- }
-
- if (hasPCol) {
- mcol = CustomData_get(facedata, cdindex, CD_PREVIEW_MCOL);
-
- for (j = 0; j < 3; j++) {
- l = l3[j];
- mloopcol = CustomData_bmesh_get(&bm->ldata, l->head.data, CD_PREVIEW_MLOOPCOL);
- MESH_MLOOPCOL_TO_MCOL(mloopcol, &mcol[j]);
- }
- }
+ BMesh *bm, CustomData *facedata, int cdindex, const BMLoop *l3[3], int numCol, int numUV)
+{
+ const BMLoop *l;
+ // BMFace *f = l3[0]->f;
+ MTFace *texface;
+ MCol *mcol;
+ MLoopCol *mloopcol;
+ MLoopUV *mloopuv;
+ int i, j, hasPCol = CustomData_has_layer(&bm->ldata, CD_PREVIEW_MLOOPCOL);
+
+ for (i = 0; i < numUV; i++) {
+ texface = CustomData_get_n(facedata, CD_MTFACE, cdindex, i);
+
+ for (j = 0; j < 3; j++) {
+ l = l3[j];
+ mloopuv = CustomData_bmesh_get_n(&bm->ldata, l->head.data, CD_MLOOPUV, i);
+ copy_v2_v2(texface->uv[j], mloopuv->uv);
+ }
+ }
+
+ for (i = 0; i < numCol; i++) {
+ mcol = CustomData_get_n(facedata, CD_MCOL, cdindex, i);
+
+ for (j = 0; j < 3; j++) {
+ l = l3[j];
+ mloopcol = CustomData_bmesh_get_n(&bm->ldata, l->head.data, CD_MLOOPCOL, i);
+ MESH_MLOOPCOL_TO_MCOL(mloopcol, &mcol[j]);
+ }
+ }
+
+ if (hasPCol) {
+ mcol = CustomData_get(facedata, cdindex, CD_PREVIEW_MCOL);
+
+ for (j = 0; j < 3; j++) {
+ l = l3[j];
+ mloopcol = CustomData_bmesh_get(&bm->ldata, l->head.data, CD_PREVIEW_MLOOPCOL);
+ MESH_MLOOPCOL_TO_MCOL(mloopcol, &mcol[j]);
+ }
+ }
}
/* TODO(campbell): remove, use BKE_mesh_from_bmesh_for_eval_nomain instead. */
/* used for both editbmesh and bmesh */
-static DerivedMesh *cddm_from_bmesh_ex(
- struct BMesh *bm, const bool use_mdisps,
- /* EditBMesh vars for use_tessface */
- const bool use_tessface,
- const int em_tottri, const BMLoop *(*em_looptris)[3])
-{
- DerivedMesh *dm = CDDM_new(bm->totvert,
- bm->totedge,
- use_tessface ? em_tottri : 0,
- bm->totloop,
- bm->totface);
-
- CDDerivedMesh *cddm = (CDDerivedMesh *)dm;
- BMIter iter;
- BMVert *eve;
- BMEdge *eed;
- BMFace *efa;
- MVert *mvert = cddm->mvert;
- MEdge *medge = cddm->medge;
- MFace *mface = cddm->mface;
- MLoop *mloop = cddm->mloop;
- MPoly *mpoly = cddm->mpoly;
- int numCol = CustomData_number_of_layers(&bm->ldata, CD_MLOOPCOL);
- int numUV = CustomData_number_of_layers(&bm->ldata, CD_MLOOPUV);
- int *index, add_orig;
- CustomData_MeshMasks mask = {0};
- unsigned int i, j;
-
- const int cd_vert_bweight_offset = CustomData_get_offset(&bm->vdata, CD_BWEIGHT);
- const int cd_edge_bweight_offset = CustomData_get_offset(&bm->edata, CD_BWEIGHT);
- const int cd_edge_crease_offset = CustomData_get_offset(&bm->edata, CD_CREASE);
-
- dm->deformedOnly = 1;
-
- /* don't add origindex layer if one already exists */
- add_orig = !CustomData_has_layer(&bm->pdata, CD_ORIGINDEX);
-
- mask = CD_MASK_DERIVEDMESH;
- if (use_mdisps) {
- mask.lmask |= CD_MASK_MDISPS;
- }
-
- /* don't process shapekeys, we only feed them through the modifier stack as needed,
- * e.g. for applying modifiers or the like*/
- mask.vmask &= ~CD_MASK_SHAPEKEY;
- CustomData_merge(&bm->vdata, &dm->vertData, mask.vmask,
- CD_CALLOC, dm->numVertData);
- CustomData_merge(&bm->edata, &dm->edgeData, mask.emask,
- CD_CALLOC, dm->numEdgeData);
- CustomData_merge(&bm->ldata, &dm->loopData, mask.lmask,
- CD_CALLOC, dm->numLoopData);
- CustomData_merge(&bm->pdata, &dm->polyData, mask.pmask,
- CD_CALLOC, dm->numPolyData);
-
- /* add tessellation mface layers */
- if (use_tessface) {
- CustomData_from_bmeshpoly(&dm->faceData, &dm->loopData, em_tottri);
- }
-
- index = dm->getVertDataArray(dm, CD_ORIGINDEX);
-
- BM_ITER_MESH_INDEX (eve, &iter, bm, BM_VERTS_OF_MESH, i) {
- MVert *mv = &mvert[i];
-
- copy_v3_v3(mv->co, eve->co);
-
- BM_elem_index_set(eve, i); /* set_inline */
-
- normal_float_to_short_v3(mv->no, eve->no);
-
- mv->flag = BM_vert_flag_to_mflag(eve);
-
- if (cd_vert_bweight_offset != -1) mv->bweight = BM_ELEM_CD_GET_FLOAT_AS_UCHAR(eve, cd_vert_bweight_offset);
-
- if (add_orig) *index++ = i;
+static DerivedMesh *cddm_from_bmesh_ex(struct BMesh *bm,
+ const bool use_mdisps,
+ /* EditBMesh vars for use_tessface */
+ const bool use_tessface,
+ const int em_tottri,
+ const BMLoop *(*em_looptris)[3])
+{
+ DerivedMesh *dm = CDDM_new(
+ bm->totvert, bm->totedge, use_tessface ? em_tottri : 0, bm->totloop, bm->totface);
+
+ CDDerivedMesh *cddm = (CDDerivedMesh *)dm;
+ BMIter iter;
+ BMVert *eve;
+ BMEdge *eed;
+ BMFace *efa;
+ MVert *mvert = cddm->mvert;
+ MEdge *medge = cddm->medge;
+ MFace *mface = cddm->mface;
+ MLoop *mloop = cddm->mloop;
+ MPoly *mpoly = cddm->mpoly;
+ int numCol = CustomData_number_of_layers(&bm->ldata, CD_MLOOPCOL);
+ int numUV = CustomData_number_of_layers(&bm->ldata, CD_MLOOPUV);
+ int *index, add_orig;
+ CustomData_MeshMasks mask = {0};
+ unsigned int i, j;
+
+ const int cd_vert_bweight_offset = CustomData_get_offset(&bm->vdata, CD_BWEIGHT);
+ const int cd_edge_bweight_offset = CustomData_get_offset(&bm->edata, CD_BWEIGHT);
+ const int cd_edge_crease_offset = CustomData_get_offset(&bm->edata, CD_CREASE);
+
+ dm->deformedOnly = 1;
+
+ /* don't add origindex layer if one already exists */
+ add_orig = !CustomData_has_layer(&bm->pdata, CD_ORIGINDEX);
+
+ mask = CD_MASK_DERIVEDMESH;
+ if (use_mdisps) {
+ mask.lmask |= CD_MASK_MDISPS;
+ }
+
+ /* don't process shapekeys, we only feed them through the modifier stack as needed,
+ * e.g. for applying modifiers or the like*/
+ mask.vmask &= ~CD_MASK_SHAPEKEY;
+ CustomData_merge(&bm->vdata, &dm->vertData, mask.vmask, CD_CALLOC, dm->numVertData);
+ CustomData_merge(&bm->edata, &dm->edgeData, mask.emask, CD_CALLOC, dm->numEdgeData);
+ CustomData_merge(&bm->ldata, &dm->loopData, mask.lmask, CD_CALLOC, dm->numLoopData);
+ CustomData_merge(&bm->pdata, &dm->polyData, mask.pmask, CD_CALLOC, dm->numPolyData);
+
+ /* add tessellation mface layers */
+ if (use_tessface) {
+ CustomData_from_bmeshpoly(&dm->faceData, &dm->loopData, em_tottri);
+ }
+
+ index = dm->getVertDataArray(dm, CD_ORIGINDEX);
+
+ BM_ITER_MESH_INDEX (eve, &iter, bm, BM_VERTS_OF_MESH, i) {
+ MVert *mv = &mvert[i];
+
+ copy_v3_v3(mv->co, eve->co);
+
+ BM_elem_index_set(eve, i); /* set_inline */
+
+ normal_float_to_short_v3(mv->no, eve->no);
+
+ mv->flag = BM_vert_flag_to_mflag(eve);
+
+ if (cd_vert_bweight_offset != -1)
+ mv->bweight = BM_ELEM_CD_GET_FLOAT_AS_UCHAR(eve, cd_vert_bweight_offset);
+
+ if (add_orig)
+ *index++ = i;
- CustomData_from_bmesh_block(&bm->vdata, &dm->vertData, eve->head.data, i);
- }
- bm->elem_index_dirty &= ~BM_VERT;
+ CustomData_from_bmesh_block(&bm->vdata, &dm->vertData, eve->head.data, i);
+ }
+ bm->elem_index_dirty &= ~BM_VERT;
- index = dm->getEdgeDataArray(dm, CD_ORIGINDEX);
- BM_ITER_MESH_INDEX (eed, &iter, bm, BM_EDGES_OF_MESH, i) {
- MEdge *med = &medge[i];
+ index = dm->getEdgeDataArray(dm, CD_ORIGINDEX);
+ BM_ITER_MESH_INDEX (eed, &iter, bm, BM_EDGES_OF_MESH, i) {
+ MEdge *med = &medge[i];
- BM_elem_index_set(eed, i); /* set_inline */
+ BM_elem_index_set(eed, i); /* set_inline */
- med->v1 = BM_elem_index_get(eed->v1);
- med->v2 = BM_elem_index_get(eed->v2);
+ med->v1 = BM_elem_index_get(eed->v1);
+ med->v2 = BM_elem_index_get(eed->v2);
- med->flag = BM_edge_flag_to_mflag(eed);
+ med->flag = BM_edge_flag_to_mflag(eed);
- /* handle this differently to editmode switching,
- * only enable draw for single user edges rather then calculating angle */
- if ((med->flag & ME_EDGEDRAW) == 0) {
- if (eed->l && eed->l == eed->l->radial_next) {
- med->flag |= ME_EDGEDRAW;
- }
- }
+ /* handle this differently to editmode switching,
+ * only enable draw for single user edges rather then calculating angle */
+ if ((med->flag & ME_EDGEDRAW) == 0) {
+ if (eed->l && eed->l == eed->l->radial_next) {
+ med->flag |= ME_EDGEDRAW;
+ }
+ }
- if (cd_edge_crease_offset != -1) med->crease = BM_ELEM_CD_GET_FLOAT_AS_UCHAR(eed, cd_edge_crease_offset);
- if (cd_edge_bweight_offset != -1) med->bweight = BM_ELEM_CD_GET_FLOAT_AS_UCHAR(eed, cd_edge_bweight_offset);
+ if (cd_edge_crease_offset != -1)
+ med->crease = BM_ELEM_CD_GET_FLOAT_AS_UCHAR(eed, cd_edge_crease_offset);
+ if (cd_edge_bweight_offset != -1)
+ med->bweight = BM_ELEM_CD_GET_FLOAT_AS_UCHAR(eed, cd_edge_bweight_offset);
- CustomData_from_bmesh_block(&bm->edata, &dm->edgeData, eed->head.data, i);
- if (add_orig) *index++ = i;
- }
- bm->elem_index_dirty &= ~BM_EDGE;
+ CustomData_from_bmesh_block(&bm->edata, &dm->edgeData, eed->head.data, i);
+ if (add_orig)
+ *index++ = i;
+ }
+ bm->elem_index_dirty &= ~BM_EDGE;
- /* avoid this where possiblem, takes extra memory */
- if (use_tessface) {
+ /* avoid this where possiblem, takes extra memory */
+ if (use_tessface) {
- BM_mesh_elem_index_ensure(bm, BM_FACE);
+ BM_mesh_elem_index_ensure(bm, BM_FACE);
- index = dm->getTessFaceDataArray(dm, CD_ORIGINDEX);
- for (i = 0; i < dm->numTessFaceData; i++) {
- MFace *mf = &mface[i];
- const BMLoop **l = em_looptris[i];
- efa = l[0]->f;
+ index = dm->getTessFaceDataArray(dm, CD_ORIGINDEX);
+ for (i = 0; i < dm->numTessFaceData; i++) {
+ MFace *mf = &mface[i];
+ const BMLoop **l = em_looptris[i];
+ efa = l[0]->f;
- mf->v1 = BM_elem_index_get(l[0]->v);
- mf->v2 = BM_elem_index_get(l[1]->v);
- mf->v3 = BM_elem_index_get(l[2]->v);
- mf->v4 = 0;
- mf->mat_nr = efa->mat_nr;
- mf->flag = BM_face_flag_to_mflag(efa);
+ mf->v1 = BM_elem_index_get(l[0]->v);
+ mf->v2 = BM_elem_index_get(l[1]->v);
+ mf->v3 = BM_elem_index_get(l[2]->v);
+ mf->v4 = 0;
+ mf->mat_nr = efa->mat_nr;
+ mf->flag = BM_face_flag_to_mflag(efa);
- /* map mfaces to polygons in the same cddm intentionally */
- *index++ = BM_elem_index_get(efa);
+ /* map mfaces to polygons in the same cddm intentionally */
+ *index++ = BM_elem_index_get(efa);
- loops_to_customdata_corners(bm, &dm->faceData, i, l, numCol, numUV);
- test_index_face(mf, &dm->faceData, i, 3);
- }
- }
+ loops_to_customdata_corners(bm, &dm->faceData, i, l, numCol, numUV);
+ test_index_face(mf, &dm->faceData, i, 3);
+ }
+ }
- index = CustomData_get_layer(&dm->polyData, CD_ORIGINDEX);
- j = 0;
- BM_ITER_MESH_INDEX (efa, &iter, bm, BM_FACES_OF_MESH, i) {
- BMLoop *l_iter;
- BMLoop *l_first;
- MPoly *mp = &mpoly[i];
+ index = CustomData_get_layer(&dm->polyData, CD_ORIGINDEX);
+ j = 0;
+ BM_ITER_MESH_INDEX (efa, &iter, bm, BM_FACES_OF_MESH, i) {
+ BMLoop *l_iter;
+ BMLoop *l_first;
+ MPoly *mp = &mpoly[i];
- BM_elem_index_set(efa, i); /* set_inline */
+ BM_elem_index_set(efa, i); /* set_inline */
- mp->totloop = efa->len;
- mp->flag = BM_face_flag_to_mflag(efa);
- mp->loopstart = j;
- mp->mat_nr = efa->mat_nr;
+ mp->totloop = efa->len;
+ mp->flag = BM_face_flag_to_mflag(efa);
+ mp->loopstart = j;
+ mp->mat_nr = efa->mat_nr;
- l_iter = l_first = BM_FACE_FIRST_LOOP(efa);
- do {
- mloop->v = BM_elem_index_get(l_iter->v);
- mloop->e = BM_elem_index_get(l_iter->e);
- CustomData_from_bmesh_block(&bm->ldata, &dm->loopData, l_iter->head.data, j);
+ l_iter = l_first = BM_FACE_FIRST_LOOP(efa);
+ do {
+ mloop->v = BM_elem_index_get(l_iter->v);
+ mloop->e = BM_elem_index_get(l_iter->e);
+ CustomData_from_bmesh_block(&bm->ldata, &dm->loopData, l_iter->head.data, j);
- BM_elem_index_set(l_iter, j); /* set_inline */
+ BM_elem_index_set(l_iter, j); /* set_inline */
- j++;
- mloop++;
- } while ((l_iter = l_iter->next) != l_first);
+ j++;
+ mloop++;
+ } while ((l_iter = l_iter->next) != l_first);
- CustomData_from_bmesh_block(&bm->pdata, &dm->polyData, efa->head.data, i);
+ CustomData_from_bmesh_block(&bm->pdata, &dm->polyData, efa->head.data, i);
- if (add_orig) *index++ = i;
- }
- bm->elem_index_dirty &= ~(BM_FACE | BM_LOOP);
+ if (add_orig)
+ *index++ = i;
+ }
+ bm->elem_index_dirty &= ~(BM_FACE | BM_LOOP);
- dm->cd_flag = BM_mesh_cd_flag_from_bmesh(bm);
+ dm->cd_flag = BM_mesh_cd_flag_from_bmesh(bm);
- return dm;
+ return dm;
}
struct DerivedMesh *CDDM_from_bmesh(struct BMesh *bm, const bool use_mdisps)
{
- return cddm_from_bmesh_ex(
- bm, use_mdisps, false,
- /* these vars are for editmesh only */
- 0, NULL);
+ return cddm_from_bmesh_ex(bm,
+ use_mdisps,
+ false,
+ /* these vars are for editmesh only */
+ 0,
+ NULL);
}
DerivedMesh *CDDM_from_editbmesh(BMEditMesh *em, const bool use_mdisps, const bool use_tessface)
{
- return cddm_from_bmesh_ex(
- em->bm, use_mdisps,
- /* editmesh */
- use_tessface, em->tottri, (const BMLoop *(*)[3])em->looptris);
+ return cddm_from_bmesh_ex(em->bm,
+ use_mdisps,
+ /* editmesh */
+ use_tessface,
+ em->tottri,
+ (const BMLoop *(*)[3])em->looptris);
}
DerivedMesh *CDDM_copy(DerivedMesh *source)
{
- CDDerivedMesh *cddm = cdDM_create("CDDM_copy cddm");
- DerivedMesh *dm = &cddm->dm;
- int numVerts = source->numVertData;
- int numEdges = source->numEdgeData;
- int numTessFaces = 0;
- int numLoops = source->numLoopData;
- int numPolys = source->numPolyData;
+ CDDerivedMesh *cddm = cdDM_create("CDDM_copy cddm");
+ DerivedMesh *dm = &cddm->dm;
+ int numVerts = source->numVertData;
+ int numEdges = source->numEdgeData;
+ int numTessFaces = 0;
+ int numLoops = source->numLoopData;
+ int numPolys = source->numPolyData;
- /* NOTE: Don't copy tessellation faces if not requested explicitly. */
+ /* NOTE: Don't copy tessellation faces if not requested explicitly. */
- /* ensure these are created if they are made on demand */
- source->getVertDataArray(source, CD_ORIGINDEX);
- source->getEdgeDataArray(source, CD_ORIGINDEX);
- source->getPolyDataArray(source, CD_ORIGINDEX);
+ /* ensure these are created if they are made on demand */
+ source->getVertDataArray(source, CD_ORIGINDEX);
+ source->getEdgeDataArray(source, CD_ORIGINDEX);
+ source->getPolyDataArray(source, CD_ORIGINDEX);
- /* this initializes dm, and copies all non mvert/medge/mface layers */
- DM_from_template(dm, source, DM_TYPE_CDDM, numVerts, numEdges, numTessFaces,
- numLoops, numPolys);
- dm->deformedOnly = source->deformedOnly;
- dm->cd_flag = source->cd_flag;
- dm->dirty = source->dirty;
+ /* this initializes dm, and copies all non mvert/medge/mface layers */
+ DM_from_template(dm, source, DM_TYPE_CDDM, numVerts, numEdges, numTessFaces, numLoops, numPolys);
+ dm->deformedOnly = source->deformedOnly;
+ dm->cd_flag = source->cd_flag;
+ dm->dirty = source->dirty;
- /* Tessellation data is never copied, so tag it here.
- * Only tag dirty layers if we really ignored tessellation faces.
- */
- dm->dirty |= DM_DIRTY_TESS_CDLAYERS;
+ /* Tessellation data is never copied, so tag it here.
+ * Only tag dirty layers if we really ignored tessellation faces.
+ */
+ dm->dirty |= DM_DIRTY_TESS_CDLAYERS;
- CustomData_copy_data(&source->vertData, &dm->vertData, 0, 0, numVerts);
- CustomData_copy_data(&source->edgeData, &dm->edgeData, 0, 0, numEdges);
+ CustomData_copy_data(&source->vertData, &dm->vertData, 0, 0, numVerts);
+ CustomData_copy_data(&source->edgeData, &dm->edgeData, 0, 0, numEdges);
- /* now add mvert/medge/mface layers */
- cddm->mvert = source->dupVertArray(source);
- cddm->medge = source->dupEdgeArray(source);
+ /* now add mvert/medge/mface layers */
+ cddm->mvert = source->dupVertArray(source);
+ cddm->medge = source->dupEdgeArray(source);
- CustomData_add_layer(&dm->vertData, CD_MVERT, CD_ASSIGN, cddm->mvert, numVerts);
- CustomData_add_layer(&dm->edgeData, CD_MEDGE, CD_ASSIGN, cddm->medge, numEdges);
+ CustomData_add_layer(&dm->vertData, CD_MVERT, CD_ASSIGN, cddm->mvert, numVerts);
+ CustomData_add_layer(&dm->edgeData, CD_MEDGE, CD_ASSIGN, cddm->medge, numEdges);
- DM_DupPolys(source, dm);
+ DM_DupPolys(source, dm);
- cddm->mloop = CustomData_get_layer(&dm->loopData, CD_MLOOP);
- cddm->mpoly = CustomData_get_layer(&dm->polyData, CD_MPOLY);
+ cddm->mloop = CustomData_get_layer(&dm->loopData, CD_MLOOP);
+ cddm->mpoly = CustomData_get_layer(&dm->polyData, CD_MPOLY);
- return dm;
+ return dm;
}
/* note, the CD_ORIGINDEX layers are all 0, so if there is a direct
* relationship between mesh data this needs to be set by the caller. */
DerivedMesh *CDDM_from_template_ex(DerivedMesh *source,
- int numVerts, int numEdges, int numTessFaces,
- int numLoops, int numPolys,
- const CustomData_MeshMasks *mask)
-{
- CDDerivedMesh *cddm = cdDM_create("CDDM_from_template dest");
- DerivedMesh *dm = &cddm->dm;
-
- /* ensure these are created if they are made on demand */
- source->getVertDataArray(source, CD_ORIGINDEX);
- source->getEdgeDataArray(source, CD_ORIGINDEX);
- source->getTessFaceDataArray(source, CD_ORIGINDEX);
- source->getPolyDataArray(source, CD_ORIGINDEX);
-
- /* this does a copy of all non mvert/medge/mface layers */
- DM_from_template_ex(
- dm, source, DM_TYPE_CDDM,
- numVerts, numEdges, numTessFaces,
- numLoops, numPolys,
- mask);
-
- /* now add mvert/medge/mface layers */
- CustomData_add_layer(&dm->vertData, CD_MVERT, CD_CALLOC, NULL, numVerts);
- CustomData_add_layer(&dm->edgeData, CD_MEDGE, CD_CALLOC, NULL, numEdges);
- CustomData_add_layer(&dm->faceData, CD_MFACE, CD_CALLOC, NULL, numTessFaces);
- CustomData_add_layer(&dm->loopData, CD_MLOOP, CD_CALLOC, NULL, numLoops);
- CustomData_add_layer(&dm->polyData, CD_MPOLY, CD_CALLOC, NULL, numPolys);
-
- if (!CustomData_get_layer(&dm->vertData, CD_ORIGINDEX))
- CustomData_add_layer(&dm->vertData, CD_ORIGINDEX, CD_CALLOC, NULL, numVerts);
- if (!CustomData_get_layer(&dm->edgeData, CD_ORIGINDEX))
- CustomData_add_layer(&dm->edgeData, CD_ORIGINDEX, CD_CALLOC, NULL, numEdges);
- if (!CustomData_get_layer(&dm->faceData, CD_ORIGINDEX))
- CustomData_add_layer(&dm->faceData, CD_ORIGINDEX, CD_CALLOC, NULL, numTessFaces);
-
- cddm->mvert = CustomData_get_layer(&dm->vertData, CD_MVERT);
- cddm->medge = CustomData_get_layer(&dm->edgeData, CD_MEDGE);
- cddm->mface = CustomData_get_layer(&dm->faceData, CD_MFACE);
- cddm->mloop = CustomData_get_layer(&dm->loopData, CD_MLOOP);
- cddm->mpoly = CustomData_get_layer(&dm->polyData, CD_MPOLY);
-
- return dm;
+ int numVerts,
+ int numEdges,
+ int numTessFaces,
+ int numLoops,
+ int numPolys,
+ const CustomData_MeshMasks *mask)
+{
+ CDDerivedMesh *cddm = cdDM_create("CDDM_from_template dest");
+ DerivedMesh *dm = &cddm->dm;
+
+ /* ensure these are created if they are made on demand */
+ source->getVertDataArray(source, CD_ORIGINDEX);
+ source->getEdgeDataArray(source, CD_ORIGINDEX);
+ source->getTessFaceDataArray(source, CD_ORIGINDEX);
+ source->getPolyDataArray(source, CD_ORIGINDEX);
+
+ /* this does a copy of all non mvert/medge/mface layers */
+ DM_from_template_ex(
+ dm, source, DM_TYPE_CDDM, numVerts, numEdges, numTessFaces, numLoops, numPolys, mask);
+
+ /* now add mvert/medge/mface layers */
+ CustomData_add_layer(&dm->vertData, CD_MVERT, CD_CALLOC, NULL, numVerts);
+ CustomData_add_layer(&dm->edgeData, CD_MEDGE, CD_CALLOC, NULL, numEdges);
+ CustomData_add_layer(&dm->faceData, CD_MFACE, CD_CALLOC, NULL, numTessFaces);
+ CustomData_add_layer(&dm->loopData, CD_MLOOP, CD_CALLOC, NULL, numLoops);
+ CustomData_add_layer(&dm->polyData, CD_MPOLY, CD_CALLOC, NULL, numPolys);
+
+ if (!CustomData_get_layer(&dm->vertData, CD_ORIGINDEX))
+ CustomData_add_layer(&dm->vertData, CD_ORIGINDEX, CD_CALLOC, NULL, numVerts);
+ if (!CustomData_get_layer(&dm->edgeData, CD_ORIGINDEX))
+ CustomData_add_layer(&dm->edgeData, CD_ORIGINDEX, CD_CALLOC, NULL, numEdges);
+ if (!CustomData_get_layer(&dm->faceData, CD_ORIGINDEX))
+ CustomData_add_layer(&dm->faceData, CD_ORIGINDEX, CD_CALLOC, NULL, numTessFaces);
+
+ cddm->mvert = CustomData_get_layer(&dm->vertData, CD_MVERT);
+ cddm->medge = CustomData_get_layer(&dm->edgeData, CD_MEDGE);
+ cddm->mface = CustomData_get_layer(&dm->faceData, CD_MFACE);
+ cddm->mloop = CustomData_get_layer(&dm->loopData, CD_MLOOP);
+ cddm->mpoly = CustomData_get_layer(&dm->polyData, CD_MPOLY);
+
+ return dm;
}
DerivedMesh *CDDM_from_template(
- DerivedMesh *source,
- int numVerts, int numEdges, int numTessFaces,
- int numLoops, int numPolys)
+ DerivedMesh *source, int numVerts, int numEdges, int numTessFaces, int numLoops, int numPolys)
{
- return CDDM_from_template_ex(
- source, numVerts, numEdges, numTessFaces,
- numLoops, numPolys,
- &CD_MASK_DERIVEDMESH);
+ return CDDM_from_template_ex(
+ source, numVerts, numEdges, numTessFaces, numLoops, numPolys, &CD_MASK_DERIVEDMESH);
}
void CDDM_apply_vert_coords(DerivedMesh *dm, float (*vertCoords)[3])
{
- CDDerivedMesh *cddm = (CDDerivedMesh *)dm;
- MVert *vert;
- int i;
+ CDDerivedMesh *cddm = (CDDerivedMesh *)dm;
+ MVert *vert;
+ int i;
- /* this will just return the pointer if it wasn't a referenced layer */
- vert = CustomData_duplicate_referenced_layer(&dm->vertData, CD_MVERT, dm->numVertData);
- cddm->mvert = vert;
+ /* this will just return the pointer if it wasn't a referenced layer */
+ vert = CustomData_duplicate_referenced_layer(&dm->vertData, CD_MVERT, dm->numVertData);
+ cddm->mvert = vert;
- for (i = 0; i < dm->numVertData; ++i, ++vert)
- copy_v3_v3(vert->co, vertCoords[i]);
+ for (i = 0; i < dm->numVertData; ++i, ++vert)
+ copy_v3_v3(vert->co, vertCoords[i]);
- cddm->dm.dirty |= DM_DIRTY_NORMALS;
+ cddm->dm.dirty |= DM_DIRTY_NORMALS;
}
void CDDM_apply_vert_normals(DerivedMesh *dm, short (*vertNormals)[3])
{
- CDDerivedMesh *cddm = (CDDerivedMesh *)dm;
- MVert *vert;
- int i;
+ CDDerivedMesh *cddm = (CDDerivedMesh *)dm;
+ MVert *vert;
+ int i;
- /* this will just return the pointer if it wasn't a referenced layer */
- vert = CustomData_duplicate_referenced_layer(&dm->vertData, CD_MVERT, dm->numVertData);
- cddm->mvert = vert;
+ /* this will just return the pointer if it wasn't a referenced layer */
+ vert = CustomData_duplicate_referenced_layer(&dm->vertData, CD_MVERT, dm->numVertData);
+ cddm->mvert = vert;
- for (i = 0; i < dm->numVertData; ++i, ++vert)
- copy_v3_v3_short(vert->no, vertNormals[i]);
+ for (i = 0; i < dm->numVertData; ++i, ++vert)
+ copy_v3_v3_short(vert->no, vertNormals[i]);
- cddm->dm.dirty &= ~DM_DIRTY_NORMALS;
+ cddm->dm.dirty &= ~DM_DIRTY_NORMALS;
}
void CDDM_calc_normals_mapping_ex(DerivedMesh *dm, const bool only_face_normals)
{
- CDDerivedMesh *cddm = (CDDerivedMesh *)dm;
- float (*face_nors)[3] = NULL;
+ CDDerivedMesh *cddm = (CDDerivedMesh *)dm;
+ float(*face_nors)[3] = NULL;
- if (dm->numVertData == 0) {
- cddm->dm.dirty &= ~DM_DIRTY_NORMALS;
- return;
- }
+ if (dm->numVertData == 0) {
+ cddm->dm.dirty &= ~DM_DIRTY_NORMALS;
+ return;
+ }
- /* now we skip calculating vertex normals for referenced layer,
- * no need to duplicate verts.
- * WATCH THIS, bmesh only change!,
- * need to take care of the side effects here - campbell */
+ /* now we skip calculating vertex normals for referenced layer,
+ * no need to duplicate verts.
+ * WATCH THIS, bmesh only change!,
+ * need to take care of the side effects here - campbell */
#if 0
- /* we don't want to overwrite any referenced layers */
- cddm->mvert = CustomData_duplicate_referenced_layer(&dm->vertData, CD_MVERT, dm->numVertData);
+ /* we don't want to overwrite any referenced layers */
+ cddm->mvert = CustomData_duplicate_referenced_layer(&dm->vertData, CD_MVERT, dm->numVertData);
#endif
#if 0
- if (dm->numTessFaceData == 0) {
- /* No tessellation on this mesh yet, need to calculate one.
- *
- * Important not to update face normals from polys since it
- * interferes with assigning the new normal layer in the following code.
- */
- CDDM_recalc_tessellation_ex(dm, false);
- }
- else {
- /* A tessellation already exists, it should always have a CD_ORIGINDEX */
- BLI_assert(CustomData_has_layer(&dm->faceData, CD_ORIGINDEX));
- CustomData_free_layers(&dm->faceData, CD_NORMAL, dm->numTessFaceData);
- }
+ if (dm->numTessFaceData == 0) {
+ /* No tessellation on this mesh yet, need to calculate one.
+ *
+ * Important not to update face normals from polys since it
+ * interferes with assigning the new normal layer in the following code.
+ */
+ CDDM_recalc_tessellation_ex(dm, false);
+ }
+ else {
+ /* A tessellation already exists, it should always have a CD_ORIGINDEX */
+ BLI_assert(CustomData_has_layer(&dm->faceData, CD_ORIGINDEX));
+ CustomData_free_layers(&dm->faceData, CD_NORMAL, dm->numTessFaceData);
+ }
#endif
- face_nors = MEM_malloc_arrayN(dm->numPolyData, sizeof(*face_nors), "face_nors");
+ face_nors = MEM_malloc_arrayN(dm->numPolyData, sizeof(*face_nors), "face_nors");
- /* calculate face normals */
- BKE_mesh_calc_normals_poly(
- cddm->mvert, NULL, dm->numVertData, CDDM_get_loops(dm), CDDM_get_polys(dm),
- dm->numLoopData, dm->numPolyData, face_nors,
- only_face_normals);
+ /* calculate face normals */
+ BKE_mesh_calc_normals_poly(cddm->mvert,
+ NULL,
+ dm->numVertData,
+ CDDM_get_loops(dm),
+ CDDM_get_polys(dm),
+ dm->numLoopData,
+ dm->numPolyData,
+ face_nors,
+ only_face_normals);
- CustomData_add_layer(&dm->polyData, CD_NORMAL, CD_ASSIGN, face_nors, dm->numPolyData);
+ CustomData_add_layer(&dm->polyData, CD_NORMAL, CD_ASSIGN, face_nors, dm->numPolyData);
- cddm->dm.dirty &= ~DM_DIRTY_NORMALS;
+ cddm->dm.dirty &= ~DM_DIRTY_NORMALS;
}
void CDDM_calc_normals_mapping(DerivedMesh *dm)
{
- /* use this to skip calculating normals on original vert's, this may need to be changed */
- const bool only_face_normals = CustomData_is_referenced_layer(&dm->vertData, CD_MVERT);
+ /* use this to skip calculating normals on original vert's, this may need to be changed */
+ const bool only_face_normals = CustomData_is_referenced_layer(&dm->vertData, CD_MVERT);
- CDDM_calc_normals_mapping_ex(dm, only_face_normals);
+ CDDM_calc_normals_mapping_ex(dm, only_face_normals);
}
#if 0
/* bmesh note: this matches what we have in trunk */
void CDDM_calc_normals(DerivedMesh *dm)
{
- CDDerivedMesh *cddm = (CDDerivedMesh *)dm;
- float (*poly_nors)[3];
+ CDDerivedMesh *cddm = (CDDerivedMesh *)dm;
+ float (*poly_nors)[3];
- if (dm->numVertData == 0) return;
+ if (dm->numVertData == 0) return;
- /* we don't want to overwrite any referenced layers */
- cddm->mvert = CustomData_duplicate_referenced_layer(&dm->vertData, CD_MVERT, dm->numVertData);
+ /* we don't want to overwrite any referenced layers */
+ cddm->mvert = CustomData_duplicate_referenced_layer(&dm->vertData, CD_MVERT, dm->numVertData);
- /* fill in if it exists */
- poly_nors = CustomData_get_layer(&dm->polyData, CD_NORMAL);
- if (!poly_nors) {
- poly_nors = CustomData_add_layer(&dm->polyData, CD_NORMAL, CD_CALLOC, NULL, dm->numPolyData);
- }
+ /* fill in if it exists */
+ poly_nors = CustomData_get_layer(&dm->polyData, CD_NORMAL);
+ if (!poly_nors) {
+ poly_nors = CustomData_add_layer(&dm->polyData, CD_NORMAL, CD_CALLOC, NULL, dm->numPolyData);
+ }
- BKE_mesh_calc_normals_poly(cddm->mvert, dm->numVertData, CDDM_get_loops(dm), CDDM_get_polys(dm),
- dm->numLoopData, dm->numPolyData, poly_nors, false);
+ BKE_mesh_calc_normals_poly(cddm->mvert, dm->numVertData, CDDM_get_loops(dm), CDDM_get_polys(dm),
+ dm->numLoopData, dm->numPolyData, poly_nors, false);
- cddm->dm.dirty &= ~DM_DIRTY_NORMALS;
+ cddm->dm.dirty &= ~DM_DIRTY_NORMALS;
}
#else
/* poly normal layer is now only for final display */
void CDDM_calc_normals(DerivedMesh *dm)
{
- CDDerivedMesh *cddm = (CDDerivedMesh *)dm;
+ CDDerivedMesh *cddm = (CDDerivedMesh *)dm;
- /* we don't want to overwrite any referenced layers */
- cddm->mvert = CustomData_duplicate_referenced_layer(&dm->vertData, CD_MVERT, dm->numVertData);
+ /* we don't want to overwrite any referenced layers */
+ cddm->mvert = CustomData_duplicate_referenced_layer(&dm->vertData, CD_MVERT, dm->numVertData);
- BKE_mesh_calc_normals_poly(cddm->mvert, NULL, dm->numVertData, CDDM_get_loops(dm), CDDM_get_polys(dm),
- dm->numLoopData, dm->numPolyData, NULL, false);
+ BKE_mesh_calc_normals_poly(cddm->mvert,
+ NULL,
+ dm->numVertData,
+ CDDM_get_loops(dm),
+ CDDM_get_polys(dm),
+ dm->numLoopData,
+ dm->numPolyData,
+ NULL,
+ false);
- cddm->dm.dirty &= ~DM_DIRTY_NORMALS;
+ cddm->dm.dirty &= ~DM_DIRTY_NORMALS;
}
#endif
void CDDM_calc_loop_normals(DerivedMesh *dm, const bool use_split_normals, const float split_angle)
{
- CDDM_calc_loop_normals_spacearr(dm, use_split_normals, split_angle, NULL);
+ CDDM_calc_loop_normals_spacearr(dm, use_split_normals, split_angle, NULL);
}
/* #define DEBUG_CLNORS */
@@ -1171,223 +1202,245 @@ void CDDM_calc_loop_normals(DerivedMesh *dm, const bool use_split_normals, const
# include "BLI_linklist.h"
#endif
-void CDDM_calc_loop_normals_spacearr(
- DerivedMesh *dm, const bool use_split_normals, const float split_angle, MLoopNorSpaceArray *r_lnors_spacearr)
-{
- MVert *mverts = dm->getVertArray(dm);
- MEdge *medges = dm->getEdgeArray(dm);
- MLoop *mloops = dm->getLoopArray(dm);
- MPoly *mpolys = dm->getPolyArray(dm);
-
- CustomData *ldata, *pdata;
-
- float (*lnors)[3];
- short (*clnor_data)[2];
- float (*pnors)[3];
-
- const int numVerts = dm->getNumVerts(dm);
- const int numEdges = dm->getNumEdges(dm);
- const int numLoops = dm->getNumLoops(dm);
- const int numPolys = dm->getNumPolys(dm);
-
- ldata = dm->getLoopDataLayout(dm);
- if (CustomData_has_layer(ldata, CD_NORMAL)) {
- lnors = CustomData_get_layer(ldata, CD_NORMAL);
- }
- else {
- lnors = CustomData_add_layer(ldata, CD_NORMAL, CD_CALLOC, NULL, numLoops);
- }
-
- /* Compute poly (always needed) and vert normals. */
- /* Note we can't use DM_ensure_normals, since it won't keep computed poly nors... */
- pdata = dm->getPolyDataLayout(dm);
- pnors = CustomData_get_layer(pdata, CD_NORMAL);
- if (!pnors) {
- pnors = CustomData_add_layer(pdata, CD_NORMAL, CD_CALLOC, NULL, numPolys);
- }
- BKE_mesh_calc_normals_poly(mverts, NULL, numVerts, mloops, mpolys, numLoops, numPolys, pnors,
- (dm->dirty & DM_DIRTY_NORMALS) ? false : true);
-
- dm->dirty &= ~DM_DIRTY_NORMALS;
-
- clnor_data = CustomData_get_layer(ldata, CD_CUSTOMLOOPNORMAL);
-
- BKE_mesh_normals_loop_split(mverts, numVerts, medges, numEdges, mloops, lnors, numLoops,
- mpolys, (const float (*)[3])pnors, numPolys,
- use_split_normals, split_angle,
- r_lnors_spacearr, clnor_data, NULL);
+void CDDM_calc_loop_normals_spacearr(DerivedMesh *dm,
+ const bool use_split_normals,
+ const float split_angle,
+ MLoopNorSpaceArray *r_lnors_spacearr)
+{
+ MVert *mverts = dm->getVertArray(dm);
+ MEdge *medges = dm->getEdgeArray(dm);
+ MLoop *mloops = dm->getLoopArray(dm);
+ MPoly *mpolys = dm->getPolyArray(dm);
+
+ CustomData *ldata, *pdata;
+
+ float(*lnors)[3];
+ short(*clnor_data)[2];
+ float(*pnors)[3];
+
+ const int numVerts = dm->getNumVerts(dm);
+ const int numEdges = dm->getNumEdges(dm);
+ const int numLoops = dm->getNumLoops(dm);
+ const int numPolys = dm->getNumPolys(dm);
+
+ ldata = dm->getLoopDataLayout(dm);
+ if (CustomData_has_layer(ldata, CD_NORMAL)) {
+ lnors = CustomData_get_layer(ldata, CD_NORMAL);
+ }
+ else {
+ lnors = CustomData_add_layer(ldata, CD_NORMAL, CD_CALLOC, NULL, numLoops);
+ }
+
+ /* Compute poly (always needed) and vert normals. */
+ /* Note we can't use DM_ensure_normals, since it won't keep computed poly nors... */
+ pdata = dm->getPolyDataLayout(dm);
+ pnors = CustomData_get_layer(pdata, CD_NORMAL);
+ if (!pnors) {
+ pnors = CustomData_add_layer(pdata, CD_NORMAL, CD_CALLOC, NULL, numPolys);
+ }
+ BKE_mesh_calc_normals_poly(mverts,
+ NULL,
+ numVerts,
+ mloops,
+ mpolys,
+ numLoops,
+ numPolys,
+ pnors,
+ (dm->dirty & DM_DIRTY_NORMALS) ? false : true);
+
+ dm->dirty &= ~DM_DIRTY_NORMALS;
+
+ clnor_data = CustomData_get_layer(ldata, CD_CUSTOMLOOPNORMAL);
+
+ BKE_mesh_normals_loop_split(mverts,
+ numVerts,
+ medges,
+ numEdges,
+ mloops,
+ lnors,
+ numLoops,
+ mpolys,
+ (const float(*)[3])pnors,
+ numPolys,
+ use_split_normals,
+ split_angle,
+ r_lnors_spacearr,
+ clnor_data,
+ NULL);
#ifdef DEBUG_CLNORS
- if (r_lnors_spacearr) {
- int i;
- for (i = 0; i < numLoops; i++) {
- if (r_lnors_spacearr->lspacearr[i]->ref_alpha != 0.0f) {
- LinkNode *loops = r_lnors_spacearr->lspacearr[i]->loops;
- printf("Loop %d uses lnor space %p:\n", i, r_lnors_spacearr->lspacearr[i]);
- print_v3("\tfinal lnor", lnors[i]);
- print_v3("\tauto lnor", r_lnors_spacearr->lspacearr[i]->vec_lnor);
- print_v3("\tref_vec", r_lnors_spacearr->lspacearr[i]->vec_ref);
- printf("\talpha: %f\n\tbeta: %f\n\tloops: %p\n", r_lnors_spacearr->lspacearr[i]->ref_alpha,
- r_lnors_spacearr->lspacearr[i]->ref_beta, r_lnors_spacearr->lspacearr[i]->loops);
- printf("\t\t(shared with loops");
- while (loops) {
- printf(" %d", POINTER_AS_INT(loops->link));
- loops = loops->next;
- }
- printf(")\n");
- }
- else {
- printf("Loop %d has no lnor space\n", i);
- }
- }
- }
+ if (r_lnors_spacearr) {
+ int i;
+ for (i = 0; i < numLoops; i++) {
+ if (r_lnors_spacearr->lspacearr[i]->ref_alpha != 0.0f) {
+ LinkNode *loops = r_lnors_spacearr->lspacearr[i]->loops;
+ printf("Loop %d uses lnor space %p:\n", i, r_lnors_spacearr->lspacearr[i]);
+ print_v3("\tfinal lnor", lnors[i]);
+ print_v3("\tauto lnor", r_lnors_spacearr->lspacearr[i]->vec_lnor);
+ print_v3("\tref_vec", r_lnors_spacearr->lspacearr[i]->vec_ref);
+ printf("\talpha: %f\n\tbeta: %f\n\tloops: %p\n",
+ r_lnors_spacearr->lspacearr[i]->ref_alpha,
+ r_lnors_spacearr->lspacearr[i]->ref_beta,
+ r_lnors_spacearr->lspacearr[i]->loops);
+ printf("\t\t(shared with loops");
+ while (loops) {
+ printf(" %d", POINTER_AS_INT(loops->link));
+ loops = loops->next;
+ }
+ printf(")\n");
+ }
+ else {
+ printf("Loop %d has no lnor space\n", i);
+ }
+ }
+ }
#endif
}
void CDDM_lower_num_verts(DerivedMesh *dm, int numVerts)
{
- BLI_assert(numVerts >= 0);
- if (numVerts < dm->numVertData)
- CustomData_free_elem(&dm->vertData, numVerts, dm->numVertData - numVerts);
+ BLI_assert(numVerts >= 0);
+ if (numVerts < dm->numVertData)
+ CustomData_free_elem(&dm->vertData, numVerts, dm->numVertData - numVerts);
- dm->numVertData = numVerts;
+ dm->numVertData = numVerts;
}
void CDDM_lower_num_edges(DerivedMesh *dm, int numEdges)
{
- BLI_assert(numEdges >= 0);
- if (numEdges < dm->numEdgeData)
- CustomData_free_elem(&dm->edgeData, numEdges, dm->numEdgeData - numEdges);
+ BLI_assert(numEdges >= 0);
+ if (numEdges < dm->numEdgeData)
+ CustomData_free_elem(&dm->edgeData, numEdges, dm->numEdgeData - numEdges);
- dm->numEdgeData = numEdges;
+ dm->numEdgeData = numEdges;
}
void CDDM_lower_num_tessfaces(DerivedMesh *dm, int numTessFaces)
{
- BLI_assert(numTessFaces >= 0);
- if (numTessFaces < dm->numTessFaceData)
- CustomData_free_elem(&dm->faceData, numTessFaces, dm->numTessFaceData - numTessFaces);
+ BLI_assert(numTessFaces >= 0);
+ if (numTessFaces < dm->numTessFaceData)
+ CustomData_free_elem(&dm->faceData, numTessFaces, dm->numTessFaceData - numTessFaces);
- dm->numTessFaceData = numTessFaces;
+ dm->numTessFaceData = numTessFaces;
}
void CDDM_lower_num_loops(DerivedMesh *dm, int numLoops)
{
- BLI_assert(numLoops >= 0);
- if (numLoops < dm->numLoopData)
- CustomData_free_elem(&dm->loopData, numLoops, dm->numLoopData - numLoops);
+ BLI_assert(numLoops >= 0);
+ if (numLoops < dm->numLoopData)
+ CustomData_free_elem(&dm->loopData, numLoops, dm->numLoopData - numLoops);
- dm->numLoopData = numLoops;
+ dm->numLoopData = numLoops;
}
void CDDM_lower_num_polys(DerivedMesh *dm, int numPolys)
{
- BLI_assert(numPolys >= 0);
- if (numPolys < dm->numPolyData)
- CustomData_free_elem(&dm->polyData, numPolys, dm->numPolyData - numPolys);
+ BLI_assert(numPolys >= 0);
+ if (numPolys < dm->numPolyData)
+ CustomData_free_elem(&dm->polyData, numPolys, dm->numPolyData - numPolys);
- dm->numPolyData = numPolys;
+ dm->numPolyData = numPolys;
}
/* mesh element access functions */
MVert *CDDM_get_vert(DerivedMesh *dm, int index)
{
- return &((CDDerivedMesh *)dm)->mvert[index];
+ return &((CDDerivedMesh *)dm)->mvert[index];
}
MEdge *CDDM_get_edge(DerivedMesh *dm, int index)
{
- return &((CDDerivedMesh *)dm)->medge[index];
+ return &((CDDerivedMesh *)dm)->medge[index];
}
MFace *CDDM_get_tessface(DerivedMesh *dm, int index)
{
- return &((CDDerivedMesh *)dm)->mface[index];
+ return &((CDDerivedMesh *)dm)->mface[index];
}
MLoop *CDDM_get_loop(DerivedMesh *dm, int index)
{
- return &((CDDerivedMesh *)dm)->mloop[index];
+ return &((CDDerivedMesh *)dm)->mloop[index];
}
MPoly *CDDM_get_poly(DerivedMesh *dm, int index)
{
- return &((CDDerivedMesh *)dm)->mpoly[index];
+ return &((CDDerivedMesh *)dm)->mpoly[index];
}
/* array access functions */
MVert *CDDM_get_verts(DerivedMesh *dm)
{
- return ((CDDerivedMesh *)dm)->mvert;
+ return ((CDDerivedMesh *)dm)->mvert;
}
MEdge *CDDM_get_edges(DerivedMesh *dm)
{
- return ((CDDerivedMesh *)dm)->medge;
+ return ((CDDerivedMesh *)dm)->medge;
}
MFace *CDDM_get_tessfaces(DerivedMesh *dm)
{
- return ((CDDerivedMesh *)dm)->mface;
+ return ((CDDerivedMesh *)dm)->mface;
}
MLoop *CDDM_get_loops(DerivedMesh *dm)
{
- return ((CDDerivedMesh *)dm)->mloop;
+ return ((CDDerivedMesh *)dm)->mloop;
}
MPoly *CDDM_get_polys(DerivedMesh *dm)
{
- return ((CDDerivedMesh *)dm)->mpoly;
+ return ((CDDerivedMesh *)dm)->mpoly;
}
void CDDM_set_mvert(DerivedMesh *dm, MVert *mvert)
{
- CDDerivedMesh *cddm = (CDDerivedMesh *)dm;
+ CDDerivedMesh *cddm = (CDDerivedMesh *)dm;
- if (!CustomData_has_layer(&dm->vertData, CD_MVERT))
- CustomData_add_layer(&dm->vertData, CD_MVERT, CD_ASSIGN, mvert, dm->numVertData);
+ if (!CustomData_has_layer(&dm->vertData, CD_MVERT))
+ CustomData_add_layer(&dm->vertData, CD_MVERT, CD_ASSIGN, mvert, dm->numVertData);
- cddm->mvert = mvert;
+ cddm->mvert = mvert;
}
void CDDM_set_medge(DerivedMesh *dm, MEdge *medge)
{
- CDDerivedMesh *cddm = (CDDerivedMesh *)dm;
+ CDDerivedMesh *cddm = (CDDerivedMesh *)dm;
- if (!CustomData_has_layer(&dm->edgeData, CD_MEDGE))
- CustomData_add_layer(&dm->edgeData, CD_MEDGE, CD_ASSIGN, medge, dm->numEdgeData);
+ if (!CustomData_has_layer(&dm->edgeData, CD_MEDGE))
+ CustomData_add_layer(&dm->edgeData, CD_MEDGE, CD_ASSIGN, medge, dm->numEdgeData);
- cddm->medge = medge;
+ cddm->medge = medge;
}
void CDDM_set_mface(DerivedMesh *dm, MFace *mface)
{
- CDDerivedMesh *cddm = (CDDerivedMesh *)dm;
+ CDDerivedMesh *cddm = (CDDerivedMesh *)dm;
- if (!CustomData_has_layer(&dm->faceData, CD_MFACE))
- CustomData_add_layer(&dm->faceData, CD_MFACE, CD_ASSIGN, mface, dm->numTessFaceData);
+ if (!CustomData_has_layer(&dm->faceData, CD_MFACE))
+ CustomData_add_layer(&dm->faceData, CD_MFACE, CD_ASSIGN, mface, dm->numTessFaceData);
- cddm->mface = mface;
+ cddm->mface = mface;
}
void CDDM_set_mloop(DerivedMesh *dm, MLoop *mloop)
{
- CDDerivedMesh *cddm = (CDDerivedMesh *)dm;
+ CDDerivedMesh *cddm = (CDDerivedMesh *)dm;
- if (!CustomData_has_layer(&dm->loopData, CD_MLOOP))
- CustomData_add_layer(&dm->loopData, CD_MLOOP, CD_ASSIGN, mloop, dm->numLoopData);
+ if (!CustomData_has_layer(&dm->loopData, CD_MLOOP))
+ CustomData_add_layer(&dm->loopData, CD_MLOOP, CD_ASSIGN, mloop, dm->numLoopData);
- cddm->mloop = mloop;
+ cddm->mloop = mloop;
}
void CDDM_set_mpoly(DerivedMesh *dm, MPoly *mpoly)
{
- CDDerivedMesh *cddm = (CDDerivedMesh *)dm;
+ CDDerivedMesh *cddm = (CDDerivedMesh *)dm;
- if (!CustomData_has_layer(&dm->polyData, CD_MPOLY))
- CustomData_add_layer(&dm->polyData, CD_MPOLY, CD_ASSIGN, mpoly, dm->numPolyData);
+ if (!CustomData_has_layer(&dm->polyData, CD_MPOLY))
+ CustomData_add_layer(&dm->polyData, CD_MPOLY, CD_ASSIGN, mpoly, dm->numPolyData);
- cddm->mpoly = mpoly;
+ cddm->mpoly = mpoly;
}