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

📄 dxf.cpp

📁 motion_blur using opengl
💻 CPP
字号:
// dxf.cpp: implementation of the dxf class.
//
//////////////////////////////////////////////////////////////////////

#include "dxf.h"

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

dxf::dxf()
{
	error = 1;
}

dxf::dxf(char *file_name)
{
	sub=NULL;

	for(int i=0; i<MAX_LEVEL; i++)
	{
		ZeroMemory( &level[i],sizeof(Slevel) );
	}
	sub = fopen(file_name,"r");
	if(sub == NULL){ error = 1; return;}
	
	Int();
	String();		// nacitanie textu
	if(error)return;

	if(strcmp(t,"SECTION") || c!=0)
	{
		MessageBox(NULL,"Chybny zaciatok suboru","Chyba",MB_OK); 
		error=1; 
		fclose(sub);
		return;
	}

	while(1)
	{
		while(strcmp(t,"3DFACE"))
		{
			String();		// nacitanie textu
			if(error||!strcmp(t,"EOF"))	break;
		}
		if(error||!strcmp(t,"EOF")) break;
		// sme v 3DFACE
		LoadFace();
		if(error)return;
	}
	fclose(sub);

	for(i=0; i<MAX_LEVEL; i++)		// zez vsetky levely
	{
		if(level[i].texturing)				// ak je v levely textura
		{
			for(int j=0; j<strlen(level[i].name); j++)	// nahradenie '_' '.'
			{
				if(level[i].name[j]=='_') level[i].name[j]='.';
			}
			if( !LoadTexture(level[i].name, &level[i].texture))
			{
				level[i].texturing=0;
			//	level[i].color[0] = 1.0f;
			//	level[i].color[1] = 1.0f;
			//	level[i].color[2] = 1.0f;
			//	level[i].color[3] = 1.0f;
		//		MessageBox(NULL,"Nenajdena textura",level[i].name,MB_OK);
			//	error=1;
			}
		}
	}
}

dxf::~dxf()
{
	for(int i=0; i<MAX_LEVEL; i++)
	{
		if(level[i].texturing)	glDeleteTextures( 1, &level[i].texture);
	}
}

void dxf::String()
{
	
	if( fgets( t, 100, sub ) == NULL) 
	{
		MessageBox(NULL,"Predcasny koniec suboru.","Chyba",MB_OK); 
		error=1; 
		fclose(sub);
		return;
	}
	{
		char pom[100];
		int r,s=0,l;
		
		l = strlen(t);
		for(r=0; r<l+1; r++)		// vratane 0
		{
			if(t[r]!='\n' && t[r]!=' ') 
				pom[s++] = t[r];
		}
		l = strlen(pom);
		for(r=0; r<l+1; r++) t[r] = pom[r];
	}
}

void dxf::Int()
{
	char s[10];

	if( fgets( s, 10, sub ) == NULL) 
	{
		MessageBox(NULL,"Predcasny koniec suboru.","Chyba",MB_OK); 
		error=1; 
		fclose(sub);
		return;
	}
	c = atoi(s);
}

float dxf::Float()
{
	char s[30];

	if( fgets( s, 30, sub ) == NULL) 
	{
		MessageBox(NULL,"Predcasny koniec suboru.","Chyba",MB_OK); 
		error=1; 
		fclose(sub);
		return 0.0f;
	}
	return atof(s);
}

