31 #define FACE_calcIFNo(f, lvl, S, x, y, no) \
32 _face_calcIFNo(f, lvl, S, x, y, no, subdivLevels, vertDataSize)
47 return e->numFaces < 2;
52 for (
int i = 0; i <
v->numEdges; i++) {
84 CCGFace *f,
int lvl,
int S,
int x,
int y,
float no[3],
int levels,
int dataSize)
90 float a_cX =
c[0] -
a[0], a_cY =
c[1] -
a[1], a_cZ =
c[2] -
a[2];
91 float b_dX = d[0] - b[0], b_dY = d[1] - b[1], b_dZ = d[2] - b[2];
93 no[0] = b_dY * a_cZ - b_dZ * a_cY;
94 no[1] = b_dZ * a_cX - b_dX * a_cZ;
95 no[2] = b_dX * a_cY - b_dY * a_cX;
113 if (
e->crease - lvl < 0.0f) {
116 return e->crease - lvl;
149 for (
y = 0;
y < gridSize - 1;
y++) {
150 for (
x = 0;
x < gridSize - 1;
x++) {
156 for (
x = 0;
x < gridSize - 1;
x++) {
161 for (
y = 0;
y < gridSize - 1;
y++) {
173 int yLimitNext = xLimit;
174 int xLimitPrev = yLimit;
176 for (
y = 0;
y < gridSize - 1;
y++) {
177 for (
x = 0;
x < gridSize - 1;
x++) {
178 int xPlusOk = (!xLimit ||
x < gridSize - 2);
179 int yPlusOk = (!yLimit ||
y < gridSize - 2);
190 if (xPlusOk && yPlusOk) {
191 if (
x < gridSize - 2 ||
y < gridSize - 2 ||
197 if (
x == 0 &&
y == 0) {
200 if (!yLimitNext || 1 < gridSize - 1) {
203 if (!xLimitPrev || 1 < gridSize - 1) {
215 if (!yLimitNext ||
x < gridSize - 2) {
221 if (!xLimitPrev ||
y < gridSize - 2) {
252 for (
y = 0;
y < gridSize;
y++) {
253 for (
x = 0;
x < gridSize;
x++) {
263 for (
x = 1;
x < gridSize - 1;
x++) {
284 CCGFace *fLast =
e->faces[
e->numFaces - 1];
287 for (i = 0; i <
e->numFaces - 1; i++) {
292 for (
x = 1;
x < edgeSize - 1;
x++) {
295 fLast,
e, f_ed_idx_last, lvl,
x, 0, subdivLevels, vertDataSize, normalDataOffset),
297 f,
e, f_ed_idx, lvl,
x, 0, subdivLevels, vertDataSize, normalDataOffset));
301 for (i = 0; i <
e->numFaces - 1; i++) {
306 for (
x = 1;
x < edgeSize - 1;
x++) {
309 f,
e, f_ed_idx, lvl,
x, 0, subdivLevels, vertDataSize, normalDataOffset),
311 fLast,
e, f_ed_idx_last, lvl,
x, 0, subdivLevels, vertDataSize, normalDataOffset));
335 .effectedV = effectedV,
336 .effectedE = effectedE,
337 .effectedF = effectedF,
338 .numEffectedV = numEffectedV,
339 .numEffectedE = numEffectedE,
340 .numEffectedF = numEffectedF,
352 for (ptrIdx = 0; ptrIdx < numEffectedV; ptrIdx++) {
358 for (i = 0; i <
v->numFaces; i++) {
369 for (i = 0; i <
v->numFaces; i++) {
391 for (ptrIdx = 0; ptrIdx < numEffectedE; ptrIdx++) {
399 for (
x = 0;
x < edgeSize;
x++) {
402 f,
e, f_ed_idx, lvl,
x, 0, subdivLevels, vertDataSize, normalDataOffset));
412 for (
x = 0;
x < edgeSize;
x++) {
430 const int curLvl =
data->curLvl;
431 const int nextLvl = curLvl + 1;
441 for (
y = 0;
y < gridSize - 1;
y++) {
442 for (
x = 0;
x < gridSize - 1;
x++) {
461 for (
x = 0;
x < gridSize - 1;
x++) {
478 for (
x = 1;
x < gridSize - 1;
x++) {
479 for (
y = 0;
y < gridSize - 1;
y++) {
484 const float *co2 =
FACE_getIFCo(f, nextLvl, S, fx - 1, fy);
485 const float *co3 =
FACE_getIFCo(f, nextLvl, S, fx + 1, fy);
493 for (
y = 1;
y < gridSize - 1;
y++) {
494 for (
x = 0;
x < gridSize - 1;
x++) {
499 const float *co2 =
FACE_getIFCo(f, nextLvl, S, fx, fy - 1);
500 const float *co3 =
FACE_getIFCo(f, nextLvl, S, fx, fy + 1);
518 const int curLvl =
data->curLvl;
519 const int nextLvl = curLvl + 1;
523 float *q_thread = alloca(vertDataSize);
524 float *r_thread = alloca(vertDataSize);
555 for (
x = 1;
x < gridSize - 1;
x++) {
556 for (
y = 1;
y < gridSize - 1;
y++) {
588 for (
x = 1;
x < gridSize - 1;
x++) {
624 const int nextLvl =
data->curLvl + 1;
626 const int cornerIdx = gridSize - 1;
643 for (
x = 1;
x < gridSize - 1;
x++) {
648 for (
x = 0;
x < gridSize - 1;
x++) {
649 int eI = gridSize - 1 -
x;
664 const int numEffectedV,
665 const int numEffectedE,
666 const int numEffectedF,
670 const int nextLvl = curLvl + 1;
674 float *q = ss->
q, *
r = ss->
r;
678 .effectedV = effectedV,
679 .effectedE = effectedE,
680 .effectedF = effectedF,
681 .numEffectedV = numEffectedV,
682 .numEffectedE = numEffectedE,
683 .numEffectedF = numEffectedF,
703 for (ptrIdx = 0; ptrIdx < numEffectedE; ptrIdx++) {
709 for (
x = 0;
x < edgeSize - 1;
x++) {
721 for (
x = 0;
x < edgeSize - 1;
x++) {
731 for (j = 0; j <
e->numFaces; j++) {
761 for (ptrIdx = 0; ptrIdx < numEffectedV; ptrIdx++) {
765 int sharpCount = 0, allSharp = 1;
766 float avgSharpness = 0.0;
769 for (j = 0; j <
v->numEdges; j++) {
777 if (sharpness != 0.0f) {
779 avgSharpness += sharpness;
787 avgSharpness /= sharpCount;
788 if (avgSharpness > 1.0f) {
793 if (seamEdges < 2 || seamEdges != v->numEdges) {
804 for (j = 0; j <
v->numEdges; j++) {
818 const int cornerIdx = (1 + (1 << (curLvl))) - 2;
819 int numEdges = 0, numFaces = 0;
822 for (j = 0; j <
v->numFaces; j++) {
830 for (j = 0; j <
v->numEdges; j++) {
844 if ((sharpCount > 1 &&
v->numFaces) || seam) {
849 sharpCount = seamEdges;
853 for (j = 0; j <
v->numEdges; j++) {
862 else if (sharpness != 0.0f) {
869 if (sharpCount != 2 || allSharp) {
896 for (ptrIdx = 0; ptrIdx < numEffectedE; ptrIdx++) {
900 float avgSharpness = 0.0;
903 if (sharpness != 0.0f) {
905 avgSharpness += sharpness;
907 if (avgSharpness > 1.0f) {
917 for (
x = 1;
x < edgeSize - 1;
x++) {
935 for (
x = 1;
x < edgeSize - 1;
x++) {
945 for (j = 0; j <
e->numFaces; j++) {
972 if (sharpCount == 2) {
1002 for (i = 0; i < numEffectedE; i++) {
1022 int numEffectedV, numEffectedE, numEffectedF;
1025 int i, j, ptrIdx, S;
1026 int curLvl, nextLvl;
1027 void *q = ss->
q, *
r = ss->
r;
1032 numEffectedV = numEffectedE = numEffectedF = 0;
1035 for (;
v;
v =
v->next) {
1037 effectedV[numEffectedV++] =
v;
1039 for (j = 0; j <
v->numEdges; j++) {
1042 effectedE[numEffectedE++] =
e;
1047 for (j = 0; j <
v->numFaces; j++) {
1050 effectedF[numEffectedF++] = f;
1059 nextLvl = curLvl + 1;
1061 for (ptrIdx = 0; ptrIdx < numEffectedF; ptrIdx++) {
1062 CCGFace *f = effectedF[ptrIdx];
1065 for (i = 0; i < f->
numVerts; i++) {
1072 for (ptrIdx = 0; ptrIdx < numEffectedE; ptrIdx++) {
1086 for (i = 0; i <
e->numFaces; i++) {
1105 for (ptrIdx = 0; ptrIdx < numEffectedV; ptrIdx++) {
1109 int sharpCount = 0, allSharp = 1;
1110 float avgSharpness = 0.0;
1113 for (i = 0; i <
v->numEdges; i++) {
1121 if (sharpness != 0.0f) {
1123 avgSharpness += sharpness;
1131 avgSharpness /= sharpCount;
1132 if (avgSharpness > 1.0f) {
1133 avgSharpness = 1.0f;
1137 if (seamEdges < 2 || seamEdges != v->numEdges) {
1145 int numBoundary = 0;
1148 for (i = 0; i <
v->numEdges; i++) {
1161 int numEdges = 0, numFaces = 0;
1164 for (i = 0; i <
v->numFaces; i++) {
1171 for (i = 0; i <
v->numEdges; i++) {
1185 if (sharpCount > 1 || seam) {
1189 avgSharpness = 1.0f;
1190 sharpCount = seamEdges;
1194 for (i = 0; i <
v->numEdges; i++) {
1204 else if (sharpness != 0.0f) {
1212 if (sharpCount != 2 || allSharp) {
1236 for (i = 0; i < numEffectedV; i++) {
1242 for (i = 0; i < numEffectedE; i++) {
1248 for (i = 0; i < numEffectedF; i++) {
1255 for (i = 0; i < numEffectedE; i++) {
1260 for (i = 0; i < numEffectedF; i++) {
1262 for (S = 0; S < f->
numVerts; S++) {
1282 for (curLvl = 1; curLvl < subdivLevels; curLvl++) {
1284 ss, effectedV, effectedE, effectedF, numEffectedV, numEffectedE, numEffectedF, curLvl);
1289 ss, effectedV, effectedE, effectedF, numEffectedV, numEffectedE, numEffectedF);
1292 for (ptrIdx = 0; ptrIdx < numEffectedV; ptrIdx++) {
1296 for (ptrIdx = 0; ptrIdx < numEffectedE; ptrIdx++) {
1305 #ifdef DUMP_RESULT_GRIDS
1306 ccgSubSurf__dumpCoords(ss);
1317 int i, numEffectedV, numEffectedE, freeF;
1321 ss, effectedF, numEffectedF, &effectedV, &numEffectedV, &effectedE, &numEffectedE);
1325 ss, effectedV, effectedE, effectedF, numEffectedV, numEffectedE, numEffectedF);
1328 for (i = 0; i < numEffectedV; i++) {
1329 effectedV[i]->
flags = 0;
1331 for (i = 0; i < numEffectedE; i++) {
1332 effectedE[i]->
flags = 0;
1334 for (i = 0; i < numEffectedF; i++) {
1335 effectedF[i]->
flags = 0;
1354 int numEffectedV, numEffectedE, freeF, i;
1359 ss, effectedF, numEffectedF, &effectedV, &numEffectedV, &effectedE, &numEffectedE);
1361 for (curLvl = lvl; curLvl < subdivLevels; curLvl++) {
1363 ss, effectedV, effectedE, effectedF, numEffectedV, numEffectedE, numEffectedF, curLvl);
1366 for (i = 0; i < numEffectedV; i++) {
1367 effectedV[i]->
flags = 0;
1369 for (i = 0; i < numEffectedE; i++) {
1370 effectedE[i]->
flags = 0;
1372 for (i = 0; i < numEffectedF; i++) {
1373 effectedF[i]->
flags = 0;
void BLI_task_parallel_range(const int start, const int stop, void *userdata, TaskParallelRangeFunc func, const TaskParallelSettings *settings)
BLI_INLINE void BLI_parallel_range_settings_defaults(TaskParallelSettings *settings)
void ccgSubSurf__effectedFaceNeighbors(CCGSubSurf *ss, CCGFace **faces, int numFaces, CCGVert ***verts, int *numVerts, CCGEdge ***edges, int *numEdges)
void ccgSubSurf__allFaces(CCGSubSurf *ss, CCGFace ***faces, int *numFaces, int *freeFaces)
void * ccgSubSurf_getFaceUserData(CCGSubSurf *ss, CCGFace *f)
void * ccgSubSurf_getVertUserData(CCGSubSurf *ss, CCGVert *v)
void * ccgSubSurf_getEdgeUserData(CCGSubSurf *ss, CCGEdge *e)
BLI_INLINE int ccg_edgesize(int level)
BLI_INLINE int ccg_gridsize(int level)
BLI_INLINE void VertDataZero(float v[], const CCGSubSurf *ss)
BLI_INLINE void * ccg_face_getIFCo(CCGFace *f, int lvl, int S, int x, int y, int levels, int dataSize)
BLI_INLINE int ccg_edgebase(int level)
BLI_INLINE int ccg_face_getEdgeIndex(CCGFace *f, CCGEdge *e)
BLI_INLINE void VertDataSub(float a[], const float b[], const CCGSubSurf *ss)
BLI_INLINE void VertDataCopy(float dst[], const float src[], const CCGSubSurf *ss)
BLI_INLINE int ccg_face_getVertIndex(CCGFace *f, CCGVert *v)
BLI_INLINE byte * FACE_getCenterData(CCGFace *f)
BLI_INLINE CCGEdge ** FACE_getEdges(CCGFace *f)
BLI_INLINE void * ccg_face_getIFCoEdge(CCGFace *f, CCGEdge *e, int f_ed_idx, int lvl, int eX, int eY, int levels, int dataSize)
BLI_INLINE void VertDataMulN(float v[], float f, const CCGSubSurf *ss)
BLI_INLINE CCGVert ** FACE_getVerts(CCGFace *f)
BLI_INLINE void VertDataAvg4(float v[], const float a[], const float b[], const float c[], const float d[], const CCGSubSurf *ss)
BLI_INLINE void VertDataAdd(float a[], const float b[], const CCGSubSurf *ss)
BLI_INLINE byte * EDGE_getLevelData(CCGEdge *e)
#define EDGE_getNo(e, lvl, x)
#define FACE_getIENo(f, lvl, S, x)
#define FACE_getIFNo(f, lvl, S, x, y)
#define EDGE_getCo(e, lvl, x)
#define FACE_getIFCo(f, lvl, S, x, y)
#define VERT_getCo(v, lvl)
#define VERT_getNo(v, lvl)
#define FACE_getIECo(f, lvl, S, x)
static void ccgSubSurf__calcVertNormals_faces_accumulate_cb(void *__restrict userdata, const int ptrIdx, const TaskParallelTLS *__restrict UNUSED(tls))
static void ccgSubSurf__calcSubdivLevel_verts_copydata_cb(void *__restrict userdata, const int ptrIdx, const TaskParallelTLS *__restrict UNUSED(tls))
static int _edge_isBoundary(const CCGEdge *e)
static void ccgSubSurf__calcVertNormals_faces_finalize_cb(void *__restrict userdata, const int ptrIdx, const TaskParallelTLS *__restrict UNUSED(tls))
static float * _face_getIFNoEdge(CCGFace *f, CCGEdge *e, int f_ed_idx, int lvl, int eX, int eY, int levels, int dataSize, int normalDataOffset)
#define FACE_calcIFNo(f, lvl, S, x, y, no)
CCGError ccgSubSurf_updateNormals(CCGSubSurf *ss, CCGFace **effectedF, int numEffectedF)
struct CCGSubSurfCalcSubdivData CCGSubSurfCalcSubdivData
static void ccgSubSurf__calcVertNormals(CCGSubSurf *ss, CCGVert **effectedV, CCGEdge **effectedE, CCGFace **effectedF, int numEffectedV, int numEffectedE, int numEffectedF)
CCGError ccgSubSurf_updateLevels(CCGSubSurf *ss, int lvl, CCGFace **effectedF, int numEffectedF)
static CCGVert * _edge_getOtherVert(CCGEdge *e, CCGVert *vQ)
static void _face_calcIFNo(CCGFace *f, int lvl, int S, int x, int y, float no[3], int levels, int dataSize)
static void ccgSubSurf__calcSubdivLevel_interior_faces_edges_midpoints_cb(void *__restrict userdata, const int ptrIdx, const TaskParallelTLS *__restrict UNUSED(tls))
static float EDGE_getSharpness(CCGEdge *e, int lvl)
static void ccgSubSurf__calcVertNormals_edges_accumulate_cb(void *__restrict userdata, const int ptrIdx, const TaskParallelTLS *__restrict UNUSED(tls))
static int VERT_seam(const CCGVert *v)
static void * _edge_getCoVert(CCGEdge *e, CCGVert *v, int lvl, int x, int dataSize)
static bool _vert_isBoundary(const CCGVert *v)
static void ccgSubSurf__calcSubdivLevel_interior_faces_edges_centerpoints_shift_cb(void *__restrict userdata, const int ptrIdx, const TaskParallelTLS *__restrict UNUSED(tls))
void ccgSubSurf__sync_legacy(CCGSubSurf *ss)
static void ccgSubSurf__calcSubdivLevel(CCGSubSurf *ss, CCGVert **effectedV, CCGEdge **effectedE, CCGFace **effectedF, const int numEffectedV, const int numEffectedE, const int numEffectedF, const int curLvl)
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint GLsizei GLsizei GLenum type _GL_VOID_RET _GL_VOID GLsizei GLenum GLenum const void *pixels _GL_VOID_RET _GL_VOID const void *pointer _GL_VOID_RET _GL_VOID GLdouble v _GL_VOID_RET _GL_VOID GLfloat v _GL_VOID_RET _GL_VOID GLint GLint i2 _GL_VOID_RET _GL_VOID GLint j _GL_VOID_RET _GL_VOID GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble GLdouble GLdouble zFar _GL_VOID_RET _GL_UINT GLdouble *equation _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLenum GLfloat *v _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLfloat *values _GL_VOID_RET _GL_VOID GLushort *values _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLenum GLdouble *params _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_BOOL GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLenum GLfloat param _GL_VOID_RET _GL_VOID GLenum GLint param _GL_VOID_RET _GL_VOID GLushort pattern _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint const GLdouble *points _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint GLdouble GLdouble GLint GLint const GLdouble *points _GL_VOID_RET _GL_VOID GLdouble GLdouble u2 _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLdouble GLdouble v2 _GL_VOID_RET _GL_VOID GLenum GLfloat param _GL_VOID_RET _GL_VOID GLenum GLint param _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLdouble GLdouble nz _GL_VOID_RET _GL_VOID GLfloat GLfloat nz _GL_VOID_RET _GL_VOID GLint GLint nz _GL_VOID_RET _GL_VOID GLshort GLshort nz _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_VOID GLsizei const GLfloat *values _GL_VOID_RET _GL_VOID GLsizei const GLushort *values _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID const GLuint const GLclampf *priorities _GL_VOID_RET _GL_VOID GLdouble y _GL_VOID_RET _GL_VOID GLfloat y _GL_VOID_RET _GL_VOID GLint y _GL_VOID_RET _GL_VOID GLshort y _GL_VOID_RET _GL_VOID GLdouble GLdouble z _GL_VOID_RET _GL_VOID GLfloat GLfloat z _GL_VOID_RET _GL_VOID GLint GLint z _GL_VOID_RET _GL_VOID GLshort GLshort z _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble w _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat w _GL_VOID_RET _GL_VOID GLint GLint GLint w _GL_VOID_RET _GL_VOID GLshort GLshort GLshort w _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble y2 _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat y2 _GL_VOID_RET _GL_VOID GLint GLint GLint y2 _GL_VOID_RET _GL_VOID GLshort GLshort GLshort y2 _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble z _GL_VOID_RET _GL_VOID GLdouble GLdouble z _GL_VOID_RET _GL_VOID GLuint *buffer _GL_VOID_RET _GL_VOID GLdouble t _GL_VOID_RET _GL_VOID GLfloat t _GL_VOID_RET _GL_VOID GLint t _GL_VOID_RET _GL_VOID GLshort t _GL_VOID_RET _GL_VOID GLdouble GLdouble r _GL_VOID_RET _GL_VOID GLfloat GLfloat r _GL_VOID_RET _GL_VOID GLint GLint r _GL_VOID_RET _GL_VOID GLshort GLshort r _GL_VOID_RET _GL_VOID GLdouble GLdouble r
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint y
Read Guarded memory(de)allocation.
Group RGB to Bright Vector Camera Vector Combine Material Light Line Style Layer Add Ambient Diffuse Glossy Refraction Transparent Toon Principled Hair Volume Principled Light Particle Volume Image Sky Noise Wave Voronoi Brick Texture Vector Combine Vertex Separate Vector White RGB Map Separate Set Z Dilate Combine Combine Color Channel Split ID Combine Luminance Normalize
ATTR_WARN_UNUSED_RESULT const BMVert const BMEdge * e
ATTR_WARN_UNUSED_RESULT const BMVert * v
void(* MEM_freeN)(void *vmemh)
void *(* MEM_mallocN)(size_t len, const char *str)