⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 毕业设计view.cpp

📁 毕业设计作品
💻 CPP
📖 第 1 页 / 共 5 页
字号:

    	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 + -