void dxf::LoadFace()
{
	int lev=-1;
	face4	f;

	while(strcmp(t,"10") && strcmp(t,"8"))
	{
		String();		// nacitanie textu
		if(error)return;
	}

	if(!strcmp(t,"8"))						// je meno levelu
	{
		String();
		for(int i=0; i<MAX_LEVEL; i++)		// zez vsetky levely
		{
			if(level[i].texturing)				// ak je v levely textura
			{
				if(!strcmp(t,level[i].name))	// ak sa jej meno zhoduje
				{
					lev = i;				// pouzijeme tento level
					i = MAX_LEVEL;
				}
			}
		}
		if(lev<0) lev = -2;
	}

	if(lev==-2)								// musime pouzit novy level
	{
		for(int i=0; i<MAX_LEVEL; i++)
		{
			if(level[i].num_face==0)			// hladame prazny level
			{
				lev = i;
				i=MAX_LEVEL;				// ukoncime prehladavanie
				// nastavime meno textury
				strcpy(level[lev].name,t);
				level[lev].texturing=1;
			}
		}
	}

	if(lev==-1)								// pouzijeme prvy level bez textury
	{
		for(int i=0; i<MAX_LEVEL; i++)
		{
			if(!level[i].texturing)			// vyhladavame level bez textury
			{
				lev = i;
				i=MAX_LEVEL;				// ukoncime prehladavanie
			}
		}
	}

	if(lev<0)
	{
		MessageBox(NULL,"Nie je miesto pre dalsie levely","ERROR",MB_OK);
		fclose(sub);
		error=1;
		return;
	}

	while(strcmp(t,"10"))
	{
		String();		// nacitanie textu
		if(error)return;
	}

	f.v[0].x = Float();	// 10
	if(error)return;
	String(); if(error)return;
	f.v[0].y = Float();	// 20
	if(error)return;
	String(); if(error)return;
	f.v[0].z = Float();	// 30
	if(error)return;
	
	for(int i=1; i<4; i++)
	{
		String(); if(error)return;
		f.v[i].x = Float();	// 1i
		if(error)return;
		String(); if(error)return;
		f.v[i].y = Float();	// 2i
		if(error)return;
		String(); if(error)return;
		f.v[i].z = Float();	// 3i
		if(error)return;
	}

	{	// vypocet normaloveho vektora
		XYZ		p1,p2;
		float length;

		p1.x = f.v[1].x - f.v[0].x;
		p1.y = f.v[1].y - f.v[0].y;
		p1.z = f.v[1].z - f.v[0].z;

		p2.x = f.v[2].x - f.v[1].x;
		p2.y = f.v[2].y - f.v[1].y;
		p2.z = f.v[2].z - f.v[1].z;

		f.n.x = p1.y*p2.z - p1.z*p2.y;
		f.n.y = p1.z*p2.x - p1.x*p2.z;
		f.n.z = p1.x*p2.y - p1.y*p2.x;
	
		length = (float) sqrt(f.n.x * f.n.x + f.n.y * f.n.y + f.n.z * f.n.z);
		if (length != 0) {
			f.n.x /= length;
			f.n.y /= length;
			f.n.z /= length;
		} else {
			f.n.x = 0;
			f.n.y = 0;
			f.n.z = 0;
		}
	}

	level[lev].num_face++;
	level[lev].face.push_back(f);
}

void dxf::Render(int texturing)
{
	float a[4][2]=
	{
		{0,0},
		{1,0},
		{1,1},
		{0,1}
	};

	for(int lev=0; lev<MAX_LEVEL; lev++)
	{
		if(level[lev].num_face==0)continue;
		if(level[lev].texturing && texturing)
		{
			glEnable(GL_TEXTURE_2D);
			glBindTexture(GL_TEXTURE_2D,level[lev].texture);
		}
		else
		{
			glDisable(GL_TEXTURE_2D);
			if( (level[lev].color[0]+level[lev].color[1]+level[lev].color[2])!=0)
			{
				glColor4fv(level[lev].color);
			}
		}
		//glBegin(GL_TRIANGLES );
		//glBegin(GL_TRIANGLE_STRIP );
		for(int i=0; i<level[lev].num_face; i++)
		{
			

		/*	glTexCoord2fv(&a[0][0]);
			glVertex3fv(&level[lev].face[i].v[0].x);

			glTexCoord2fv(&a[1][0]);
			glVertex3fv(&level[lev].face[i].v[1].x);

			glTexCoord2fv(&a[2][0]);
			glVertex3fv(&level[lev].face[i].v[2].x);

			
			glTexCoord2fv(&a[0][0]);
			glVertex3fv(&level[lev].face[i].v[0].x);

			glTexCoord2fv(&a[2][0]);
			glVertex3fv(&level[lev].face[i].v[2].x);

			glTexCoord2fv(&a[3][0]);
			glVertex3fv(&level[lev].face[i].v[3].x);
		*/
			glBegin(GL_TRIANGLE_STRIP );
			glNormal3fv(&level[lev].face[i].n.x);

			glTexCoord2fv(&a[1][0]);
			glVertex3fv(&level[lev].face[i].v[1].x);

			glTexCoord2fv(&a[0][0]);
			glVertex3fv(&level[lev].face[i].v[0].x);

			glTexCoord2fv(&a[2][0]);
			glVertex3fv(&level[lev].face[i].v[2].x);

			glTexCoord2fv(&a[3][0]);
			glVertex3fv(&level[lev].face[i].v[3].x);

			glEnd();
		}
	//	glEnd();
	}
	if(texturing)glEnable(GL_TEXTURE_2D);
}

