Changeset View
Changeset View
Standalone View
Standalone View
source/blender/blenkernel/intern/DerivedMesh.cc
| Show First 20 Lines • Show All 92 Lines • ▼ Show 20 Lines | |||||
| &dm->edgeData, CD_MEDGE, CD_SET_DEFAULT, nullptr, dm->getNumEdges(dm)); | &dm->edgeData, CD_MEDGE, CD_SET_DEFAULT, nullptr, dm->getNumEdges(dm)); | ||||
| CustomData_set_layer_flag(&dm->edgeData, CD_MEDGE, CD_FLAG_TEMPORARY); | CustomData_set_layer_flag(&dm->edgeData, CD_MEDGE, CD_FLAG_TEMPORARY); | ||||
| dm->copyEdgeArray(dm, medge); | dm->copyEdgeArray(dm, medge); | ||||
| } | } | ||||
| return medge; | return medge; | ||||
| } | } | ||||
| static MLoop *dm_getLoopArray(DerivedMesh *dm) | static int *dm_getCornerVertArray(DerivedMesh *dm) | ||||
| { | { | ||||
| MLoop *mloop = (MLoop *)CustomData_get_layer_for_write( | int *corner_verts = (int *)CustomData_get_layer_named_for_write( | ||||
| &dm->loopData, CD_MLOOP, dm->getNumLoops(dm)); | &dm->loopData, CD_PROP_INT32, ".corner_vert", dm->getNumLoops(dm)); | ||||
| if (!mloop) { | if (!corner_verts) { | ||||
| mloop = (MLoop *)CustomData_add_layer( | corner_verts = (int *)CustomData_add_layer_named(&dm->loopData, | ||||
| &dm->loopData, CD_MLOOP, CD_SET_DEFAULT, nullptr, dm->getNumLoops(dm)); | CD_PROP_INT32, | ||||
| CustomData_set_layer_flag(&dm->loopData, CD_MLOOP, CD_FLAG_TEMPORARY); | CD_SET_DEFAULT, | ||||
| dm->copyLoopArray(dm, mloop); | nullptr, | ||||
| dm->getNumLoops(dm), | |||||
| ".corner_vert"); | |||||
| dm->copyCornerVertArray(dm, corner_verts); | |||||
| } | } | ||||
| return mloop; | return corner_verts; | ||||
| } | |||||
| static int *dm_getCornerEdgeArray(DerivedMesh *dm) | |||||
| { | |||||
| int *corner_edges = (int *)CustomData_get_layer_named( | |||||
| &dm->loopData, CD_PROP_INT32, ".corner_edge"); | |||||
| if (!corner_edges) { | |||||
| corner_edges = (int *)CustomData_add_layer_named(&dm->loopData, | |||||
| CD_PROP_INT32, | |||||
| CD_SET_DEFAULT, | |||||
| nullptr, | |||||
| dm->getNumLoops(dm), | |||||
| ".corner_edge"); | |||||
| dm->copyCornerEdgeArray(dm, corner_edges); | |||||
| } | |||||
| return corner_edges; | |||||
| } | } | ||||
| static MPoly *dm_getPolyArray(DerivedMesh *dm) | static MPoly *dm_getPolyArray(DerivedMesh *dm) | ||||
| { | { | ||||
| MPoly *mpoly = (MPoly *)CustomData_get_layer_for_write( | MPoly *mpoly = (MPoly *)CustomData_get_layer_for_write( | ||||
| &dm->polyData, CD_MPOLY, dm->getNumPolys(dm)); | &dm->polyData, CD_MPOLY, dm->getNumPolys(dm)); | ||||
| if (!mpoly) { | if (!mpoly) { | ||||
| Show All 37 Lines | |||||
| return looptri; | return looptri; | ||||
| } | } | ||||
| void DM_init_funcs(DerivedMesh *dm) | void DM_init_funcs(DerivedMesh *dm) | ||||
| { | { | ||||
| /* default function implementations */ | /* default function implementations */ | ||||
| dm->getVertArray = dm_getVertArray; | dm->getVertArray = dm_getVertArray; | ||||
| dm->getEdgeArray = dm_getEdgeArray; | dm->getEdgeArray = dm_getEdgeArray; | ||||
| dm->getLoopArray = dm_getLoopArray; | dm->getCornerVertArray = dm_getCornerVertArray; | ||||
| dm->getCornerEdgeArray = dm_getCornerEdgeArray; | |||||
| dm->getPolyArray = dm_getPolyArray; | dm->getPolyArray = dm_getPolyArray; | ||||
| dm->getLoopTriArray = dm_getLoopTriArray; | dm->getLoopTriArray = dm_getLoopTriArray; | ||||
| /* Sub-types handle getting actual data. */ | /* Sub-types handle getting actual data. */ | ||||
| dm->getNumLoopTri = dm_getNumLoopTri; | dm->getNumLoopTri = dm_getNumLoopTri; | ||||
| dm->getVertDataArray = DM_get_vert_data_layer; | dm->getVertDataArray = DM_get_vert_data_layer; | ||||
| ▲ Show 20 Lines • Show All 184 Lines • ▼ Show 20 Lines | |||||
| const float default_osf[4][2] = {{0, 0}, {1, 0}, {1, 1}, {0, 1}}; | const float default_osf[4][2] = {{0, 0}, {1, 0}, {1, 1}, {0, 1}}; | ||||
| OrigSpaceLoop *lof_array = (OrigSpaceLoop *)CustomData_get_layer_for_write( | OrigSpaceLoop *lof_array = (OrigSpaceLoop *)CustomData_get_layer_for_write( | ||||
| &mesh->ldata, CD_ORIGSPACE_MLOOP, mesh->totloop); | &mesh->ldata, CD_ORIGSPACE_MLOOP, mesh->totloop); | ||||
| const int numpoly = mesh->totpoly; | const int numpoly = mesh->totpoly; | ||||
| // const int numloop = mesh->totloop; | // const int numloop = mesh->totloop; | ||||
| const Span<float3> positions = mesh->vert_positions(); | const Span<float3> positions = mesh->vert_positions(); | ||||
| const Span<MPoly> polys = mesh->polys(); | const Span<MPoly> polys = mesh->polys(); | ||||
| const Span<MLoop> loops = mesh->loops(); | const Span<int> corner_verts = mesh->corner_verts(); | ||||
| const MPoly *mp = polys.data(); | const MPoly *mp = polys.data(); | ||||
| int i, j, k; | int i, j, k; | ||||
| blender::Vector<blender::float2, 64> vcos_2d; | blender::Vector<blender::float2, 64> vcos_2d; | ||||
| for (i = 0; i < numpoly; i++, mp++) { | for (i = 0; i < numpoly; i++, mp++) { | ||||
| OrigSpaceLoop *lof = lof_array + mp->loopstart; | OrigSpaceLoop *lof = lof_array + mp->loopstart; | ||||
| if (ELEM(mp->totloop, 3, 4)) { | if (ELEM(mp->totloop, 3, 4)) { | ||||
| for (j = 0; j < mp->totloop; j++, lof++) { | for (j = 0; j < mp->totloop; j++, lof++) { | ||||
| copy_v2_v2(lof->uv, default_osf[j]); | copy_v2_v2(lof->uv, default_osf[j]); | ||||
| } | } | ||||
| } | } | ||||
| else { | else { | ||||
| const MLoop *l = &loops[mp->loopstart]; | |||||
| float p_nor[3], co[3]; | float p_nor[3], co[3]; | ||||
| float mat[3][3]; | float mat[3][3]; | ||||
| float min[2] = {FLT_MAX, FLT_MAX}, max[2] = {-FLT_MAX, -FLT_MAX}; | float min[2] = {FLT_MAX, FLT_MAX}, max[2] = {-FLT_MAX, -FLT_MAX}; | ||||
| float translate[2], scale[2]; | float translate[2], scale[2]; | ||||
| BKE_mesh_calc_poly_normal( | BKE_mesh_calc_poly_normal(mp, | ||||
| mp, l, reinterpret_cast<const float(*)[3]>(positions.data()), p_nor); | &corner_verts[mp->loopstart], | ||||
| reinterpret_cast<const float(*)[3]>(positions.data()), | |||||
| p_nor); | |||||
| axis_dominant_v3_to_m3(mat, p_nor); | axis_dominant_v3_to_m3(mat, p_nor); | ||||
| vcos_2d.resize(mp->totloop); | vcos_2d.resize(mp->totloop); | ||||
| for (j = 0; j < mp->totloop; j++, l++) { | for (j = 0; j < mp->totloop; j++) { | ||||
| mul_v3_m3v3(co, mat, positions[l->v]); | mul_v3_m3v3(co, mat, positions[corner_verts[mp->loopstart + j]]); | ||||
| copy_v2_v2(vcos_2d[j], co); | copy_v2_v2(vcos_2d[j], co); | ||||
| for (k = 0; k < 2; k++) { | for (k = 0; k < 2; k++) { | ||||
| if (co[k] > max[k]) { | if (co[k] > max[k]) { | ||||
| max[k] = co[k]; | max[k] = co[k]; | ||||
| } | } | ||||
| else if (co[k] < min[k]) { | else if (co[k] < min[k]) { | ||||
| min[k] = co[k]; | min[k] = co[k]; | ||||
| Show All 28 Lines | |||||