14 #include <OpenGL/CGLMacro.h>
16 #define glGenVertexArrays glGenVertexArraysAPPLE
17 #define glBindVertexArray glBindVertexArrayAPPLE
18 #define glDeleteVertexArrays glDeleteVertexArraysAPPLE
27 "description" :
"A 3D shape represented by a set of vertices with associated normals and other per-vertex data.",
28 "keywords" : [
"mesh",
"vertex" ],
50 unsigned int vertexCount;
51 VuoPoint4d *positions;
54 VuoPoint4d *bitangents;
55 VuoPoint4d *textureCoordinates;
57 unsigned int elementCount;
61 unsigned int *elements;
79 unsigned int combinedBuffer;
80 unsigned int combinedBufferSize;
81 unsigned int combinedBufferStride;
85 void *bitangentOffset;
86 void *textureCoordinateOffset;
88 unsigned int elementBuffer;
89 unsigned int elementBufferSize;
99 VuoPoint4d **positions, VuoPoint4d **normals, VuoPoint4d **tangents, VuoPoint4d **bitangents, VuoPoint4d **textureCoordinates,
100 unsigned int elementCount,
unsigned int **elements)
103 *positions = (VuoPoint4d *)malloc(
sizeof(VuoPoint4d) * vertexCount);
105 *normals = (VuoPoint4d *)malloc(
sizeof(VuoPoint4d) * vertexCount);
107 *tangents = (VuoPoint4d *)malloc(
sizeof(VuoPoint4d) * vertexCount);
109 *bitangents = (VuoPoint4d *)malloc(
sizeof(VuoPoint4d) * vertexCount);
110 if (textureCoordinates)
111 *textureCoordinates = (VuoPoint4d *)malloc(
sizeof(VuoPoint4d) * vertexCount);
113 *elements = elementCount ? (
unsigned int *)malloc(
sizeof(
unsigned int) * elementCount) : NULL;
121 VuoMesh_internal *m = (VuoMesh_internal *)value;
127 free(m->textureCoordinates);
130 VuoGlPool_release(VuoGlPool_ArrayBuffer, m->glUpload.combinedBufferSize, m->glUpload.combinedBuffer);
131 VuoGlPool_release(VuoGlPool_ElementArrayBuffer, m->glUpload.elementBufferSize, m->glUpload.elementBuffer);
139 static VuoMesh_internal *VuoMesh_makeInternal(
void)
141 VuoMesh_internal *m = (VuoMesh_internal *)calloc(1,
sizeof(VuoMesh_internal));
150 static VuoMesh_internal *VuoMesh_makeSingletonInternal(
void)
152 VuoMesh_internal *m = (VuoMesh_internal *)calloc(1,
sizeof(VuoMesh_internal));
170 VuoPoint4d *positions, VuoPoint4d *normals, VuoPoint4d *tangents, VuoPoint4d *bitangents, VuoPoint4d *textureCoordinates,
173 VuoMesh_internal *m = VuoMesh_makeInternal();
175 m->vertexCount = vertexCount;
176 m->positions = positions;
177 m->normals = normals;
178 m->tangents = tangents;
179 m->bitangents = bitangents;
180 m->textureCoordinates = textureCoordinates;
181 m->elementCount = elementCount;
182 m->elements = elements;
183 m->elementAssemblyMethod = elementAssemblyMethod;
192 VuoMesh VuoMesh_makeFromGPUBuffers(
unsigned int vertexCount,
unsigned int combinedBuffer,
unsigned int combinedBufferSize,
unsigned int combinedBufferStride,
void *normalOffset,
void *tangentOffset,
void *bitangentOffset,
void *textureCoordinateOffset,
unsigned int elementCount,
unsigned int elementBuffer,
unsigned int elementBufferSize,
VuoMesh_ElementAssemblyMethod elementAssemblyMethod)
194 VuoMesh_internal *m = VuoMesh_makeInternal();
196 m->vertexCount = vertexCount;
197 m->elementCount = elementCount;
198 m->elementAssemblyMethod = elementAssemblyMethod;
199 m->glUpload.combinedBuffer = combinedBuffer;
200 m->glUpload.combinedBufferSize = combinedBufferSize;
201 m->glUpload.combinedBufferStride = combinedBufferStride;
202 m->glUpload.normalOffset = normalOffset;
203 m->glUpload.tangentOffset = tangentOffset;
204 m->glUpload.bitangentOffset = bitangentOffset;
205 m->glUpload.textureCoordinateOffset = textureCoordinateOffset;
206 m->glUpload.elementBuffer = elementBuffer;
207 m->glUpload.elementBufferSize = elementBufferSize;
220 VuoMesh_internal *m = (VuoMesh_internal *)mesh;
225 return GL_TRIANGLE_STRIP;
227 return GL_TRIANGLE_FAN;
231 return GL_LINE_STRIP;
251 VuoMesh_internal *m = (VuoMesh_internal *)mesh;
254 return m->elementCount ? m->elementCount/3 : m->vertexCount/3;
256 return m->elementCount ? m->elementCount-2 : m->vertexCount-2;
258 return m->elementCount ? m->elementCount-2 : m->vertexCount-2;
260 return m->elementCount ? m->elementCount/2 : m->vertexCount/2;
262 return m->elementCount ? m->elementCount-1 : m->vertexCount-1;
264 return m->elementCount ? m->elementCount : m->vertexCount;
282 VuoMesh_internal *m = (VuoMesh_internal *)mesh;
284 if (m->elementCount == 0 && m->vertexCount == 0)
288 return m->elementCount ? m->elementCount : m->vertexCount;
290 return m->elementCount ? (m->elementCount-2)*3 : (m->vertexCount-2)*3;
292 return m->elementCount ? (m->elementCount-2)*3 : (m->vertexCount-2)*3;
294 return m->elementCount ? m->elementCount : m->vertexCount;
296 return m->elementCount ? (m->elementCount-1)*2 : (m->vertexCount-1)*2;
298 return m->elementCount ? m->elementCount : m->vertexCount;
319 VuoMesh_internal *m = (VuoMesh_internal *)mesh;
321 unsigned long elementCount = m->elementCount ? m->elementCount : m->vertexCount;
330 if (!m || m->glUpload.combinedBuffer)
345 unsigned int bufferCount = 0;
349 unsigned int normalOffset = 0;
351 normalOffset = bufferCount++;
352 m->glUpload.normalOffset = (
void *)(normalOffset*
sizeof(VuoPoint4d));
354 unsigned int tangentOffset = 0;
356 tangentOffset = bufferCount++;
357 m->glUpload.tangentOffset = (
void *)(tangentOffset*
sizeof(VuoPoint4d));
359 unsigned int bitangentOffset = 0;
361 bitangentOffset = bufferCount++;
362 m->glUpload.bitangentOffset = (
void *)(bitangentOffset*
sizeof(VuoPoint4d));
364 unsigned int textureCoordinateOffset = 0;
365 if (m->textureCoordinates)
366 textureCoordinateOffset = bufferCount++;
367 m->glUpload.textureCoordinateOffset = (
void *)(textureCoordinateOffset*
sizeof(VuoPoint4d));
369 unsigned long singleBufferSize =
sizeof(VuoPoint4d)*m->vertexCount;
370 VuoPoint4d *combinedData = (VuoPoint4d *)malloc(singleBufferSize*bufferCount);
374 for (
unsigned long i = 0; i < m->vertexCount; ++i)
376 combinedData[i*bufferCount] = m->positions[i];
378 combinedData[i*bufferCount+normalOffset] = m->normals[i];
380 combinedData[i*bufferCount+tangentOffset] = m->tangents[i];
382 combinedData[i*bufferCount+bitangentOffset] = m->bitangents[i];
383 if (m->textureCoordinates)
384 combinedData[i*bufferCount+textureCoordinateOffset] = m->textureCoordinates[i];
389 m->glUpload.combinedBufferSize = singleBufferSize*bufferCount;
390 m->glUpload.combinedBuffer =
VuoGlPool_use(cgl_ctx, VuoGlPool_ArrayBuffer, m->glUpload.combinedBufferSize);
392 glBindBuffer(GL_ARRAY_BUFFER, m->glUpload.combinedBuffer);
393 glBufferSubData(GL_ARRAY_BUFFER, 0, singleBufferSize * bufferCount, combinedData);
398 m->glUpload.elementBufferSize =
sizeof(
unsigned int)*m->elementCount;
399 m->glUpload.elementBuffer =
VuoGlPool_use(cgl_ctx, VuoGlPool_ElementArrayBuffer, m->glUpload.elementBufferSize);
401 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m->glUpload.elementBuffer);
402 glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0,
sizeof(
unsigned int) * m->elementCount, m->elements);
404 glBindBuffer(GL_ARRAY_BUFFER, 0);
411 glFlushRenderAPPLE();
421 VuoMesh_internal *m = VuoMesh_makeSingletonInternal();
424 VuoMesh_allocateCPUBuffers(m->vertexCount, &m->positions, &m->normals, &m->tangents, &m->bitangents, &m->textureCoordinates, m->elementCount, &m->elements);
427 m->positions[0] = (VuoPoint4d){-.5, -.5, 0, 1};
428 m->positions[1] = (VuoPoint4d){ .5, -.5, 0, 1};
429 m->positions[2] = (VuoPoint4d){-.5, .5, 0, 1};
430 m->positions[3] = (VuoPoint4d){ .5, .5, 0, 1};
433 for (
int i = 0; i < m->vertexCount; ++i)
434 m->normals[i] = (VuoPoint4d){0, 0, 1, 1};
437 for (
int i = 0; i < m->vertexCount; ++i)
438 m->tangents[i] = (VuoPoint4d){1, 0, 0, 1};
441 for (
int i = 0; i < m->vertexCount; ++i)
442 m->bitangents[i] = (VuoPoint4d){0, 1, 0, 1};
445 m->textureCoordinates[0] = (VuoPoint4d){0, 0, 0, 1};
446 m->textureCoordinates[1] = (VuoPoint4d){1, 0, 0, 1};
447 m->textureCoordinates[2] = (VuoPoint4d){0, 1, 0, 1};
448 m->textureCoordinates[3] = (VuoPoint4d){1, 1, 0, 1};
472 VuoMesh_internal *m = VuoMesh_makeSingletonInternal();
475 VuoMesh_allocateCPUBuffers(m->vertexCount, &m->positions, NULL, NULL, NULL, &m->textureCoordinates, m->elementCount, &m->elements);
478 m->positions[0] = (VuoPoint4d){-.5, -.5, 0, 1};
479 m->positions[1] = (VuoPoint4d){ .5, -.5, 0, 1};
480 m->positions[2] = (VuoPoint4d){-.5, .5, 0, 1};
481 m->positions[3] = (VuoPoint4d){ .5, .5, 0, 1};
484 m->textureCoordinates[0] = (VuoPoint4d){0, 0, 0, 1};
485 m->textureCoordinates[1] = (VuoPoint4d){1, 0, 0, 1};
486 m->textureCoordinates[2] = (VuoPoint4d){0, 1, 0, 1};
487 m->textureCoordinates[3] = (VuoPoint4d){1, 1, 0, 1};
509 VuoMesh_internal *m = VuoMesh_makeSingletonInternal();
512 VuoMesh_allocateCPUBuffers(m->vertexCount, &m->positions, &m->normals, &m->tangents, &m->bitangents, &m->textureCoordinates, m->elementCount, &m->elements);
515 for (
int i = 0; i < m->vertexCount; ++i)
517 float angle = M_PI/2. + i * 2*M_PI/3.;
518 m->positions[i] = (VuoPoint4d){cos(angle)/sqrt(3), sin(angle)/sqrt(3), 0, 1};
522 for (
int i = 0; i < m->vertexCount; ++i)
523 m->normals[i] = (VuoPoint4d){0, 0, 1, 1};
526 for (
int i = 0; i < m->vertexCount; ++i)
527 m->tangents[i] = (VuoPoint4d){1, 0, 0, 1};
530 for (
int i = 0; i < m->vertexCount; ++i)
531 m->bitangents[i] = (VuoPoint4d){0, 1, 0, 1};
534 m->textureCoordinates[0] = (VuoPoint4d){.5, 1, 0, 1};
535 m->textureCoordinates[1] = (VuoPoint4d){ 0, 0, 0, 1};
536 m->textureCoordinates[2] = (VuoPoint4d){ 1, 0, 0, 1};
555 static VuoMesh sharedQuadWithNormals;
556 static dispatch_once_t token = 0;
557 dispatch_once(&token, ^{
561 return sharedQuadWithNormals;
573 static VuoMesh sharedQuadWithoutNormals;
574 static dispatch_once_t token = 0;
575 dispatch_once(&token, ^{
579 return sharedQuadWithoutNormals;
589 static VuoMesh sharedEquilateralTriangle;
590 static dispatch_once_t token = 0;
591 dispatch_once(&token, ^{
595 return sharedEquilateralTriangle;
605 VuoPoint4d positions[] = (VuoPoint4d[]){
638 VuoPoint4d normals[] = (VuoPoint4d[]){
671 VuoPoint4d tangents[] = (VuoPoint4d[]){
704 VuoPoint4d bitangents[] = (VuoPoint4d[]){
737 VuoPoint4d textureCoordinates[] = (VuoPoint4d[]){
770 unsigned int elements[] = (
unsigned int[]){
791 VuoMesh_internal *m = VuoMesh_makeSingletonInternal();
792 m->vertexCount = 6 * 4;
793 m->elementCount = 6 * 6;
794 VuoMesh_allocateCPUBuffers(m->vertexCount, &m->positions, &m->normals, &m->tangents, &m->bitangents, &m->textureCoordinates, m->elementCount, &m->elements);
796 memcpy(m->positions, positions,
sizeof(positions));
797 memcpy(m->normals, normals,
sizeof(normals));
798 memcpy(m->tangents, tangents,
sizeof(tangents));
799 memcpy(m->bitangents, bitangents,
sizeof(bitangents));
800 memcpy(m->textureCoordinates, textureCoordinates,
sizeof(textureCoordinates));
801 memcpy(m->elements, elements,
sizeof(elements));
815 static dispatch_once_t token = 0;
816 dispatch_once(&token, ^{
830 return (elementCount / 3) * 3;
835 return elementCount < 3 ? 0 : elementCount;
839 return (elementCount / 2) * 2;
843 return elementCount < 2 ? 0 : elementCount;
851 VUserLog(
"Error: Unknown submesh element assembly method: %d", elementAssemblyMethod);
869 VuoPoint4d *positions4d = (VuoPoint4d *)malloc(
sizeof(VuoPoint4d) * count);
870 unsigned int *elements = (
unsigned int *)malloc(
sizeof(
unsigned int) * count);
871 for (
unsigned long i = 0; i < count; ++i)
873 VuoPoint2d xy = positionValues[i];
874 positions4d[i] = (VuoPoint4d){xy.x, xy.y, 0, 1};
879 positions4d, NULL, NULL, NULL, NULL,
880 count, elements, elementAssemblyMethod);
898 VuoPoint4d *positions4d = (VuoPoint4d *)malloc(
sizeof(VuoPoint4d) * count);
899 unsigned int *elements = (
unsigned int *)malloc(
sizeof(
unsigned int) * count);
900 for (
unsigned long i = 0; i < count; ++i)
902 VuoPoint3d xyz = positionValues[i];
903 positions4d[i] = (VuoPoint4d){xyz.x, xyz.y, xyz.z, 1};
908 positions4d, NULL, NULL, NULL, NULL,
909 count, elements, elementAssemblyMethod);
922 VuoMesh_internal *m = (VuoMesh_internal *)mesh;
923 VuoMesh_internal *copiedMesh = VuoMesh_makeInternal();
924 copiedMesh->vertexCount = m->vertexCount;
925 copiedMesh->elementCount = m->elementCount;
927 unsigned long attributeByteCount =
sizeof(VuoPoint4d) * copiedMesh->vertexCount;
931 copiedMesh->positions = (VuoPoint4d *)malloc(attributeByteCount);
932 memcpy(copiedMesh->positions, m->positions, attributeByteCount);
935 copiedMesh->positions = NULL;
939 copiedMesh->normals = (VuoPoint4d *)malloc(attributeByteCount);
940 memcpy(copiedMesh->normals, m->normals, attributeByteCount);
943 copiedMesh->normals = NULL;
947 copiedMesh->tangents = (VuoPoint4d *)malloc(attributeByteCount);
948 memcpy(copiedMesh->tangents, m->tangents, attributeByteCount);
951 copiedMesh->tangents = NULL;
955 copiedMesh->bitangents = (VuoPoint4d *)malloc(attributeByteCount);
956 memcpy(copiedMesh->bitangents, m->bitangents, attributeByteCount);
959 copiedMesh->bitangents = NULL;
961 if (m->textureCoordinates)
963 copiedMesh->textureCoordinates = (VuoPoint4d *)malloc(attributeByteCount);
964 memcpy(copiedMesh->textureCoordinates, m->textureCoordinates, attributeByteCount);
967 copiedMesh->textureCoordinates = NULL;
969 copiedMesh->elementCount = m->elementCount;
972 unsigned long elementByteCount =
sizeof(
unsigned int)*m->elementCount;
973 copiedMesh->elements = (
unsigned int *)malloc(elementByteCount);
974 memcpy(copiedMesh->elements, m->elements, elementByteCount);
977 copiedMesh->elements = NULL;
979 copiedMesh->elementAssemblyMethod = m->elementAssemblyMethod;
980 copiedMesh->primitiveSize = m->primitiveSize;
981 copiedMesh->faceCulling = m->faceCulling;
983 memcpy(&copiedMesh->glUpload, &m->glUpload,
sizeof(copiedMesh->glUpload));
1005 VuoMesh_internal *m = (VuoMesh_internal *)mesh;
1006 VuoMesh_internal *copiedMesh = VuoMesh_makeInternal();
1008 copiedMesh->vertexCount = m->vertexCount;
1009 copiedMesh->elementCount = m->elementCount;
1011 copiedMesh->elementAssemblyMethod = m->elementAssemblyMethod;
1012 copiedMesh->primitiveSize = m->primitiveSize;
1013 copiedMesh->faceCulling = m->faceCulling;
1015 memcpy(&copiedMesh->glUpload, &m->glUpload,
sizeof(copiedMesh->glUpload));
1032 VuoMesh_internal *m = (VuoMesh_internal *)mesh;
1033 if (m->textureCoordinates)
1035 free(m->textureCoordinates);
1036 m->textureCoordinates = NULL;
1039 if (m->glUpload.combinedBuffer && m->glUpload.textureCoordinateOffset)
1044 m->glUpload.textureCoordinateOffset = NULL;
1062 VuoPoint4d **positions, VuoPoint4d **normals, VuoPoint4d **tangents, VuoPoint4d **bitangents, VuoPoint4d **textureCoordinates,
1063 unsigned int *elementCount,
unsigned int **elements)
1068 VuoMesh_internal *m = (VuoMesh_internal *)mesh;
1071 *vertexCount = m->vertexCount;
1073 *positions = m->positions;
1075 *normals = m->normals;
1077 *tangents = m->tangents;
1079 *bitangents = m->bitangents;
1080 if (textureCoordinates)
1081 *textureCoordinates = m->textureCoordinates;
1083 *elementCount = m->elementCount;
1085 *elements = m->elements;
1096 unsigned int *combinedBuffer,
1097 void **normalOffset,
void **tangentOffset,
void **bitangentOffset,
void **textureCoordinateOffset,
1098 unsigned int *elementCount,
unsigned int *elementBuffer)
1103 VuoMesh_internal *m = (VuoMesh_internal *)mesh;
1106 *vertexCount = m->vertexCount;
1108 *combinedBuffer = m->glUpload.combinedBuffer;
1110 *normalOffset = m->glUpload.normalOffset;
1112 *tangentOffset = m->glUpload.tangentOffset;
1113 if (bitangentOffset)
1114 *bitangentOffset = m->glUpload.bitangentOffset;
1115 if (textureCoordinateOffset)
1116 *textureCoordinateOffset = m->glUpload.textureCoordinateOffset;
1118 *elementCount = m->elementCount;
1120 *elementBuffer = m->glUpload.elementBuffer;
1133 VuoMesh_internal *m = (VuoMesh_internal *)mesh;
1134 return m->elementAssemblyMethod;
1147 VuoMesh_internal *m = (VuoMesh_internal *)mesh;
1148 return m->faceCulling;
1161 VuoMesh_internal *m = (VuoMesh_internal *)mesh;
1180 VuoMesh_internal *m = (VuoMesh_internal *)mesh;
1181 return m->primitiveSize;
1194 VuoMesh_internal *m = (VuoMesh_internal *)mesh;
1195 return m->glUpload.elementBufferSize;
1207 VuoPoint4d *positions, VuoPoint4d *normals, VuoPoint4d *tangents, VuoPoint4d *bitangents, VuoPoint4d *textureCoordinates,
1208 unsigned int elementCount,
unsigned int *elements)
1213 VuoMesh_internal *m = (VuoMesh_internal *)mesh;
1215 m->vertexCount = vertexCount;
1217 if (m->positions != positions)
1220 m->positions = positions;
1223 if (m->normals != normals)
1226 m->normals = normals;
1229 if (m->tangents != tangents)
1232 m->tangents = tangents;
1235 if (m->bitangents != bitangents)
1237 free(m->bitangents);
1238 m->bitangents = bitangents;
1241 if (m->textureCoordinates != textureCoordinates)
1243 free(m->textureCoordinates);
1244 m->textureCoordinates = textureCoordinates;
1247 m->elementCount = elementCount;
1249 if (m->elements != elements)
1252 m->elements = elements;
1255 VuoGlPool_release(VuoGlPool_ArrayBuffer, m->glUpload.combinedBufferSize, m->glUpload.combinedBuffer);
1256 VuoGlPool_release(VuoGlPool_ElementArrayBuffer, m->glUpload.elementBufferSize, m->glUpload.elementBuffer);
1257 m->glUpload.combinedBufferSize = 0;
1258 m->glUpload.combinedBuffer = 0;
1259 m->glUpload.elementBufferSize = 0;
1260 m->glUpload.elementBuffer = 0;
1275 VuoMesh_internal *m = (VuoMesh_internal *)mesh;
1276 m->faceCulling = faceCulling;
1289 VuoMesh_internal *m = (VuoMesh_internal *)mesh;
1290 m->primitiveSize = primitiveSize;
1299 if (strcmp(elementAssemblyMethodString,
"individualTriangles")==0)
1301 else if (strcmp(elementAssemblyMethodString,
"triangleStrip")==0)
1303 else if (strcmp(elementAssemblyMethodString,
"triangleFan")==0)
1305 else if (strcmp(elementAssemblyMethodString,
"individualLines")==0)
1307 else if (strcmp(elementAssemblyMethodString,
"lineStrip")==0)
1309 else if (strcmp(elementAssemblyMethodString,
"points")==0)
1322 switch (elementAssemblyMethod)
1325 return "individualTriangles";
1327 return "triangleStrip";
1329 return "triangleFan";
1331 return "individualLines";
1347 VuoMesh_internal *m = (VuoMesh_internal *)mesh;
1348 if (m->glUpload.combinedBufferStride)
1349 return m->glUpload.combinedBufferStride;
1351 int bufferCount = 0;
1353 if (m->glUpload.normalOffset)
1355 if (m->glUpload.tangentOffset)
1357 if (m->glUpload.bitangentOffset)
1359 if (m->glUpload.textureCoordinateOffset)
1362 return sizeof(VuoPoint4d) * bufferCount;
1368 VuoPoint4d *
extractElements(CGLContextObj cgl_ctx, VuoMesh_internal *m,
unsigned int vertexCount,
unsigned int bufferStrideInBytes,
unsigned int bufferIndex)
1370 unsigned int bufferStrideInFloats = bufferStrideInBytes /
sizeof(GLfloat);
1371 GLfloat *feedback = (GLfloat *)malloc(m->glUpload.combinedBufferSize);
1372 glGetBufferSubData(GL_ARRAY_BUFFER, 0, m->glUpload.combinedBufferSize, feedback);
1374 VuoPoint4d *elements = (VuoPoint4d*)malloc(
sizeof(VuoPoint4d)*vertexCount);
1376 for (
int vertex = 0; vertex < vertexCount; vertex++)
1378 elements[vertex] = (VuoPoint4d)
1380 feedback[vertex*bufferStrideInFloats + 0 + (bufferIndex*4)],
1381 feedback[vertex*bufferStrideInFloats + 1 + (bufferIndex*4)],
1382 feedback[vertex*bufferStrideInFloats + 2 + (bufferIndex*4)],
1383 feedback[vertex*bufferStrideInFloats + 3 + (bufferIndex*4)]
1396 if (!m->glUpload.combinedBuffer
1397 || (m->positions && m->normals && m->tangents && m->bitangents && m->textureCoordinates))
1400 unsigned int vertexCount = m->vertexCount;
1403 glBindBuffer(GL_ARRAY_BUFFER, m->glUpload.combinedBuffer);
1408 int bufferIndex = 0;
1411 m->positions =
extractElements(cgl_ctx, m, vertexCount, stride, bufferIndex++);
1413 if (!m->normals && m->glUpload.normalOffset)
1414 m->normals =
extractElements(cgl_ctx, m, vertexCount, stride, bufferIndex++);
1416 if (!m->tangents && m->glUpload.tangentOffset)
1417 m->tangents =
extractElements(cgl_ctx, m, vertexCount, stride, bufferIndex++);
1419 if (!m->bitangents && m->glUpload.bitangentOffset)
1420 m->bitangents =
extractElements(cgl_ctx, m, vertexCount, stride, bufferIndex++);
1422 if (!m->textureCoordinates && m->glUpload.textureCoordinateOffset)
1423 m->textureCoordinates =
extractElements(cgl_ctx, m, vertexCount, stride, bufferIndex++);
1425 glBindBuffer(GL_ARRAY_BUFFER, 0);
1427 if (!m->elements && m->glUpload.elementBuffer)
1429 m->elements = malloc(m->glUpload.elementBufferSize);
1430 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m->glUpload.elementBuffer);
1431 glGetBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, m->glUpload.elementBufferSize, m->elements);
1432 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
1443 return VuoBox_make((VuoPoint3d){0,0,0}, (VuoPoint3d){0,0,0});
1445 VuoPoint3d min, max;
1448 VuoMesh_internal *m = (VuoMesh_internal *)mesh;
1449 unsigned int vertexCount = m->vertexCount;
1453 if(vertexCount > 0 && !init)
1459 for(
int n = 0; n < vertexCount; n++)
1463 min.x =
MIN(p.x, min.x);
1464 min.y =
MIN(p.y, min.y);
1465 min.z =
MIN(p.z, min.z);
1467 max.x =
MAX(p.x, max.x);
1468 max.y =
MAX(p.y, max.y);
1469 max.z =
MAX(p.z, max.z);
1473 return VuoBox_make((min + max) / (VuoPoint3d)(2.), max - min);
1475 return VuoBox_make( (VuoPoint3d){0,0,0}, (VuoPoint3d){0,0,0} );
1486 VuoMesh_internal *m = (VuoMesh_internal *)mesh;
1487 return m->vertexCount > 0;
1500 if (json_object_object_get_ex(js,
"pointer", &o))
1501 return (
VuoMesh)json_object_get_int64(o);
1516 json_object_object_add(js,
"pointer", json_object_new_int64((int64_t)value));
1536 return strdup(
"Empty mesh");
1538 VuoMesh_internal *m = (VuoMesh_internal *)mesh;
1540 if (!m->vertexCount)
1541 return strdup(
"Mesh without any vertices");
1544 const char * objectString =
"";
1545 const char * assemblyMethod =
" (unknown element assembly method)";
1548 assemblyMethod =
", ";
1549 objectString =
"triangle";
1554 assemblyMethod =
" in a strip of ";
1555 objectString =
"triangle";
1559 assemblyMethod =
" in a fan of ";
1560 objectString =
"triangle";
1564 assemblyMethod =
", ";
1565 objectString =
"line";
1569 assemblyMethod =
" in a strip of ";
1570 objectString =
"line";
1574 assemblyMethod =
", ";
1575 objectString =
"point";
1578 const char * vertexCountString = m->vertexCount==1 ?
"vertex" :
"vertices";
1579 const char * objectStringPlural = objectCount==1 ?
"" :
"s";
1581 char *firstPosition = NULL;
1585 char *summary =
VuoText_format(
"<div>%u %s%s%lu %s%s</div>%s<div>%s positions</div><div>%s normals</div><div>%s tangents</div><div>%s bitangents</div><div>%s texture coordinates</div>",
1586 m->vertexCount, vertexCountString, assemblyMethod, objectCount, objectString, objectStringPlural,
1587 firstPosition ? firstPosition :
"",
1588 (m->positions || m->glUpload.combinedBuffer ) ?
"✓" :
"◻",
1589 (m->normals || m->glUpload.normalOffset ) ?
"✓" :
"◻",
1590 (m->tangents || m->glUpload.tangentOffset ) ?
"✓" :
"◻",
1591 (m->bitangents || m->glUpload.bitangentOffset ) ?
"✓" :
"◻",
1592 (m->textureCoordinates || m->glUpload.textureCoordinateOffset) ?
"✓" :
"◻");
1594 free(firstPosition);