void dxf::Render_line()
{
	glDisable(GL_TEXTURE_2D);

	for(int lev=0; lev<MAX_LEVEL; lev++)
	{
		if(level[lev].num_face==0)continue;
/*		if(level[lev].texturing)
		{
			
			glBindTexture(GL_TEXDTURE_2D,level[lev].texture);
		}
		else
		{
			
			if( (level[lev].color[0]+level[lev].color[1]+level[lev].color[2])!=0)
			{
				glColor4fv(level[lev].color);
			}
		}
*/
		for(int i=0; i<level[lev].num_face; i++)
		{
		glBegin(GL_LINE_LOOP  );
			glVertex3fv(&level[lev].face[i].v[0].x);
			glVertex3fv(&level[lev].face[i].v[1].x);
			glVertex3fv(&level[lev].face[i].v[2].x);
		glEnd();
		glBegin(GL_LINE_LOOP  );
			glVertex3fv(&level[lev].face[i].v[0].x);
			glVertex3fv(&level[lev].face[i].v[2].x);
			glVertex3fv(&level[lev].face[i].v[3].x);
		glEnd();
		}
	}
	glEnable(GL_TEXTURE_2D);
}

void dxf::Render_visible_line(float dx,float dy,float dz)
{
/*	float length;

	length = (float) sqrt(dx * dx + dy * dy + dz * dz);
	if (length != 0) {
		dx /= length;
		dy /= length;
		dz /= length;
	} else {
		dx = 0;
		dy = 0;
		dz = 0;
	}
*/
	glDisable(GL_TEXTURE_2D);
	glColor3f(0.0f,0,0);

	for(int lev=0; lev<MAX_LEVEL; lev++)
	{
		if(level[lev].num_face==0)continue;
		for(int i=0; i<level[lev].num_face; i++)
		{
			
			glBegin(GL_TRIANGLE_STRIP );

			glVertex3fv(&level[lev].face[i].v[1].x);
			glVertex3fv(&level[lev].face[i].v[0].x);
			glVertex3fv(&level[lev].face[i].v[2].x);
			glVertex3fv(&level[lev].face[i].v[3].x);

			glEnd();
		}
	}
	glEnable(GL_TEXTURE_2D);
	glColor3f(1,1,1);
	glPushMatrix();
	glTranslatef(dx,-dz,dy);
	Render_line();
	glPopMatrix();
}

void dxf::Render_normals(void)
{
	XYZ		a;
	glDisable(GL_TEXTURE_2D);
	glColor3f(1,1,0);
	glBegin(GL_LINES  );
	for(int lev=0; lev<MAX_LEVEL; lev++)
	{
		if(level[lev].num_face==0)continue;
		for(int i=0; i<level[lev].num_face; i++)
		{
			a.x = 0.5f*(level[lev].face[i].v[0].x+level[lev].face[i].v[2].x);
			a.y = 0.5f*(level[lev].face[i].v[0].y+level[lev].face[i].v[2].y);
			a.z = 0.5f*(level[lev].face[i].v[0].z+level[lev].face[i].v[2].z);
			
			glVertex3fv(&a.x);
			glVertex3f(a.x+0.3f*level[lev].face[i].n.x,a.y+0.3f*level[lev].face[i].n.y,a.z+0.3f*level[lev].face[i].n.z);
		}
	}
	glEnd();
	glEnable(GL_TEXTURE_2D);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -