45 int drawInteriorEdges,
59 memcpy(p2,
ptr, oldSize);
93 subdivLevels = std::max(subdivLevels, 1);
100 if ((oldUseAging != useAging) ||
120 normalOffset +=
sizeof(float) * numLayers;
138 ccgSS =
ccgSubSurf_new(&ifc, subdivLevels, &allocatorIFC, allocator);
149 normalOffset +=
sizeof(float);
175 if (
x == edgeSize - 1) {
179 return edgeBase +
x - 1;
188 if (
x == gridSize - 1 &&
y == gridSize - 1) {
192 if (
x == gridSize - 1) {
197 return edgeBase + (gridSize - 1 -
y) - 1;
200 return edgeBase + (edgeSize - 2 - 1) - ((gridSize - 1 -
y) - 1);
202 if (
y == gridSize - 1) {
207 return edgeBase + (gridSize - 1 -
x) - 1;
210 return edgeBase + (edgeSize - 2 - 1) - ((gridSize - 1 -
x) - 1);
212 if (
x == 0 &&
y == 0) {
216 S = (S + numVerts - 1) % numVerts;
217 return faceBase + 1 + (gridSize - 2) * S + (
y - 1);
220 return faceBase + 1 + (gridSize - 2) * S + (
x - 1);
223 return faceBase + 1 + (gridSize - 2) * numVerts + S * (gridSize - 2) * (gridSize - 2) +
224 (
y - 1) * (gridSize - 2) + (
x - 1);
229 const int *face_verts,
234 int j, nverts =
faces[fi].size();
236 for (j = 0; j < nverts; j++) {
241 if (
v->face_index == fi) {
253 const float (*mloopuv)[2])
264 float uv[3] = {0.0f, 0.0f, 0.0f};
272 faces,
nullptr,
nullptr, corner_verts, mloopuv, totvert, limit,
false,
true);
280 for (
i = 0;
i < totvert;
i++) {
291 seam = (
v !=
nullptr);
296 int loopid =
faces[
v->face_index].start() +
v->loop_of_face_index;
310 for (
i = 0;
i < totface;
i++) {
312 int nverts = face.
size();
321 for (j = 0, j_next = nverts - 1; j < nverts; j_next = j++) {
325 if (eset.
add({v0, v1})) {
336 for (
i = 0;
i < totface;
i++) {
338 int nverts = face.
size();
356 int index, gridSize, gridFaces, totface,
x,
y, S;
357 const float(*dmloopuv)[2] =
static_cast<const float(*)[2]
>(
366 if (!dmloopuv || (!tface && !mloopuv)) {
382 gridFaces = gridSize - 1;
395 float(*mluv)[2] = mloopuv;
397 for (index = 0; index < totface; index++) {
401 for (S = 0; S < numVerts; S++) {
402 float(*faceGridData)[2] =
static_cast<float(*)[2]
>(
405 for (
y = 0;
y < gridFaces;
y++) {
406 for (
x = 0;
x < gridFaces;
x++) {
407 float *a = faceGridData[(
y + 0) * gridSize +
x + 0];
408 float *
b = faceGridData[(
y + 0) * gridSize +
x + 1];
409 float *c = faceGridData[(
y + 1) * gridSize +
x + 1];
410 float *d = faceGridData[(
y + 1) * gridSize +
x + 0];
442#define SUB_ELEMS_FACE 50
459 float *
w, w1, w2, w4, fac, fac2, fx, fy;
461 if (wtable->
len <= faceLen) {
463 "weight table alloc 2");
471 wtable->
len = faceLen + 1;
477 size_t(faceLen) *
size_t(faceLen) *
size_t(gridCuts + 2) *
size_t(gridCuts + 2),
478 "weight table alloc");
479 fac = 1.0f / float(faceLen);
481 for (
i = 0;
i < faceLen;
i++) {
482 for (
x = 0;
x < gridCuts + 2;
x++) {
483 for (
y = 0;
y < gridCuts + 2;
y++) {
484 fx = 0.5f - float(
x) / float(gridCuts + 1) / 2.0f;
485 fy = 0.5f - float(
y) / float(gridCuts + 1) / 2.0f;
488 w1 = (1.0f - fx) * (1.0f - fy) + (-fac2 * fx * fy * fac);
489 w2 = (1.0f - fx + fac2 * fx * -fac) * (fy);
490 w4 = (fx) * (1.0f - fy + -fac2 * fy * fac);
494 fac2 = 1.0f - (w1 + w2 + w4);
495 fac2 = fac2 / float(faceLen - 3);
496 for (j = 0; j < faceLen; j++) {
502 w[(
i - 1 + faceLen) % faceLen] = w2;
503 w[(
i + 1) % faceLen] = w4;
518 for (
i = 0;
i < wtable->
len;
i++) {
531 float (*vertexCos)[3],
536 float(*positions)[3] = (float(*)[3])dm->
getVertArray(dm);
548 for (
i = 0;
i < totvert;
i++) {
564 for (
i = 0;
i < totedge;
i++) {
568 crease = useFlatSubdiv ? creaseFactor : (creases ? creases[
i] * creaseFactor : 0.0f);
588 for (j = 0; j < face.
size(); j++) {
599 static int hasGivenError = 0;
601 if (!hasGivenError) {
619 float (*vertexCos)[3],
685 int totvert, totedge, totface;
693 for (index = 0; index < totface; index++) {
700 for (S = 0; S < numVerts; S++) {
701 for (
x = 1;
x < gridSize - 1;
x++) {
707 for (S = 0; S < numVerts; S++) {
708 for (
y = 1;
y < gridSize - 1;
y++) {
709 for (
x = 1;
x < gridSize - 1;
x++) {
718 for (index = 0; index < totedge; index++) {
722 for (
x = 1;
x < edgeSize - 1;
x++) {
732 for (index = 0; index < totvert; index++) {
752 int totedge, totface;
758 for (index = 0; index < totface; index++) {
762 for (S = 0; S < numVerts; S++) {
763 for (
x = 0;
x < gridSize - 1;
x++) {
769 for (
x = 1;
x < gridSize - 1;
x++) {
770 for (
y = 0;
y < gridSize - 1;
y++) {
783 for (index = 0; index < totedge; index++) {
785 for (
int x = 0;
x < edgeSize - 1;
x++) {
808 const int grid_size =
data->grid_size;
809 const int edge_size =
data->edge_size;
812 const int grid_index =
data->grid_offset[iter];
813 int *corner_verts =
data->corner_verts;
814 int *corner_edges =
data->corner_edges;
816 size_t loop_i = 4 * size_t(grid_index) * (grid_size - 1) * (grid_size - 1);
817 for (
int S = 0; S < num_verts; S++) {
818 for (
int y = 0;
y < grid_size - 1;
y++) {
819 for (
int x = 0;
x < grid_size - 1;
x++) {
821 const int v1 =
getFaceIndex(ss, f, S,
x + 0,
y + 0, edge_size, grid_size);
823 const int v3 =
getFaceIndex(ss, f, S,
x + 1,
y + 1, edge_size, grid_size);
824 const int v4 =
getFaceIndex(ss, f, S,
x + 1,
y + 0, edge_size, grid_size);
827 corner_verts[loop_i + 0] = v1;
828 corner_verts[loop_i + 1] =
v2;
829 corner_verts[loop_i + 2] = v3;
830 corner_verts[loop_i + 3] = v4;
852 data.corner_verts = r_corner_verts;
853 data.corner_edges =
nullptr;
881 ehash->add({medge[
i][0], medge[
i][1]});
891 data.corner_verts =
nullptr;
892 data.corner_edges = r_corner_edges;
916 for (index = 0; index < totface; index++) {
920 for (S = 0; S < numVerts; S++) {
921 for (
y = 0;
y < gridSize - 1;
y++) {
922 for (
x = 0;
x < gridSize - 1;
x++) {
923 r_face_offsets[
i] = k;
930 r_face_offsets[
i] = k;
952 for (
uint i = 0;
i < numGrids;
i++) {
979 int a, index, totnone, totorig;
991 origindex =
static_cast<int *
>(
998 for (a = 0; a < totnone; a++) {
1002 for (index = 0; index < totorig; index++, a++) {
1021 int a,
i, index, totnone, totorig, totedge;
1030 origindex =
static_cast<int *
>(
1034 totorig = totedge * (edgeSize - 1);
1038 for (a = 0; a < totnone; a++) {
1042 for (index = 0; index < totedge; index++) {
1046 for (
i = 0;
i < edgeSize - 1;
i++, a++) {
1047 origindex[a] = mapIndex;
1064 int a,
i, index, totface;
1073 origindex =
static_cast<int *
>(
1078 for (a = 0, index = 0; index < totface; index++) {
1083 for (
i = 0;
i < gridFaces * gridFaces * numVerts;
i++, a++) {
1084 origindex[a] = mapIndex;
1097 int index, numFaces, numGrids;
1102 for (index = 0; index < numFaces; index++) {
1123 int index, numFaces, numGrids, S, gIndex ;
1136 for (gIndex = 0, index = 0; index < numFaces; index++) {
1140 gridOffset[index] = gIndex;
1150 for (gIndex = 0, index = 0; index < numFaces; index++) {
1154 for (S = 0; S < numVerts; S++, gIndex++) {
1156 gridFaces[gIndex] = f;
1218 int totvert, totedge, totface;
1222 size_t(totvert),
"vertMap");
1233 size_t(totedge),
"edgeMap");
1244 size_t(totface),
"faceMap");
1267 int vertNum = 0, edgeNum = 0, faceNum = 0;
1268 int *polyidx =
nullptr;
1271 int loopindex, loopindex2;
1274 int gridFaces, gridCuts;
1276 int gridInternalEdges;
1282 gridFaces = gridSize - 1;
1283 gridCuts = gridSize - 2;
1285 gridSideEdges = gridSize - 1;
1286 gridInternalEdges = (gridSideEdges - 1) * gridSideEdges * 2;
1288 const int *base_polyOrigIndex =
static_cast<const int *
>(
1297 loopindex = loopindex2 = 0;
1298 for (index = 0; index < totface; index++) {
1301 int numFinalEdges = numVerts * (gridSideEdges + gridInternalEdges);
1303 int g2_wid = gridCuts + 2;
1317 for (s = 0; s < numVerts; s++) {
1318 loopidx[s] = loopindex++;
1322 for (s = 0; s < numVerts; s++) {
1330 if (vertOrigIndex) {
1338 for (s = 0; s < numVerts; s++) {
1339 for (
x = 1;
x < gridFaces;
x++) {
1340 w2 =
w + s * numVerts * g2_wid * g2_wid +
x * numVerts;
1343 if (vertOrigIndex) {
1353 for (s = 0; s < numVerts; s++) {
1354 for (
y = 1;
y < gridFaces;
y++) {
1355 for (
x = 1;
x < gridFaces;
x++) {
1356 w2 =
w + s * numVerts * g2_wid * g2_wid + (
y * g2_wid +
x) * numVerts;
1359 if (vertOrigIndex) {
1369 if (edgeOrigIndex) {
1370 for (
i = 0;
i < numFinalEdges;
i++) {
1375 for (s = 0; s < numVerts; s++) {
1377 for (
y = 0;
y < gridFaces;
y++) {
1378 for (
x = 0;
x < gridFaces;
x++) {
1379 w2 =
w + s * numVerts * g2_wid * g2_wid + (
y * g2_wid +
x) * numVerts;
1389 w2 =
w + s * numVerts * g2_wid * g2_wid + ((
y + 1) * g2_wid + (
x)) * numVerts;
1399 w2 =
w + s * numVerts * g2_wid * g2_wid + ((
y + 1) * g2_wid + (
x + 1)) * numVerts;
1409 w2 =
w + s * numVerts * g2_wid * g2_wid + ((
y)*g2_wid + (
x + 1)) * numVerts;
1421 if (polyOrigIndex) {
1422 *polyOrigIndex = base_polyOrigIndex ? base_polyOrigIndex[origIndex] : origIndex;
1428 polyidx[faceNum] = faceNum;
1436 edgeNum += numFinalEdges;
1439 for (index = 0; index < totedge; index++) {
1441 int numFinalEdges = edgeSize - 1;
1459 for (
x = 1;
x < edgeSize - 1;
x++) {
1461 w[1] = float(
x) / (edgeSize - 1);
1464 if (vertOrigIndex) {
1473 for (
i = 0;
i < numFinalEdges;
i++) {
1478 if (edgeOrigIndex) {
1479 for (
i = 0;
i < numFinalEdges;
i++) {
1480 edgeOrigIndex[edgeNum +
i] = mapIndex;
1484 edgeNum += numFinalEdges;
1493 for (
i = 0;
i < numlayer &&
i < dmnumlayer;
i++) {
1498 for (index = 0; index < totvert; index++) {
1512 if (vertOrigIndex) {
1513 *vertOrigIndex = mapIndex;
1528 int drawInteriorEdges,
1574 float (*vertCos)[3],
1589 int levels = (scene !=
nullptr && !ignore_simplify) ?
1612 int levels = (scene !=
nullptr && !ignore_simplify) ?
1630 int levels = (scene !=
nullptr && !ignore_simplify) ?
1660 static_cast<CCGSubSurf *
>(smd->
mCache), drawInteriorEdges, useSubsurfUv, dm);
1704 float edge_sum[3], face_sum[3];
1722 for (
i = 0;
i <
N;
i++) {
1727 for (
i = 0;
i < numFaces;
i++) {
1734 if (numFaces && numFaces !=
N) {
1735 mul_v3_fl(face_sum,
float(
N) /
float(numFaces));
1739 r_positions[idx][0] = (co[0] *
N *
N + edge_sum[0] * 4 + face_sum[0]) / (
N * (
N + 5));
1740 r_positions[idx][1] = (co[1] *
N *
N + edge_sum[1] * 4 + face_sum[1]) / (
N * (
N + 5));
1741 r_positions[idx][2] = (co[2] *
N *
N + edge_sum[2] * 4 + face_sum[2]) / (
N * (
N + 5));
void CCG_key_top_level(CCGKey *key, const CCGSubSurf *ss)
blender::float3 & CCG_elem_co(const CCGKey &, CCGElem *elem)
CustomData interface, see also DNA_customdata_types.h.
const void * CustomData_get_layer_n(const CustomData *data, eCustomDataType type, int n)
const void * CustomData_get_layer(const CustomData *data, eCustomDataType type)
void CustomData_interp(const CustomData *source, CustomData *dest, const int *src_indices, const float *weights, const float *sub_weights, int count, int dest_index)
const void * CustomData_get_layer_named(const CustomData *data, eCustomDataType type, blender::StringRef name)
void CustomData_copy_data(const CustomData *source, CustomData *dest, int source_index, int dest_index, int count)
void * CustomData_add_layer(CustomData *data, eCustomDataType type, eCDAllocType alloctype, int totelem)
int CustomData_number_of_layers(const CustomData *data, eCustomDataType type)
bool CustomData_free_layer_named(CustomData *data, blender::StringRef name)
void * CustomData_get_layer_n_for_write(CustomData *data, eCustomDataType type, int n, int totelem)
void * DM_get_edge_data_layer(DerivedMesh *dm, eCustomDataType type)
void DM_release(DerivedMesh *dm)
void DM_interp_vert_data(const DerivedMesh *source, DerivedMesh *dest, int *src_indices, float *weights, int count, int dest_index)
void DM_from_template(DerivedMesh *dm, DerivedMesh *source, DerivedMeshType type, int numVerts, int numEdges, int numTessFaces, int numLoops, int numPolys)
void DM_copy_vert_data(const DerivedMesh *source, DerivedMesh *dest, int source_index, int dest_index, int count)
void * DM_get_vert_data_layer(DerivedMesh *dm, eCustomDataType type)
DerivedMesh * CDDM_from_mesh(Mesh *mesh)
void * DM_get_poly_data_layer(DerivedMesh *dm, eCustomDataType type)
UvVertMap * BKE_mesh_uv_vert_map_create(blender::OffsetIndices< int > faces, const bool *hide_poly, const bool *select_poly, const int *corner_verts, const float(*mloopuv)[2], unsigned int totvert, const float limit[2], bool selected, bool use_winding)
void BKE_mesh_uv_vert_map_free(UvVertMap *vmap)
UvMapVert * BKE_mesh_uv_vert_map_get_vert(UvVertMap *vmap, unsigned int v)
#define STD_UV_CONNECT_LIMIT
int get_render_subsurf_level(const RenderData *r, int lvl, bool for_render)
@ SUBSURF_ALLOC_PAINT_MASK
@ SUBSURF_USE_RENDER_PARAMS
@ SUBSURF_IGNORE_SIMPLIFY
MINLINE void copy_v2_v2(float r[2], const float a[2])
MINLINE void mul_v3_fl(float r[3], float f)
MINLINE void copy_v3_v3(float r[3], const float a[3])
MINLINE void add_v3_v3v3(float r[3], const float a[3], const float b[3])
MINLINE void zero_v3(float r[3])
MINLINE void add_v3_v3(float r[3], const float a[3])
MemArena * BLI_memarena_new(size_t bufsize, const char *name) ATTR_WARN_UNUSED_RESULT ATTR_RETURNS_NONNULL ATTR_NONNULL(2) ATTR_MALLOC
void BLI_memarena_free(MemArena *ma) ATTR_NONNULL(1)
void * BLI_memarena_alloc(MemArena *ma, size_t size) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1) ATTR_MALLOC ATTR_ALLOC_SIZE(2)
void BLI_task_parallel_range(int start, int stop, void *userdata, TaskParallelRangeFunc func, const TaskParallelSettings *settings)
BLI_INLINE void BLI_parallel_range_settings_defaults(TaskParallelSettings *settings)
void BLI_rw_mutex_end(ThreadRWMutex *mutex)
void BLI_mutex_end(ThreadMutex *mutex)
void BLI_mutex_init(ThreadMutex *mutex)
#define THREAD_LOCK_WRITE
void BLI_rw_mutex_lock(ThreadRWMutex *mutex, int mode)
void BLI_mutex_lock(ThreadMutex *mutex)
void BLI_mutex_unlock(ThreadMutex *mutex)
void BLI_rw_mutex_init(ThreadRWMutex *mutex)
void BLI_rw_mutex_unlock(ThreadRWMutex *mutex)
#define ENUM_OPERATORS(_type, _max)
#define POINTER_FROM_INT(i)
#define POINTER_AS_UINT(i)
#define POINTER_AS_INT(i)
#define POINTER_FROM_UINT(i)
void ccgSubSurf_initFaceIterator(CCGSubSurf *ss, CCGFaceIterator *fiter)
int ccgSubSurf_getNumFinalEdges(const CCGSubSurf *ss)
CCGFace * ccgSubSurf_getFace(CCGSubSurf *ss, CCGFaceHDL f)
int ccgSubSurf_getNumFaces(const CCGSubSurf *ss)
void ccgVertIterator_next(CCGVertIterator *vi)
int ccgSubSurf_getVertNumFaces(CCGVert *v)
int ccgSubSurf_getNumFinalFaces(const CCGSubSurf *ss)
int ccgFaceIterator_isStopped(CCGFaceIterator *fi)
CCGSubSurf * ccgSubSurf_new(CCGMeshIFC *ifc, int subdivLevels, CCGAllocatorIFC *allocatorIFC, CCGAllocatorHDL allocator)
int ccgEdgeIterator_isStopped(CCGEdgeIterator *ei)
void ccgSubSurf_initEdgeIterator(CCGSubSurf *ss, CCGEdgeIterator *eiter)
void ccgSubSurf_setNumLayers(CCGSubSurf *ss, int numLayers)
void * ccgSubSurf_getEdgeUserData(CCGSubSurf *ss, CCGEdge *e)
int ccgSubSurf_getNumVerts(const CCGSubSurf *ss)
void * ccgSubSurf_getFaceUserData(CCGSubSurf *ss, CCGFace *f)
void * ccgSubSurf_getVertData(CCGSubSurf *ss, CCGVert *v)
CCGError ccgSubSurf_syncFace(CCGSubSurf *ss, CCGFaceHDL fHDL, int numVerts, CCGVertHDL *vHDLs, CCGFace **f_r)
int ccgSubSurf_getSubdivisionLevels(const CCGSubSurf *ss)
CCGVert * ccgSubSurf_getEdgeVert0(CCGEdge *e)
CCGEdge * ccgSubSurf_getVertEdge(CCGVert *v, int index)
CCGError ccgSubSurf_processSync(CCGSubSurf *ss)
int ccgSubSurf_getVertNumEdges(CCGVert *v)
void * ccgSubSurf_getEdgeData(CCGSubSurf *ss, CCGEdge *e, int x)
void * ccgSubSurf_getVertUserData(CCGSubSurf *ss, CCGVert *v)
CCGError ccgSubSurf_setCalcVertexNormals(CCGSubSurf *ss, int useVertNormals, int normalDataOffset)
CCGError ccgSubSurf_syncVert(CCGSubSurf *ss, CCGVertHDL vHDL, const void *vertData, int seam, CCGVert **v_r)
int ccgSubSurf_getSimpleSubdiv(const CCGSubSurf *ss)
void * ccgSubSurf_getFaceGridDataArray(CCGSubSurf *ss, CCGFace *f, int gridIndex)
int ccgSubSurf_getGridSize(const CCGSubSurf *ss)
float ccgSubSurf_getEdgeCrease(CCGEdge *e)
CCGFace * ccgSubSurf_getVertFace(CCGVert *v, int index)
CCGEdgeHDL ccgSubSurf_getEdgeEdgeHandle(CCGEdge *e)
CCGVert * ccgSubSurf_getEdgeVert1(CCGEdge *e)
void ccgEdgeIterator_next(CCGEdgeIterator *ei)
void ccgSubSurf_initVertIterator(CCGSubSurf *ss, CCGVertIterator *viter)
void ccgSubSurf_getUseAgeCounts(CCGSubSurf *ss, int *useAgeCounts_r, int *vertUserOffset_r, int *edgeUserOffset_r, int *faceUserOffset_r)
CCGFaceHDL ccgSubSurf_getFaceFaceHandle(CCGFace *f)
void ccgSubSurf_setAllocMask(CCGSubSurf *ss, int allocMask, int maskOffset)
void ccgSubSurf_free(CCGSubSurf *ss)
CCGError ccgSubSurf_initFullSync(CCGSubSurf *ss)
CCGError ccgSubSurf_setUseAgeCounts(CCGSubSurf *ss, int useAgeCounts, int vertUserOffset, int edgeUserOffset, int faceUserOffset)
CCGVert * ccgVertIterator_getCurrent(CCGVertIterator *vi)
CCGEdge * ccgSubSurf_getFaceEdge(CCGFace *f, int index)
int ccgSubSurf_getNumEdges(const CCGSubSurf *ss)
int ccgSubSurf_getNumFinalVerts(const CCGSubSurf *ss)
void * ccgSubSurf_getFaceGridData(CCGSubSurf *ss, CCGFace *f, int gridIndex, int x, int y)
void ccgFaceIterator_next(CCGFaceIterator *fi)
int ccgVertIterator_isStopped(CCGVertIterator *vi)
CCGEdge * ccgEdgeIterator_getCurrent(CCGEdgeIterator *ei)
CCGVert * ccgSubSurf_getFaceVert(CCGFace *f, int index)
int ccgSubSurf_getEdgeSize(const CCGSubSurf *ss)
CCGError ccgSubSurf_setSubdivisionLevels(CCGSubSurf *ss, int subdivisionLevels)
CCGVertHDL ccgSubSurf_getVertVertHandle(CCGVert *v)
CCGError ccgSubSurf_syncEdge(CCGSubSurf *ss, CCGEdgeHDL eHDL, CCGVertHDL e_vHDL0, CCGVertHDL e_vHDL1, float crease, CCGEdge **e_r)
CCGFace * ccgFaceIterator_getCurrent(CCGFaceIterator *fi)
void * ccgSubSurf_getFaceCenterData(CCGFace *f)
int ccgSubSurf_getFaceNumVerts(CCGFace *f)
void * ccgSubSurf_getFaceGridEdgeData(CCGSubSurf *ss, CCGFace *f, int gridIndex, int x)
EHashIterator CCGFaceIterator
EHashIterator CCGVertIterator
EHashIterator CCGEdgeIterator
@ eSubsurfModifierFlag_Incremental
@ eSubsurfModifierFlag_DebugIncr
@ eSubsurfModifierFlag_ControlEdges
Object is a sort of wrapper for general info.
Read Guarded memory(de)allocation.
Provides wrapper around system-specific atomic primitives, and some extensions (faked-atomic operatio...
ATOMIC_INLINE void * atomic_cas_ptr(void **v, void *old, void *_new)
BMesh const char void * data
ATTR_WARN_UNUSED_RESULT const BMVert * v2
ATTR_WARN_UNUSED_RESULT const BMVert const BMEdge * e
ATTR_WARN_UNUSED_RESULT const BMVert * v
virtual int getNumEdges() const
SIMD_FORCE_INLINE const btScalar & w() const
Return the w value.
int64_t index_of(const Key &key) const
constexpr int64_t size() const
constexpr int64_t start() const
void reserve(const int64_t n)
void reinitialize(const int64_t new_size)
#define MEM_SIZE_OPTIMAL(size)
void * MEM_calloc_arrayN(size_t len, size_t size, const char *str)
void * MEM_callocN(size_t len, const char *str)
void * MEM_malloc_arrayN(size_t len, size_t size, const char *str)
void MEM_freeN(void *vmemh)
VecBase< int32_t, 2 > int2
void(* free)(CCGAllocatorHDL a, void *ptr)
void(* release)(CCGAllocatorHDL a)
void *(* alloc)(CCGAllocatorHDL a, int numBytes)
void *(* realloc)(CCGAllocatorHDL a, void *ptr, int newSize, int oldSize)
blender::VectorSet< blender::OrderedEdge > * ehash
struct CCGDerivedMesh::@141140107254220162264204145365021017104075250355 * faceMap
ThreadMutex loops_cache_lock
struct CCGDerivedMesh::@247324002362206055322112033013013034315271071207 * vertMap
unsigned int ** gridHidden
ThreadRWMutex origindex_cache_rwlock
struct CCGDerivedMesh::@241372020133303040027040022012075051222123014337 * edgeMap
int(* getGridSize)(DerivedMesh *dm)
void *(* getEdgeDataArray)(DerivedMesh *dm, eCustomDataType type)
int *(* getPolyArray)(DerivedMesh *dm)
int(* getNumVerts)(DerivedMesh *dm)
int *(* getCornerVertArray)(DerivedMesh *dm)
void *(* getPolyDataArray)(DerivedMesh *dm, eCustomDataType type)
int(* getNumPolys)(DerivedMesh *dm)
void(* copyVertArray)(DerivedMesh *dm, float(*r_positions)[3])
void(* copyCornerEdgeArray)(DerivedMesh *dm, int *r_corner_edges)
int(* getNumEdges)(DerivedMesh *dm)
void *(* getVertDataArray)(DerivedMesh *dm, eCustomDataType type)
void(* copyEdgeArray)(DerivedMesh *dm, blender::int2 *r_edge)
int(* getNumGrids)(DerivedMesh *dm)
float *(* getVertArray)(DerivedMesh *dm)
void(* copyPolyArray)(DerivedMesh *dm, int *r_face_offsets)
int *(* getGridOffset)(DerivedMesh *dm)
blender::int2 *(* getEdgeArray)(DerivedMesh *dm)
void(* copyCornerVertArray)(DerivedMesh *dm, int *r_corner_verts)
CCGElem **(* getGridData)(DerivedMesh *dm)
void(* release)(DerivedMesh *dm)
void(* getGridKey)(DerivedMesh *dm, CCGKey *key)
int(* getNumLoops)(DerivedMesh *dm)
unsigned short loop_of_face_index
FaceVertWeightEntry * weight_table
static int getFaceIndex(CCGSubSurf *ss, CCGFace *f, int S, int x, int y, int edgeSize, int gridSize)
static void set_ccgdm_all_geometry(CCGDerivedMesh *ccgdm, CCGSubSurf *ss, DerivedMesh *dm, bool useSubsurfUv)
static void ccgDM_copyFinalCornerEdgeArray(DerivedMesh *dm, int *r_corner_edges)
float FaceVertWeight[SUB_ELEMS_FACE][SUB_ELEMS_FACE]
static CCGElem ** ccgDM_getGridData(DerivedMesh *dm)
static void set_default_ccgdm_callbacks(CCGDerivedMesh *ccgdm)
static void ccgDM_copyFinalPolyArray(DerivedMesh *dm, int *r_face_offsets)
static float * get_ss_weights(WeightTable *wtable, int gridCuts, int faceLen)
static void ccgdm_create_grids(DerivedMesh *dm)
static void * arena_alloc(CCGAllocatorHDL a, int numBytes)
static int getEdgeIndex(CCGSubSurf *ss, CCGEdge *e, int x, int edgeSize)
static void free_ss_weights(WeightTable *wtable)
static int ccgDM_getFaceMapIndex(CCGSubSurf *ss, CCGFace *f)
static void ccgDM_copyFinalCornerVertArray(DerivedMesh *dm, int *r_corner_verts)
static int ccgDM_getNumEdges(DerivedMesh *dm)
static int ccgDM_getVertMapIndex(CCGSubSurf *ss, CCGVert *v)
static int ccgDM_getEdgeMapIndex(CCGSubSurf *ss, CCGEdge *e)
static int ss_sync_from_uv(CCGSubSurf *ss, CCGSubSurf *origss, DerivedMesh *dm, const float(*mloopuv)[2])
static int ccgDM_getNumVerts(DerivedMesh *dm)
static void get_face_uv_map_vert(UvVertMap *vmap, const blender::OffsetIndices< int > faces, const int *face_verts, int fi, CCGVertHDL *fverts)
static void copyFinalLoopArray_task_cb(void *__restrict userdata, const int iter, const TaskParallelTLS *__restrict)
BLI_INLINE void ccgDM_to_MVert(float mv[3], const CCGKey *key, CCGElem *elem)
void subsurf_calculate_limit_positions(Mesh *mesh, float(*r_positions)[3])
static void * ccgDM_get_edge_data_layer(DerivedMesh *dm, const eCustomDataType type)
static void ccgDM_copyFinalVertArray(DerivedMesh *dm, float(*r_positions)[3])
static int ccgDM_getNumGrids(DerivedMesh *dm)
static void ss_sync_from_derivedmesh(CCGSubSurf *ss, DerivedMesh *dm, float(*vertexCos)[3], int use_flat_subdiv, bool)
static int ccgDM_getNumLoops(DerivedMesh *dm)
static void ccgDM_release(DerivedMesh *dm)
static void ss_sync_ccg_from_derivedmesh(CCGSubSurf *ss, DerivedMesh *dm, float(*vertexCos)[3], int useFlatSubdiv)
static void * arena_realloc(CCGAllocatorHDL a, void *ptr, int newSize, int oldSize)
static int ccgDM_getGridSize(DerivedMesh *dm)
DerivedMesh * subsurf_make_derived_from_derived(DerivedMesh *dm, SubsurfModifierData *smd, const Scene *scene, float(*vertCos)[3], SubsurfFlags flags)
static CCGSubSurf * _getSubSurf(CCGSubSurf *prevSS, int subdivLevels, int numLayers, CCGFlags flags)
static void arena_release(CCGAllocatorHDL a)
static void * ccgDM_get_poly_data_layer(DerivedMesh *dm, const eCustomDataType type)
static int ccgDM_getNumPolys(DerivedMesh *dm)
static void set_subsurf_legacy_uv(CCGSubSurf *ss, DerivedMesh *dm, DerivedMesh *result, int n)
static void create_ccgdm_maps(CCGDerivedMesh *ccgdm, CCGSubSurf *ss)
static CCGDerivedMesh * getCCGDerivedMesh(CCGSubSurf *ss, int drawInteriorEdges, int useSubsurfUv, DerivedMesh *dm)
static void set_subsurf_uv(CCGSubSurf *ss, DerivedMesh *dm, DerivedMesh *result, int layer_index)
static void ccgDM_copyFinalEdgeArray(DerivedMesh *dm, blender::int2 *edges)
static int * ccgDM_getGridOffset(DerivedMesh *dm)
static void ccgDM_getGridKey(DerivedMesh *dm, CCGKey *key)
static void * ccgDM_get_vert_data_layer(DerivedMesh *dm, const eCustomDataType type)
static void arena_free(CCGAllocatorHDL, void *)
BLI_INLINE void ccgDM_to_MEdge(blender::int2 *edge, const int v1, const int v2)