📄 毕业设计view.cpp
字号:
copies[3 * copied + 0] = vectors[3 * i + 0];
copies[3 * copied + 1] = vectors[3 * i + 1];
copies[3 * copied + 2] = vectors[3 * i + 2];
j = copied; /* pass this along for below */
copied++;
duplicate:
vectors[3 * i + 0] = (GLfloat)j;
}
*numvectors = copied-1;
return copies;
}
GLMgroup* CMyView::glmFindGroup(GLMmodel* model, char* name)
{
GLMgroup* group;
assert(model);
group = model->groups;
while(group)
{
if (!strcmp(name, group->name))
{
break;
}
group = group->next;
}
return group;
}
GLMgroup* CMyView::glmAddGroup(GLMmodel* model, char* name)
{
GLMgroup* group;
group = glmFindGroup(model, name);
if (!group)
{
group = (GLMgroup*)malloc(sizeof(GLMgroup));
group->name = strdup(name);
group->material = 0;
group->numtriangles = 0;
group->triangles = NULL;
group->next = model->groups;
model->groups = group;
model->numgroups++;
}
return group;
}
GLuint CMyView::glmFindMaterial(GLMmodel* model, char* name)
{
GLuint i;
for (i = 0; i < model->nummaterials; i++)
{
if (!strcmp(model->materials[i].name, name))
{
goto found;
}
}
printf("glmFindMaterial(): can't find material \"%s\".\n", name);
i = 0;
found:
return i;
}
char* CMyView::glmDirName(char* path)
{
char* dir;
char* s;
dir = strdup(path);
s = strrchr(dir, '/');
if (s)
{
s[1] = '\0';
}
else
{
dir[0] = '\0';
}
return dir;
}
GLvoid CMyView::glmReadMTL(GLMmodel* model, char* name)
{
FILE* file;
char* dir;
char* filename;
char buf[128];
GLuint nummaterials, i;
dir = glmDirName(model->pathname);
filename = (char*)malloc(sizeof(char) * (strlen(dir) + strlen(name) + 1));
strcpy(filename, dir);
strcat(filename, name);
free(dir);
file = fopen(filename, "r");
if (!file)
{
fprintf(stderr, "glmReadMTL() failed: can't open material file \"%s\".\n", filename);
exit(1);
}
free(filename);
nummaterials = 1;
while(fscanf(file, "%s", buf) != EOF)
{
switch(buf[0])
{
case '#': /* 注释 */
/* 舍弃该行 */
fgets(buf, sizeof(buf), file);
break;
case 'n':
fgets(buf, sizeof(buf), file);
nummaterials++;
sscanf(buf, "%s %s", buf, buf);
break;
default:
fgets(buf, sizeof(buf), file);
break;
}
}
rewind(file);
model->materials = (GLMmaterial*)malloc(sizeof(GLMmaterial) * nummaterials);
model->nummaterials = nummaterials;
for (i = 0; i < nummaterials; i++)
{
model->materials[i].name = NULL;
model->materials[i].shininess = 65.0f;
model->materials[i].diffuse[0] = 0.8f;
model->materials[i].diffuse[1] = 0.8f;
model->materials[i].diffuse[2] = 0.8f;
model->materials[i].diffuse[3] = 1.0f;
model->materials[i].ambient[0] = 0.2f;
model->materials[i].ambient[1] = 0.2f;
model->materials[i].ambient[2] = 0.2f;
model->materials[i].ambient[3] = 1.0f;
model->materials[i].specular[0] = 0.0f;
model->materials[i].specular[1] = 0.0f;
model->materials[i].specular[2] = 0.0f;
model->materials[i].specular[3] = 1.0f;
}
model->materials[0].name = strdup("default");
nummaterials = 0;
while(fscanf(file, "%s", buf) != EOF)
{
switch(buf[0])
{
case '#':
fgets(buf, sizeof(buf), file);
break;
case 'n':
fgets(buf, sizeof(buf), file);
sscanf(buf, "%s %s", buf, buf);
nummaterials++;
model->materials[nummaterials].name = strdup(buf);
break;
case 'N':
fscanf(file, "%f", &model->materials[nummaterials].shininess);
model->materials[nummaterials].shininess /= 1000.0;
model->materials[nummaterials].shininess *= 128.0;
break;
case 'K':
switch(buf[1])
{
case 'd':
fscanf(file, "%f %f %f",
&model->materials[nummaterials].diffuse[0],
&model->materials[nummaterials].diffuse[1],
&model->materials[nummaterials].diffuse[2]);
break;
case 's':
fscanf(file, "%f %f %f",
&model->materials[nummaterials].specular[0],
&model->materials[nummaterials].specular[1],
&model->materials[nummaterials].specular[2]);
break;
case 'a':
fscanf(file, "%f %f %f",
&model->materials[nummaterials].ambient[0],
&model->materials[nummaterials].ambient[1],
&model->materials[nummaterials].ambient[2]);
break;
default:
fgets(buf, sizeof(buf), file);
break;
}
break;
default:
fgets(buf, sizeof(buf), file);
break;
}
}
}
GLvoid CMyView::glmFirstPass(GLMmodel* model, FILE* file)
{
GLuint numvertices; /* 模型中顶点数目 */
GLuint numnormals; /* 模型中法向量数目 */
GLuint numtexcoords; /* 模型中纹理数目 */
GLuint numtriangles; /* 模型中三角形数目 */
GLMgroup* group; /* 当前组 */
unsigned v, n, t;
char buf[128];
group = glmAddGroup(model, "default");
numvertices = numnormals = numtexcoords = numtriangles = 0;
while(fscanf(file, "%s", buf) != EOF)
{
switch(buf[0])
{
case '#': /* 注释 */
/* 舍弃该行 */
fgets(buf, sizeof(buf), file);
break;
case 'v': /* v, vn, vt */
switch(buf[1])
{
case '\0': /* 顶点 */
/* 舍弃该行 */
fgets(buf, sizeof(buf), file);
numvertices++;
break;
case 'n':
fgets(buf, sizeof(buf), file);
numnormals++;
break;
case 't':
fgets(buf, sizeof(buf), file);
numtexcoords++;
break;
default:
printf("glmFirstPass(): Unknown token \"%s\".\n", buf);
exit(1);
break;
}
break;
case 'm':
fgets(buf, sizeof(buf), file);
sscanf(buf, "%s %s", buf, buf);
model->mtllibname = strdup(buf);
glmReadMTL(model, buf);
break;
case 'u':
fgets(buf, sizeof(buf), file);
break;
case 'g':
fgets(buf, sizeof(buf), file);
#if SINGLE_STRING_GROUP_NAMES
sscanf(buf, "%s", buf);
#else
buf[strlen(buf)-1] = '\0';
#endif
group = glmAddGroup(model, buf);
break;
case 'f': /* 面 */
v = n = t = 0;
fscanf(file, "%s", buf);
/* 面的可能组成 %d, %d//%d, %d/%d, %d/%d/%d %d//%d */
if (strstr(buf, "//"))
{
/* v//n */
sscanf(buf, "%d//%d", &v, &n);
fscanf(file, "%d//%d", &v, &n);
fscanf(file, "%d//%d", &v, &n);
numtriangles++;
group->numtriangles++;
while(fscanf(file, "%d//%d", &v, &n) > 0)
{
numtriangles++;
group->numtriangles++;
}
}
else if (sscanf(buf, "%d/%d/%d", &v, &t, &n) == 3)
{
/* v/t/n */
fscanf(file, "%d/%d/%d", &v, &t, &n);
fscanf(file, "%d/%d/%d", &v, &t, &n);
numtriangles++;
group->numtriangles++;
while(fscanf(file, "%d/%d/%d", &v, &t, &n) > 0)
{
numtriangles++;
group->numtriangles++;
}
}
else if (sscanf(buf, "%d/%d", &v, &t) == 2)
{
/* v/t */
fscanf(file, "%d/%d", &v, &t);
fscanf(file, "%d/%d", &v, &t);
numtriangles++;
group->numtriangles++;
while(fscanf(file, "%d/%d", &v, &t) > 0)
{
numtriangles++;
group->numtriangles++;
}
}
else
{
/* v */
fscanf(file, "%d", &v);
fscanf(file, "%d", &v);
numtriangles++;
group->numtriangles++;
while(fscanf(file, "%d", &v) > 0)
{
numtriangles++;
group->numtriangles++;
}
}
break;
default:
fgets(buf, sizeof(buf), file);
break;
}
}
model->numvertices = numvertices;
model->numnormals = numnormals;
model->numtexcoords = numtexcoords;
model->numtriangles = numtriangles;
/* 为每个组中的三角形分配内存 */
group = model->groups;
while(group)
{
group->triangles = (GLuint*)malloc(sizeof(GLuint) * group->numtriangles);
group->numtriangles = 0;
group = group->next;
}
}
GLvoid CMyView::glmSecondPass(GLMmodel* model, FILE* file)
{
GLuint numvertices;
GLuint numnormals;
GLuint numtexcoords;
GLuint numtriangles;
GLfloat* vertices;
GLfloat* normals;
GLfloat* texcoords;
GLMgroup* group;
GLuint material;
GLuint v, n, t;
char buf[128];
vertices = model->vertices;
normals = model->normals;
texcoords = model->texcoords;
group = model->groups;
numvertices = numnormals = numtexcoords = 1;
numtriangles = 0;
material = 0;
while(fscanf(file, "%s", buf) != EOF)
{
switch(buf[0])
{
case '#':
fgets(buf, sizeof(buf), file);
break;
case 'v': /* v, vn, vt */
switch(buf[1])
{
case '\0':
fscanf(file, "%f %f %f",
&vertices[3 * numvertices + 0],
&vertices[3 * numvertices + 1],
&vertices[3 * numvertices + 2]);
numvertices++;
break;
case 'n':
fscanf(file, "%f %f %f",
&normals[3 * numnormals + 0],
&normals[3 * numnormals + 1],
&normals[3 * numnormals + 2]);
numnormals++;
break;
case 't':
fscanf(file, "%f %f",
&texcoords[2 * numtexcoords + 0],
&texcoords[2 * numtexcoords + 1]);
numtexcoords++;
break;
}
break;
case 'u':
fgets(buf, sizeof(buf), file);
sscanf(buf, "%s %s", buf, buf);
group->material = material = glmFindMaterial(model, buf);
break;
case 'g':
fgets(buf, sizeof(buf), file);
#if SINGLE_STRING_GROUP_NAMES
sscanf(buf, "%s", buf);
#else
buf[strlen(buf)-1] = '\0';
#endif
group = glmFindGroup(model, buf);
group->material = material;
break;
case 'f':
v = n = t = 0;
fscanf(file, "%s", buf);
if (strstr(buf, "//"))
{
/* v//n */
sscanf(buf, "%d//%d", &v, &n);
T(numtriangles).vindices[0] = v;
T(numtriangles).nindices[0] = n;
fscanf(file, "%d//%d", &v, &n);
T(numtriangles).vindices[1] = v;
T(numtriangles).nindices[1] = n;
fscanf(file, "%d//%d", &v, &n);
T(numtriangles).vindices[2] = v;
T(numtriangles).nindices[2] = n;
group->triangles[group->numtriangles++] = numtriangles;
numtriangles++;
while(fscanf(file, "%d//%d", &v, &n) > 0)
{
T(numtriangles).vindices[0] = T(numtriangles-1).vindices[0];
T(numtriangles).nindices[0] = T(numtriangles-1).nindices[0];
T(numtriangles).vindices[1] = T(numtriangles-1).vindices[2];
T(numtriangles).nindices[1] = T(numtriangles-1).nindices[2];
T(numtriangles).vindices[2] = v;
T(numtriangles).nindices[2] = n;
group->triangles[group->numtriangles++] = numtriangles;
numtriangles++;
}
}
else if (sscanf(buf, "%d/%d/%d", &v, &t, &n) == 3)
{
/* v/t/n */
T(numtriangles).vindices[0] = v;
T(numtriangles).tindices[0] = t;
T(numtriangles).nindices[0] = n;
fscanf(file, "%d/%d/%d", &v, &t, &n);
T(numtriangles).vindices[1] = v;
T(numtriangles).tindices[1] = t;
T(numtriangles).nindices[1] = n;
fscanf(file, "%d/%d/%d", &v, &t, &n);
T(numtriangles).vindices[2] = v;
T(numtriangles).tindices[2] = t;
T(numtriangles).nindices[2] = n;
group->triangles[group->numtriangles++] = numtriangles;
numtriangles++;
while(fscanf(file, "%d/%d/%d", &v, &t, &n) > 0)
{
T(numtriangles).vindices[0] = T(numtriangles-1).vindices[0];
T(numtriangles).tindices[0] = T(numtriangles-1).tindices[0];
T(numtriangles).nindices[0] = T(numtriangles-1).nindices[0];
T(numtriangles).vindices[1] = T(numtriangles-1).vindices[2];
T(numtriangles).tindices[1] = T(numtriangles-1).tindices[2];
T(numtriangles).nindices[1] = T(numtriangles-1).nindices[2];
T(numtriangles).vindices[2] = v;
T(numtriangles).tindices[2] = t;
T(numtriangles).nindices[2] = n;
group->triangles[group->numtriangles++] = numtriangles;
numtriangles++;
}
}
else if (sscanf(buf, "%d/%d", &v, &t) == 2)
{
/* v/t */
T(numtriangles).vindices[0] = v;
T(numtriangles).tindices[0] = t;
fscanf(file, "%d/%d", &v, &t);
T(numtriangles).vindices[1] = v;
T(numtriangles).tindices[1] = t;
fscanf(file, "%d/%d", &v, &t);
T(numtriangles).vindices[2] = v;
T(numtriangles).tindices[2] = t;
group->triangles[group->numtriangles++] = numtriangles;
numtriangles++;
while(fscanf(file, "%d/%d", &v, &t) > 0)
{
T(numtriangles).vindices[0] = T(numtriangles-1).vindices[0];
T(numtriangles).tindices[0] = T(numtriangles-1).tindices[0];
T(numtriangles).vindices[1] = T(numtriangles-1).vindices[2];
T(numtriangles).tindices[1] = T(numtriangles-1).tindices[2];
T(numtriangles).vindices[2] = v;
T(numtriangles).tindices[2] = t;
group->triangles[group->numtriangles++] = numtriangles;
numtriangles++;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -