0024858: Convert class V3d_ListOfTransient to non-CDL
[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_CONFIG_H
22   #include <config.h>
23 #endif
24
25 #ifdef HAVE_GL2PS
26   #include <gl2ps.h>
27 #endif
28
29 #define DOT_LS       0xCCCC
30 #define DASH_DOT_LS  0xFF18
31 #define DASH_LS      0xFFC0
32 #define DASH_DDOT_LS 0xFF24
33
34 static const unsigned int myInteriors[TEL_HS_USER_DEF_START][32] =
35 {
36   //TEL_HS_SOLID
37   {
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     0xFFFFFFFF,
67     0xFFFFFFFF,
68     0xFFFFFFFF,
69     0xFFFFFFFF
70   },
71   //TEL_HS_CROSS
72   {
73     0xFFFFFFFF,
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     0xEEEEEEEE,
102     0xBBBBBBBB,
103     0xEEEEEEEE,
104     0xBBBBBBBB
105   },
106   //TEL_HS_CROSS_SPARSE
107   {
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     0x81818181,
137     0x24242424,
138     0x18181818,
139     0x42424242
140   },
141   //TEL_HS_GRID
142   {
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     0xFFFFFFFF,
172     0x88888888,
173     0xFFFFFFFF,
174     0x88888888
175   },
176   //TEL_HS_GRID_SPARSE
177   {
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     0xFFFFFFFF,
207     0x80808080,
208     0x80808080,
209     0x80808080
210   },
211   //TEL_HS_DIAG_45
212   {
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     0x88888888,
242     0x22222222,
243     0x88888888,
244     0x22222222
245   },
246   //TEL_HS_DIAG_135
247   {
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     0x11111111,
277     0x44444444,
278     0x11111111,
279     0x44444444
280   },
281   //TEL_HS_HORIZONTAL
282   {
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     0xFFFFFFFF,
312     0x00000000,
313     0xFFFFFFFF,
314     0x00000000
315   },
316   //TEL_HS_VERTICAL
317   {
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     0x11111111,
347     0x11111111,
348     0x11111111,
349     0x11111111
350   },
351   //TEL_HS_DIAG_45_SPARSE
352   {
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     0x80808080,
382     0x20202020,
383     0x08080808,
384     0x02020202
385   },
386   //TEL_HS_DIAG_135_SPARSE
387   {
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     0x01010101,
417     0x04040404,
418     0x10101010,
419     0x40404040
420   },
421   //TEL_HS_HORIZONTAL_SPARSE
422   {
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     0xFFFFFFFF,
452     0x00000000,
453     0x00000000,
454     0x00000000
455   },
456   //TEL_HS_VERTICAL_SPARSE
457   {
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     0x10101010,
487     0x10101010,
488     0x10101010,
489     0x10101010
490   }
491 };
492
493 IMPLEMENT_STANDARD_HANDLE (OpenGl_LineAttributes, OpenGl_Resource)
494 IMPLEMENT_STANDARD_RTTIEXT(OpenGl_LineAttributes, OpenGl_Resource)
495
496 // =======================================================================
497 // function : OpenGl_LineAttributes
498 // purpose  :
499 // =======================================================================
500 OpenGl_LineAttributes::OpenGl_LineAttributes()
501 : myLinestyleBase(0),
502   myPatternBase(0)
503 {
504   //
505 }
506
507 // =======================================================================
508 // function : ~OpenGl_LineAttributes
509 // purpose  :
510 // =======================================================================
511 OpenGl_LineAttributes::~OpenGl_LineAttributes()
512 {
513   Release (NULL);
514 }
515
516 // =======================================================================
517 // function : Release
518 // purpose  :
519 // =======================================================================
520 void OpenGl_LineAttributes::Release (const OpenGl_Context* theGlCtx)
521 {
522   // Delete line styles
523   if (myLinestyleBase != 0)
524   {
525     if (theGlCtx->IsValid())
526     {
527       glDeleteLists ((GLuint )myLinestyleBase, 5);
528     }
529     myLinestyleBase = 0;
530   }
531   // Delete surface patterns
532   if (myPatternBase != 0)
533   {
534     if (theGlCtx->IsValid())
535     {
536       glDeleteLists ((GLuint )myPatternBase, TEL_HS_USER_DEF_START);
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   myLinestyleBase = theGlCtx->core11->glGenLists (5);
555
556   // Line
557   glNewList ((GLuint )myLinestyleBase + (GLuint )Aspect_TOL_DASH, GL_COMPILE);
558   glLineStipple (1,  DASH_LS);
559   glEndList();
560
561   glNewList ((GLuint )myLinestyleBase + (GLuint )Aspect_TOL_DOT, GL_COMPILE);
562   glLineStipple (1,  DOT_LS);
563   glEndList();
564
565   glNewList ((GLuint )myLinestyleBase + (GLuint )Aspect_TOL_DOTDASH, GL_COMPILE);
566   glLineStipple (1,  DASH_DOT_LS);
567   glEndList();
568
569   glNewList ((GLuint )myLinestyleBase + (GLuint )Aspect_TOL_USERDEFINED, GL_COMPILE);
570   glLineStipple (1,  DASH_DDOT_LS);
571   glEndList();
572
573   // GL_POLYGON_STIPPLE need 32x32 stipple patterns
574   const int nbi = sizeof(myInteriors) / (32 * sizeof(unsigned int));
575   myPatternBase = glGenLists(TEL_HS_USER_DEF_START);
576   for (int i = 1; i < TEL_HS_USER_DEF_START; i++)
577   {
578     glNewList ((GLuint )myPatternBase + i, GL_COMPILE);
579     glPolygonStipple ((const GLubyte* )myInteriors[i < nbi ? i : 0]);
580     glEndList();
581   }
582 }
583
584 // =======================================================================
585 // function : SetTypeOfLine
586 // purpose  :
587 // =======================================================================
588 void OpenGl_LineAttributes::SetTypeOfLine (const Aspect_TypeOfLine theType) const
589 {
590   if (theType != Aspect_TOL_SOLID)
591   {
592     glCallList ((GLuint )myLinestyleBase + (GLuint )theType);
593     glEnable (GL_LINE_STIPPLE);
594   #ifdef HAVE_GL2PS
595     gl2psEnable (GL2PS_LINE_STIPPLE);
596   #endif
597   }
598   else
599   {
600     glDisable (GL_LINE_STIPPLE);
601   #ifdef HAVE_GL2PS
602     gl2psDisable (GL2PS_LINE_STIPPLE);
603   #endif
604   }
605 }
606
607 // =======================================================================
608 // function : SetTypeOfHatch
609 // purpose  :
610 // =======================================================================
611 void OpenGl_LineAttributes::SetTypeOfHatch (const int theType) const
612 {
613   if (theType != 0)
614   {
615     glCallList ((GLuint )myPatternBase + (GLuint )theType);
616     glEnable (GL_POLYGON_STIPPLE);
617   }
618   else
619     glDisable (GL_POLYGON_STIPPLE);
620 }