Lines Matching refs:model

30 #define T(x) model->triangles[(x)]
197 /* _glmFindGroup: Find a group in the model
200 _glmFindGroup(GLMmodel* model, char* name)
204 assert(model);
206 group = model->groups;
216 /* _glmAddGroup: Add a group to the model
219 _glmAddGroup(GLMmodel* model, char* name)
223 group = _glmFindGroup(model, name);
230 group->next = model->groups;
231 model->groups = group;
232 model->numgroups++;
238 /* _glmFindGroup: Find a material in the model
241 _glmFindMaterial(GLMmodel* model, char* name)
245 for (i = 0; i < model->nummaterials; i++) {
246 if (!strcmp(model->materials[i].name, name))
285 * model - properly initialized GLMmodel structure
289 _glmReadMTL(GLMmodel* model, char* name)
298 dir = _glmDirName(model->pathname);
336 model->materials = (GLMmaterial*)calloc(nummaterials, sizeof(GLMmaterial));
337 model->nummaterials = nummaterials;
341 model->materials[i].name = NULL;
342 model->materials[i].shininess = 0;
343 model->materials[i].diffuse[0] = 0.8;
344 model->materials[i].diffuse[1] = 0.8;
345 model->materials[i].diffuse[2] = 0.8;
346 model->materials[i].diffuse[3] = 1.0;
347 model->materials[i].ambient[0] = 0.2;
348 model->materials[i].ambient[1] = 0.2;
349 model->materials[i].ambient[2] = 0.2;
350 model->materials[i].ambient[3] = 0.0;
351 model->materials[i].specular[0] = 0.0;
352 model->materials[i].specular[1] = 0.0;
353 model->materials[i].specular[2] = 0.0;
354 model->materials[i].specular[3] = 0.0;
356 model->materials[0].name = stralloc("default");
361 mat = &model->materials[nummaterials];
373 model->materials[nummaterials].name = stralloc(buf);
376 fscanf(file, "%f", &model->materials[nummaterials].shininess);
378 model->materials[nummaterials].shininess /= 1000.0;
379 model->materials[nummaterials].shininess *= 128.0;
380 mat = &model->materials[nummaterials];
386 &model->materials[nummaterials].diffuse[0],
387 &model->materials[nummaterials].diffuse[1],
388 &model->materials[nummaterials].diffuse[2]);
392 &model->materials[nummaterials].specular[0],
393 &model->materials[nummaterials].specular[1],
394 &model->materials[nummaterials].specular[2]);
398 &model->materials[nummaterials].ambient[0],
399 &model->materials[nummaterials].ambient[1],
400 &model->materials[nummaterials].ambient[2]);
410 &model->materials[nummaterials].diffuse[3]);
430 * model - properly initialized GLMmodel structure
431 * modelpath - pathname of the model being written
435 _glmWriteMTL(GLMmodel* model, char* modelpath, char* mtllibname)
467 for (i = 0; i < model->nummaterials; i++) {
468 material = &model->materials[i];
484 * statistics of the model (such as #vertices, #normals, etc)
486 * model - properly initialized GLMmodel structure
490 _glmFirstPass(GLMmodel* model, FILE* file)
492 uint numvertices; /* number of vertices in model */
493 uint numnormals; /* number of normals in model */
494 uint numtexcoords; /* number of texcoords in model */
495 uint numtriangles; /* number of triangles in model */
501 group = _glmAddGroup(model, "default");
536 model->mtllibname = stralloc(buf);
537 _glmReadMTL(model, buf);
547 group = _glmAddGroup(model, buf);
605 /* announce the model statistics */
610 printf(" Groups: %d\n", model->numgroups);
613 /* set the stats in the model structure */
614 model->numvertices = numvertices;
615 model->numnormals = numnormals;
616 model->numtexcoords = numtexcoords;
617 model->numtriangles = numtriangles;
620 group = model->groups;
631 * model - properly initialized GLMmodel structure
635 _glmSecondPass(GLMmodel* model, FILE* file)
637 uint numvertices; /* number of vertices in model */
638 uint numnormals; /* number of normals in model */
639 uint numtexcoords; /* number of texcoords in model */
640 uint numtriangles; /* number of triangles in model */
650 vertices = model->vertices;
651 normals = model->normals;
652 texcoords = model->texcoords;
653 group = model->groups;
693 material = _glmFindMaterial(model, buf);
702 group = _glmFindGroup(model, buf);
825 /* glmUnitize: "unitize" a model by translating it to the origin and
829 * model - properly initialized GLMmodel structure
832 glmUnitize(GLMmodel* model)
839 assert(model);
840 assert(model->vertices);
843 maxx = minx = model->vertices[3 + X];
844 maxy = miny = model->vertices[3 + Y];
845 maxz = minz = model->vertices[3 + Z];
846 for (i = 1; i <= model->numvertices; i++) {
847 if (maxx < model->vertices[3 * i + X])
848 maxx = model->vertices[3 * i + X];
849 if (minx > model->vertices[3 * i + X])
850 minx = model->vertices[3 * i + X];
852 if (maxy < model->vertices[3 * i + Y])
853 maxy = model->vertices[3 * i + Y];
854 if (miny > model->vertices[3 * i + Y])
855 miny = model->vertices[3 * i + Y];
857 if (maxz < model->vertices[3 * i + Z])
858 maxz = model->vertices[3 * i + Z];
859 if (minz > model->vertices[3 * i + Z])
860 minz = model->vertices[3 * i + Z];
863 /* calculate model width, height, and depth */
868 /* calculate center of the model */
877 for (i = 1; i <= model->numvertices; i++) {
878 model->vertices[3 * i + X] -= cx;
879 model->vertices[3 * i + Y] -= cy;
880 model->vertices[3 * i + Z] -= cz;
881 model->vertices[3 * i + X] *= scale;
882 model->vertices[3 * i + Y] *= scale;
883 model->vertices[3 * i + Z] *= scale;
890 * a model.
892 * model - initialized GLMmodel structure
896 glmDimensions(GLMmodel* model, float* dimensions)
901 assert(model);
902 assert(model->vertices);
906 maxx = minx = model->vertices[3 + X];
907 maxy = miny = model->vertices[3 + Y];
908 maxz = minz = model->vertices[3 + Z];
909 for (i = 1; i <= model->numvertices; i++) {
910 if (maxx < model->vertices[3 * i + X])
911 maxx = model->vertices[3 * i + X];
912 if (minx > model->vertices[3 * i + X])
913 minx = model->vertices[3 * i + X];
915 if (maxy < model->vertices[3 * i + Y])
916 maxy = model->vertices[3 * i + Y];
917 if (miny > model->vertices[3 * i + Y])
918 miny = model->vertices[3 * i + Y];
920 if (maxz < model->vertices[3 * i + Z])
921 maxz = model->vertices[3 * i + Z];
922 if (minz > model->vertices[3 * i + Z])
923 minz = model->vertices[3 * i + Z];
926 /* calculate model width, height, and depth */
932 /* glmScale: Scales a model by a given amount.
934 * model - properly initialized GLMmodel structure
938 glmScale(GLMmodel* model, float scale)
942 for (i = 1; i <= model->numvertices; i++) {
943 model->vertices[3 * i + X] *= scale;
944 model->vertices[3 * i + Y] *= scale;
945 model->vertices[3 * i + Z] *= scale;
950 * this model. Default winding is counter-clockwise. Also changes
953 * model - properly initialized GLMmodel structure
956 glmReverseWinding(GLMmodel* model)
960 assert(model);
962 for (i = 0; i < model->numtriangles; i++) {
967 if (model->numnormals) {
973 if (model->numtexcoords) {
981 for (i = 1; i <= model->numfacetnorms; i++) {
982 model->facetnorms[3 * i + X] = -model->facetnorms[3 * i + X];
983 model->facetnorms[3 * i + Y] = -model->facetnorms[3 * i + Y];
984 model->facetnorms[3 * i + Z] = -model->facetnorms[3 * i + Z];
988 for (i = 1; i <= model->numnormals; i++) {
989 model->normals[3 * i + X] = -model->normals[3 * i + X];
990 model->normals[3 * i + Y] = -model->normals[3 * i + Y];
991 model->normals[3 * i + Z] = -model->normals[3 * i + Z];
995 /* glmFacetNormals: Generates facet normals for a model (by taking the
999 * model - initialized GLMmodel structure
1002 glmFacetNormals(GLMmodel* model)
1008 assert(model);
1009 assert(model->vertices);
1012 if (model->facetnorms)
1013 free(model->facetnorms);
1016 model->numfacetnorms = model->numtriangles;
1017 model->facetnorms = (float*)malloc(sizeof(float) *
1018 3 * (model->numfacetnorms + 1));
1020 for (i = 0; i < model->numtriangles; i++) {
1021 model->triangles[i].findex = i+1;
1023 u[X] = model->vertices[3 * T(i).vindices[1] + X] -
1024 model->vertices[3 * T(i).vindices[0] + X];
1025 u[Y] = model->vertices[3 * T(i).vindices[1] + Y] -
1026 model->vertices[3 * T(i).vindices[0] + Y];
1027 u[Z] = model->vertices[3 * T(i).vindices[1] + Z] -
1028 model->vertices[3 * T(i).vindices[0] + Z];
1030 v[X] = model->vertices[3 * T(i).vindices[2] + X] -
1031 model->vertices[3 * T(i).vindices[0] + X];
1032 v[Y] = model->vertices[3 * T(i).vindices[2] + Y] -
1033 model->vertices[3 * T(i).vindices[0] + Y];
1034 v[Z] = model->vertices[3 * T(i).vindices[2] + Z] -
1035 model->vertices[3 * T(i).vindices[0] + Z];
1037 _glmCross(u, v, &model->facetnorms[3 * (i+1)]);
1038 _glmNormalize(&model->facetnorms[3 * (i+1)]);
1042 /* glmVertexNormals: Generates smooth vertex normals for a model.
1053 * use depends on the model, but 90 degrees is usually a good start.
1055 * model - initialized GLMmodel structure
1059 glmVertexNormals(GLMmodel* model, float angle)
1070 assert(model);
1071 assert(model->facetnorms);
1077 if (model->normals)
1078 free(model->normals);
1081 model->numnormals = model->numtriangles * 3; /* 3 normals per triangle */
1082 model->normals = (float*)malloc(sizeof(float)* 3* (model->numnormals+1));
1086 members = (GLMnode**)malloc(sizeof(GLMnode*) * (model->numvertices + 1));
1087 for (i = 1; i <= model->numvertices; i++)
1091 for (i = 0; i < model->numtriangles; i++) {
1110 for (i = 1; i <= model->numvertices; i++) {
1123 dot = _glmDot(&model->facetnorms[3 * T(node->index).findex],
1124 &model->facetnorms[3 * T(members[i]->index).findex]);
1127 average[0] += model->facetnorms[3 * T(node->index).findex + 0];
1128 average[1] += model->facetnorms[3 * T(node->index).findex + 1];
1129 average[2] += model->facetnorms[3 * T(node->index).findex + 2];
1142 model->normals[3 * numnormals + 0] = average[0];
1143 model->normals[3 * numnormals + 1] = average[1];
1144 model->normals[3 * numnormals + 2] = average[2];
1162 model->normals[3 * numnormals + 0] =
1163 model->facetnorms[3 * T(node->index).findex + 0];
1164 model->normals[3 * numnormals + 1] =
1165 model->facetnorms[3 * T(node->index).findex + 1];
1166 model->normals[3 * numnormals + 2] =
1167 model->facetnorms[3 * T(node->index).findex + 2];
1180 model->numnormals = numnormals - 1;
1183 for (i = 1; i <= model->numvertices; i++) {
1197 normals = model->normals;
1198 model->normals = (float*)malloc(sizeof(float)* 3* (model->numnormals+1));
1199 for (i = 1; i <= model->numnormals; i++) {
1200 model->normals[3 * i + 0] = normals[3 * i + 0];
1201 model->normals[3 * i + 1] = normals[3 * i + 1];
1202 model->normals[3 * i + 2] = normals[3 * i + 2];
1206 printf("glmVertexNormals(): %d normals generated\n", model->numnormals);
1214 * model - pointer to initialized GLMmodel structure
1217 glmLinearTexture(GLMmodel* model)
1224 assert(model);
1226 if (model->texcoords)
1227 free(model->texcoords);
1228 model->numtexcoords = model->numvertices;
1229 model->texcoords=(float*)malloc(sizeof(float)*2*(model->numtexcoords+1));
1231 glmDimensions(model, dimensions);
1236 for(i = 1; i <= model->numvertices; i++) {
1237 x = model->vertices[3 * i + 0] * scalefactor;
1238 y = model->vertices[3 * i + 2] * scalefactor;
1239 model->texcoords[2 * i + 0] = (x + 1.0) / 2.0;
1240 model->texcoords[2 * i + 1] = (y + 1.0) / 2.0;
1244 group = model->groups;
1256 model->numtexcoords);
1269 * model - pointer to initialized GLMmodel structure
1272 glmSpheremapTexture(GLMmodel* model)
1278 assert(model);
1279 assert(model->normals);
1281 if (model->texcoords)
1282 free(model->texcoords);
1283 model->numtexcoords = model->numnormals;
1284 model->texcoords=(float*)malloc(sizeof(float)*2*(model->numtexcoords+1));
1287 for (i = 1; i <= model->numnormals; i++) {
1288 z = model->normals[3 * i + 0]; /* re-arrange for pole distortion */
1289 y = model->normals[3 * i + 1];
1290 x = model->normals[3 * i + 2];
1316 model->texcoords[2 * i + 0] = theta / M_PI;
1317 model->texcoords[2 * i + 1] = phi / M_PI;
1321 group = model->groups;
1333 model->numtexcoords);
1339 * model - initialized GLMmodel structure
1342 glmDelete(GLMmodel* model)
1347 assert(model);
1349 if (model->pathname) free(model->pathname);
1350 if (model->mtllibname) free(model->mtllibname);
1351 if (model->vertices) free(model->vertices);
1352 if (model->normals) free(model->normals);
1353 if (model->texcoords) free(model->texcoords);
1354 if (model->facetnorms) free(model->facetnorms);
1355 if (model->triangles) free(model->triangles);
1356 if (model->materials) {
1357 for (i = 0; i < model->nummaterials; i++)
1358 free(model->materials[i].name);
1360 free(model->materials);
1361 while(model->groups) {
1362 group = model->groups;
1363 model->groups = model->groups->next;
1369 free(model);
1393 /* glmReadOBJ: Reads a model description from a Wavefront .OBJ file.
1402 GLMmodel* model;
1414 /* announce the model name */
1418 /* allocate a new model */
1419 model = (GLMmodel*)malloc(sizeof(GLMmodel));
1420 model->pathname = stralloc(filename);
1421 model->mtllibname = NULL;
1422 model->numvertices = 0;
1423 model->vertices = NULL;
1424 model->numnormals = 0;
1425 model->normals = NULL;
1426 model->numtexcoords = 0;
1427 model->texcoords = NULL;
1428 model->numfacetnorms = 0;
1429 model->facetnorms = NULL;
1430 model->numtriangles = 0;
1431 model->triangles = NULL;
1432 model->nummaterials = 0;
1433 model->materials = NULL;
1434 model->numgroups = 0;
1435 model->groups = NULL;
1436 model->position[0] = 0.0;
1437 model->position[1] = 0.0;
1438 model->position[2] = 0.0;
1439 model->scale = 1.0;
1443 _glmFirstPass(model, file);
1446 model->vertices = (float*)malloc(sizeof(float) *
1447 3 * (model->numvertices + 1));
1448 model->triangles = (GLMtriangle*)malloc(sizeof(GLMtriangle) *
1449 model->numtriangles);
1450 if (model->numnormals) {
1451 model->normals = (float*)malloc(sizeof(float) *
1452 3 * (model->numnormals + 1));
1454 if (model->numtexcoords) {
1455 model->texcoords = (float*)malloc(sizeof(float) *
1456 2 * (model->numtexcoords + 1));
1462 _glmSecondPass(model, file);
1467 if (!model->materials) {
1468 model->materials = glmDefaultMaterial();
1469 model->nummaterials = 1;
1472 return model;
1475 /* glmWriteOBJ: Writes a model description in Wavefront .OBJ format to
1478 * model - initialized GLMmodel structure
1491 glmWriteOBJ(GLMmodel* model, char* filename, uint mode)
1497 assert(model);
1500 if (mode & GLM_FLAT && !model->facetnorms) {
1505 if (mode & GLM_SMOOTH && !model->normals) {
1510 if (mode & GLM_TEXTURE && !model->texcoords) {
1538 if (mode & GLM_MATERIAL && model->mtllibname) {
1539 fprintf(file, "\nmtllib %s\n\n", model->mtllibname);
1540 _glmWriteMTL(model, filename, model->mtllibname);
1545 fprintf(file, "# %d vertices\n", model->numvertices);
1546 for (i = 1; i <= model->numvertices; i++) {
1548 model->vertices[3 * i + 0],
1549 model->vertices[3 * i + 1],
1550 model->vertices[3 * i + 2]);
1556 fprintf(file, "# %d normals\n", model->numnormals);
1557 for (i = 1; i <= model->numnormals; i++) {
1559 model->normals[3 * i + 0],
1560 model->normals[3 * i + 1],
1561 model->normals[3 * i + 2]);
1565 fprintf(file, "# %d normals\n", model->numfacetnorms);
1566 for (i = 1; i <= model->numnormals; i++) {
1568 model->facetnorms[3 * i + 0],
1569 model->facetnorms[3 * i + 1],
1570 model->facetnorms[3 * i + 2]);
1577 fprintf(file, "# %d texcoords\n", model->numtexcoords);
1578 for (i = 1; i <= model->numtexcoords; i++) {
1580 model->texcoords[2 * i + 0],
1581 model->texcoords[2 * i + 1]);
1586 fprintf(file, "# %d groups\n", model->numgroups);
1587 fprintf(file, "# %d faces (triangles)\n", model->numtriangles);
1590 group = model->groups;
1594 fprintf(file, "usemtl %s\n", model->materials[group->material].name);
1656 * model - initialized GLMmodel structure
1658 * ( 0.00001 is a good start for a unitized model)
1662 glmWeld(GLMmodel* model, float epsilon)
1670 numvectors = model->numvertices;
1671 vectors = model->vertices;
1675 model->numvertices - numvectors - 1);
1677 for (i = 0; i < model->numtriangles; i++) {
1687 model->numvertices = numvectors;
1688 model->vertices = (float*)malloc(sizeof(float) *
1689 3 * (model->numvertices + 1));
1692 for (i = 1; i <= model->numvertices; i++) {
1693 model->vertices[3 * i + 0] = copies[3 * i + 0];
1694 model->vertices[3 * i + 1] = copies[3 * i + 1];
1695 model->vertices[3 * i + 2] = copies[3 * i + 2];
1703 glmReIndex(GLMmodel *model)
1709 const uint numv = model->numvertices;
1711 if (model->numnormals > 0)
1714 if (model->numtexcoords > 0)
1717 for (group = model->groups; group; group = group->next) {
1733 float *nrm = &model->normals[nindex * 3];
1734 float *tex = &model->texcoords[tindex * 2];
1761 free(model->normals);
1762 model->normals = newNormals;
1763 model->numnormals = model->numvertices;
1767 free(model->texcoords);
1768 model->texcoords = newTexcoords;
1769 model->numtexcoords = model->numvertices;
1776 glmPrint(const GLMmodel *model)
1784 printf("%u vertices\n", model->numvertices);
1785 printf("%u normals\n", model->numnormals);
1786 printf("%u texcoords\n", model->numtexcoords);
1788 for (group = model->groups; group; group = group->next, grp++) {
1795 model->materials[group->material].ambient);
1797 model->materials[group->material].diffuse);
1799 model->materials[group->material].specular);
1801 model->materials[group->material].shininess);
1805 glColor3fv(model->materials[group->material].diffuse);
1842 if (model->numnormals) {
1843 numvectors = model->numnormals;
1844 vectors = model->normals;
1848 model->numnormals - numvectors);
1850 for (i = 0; i < model->numtriangles; i++) {
1860 model->numnormals = numvectors;
1861 model->normals = (float*)malloc(sizeof(float) *
1862 3 * (model->numnormals + 1));
1865 for (i = 1; i <= model->numnormals; i++) {
1866 model->normals[3 * i + 0] = copies[3 * i + 0];
1867 model->normals[3 * i + 1] = copies[3 * i + 1];
1868 model->normals[3 * i + 2] = copies[3 * i + 2];
1875 if (model->numtexcoords) {
1876 numvectors = model->numtexcoords;
1877 vectors = model->texcoords;
1881 model->numtexcoords - numvectors);
1883 for (i = 0; i < model->numtriangles; i++) {
1893 model->numtexcoords = numvectors;
1894 model->texcoords = (float*)malloc(sizeof(float) *
1895 2 * (model->numtexcoords + 1));
1898 for (i = 1; i <= model->numtexcoords; i++) {
1899 model->texcoords[2 * i + 0] = copies[2 * i + 0];
1900 model->texcoords[2 * i + 1] = copies[2 * i + 1];
1911 for (i = 1; i <= model->numvertices; i++) {
1912 for (j = 0; j < model->numtriangles; i++) {