forked from bartvdbraak/blender
remove CD_POLYINDEX customdata layer:
reported as [#29376] BMESH_TODO: remove tessface CD_ORIGINDEX layer for a single mesh there could be 3 origindex mappings stored, one on the polygons and 2 on the tessfaces. (CD_POLYINDEX and CD_ORIGINDEX). as Andrew suggests, now tessfaces (which are really a cache of polygons), using origindex to point to polygons on the same derived mesh, and polygons only store the original index values.
This commit is contained in:
parent
6bd18e3575
commit
00acdb6292
@ -228,6 +228,7 @@ struct DerivedMesh {
|
||||
void *(*getVertData)(DerivedMesh * dm, int index, int type);
|
||||
void *(*getEdgeData)(DerivedMesh * dm, int index, int type);
|
||||
void *(*getTessFaceData)(DerivedMesh * dm, int index, int type);
|
||||
void *(*getPolyData)(DerivedMesh * dm, int index, int type);
|
||||
|
||||
/** Return a pointer to the entire array of vert/edge/face custom data
|
||||
* from the derived mesh (this gives a pointer to the actual data, not
|
||||
@ -236,7 +237,8 @@ struct DerivedMesh {
|
||||
void *(*getVertDataArray)(DerivedMesh * dm, int type);
|
||||
void *(*getEdgeDataArray)(DerivedMesh * dm, int type);
|
||||
void *(*getTessFaceDataArray)(DerivedMesh * dm, int type);
|
||||
|
||||
void *(*getPolyDataArray)(DerivedMesh * dm, int type);
|
||||
|
||||
/** Retrieves the base CustomData structures for
|
||||
* verts/edges/tessfaces/loops/facdes*/
|
||||
CustomData *(*getVertDataLayout)(DerivedMesh * dm);
|
||||
@ -498,6 +500,7 @@ void DM_add_poly_layer(struct DerivedMesh *dm, int type, int alloctype,
|
||||
void *DM_get_vert_data(struct DerivedMesh *dm, int index, int type);
|
||||
void *DM_get_edge_data(struct DerivedMesh *dm, int index, int type);
|
||||
void *DM_get_tessface_data(struct DerivedMesh *dm, int index, int type);
|
||||
void *DM_get_poly_data(struct DerivedMesh *dm, int index, int type);
|
||||
|
||||
/* custom data layer access functions
|
||||
* return pointer to first data layer which matches type (a flat array)
|
||||
@ -706,4 +709,10 @@ void DM_debug_print(DerivedMesh *dm);
|
||||
void DM_debug_print_cdlayers(CustomData *cdata);
|
||||
#endif
|
||||
|
||||
BLI_INLINE int DM_origindex_mface_mpoly(const int *index_mf_to_mpoly, const int *index_mp_to_orig, const int i)
|
||||
{
|
||||
const int j = index_mf_to_mpoly[i];
|
||||
return (j != ORIGINDEX_NONE) ? index_mp_to_orig[j] : ORIGINDEX_NONE;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
@ -265,9 +265,11 @@ void DM_init_funcs(DerivedMesh *dm)
|
||||
dm->getVertData = DM_get_vert_data;
|
||||
dm->getEdgeData = DM_get_edge_data;
|
||||
dm->getTessFaceData = DM_get_tessface_data;
|
||||
dm->getPolyData = DM_get_poly_data;
|
||||
dm->getVertDataArray = DM_get_vert_data_layer;
|
||||
dm->getEdgeDataArray = DM_get_edge_data_layer;
|
||||
dm->getTessFaceDataArray = DM_get_tessface_data_layer;
|
||||
dm->getPolyDataArray = DM_get_poly_data_layer;
|
||||
|
||||
bvhcache_init(&dm->bvhCache);
|
||||
}
|
||||
@ -383,7 +385,7 @@ void DM_ensure_tessface(DerivedMesh *dm)
|
||||
}
|
||||
|
||||
else if (dm->dirty & DM_DIRTY_TESS_CDLAYERS) {
|
||||
BLI_assert(CustomData_has_layer(&dm->faceData, CD_POLYINDEX));
|
||||
BLI_assert(CustomData_has_layer(&dm->faceData, CD_ORIGINDEX));
|
||||
DM_update_tessface_data(dm);
|
||||
}
|
||||
|
||||
@ -407,7 +409,7 @@ void DM_update_tessface_data(DerivedMesh *dm)
|
||||
const int hasPCol = CustomData_has_layer(ldata, CD_PREVIEW_MLOOPCOL);
|
||||
const int hasOrigSpace = CustomData_has_layer(ldata, CD_ORIGSPACE_MLOOP);
|
||||
|
||||
int *polyindex = CustomData_get_layer(fdata, CD_POLYINDEX);
|
||||
int *polyindex = CustomData_get_layer(fdata, CD_ORIGINDEX);
|
||||
|
||||
int mf_idx,
|
||||
totface = dm->getNumTessFaces(dm),
|
||||
@ -625,6 +627,12 @@ void *DM_get_tessface_data(DerivedMesh *dm, int index, int type)
|
||||
return CustomData_get(&dm->faceData, index, type);
|
||||
}
|
||||
|
||||
void *DM_get_poly_data(DerivedMesh *dm, int index, int type)
|
||||
{
|
||||
return CustomData_get(&dm->polyData, index, type);
|
||||
}
|
||||
|
||||
|
||||
void *DM_get_vert_data_layer(DerivedMesh *dm, int type)
|
||||
{
|
||||
if (type == CD_MVERT)
|
||||
@ -1373,7 +1381,7 @@ static void mesh_calc_modifiers(Scene *scene, Object *ob, float (*inputVertexCos
|
||||
ModifierData *firstmd, *md, *previewmd = NULL;
|
||||
CDMaskLink *datamasks, *curr;
|
||||
/* XXX Always copying POLYINDEX, else tessellated data are no more valid! */
|
||||
CustomDataMask mask, nextmask, append_mask = CD_MASK_POLYINDEX;
|
||||
CustomDataMask mask, nextmask, append_mask = CD_MASK_ORIGINDEX;
|
||||
float (*deformedVerts)[3] = NULL;
|
||||
DerivedMesh *dm = NULL, *orcodm, *clothorcodm, *finaldm;
|
||||
int numVerts = me->totvert;
|
||||
@ -1801,7 +1809,7 @@ static void mesh_calc_modifiers(Scene *scene, Object *ob, float (*inputVertexCos
|
||||
#if 0
|
||||
if (num_tessface == 0 && finaldm->getNumTessFaces(finaldm) == 0)
|
||||
#else
|
||||
if (finaldm->getNumTessFaces(finaldm) == 0) /* || !CustomData_has_layer(&finaldm->faceData, CD_POLYINDEX)) */
|
||||
if (finaldm->getNumTessFaces(finaldm) == 0) /* || !CustomData_has_layer(&finaldm->faceData, CD_ORIGINDEX)) */
|
||||
#endif
|
||||
{
|
||||
finaldm->recalcTessellation(finaldm);
|
||||
@ -1809,8 +1817,8 @@ static void mesh_calc_modifiers(Scene *scene, Object *ob, float (*inputVertexCos
|
||||
/* Even if tessellation is not needed, some modifiers might have modified CD layers
|
||||
* (like mloopcol or mloopuv), hence we have to update those. */
|
||||
else if (finaldm->dirty & DM_DIRTY_TESS_CDLAYERS) {
|
||||
/* A tessellation already exists, it should always have a CD_POLYINDEX. */
|
||||
BLI_assert(CustomData_has_layer(&finaldm->faceData, CD_POLYINDEX));
|
||||
/* A tessellation already exists, it should always have a CD_ORIGINDEX. */
|
||||
BLI_assert(CustomData_has_layer(&finaldm->faceData, CD_ORIGINDEX));
|
||||
DM_update_tessface_data(finaldm);
|
||||
}
|
||||
/* Need to watch this, it can cause issues, see bug [#29338] */
|
||||
|
@ -617,9 +617,16 @@ static void cdDM_drawFacesTex_common(DerivedMesh *dm,
|
||||
float *nors = dm->getTessFaceDataArray(dm, CD_NORMAL);
|
||||
MTFace *tf = DM_get_tessface_data_layer(dm, CD_MTFACE);
|
||||
MCol *mcol;
|
||||
int i, orig, *index = DM_get_tessface_data_layer(dm, CD_ORIGINDEX);
|
||||
int i, orig;
|
||||
int colType, startFace = 0;
|
||||
|
||||
/* double lookup */
|
||||
const int *index_mf_to_mpoly = dm->getTessFaceDataArray(dm, CD_ORIGINDEX);
|
||||
const int *index_mp_to_orig = dm->getPolyDataArray(dm, CD_ORIGINDEX);
|
||||
if ((index_mf_to_mpoly && index_mp_to_orig) == FALSE) {
|
||||
index_mf_to_mpoly = index_mp_to_orig = NULL;
|
||||
}
|
||||
|
||||
colType = CD_TEXTURE_MCOL;
|
||||
mcol = dm->getTessFaceDataArray(dm, colType);
|
||||
if (!mcol) {
|
||||
@ -644,8 +651,8 @@ static void cdDM_drawFacesTex_common(DerivedMesh *dm,
|
||||
draw_option = drawParams(tf ? &tf[i] : NULL, (mcol != NULL), mf->mat_nr);
|
||||
}
|
||||
else {
|
||||
if (index) {
|
||||
orig = *index++;
|
||||
if (index_mf_to_mpoly) {
|
||||
orig = DM_origindex_mface_mpoly(index_mf_to_mpoly, index_mp_to_orig, i);
|
||||
if (orig == ORIGINDEX_NONE) { if (nors) nors += 3; continue; }
|
||||
if (drawParamsMapped) { draw_option = drawParamsMapped(userData, orig); }
|
||||
else { if (nors) nors += 3; continue; }
|
||||
@ -732,8 +739,8 @@ static void cdDM_drawFacesTex_common(DerivedMesh *dm,
|
||||
draw_option = drawParams(tf ? &tf[actualFace] : NULL, (mcol != NULL), mf[actualFace].mat_nr);
|
||||
}
|
||||
else {
|
||||
if (index) {
|
||||
orig = index[actualFace];
|
||||
if (index_mf_to_mpoly) {
|
||||
orig = DM_origindex_mface_mpoly(index_mf_to_mpoly, index_mp_to_orig, actualFace);
|
||||
if (orig == ORIGINDEX_NONE) continue;
|
||||
if (drawParamsMapped)
|
||||
draw_option = drawParamsMapped(userData, orig);
|
||||
@ -796,7 +803,16 @@ static void cdDM_drawMappedFaces(DerivedMesh *dm,
|
||||
MCol *mcol;
|
||||
float *nors = DM_get_tessface_data_layer(dm, CD_NORMAL);
|
||||
int colType, useColors = flag & DM_DRAW_USE_COLORS;
|
||||
int i, orig, *index = DM_get_tessface_data_layer(dm, CD_ORIGINDEX);
|
||||
int i, orig;
|
||||
|
||||
|
||||
/* double lookup */
|
||||
const int *index_mf_to_mpoly = dm->getTessFaceDataArray(dm, CD_ORIGINDEX);
|
||||
const int *index_mp_to_orig = dm->getPolyDataArray(dm, CD_ORIGINDEX);
|
||||
if ((index_mf_to_mpoly && index_mp_to_orig) == FALSE) {
|
||||
index_mf_to_mpoly = index_mp_to_orig = NULL;
|
||||
}
|
||||
|
||||
|
||||
colType = CD_ID_MCOL;
|
||||
mcol = DM_get_tessface_data_layer(dm, colType);
|
||||
@ -819,7 +835,7 @@ static void cdDM_drawMappedFaces(DerivedMesh *dm,
|
||||
int drawSmooth = (flag & DM_DRAW_ALWAYS_SMOOTH) ? 1 : (mf->flag & ME_SMOOTH);
|
||||
DMDrawOption draw_option = DM_DRAW_OPTION_NORMAL;
|
||||
|
||||
orig = (index == NULL) ? i : *index++;
|
||||
orig = (index_mf_to_mpoly) ? DM_origindex_mface_mpoly(index_mf_to_mpoly, index_mp_to_orig, i) : i;
|
||||
|
||||
if (orig == ORIGINDEX_NONE)
|
||||
draw_option = setMaterial(mf->mat_nr + 1, NULL);
|
||||
@ -919,7 +935,7 @@ static void cdDM_drawMappedFaces(DerivedMesh *dm,
|
||||
if (i != tottri - 1)
|
||||
next_actualFace = dm->drawObject->triangle_to_mface[i + 1];
|
||||
|
||||
orig = (index == NULL) ? actualFace : index[actualFace];
|
||||
orig = (index_mf_to_mpoly) ? DM_origindex_mface_mpoly(index_mf_to_mpoly, index_mp_to_orig, i) : i;
|
||||
|
||||
if (orig == ORIGINDEX_NONE)
|
||||
draw_option = setMaterial(mface->mat_nr + 1, NULL);
|
||||
@ -1024,7 +1040,14 @@ static void cdDM_drawMappedFacesGLSL(DerivedMesh *dm,
|
||||
/* MTFace *tf = dm->getTessFaceDataArray(dm, CD_MTFACE); */ /* UNUSED */
|
||||
float (*nors)[3] = dm->getTessFaceDataArray(dm, CD_NORMAL);
|
||||
int a, b, do_draw, matnr, new_matnr;
|
||||
int orig, *index = dm->getTessFaceDataArray(dm, CD_ORIGINDEX);
|
||||
int orig;
|
||||
|
||||
/* double lookup */
|
||||
const int *index_mf_to_mpoly = dm->getTessFaceDataArray(dm, CD_ORIGINDEX);
|
||||
const int *index_mp_to_orig = dm->getPolyDataArray(dm, CD_ORIGINDEX);
|
||||
if ((index_mf_to_mpoly && index_mp_to_orig) == FALSE) {
|
||||
index_mf_to_mpoly = index_mp_to_orig = NULL;
|
||||
}
|
||||
|
||||
cdDM_update_normals_from_pbvh(dm);
|
||||
|
||||
@ -1057,7 +1080,7 @@ static void cdDM_drawMappedFacesGLSL(DerivedMesh *dm,
|
||||
continue;
|
||||
}
|
||||
else if (setDrawOptions) {
|
||||
orig = (index) ? index[a] : a;
|
||||
orig = (index_mf_to_mpoly) ? DM_origindex_mface_mpoly(index_mf_to_mpoly, index_mp_to_orig, a) : a;
|
||||
|
||||
if (orig == ORIGINDEX_NONE) {
|
||||
/* since the material is set by setMaterial(), faces with no
|
||||
@ -1318,7 +1341,14 @@ static void cdDM_drawMappedFacesMat(DerivedMesh *dm,
|
||||
MFace *mf = cddm->mface;
|
||||
float (*nors)[3] = dm->getTessFaceDataArray(dm, CD_NORMAL);
|
||||
int a, matnr, new_matnr;
|
||||
int orig, *index = dm->getTessFaceDataArray(dm, CD_ORIGINDEX);
|
||||
int orig;
|
||||
|
||||
/* double lookup */
|
||||
const int *index_mf_to_mpoly = dm->getTessFaceDataArray(dm, CD_ORIGINDEX);
|
||||
const int *index_mp_to_orig = dm->getPolyDataArray(dm, CD_ORIGINDEX);
|
||||
if ((index_mf_to_mpoly && index_mp_to_orig) == FALSE) {
|
||||
index_mf_to_mpoly = index_mp_to_orig = NULL;
|
||||
}
|
||||
|
||||
cdDM_update_normals_from_pbvh(dm);
|
||||
|
||||
@ -1347,7 +1377,7 @@ static void cdDM_drawMappedFacesMat(DerivedMesh *dm,
|
||||
|
||||
/* skipping faces */
|
||||
if (setFace) {
|
||||
orig = (index) ? index[a] : a;
|
||||
orig = (index_mf_to_mpoly) ? DM_origindex_mface_mpoly(index_mf_to_mpoly, index_mp_to_orig, a) : a;
|
||||
|
||||
if (orig != ORIGINDEX_NONE && !setFace(userData, orig))
|
||||
continue;
|
||||
@ -1510,11 +1540,6 @@ void CDDM_recalc_tessellation_ex(DerivedMesh *dm, const int do_face_nor_cpy)
|
||||
dm->numTessFaceData, dm->numLoopData, dm->numPolyData,
|
||||
do_face_nor_cpy);
|
||||
|
||||
if (!CustomData_get_layer(&dm->faceData, CD_ORIGINDEX)) {
|
||||
int *polyIndex = CustomData_get_layer(&dm->faceData, CD_POLYINDEX);
|
||||
CustomData_add_layer(&dm->faceData, CD_ORIGINDEX, CD_REFERENCE, polyIndex, dm->numTessFaceData);
|
||||
}
|
||||
|
||||
cddm->mface = CustomData_get_layer(&dm->faceData, CD_MFACE);
|
||||
|
||||
/* Tessellation recreated faceData, and the active layer indices need to get re-propagated
|
||||
@ -1626,7 +1651,6 @@ DerivedMesh *CDDM_new(int numVerts, int numEdges, int numTessFaces, int numLoops
|
||||
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->faceData, CD_POLYINDEX, 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);
|
||||
@ -1650,7 +1674,6 @@ DerivedMesh *CDDM_from_mesh(Mesh *mesh, Object *UNUSED(ob))
|
||||
DerivedMesh *dm = &cddm->dm;
|
||||
CustomDataMask mask = CD_MASK_MESH & (~CD_MASK_MDISPS);
|
||||
int alloctype;
|
||||
int *polyindex = NULL;
|
||||
|
||||
/* this does a referenced copy, with an exception for fluidsim */
|
||||
|
||||
@ -1665,7 +1688,7 @@ DerivedMesh *CDDM_from_mesh(Mesh *mesh, Object *UNUSED(ob))
|
||||
mesh->totvert);
|
||||
CustomData_merge(&mesh->edata, &dm->edgeData, mask, alloctype,
|
||||
mesh->totedge);
|
||||
CustomData_merge(&mesh->fdata, &dm->faceData, mask | CD_MASK_POLYINDEX, alloctype,
|
||||
CustomData_merge(&mesh->fdata, &dm->faceData, mask | CD_MASK_ORIGINDEX, alloctype,
|
||||
mesh->totface);
|
||||
CustomData_merge(&mesh->ldata, &dm->loopData, mask, alloctype,
|
||||
mesh->totloop);
|
||||
@ -1678,17 +1701,12 @@ DerivedMesh *CDDM_from_mesh(Mesh *mesh, Object *UNUSED(ob))
|
||||
cddm->mpoly = CustomData_get_layer(&dm->polyData, CD_MPOLY);
|
||||
cddm->mface = CustomData_get_layer(&dm->faceData, CD_MFACE);
|
||||
|
||||
/* commented since even when CD_POLYINDEX was first added this line fails
|
||||
/* 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_POLYINDEX));
|
||||
BLI_assert(CustomData_has_layer(&cddm->dm.faceData, CD_ORIGINDEX));
|
||||
#endif
|
||||
|
||||
polyindex = CustomData_get_layer(&dm->faceData, CD_POLYINDEX);
|
||||
if (!CustomData_has_layer(&cddm->dm.faceData, CD_ORIGINDEX)) {
|
||||
CustomData_add_layer(&dm->faceData, CD_ORIGINDEX, CD_REFERENCE, polyindex, mesh->totface);
|
||||
}
|
||||
|
||||
return dm;
|
||||
}
|
||||
|
||||
@ -1937,7 +1955,6 @@ static DerivedMesh *cddm_from_bmesh_ex(struct BMesh *bm, int use_mdisps,
|
||||
|
||||
BM_mesh_elem_index_ensure(bm, BM_FACE);
|
||||
|
||||
polyindex = dm->getTessFaceDataArray(dm, CD_POLYINDEX);
|
||||
index = dm->getTessFaceDataArray(dm, CD_ORIGINDEX);
|
||||
for (i = 0; i < dm->numTessFaceData; i++, index++, polyindex++) {
|
||||
MFace *mf = &mface[i];
|
||||
@ -1951,8 +1968,8 @@ static DerivedMesh *cddm_from_bmesh_ex(struct BMesh *bm, int use_mdisps,
|
||||
mf->mat_nr = efa->mat_nr;
|
||||
mf->flag = BM_face_flag_to_mflag(efa);
|
||||
|
||||
*index = add_orig ? BM_elem_index_get(efa) : *(int *)CustomData_bmesh_get(&bm->pdata, efa->head.data, CD_ORIGINDEX);
|
||||
*polyindex = 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, numTex);
|
||||
test_index_face(mf, &dm->faceData, i, 3);
|
||||
@ -2019,6 +2036,7 @@ static DerivedMesh *cddm_copy_ex(DerivedMesh *source, int faces_from_tessfaces)
|
||||
source->getVertDataArray(source, CD_ORIGINDEX);
|
||||
source->getEdgeDataArray(source, CD_ORIGINDEX);
|
||||
source->getTessFaceDataArray(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,
|
||||
@ -2073,6 +2091,7 @@ DerivedMesh *CDDM_from_template(DerivedMesh *source,
|
||||
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(dm, source, DM_TYPE_CDDM, numVerts, numEdges, numTessFaces, numLoops, numPolys);
|
||||
@ -2090,8 +2109,6 @@ DerivedMesh *CDDM_from_template(DerivedMesh *source,
|
||||
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);
|
||||
if (!CustomData_get_layer(&dm->faceData, CD_POLYINDEX))
|
||||
CustomData_add_layer(&dm->faceData, CD_POLYINDEX, CD_CALLOC, NULL, numTessFaces);
|
||||
|
||||
cddm->mvert = CustomData_get_layer(&dm->vertData, CD_MVERT);
|
||||
cddm->medge = CustomData_get_layer(&dm->edgeData, CD_MEDGE);
|
||||
@ -2156,8 +2173,8 @@ void CDDM_calc_normals_mapping_ex(DerivedMesh *dm, const short only_face_normals
|
||||
CDDM_recalc_tessellation_ex(dm, FALSE);
|
||||
}
|
||||
else {
|
||||
/* A tessellation already exists, it should always have a CD_POLYINDEX */
|
||||
BLI_assert(CustomData_has_layer(&dm->faceData, CD_POLYINDEX));
|
||||
/* 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);
|
||||
}
|
||||
|
||||
@ -2167,7 +2184,7 @@ void CDDM_calc_normals_mapping_ex(DerivedMesh *dm, const short only_face_normals
|
||||
/* calculate face normals */
|
||||
BKE_mesh_calc_normals_mapping_ex(cddm->mvert, dm->numVertData, CDDM_get_loops(dm), CDDM_get_polys(dm),
|
||||
dm->numLoopData, dm->numPolyData, NULL, cddm->mface, dm->numTessFaceData,
|
||||
CustomData_get_layer(&dm->faceData, CD_POLYINDEX), face_nors,
|
||||
CustomData_get_layer(&dm->faceData, CD_ORIGINDEX), face_nors,
|
||||
only_face_normals);
|
||||
|
||||
CustomData_add_layer(&dm->faceData, CD_NORMAL, CD_ASSIGN,
|
||||
|
@ -74,8 +74,14 @@ BLI_STATIC_ASSERT(sizeof(((CustomData *)NULL)->typemap) /
|
||||
/********************* Layer type information **********************/
|
||||
typedef struct LayerTypeInfo {
|
||||
int size; /* the memory size of one element of this layer's data */
|
||||
const char *structname; /* name of the struct used, for file writing */
|
||||
int structnum; /* number of structs per element, for file writing */
|
||||
|
||||
/**
|
||||
* name of the struct used, for file writing */
|
||||
const char *structname;
|
||||
/**
|
||||
* number of structs per element, for file writing
|
||||
* (set to zero skips writing this data to disk/undo) */
|
||||
int structnum;
|
||||
|
||||
/**
|
||||
* default layer name.
|
||||
@ -1061,8 +1067,8 @@ static const LayerTypeInfo LAYERTYPEINFO[CD_NUMTYPES] = {
|
||||
/* 8: CD_NORMAL */
|
||||
/* 3 floats per normal vector */
|
||||
{sizeof(float) * 3, "vec3f", 1, NULL, NULL, NULL, NULL, NULL, NULL},
|
||||
/* 9: CD_POLYINDEX */
|
||||
{sizeof(int), "MIntProperty", 1, NULL, NULL, NULL, NULL, NULL, NULL},
|
||||
/* 9: CD_POLYINDEX (deprecated) */
|
||||
{sizeof(int), "", 0, NULL, NULL, NULL, NULL, NULL, NULL},
|
||||
/* 10: CD_PROP_FLT */
|
||||
{sizeof(MFloatProperty), "MFloatProperty", 1, "Float", layerCopy_propFloat, NULL, NULL, NULL},
|
||||
/* 11: CD_PROP_INT */
|
||||
@ -1180,7 +1186,7 @@ const CustomDataMask CD_MASK_DERIVEDMESH =
|
||||
CD_MASK_MLOOPUV | CD_MASK_MLOOPCOL | CD_MASK_MTEXPOLY | CD_MASK_PREVIEW_MLOOPCOL |
|
||||
CD_MASK_PROP_STR | CD_MASK_ORIGSPACE | CD_MASK_ORIGSPACE_MLOOP | CD_MASK_ORCO | CD_MASK_TANGENT |
|
||||
CD_MASK_PREVIEW_MCOL | CD_MASK_NORMAL | CD_MASK_SHAPEKEY | CD_MASK_RECAST |
|
||||
CD_MASK_ORIGINDEX | CD_MASK_POLYINDEX | CD_MASK_MVERT_SKIN;
|
||||
CD_MASK_ORIGINDEX | CD_MASK_MVERT_SKIN;
|
||||
const CustomDataMask CD_MASK_BMESH =
|
||||
CD_MASK_MLOOPUV | CD_MASK_MLOOPCOL | CD_MASK_MTEXPOLY |
|
||||
CD_MASK_MSTICKY | CD_MASK_MDEFORMVERT | CD_MASK_PROP_FLT | CD_MASK_PROP_INT |
|
||||
|
@ -2163,7 +2163,7 @@ void BKE_mesh_convert_mfaces_to_mpolys_ex(ID *id, CustomData *fdata, CustomData
|
||||
me->flag &= ~ME_FGON;
|
||||
}
|
||||
|
||||
polyindex = CustomData_get_layer(fdata, CD_POLYINDEX);
|
||||
polyindex = CustomData_get_layer(fdata, CD_ORIGINDEX);
|
||||
|
||||
j = 0; /* current loop index */
|
||||
ml = mloop;
|
||||
@ -2505,12 +2505,9 @@ int BKE_mesh_recalc_tessellation(CustomData *fdata,
|
||||
ScanFillContext sf_ctx;
|
||||
ScanFillVert *sf_vert, *sf_vert_last, *sf_vert_first;
|
||||
ScanFillFace *sf_tri;
|
||||
int *mface_orig_index = NULL;
|
||||
BLI_array_declare(mface_orig_index);
|
||||
int *mface_to_poly_map = NULL;
|
||||
BLI_array_declare(mface_to_poly_map);
|
||||
int lindex[4]; /* only ever use 3 in this case */
|
||||
int *poly_orig_index;
|
||||
int poly_index, j, mface_index;
|
||||
|
||||
const int numTex = CustomData_number_of_layers(pdata, CD_MTEXPOLY);
|
||||
@ -2528,7 +2525,6 @@ int BKE_mesh_recalc_tessellation(CustomData *fdata,
|
||||
|
||||
mface_index = 0;
|
||||
mp = mpoly;
|
||||
poly_orig_index = CustomData_get_layer(pdata, CD_ORIGINDEX);
|
||||
for (poly_index = 0; poly_index < totpoly; poly_index++, mp++) {
|
||||
if (mp->totloop < 3) {
|
||||
/* do nothing */
|
||||
@ -2548,10 +2544,6 @@ int BKE_mesh_recalc_tessellation(CustomData *fdata,
|
||||
mf->v4 = 0; \
|
||||
mf->mat_nr = mp->mat_nr; \
|
||||
mf->flag = mp->flag; \
|
||||
if (poly_orig_index) { \
|
||||
BLI_array_append(mface_orig_index, \
|
||||
poly_orig_index[poly_index]); \
|
||||
} \
|
||||
(void)0
|
||||
|
||||
/* ALMOST IDENTICAL TO DEFINE ABOVE (see EXCEPTION) */
|
||||
@ -2567,10 +2559,6 @@ int BKE_mesh_recalc_tessellation(CustomData *fdata,
|
||||
mf->v4 = mp->loopstart + 3; /* EXCEPTION */ \
|
||||
mf->mat_nr = mp->mat_nr; \
|
||||
mf->flag = mp->flag; \
|
||||
if (poly_orig_index) { \
|
||||
BLI_array_append(mface_orig_index, \
|
||||
poly_orig_index[poly_index]); \
|
||||
} \
|
||||
mf->edcode |= TESSFACE_IS_QUAD; /* EXCEPTION */ \
|
||||
(void)0
|
||||
|
||||
@ -2617,9 +2605,6 @@ int BKE_mesh_recalc_tessellation(CustomData *fdata,
|
||||
if (totfilltri) {
|
||||
BLI_array_grow_items(mface_to_poly_map, totfilltri);
|
||||
BLI_array_grow_items(mface, totfilltri);
|
||||
if (poly_orig_index) {
|
||||
BLI_array_grow_items(mface_orig_index, totfilltri);
|
||||
}
|
||||
|
||||
for (sf_tri = sf_ctx.fillfacebase.first; sf_tri; sf_tri = sf_tri->next, mf++) {
|
||||
mface_to_poly_map[mface_index] = poly_index;
|
||||
@ -2638,10 +2623,6 @@ int BKE_mesh_recalc_tessellation(CustomData *fdata,
|
||||
mf->edcode |= TESSFACE_SCANFILL; /* tag for sorting loop indices */
|
||||
#endif
|
||||
|
||||
if (poly_orig_index) {
|
||||
mface_orig_index[mface_index] = poly_orig_index[poly_index];
|
||||
}
|
||||
|
||||
mface_index++;
|
||||
}
|
||||
}
|
||||
@ -2659,23 +2640,13 @@ int BKE_mesh_recalc_tessellation(CustomData *fdata,
|
||||
if (LIKELY((MEM_allocN_len(mface) / sizeof(*mface)) != totface)) {
|
||||
mface = MEM_reallocN(mface, sizeof(*mface) * totface);
|
||||
mface_to_poly_map = MEM_reallocN(mface_to_poly_map, sizeof(*mface_to_poly_map) * totface);
|
||||
if (mface_orig_index) {
|
||||
mface_orig_index = MEM_reallocN(mface_orig_index, sizeof(*mface_orig_index) * totface);
|
||||
}
|
||||
}
|
||||
|
||||
CustomData_add_layer(fdata, CD_MFACE, CD_ASSIGN, mface, totface);
|
||||
|
||||
/* CD_POLYINDEX will contain an array of indices from tessfaces to the polygons
|
||||
/* CD_ORIGINDEX will contain an array of indices from tessfaces to the polygons
|
||||
* they are directly tessellated from */
|
||||
CustomData_add_layer(fdata, CD_POLYINDEX, CD_ASSIGN, mface_to_poly_map, totface);
|
||||
if (mface_orig_index) {
|
||||
/* If polys had a CD_ORIGINDEX layer, then the tessellated faces will get this
|
||||
* layer as well, pointing to polys from the original mesh (not the polys
|
||||
* that just got tessellated) */
|
||||
CustomData_add_layer(fdata, CD_ORIGINDEX, CD_ASSIGN, mface_orig_index, totface);
|
||||
}
|
||||
|
||||
CustomData_add_layer(fdata, CD_ORIGINDEX, CD_ASSIGN, mface_to_poly_map, totface);
|
||||
CustomData_from_bmeshpoly(fdata, pdata, ldata, totface);
|
||||
|
||||
if (do_face_nor_cpy) {
|
||||
|
@ -36,12 +36,12 @@
|
||||
|
||||
#include "DNA_meshdata_types.h"
|
||||
|
||||
#include "BKE_navmesh_conversion.h"
|
||||
#include "BKE_cdderivedmesh.h"
|
||||
|
||||
#include "BLI_utildefines.h"
|
||||
#include "BLI_math.h"
|
||||
|
||||
#include "BKE_navmesh_conversion.h"
|
||||
#include "BKE_cdderivedmesh.h"
|
||||
|
||||
#include "recast-capi.h"
|
||||
|
||||
BLI_INLINE float area2(const float *a, const float *b, const float *c)
|
||||
|
@ -618,7 +618,10 @@ typedef struct ParticleRenderData {
|
||||
int do_simplify;
|
||||
int timeoffset;
|
||||
ParticleRenderElem *elems;
|
||||
int *origindex;
|
||||
|
||||
/* ORIGINDEX */
|
||||
const int *index_mf_to_mpoly;
|
||||
const int *index_mp_to_orig;
|
||||
} ParticleRenderData;
|
||||
|
||||
static float psys_render_viewport_falloff(double rate, float dist, float width)
|
||||
@ -791,9 +794,13 @@ int psys_render_simplify_distribution(ParticleThreadContext *ctx, int tot)
|
||||
float *facearea, (*facecenter)[3], size[3], fac, powrate, scaleclamp;
|
||||
float co1[3], co2[3], co3[3], co4[3], lambda, arearatio, t, area, viewport;
|
||||
double vprate;
|
||||
int *origindex, *facetotvert;
|
||||
int *facetotvert;
|
||||
int a, b, totorigface, totface, newtot, skipped;
|
||||
|
||||
/* double lookup */
|
||||
const int *index_mf_to_mpoly;
|
||||
const int *index_mp_to_orig;
|
||||
|
||||
if (part->ren_as != PART_DRAW_PATH || !(part->draw & PART_DRAW_REN_STRAND))
|
||||
return tot;
|
||||
if (!ctx->sim.psys->renderdata)
|
||||
@ -807,13 +814,18 @@ int psys_render_simplify_distribution(ParticleThreadContext *ctx, int tot)
|
||||
|
||||
mvert = dm->getVertArray(dm);
|
||||
mface = dm->getTessFaceArray(dm);
|
||||
origindex = dm->getTessFaceDataArray(dm, CD_ORIGINDEX);
|
||||
totface = dm->getNumTessFaces(dm);
|
||||
totorigface = me->totpoly;
|
||||
|
||||
if (totface == 0 || totorigface == 0)
|
||||
return tot;
|
||||
|
||||
index_mf_to_mpoly = dm->getTessFaceDataArray(dm, CD_ORIGINDEX);
|
||||
index_mp_to_orig = dm->getPolyDataArray(dm, CD_ORIGINDEX);
|
||||
if ((index_mf_to_mpoly && index_mp_to_orig) == FALSE) {
|
||||
index_mf_to_mpoly = index_mp_to_orig = NULL;
|
||||
}
|
||||
|
||||
facearea = MEM_callocN(sizeof(float) * totorigface, "SimplifyFaceArea");
|
||||
facecenter = MEM_callocN(sizeof(float[3]) * totorigface, "SimplifyFaceCenter");
|
||||
facetotvert = MEM_callocN(sizeof(int) * totorigface, "SimplifyFaceArea");
|
||||
@ -824,20 +836,22 @@ int psys_render_simplify_distribution(ParticleThreadContext *ctx, int tot)
|
||||
|
||||
data->do_simplify = TRUE;
|
||||
data->elems = elems;
|
||||
data->origindex = origindex;
|
||||
data->index_mf_to_mpoly = index_mf_to_mpoly;
|
||||
data->index_mp_to_orig = index_mp_to_orig;
|
||||
|
||||
/* compute number of children per original face */
|
||||
for (a = 0; a < tot; a++) {
|
||||
b = (origindex) ? origindex[ctx->index[a]] : ctx->index[a];
|
||||
if (b != -1)
|
||||
b = (index_mf_to_mpoly) ? DM_origindex_mface_mpoly(index_mf_to_mpoly, index_mp_to_orig, ctx->index[a]) : ctx->index[a];
|
||||
if (b != ORIGINDEX_NONE) {
|
||||
elems[b].totchild++;
|
||||
}
|
||||
}
|
||||
|
||||
/* compute areas and centers of original faces */
|
||||
for (mf = mface, a = 0; a < totface; a++, mf++) {
|
||||
b = (origindex) ? origindex[a] : a;
|
||||
b = (index_mf_to_mpoly) ? DM_origindex_mface_mpoly(index_mf_to_mpoly, index_mp_to_orig, a) : a;
|
||||
|
||||
if (b != -1) {
|
||||
if (b != ORIGINDEX_NONE) {
|
||||
copy_v3_v3(co1, mvert[mf->v1].co);
|
||||
copy_v3_v3(co2, mvert[mf->v2].co);
|
||||
copy_v3_v3(co3, mvert[mf->v3].co);
|
||||
@ -931,8 +945,9 @@ int psys_render_simplify_distribution(ParticleThreadContext *ctx, int tot)
|
||||
|
||||
skipped = 0;
|
||||
for (a = 0, newtot = 0; a < tot; a++) {
|
||||
b = (origindex) ? origindex[ctx->index[a]] : ctx->index[a];
|
||||
if (b != -1) {
|
||||
b = (index_mf_to_mpoly) ? DM_origindex_mface_mpoly(index_mf_to_mpoly, index_mp_to_orig, ctx->index[a]) : ctx->index[a];
|
||||
|
||||
if (b != ORIGINDEX_NONE) {
|
||||
if (elems[b].curchild++ < ceil(elems[b].lambda * elems[b].totchild)) {
|
||||
ctx->index[newtot] = ctx->index[a];
|
||||
ctx->skip[newtot] = skipped;
|
||||
@ -963,10 +978,10 @@ int psys_render_simplify_params(ParticleSystem *psys, ChildParticle *cpa, float
|
||||
data = psys->renderdata;
|
||||
if (!data->do_simplify)
|
||||
return 0;
|
||||
|
||||
b = (data->origindex) ? data->origindex[cpa->num] : cpa->num;
|
||||
if (b == -1)
|
||||
b = (data->index_mf_to_mpoly) ? DM_origindex_mface_mpoly(data->index_mf_to_mpoly, data->index_mp_to_orig, cpa->num) : cpa->num;
|
||||
if (b == ORIGINDEX_NONE) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
elem = &data->elems[b];
|
||||
|
||||
@ -1624,17 +1639,22 @@ int psys_particle_dm_face_lookup(Object *ob, DerivedMesh *dm, int index, const f
|
||||
Mesh *me = (Mesh *)ob->data;
|
||||
MPoly *mpoly;
|
||||
OrigSpaceFace *osface;
|
||||
int *origindex;
|
||||
int quad, findex, totface;
|
||||
float uv[2], (*faceuv)[2];
|
||||
|
||||
/* double lookup */
|
||||
const int *index_mf_to_mpoly = dm->getTessFaceDataArray(dm, CD_ORIGINDEX);
|
||||
const int *index_mp_to_orig = dm->getPolyDataArray(dm, CD_ORIGINDEX);
|
||||
if ((index_mf_to_mpoly && index_mp_to_orig) == FALSE) {
|
||||
index_mf_to_mpoly = index_mp_to_orig = NULL;
|
||||
}
|
||||
|
||||
mpoly = dm->getPolyArray(dm);
|
||||
origindex = dm->getTessFaceDataArray(dm, CD_ORIGINDEX);
|
||||
osface = dm->getTessFaceDataArray(dm, CD_ORIGSPACE);
|
||||
|
||||
totface = dm->getNumTessFaces(dm);
|
||||
|
||||
if (osface == NULL || origindex == NULL) {
|
||||
if (osface == NULL || index_mf_to_mpoly == NULL) {
|
||||
/* Assume we don't need osface data */
|
||||
if (index < totface) {
|
||||
//printf("\tNO CD_ORIGSPACE, assuming not needed\n");
|
||||
@ -1668,7 +1688,8 @@ int psys_particle_dm_face_lookup(Object *ob, DerivedMesh *dm, int index, const f
|
||||
}
|
||||
else { /* if we have no node, try every face */
|
||||
for (findex = 0; findex < totface; findex++) {
|
||||
if (origindex[findex] == index) {
|
||||
const int findex_orig = DM_origindex_mface_mpoly(index_mf_to_mpoly, index_mp_to_orig, findex);
|
||||
if (findex_orig == index) {
|
||||
faceuv = osface[findex].uv;
|
||||
quad = (mpoly[findex].totloop == 4);
|
||||
|
||||
|
@ -346,7 +346,7 @@ void psys_calc_dmcache(Object *ob, DerivedMesh *dm, ParticleSystem *psys)
|
||||
if (!dm->deformedOnly) {
|
||||
/* Will use later to speed up subsurf/derivedmesh */
|
||||
LinkNode *node, *nodedmelem, **nodearray;
|
||||
int totdmelem, totelem, i, *origindex;
|
||||
int totdmelem, totelem, i, *origindex, *origindex_poly = NULL;
|
||||
|
||||
if (psys->part->from == PART_FROM_VERT) {
|
||||
totdmelem= dm->getNumVerts(dm);
|
||||
@ -356,23 +356,37 @@ void psys_calc_dmcache(Object *ob, DerivedMesh *dm, ParticleSystem *psys)
|
||||
else { /* FROM_FACE/FROM_VOLUME */
|
||||
totdmelem= dm->getNumTessFaces(dm);
|
||||
totelem= me->totpoly;
|
||||
origindex= dm->getTessFaceDataArray(dm, CD_ORIGINDEX);
|
||||
origindex = dm->getTessFaceDataArray(dm, CD_ORIGINDEX);
|
||||
/* for face lookups we need the poly origindex too */
|
||||
origindex_poly = dm->getPolyDataArray(dm, CD_ORIGINDEX);
|
||||
if (origindex_poly == NULL) {
|
||||
origindex = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
nodedmelem= MEM_callocN(sizeof(LinkNode)*totdmelem, "psys node elems");
|
||||
nodearray= MEM_callocN(sizeof(LinkNode *)*totelem, "psys node array");
|
||||
|
||||
for (i=0, node=nodedmelem; i<totdmelem; i++, origindex++, node++) {
|
||||
node->link= SET_INT_IN_POINTER(i);
|
||||
int origindex_final;
|
||||
node->link = SET_INT_IN_POINTER(i);
|
||||
|
||||
if (*origindex != -1) {
|
||||
if (nodearray[*origindex]) {
|
||||
origindex_final = *origindex;
|
||||
|
||||
/* if we have a poly source, do an index lookup */
|
||||
if (origindex_poly && origindex_final != ORIGINDEX_NONE) {
|
||||
origindex_final = origindex_poly[origindex_final];
|
||||
}
|
||||
|
||||
if (origindex_final != ORIGINDEX_NONE) {
|
||||
if (nodearray[origindex_final]) {
|
||||
/* prepend */
|
||||
node->next = nodearray[*origindex];
|
||||
nodearray[*origindex] = node;
|
||||
node->next = nodearray[origindex_final];
|
||||
nodearray[origindex_final] = node;
|
||||
}
|
||||
else {
|
||||
nodearray[origindex_final] = node;
|
||||
}
|
||||
else
|
||||
nodearray[*origindex] = node;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2706,11 +2706,7 @@ static void *ccgDM_get_tessface_data_layer(DerivedMesh *dm, int type)
|
||||
{
|
||||
if (type == CD_ORIGINDEX) {
|
||||
/* create origindex on demand to save memory */
|
||||
CCGDerivedMesh *ccgdm = (CCGDerivedMesh *)dm;
|
||||
CCGSubSurf *ss = ccgdm->ss;
|
||||
int *origindex;
|
||||
int a, i, index, totface;
|
||||
int gridFaces = ccgSubSurf_getGridSize(ss) - 1;
|
||||
|
||||
/* Avoid re-creation if the layer exists already */
|
||||
origindex = DM_get_tessface_data_layer(dm, CD_ORIGINDEX);
|
||||
@ -2721,6 +2717,34 @@ static void *ccgDM_get_tessface_data_layer(DerivedMesh *dm, int type)
|
||||
DM_add_tessface_layer(dm, CD_ORIGINDEX, CD_CALLOC, NULL);
|
||||
origindex = DM_get_tessface_data_layer(dm, CD_ORIGINDEX);
|
||||
|
||||
/* silly loop counting up */
|
||||
range_vn_i(origindex, dm->getNumTessFaces(dm), 0);
|
||||
|
||||
return origindex;
|
||||
}
|
||||
|
||||
return DM_get_tessface_data_layer(dm, type);
|
||||
}
|
||||
|
||||
static void *ccgDM_get_poly_data_layer(DerivedMesh *dm, int type)
|
||||
{
|
||||
if (type == CD_ORIGINDEX) {
|
||||
/* create origindex on demand to save memory */
|
||||
CCGDerivedMesh *ccgdm = (CCGDerivedMesh *)dm;
|
||||
CCGSubSurf *ss = ccgdm->ss;
|
||||
int *origindex;
|
||||
int a, i, index, totface;
|
||||
int gridFaces = ccgSubSurf_getGridSize(ss) - 1;
|
||||
|
||||
/* Avoid re-creation if the layer exists already */
|
||||
origindex = DM_get_poly_data_layer(dm, CD_ORIGINDEX);
|
||||
if (origindex) {
|
||||
return origindex;
|
||||
}
|
||||
|
||||
DM_add_poly_layer(dm, CD_ORIGINDEX, CD_CALLOC, NULL);
|
||||
origindex = DM_get_poly_data_layer(dm, CD_ORIGINDEX);
|
||||
|
||||
totface = ccgSubSurf_getNumFaces(ss);
|
||||
|
||||
for (a = 0, index = 0; index < totface; index++) {
|
||||
@ -2735,7 +2759,7 @@ static void *ccgDM_get_tessface_data_layer(DerivedMesh *dm, int type)
|
||||
return origindex;
|
||||
}
|
||||
|
||||
return DM_get_tessface_data_layer(dm, type);
|
||||
return DM_get_poly_data_layer(dm, type);
|
||||
}
|
||||
|
||||
static void *ccgDM_get_vert_data(DerivedMesh *dm, int index, int type)
|
||||
@ -2768,6 +2792,16 @@ static void *ccgDM_get_tessface_data(DerivedMesh *dm, int index, int type)
|
||||
return DM_get_tessface_data(dm, index, type);
|
||||
}
|
||||
|
||||
static void *ccgDM_get_poly_data(DerivedMesh *dm, int index, int type)
|
||||
{
|
||||
if (type == CD_ORIGINDEX) {
|
||||
/* ensure creation of CD_ORIGINDEX layer */
|
||||
ccgDM_get_tessface_data_layer(dm, type);
|
||||
}
|
||||
|
||||
return DM_get_poly_data(dm, index, type);
|
||||
}
|
||||
|
||||
static int ccgDM_getNumGrids(DerivedMesh *dm)
|
||||
{
|
||||
CCGDerivedMesh *ccgdm = (CCGDerivedMesh *)dm;
|
||||
@ -3098,7 +3132,7 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss,
|
||||
}
|
||||
|
||||
/* We absolutely need that layer, else it's no valid tessellated data! */
|
||||
polyidx = CustomData_add_layer(&ccgdm->dm.faceData, CD_POLYINDEX, CD_CALLOC,
|
||||
polyidx = CustomData_add_layer(&ccgdm->dm.faceData, CD_ORIGINDEX, CD_CALLOC,
|
||||
NULL, ccgSubSurf_getNumFinalFaces(ss));
|
||||
|
||||
ccgdm->dm.getMinMax = ccgDM_getMinMax;
|
||||
@ -3126,9 +3160,11 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss,
|
||||
ccgdm->dm.getVertData = ccgDM_get_vert_data;
|
||||
ccgdm->dm.getEdgeData = ccgDM_get_edge_data;
|
||||
ccgdm->dm.getTessFaceData = ccgDM_get_tessface_data;
|
||||
ccgdm->dm.getPolyData = ccgDM_get_poly_data;
|
||||
ccgdm->dm.getVertDataArray = ccgDM_get_vert_data_layer;
|
||||
ccgdm->dm.getEdgeDataArray = ccgDM_get_edge_data_layer;
|
||||
ccgdm->dm.getTessFaceDataArray = ccgDM_get_tessface_data_layer;
|
||||
ccgdm->dm.getPolyDataArray = ccgDM_get_poly_data_layer;
|
||||
ccgdm->dm.getNumGrids = ccgDM_getNumGrids;
|
||||
ccgdm->dm.getGridSize = ccgDM_getGridSize;
|
||||
ccgdm->dm.getGridData = ccgDM_getGridData;
|
||||
@ -3227,8 +3263,8 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss,
|
||||
|
||||
vertOrigIndex = DM_get_vert_data_layer(&ccgdm->dm, CD_ORIGINDEX);
|
||||
/*edgeOrigIndex = DM_get_edge_data_layer(&ccgdm->dm, CD_ORIGINDEX);*/
|
||||
faceOrigIndex = DM_get_tessface_data_layer(&ccgdm->dm, CD_ORIGINDEX);
|
||||
|
||||
faceOrigIndex = DM_get_tessface_data_layer(&ccgdm->dm, CD_ORIGINDEX);
|
||||
polyOrigIndex = DM_get_poly_data_layer(&ccgdm->dm, CD_ORIGINDEX);
|
||||
|
||||
#if 0
|
||||
@ -3366,7 +3402,8 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss,
|
||||
|
||||
/*set original index data*/
|
||||
if (faceOrigIndex) {
|
||||
*faceOrigIndex = origIndex;
|
||||
/* reference the index in 'polyOrigIndex' */
|
||||
*faceOrigIndex = faceNum;
|
||||
faceOrigIndex++;
|
||||
}
|
||||
if (polyOrigIndex) {
|
||||
|
@ -3729,7 +3729,7 @@ static void lib_link_mesh(FileData *fd, Main *main)
|
||||
/*
|
||||
* Re-tessellate, even if the polys were just created from tessfaces, this
|
||||
* is important because it:
|
||||
* - fill the CD_POLYINDEX layer
|
||||
* - fill the CD_ORIGINDEX layer
|
||||
* - gives consistency of tessface between loading from a file and
|
||||
* converting an edited BMesh back into a mesh (i.e. it replaces
|
||||
* quad tessfaces in a loaded mesh immediately, instead of lazily
|
||||
|
@ -85,7 +85,7 @@ void paintface_flush_flags(Object *ob)
|
||||
* - Final derived polys => Final derived tessfaces
|
||||
*/
|
||||
|
||||
if ((index_array = CustomData_get_layer(&me->fdata, CD_POLYINDEX))) {
|
||||
if ((index_array = CustomData_get_layer(&me->fdata, CD_ORIGINDEX))) {
|
||||
faces = me->mface;
|
||||
totface = me->totface;
|
||||
|
||||
@ -109,7 +109,7 @@ void paintface_flush_flags(Object *ob)
|
||||
}
|
||||
}
|
||||
|
||||
if ((index_array = CustomData_get_layer(&dm->faceData, CD_POLYINDEX))) {
|
||||
if ((index_array = CustomData_get_layer(&dm->faceData, CD_ORIGINDEX))) {
|
||||
polys = dm->getPolyArray(dm);
|
||||
faces = dm->getTessFaceArray(dm);
|
||||
totface = dm->getNumTessFaces(dm);
|
||||
|
@ -902,7 +902,7 @@ void ED_mesh_update(Mesh *mesh, bContext *C, int calc_edges, int calc_tessface)
|
||||
* so rather then add poly-index layer and calculate normals for it
|
||||
* calculate normals only for the mvert's. - campbell */
|
||||
#ifdef USE_BMESH_MPOLY_NORMALS
|
||||
polyindex = CustomData_get_layer(&mesh->fdata, CD_POLYINDEX);
|
||||
polyindex = CustomData_get_layer(&mesh->fdata, CD_ORIGINDEX);
|
||||
/* add a normals layer for tessellated faces, a tessface normal will
|
||||
* contain the normal of the poly the face was tessellated from. */
|
||||
face_nors = CustomData_add_layer(&mesh->fdata, CD_NORMAL, CD_CALLOC, NULL, mesh->totface);
|
||||
|
@ -150,11 +150,13 @@ typedef struct {
|
||||
float height_min, height_max;
|
||||
Image *ima;
|
||||
DerivedMesh *ssdm;
|
||||
const int *origindex;
|
||||
const int *orig_index_mf_to_mpoly;
|
||||
const int *orig_index_mp_to_orig;
|
||||
} MHeightBakeData;
|
||||
|
||||
typedef struct {
|
||||
const int *origindex;
|
||||
const int *orig_index_mf_to_mpoly;
|
||||
const int *orig_index_mp_to_orig;
|
||||
} MNormalBakeData;
|
||||
|
||||
static void multiresbake_get_normal(const MResolvePixelData *data, float norm[], const int face_num, const int vert_index)
|
||||
@ -508,7 +510,9 @@ static void interp_bilinear_grid(CCGKey *key, CCGElem *grid, float crn_x, float
|
||||
interp_bilinear_quad_data(data, u, v, res);
|
||||
}
|
||||
|
||||
static void get_ccgdm_data(DerivedMesh *lodm, DerivedMesh *hidm, const int *origindex, const int lvl, const int face_index, const float u, const float v, float co[3], float n[3])
|
||||
static void get_ccgdm_data(DerivedMesh *lodm, DerivedMesh *hidm,
|
||||
const int *index_mf_to_mpoly, const int *index_mp_to_orig,
|
||||
const int lvl, const int face_index, const float u, const float v, float co[3], float n[3])
|
||||
{
|
||||
MFace mface;
|
||||
CCGElem **grid_data;
|
||||
@ -532,7 +536,7 @@ static void get_ccgdm_data(DerivedMesh *lodm, DerivedMesh *hidm, const int *orig
|
||||
}
|
||||
else {
|
||||
int side = (1 << (lvl - 1)) + 1;
|
||||
int grid_index = origindex[face_index];
|
||||
int grid_index = DM_origindex_mface_mpoly(index_mf_to_mpoly, index_mp_to_orig, face_index);
|
||||
int loc_offs = face_index % (1 << (2 * lvl));
|
||||
int cell_index = loc_offs % ((side - 1) * (side - 1));
|
||||
int cell_side = (grid_size - 1) / (side - 1);
|
||||
@ -628,7 +632,8 @@ static void *init_heights_data(MultiresBakeRender *bkr, Image *ima)
|
||||
}
|
||||
}
|
||||
|
||||
height_data->origindex = lodm->getTessFaceDataArray(lodm, CD_ORIGINDEX);
|
||||
height_data->orig_index_mf_to_mpoly = lodm->getTessFaceDataArray(lodm, CD_ORIGINDEX);
|
||||
height_data->orig_index_mp_to_orig = lodm->getPolyDataArray(lodm, CD_ORIGINDEX);
|
||||
|
||||
return (void *)height_data;
|
||||
}
|
||||
@ -640,7 +645,8 @@ static void *init_normal_data(MultiresBakeRender *bkr, Image *UNUSED(ima))
|
||||
|
||||
normal_data = MEM_callocN(sizeof(MNormalBakeData), "MultiresBake normalData");
|
||||
|
||||
normal_data->origindex = lodm->getTessFaceDataArray(lodm, CD_ORIGINDEX);
|
||||
normal_data->orig_index_mf_to_mpoly = lodm->getTessFaceDataArray(lodm, CD_ORIGINDEX);
|
||||
normal_data->orig_index_mp_to_orig = lodm->getPolyDataArray(lodm, CD_ORIGINDEX);
|
||||
|
||||
return (void *)normal_data;
|
||||
}
|
||||
@ -735,10 +741,14 @@ static void apply_heights_callback(DerivedMesh *lores_dm, DerivedMesh *hires_dm,
|
||||
CLAMP(uv[0], 0.0f, 1.0f);
|
||||
CLAMP(uv[1], 0.0f, 1.0f);
|
||||
|
||||
get_ccgdm_data(lores_dm, hires_dm, height_data->origindex, lvl, face_index, uv[0], uv[1], p1, 0);
|
||||
get_ccgdm_data(lores_dm, hires_dm,
|
||||
height_data->orig_index_mf_to_mpoly, height_data->orig_index_mf_to_mpoly,
|
||||
lvl, face_index, uv[0], uv[1], p1, 0);
|
||||
|
||||
if (height_data->ssdm) {
|
||||
get_ccgdm_data(lores_dm, height_data->ssdm, height_data->origindex, 0, face_index, uv[0], uv[1], p0, n);
|
||||
get_ccgdm_data(lores_dm, height_data->ssdm,
|
||||
height_data->orig_index_mf_to_mpoly, height_data->orig_index_mf_to_mpoly,
|
||||
0, face_index, uv[0], uv[1], p0, n);
|
||||
}
|
||||
else {
|
||||
lores_dm->getTessFace(lores_dm, face_index, &mface);
|
||||
@ -808,7 +818,9 @@ static void apply_tangmat_callback(DerivedMesh *lores_dm, DerivedMesh *hires_dm,
|
||||
CLAMP(uv[0], 0.0f, 1.0f);
|
||||
CLAMP(uv[1], 0.0f, 1.0f);
|
||||
|
||||
get_ccgdm_data(lores_dm, hires_dm, normal_data->origindex, lvl, face_index, uv[0], uv[1], NULL, n);
|
||||
get_ccgdm_data(lores_dm, hires_dm,
|
||||
normal_data->orig_index_mf_to_mpoly, normal_data->orig_index_mp_to_orig,
|
||||
lvl, face_index, uv[0], uv[1], NULL, n);
|
||||
|
||||
mul_v3_m3v3(vec, tangmat, n);
|
||||
normalize_v3(vec);
|
||||
|
@ -248,19 +248,25 @@ static void imapaint_tri_weights(Object *ob,
|
||||
void imapaint_pick_uv(Scene *scene, Object *ob, unsigned int faceindex, const int xy[2], float uv[2])
|
||||
{
|
||||
DerivedMesh *dm = mesh_get_derived_final(scene, ob, CD_MASK_BAREMESH);
|
||||
const int *index = dm->getTessFaceDataArray(dm, CD_ORIGINDEX);
|
||||
MTFace *tface = dm->getTessFaceDataArray(dm, CD_MTFACE), *tf;
|
||||
int numfaces = dm->getNumTessFaces(dm), a, findex;
|
||||
float p[2], w[3], absw, minabsw;
|
||||
MFace mf;
|
||||
MVert mv[4];
|
||||
|
||||
/* double lookup */
|
||||
const int *index_mf_to_mpoly = dm->getTessFaceDataArray(dm, CD_ORIGINDEX);
|
||||
const int *index_mp_to_orig = dm->getPolyDataArray(dm, CD_ORIGINDEX);
|
||||
if ((index_mf_to_mpoly && index_mp_to_orig) == FALSE) {
|
||||
index_mf_to_mpoly = index_mp_to_orig = NULL;
|
||||
}
|
||||
|
||||
minabsw = 1e10;
|
||||
uv[0] = uv[1] = 0.0;
|
||||
|
||||
/* test all faces in the derivedmesh with the original index of the picked face */
|
||||
for (a = 0; a < numfaces; a++) {
|
||||
findex = index ? index[a] : a;
|
||||
findex = index_mf_to_mpoly ? DM_origindex_mface_mpoly(index_mf_to_mpoly, index_mp_to_orig, a) : a;
|
||||
|
||||
if (findex == faceindex) {
|
||||
dm->getTessFace(dm, a, &mf);
|
||||
|
@ -2570,7 +2570,7 @@ static void vpaint_build_poly_facemap(struct VPaintData *vd, Mesh *me)
|
||||
|
||||
vd->polyfacemap = BLI_memarena_alloc(vd->polyfacemap_arena, sizeof(ListBase) * me->totpoly);
|
||||
|
||||
origIndex = CustomData_get_layer(&me->fdata, CD_POLYINDEX);
|
||||
origIndex = CustomData_get_layer(&me->fdata, CD_ORIGINDEX);
|
||||
mf = me->mface;
|
||||
|
||||
if (!origIndex)
|
||||
|
@ -132,7 +132,8 @@ typedef struct drawDMFacesSel_userData {
|
||||
BMEditMesh *em; /* BMESH BRANCH ONLY */
|
||||
|
||||
BMFace *efa_act;
|
||||
int *orig_index;
|
||||
int *orig_index_mf_to_mpoly;
|
||||
int *orig_index_mp_to_orig;
|
||||
} drawDMFacesSel_userData;
|
||||
|
||||
typedef struct drawDMNormal_userData {
|
||||
@ -2310,11 +2311,11 @@ static int draw_dm_faces_sel__compareDrawOptions(void *userData, int index, int
|
||||
|
||||
unsigned char *col, *next_col;
|
||||
|
||||
if (!data->orig_index)
|
||||
if (!data->orig_index_mf_to_mpoly)
|
||||
return 0;
|
||||
|
||||
efa = EDBM_face_at_index(data->em, data->orig_index[index]);
|
||||
next_efa = EDBM_face_at_index(data->em, data->orig_index[next_index]);
|
||||
efa = EDBM_face_at_index(data->em, DM_origindex_mface_mpoly(data->orig_index_mf_to_mpoly, data->orig_index_mp_to_orig, index));
|
||||
next_efa = EDBM_face_at_index(data->em, DM_origindex_mface_mpoly(data->orig_index_mf_to_mpoly, data->orig_index_mp_to_orig, next_index));
|
||||
|
||||
if (efa == next_efa)
|
||||
return 1;
|
||||
@ -2342,7 +2343,12 @@ static void draw_dm_faces_sel(BMEditMesh *em, DerivedMesh *dm, unsigned char *ba
|
||||
data.cols[1] = selCol;
|
||||
data.cols[2] = actCol;
|
||||
data.efa_act = efa_act;
|
||||
data.orig_index = DM_get_tessface_data_layer(dm, CD_ORIGINDEX);
|
||||
/* double lookup */
|
||||
data.orig_index_mf_to_mpoly = DM_get_tessface_data_layer(dm, CD_ORIGINDEX);
|
||||
data.orig_index_mp_to_orig = DM_get_poly_data_layer(dm, CD_ORIGINDEX);
|
||||
if ((data.orig_index_mf_to_mpoly && data.orig_index_mp_to_orig) == FALSE) {
|
||||
data.orig_index_mf_to_mpoly = data.orig_index_mp_to_orig = NULL;
|
||||
}
|
||||
|
||||
dm->drawMappedFaces(dm, draw_dm_faces_sel__setDrawOptions, GPU_enable_material, draw_dm_faces_sel__compareDrawOptions, &data, 0);
|
||||
}
|
||||
|
@ -369,7 +369,7 @@ static ParamHandle *construct_param_handle_subsurfed(Scene *scene, BMEditMesh *e
|
||||
/* Used to hold subsurfed Mesh */
|
||||
DerivedMesh *derivedMesh, *initialDerived;
|
||||
/* holds original indices for subsurfed mesh */
|
||||
int *origVertIndices, *origFaceIndices, *origEdgeIndices;
|
||||
int *origVertIndices, *origEdgeIndices, *origFaceIndices, *origPolyIndices;
|
||||
/* Holds vertices of subsurfed mesh */
|
||||
MVert *subsurfedVerts;
|
||||
MEdge *subsurfedEdges;
|
||||
@ -422,6 +422,7 @@ static ParamHandle *construct_param_handle_subsurfed(Scene *scene, BMEditMesh *e
|
||||
origVertIndices = derivedMesh->getVertDataArray(derivedMesh, CD_ORIGINDEX);
|
||||
origEdgeIndices = derivedMesh->getEdgeDataArray(derivedMesh, CD_ORIGINDEX);
|
||||
origFaceIndices = derivedMesh->getTessFaceDataArray(derivedMesh, CD_ORIGINDEX);
|
||||
origPolyIndices = derivedMesh->getPolyDataArray(derivedMesh, CD_ORIGINDEX);
|
||||
|
||||
numOfEdges = derivedMesh->getNumEdges(derivedMesh);
|
||||
numOfFaces = derivedMesh->getNumTessFaces(derivedMesh);
|
||||
@ -433,7 +434,7 @@ static ParamHandle *construct_param_handle_subsurfed(Scene *scene, BMEditMesh *e
|
||||
|
||||
/* map subsurfed faces to original editFaces */
|
||||
for (i = 0; i < numOfFaces; i++)
|
||||
faceMap[i] = EDBM_face_at_index(em, origFaceIndices[i]);
|
||||
faceMap[i] = EDBM_face_at_index(em, DM_origindex_mface_mpoly(origFaceIndices, origPolyIndices, i));
|
||||
|
||||
edgeMap = MEM_mallocN(numOfEdges * sizeof(BMEdge *), "unwrap_edit_edge_map");
|
||||
|
||||
|
@ -80,7 +80,7 @@ typedef struct CustomData {
|
||||
#define CD_MCOL 6
|
||||
#define CD_ORIGINDEX 7
|
||||
#define CD_NORMAL 8
|
||||
#define CD_POLYINDEX 9
|
||||
//#define CD_POLYINDEX 9
|
||||
#define CD_PROP_FLT 10
|
||||
#define CD_PROP_INT 11
|
||||
#define CD_PROP_STR 12
|
||||
@ -124,7 +124,7 @@ typedef struct CustomData {
|
||||
#define CD_MASK_MCOL (1 << CD_MCOL)
|
||||
#define CD_MASK_ORIGINDEX (1 << CD_ORIGINDEX)
|
||||
#define CD_MASK_NORMAL (1 << CD_NORMAL)
|
||||
#define CD_MASK_POLYINDEX (1 << CD_POLYINDEX)
|
||||
// #define CD_MASK_POLYINDEX (1 << CD_POLYINDEX)
|
||||
#define CD_MASK_PROP_FLT (1 << CD_PROP_FLT)
|
||||
#define CD_MASK_PROP_INT (1 << CD_PROP_INT)
|
||||
#define CD_MASK_PROP_STR (1 << CD_PROP_STR)
|
||||
|
@ -361,9 +361,9 @@ static DerivedMesh *ConvertCSGDescriptorsToDerivedMesh(
|
||||
|
||||
/* create a new DerivedMesh */
|
||||
result = CDDM_new(vertex_it->num_elements, 0, face_it->num_elements, 0, 0);
|
||||
CustomData_merge(&dm1->faceData, &result->faceData, CD_MASK_DERIVEDMESH & ~(CD_MASK_NORMAL | CD_MASK_POLYINDEX | CD_MASK_ORIGINDEX),
|
||||
CustomData_merge(&dm1->faceData, &result->faceData, CD_MASK_DERIVEDMESH & ~(CD_MASK_NORMAL | CD_MASK_ORIGINDEX),
|
||||
CD_DEFAULT, face_it->num_elements);
|
||||
CustomData_merge(&dm2->faceData, &result->faceData, CD_MASK_DERIVEDMESH & ~(CD_MASK_NORMAL | CD_MASK_POLYINDEX | CD_MASK_ORIGINDEX),
|
||||
CustomData_merge(&dm2->faceData, &result->faceData, CD_MASK_DERIVEDMESH & ~(CD_MASK_NORMAL | CD_MASK_ORIGINDEX),
|
||||
CD_DEFAULT, face_it->num_elements);
|
||||
|
||||
/* step through the vertex iterators: */
|
||||
|
@ -33,17 +33,17 @@
|
||||
#include "DNA_modifier_types.h"
|
||||
#include "DNA_scene_types.h"
|
||||
|
||||
#include "BKE_cdderivedmesh.h"
|
||||
#include "BKE_global.h"
|
||||
#include "BKE_modifier.h"
|
||||
#include "BKE_ocean.h"
|
||||
|
||||
#include "BLI_blenlib.h"
|
||||
#include "BLI_math.h"
|
||||
#include "BLI_math_inline.h"
|
||||
#include "BLI_utildefines.h"
|
||||
#include "BLI_string.h"
|
||||
|
||||
#include "BKE_cdderivedmesh.h"
|
||||
#include "BKE_global.h"
|
||||
#include "BKE_modifier.h"
|
||||
#include "BKE_ocean.h"
|
||||
|
||||
#include "MOD_util.h"
|
||||
|
||||
#ifdef WITH_OCEANSIM
|
||||
|
@ -1525,9 +1525,12 @@ static int render_new_particle_system(Render *re, ObjectRen *obr, ParticleSystem
|
||||
int i, a, k, max_k=0, totpart, do_simplify = FALSE, do_surfacecache = FALSE, use_duplimat = FALSE;
|
||||
int totchild=0;
|
||||
int seed, path_nbr=0, orco1=0, num;
|
||||
int totface, *origindex = 0;
|
||||
int totface;
|
||||
char **uv_name=0;
|
||||
|
||||
const int *index_mf_to_mpoly = NULL;
|
||||
const int *index_mp_to_orig = NULL;
|
||||
|
||||
/* 1. check that everything is ok & updated */
|
||||
if (psys==NULL)
|
||||
return 0;
|
||||
@ -1697,9 +1700,13 @@ static int render_new_particle_system(Render *re, ObjectRen *obr, ParticleSystem
|
||||
do_surfacecache = TRUE;
|
||||
|
||||
totface= psmd->dm->getNumTessFaces(psmd->dm);
|
||||
origindex= psmd->dm->getTessFaceDataArray(psmd->dm, CD_ORIGINDEX);
|
||||
index_mf_to_mpoly = psmd->dm->getTessFaceDataArray(psmd->dm, CD_ORIGINDEX);
|
||||
index_mp_to_orig = psmd->dm->getPolyDataArray(psmd->dm, CD_ORIGINDEX);
|
||||
if ((index_mf_to_mpoly && index_mp_to_orig) == FALSE) {
|
||||
index_mf_to_mpoly = index_mp_to_orig = NULL;
|
||||
}
|
||||
for (a=0; a<totface; a++)
|
||||
strandbuf->totbound= MAX2(strandbuf->totbound, (origindex)? origindex[a]: a);
|
||||
strandbuf->totbound = max_ii(strandbuf->totbound, (index_mf_to_mpoly) ? DM_origindex_mface_mpoly(index_mf_to_mpoly, index_mp_to_orig, a): a);
|
||||
|
||||
strandbuf->totbound++;
|
||||
strandbuf->bound= MEM_callocN(sizeof(StrandBound)*strandbuf->totbound, "StrandBound");
|
||||
@ -1810,7 +1817,7 @@ static int render_new_particle_system(Render *re, ObjectRen *obr, ParticleSystem
|
||||
do_simplify = psys_render_simplify_params(psys, cpa, simplify);
|
||||
|
||||
if (strandbuf) {
|
||||
int orignum= (origindex)? origindex[cpa->num]: cpa->num;
|
||||
int orignum = (index_mf_to_mpoly) ? DM_origindex_mface_mpoly(index_mf_to_mpoly, index_mp_to_orig, cpa->num) : cpa->num;
|
||||
|
||||
if (orignum > sbound - strandbuf->bound) {
|
||||
sbound= strandbuf->bound + orignum;
|
||||
|
@ -47,6 +47,10 @@
|
||||
#include "DNA_userdef_types.h"
|
||||
#include "DNA_windowmanager_types.h"
|
||||
|
||||
#include "BLI_listbase.h"
|
||||
#include "BLI_string.h"
|
||||
#include "BLI_utildefines.h"
|
||||
|
||||
#include "BKE_blender.h"
|
||||
#include "BKE_context.h"
|
||||
#include "BKE_screen.h"
|
||||
@ -66,10 +70,6 @@
|
||||
#include "BKE_material.h" /* clear_matcopybuf */
|
||||
#include "BKE_tracking.h" /* free tracking clipboard */
|
||||
|
||||
#include "BLI_listbase.h"
|
||||
#include "BLI_string.h"
|
||||
#include "BLI_utildefines.h"
|
||||
|
||||
#include "RE_engine.h"
|
||||
#include "RE_pipeline.h" /* RE_ free stuff */
|
||||
|
||||
|
@ -6,6 +6,8 @@
|
||||
#include "DNA_material_types.h"
|
||||
#include "DNA_scene_types.h"
|
||||
|
||||
#include "BLI_utildefines.h"
|
||||
|
||||
#include "BKE_global.h"
|
||||
#include "BKE_main.h"
|
||||
#include "BKE_DerivedMesh.h"
|
||||
|
@ -54,6 +54,7 @@
|
||||
#include "KX_MotionState.h" // bridge between motionstate and scenegraph node
|
||||
|
||||
extern "C"{
|
||||
#include "BLI_utildefines.h"
|
||||
#include "BKE_DerivedMesh.h"
|
||||
}
|
||||
|
||||
|
@ -46,9 +46,11 @@ subject to the following restrictions:
|
||||
#include "DNA_meshdata_types.h"
|
||||
|
||||
extern "C"{
|
||||
#include "BKE_cdderivedmesh.h"
|
||||
#include "BLI_utildefines.h"
|
||||
#include "BKE_cdderivedmesh.h"
|
||||
}
|
||||
|
||||
|
||||
class BP_Proxy;
|
||||
|
||||
///todo: fill all the empty CcdPhysicsController methods, hook them up to the btRigidBody class
|
||||
@ -1500,9 +1502,15 @@ bool CcdShapeConstructionInfo::SetMesh(RAS_MeshObject* meshobj, DerivedMesh* dm,
|
||||
MFace *mface = dm->getTessFaceArray(dm);
|
||||
numpolys = dm->getNumTessFaces(dm);
|
||||
numverts = dm->getNumVerts(dm);
|
||||
int* index = (int*)dm->getTessFaceDataArray(dm, CD_ORIGINDEX);
|
||||
MTFace *tface = (MTFace *)dm->getTessFaceDataArray(dm, CD_MTFACE);
|
||||
|
||||
/* double lookup */
|
||||
const int *index_mf_to_mpoly = (const int *)dm->getTessFaceDataArray(dm, CD_ORIGINDEX);
|
||||
const int *index_mp_to_orig = (const int *)dm->getPolyDataArray(dm, CD_ORIGINDEX);
|
||||
if ((index_mf_to_mpoly && index_mp_to_orig) == false) {
|
||||
index_mf_to_mpoly = index_mp_to_orig = NULL;
|
||||
}
|
||||
|
||||
m_shapeType = (polytope) ? PHY_SHAPE_POLYTOPE : PHY_SHAPE_MESH;
|
||||
|
||||
/* Convert blender geometry into bullet mesh, need these vars for mapping */
|
||||
@ -1515,7 +1523,8 @@ bool CcdShapeConstructionInfo::SetMesh(RAS_MeshObject* meshobj, DerivedMesh* dm,
|
||||
for (int p2=0; p2<numpolys; p2++)
|
||||
{
|
||||
MFace* mf = &mface[p2];
|
||||
RAS_Polygon* poly = meshobj->GetPolygon((index)? index[p2]: p2);
|
||||
const int origi = index_mf_to_mpoly ? DM_origindex_mface_mpoly(index_mf_to_mpoly, index_mp_to_orig, p2) : p2;
|
||||
RAS_Polygon* poly = meshobj->GetPolygon(origi);
|
||||
|
||||
// only add polygons that have the collision flag set
|
||||
if (poly->IsCollider())
|
||||
@ -1534,7 +1543,8 @@ bool CcdShapeConstructionInfo::SetMesh(RAS_MeshObject* meshobj, DerivedMesh* dm,
|
||||
for (int p2=0; p2<numpolys; p2++)
|
||||
{
|
||||
MFace* mf = &mface[p2];
|
||||
RAS_Polygon* poly= meshobj->GetPolygon((index)? index[p2]: p2);
|
||||
const int origi = index_mf_to_mpoly ? DM_origindex_mface_mpoly(index_mf_to_mpoly, index_mp_to_orig, p2) : p2;
|
||||
RAS_Polygon* poly= meshobj->GetPolygon(origi);
|
||||
|
||||
// only add polygons that have the collisionflag set
|
||||
if (poly->IsCollider())
|
||||
@ -1582,7 +1592,8 @@ bool CcdShapeConstructionInfo::SetMesh(RAS_MeshObject* meshobj, DerivedMesh* dm,
|
||||
for (int p2=0; p2<numpolys; p2++)
|
||||
{
|
||||
MFace* mf = &mface[p2];
|
||||
RAS_Polygon* poly= meshobj->GetPolygon((index)? index[p2]: p2);
|
||||
const int origi = index_mf_to_mpoly ? DM_origindex_mface_mpoly(index_mf_to_mpoly, index_mp_to_orig, p2) : p2;
|
||||
RAS_Polygon* poly= meshobj->GetPolygon(origi);
|
||||
|
||||
// only add polygons that have the collision flag set
|
||||
if (poly->IsCollider())
|
||||
@ -1619,7 +1630,8 @@ bool CcdShapeConstructionInfo::SetMesh(RAS_MeshObject* meshobj, DerivedMesh* dm,
|
||||
{
|
||||
MFace* mf = &mface[p2];
|
||||
MTFace* tf = (tface) ? &tface[p2] : NULL;
|
||||
RAS_Polygon* poly= meshobj->GetPolygon((index)? index[p2]: p2);
|
||||
const int origi = index_mf_to_mpoly ? DM_origindex_mface_mpoly(index_mf_to_mpoly, index_mp_to_orig, p2) : p2;
|
||||
RAS_Polygon* poly= meshobj->GetPolygon(origi);
|
||||
|
||||
// only add polygons that have the collisionflag set
|
||||
if (poly->IsCollider())
|
||||
@ -1645,7 +1657,7 @@ bool CcdShapeConstructionInfo::SetMesh(RAS_MeshObject* meshobj, DerivedMesh* dm,
|
||||
}
|
||||
|
||||
// m_polygonIndexArray
|
||||
*poly_index_pt= (index)? index[p2]: p2;
|
||||
*poly_index_pt = origi;
|
||||
poly_index_pt++;
|
||||
|
||||
// the vertex location
|
||||
@ -1688,7 +1700,7 @@ bool CcdShapeConstructionInfo::SetMesh(RAS_MeshObject* meshobj, DerivedMesh* dm,
|
||||
}
|
||||
|
||||
// m_polygonIndexArray
|
||||
*poly_index_pt= (index)? index[p2]: p2;
|
||||
*poly_index_pt = origi;
|
||||
poly_index_pt++;
|
||||
|
||||
// the vertex location
|
||||
@ -1800,7 +1812,13 @@ bool CcdShapeConstructionInfo::UpdateMesh(class KX_GameObject* gameobj, class RA
|
||||
MFace *mface = dm->getTessFaceArray(dm);
|
||||
numpolys = dm->getNumTessFaces(dm);
|
||||
numverts = dm->getNumVerts(dm);
|
||||
int* index = (int*)dm->getTessFaceDataArray(dm, CD_ORIGINDEX);
|
||||
|
||||
/* double lookup */
|
||||
const int *index_mf_to_mpoly = (const int *)dm->getTessFaceDataArray(dm, CD_ORIGINDEX);
|
||||
const int *index_mp_to_orig = (const int *)dm->getPolyDataArray(dm, CD_ORIGINDEX);
|
||||
if ((index_mf_to_mpoly && index_mp_to_orig) == false) {
|
||||
index_mf_to_mpoly = index_mp_to_orig = NULL;
|
||||
}
|
||||
|
||||
MFace *mf;
|
||||
MVert *mv;
|
||||
@ -1856,7 +1874,7 @@ bool CcdShapeConstructionInfo::UpdateMesh(class KX_GameObject* gameobj, class RA
|
||||
{
|
||||
if (tf->mode & TF_DYNAMIC)
|
||||
{
|
||||
int origi = (index)? index[i]: i;
|
||||
int origi = index_mf_to_mpoly ? DM_origindex_mface_mpoly(index_mf_to_mpoly, index_mp_to_orig, i) : i;
|
||||
|
||||
if (mf->v4) {
|
||||
fv_pt= quad_verts;
|
||||
@ -1915,7 +1933,7 @@ bool CcdShapeConstructionInfo::UpdateMesh(class KX_GameObject* gameobj, class RA
|
||||
}
|
||||
|
||||
for (mf= mface, i=0; i < numpolys; mf++, i++) {
|
||||
int origi = (index)? index[i]: i;
|
||||
int origi = index_mf_to_mpoly ? DM_origindex_mface_mpoly(index_mf_to_mpoly, index_mp_to_orig, i) : i;
|
||||
|
||||
if (mf->v4) {
|
||||
fv_pt= quad_verts;
|
||||
|
@ -52,7 +52,10 @@
|
||||
#include "DNA_material_types.h"
|
||||
#include "DNA_scene_types.h"
|
||||
|
||||
#include "BKE_DerivedMesh.h"
|
||||
extern "C"{
|
||||
#include "BLI_utildefines.h"
|
||||
#include "BKE_DerivedMesh.h"
|
||||
}
|
||||
|
||||
#ifndef M_PI
|
||||
#define M_PI 3.14159265358979323846
|
||||
|
Loading…
Reference in New Issue
Block a user