0025854: Visualization, TKOpenGl - add option to request Core profile 3.2+
[occt.git] / src / OpenGl / OpenGl_LineAttributes.cxx
1 // Created on: 2011-10-25
2 // Created by: Sergey ZERCHANINOV
3 // Copyright (c) 2011-2014 OPEN CASCADE SAS
4 //
5 // This file is part of Open CASCADE Technology software library.
6 //
7 // This library is free software; you can redistribute it and/or modify it under
8 // the terms of the GNU Lesser General Public License version 2.1 as published
9 // by the Free Software Foundation, with special exception defined in the file
10 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
11 // distribution for complete text of the license and disclaimer of any warranty.
12 //
13 // Alternatively, this file may be used under the terms of Open CASCADE
14 // commercial license or contractual agreement.
15
16 #include <OpenGl_GlCore11.hxx>
17
18 #include <OpenGl_LineAttributes.hxx>
19 #include <OpenGl_Context.hxx>
20
21 #ifdef HAVE_GL2PS
22   #include <gl2ps.h>
23 #endif
24
25 #define DOT_LS       0xCCCC
26 #define DASH_DOT_LS  0xFF18
27 #define DASH_LS      0xFFC0
28 #define DASH_DDOT_LS 0xFF24
29
30 static const unsigned int myInteriors[TEL_HS_USER_DEF_START][32] =
31 {
32   //TEL_HS_SOLID
33   {
34     0xFFFFFFFF,
35     0xFFFFFFFF,
36     0xFFFFFFFF,
37     0xFFFFFFFF,
38     0xFFFFFFFF,
39     0xFFFFFFFF,
40     0xFFFFFFFF,
41     0xFFFFFFFF,
42     0xFFFFFFFF,
43     0xFFFFFFFF,
44     0xFFFFFFFF,
45     0xFFFFFFFF,
46     0xFFFFFFFF,
47     0xFFFFFFFF,
48     0xFFFFFFFF,
49     0xFFFFFFFF,
50     0xFFFFFFFF,
51     0xFFFFFFFF,
52     0xFFFFFFFF,
53     0xFFFFFFFF,
54     0xFFFFFFFF,
55     0xFFFFFFFF,
56     0xFFFFFFFF,
57     0xFFFFFFFF,
58     0xFFFFFFFF,
59     0xFFFFFFFF,
60     0xFFFFFFFF,
61     0xFFFFFFFF,
62     0xFFFFFFFF,
63     0xFFFFFFFF,
64     0xFFFFFFFF,
65     0xFFFFFFFF
66   },
67   //TEL_HS_CROSS
68   {
69     0xFFFFFFFF,
70     0xBBBBBBBB,
71     0xEEEEEEEE,
72     0xBBBBBBBB,
73     0xEEEEEEEE,
74     0xBBBBBBBB,
75     0xEEEEEEEE,
76     0xBBBBBBBB,
77     0xEEEEEEEE,
78     0xBBBBBBBB,
79     0xEEEEEEEE,
80     0xBBBBBBBB,
81     0xEEEEEEEE,
82     0xBBBBBBBB,
83     0xEEEEEEEE,
84     0xBBBBBBBB,
85     0xEEEEEEEE,
86     0xBBBBBBBB,
87     0xEEEEEEEE,
88     0xBBBBBBBB,
89     0xEEEEEEEE,
90     0xBBBBBBBB,
91     0xEEEEEEEE,
92     0xBBBBBBBB,
93     0xEEEEEEEE,
94     0xBBBBBBBB,
95     0xEEEEEEEE,
96     0xBBBBBBBB,
97     0xEEEEEEEE,
98     0xBBBBBBBB,
99     0xEEEEEEEE,
100     0xBBBBBBBB
101   },
102   //TEL_HS_CROSS_SPARSE
103   {
104     0x81818181,
105     0x24242424,
106     0x18181818,
107     0x42424242,
108     0x81818181,
109     0x24242424,
110     0x18181818,
111     0x42424242,
112     0x81818181,
113     0x24242424,
114     0x18181818,
115     0x42424242,
116     0x81818181,
117     0x24242424,
118     0x18181818,
119     0x42424242,
120     0x81818181,
121     0x24242424,
122     0x18181818,
123     0x42424242,
124     0x81818181,
125     0x24242424,
126     0x18181818,
127     0x42424242,
128     0x81818181,
129     0x24242424,
130     0x18181818,
131     0x42424242,
132     0x81818181,
133     0x24242424,
134     0x18181818,
135     0x42424242
136   },
137   //TEL_HS_GRID
138   {
139     0xFFFFFFFF,
140     0x88888888,
141     0xFFFFFFFF,
142     0x88888888,
143     0xFFFFFFFF,
144     0x88888888,
145     0xFFFFFFFF,
146     0x88888888,
147     0xFFFFFFFF,
148     0x88888888,
149     0xFFFFFFFF,
150     0x88888888,
151     0xFFFFFFFF,
152     0x88888888,
153     0xFFFFFFFF,
154     0x88888888,
155     0xFFFFFFFF,
156     0x88888888,
157     0xFFFFFFFF,
158     0x88888888,
159     0xFFFFFFFF,
160     0x88888888,
161     0xFFFFFFFF,
162     0x88888888,
163     0xFFFFFFFF,
164     0x88888888,
165     0xFFFFFFFF,
166     0x88888888,
167     0xFFFFFFFF,
168     0x88888888,
169     0xFFFFFFFF,
170     0x88888888
171   },
172   //TEL_HS_GRID_SPARSE
173   {
174     0xFFFFFFFF,
175     0x80808080,
176     0x80808080,
177     0x80808080,
178     0xFFFFFFFF,
179     0x80808080,
180     0x80808080,
181     0x80808080,
182     0xFFFFFFFF,
183     0x80808080,
184     0x80808080,
185     0x80808080,
186     0xFFFFFFFF,
187     0x80808080,
188     0x80808080,
189     0x80808080,
190     0xFFFFFFFF,
191     0x80808080,
192     0x80808080,
193     0x80808080,
194     0xFFFFFFFF,
195     0x80808080,
196     0x80808080,
197     0x80808080,
198     0xFFFFFFFF,
199     0x80808080,
200     0x80808080,
201     0x80808080,
202     0xFFFFFFFF,
203     0x80808080,
204     0x80808080,
205     0x80808080
206   },
207   //TEL_HS_DIAG_45
208   {
209     0x88888888,
210     0x22222222,
211     0x88888888,
212     0x22222222,
213     0x88888888,
214     0x22222222,
215     0x88888888,
216     0x22222222,
217     0x88888888,
218     0x22222222,
219     0x88888888,
220     0x22222222,
221     0x88888888,
222     0x22222222,
223     0x88888888,
224     0x22222222,
225     0x88888888,
226     0x22222222,
227     0x88888888,
228     0x22222222,
229     0x88888888,
230     0x22222222,
231     0x88888888,
232     0x22222222,
233     0x88888888,
234     0x22222222,
235     0x88888888,
236     0x22222222,
237     0x88888888,
238     0x22222222,
239     0x88888888,
240     0x22222222
241   },
242   //TEL_HS_DIAG_135
243   {
244     0x11111111,
245     0x44444444,
246     0x11111111,
247     0x44444444,
248     0x11111111,
249     0x44444444,
250     0x11111111,
251     0x44444444,
252     0x11111111,
253     0x44444444,
254     0x11111111,
255     0x44444444,
256     0x11111111,
257     0x44444444,
258     0x11111111,
259     0x44444444,
260     0x11111111,
261     0x44444444,
262     0x11111111,
263     0x44444444,
264     0x11111111,
265     0x44444444,
266     0x11111111,
267     0x44444444,
268     0x11111111,
269     0x44444444,
270     0x11111111,
271     0x44444444,
272     0x11111111,
273     0x44444444,
274     0x11111111,
275     0x44444444
276   },
277   //TEL_HS_HORIZONTAL
278   {
279     0xFFFFFFFF,
280     0x00000000,
281     0xFFFFFFFF,
282     0x00000000,
283     0xFFFFFFFF,
284     0x00000000,
285     0xFFFFFFFF,
286     0x00000000,
287     0xFFFFFFFF,
288     0x00000000,
289     0xFFFFFFFF,
290     0x00000000,
291     0xFFFFFFFF,
292     0x00000000,
293     0xFFFFFFFF,
294     0x00000000,
295     0xFFFFFFFF,
296     0x00000000,
297     0xFFFFFFFF,
298     0x00000000,
299     0xFFFFFFFF,
300     0x00000000,
301     0xFFFFFFFF,
302     0x00000000,
303     0xFFFFFFFF,
304     0x00000000,
305     0xFFFFFFFF,
306     0x00000000,
307     0xFFFFFFFF,
308     0x00000000,
309     0xFFFFFFFF,
310     0x00000000
311   },
312   //TEL_HS_VERTICAL
313   {
314     0x11111111,
315     0x11111111,
316     0x11111111,
317     0x11111111,
318     0x11111111,
319     0x11111111,
320     0x11111111,
321     0x11111111,
322     0x11111111,
323     0x11111111,
324     0x11111111,
325     0x11111111,
326     0x11111111,
327     0x11111111,
328     0x11111111,
329     0x11111111,
330     0x11111111,
331     0x11111111,
332     0x11111111,
333     0x11111111,
334     0x11111111,
335     0x11111111,
336     0x11111111,
337     0x11111111,
338     0x11111111,
339     0x11111111,
340     0x11111111,
341     0x11111111,
342     0x11111111,
343     0x11111111,
344     0x11111111,
345     0x11111111
346   },
347   //TEL_HS_DIAG_45_SPARSE
348   {
349     0x80808080,
350     0x20202020,
351     0x08080808,
352     0x02020202,
353     0x80808080,
354     0x20202020,
355     0x08080808,
356     0x02020202,
357     0x80808080,
358     0x20202020,
359     0x08080808,
360     0x02020202,
361     0x80808080,
362     0x20202020,
363     0x08080808,
364     0x02020202,
365     0x80808080,
366     0x20202020,
367     0x08080808,
368     0x02020202,
369     0x80808080,
370     0x20202020,
371     0x08080808,
372     0x02020202,
373     0x80808080,
374     0x20202020,
375     0x08080808,
376     0x02020202,
377     0x80808080,
378     0x20202020,
379     0x08080808,
380     0x02020202
381   },
382   //TEL_HS_DIAG_135_SPARSE
383   {
384     0x01010101,
385     0x04040404,
386     0x10101010,
387     0x40404040,
388     0x01010101,
389     0x04040404,
390     0x10101010,
391     0x40404040,
392     0x01010101,
393     0x04040404,
394     0x10101010,
395     0x40404040,
396     0x01010101,
397     0x04040404,
398     0x10101010,
399     0x40404040,
400     0x01010101,
401     0x04040404,
402     0x10101010,
403     0x40404040,
404     0x01010101,
405     0x04040404,
406     0x10101010,
407     0x40404040,
408     0x01010101,
409     0x04040404,
410     0x10101010,
411     0x40404040,
412     0x01010101,
413     0x04040404,
414     0x10101010,
415     0x40404040
416   },
417   //TEL_HS_HORIZONTAL_SPARSE
418   {
419     0xFFFFFFFF,
420     0x00000000,
421     0x00000000,
422     0x00000000,
423     0xFFFFFFFF,
424     0x00000000,
425     0x00000000,
426     0x00000000,
427     0xFFFFFFFF,
428     0x00000000,
429     0x00000000,
430     0x00000000,
431     0xFFFFFFFF,
432     0x00000000,
433     0x00000000,
434     0x00000000,
435     0xFFFFFFFF,
436     0x00000000,
437     0x00000000,
438     0x00000000,
439     0xFFFFFFFF,
440     0x00000000,
441     0x00000000,
442     0x00000000,
443     0xFFFFFFFF,
444     0x00000000,
445     0x00000000,
446     0x00000000,
447     0xFFFFFFFF,
448     0x00000000,
449     0x00000000,
450     0x00000000
451   },
452   //TEL_HS_VERTICAL_SPARSE
453   {
454     0x10101010,
455     0x10101010,
456     0x10101010,
457     0x10101010,
458     0x10101010,
459     0x10101010,
460     0x10101010,
461     0x10101010,
462     0x10101010,
463     0x10101010,
464     0x10101010,
465     0x10101010,
466     0x10101010,
467     0x10101010,
468     0x10101010,
469     0x10101010,
470     0x10101010,
471     0x10101010,
472     0x10101010,
473     0x10101010,
474     0x10101010,
475     0x10101010,
476     0x10101010,
477     0x10101010,
478     0x10101010,
479     0x10101010,
480     0x10101010,
481     0x10101010,
482     0x10101010,
483     0x10101010,
484     0x10101010,
485     0x10101010
486   }
487 };
488
489 IMPLEMENT_STANDARD_HANDLE (OpenGl_LineAttributes, OpenGl_Resource)
490 IMPLEMENT_STANDARD_RTTIEXT(OpenGl_LineAttributes, OpenGl_Resource)
491
492 // =======================================================================
493 // function : OpenGl_LineAttributes
494 // purpose  :
495 // =======================================================================
496 OpenGl_LineAttributes::OpenGl_LineAttributes()
497 : myLinestyleBase(0),
498   myPatternBase(0)
499 {
500   //
501 }
502
503 // =======================================================================
504 // function : ~OpenGl_LineAttributes
505 // purpose  :
506 // =======================================================================
507 OpenGl_LineAttributes::~OpenGl_LineAttributes()
508 {
509   Release (NULL);
510 }
511
512 // =======================================================================
513 // function : Release
514 // purpose  :
515 // =======================================================================
516 void OpenGl_LineAttributes::Release (OpenGl_Context* theGlCtx)
517 {
518   // Delete line styles
519   if (myLinestyleBase != 0)
520   {
521     if (theGlCtx->IsValid())
522     {
523     #if !defined(GL_ES_VERSION_2_0)
524       glDeleteLists ((GLuint )myLinestyleBase, 5);
525     #endif
526     }
527     myLinestyleBase = 0;
528   }
529   // Delete surface patterns
530   if (myPatternBase != 0)
531   {
532     if (theGlCtx->IsValid())
533     {
534     #if !defined(GL_ES_VERSION_2_0)
535       glDeleteLists ((GLuint )myPatternBase, TEL_HS_USER_DEF_START);
536     #endif
537     }
538     myPatternBase = 0;
539   }
540 }
541
542 // =======================================================================
543 // function : Init
544 // purpose  :
545 // =======================================================================
546 void OpenGl_LineAttributes::Init (const Handle(OpenGl_Context)& theGlCtx)
547 {
548   // Return if already initialized
549   if (myLinestyleBase != 0)
550   {
551     return;
552   }
553
554 #if !defined(GL_ES_VERSION_2_0)
555   if (theGlCtx->core11 == NULL)
556   {
557     return;
558   }
559
560   myLinestyleBase = theGlCtx->core11->glGenLists (5);
561
562   // Line
563   glNewList ((GLuint )myLinestyleBase + (GLuint )Aspect_TOL_DASH, GL_COMPILE);
564   glLineStipple (1,  DASH_LS);
565   glEndList();
566
567   glNewList ((GLuint )myLinestyleBase + (GLuint )Aspect_TOL_DOT, GL_COMPILE);
568   glLineStipple (1,  DOT_LS);
569   glEndList();
570
571   glNewList ((GLuint )myLinestyleBase + (GLuint )Aspect_TOL_DOTDASH, GL_COMPILE);
572   glLineStipple (1,  DASH_DOT_LS);
573   glEndList();
574
575   glNewList ((GLuint )myLinestyleBase + (GLuint )Aspect_TOL_USERDEFINED, GL_COMPILE);
576   glLineStipple (1,  DASH_DDOT_LS);
577   glEndList();
578
579   // GL_POLYGON_STIPPLE need 32x32 stipple patterns
580   const int nbi = sizeof(myInteriors) / (32 * sizeof(unsigned int));
581   myPatternBase = glGenLists(TEL_HS_USER_DEF_START);
582   for (int i = 1; i < TEL_HS_USER_DEF_START; i++)
583   {
584     glNewList ((GLuint )myPatternBase + i, GL_COMPILE);
585     glPolygonStipple ((const GLubyte* )myInteriors[i < nbi ? i : 0]);
586     glEndList();
587   }
588 #endif
589 }
590
591 // =======================================================================
592 // function : SetTypeOfLine
593 // purpose  :
594 // =======================================================================
595 void OpenGl_LineAttributes::SetTypeOfLine (const Aspect_TypeOfLine theType) const
596 {
597 #if !defined(GL_ES_VERSION_2_0)
598   if (theType != Aspect_TOL_SOLID)
599   {
600     if (myLinestyleBase != 0)
601     {
602       glCallList ((GLuint )myLinestyleBase + (GLuint )theType);
603       glEnable (GL_LINE_STIPPLE);
604     }
605   #ifdef HAVE_GL2PS
606     gl2psEnable (GL2PS_LINE_STIPPLE);
607   #endif
608   }
609   else
610   {
611     if (myLinestyleBase != 0)
612     {
613       glDisable (GL_LINE_STIPPLE);
614     }
615   #ifdef HAVE_GL2PS
616     gl2psDisable (GL2PS_LINE_STIPPLE);
617   #endif
618   }
619 #endif
620 }
621
622 // =======================================================================
623 // function : SetTypeOfHatch
624 // purpose  :
625 // =======================================================================
626 void OpenGl_LineAttributes::SetTypeOfHatch (const int theType) const
627 {
628 #if !defined(GL_ES_VERSION_2_0)
629   if (theType != 0)
630   {
631     glCallList ((GLuint )myPatternBase + (GLuint )theType);
632     glEnable (GL_POLYGON_STIPPLE);
633   }
634   else
635     glDisable (GL_POLYGON_STIPPLE);
636 #endif
637 }