📄 dxf.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 + -