/
WorldDrawer2d_gl.cpp
133 lines (114 loc) · 3.81 KB
/
WorldDrawer2d_gl.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
122
123
124
125
126
127
128
129
130
131
132
133
#include "WorldDrawer2d.h"
//static member init
CoordinateSystem2d WorldDrawer2d::cs_basis;
std::vector<CoordinateSystem2d*> WorldDrawer2d::cs_used;
void WorldDrawer2d::idleCallbackFunction(){
//call client function
onIdle();
//redisplay
glutPostRedisplay();
}
void WorldDrawer2d::reshapeCallbackFunction(int w, int h){
glViewport(0,0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
float aspect = (float)w/(float)h;
gluPerspective(90.0f, aspect, 0.1f, 300.0f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0.0, 0.0, 20.0,0.0, 0.0, 0.0, 0.0, 1.0, 0.0); //looking at xoy
}
void WorldDrawer2d::displayCallbackFunction(){
//Render objects
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
if(cs_basis.draw_axis){
//draw basis coord system
glBegin(GL_LINES);
glColor3f(0,1,1);
glVertex3f(-cs_basis.axisup.x,-cs_basis.axisup.y,0.01f);
glVertex3f(cs_basis.axisup.x,cs_basis.axisup.y,0.01f);
glColor3f(1,0,1);
glVertex3f(-cs_basis.axisright.x,-cs_basis.axisright.y,0.01f);
glVertex3f(cs_basis.axisright.x,cs_basis.axisright.y,0.01f);
glEnd();
}
//draw each used coord system
for(unsigned int i=0;i<cs_used.size();i++){
//draw used coord system
if(cs_used[i]->draw_axis){
glBegin(GL_LINES);
glColor3f(0,1,0);
glVertex3f(cs_used[i]->axiscenter.x,cs_used[i]->axiscenter.y,0.01f);
glVertex3f(cs_used[i]->axisup.x,cs_used[i]->axisup.y,0.01f);
glColor3f(1,0,0);
glVertex3f(cs_used[i]->axiscenter.x,cs_used[i]->axiscenter.y,0.01f);
glVertex3f(cs_used[i]->axisright.x,cs_used[i]->axisright.y,0.01f);
glEnd();
}
//draw objects
for(unsigned int j=0;j<cs_used[i]->objects.size();j++){
//set object color
glColor3f(cs_used[i]->objects[j]->colorx,cs_used[i]->objects[j]->colory,cs_used[i]->objects[j]->colorz);
//get data
std::vector<Point2d> points = cs_used[i]->objects[j]->points;
std::vector<int> topology = cs_used[i]->objects[j]->topology;
//draw
if(topology.size()<2){
std::cout<<"Folositi triunghiuri, dimensiune minima topologie =3"<<std::endl;
continue;
}
//obiectul
glBegin(GL_TRIANGLES);
for(unsigned int k=0;k<topology.size();k++){
int index=topology[k];
glVertex3f(points[index].x, points[index].y,0);
}
glEnd();
//axele obiectului
/*
if(cs_used[i]->objects[j]->drawaxis){
glBegin(GL_LINES);
glColor3f(0,1,0);
glVertex3f(cs_used[i]->objects[j]->axiscenter.x,cs_used[i]->objects[j]->axiscenter.y,0.01f);
glVertex3f(cs_used[i]->objects[j]->axisup.x,cs_used[i]->objects[j]->axisup.y,0.01f);
glColor3f(1,0,0);
glVertex3f(cs_used[i]->objects[j]->axiscenter.x,cs_used[i]->objects[j]->axiscenter.y,0.01f);
glVertex3f(cs_used[i]->objects[j]->axisright.x,cs_used[i]->objects[j]->axisright.y,0.01f);
glEnd();
}*/
}
}
//swap buffers
glutSwapBuffers();
}
void WorldDrawer2d::keyboardCallbackFunction(unsigned char key, int posx, int posy){
if(key==KEY_ESC) glutExit();
//call client function
onKey(key);
}
void WorldDrawer2d::keyboardSpecialCallbackFunction(int key, int posx, int posy){
//call client function
onKey(key);
}
WorldDrawer2d::WorldDrawer2d(int argc, char **argv, int windowWidth, int windowHeight, int windowStartX, int windowStartY, std::string windowName){
//init
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB|GLUT_DEPTH);
glutInitWindowSize(windowWidth,windowHeight);
glutInitWindowPosition(windowStartX,windowStartY);
glutCreateWindow(windowName.c_str());
//bind funcs
glutDisplayFunc(displayCallbackFunction);
glutReshapeFunc(reshapeCallbackFunction);
glutIdleFunc(idleCallbackFunction);
glutKeyboardFunc(keyboardCallbackFunction);
glutSpecialFunc(keyboardSpecialCallbackFunction);
glClearColor(0.4f,0.5f,1,1);
//zbuff
glEnable(GL_DEPTH_TEST);
}
void WorldDrawer2d::run(){
glutMainLoop();
}
WorldDrawer2d::~WorldDrawer2d(){
}