-
Notifications
You must be signed in to change notification settings - Fork 9
/
layer.cpp
121 lines (105 loc) · 3.78 KB
/
layer.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
#include "layer.h"
Layer::Layer(int layer, QObject *parent) :
QObject(parent)
{
this->layer_num=layer;
}
QVector3D Layer::calculateNormal(QVector3D v1, QVector3D v2, QVector3D v3){
QVector3D normal;
qreal Qx, Qy, Qz, Px, Py, Pz;
Qx = v2.x()-v1.x();
Qy = v2.y()-v1.y();
Qz = v2.z()-v1.z();
Px = v3.x()-v1.x();
Py = v3.y()-v1.y();
Pz = v3.z()-v1.z();
normal.setX(Py*Qz - Pz*Qy);
normal.setY(Pz*Qx - Px*Qz);
normal.setZ(Px*Qy - Py*Qx);
normal.normalize();
return normal;
}
void Layer::renderLine(QVector3D v1, QVector3D v2, qreal radius, qreal travel, bool last)
{
qreal dx = v2.x() - v1.x();
qreal dy = v2.y() - v1.y();
qreal perp_x = dy;
qreal perp_y= -dx;
qreal len = sqrt( perp_x*perp_x + perp_y*perp_y );
perp_x /= len;
perp_y /= len;
perp_x *= radius;
perp_y *= radius;
QVector3D normal_left= calculateNormal(v1,v2,QVector3D(v1.x(),v1.y(),v1.z()+radius));
// Get the current color
glBegin(GL_TRIANGLE_STRIP);
glNormal3f( 0.0f, 0.0, -1.0f);
glVertex3f(v1.x(), v1.y(), v1.z()); // V0
glVertex3f(v2.x(), v2.y(), v1.z()); // V1
glVertex3f( v1.x()+perp_x, v1.y()+perp_y, v1.z()); // V2
glVertex3f( v2.x()+perp_x, v2.y()+perp_y, v1.z());
glNormal3f( -normal_left.x(), -normal_left.y(), normal_left.z());
glVertex3f( v1.x()+perp_x, v1.y()+perp_y, v1.z()+radius); // V2
glVertex3f( v2.x()+perp_x, v2.y()+perp_y, v1.z()+radius);
glNormal3f( 0.0f, 0.0, 1.0f);
glVertex3f(v1.x(), v1.y(), v1.z()+radius); // V0
glVertex3f(v2.x(), v2.y(), v1.z()+radius); // V1
glNormal3f( normal_left.x(), normal_left.y(), normal_left.z());
glVertex3f(v1.x(), v1.y(), v1.z()); // V0
glVertex3f(v2.x(), v2.y(), v1.z()); // V1
glEnd();
}
void Layer::display(float scale, bool last, bool show_travel, int current_layer){
GLfloat gray[4]={0.9,0.9,0.9,1.0};
GLfloat red[4]={1.0,0.0,0.0,1.0};
GLfloat green[4]={0.0,1.0,0.0,1.0};
GLfloat blue[4]={0.0,0.0,1.0,1.0};
GLfloat orange[4]={1.0,0.5,0.0,1.0};
GLfloat fCurrentColor[4];
glGetFloatv(GL_CURRENT_COLOR, fCurrentColor);
if(last && current_layer!=this->layer_num)
glColor4fv(red);
else{
glColor4fv(gray);
//current and printer layer coloring for travel moves
if(current_layer>this->layer_num)
glColor4fv(green);
else{
if(current_layer==this->layer_num)
glColor4fv(orange);
}
}
glCallList(this->list_index);
if(show_travel){
glColor4fv(blue);
glCallList(this->list_index+1);
}
glColor4fv(fCurrentColor);
}
void Layer::render(float scale){
//generate model list
GLuint index = glGenLists(2);
this->list_index=index;
qDebug() << this->list_index;
// compile the display list, store a triangle in it
glNewList(index, GL_COMPILE);
for(int j=0; j<vertexes.size()-1; j++){
if(vertexes.at(j+1).w()==1)
continue;
renderLine(vertexes.at(j).toVector3D()*scale,vertexes.at(j+1).toVector3D()*scale,0.3*scale,vertexes.at(j+1).w(),false);
}
glEndList();
//generate travel list
// compile the display list, store a triangle in it
glNewList(index+1, GL_COMPILE);
for(int j=0; j<vertexes.size()-1; j++){
if(vertexes.at(j+1).w()==0)
continue;
renderLine(vertexes.at(j).toVector3D()*scale,vertexes.at(j+1).toVector3D()*scale,0.3*scale,vertexes.at(j+1).w(),false);
}
glEndList();
this->vertexes.clear();
}
void Layer::freeLists(){
glDeleteLists(this->list_index, 2);
}