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]
>(
364 &result->loopData,
CD_PROP_FLOAT2, n, result->getNumLoops(result)));
366 if (!dmloopuv || (!tface && !mloopuv)) {
382 gridFaces = gridSize - 1;
396 float(*mluv)[2] = mloopuv;
398 for (index = 0; index < totface; index++) {
402 for (S = 0; S < numVerts; S++) {
403 float(*faceGridData)[2] =
static_cast<float(*)[2]
>(
406 for (y = 0; y < gridFaces; y++) {
407 for (x = 0; x < gridFaces; x++) {
408 float *a = faceGridData[(y + 0) * gridSize + x + 0];
409 float *
b = faceGridData[(y + 0) * gridSize + x + 1];
410 float *c = faceGridData[(y + 1) * gridSize + x + 1];
411 float *d = faceGridData[(y + 1) * gridSize + x + 0];
443#define SUB_ELEMS_FACE 50
460 float *
w, w1, w2, w4, fac, fac2, fx, fy;
462 if (wtable->
len <= faceLen) {
471 wtable->
len = faceLen + 1;
477 MEM_callocN(
sizeof(
float) * faceLen * faceLen * (gridCuts + 2) * (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],
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);
822 const int v2 =
getFaceIndex(ss, f, S, x + 0, y + 1, 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;
860 settings.min_iter_per_thread = 1;
881 ehash->add({medge[i][0], medge[i][1]});
891 data.corner_verts =
nullptr;
892 data.corner_edges = r_corner_edges;
899 settings.min_iter_per_thread = 1;
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;
971 for (
uint i = 0; i < numGrids; i++) {
998 int a, index, totnone, totorig;
1010 origindex =
static_cast<int *
>(
1017 for (a = 0; a < totnone; a++) {
1021 for (index = 0; index < totorig; index++, a++) {
1040 int a, i, index, totnone, totorig, totedge;
1049 origindex =
static_cast<int *
>(
1053 totorig = totedge * (edgeSize - 1);
1057 for (a = 0; a < totnone; a++) {
1061 for (index = 0; index < totedge; index++) {
1065 for (i = 0; i < edgeSize - 1; i++, a++) {
1066 origindex[a] = mapIndex;
1083 int a, i, index, totface;
1092 origindex =
static_cast<int *
>(
1097 for (a = 0, index = 0; index < totface; index++) {
1102 for (i = 0; i < gridFaces * gridFaces * numVerts; i++, a++) {
1103 origindex[a] = mapIndex;
1116 int index, numFaces, numGrids;
1121 for (index = 0; index < numFaces; index++) {
1142 int index, numFaces, numGrids, S, gIndex ;
1153 gridOffset =
static_cast<int *
>(
MEM_mallocN(
sizeof(
int) * numFaces,
"ccgdm.gridOffset"));
1155 for (gIndex = 0, index = 0; index < numFaces; index++) {
1159 gridOffset[index] = gIndex;
1164 gridData =
static_cast<CCGElem **
>(
MEM_mallocN(
sizeof(CCGElem *) * numGrids,
"ccgdm.gridData"));
1165 gridFaces =
static_cast<CCGFace **
>(
1171 for (gIndex = 0, index = 0; index < numFaces; index++) {
1175 for (S = 0; S < numVerts; S++, gIndex++) {
1177 gridFaces[gIndex] = f;
1239 int totvert, totedge, totface;
1288 int vertNum = 0, edgeNum = 0, faceNum = 0;
1289 int *polyidx =
nullptr;
1292 int loopindex, loopindex2;
1295 int gridFaces, gridCuts;
1297 int gridInternalEdges;
1303 gridFaces = gridSize - 1;
1304 gridCuts = gridSize - 2;
1306 gridSideEdges = gridSize - 1;
1307 gridInternalEdges = (gridSideEdges - 1) * gridSideEdges * 2;
1309 const int *base_polyOrigIndex =
static_cast<const int *
>(
1318 loopindex = loopindex2 = 0;
1319 for (index = 0; index < totface; index++) {
1322 int numFinalEdges = numVerts * (gridSideEdges + gridInternalEdges);
1324 int g2_wid = gridCuts + 2;
1338 for (s = 0; s < numVerts; s++) {
1339 loopidx[s] = loopindex++;
1343 for (s = 0; s < numVerts; s++) {
1351 if (vertOrigIndex) {
1359 for (s = 0; s < numVerts; s++) {
1360 for (x = 1; x < gridFaces; x++) {
1361 w2 =
w + s * numVerts * g2_wid * g2_wid + x * numVerts;
1364 if (vertOrigIndex) {
1374 for (s = 0; s < numVerts; s++) {
1375 for (y = 1; y < gridFaces; y++) {
1376 for (x = 1; x < gridFaces; x++) {
1377 w2 =
w + s * numVerts * g2_wid * g2_wid + (y * g2_wid +
x) * numVerts;
1380 if (vertOrigIndex) {
1390 if (edgeOrigIndex) {
1391 for (i = 0; i < numFinalEdges; i++) {
1396 for (s = 0; s < numVerts; s++) {
1398 for (y = 0; y < gridFaces; y++) {
1399 for (x = 0; x < gridFaces; x++) {
1400 w2 =
w + s * numVerts * g2_wid * g2_wid + (y * g2_wid +
x) * numVerts;
1410 w2 =
w + s * numVerts * g2_wid * g2_wid + ((y + 1) * g2_wid + (x)) * numVerts;
1420 w2 =
w + s * numVerts * g2_wid * g2_wid + ((y + 1) * g2_wid + (x + 1)) * numVerts;
1430 w2 =
w + s * numVerts * g2_wid * g2_wid + ((
y)*g2_wid + (x + 1)) * numVerts;
1442 if (polyOrigIndex) {
1443 *polyOrigIndex = base_polyOrigIndex ? base_polyOrigIndex[origIndex] : origIndex;
1449 polyidx[faceNum] = faceNum;
1457 edgeNum += numFinalEdges;
1460 for (index = 0; index < totedge; index++) {
1462 int numFinalEdges = edgeSize - 1;
1480 for (x = 1; x < edgeSize - 1; x++) {
1482 w[1] =
float(x) / (edgeSize - 1);
1485 if (vertOrigIndex) {
1494 for (i = 0; i < numFinalEdges; i++) {
1499 if (edgeOrigIndex) {
1500 for (i = 0; i < numFinalEdges; i++) {
1501 edgeOrigIndex[edgeNum + i] = mapIndex;
1505 edgeNum += numFinalEdges;
1514 for (i = 0; i < numlayer && i < dmnumlayer; i++) {
1519 for (index = 0; index < totvert; index++) {
1533 if (vertOrigIndex) {
1534 *vertOrigIndex = mapIndex;
1549 int drawInteriorEdges,
1597 float (*vertCos)[3],
1612 int levels = (scene !=
nullptr && !ignore_simplify) ?
1635 int levels = (scene !=
nullptr && !ignore_simplify) ?
1653 int levels = (scene !=
nullptr && !ignore_simplify) ?
1683 static_cast<CCGSubSurf *
>(smd->
mCache), drawInteriorEdges, useSubsurfUv, dm);
1727 float edge_sum[3], face_sum[3];
1745 for (i = 0; i <
N; i++) {
1750 for (i = 0; i < numFaces; i++) {
1757 if (numFaces && numFaces !=
N) {
1758 mul_v3_fl(face_sum,
float(
N) /
float(numFaces));
1762 r_positions[idx][0] = (co[0] *
N *
N + edge_sum[0] * 4 + face_sum[0]) / (
N * (
N + 5));
1763 r_positions[idx][1] = (co[1] *
N *
N + edge_sum[1] * 4 + face_sum[1]) / (
N * (
N + 5));
1764 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)
bool CustomData_free_layer_named(CustomData *data, blender::StringRef name, const int totelem)
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)
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
void multires_modifier_update_mdisps(DerivedMesh *dm, Scene *scene)
void multires_modifier_update_hidden(DerivedMesh *dm)
int get_render_subsurf_level(const RenderData *r, int lvl, bool for_render)
@ MULTIRES_HIDDEN_MODIFIED
@ MULTIRES_COORDS_MODIFIED
@ SUBSURF_ALLOC_PAINT_MASK
@ SUBSURF_USE_RENDER_PARAMS
@ SUBSURF_IGNORE_SIMPLIFY
int BLI_findindex(const struct ListBase *listbase, const void *vlink) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
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])
void * BLI_memarena_alloc(struct MemArena *ma, size_t size) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1) ATTR_MALLOC ATTR_ALLOC_SIZE(2)
void BLI_memarena_free(struct MemArena *ma) ATTR_NONNULL(1)
struct MemArena * BLI_memarena_new(size_t bufsize, const char *name) ATTR_WARN_UNUSED_RESULT ATTR_RETURNS_NONNULL ATTR_NONNULL(2) ATTR_MALLOC
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)
@ eSubsurfModifierFlag_Incremental
@ eSubsurfModifierFlag_DebugIncr
@ eSubsurfModifierFlag_ControlEdges
Object is a sort of wrapper for general info.
Read Guarded memory(de)allocation.
#define MEM_SIZE_OPTIMAL(size)
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)
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.
constexpr int64_t size() const
void reserve(const int64_t n)
int64_t index_of(const Key &key) const
void reinitialize(const int64_t new_size)
local_group_size(16, 16) .push_constant(Type b
draw_view in_light_buf[] float
void *(* MEM_mallocN)(size_t len, const char *str)
void MEM_freeN(void *vmemh)
void *(* MEM_callocN)(size_t len, const char *str)
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)
struct CCGDerivedMesh::@68 * faceMap
blender::VectorSet< blender::OrderedEdge > * ehash
MultiresModifierData * mmd
MultiresModifiedFlags modified_flags
ThreadMutex loops_cache_lock
unsigned int ** gridHidden
struct CCGDerivedMesh::@67 * edgeMap
struct CCGDerivedMesh::@66 * vertMap
ThreadRWMutex origindex_cache_rwlock
struct CCGDerivedMesh::@69 multires
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)