chiark / gitweb /
92ffcdea219f78d93dda69c959b14dcca3117c4b
[cura.git] / Cura / gui / opengl.py
1 \r
2 try:\r
3         import OpenGL\r
4         OpenGL.ERROR_CHECKING = False\r
5         from OpenGL.GLU import *\r
6         from OpenGL.GL import *\r
7         hasOpenGLlibs = True\r
8 except:\r
9         print "Failed to find PyOpenGL: http://pyopengl.sourceforge.net/"\r
10         hasOpenGLlibs = False\r
11 \r
12 def InitGL(window, view3D, zoom):\r
13         # set viewing projection\r
14         glMatrixMode(GL_MODELVIEW)\r
15         glLoadIdentity()\r
16         size = window.GetSize()\r
17         glViewport(0,0, size.GetWidth(), size.GetHeight())\r
18         \r
19         glLightfv(GL_LIGHT0, GL_POSITION, [1.0, 1.0, 1.0, 0.0])\r
20         glLightfv(GL_LIGHT1, GL_POSITION, [1.0, 1.0, 1.0, 0.0])\r
21 \r
22         glEnable(GL_NORMALIZE)\r
23         glEnable(GL_LIGHTING)\r
24         glEnable(GL_LIGHT0)\r
25         glEnable(GL_DEPTH_TEST)\r
26         glEnable(GL_CULL_FACE)\r
27         glDisable(GL_BLEND)\r
28 \r
29         glClearColor(0.0, 0.0, 0.0, 1.0)\r
30         glClearStencil(0)\r
31         glClearDepth(1.0)\r
32 \r
33         glMatrixMode(GL_PROJECTION)\r
34         glLoadIdentity()\r
35         aspect = float(size.GetWidth()) / float(size.GetHeight())\r
36         if view3D:\r
37                 gluPerspective(45.0, aspect, 1.0, 1000.0)\r
38         else:\r
39                 glOrtho(-aspect, aspect, -1, 1, -1000.0, 1000.0)\r
40 \r
41         glMatrixMode(GL_MODELVIEW)\r
42         glLoadIdentity()\r
43         glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT)\r
44 \r
45 def DrawMachine(machineSize):\r
46         glColor3f(1,1,1)\r
47         glLineWidth(4)\r
48         glDisable(GL_LIGHTING)\r
49         glBegin(GL_LINE_LOOP)\r
50         glVertex3f(0, 0, 0)\r
51         glVertex3f(machineSize.x, 0, 0)\r
52         glVertex3f(machineSize.x, machineSize.y, 0)\r
53         glVertex3f(0, machineSize.y, 0)\r
54         glEnd()\r
55         glLineWidth(2)\r
56         glBegin(GL_LINES)\r
57         for i in xrange(0, int(machineSize.x), 10):\r
58                 glVertex3f(i, 0, 0)\r
59                 glVertex3f(i, machineSize.y, 0)\r
60         for i in xrange(0, int(machineSize.y), 10):\r
61                 glVertex3f(0, i, 0)\r
62                 glVertex3f(machineSize.x, i, 0)\r
63         glEnd()\r
64         glLineWidth(1)\r
65         glBegin(GL_LINE_LOOP)\r
66         glVertex3f(0, 0, machineSize.z)\r
67         glVertex3f(machineSize.x, 0, machineSize.z)\r
68         glVertex3f(machineSize.x, machineSize.y, machineSize.z)\r
69         glVertex3f(0, machineSize.y, machineSize.z)\r
70         glEnd()\r
71         glBegin(GL_LINES)\r
72         glVertex3f(0, 0, 0)\r
73         glVertex3f(0, 0, machineSize.z)\r
74         glVertex3f(machineSize.x, 0, 0)\r
75         glVertex3f(machineSize.x, 0, machineSize.z)\r
76         glVertex3f(machineSize.x, machineSize.y, 0)\r
77         glVertex3f(machineSize.x, machineSize.y, machineSize.z)\r
78         glVertex3f(0, machineSize.y, 0)\r
79         glVertex3f(0, machineSize.y, machineSize.z)\r
80         glEnd()\r
81 \r
82         glPushMatrix()\r
83         glTranslate(-5,-5,0)\r
84         glLineWidth(2)\r
85         glColor3f(0.5,0,0)\r
86         glBegin(GL_LINES)\r
87         glVertex3f(0,0,0)\r
88         glVertex3f(20,0,0)\r
89         glEnd()\r
90         glColor3f(0,0.5,0)\r
91         glBegin(GL_LINES)\r
92         glVertex3f(0,0,0)\r
93         glVertex3f(0,20,0)\r
94         glEnd()\r
95         glColor3f(0,0,0.5)\r
96         glBegin(GL_LINES)\r
97         glVertex3f(0,0,0)\r
98         glVertex3f(0,0,20)\r
99         glEnd()\r
100 \r
101         glDisable(GL_DEPTH_TEST)\r
102         #X\r
103         glColor3f(1,0,0)\r
104         glPushMatrix()\r
105         glTranslate(23,0,0)\r
106         noZ = ResetMatrixRotationAndScale()\r
107         glBegin(GL_LINES)\r
108         glVertex3f(-0.8,1,0)\r
109         glVertex3f(0.8,-1,0)\r
110         glVertex3f(0.8,1,0)\r
111         glVertex3f(-0.8,-1,0)\r
112         glEnd()\r
113         glPopMatrix()\r
114 \r
115         #Y\r
116         glColor3f(0,1,0)\r
117         glPushMatrix()\r
118         glTranslate(0,23,0)\r
119         ResetMatrixRotationAndScale()\r
120         glBegin(GL_LINES)\r
121         glVertex3f(-0.8, 1,0)\r
122         glVertex3f( 0.0, 0,0)\r
123         glVertex3f( 0.8, 1,0)\r
124         glVertex3f(-0.8,-1,0)\r
125         glEnd()\r
126         glPopMatrix()\r
127 \r
128         #Z\r
129         if not noZ:\r
130                 glColor3f(0,0,1)\r
131                 glPushMatrix()\r
132                 glTranslate(0,0,23)\r
133                 ResetMatrixRotationAndScale()\r
134                 glBegin(GL_LINES)\r
135                 glVertex3f(-0.8, 1,0)\r
136                 glVertex3f( 0.8, 1,0)\r
137                 glVertex3f( 0.8, 1,0)\r
138                 glVertex3f(-0.8,-1,0)\r
139                 glVertex3f(-0.8,-1,0)\r
140                 glVertex3f( 0.8,-1,0)\r
141                 glEnd()\r
142                 glPopMatrix()\r
143 \r
144         glPopMatrix()\r
145         glEnable(GL_DEPTH_TEST)\r
146         \r
147 def ResetMatrixRotationAndScale():\r
148         matrix = glGetFloatv(GL_MODELVIEW_MATRIX)\r
149         noZ = False\r
150         if matrix[3][2] > 0:\r
151                 return False\r
152         scale2D = matrix[0][0]\r
153         matrix[0][0] = 1.0\r
154         matrix[1][0] = 0.0\r
155         matrix[2][0] = 0.0\r
156         matrix[0][1] = 0.0\r
157         matrix[1][1] = 1.0\r
158         matrix[2][1] = 0.0\r
159         matrix[0][2] = 0.0\r
160         matrix[1][2] = 0.0\r
161         matrix[2][2] = 1.0\r
162         \r
163         if matrix[3][2] != 0.0:\r
164                 matrix[3][0] /= -matrix[3][2] / 100\r
165                 matrix[3][1] /= -matrix[3][2] / 100\r
166                 matrix[3][2] = -100\r
167         else:\r
168                 matrix[0][0] = scale2D\r
169                 matrix[1][1] = scale2D\r
170                 matrix[2][2] = scale2D\r
171                 matrix[3][2] = -100\r
172                 noZ = True\r
173         \r
174         glLoadMatrixf(matrix)\r
175         return noZ\r
176 \r
177 def DrawBox(vMin, vMax):\r
178         glBegin(GL_LINE_LOOP)\r
179         glVertex3f(vMin.x, vMin.y, vMin.z)\r
180         glVertex3f(vMax.x, vMin.y, vMin.z)\r
181         glVertex3f(vMax.x, vMax.y, vMin.z)\r
182         glVertex3f(vMin.x, vMax.y, vMin.z)\r
183         glEnd()\r
184 \r
185         glBegin(GL_LINE_LOOP)\r
186         glVertex3f(vMin.x, vMin.y, vMax.z)\r
187         glVertex3f(vMax.x, vMin.y, vMax.z)\r
188         glVertex3f(vMax.x, vMax.y, vMax.z)\r
189         glVertex3f(vMin.x, vMax.y, vMax.z)\r
190         glEnd()\r
191         glBegin(GL_LINES)\r
192         glVertex3f(vMin.x, vMin.y, vMin.z)\r
193         glVertex3f(vMin.x, vMin.y, vMax.z)\r
194         glVertex3f(vMax.x, vMin.y, vMin.z)\r
195         glVertex3f(vMax.x, vMin.y, vMax.z)\r
196         glVertex3f(vMax.x, vMax.y, vMin.z)\r
197         glVertex3f(vMax.x, vMax.y, vMax.z)\r
198         glVertex3f(vMin.x, vMax.y, vMin.z)\r
199         glVertex3f(vMin.x, vMax.y, vMax.z)\r
200         glEnd()\r
201 \r
202 def DrawSTL(mesh):\r
203         glEnable(GL_CULL_FACE)\r
204         for face in mesh.faces:\r
205                 glBegin(GL_TRIANGLES)\r
206                 v1 = face.v[0]\r
207                 v2 = face.v[1]\r
208                 v3 = face.v[2]\r
209                 glNormal3f(face.normal.x, face.normal.y, face.normal.z)\r
210                 glVertex3f(v1.x, v1.y, v1.z)\r
211                 glVertex3f(v2.x, v2.y, v2.z)\r
212                 glVertex3f(v3.x, v3.y, v3.z)\r
213                 glNormal3f(-face.normal.x, -face.normal.y, -face.normal.z)\r
214                 glVertex3f(v1.x, v1.y, v1.z)\r
215                 glVertex3f(v3.x, v3.y, v3.z)\r
216                 glVertex3f(v2.x, v2.y, v2.z)\r
217                 glEnd()\r