1 // Created on: 2011-07-14
2 // Created by: Sergey ZERCHANINOV
3 // Copyright (c) 2011-2014 OPEN CASCADE SAS
5 // This file is part of Open CASCADE Technology software library.
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.
13 // Alternatively, this file may be used under the terms of Open CASCADE
14 // commercial license or contractual agreement.
16 #include <OpenGl_AspectMarker.hxx>
17 #include <OpenGl_Context.hxx>
18 #include <OpenGl_GraphicDriver.hxx>
19 #include <OpenGl_PointSprite.hxx>
20 #include <OpenGl_ShaderManager.hxx>
21 #include <OpenGl_ShaderProgram.hxx>
22 #include <OpenGl_Workspace.hxx>
24 #include <Image_PixMap.hxx>
25 #include <Graphic3d_MarkerImage.hxx>
26 #include <Graphic3d_ShaderProgram.hxx>
27 #include <NCollection_Vec4.hxx>
28 #include <TColStd_HArray1OfByte.hxx>
32 static const TEL_COLOUR myDefaultColor = {{ 1.0F, 1.0F, 1.0F, 1.0F }};
33 static const TCollection_AsciiString THE_EMPTY_KEY;
36 // Following Section relates to default markers
38 #define TEL_NO_OF_SIZES 13
39 #define TEL_PM_START_SIZE 1.0
40 #define TEL_PM_END_SIZE 7.0
47 typedef PM_FONT_INFO* pm_font_info;
49 #define PM_PLUS_10_NUM 9*2
50 #define PM_PLUS_15_NUM 11*2
51 #define PM_PLUS_20_NUM 13*2
52 #define PM_PLUS_25_NUM 15*2
53 #define PM_PLUS_30_NUM 17*3
54 #define PM_PLUS_35_NUM 19*3
55 #define PM_PLUS_40_NUM 21*3
56 #define PM_PLUS_45_NUM 23*3
57 #define PM_PLUS_50_NUM 25*4
58 #define PM_PLUS_55_NUM 27*4
59 #define PM_PLUS_60_NUM 29*4
60 #define PM_PLUS_65_NUM 31*4
61 #define PM_PLUS_70_NUM 32*4
63 #define PM_STAR_10_NUM 9
64 #define PM_STAR_15_NUM 11*2
65 #define PM_STAR_20_NUM 13*2
66 #define PM_STAR_25_NUM 15*2
67 #define PM_STAR_30_NUM 17*2
68 #define PM_STAR_35_NUM 19*2
69 #define PM_STAR_40_NUM 21*3
70 #define PM_STAR_45_NUM 23*3
71 #define PM_STAR_50_NUM 25*3
72 #define PM_STAR_55_NUM 27*3
73 #define PM_STAR_60_NUM 29*4
74 #define PM_STAR_65_NUM 32*4
75 #define PM_STAR_70_NUM 32*4
77 #define PM_CIRC_10_NUM 7
78 #define PM_CIRC_15_NUM 9*2
79 #define PM_CIRC_20_NUM 9*2
80 #define PM_CIRC_25_NUM 11*2
81 #define PM_CIRC_30_NUM 13*2
82 #define PM_CIRC_35_NUM 15*2
83 #define PM_CIRC_40_NUM 17*3
84 #define PM_CIRC_45_NUM 19*3
85 #define PM_CIRC_50_NUM 21*3
86 #define PM_CIRC_55_NUM 23*3
87 #define PM_CIRC_60_NUM 25*4
88 #define PM_CIRC_65_NUM 27*4
89 #define PM_CIRC_70_NUM 29*4
91 #define PM_CROSS_10_NUM 7
92 #define PM_CROSS_15_NUM 9*2
93 #define PM_CROSS_20_NUM 11*2
94 #define PM_CROSS_25_NUM 13*2
95 #define PM_CROSS_30_NUM 15*2
96 #define PM_CROSS_35_NUM 17*3
97 #define PM_CROSS_40_NUM 19*3
98 #define PM_CROSS_45_NUM 21*3
99 #define PM_CROSS_50_NUM 23*3
100 #define PM_CROSS_55_NUM 25*4
101 #define PM_CROSS_60_NUM 27*4
102 #define PM_CROSS_65_NUM 32*4
103 #define PM_CROSS_70_NUM 32*4
105 #define PM_PLUS_10_OFT 0
106 #define PM_PLUS_15_OFT PM_PLUS_10_OFT + PM_PLUS_10_NUM
107 #define PM_PLUS_20_OFT PM_PLUS_15_OFT + PM_PLUS_15_NUM
108 #define PM_PLUS_25_OFT PM_PLUS_20_OFT + PM_PLUS_20_NUM
109 #define PM_PLUS_30_OFT PM_PLUS_25_OFT + PM_PLUS_25_NUM
110 #define PM_PLUS_35_OFT PM_PLUS_30_OFT + PM_PLUS_30_NUM
111 #define PM_PLUS_40_OFT PM_PLUS_35_OFT + PM_PLUS_35_NUM
112 #define PM_PLUS_45_OFT PM_PLUS_40_OFT + PM_PLUS_40_NUM
113 #define PM_PLUS_50_OFT PM_PLUS_45_OFT + PM_PLUS_45_NUM
114 #define PM_PLUS_55_OFT PM_PLUS_50_OFT + PM_PLUS_50_NUM
115 #define PM_PLUS_60_OFT PM_PLUS_55_OFT + PM_PLUS_55_NUM
116 #define PM_PLUS_65_OFT PM_PLUS_60_OFT + PM_PLUS_60_NUM
117 #define PM_PLUS_70_OFT PM_PLUS_65_OFT + PM_PLUS_65_NUM
119 #define PM_STAR_10_OFT PM_PLUS_70_OFT + PM_PLUS_70_NUM
120 #define PM_STAR_15_OFT PM_STAR_10_OFT + PM_STAR_10_NUM
121 #define PM_STAR_20_OFT PM_STAR_15_OFT + PM_STAR_15_NUM
122 #define PM_STAR_25_OFT PM_STAR_20_OFT + PM_STAR_20_NUM
123 #define PM_STAR_30_OFT PM_STAR_25_OFT + PM_STAR_25_NUM
124 #define PM_STAR_35_OFT PM_STAR_30_OFT + PM_STAR_30_NUM
125 #define PM_STAR_40_OFT PM_STAR_35_OFT + PM_STAR_35_NUM
126 #define PM_STAR_45_OFT PM_STAR_40_OFT + PM_STAR_40_NUM
127 #define PM_STAR_50_OFT PM_STAR_45_OFT + PM_STAR_45_NUM
128 #define PM_STAR_55_OFT PM_STAR_50_OFT + PM_STAR_50_NUM
129 #define PM_STAR_60_OFT PM_STAR_55_OFT + PM_STAR_55_NUM
130 #define PM_STAR_65_OFT PM_STAR_60_OFT + PM_STAR_60_NUM
131 #define PM_STAR_70_OFT PM_STAR_65_OFT + PM_STAR_65_NUM
133 #define PM_CIRC_10_OFT PM_STAR_70_OFT + PM_STAR_70_NUM
134 #define PM_CIRC_15_OFT PM_CIRC_10_OFT + PM_CIRC_10_NUM
135 #define PM_CIRC_20_OFT PM_CIRC_15_OFT + PM_CIRC_15_NUM
136 #define PM_CIRC_25_OFT PM_CIRC_20_OFT + PM_CIRC_20_NUM
137 #define PM_CIRC_30_OFT PM_CIRC_25_OFT + PM_CIRC_25_NUM
138 #define PM_CIRC_35_OFT PM_CIRC_30_OFT + PM_CIRC_30_NUM
139 #define PM_CIRC_40_OFT PM_CIRC_35_OFT + PM_CIRC_35_NUM
140 #define PM_CIRC_45_OFT PM_CIRC_40_OFT + PM_CIRC_40_NUM
141 #define PM_CIRC_50_OFT PM_CIRC_45_OFT + PM_CIRC_45_NUM
142 #define PM_CIRC_55_OFT PM_CIRC_50_OFT + PM_CIRC_50_NUM
143 #define PM_CIRC_60_OFT PM_CIRC_55_OFT + PM_CIRC_55_NUM
144 #define PM_CIRC_65_OFT PM_CIRC_60_OFT + PM_CIRC_60_NUM
145 #define PM_CIRC_70_OFT PM_CIRC_65_OFT + PM_CIRC_65_NUM
147 #define PM_CROSS_10_OFT PM_CIRC_70_OFT + PM_CIRC_70_NUM
148 #define PM_CROSS_15_OFT PM_CROSS_10_OFT + PM_CROSS_10_NUM
149 #define PM_CROSS_20_OFT PM_CROSS_15_OFT + PM_CROSS_15_NUM
150 #define PM_CROSS_25_OFT PM_CROSS_20_OFT + PM_CROSS_20_NUM
151 #define PM_CROSS_30_OFT PM_CROSS_25_OFT + PM_CROSS_25_NUM
152 #define PM_CROSS_35_OFT PM_CROSS_30_OFT + PM_CROSS_30_NUM
153 #define PM_CROSS_40_OFT PM_CROSS_35_OFT + PM_CROSS_35_NUM
154 #define PM_CROSS_45_OFT PM_CROSS_40_OFT + PM_CROSS_40_NUM
155 #define PM_CROSS_50_OFT PM_CROSS_45_OFT + PM_CROSS_45_NUM
156 #define PM_CROSS_55_OFT PM_CROSS_50_OFT + PM_CROSS_50_NUM
157 #define PM_CROSS_60_OFT PM_CROSS_55_OFT + PM_CROSS_55_NUM
158 #define PM_CROSS_65_OFT PM_CROSS_60_OFT + PM_CROSS_60_NUM
159 #define PM_CROSS_70_OFT PM_CROSS_65_OFT + PM_CROSS_65_NUM
161 static const PM_FONT_INFO arrPMFontInfo[][TEL_NO_OF_SIZES] =
163 // TOM_POINT - not used
179 {{ 9.f, 9.f, PM_PLUS_10_OFT},
180 {11.f, 11.f, PM_PLUS_15_OFT},
181 {13.f, 13.f, PM_PLUS_20_OFT},
182 {15.f, 15.f, PM_PLUS_25_OFT},
183 {17.f, 17.f, PM_PLUS_30_OFT},
184 {19.f, 19.f, PM_PLUS_35_OFT},
185 {21.f, 21.f, PM_PLUS_40_OFT},
186 {23.f, 23.f, PM_PLUS_45_OFT},
187 {25.f, 25.f, PM_PLUS_50_OFT},
188 {27.f, 27.f, PM_PLUS_55_OFT},
189 {29.f, 29.f, PM_PLUS_60_OFT},
190 {31.f, 31.f, PM_PLUS_65_OFT},
191 {32.f, 32.f, PM_PLUS_70_OFT}},
194 {{ 7.f, 9.f, PM_STAR_10_OFT},
195 {9.f, 11.f, PM_STAR_15_OFT},
196 {11.f, 13.f, PM_STAR_20_OFT},
197 {13.f, 15.f, PM_STAR_25_OFT},
198 {13.f, 17.f, PM_STAR_30_OFT},
199 {15.f, 19.f, PM_STAR_35_OFT},
200 {17.f, 21.f, PM_STAR_40_OFT},
201 {19.f, 23.f, PM_STAR_45_OFT},
202 {21.f, 25.f, PM_STAR_50_OFT},
203 {23.f, 27.f, PM_STAR_55_OFT},
204 {25.f, 29.f, PM_STAR_60_OFT},
205 {32.f, 32.f, PM_STAR_65_OFT},
206 {32.f, 32.f, PM_STAR_70_OFT}},
209 {{ 7.f, 7.f, PM_CROSS_10_OFT},
210 { 9.f, 9.f, PM_CROSS_15_OFT},
211 {11.f, 11.f, PM_CROSS_20_OFT},
212 {13.f, 13.f, PM_CROSS_25_OFT},
213 {15.f, 15.f, PM_CROSS_30_OFT},
214 {17.f, 17.f, PM_CROSS_35_OFT},
215 {19.f, 19.f, PM_CROSS_40_OFT},
216 {21.f, 21.f, PM_CROSS_45_OFT},
217 {23.f, 23.f, PM_CROSS_50_OFT},
218 {25.f, 25.f, PM_CROSS_55_OFT},
219 {27.f, 27.f, PM_CROSS_60_OFT},
220 {32.f, 32.f, PM_CROSS_65_OFT},
221 {32.f, 32.f, PM_CROSS_70_OFT}},
224 {{ 7.f, 7.f, PM_CIRC_10_OFT},
225 { 9.f, 9.f, PM_CIRC_15_OFT},
226 { 9.f, 9.f, PM_CIRC_20_OFT},
227 {11.f, 11.f, PM_CIRC_25_OFT},
228 {13.f, 13.f, PM_CIRC_30_OFT},
229 {15.f, 15.f, PM_CIRC_35_OFT},
230 {17.f, 17.f, PM_CIRC_40_OFT},
231 {19.f, 19.f, PM_CIRC_45_OFT},
232 {21.f, 21.f, PM_CIRC_50_OFT},
233 {23.f, 23.f, PM_CIRC_55_OFT},
234 {25.f, 25.f, PM_CIRC_60_OFT},
235 {27.f, 27.f, PM_CIRC_65_OFT},
236 {29.f, 29.f, PM_CIRC_70_OFT}}
239 static const Standard_Byte OpenGl_AspectMarker_myMarkerRaster[] =
251 0x08,0x00, // PLUS 9x9 = 1.0
263 0x04,0x00, // PLUS 11x11 = 1.5
277 0x02,0x00, // PLUS 13x13 = 2.0
293 0x01,0x00, // PLUS 15x15 = 2.5
311 0x00,0x80, 0x00, // PLUS 17x17 = 3.0
331 0x00,0x40, 0x00, // PLUS 19x19 = 3.5
353 0x00,0x20, 0x00, // PLUS 21x21 = 4.0
377 0x00,0x10, 0x00, // PLUS 23x23 = 4.5
379 0x00,0x08, 0x00,0x00,
380 0x00,0x08, 0x00,0x00,
381 0x00,0x08, 0x00,0x00,
382 0x00,0x08, 0x00,0x00,
383 0x00,0x08, 0x00,0x00,
384 0x00,0x08, 0x00,0x00,
385 0x00,0x08, 0x00,0x00,
386 0x00,0x08, 0x00,0x00,
387 0x00,0x08, 0x00,0x00,
388 0x00,0x08, 0x00,0x00,
389 0x00,0x08, 0x00,0x00,
390 0x00,0x08, 0x00,0x00,
391 0xff,0xff, 0xff,0x80,
392 0x00,0x08, 0x00,0x00,
393 0x00,0x08, 0x00,0x00,
394 0x00,0x08, 0x00,0x00,
395 0x00,0x08, 0x00,0x00,
396 0x00,0x08, 0x00,0x00,
397 0x00,0x08, 0x00,0x00,
398 0x00,0x08, 0x00,0x00,
399 0x00,0x08, 0x00,0x00,
400 0x00,0x08, 0x00,0x00,
401 0x00,0x08, 0x00,0x00,
402 0x00,0x08, 0x00,0x00,
403 0x00,0x08, 0x00,0x00, // PLUS 25x25 = 5.0
405 0x00,0x04, 0x00,0x00,
406 0x00,0x04, 0x00,0x00,
407 0x00,0x04, 0x00,0x00,
408 0x00,0x04, 0x00,0x00,
409 0x00,0x04, 0x00,0x00,
410 0x00,0x04, 0x00,0x00,
411 0x00,0x04, 0x00,0x00,
412 0x00,0x04, 0x00,0x00,
413 0x00,0x04, 0x00,0x00,
414 0x00,0x04, 0x00,0x00,
415 0x00,0x04, 0x00,0x00,
416 0x00,0x04, 0x00,0x00,
417 0x00,0x04, 0x00,0x00,
418 0xff,0xff, 0xff,0xe0,
419 0x00,0x04, 0x00,0x00,
420 0x00,0x04, 0x00,0x00,
421 0x00,0x04, 0x00,0x00,
422 0x00,0x04, 0x00,0x00,
423 0x00,0x04, 0x00,0x00,
424 0x00,0x04, 0x00,0x00,
425 0x00,0x04, 0x00,0x00,
426 0x00,0x04, 0x00,0x00,
427 0x00,0x04, 0x00,0x00,
428 0x00,0x04, 0x00,0x00,
429 0x00,0x04, 0x00,0x00,
430 0x00,0x04, 0x00,0x00,
431 0x00,0x04, 0x00,0x00, // PLUS 27x27 = 5.5
433 0x00,0x02, 0x00,0x00,
434 0x00,0x02, 0x00,0x00,
435 0x00,0x02, 0x00,0x00,
436 0x00,0x02, 0x00,0x00,
437 0x00,0x02, 0x00,0x00,
438 0x00,0x02, 0x00,0x00,
439 0x00,0x02, 0x00,0x00,
440 0x00,0x02, 0x00,0x00,
441 0x00,0x02, 0x00,0x00,
442 0x00,0x02, 0x00,0x00,
443 0x00,0x02, 0x00,0x00,
444 0x00,0x02, 0x00,0x00,
445 0x00,0x02, 0x00,0x00,
446 0x00,0x02, 0x00,0x00,
447 0xff,0xff, 0xff,0xf8,
448 0x00,0x02, 0x00,0x00,
449 0x00,0x02, 0x00,0x00,
450 0x00,0x02, 0x00,0x00,
451 0x00,0x02, 0x00,0x00,
452 0x00,0x02, 0x00,0x00,
453 0x00,0x02, 0x00,0x00,
454 0x00,0x02, 0x00,0x00,
455 0x00,0x02, 0x00,0x00,
456 0x00,0x02, 0x00,0x00,
457 0x00,0x02, 0x00,0x00,
458 0x00,0x02, 0x00,0x00,
459 0x00,0x02, 0x00,0x00,
460 0x00,0x02, 0x00,0x00,
461 0x00,0x02, 0x00,0x00, // PLUS 29x29 = 6.0
463 0x00,0x01, 0x00,0x00,
464 0x00,0x01, 0x00,0x00,
465 0x00,0x01, 0x00,0x00,
466 0x00,0x01, 0x00,0x00,
467 0x00,0x01, 0x00,0x00,
468 0x00,0x01, 0x00,0x00,
469 0x00,0x01, 0x00,0x00,
470 0x00,0x01, 0x00,0x00,
471 0x00,0x01, 0x00,0x00,
472 0x00,0x01, 0x00,0x00,
473 0x00,0x01, 0x00,0x00,
474 0x00,0x01, 0x00,0x00,
475 0x00,0x01, 0x00,0x00,
476 0x00,0x01, 0x00,0x00,
477 0x00,0x01, 0x00,0x00,
478 0xff,0xff, 0xff,0xfd,
479 0x00,0x01, 0x00,0x00,
480 0x00,0x01, 0x00,0x00,
481 0x00,0x01, 0x00,0x00,
482 0x00,0x01, 0x00,0x00,
483 0x00,0x01, 0x00,0x00,
484 0x00,0x01, 0x00,0x00,
485 0x00,0x01, 0x00,0x00,
486 0x00,0x01, 0x00,0x00,
487 0x00,0x01, 0x00,0x00,
488 0x00,0x01, 0x00,0x00,
489 0x00,0x01, 0x00,0x00,
490 0x00,0x01, 0x00,0x00,
491 0x00,0x01, 0x00,0x00,
492 0x00,0x01, 0x00,0x00,
493 0x00,0x01, 0x00,0x00, // PLUS 31x31 = 6.5
495 0x00,0x00, 0x80,0x00,
496 0x00,0x00, 0x80,0x00,
497 0x00,0x00, 0x80,0x00,
498 0x00,0x00, 0x80,0x00,
499 0x00,0x00, 0x80,0x00,
500 0x00,0x00, 0x80,0x00,
501 0x00,0x00, 0x80,0x00,
502 0x00,0x00, 0x80,0x00,
503 0x00,0x00, 0x80,0x00,
504 0x00,0x00, 0x80,0x00,
505 0x00,0x00, 0x80,0x00,
506 0x00,0x00, 0x80,0x00,
507 0x00,0x00, 0x80,0x00,
508 0x00,0x00, 0x80,0x00,
509 0x00,0x00, 0x80,0x00,
510 0x00,0x00, 0x80,0x00,
511 0xff,0xff, 0xff,0xff,
512 0x00,0x00, 0x80,0x00,
513 0x00,0x00, 0x80,0x00,
514 0x00,0x00, 0x80,0x00,
515 0x00,0x00, 0x80,0x00,
516 0x00,0x00, 0x80,0x00,
517 0x00,0x00, 0x80,0x00,
518 0x00,0x00, 0x80,0x00,
519 0x00,0x00, 0x80,0x00,
520 0x00,0x00, 0x80,0x00,
521 0x00,0x00, 0x80,0x00,
522 0x00,0x00, 0x80,0x00,
523 0x00,0x00, 0x80,0x00,
524 0x00,0x00, 0x80,0x00,
525 0x00,0x00, 0x80,0x00,
526 0x00,0x00, 0x80,0x00, // PLUS 32x32 = 7.0
538 0x10, // STAR 7x9 = 1.0
550 0x08,0x00, // STAR 9x11 = 1.5
564 0x04,0x00, // STAR 11x13 = 2.0
580 0x02,0x00, // STAR 13x15 = 2.5
598 0x02,0x00, // STAR 13x17 = 3.0
618 0x01,0x00, // STAR 15x19 = 3.5
640 0x00,0x80, 0x00, // STAR 17x21 = 4.0
664 0x00,0x40, 0x00, // STAR 19x23 = 4.5
690 0x00,0x20, 0x00, // STAR 21x25 = 5.0
718 0x00,0x10, 0x00, // STAR 23x27 = 5.5
720 0x00,0x08, 0x00,0x00,
721 0x00,0x08, 0x00,0x00,
722 0x00,0x08, 0x00,0x00,
723 0x00,0x08, 0x00,0x00,
724 0x00,0x08, 0x00,0x00,
725 0x00,0x08, 0x00,0x00,
726 0x00,0x08, 0x00,0x00,
727 0x80,0x08, 0x00,0x80,
728 0x60,0x08, 0x03,0x00,
729 0x18,0x08, 0x0c,0x00,
730 0x04,0x08, 0x30,0x00,
731 0x03,0x08, 0x40,0x00,
732 0x00,0xc9, 0x80,0x00,
733 0x00,0x3e, 0x00,0x00,
734 0x00,0x08, 0x00,0x00,
735 0x00,0x3e, 0x00,0x00,
736 0x00,0xc9, 0x80,0x00,
737 0x03,0x08, 0x40,0x00,
738 0x04,0x08, 0x30,0x00,
739 0x18,0x08, 0x0c,0x00,
740 0x60,0x08, 0x03,0x00,
741 0x80,0x08, 0x00,0x80,
742 0x00,0x08, 0x00,0x00,
743 0x00,0x08, 0x00,0x00,
744 0x00,0x08, 0x00,0x00,
745 0x00,0x08, 0x00,0x00,
746 0x00,0x08, 0x00,0x00,
747 0x00,0x08, 0x00,0x00,
748 0x00,0x08, 0x00,0x00, // STAR 25x29 = 6.0
750 0x00,0x00, 0x80,0x00,
751 0x00,0x00, 0x80,0x00,
752 0x00,0x00, 0x80,0x00,
753 0x00,0x00, 0x80,0x00,
754 0x00,0x00, 0x80,0x00,
755 0x00,0x00, 0x80,0x00,
756 0x00,0x00, 0x80,0x00,
757 0x00,0x00, 0x80,0x00,
758 0x00,0x00, 0x80,0x00,
759 0x30,0x00, 0x80,0x06,
760 0x0c,0x00, 0x80,0x18,
761 0x03,0x00, 0x80,0x60,
762 0x00,0xc0, 0x81,0x80,
763 0x00,0x30, 0x86,0x00,
764 0x00,0x0c, 0x98,0x00,
765 0x00,0x03, 0xe0,0x00,
766 0x00,0x03, 0xe0,0x00,
767 0x00,0x0c, 0x98,0x00,
768 0x00,0x30, 0x86,0x00,
769 0x00,0xc0, 0x81,0x80,
770 0x03,0x00, 0x80,0x60,
771 0x0c,0x00, 0x80,0x18,
772 0x30,0x00, 0x80,0x06,
773 0x00,0x00, 0x80,0x00,
774 0x00,0x00, 0x80,0x00,
775 0x00,0x00, 0x80,0x00,
776 0x00,0x00, 0x80,0x00,
777 0x00,0x00, 0x80,0x00,
778 0x00,0x00, 0x80,0x00,
779 0x00,0x00, 0x80,0x00,
780 0x00,0x00, 0x00,0x00,
781 0x00,0x00, 0x00,0x00, // STAR 32x32 = 6.5
783 0x00, 0x00, 0x80, 0x00,
784 0x00, 0x00, 0x80, 0x00,
785 0x00, 0x00, 0x80, 0x00,
786 0x00, 0x00, 0x80, 0x00,
787 0x00, 0x00, 0x80, 0x00,
788 0x00, 0x00, 0x80, 0x00,
789 0x00, 0x00, 0x80, 0x00,
790 0x00, 0x00, 0x80, 0x00,
791 0x10, 0x00, 0x80, 0x04,
792 0x0c, 0x00, 0x80, 0x18,
793 0x02, 0x00, 0x80, 0x20,
794 0x01, 0x80, 0x80, 0xc0,
795 0x00, 0x40, 0x81, 0x00,
796 0x00, 0x30, 0x86, 0x00,
797 0x00, 0x08, 0x88, 0x00,
798 0x00, 0x06, 0xb0, 0x00,
799 0x00, 0x01, 0xc0, 0x00,
800 0x00, 0x06, 0xb0, 0x00,
801 0x00, 0x08, 0x88, 0x00,
802 0x00, 0x30, 0x86, 0x00,
803 0x00, 0x40, 0x81, 0x00,
804 0x01, 0x80, 0x80, 0xc0,
805 0x02, 0x00, 0x80, 0x20,
806 0x0c, 0x00, 0x80, 0x18,
807 0x10, 0x00, 0x80, 0x04,
808 0x00, 0x00, 0x80, 0x00,
809 0x00, 0x00, 0x80, 0x00,
810 0x00, 0x00, 0x80, 0x00,
811 0x00, 0x00, 0x80, 0x00,
812 0x00, 0x00, 0x80, 0x00,
813 0x00, 0x00, 0x80, 0x00,
814 0x00, 0x00, 0x80, 0x00, // STAR 32x32 = 7.0
824 0x38, // CIRC 7x7 = 1.0
834 0x00,0x00, //CIRC 9x9 = 1.5
844 0x3e,0x00, // CIRC 9x9 = 2.0
856 0x1f,0x00, // CIRC 11x11 = 2.5
870 0x0f,0x80, // CIRC 13x13 = 3.0
886 0x07,0xc0, // CIRC 15x15 = 3.5
904 0x03,0xe0, 0x00, // CIRC 17x17 = 4.0
924 0x03,0xf8, 0x00, // CIRC 19x19 = 4.5
946 0x01,0xfc, 0x00, // CIRC 21x21 = 5.0
970 0x00,0xfe, 0x00, // CIRC 23x23 = 5.5
972 0x00,0x7f, 0x00,0x00,
973 0x01,0x80, 0xc0,0x00,
974 0x06,0x00, 0x30,0x00,
975 0x08,0x00, 0x08,0x00,
976 0x10,0x00, 0x04,0x00,
977 0x20,0x00, 0x02,0x00,
978 0x20,0x00, 0x02,0x00,
979 0x40,0x00, 0x01,0x00,
980 0x40,0x00, 0x01,0x00,
981 0x80,0x00, 0x00,0x80,
982 0x80,0x00, 0x00,0x80,
983 0x80,0x00, 0x00,0x80,
984 0x80,0x00, 0x00,0x80,
985 0x80,0x00, 0x00,0x80,
986 0x80,0x00, 0x00,0x80,
987 0x80,0x00, 0x00,0x80,
988 0x40,0x00, 0x01,0x00,
989 0x40,0x00, 0x01,0x00,
990 0x20,0x00, 0x02,0x00,
991 0x20,0x00, 0x02,0x00,
992 0x10,0x00, 0x04,0x00,
993 0x08,0x00, 0x08,0x00,
994 0x06,0x00, 0x30,0x00,
995 0x01,0x80, 0xc0,0x00,
996 0x00,0x7f, 0x00,0x00, // CIRC 25x25 = 6.0
998 0x00,0x3f, 0x80,0x00,
999 0x01,0xc0, 0x70,0x00,
1000 0x03,0x00, 0x18,0x00,
1001 0x0c,0x00, 0x06,0x00,
1002 0x18,0x00, 0x03,0x00,
1003 0x10,0x00, 0x01,0x00,
1004 0x20,0x00, 0x00,0x80,
1005 0x60,0x00, 0x00,0xc0,
1006 0x40,0x00, 0x00,0x40,
1007 0x40,0x00, 0x00,0x40,
1008 0x80,0x00, 0x00,0x20,
1009 0x80,0x00, 0x00,0x20,
1010 0x80,0x00, 0x00,0x20,
1011 0x80,0x00, 0x00,0x20,
1012 0x80,0x00, 0x00,0x20,
1013 0x80,0x00, 0x00,0x20,
1014 0x80,0x00, 0x00,0x20,
1015 0x40,0x00, 0x00,0x40,
1016 0x40,0x00, 0x00,0x40,
1017 0x60,0x00, 0x00,0xc0,
1018 0x20,0x00, 0x00,0x80,
1019 0x10,0x00, 0x01,0x00,
1020 0x18,0x00, 0x03,0x00,
1021 0x0c,0x00, 0x06,0x00,
1022 0x03,0x00, 0x18,0x00,
1023 0x01,0xc0, 0x70,0x00,
1024 0x00,0x3f, 0x80,0x00, // CIRC 27x27 = 6.5
1026 0x00,0x1f, 0xc0,0x00,
1027 0x00,0xe0, 0x38,0x00,
1028 0x01,0x00, 0x04,0x00,
1029 0x06,0x00, 0x03,0x00,
1030 0x08,0x00, 0x00,0x80,
1031 0x10,0x00, 0x00,0x40,
1032 0x10,0x00, 0x00,0x40,
1033 0x20,0x00, 0x00,0x20,
1034 0x40,0x00, 0x00,0x10,
1035 0x40,0x00, 0x00,0x10,
1036 0x40,0x00, 0x00,0x10,
1037 0x80,0x00, 0x00,0x08,
1038 0x80,0x00, 0x00,0x08,
1039 0x80,0x00, 0x00,0x08,
1040 0x80,0x00, 0x00,0x08,
1041 0x80,0x00, 0x00,0x08,
1042 0x80,0x00, 0x00,0x08,
1043 0x80,0x00, 0x00,0x08,
1044 0x40,0x00, 0x00,0x10,
1045 0x40,0x00, 0x00,0x10,
1046 0x40,0x00, 0x00,0x10,
1047 0x20,0x00, 0x00,0x20,
1048 0x10,0x00, 0x00,0x40,
1049 0x10,0x00, 0x00,0x40,
1050 0x08,0x00, 0x00,0x80,
1051 0x06,0x00, 0x03,0x00,
1052 0x01,0x00, 0x04,0x00,
1053 0x00,0xe0, 0x38,0x00,
1054 0x00,0x1f, 0xc0,0x00, // CIRC 29x29 = 7.0
1064 0x82, // CROSS 7x7 = 1.0
1074 0x80,0x80, // CROSS 9x9 = 1.5
1086 0x80,0x20, // CROSS 11x11 = 2.0
1100 0x80,0x08, // CROSS 13x13 = 2.5
1116 0x80,0x02, // CROSS 15x15 = 3.0
1134 0x80,0x00, 0x80, // CROSS 17x17 = 3.5
1154 0x80,0x00, 0x20, // CROSS 19x19 = 4.0
1176 0x80,0x00, 0x08,/* CROSS 21x21 = 4.5 */
1200 0x80,0x00, 0x02, // CROSS 23x23 = 5.0
1202 0x80,0x00, 0x00,0x80,
1203 0x40,0x00, 0x01,0x00,
1204 0x20,0x00, 0x02,0x00,
1205 0x10,0x00, 0x04,0x00,
1206 0x08,0x00, 0x08,0x00,
1207 0x04,0x00, 0x10,0x00,
1208 0x02,0x00, 0x20,0x00,
1209 0x01,0x00, 0x40,0x00,
1210 0x00,0x80, 0x80,0x00,
1211 0x00,0x41, 0x00,0x00,
1212 0x00,0x22, 0x00,0x00,
1213 0x00,0x14, 0x00,0x00,
1214 0x00,0x08, 0x00,0x00,
1215 0x00,0x14, 0x00,0x00,
1216 0x00,0x22, 0x00,0x00,
1217 0x00,0x41, 0x00,0x00,
1218 0x00,0x80, 0x80,0x00,
1219 0x01,0x00, 0x40,0x00,
1220 0x02,0x00, 0x20,0x00,
1221 0x04,0x00, 0x10,0x00,
1222 0x08,0x00, 0x08,0x00,
1223 0x10,0x00, 0x04,0x00,
1224 0x20,0x00, 0x02,0x00,
1225 0x40,0x00, 0x01,0x00,
1226 0x80,0x00, 0x00,0x80, // CROSS 25x25 = 5.5
1228 0x80,0x00, 0x00,0x20,
1229 0x40,0x00, 0x00,0x40,
1230 0x20,0x00, 0x00,0x80,
1231 0x10,0x00, 0x01,0x00,
1232 0x08,0x00, 0x02,0x00,
1233 0x04,0x00, 0x04,0x00,
1234 0x02,0x00, 0x08,0x00,
1235 0x01,0x00, 0x10,0x00,
1236 0x00,0x80, 0x20,0x00,
1237 0x00,0x40, 0x40,0x00,
1238 0x00,0x20, 0x80,0x00,
1239 0x00,0x11, 0x00,0x00,
1240 0x00,0x0a, 0x00,0x00,
1241 0x00,0x04, 0x00,0x00,
1242 0x00,0x0a, 0x00,0x00,
1243 0x00,0x11, 0x00,0x00,
1244 0x00,0x20, 0x80,0x00,
1245 0x00,0x40, 0x40,0x00,
1246 0x00,0x80, 0x20,0x00,
1247 0x01,0x00, 0x10,0x00,
1248 0x02,0x00, 0x08,0x00,
1249 0x04,0x00, 0x04,0x00,
1250 0x08,0x00, 0x02,0x00,
1251 0x10,0x00, 0x01,0x00,
1252 0x20,0x00, 0x00,0x80,
1253 0x40,0x00, 0x00,0x40,
1254 0x80,0x00, 0x00,0x20, // CROSS 27x27 = 6.0
1256 0x00,0x00, 0x00,0x00,
1257 0x00,0x00, 0x00,0x00,
1258 0x20,0x00, 0x00,0x04,
1259 0x10,0x00, 0x00,0x08,
1260 0x08,0x00, 0x00,0x10,
1261 0x04,0x00, 0x00,0x20,
1262 0x02,0x00, 0x00,0x40,
1263 0x01,0x00, 0x00,0x80,
1264 0x00,0x80, 0x01,0x00,
1265 0x00,0x40, 0x02,0x00,
1266 0x00,0x20, 0x04,0x00,
1267 0x00,0x10, 0x08,0x00,
1268 0x00,0x08, 0x10,0x00,
1269 0x00,0x04, 0x20,0x00,
1270 0x00,0x02, 0x40,0x00,
1271 0x00,0x01, 0x80,0x00,
1272 0x00,0x01, 0x80,0x00,
1273 0x00,0x02, 0x40,0x00,
1274 0x00,0x04, 0x20,0x00,
1275 0x00,0x08, 0x10,0x00,
1276 0x00,0x10, 0x08,0x00,
1277 0x00,0x20, 0x04,0x00,
1278 0x00,0x40, 0x02,0x00,
1279 0x00,0x80, 0x01,0x00,
1280 0x01,0x00, 0x00,0x80,
1281 0x02,0x00, 0x00,0x40,
1282 0x04,0x00, 0x00,0x20,
1283 0x08,0x00, 0x00,0x10,
1284 0x10,0x00, 0x00,0x08,
1285 0x20,0x00, 0x00,0x04,
1286 0x00,0x00, 0x00,0x00,
1287 0x00,0x00, 0x00,0x00, // CROSS 32x32 = 6.5
1289 0x00,0x00, 0x00,0x00,
1290 0x40,0x00, 0x00,0x02,
1291 0x20,0x00, 0x00,0x04,
1292 0x10,0x00, 0x00,0x08,
1293 0x08,0x00, 0x00,0x10,
1294 0x04,0x00, 0x00,0x20,
1295 0x02,0x00, 0x00,0x40,
1296 0x01,0x00, 0x00,0x80,
1297 0x00,0x80, 0x01,0x00,
1298 0x00,0x40, 0x02,0x00,
1299 0x00,0x20, 0x04,0x00,
1300 0x00,0x10, 0x08,0x00,
1301 0x00,0x08, 0x10,0x00,
1302 0x00,0x04, 0x20,0x00,
1303 0x00,0x02, 0x40,0x00,
1304 0x00,0x01, 0x80,0x00,
1305 0x00,0x01, 0x80,0x00,
1306 0x00,0x02, 0x40,0x00,
1307 0x00,0x04, 0x20,0x00,
1308 0x00,0x08, 0x10,0x00,
1309 0x00,0x10, 0x08,0x00,
1310 0x00,0x20, 0x04,0x00,
1311 0x00,0x40, 0x02,0x00,
1312 0x00,0x80, 0x01,0x00,
1313 0x01,0x00, 0x00,0x80,
1314 0x02,0x00, 0x00,0x40,
1315 0x04,0x00, 0x00,0x20,
1316 0x08,0x00, 0x00,0x10,
1317 0x10,0x00, 0x00,0x08,
1318 0x20,0x00, 0x00,0x04,
1319 0x40,0x00, 0x00,0x02,
1320 0x00,0x00, 0x00,0x00 // CROSS 32x32 = 7.0
1323 // =======================================================================
1324 // function : GetMarkerBitMapArray
1325 // purpose : Returns a parameters for the marker of the specified
1327 // =======================================================================
1328 void GetMarkerBitMapParam (const Aspect_TypeOfMarker theMarkerType,
1329 const Standard_ShortReal& theScale,
1330 Standard_Integer& theWidth,
1331 Standard_Integer& theHeight,
1332 Standard_Integer& theOffset,
1333 Standard_Integer& theNumOfBytes)
1335 const Standard_Integer aType = (Standard_Integer )((theMarkerType > Aspect_TOM_O) ? Aspect_TOM_O : theMarkerType);
1336 const Standard_Real anIndex = (Standard_Real )(TEL_NO_OF_SIZES - 1) * (theScale - (Standard_Real )TEL_PM_START_SIZE)
1337 / (Standard_Real )(TEL_PM_END_SIZE - TEL_PM_START_SIZE);
1338 Standard_Integer anId = (Standard_Integer )(anIndex + 0.5);
1343 else if (anId >= TEL_NO_OF_SIZES)
1345 anId = TEL_NO_OF_SIZES - 1;
1348 theWidth = (Standard_Integer )arrPMFontInfo[aType][anId].width;
1349 theHeight = (Standard_Integer )arrPMFontInfo[aType][anId].height;
1350 theOffset = arrPMFontInfo[aType][anId].offset;
1351 const Standard_Integer aNumOfBytesInRow = theWidth / 8 + (theWidth % 8 ? 1 : 0);
1352 theNumOfBytes = theHeight * aNumOfBytesInRow;
1355 // =======================================================================
1356 // function : GetTextureImage
1357 // purpose : Returns a marker image for the marker of the specified
1359 // =======================================================================
1360 Handle(Graphic3d_MarkerImage) GetTextureImage (const Aspect_TypeOfMarker theMarkerType,
1361 const Standard_ShortReal& theScale)
1363 Standard_Integer aWidth, aHeight, anOffset, aNumOfBytes;
1364 GetMarkerBitMapParam (theMarkerType, theScale, aWidth, aHeight, anOffset, aNumOfBytes);
1366 Handle(TColStd_HArray1OfByte) aBitMap = new TColStd_HArray1OfByte (0, aNumOfBytes - 1);
1367 for (Standard_Integer anIter = 0; anIter < aNumOfBytes; anIter++)
1369 aBitMap->ChangeValue (anIter) = OpenGl_AspectMarker_myMarkerRaster[anOffset + anIter];
1372 Handle(Graphic3d_MarkerImage) aTexture = new Graphic3d_MarkerImage (aBitMap, aWidth, aHeight);
1376 // =======================================================================
1377 // function : MergeImages
1378 // purpose : Merge two image pixmap into one. Used for creating image for
1379 // following markers: Aspect_TOM_O_POINT, Aspect_TOM_O_PLUS,
1380 // Aspect_TOM_O_STAR, Aspect_TOM_O_X, Aspect_TOM_RING1,
1381 // Aspect_TOM_RING2, Aspect_TOM_RING3
1382 // =======================================================================
1383 Handle(Image_PixMap) MergeImages (const Handle(Image_PixMap)& theImage1,
1384 const Handle(Image_PixMap)& theImage2)
1386 if (theImage1.IsNull() && theImage2.IsNull())
1388 return Handle(Image_PixMap)();
1391 Handle(Image_PixMap) aResultImage = new Image_PixMap();
1393 Standard_Integer aWidth1 (0), aHeight1 (0);
1394 if (!theImage1.IsNull())
1396 aWidth1 = (Standard_Integer )theImage1->Width();
1397 aHeight1 = (Standard_Integer )theImage1->Height();
1400 Standard_Integer aWidth2 (0), aHeight2 (0);
1401 if (!theImage2.IsNull())
1403 aWidth2 = (Standard_Integer )theImage2->Width();
1404 aHeight2 = (Standard_Integer )theImage2->Height();
1407 const Standard_Integer aMaxWidth = Max (aWidth1, aWidth2);
1408 const Standard_Integer aMaxHeight = Max (aHeight1, aHeight2);
1409 const Standard_Integer aSize = Max (aMaxWidth, aMaxHeight);
1411 aResultImage->InitZero (Image_PixMap::ImgGray, aSize, aSize);
1413 if (!theImage1.IsNull())
1415 const Standard_Integer aXOffset1 = Abs (aWidth1 - aMaxWidth) / 2;
1416 const Standard_Integer anYOffset1 = Abs (aHeight1 - aMaxHeight) / 2;
1417 for (Standard_Integer anY = 0; anY < aHeight1; anY++)
1419 Standard_Byte* anImageLine = theImage1->ChangeRow (anY);
1420 Standard_Byte* aResultImageLine = aResultImage->ChangeRow (anYOffset1 + anY);
1421 for (Standard_Integer aX = 0; aX < aWidth1; aX++)
1423 aResultImageLine[aXOffset1 + aX] |= anImageLine[aX];
1428 if (!theImage2.IsNull())
1430 const Standard_Integer aXOffset2 = Abs (aWidth2 - aMaxWidth) / 2;
1431 const Standard_Integer anYOffset2 = Abs (aHeight2 - aMaxHeight) / 2;
1432 for (Standard_Integer anY = 0; anY < aHeight2; anY++)
1434 Standard_Byte* anImageLine = theImage2->ChangeRow (anY);
1435 Standard_Byte* aResultImageLine = aResultImage->ChangeRow (anYOffset2 + anY);
1436 for (Standard_Integer aX = 0; aX < aWidth2; aX++)
1438 aResultImageLine[aXOffset2 + aX] |= anImageLine[aX];
1443 return aResultImage;
1446 // =======================================================================
1447 // function : OpenGl_AspectMarker
1449 // =======================================================================
1450 OpenGl_AspectMarker::OpenGl_AspectMarker()
1451 : myColor (myDefaultColor),
1452 myType (Aspect_TOM_PLUS),
1454 myMarkerSize (1.0f),
1459 // =======================================================================
1460 // function : SetAspect
1462 // =======================================================================
1463 void OpenGl_AspectMarker::SetAspect (const CALL_DEF_CONTEXTMARKER& theAspect)
1465 myColor.rgb[0] = (float )theAspect.Color.r;
1466 myColor.rgb[1] = (float )theAspect.Color.g;
1467 myColor.rgb[2] = (float )theAspect.Color.b;
1468 myColor.rgb[3] = 1.0f;
1469 myMarkerImage = theAspect.MarkerImage;
1470 myType = theAspect.MarkerType;
1471 myScale = theAspect.Scale;
1472 myShaderProgram = theAspect.ShaderProgram;
1474 // update sprite resource bindings
1475 TCollection_AsciiString aSpriteKey = THE_EMPTY_KEY;
1476 TCollection_AsciiString aSpriteAKey = THE_EMPTY_KEY;
1477 myResources.SpriteKeys (myMarkerImage, myType, myScale, myColor, aSpriteKey, aSpriteAKey);
1479 if (aSpriteKey.IsEmpty() || myResources.SpriteKey != aSpriteKey
1480 || aSpriteAKey.IsEmpty() || myResources.SpriteAKey != aSpriteAKey)
1482 myResources.ResetSpriteReadiness();
1483 myMarkerSize = theAspect.Scale;
1486 // update shader program resource bindings
1487 const TCollection_AsciiString& aShaderKey = myShaderProgram.IsNull() ? THE_EMPTY_KEY : myShaderProgram->GetId();
1489 if (aShaderKey.IsEmpty() || myResources.ShaderProgramId != aShaderKey)
1491 myResources.ResetShaderReadiness();
1495 // =======================================================================
1496 // function : Render
1498 // =======================================================================
1499 void OpenGl_AspectMarker::Render (const Handle(OpenGl_Workspace)& theWorkspace) const
1501 theWorkspace->SetAspectMarker (this);
1504 // =======================================================================
1505 // function : Release
1507 // =======================================================================
1508 void OpenGl_AspectMarker::Release (OpenGl_Context* theCtx)
1510 if (!myResources.Sprite.IsNull())
1514 if (myResources.SpriteKey.IsEmpty())
1516 theCtx->DelayedRelease (myResources.Sprite);
1517 theCtx->DelayedRelease (myResources.SpriteA);
1521 myResources.Sprite.Nullify(); // we need nullify all handles before ReleaseResource() call
1522 myResources.SpriteA.Nullify();
1523 theCtx->ReleaseResource (myResources.SpriteKey, Standard_True);
1524 theCtx->ReleaseResource (myResources.SpriteAKey, Standard_True);
1527 myResources.Sprite.Nullify();
1528 myResources.SpriteA.Nullify();
1530 myResources.SpriteKey.Clear();
1531 myResources.SpriteAKey.Clear();
1532 myResources.ResetSpriteReadiness();
1534 if (!myResources.ShaderProgram.IsNull() && theCtx)
1536 theCtx->ShaderManager()->Unregister (myResources.ShaderProgramId,
1537 myResources.ShaderProgram);
1539 myResources.ShaderProgramId.Clear();
1540 myResources.ResetShaderReadiness();
1543 // =======================================================================
1544 // function : BuildSprites
1546 // =======================================================================
1547 void OpenGl_AspectMarker::Resources::BuildSprites (const Handle(OpenGl_Workspace)& theWorkspace,
1548 const Handle(Graphic3d_MarkerImage)& theMarkerImage,
1549 const Aspect_TypeOfMarker theType,
1550 const Standard_ShortReal theScale,
1551 const TEL_COLOUR& theColor,
1552 Standard_ShortReal& theMarkerSize)
1554 const Handle(OpenGl_Context)& aContext = theWorkspace->GetGlContext();
1556 // generate key for shared resource
1557 TCollection_AsciiString aNewKey = THE_EMPTY_KEY;
1558 TCollection_AsciiString aNewKeyA = THE_EMPTY_KEY;
1559 SpriteKeys (theMarkerImage, theType, theScale, theColor, aNewKey, aNewKeyA);
1561 // release old shared resources
1562 const Standard_Boolean aNewResource = aNewKey.IsEmpty() || SpriteKey != aNewKey;
1565 if (!Sprite.IsNull())
1567 if (SpriteKey.IsEmpty())
1569 aContext->DelayedRelease (Sprite);
1574 Sprite.Nullify(); // we need nullify all handles before ReleaseResource() call
1575 aContext->ReleaseResource (SpriteKey, Standard_True);
1578 SpriteKey = aNewKey;
1580 if (aNewKeyA.IsEmpty() || SpriteAKey != aNewKeyA)
1582 if (!SpriteA.IsNull())
1584 if (SpriteAKey.IsEmpty())
1586 aContext->DelayedRelease (SpriteA);
1591 SpriteA.Nullify(); // we need nullify all handles before ReleaseResource() call
1592 aContext->ReleaseResource (SpriteAKey, Standard_True);
1595 SpriteAKey = aNewKeyA;
1597 if (theType == Aspect_TOM_POINT
1599 || (theType == Aspect_TOM_USERDEFINED && theMarkerImage.IsNull()))
1601 // nothing to do - just simple point
1605 if (!aNewKey.IsEmpty()
1606 && aContext->GetResource<Handle(OpenGl_PointSprite)> (aNewKeyA, SpriteA) // alpha sprite could be shared
1607 && aContext->GetResource<Handle(OpenGl_PointSprite)> (aNewKey, Sprite))
1609 // reuse shared resource
1610 if (!Sprite->IsDisplayList())
1612 theMarkerSize = Standard_ShortReal (Max (Sprite->SizeX(), Sprite->SizeY()));
1617 const bool hadAlreadyAlpha = !SpriteA.IsNull();
1618 if (!hadAlreadyAlpha)
1620 SpriteA = new OpenGl_PointSprite();
1622 Sprite = new OpenGl_PointSprite();
1623 if (!aNewKey.IsEmpty())
1625 aContext->ShareResource (aNewKey, Sprite);
1626 if (!hadAlreadyAlpha)
1628 aContext->ShareResource (aNewKeyA, SpriteA);
1632 if (!aContext.IsNull()
1633 && aContext->IsGlGreaterEqual (2, 0)
1634 && !aContext->caps->pntSpritesDisable)
1636 // Creating texture resource for using it with point sprites
1637 Handle(Graphic3d_MarkerImage) aNewMarkerImage;
1638 Handle(Image_PixMap) anImage, anImageA;
1640 if (theType == Aspect_TOM_USERDEFINED && !theMarkerImage.IsNull())
1642 aNewMarkerImage = theMarkerImage;
1643 anImage = aNewMarkerImage->GetImage();
1647 // Creating image from default bitmap
1648 Handle(TColStd_HArray1OfByte) aBitMap;
1649 Handle(Graphic3d_MarkerImage) aMarkerImage1, aMarkerImage2;
1651 const Standard_ShortReal aDelta = 0.1F;
1652 Standard_ShortReal aScale = theScale;
1653 Standard_ShortReal aLimit = 0.0F;
1657 case Aspect_TOM_O_POINT:
1659 const Standard_Integer aSize = theScale > 7 ? 7 : (Standard_Integer )(theScale + 0.5F);
1660 const Standard_Integer aNumOfBytes = (aSize / 8 + (aSize % 8 ? 1 : 0)) * aSize;
1661 aBitMap = new TColStd_HArray1OfByte (0, aNumOfBytes - 1);
1662 for (Standard_Integer anIter = 0; anIter < aBitMap->Length(); anIter++)
1664 aBitMap->SetValue (anIter, 255);
1666 aMarkerImage2 = new Graphic3d_MarkerImage (aBitMap, aSize, aSize);
1668 case Aspect_TOM_O_PLUS:
1669 case Aspect_TOM_O_STAR:
1670 case Aspect_TOM_O_X:
1672 // For this type of markers we merge two base bitmaps into one
1673 // For example Aspect_TOM_O_PLUS = Aspect_TOM_O + Aspect_TOM_PLUS
1674 aMarkerImage1 = GetTextureImage (Aspect_TOM_O, theScale);
1675 if (theType != Aspect_TOM_O_POINT)
1677 aMarkerImage2 = GetTextureImage (Aspect_TypeOfMarker (theType - Aspect_TOM_O_POINT), theScale);
1679 anImage = MergeImages (aMarkerImage1->GetImage(), aMarkerImage2->GetImage());
1680 aNewMarkerImage = new Graphic3d_MarkerImage (anImage);
1683 case Aspect_TOM_RING1:
1684 if (aLimit == 0.0f) aLimit = aScale * 0.2f;
1685 case Aspect_TOM_RING2:
1686 if (aLimit == 0.0f) aLimit = aScale * 0.5f;
1687 case Aspect_TOM_RING3:
1689 if (aLimit == 0.0f) aLimit = aScale * 0.8f;
1690 for (; aScale > aLimit && aScale >= 1.0f; aScale -= aDelta)
1692 anImage = MergeImages (anImage, GetTextureImage (Aspect_TOM_O, aScale)->GetImage());
1694 aNewMarkerImage = new Graphic3d_MarkerImage (anImage);
1697 case Aspect_TOM_BALL:
1699 Standard_Integer aWidth, aHeight, anOffset, aNumOfBytes;
1700 GetMarkerBitMapParam (Aspect_TOM_O, aScale, aWidth, aHeight, anOffset, aNumOfBytes);
1702 const Standard_ShortReal aDelta = 0.1f;
1703 NCollection_Vec4<Standard_Real> aColor (Standard_Real (theColor.rgb[0]),
1704 Standard_Real (theColor.rgb[1]),
1705 Standard_Real (theColor.rgb[2]),
1706 Standard_Real (theColor.rgb[3]));
1708 const Standard_Integer aSize = Max (aWidth + 2, aHeight + 2); // includes extra margin
1709 anImage = new Image_PixMap();
1710 anImageA = new Image_PixMap();
1711 anImage ->InitZero (Image_PixMap::ImgBGRA, aSize, aSize);
1712 anImageA->InitZero (Image_PixMap::ImgGray, aSize, aSize);
1714 // we draw a set of circles
1715 Image_ColorBGRA aColor32;
1717 Standard_Real aHLS[3];
1718 while (aScale >= 1.0f)
1720 Quantity_Color::RgbHls (aColor.r(), aColor.g(), aColor.b(), aHLS[0], aHLS[1], aHLS[2]);
1721 aHLS[2] *= 0.95; // 5% saturation change
1722 Quantity_Color::HlsRgb (aHLS[0], aHLS[1], aHLS[2], aColor.r(), aColor.g(), aColor.b());
1723 aColor32.r() = Standard_Byte(255.0 * aColor.r());
1724 aColor32.g() = Standard_Byte(255.0 * aColor.g());
1725 aColor32.b() = Standard_Byte(255.0 * aColor.b());
1727 const Handle(Graphic3d_MarkerImage) aMarker = GetTextureImage (Aspect_TOM_O, aScale);
1728 const Handle(Image_PixMap)& aCircle = aMarker->GetImage();
1730 const Standard_Size aDiffX = (anImage->SizeX() - aCircle->SizeX()) / 2;
1731 const Standard_Size aDiffY = (anImage->SizeY() - aCircle->SizeY()) / 2;
1732 for (Standard_Size aRow = 0; aRow < aCircle->SizeY(); ++aRow)
1734 const Standard_Byte* aRowData = aCircle->Row (aRow);
1735 for (Standard_Size aCol = 0; aCol < aCircle->SizeX(); ++aCol)
1737 if (aRowData[aCol] != 0)
1739 anImage ->ChangeValue<Image_ColorBGRA> (aDiffX + aRow, aDiffY + aCol) = aColor32;
1740 anImageA->ChangeValue<Standard_Byte> (aDiffX + aRow, aDiffY + aCol) = 255;
1750 aNewMarkerImage = GetTextureImage (theType, theScale);
1751 anImage = aNewMarkerImage->GetImage();
1757 theMarkerSize = Max ((Standard_ShortReal )anImage->Width(),(Standard_ShortReal )anImage->Height());
1759 Sprite->Init (aContext, *anImage.operator->(), Graphic3d_TOT_2D);
1760 if (!hadAlreadyAlpha)
1762 if (anImageA.IsNull()
1763 && Sprite->GetFormat() != GL_ALPHA8
1764 && !aNewMarkerImage.IsNull())
1766 anImageA = aNewMarkerImage->GetImageAlpha();
1768 if (!anImageA.IsNull())
1770 SpriteA->Init (aContext, *anImageA.operator->(), Graphic3d_TOT_2D);
1776 #if !defined(GL_ES_VERSION_2_0)
1777 // Creating list with bitmap for using it in compatibility mode
1778 GLuint aBitmapList = glGenLists (1);
1779 Sprite->SetDisplayList (aContext, aBitmapList);
1781 Standard_Integer aWidth, aHeight, anOffset, aNumOfBytes;
1782 if (theType == Aspect_TOM_USERDEFINED && !theMarkerImage.IsNull())
1784 // Reading user defined marker
1785 Handle(TColStd_HArray1OfByte) aBitMap = theMarkerImage->GetBitMapArray();
1786 Standard_Byte* aBitMapArray = new Standard_Byte[aBitMap->Length()];
1787 theMarkerImage->GetTextureSize (aWidth, aHeight);
1789 // We should pass bitmap to glBitmap with reversed line order as it draws it from
1791 const Standard_Integer aNumOfBytesInRow = aWidth / 8 + (aWidth % 8 ? 1 : 0);
1792 const Standard_Integer anUpperIndex = aBitMap->Upper();
1793 for (Standard_Integer aRow = 0; aRow < aHeight; aRow++)
1795 for (Standard_Integer aByteIter = 0; aByteIter < aNumOfBytesInRow; aByteIter++)
1797 aBitMapArray[aRow * aNumOfBytesInRow + aByteIter] =
1798 aBitMap->Value (anUpperIndex + 1 - (aRow + 1) * aNumOfBytesInRow + aByteIter);
1802 if (aBitMapArray != NULL)
1804 glNewList (aBitmapList, GL_COMPILE);
1805 glBitmap ((GLsizei )aWidth, (GLsizei )aHeight, (GLfloat )(0.5f * aWidth), (GLfloat )(0.5f * aHeight),
1806 0.f, 0.f, (const GLubyte* )aBitMapArray);
1812 // Creating list for default marker
1813 const Standard_ShortReal aDelta = 0.1f;
1814 Standard_ShortReal aScale = theScale;
1815 Standard_ShortReal aLimit = 0.0f;
1817 glNewList (aBitmapList, GL_COMPILE);
1820 case Aspect_TOM_O_PLUS:
1821 case Aspect_TOM_O_STAR:
1822 case Aspect_TOM_O_X:
1824 // For this type of markers we merge two base bitmaps into one
1825 // For example Aspect_TOM_O_PLUS = Aspect_TOM_O + Aspect_TOM_PLUS
1826 GetMarkerBitMapParam (Aspect_TOM_O, theScale, aWidth, aHeight, anOffset, aNumOfBytes);
1827 glBitmap ((GLsizei )aWidth, (GLsizei )aHeight, (GLfloat )(0.5f * aWidth), (GLfloat )(0.5f * aHeight),
1828 0.f, 0.f, (const GLubyte* )&OpenGl_AspectMarker_myMarkerRaster[anOffset]);
1829 GetMarkerBitMapParam (Aspect_TypeOfMarker (theType - Aspect_TOM_O_POINT), theScale, aWidth, aHeight, anOffset, aNumOfBytes);
1830 glBitmap ((GLsizei )aWidth, (GLsizei )aHeight, (GLfloat )(0.5f * aWidth), (GLfloat )(0.5f * aHeight),
1831 0.f, 0.f, (const GLubyte* )&OpenGl_AspectMarker_myMarkerRaster[anOffset]);
1834 case Aspect_TOM_BALL:
1836 const Standard_ShortReal aDelta = 0.1f;
1837 NCollection_Vec4<Standard_Real> aColor (Standard_Real (theColor.rgb[0]),
1838 Standard_Real (theColor.rgb[1]),
1839 Standard_Real (theColor.rgb[2]),
1840 Standard_Real (theColor.rgb[3]));
1842 // we draw a set of circles
1843 while (aScale >= 1.0f)
1845 Standard_Real aHLS[3];
1846 Quantity_Color::RgbHls (aColor.r(), aColor.g(), aColor.b(), aHLS[0], aHLS[1], aHLS[2]);
1847 // 5% saturation change
1849 Quantity_Color::HlsRgb (aHLS[0], aHLS[1], aHLS[2], aColor.r(), aColor.g(), aColor.b());
1851 glColor4dv (aColor);
1852 GetMarkerBitMapParam (Aspect_TOM_O, aScale, aWidth, aHeight, anOffset, aNumOfBytes);
1853 glBitmap ((GLsizei )aWidth, (GLsizei )aHeight, 0.5f * GLfloat(aWidth), 0.5f * GLfloat(aHeight),
1854 0.0f, 0.0f, (const GLubyte* )&OpenGl_AspectMarker_myMarkerRaster[anOffset]);
1860 case Aspect_TOM_RING1:
1861 if (aLimit == 0.0f) aLimit = aScale * 0.2f;
1862 case Aspect_TOM_RING2:
1863 if (aLimit == 0.0f) aLimit = aScale * 0.5f;
1864 case Aspect_TOM_RING3:
1866 if (aLimit == 0.0f) aLimit = aScale * 0.8f;
1867 for (; aScale > aLimit && aScale >= 1.0f; aScale -= aDelta)
1869 GetMarkerBitMapParam (Aspect_TOM_O, aScale, aWidth, aHeight, anOffset, aNumOfBytes);
1870 glBitmap ((GLsizei )aWidth, (GLsizei )aHeight, 0.5f * GLfloat(aWidth), 0.5f * GLfloat(aHeight),
1871 0.0f, 0.0f, (const GLubyte* )&OpenGl_AspectMarker_myMarkerRaster[anOffset]);
1877 GetMarkerBitMapParam (theType, theScale, aWidth, aHeight, anOffset, aNumOfBytes);
1878 glBitmap ((GLsizei )aWidth, (GLsizei )aHeight, 0.5f * GLfloat(aWidth), 0.5f * GLfloat(aHeight),
1879 0.0f, 0.0f, (const GLubyte* )&OpenGl_AspectMarker_myMarkerRaster[anOffset]);
1889 // =======================================================================
1890 // function : BuildShader
1892 // =======================================================================
1893 void OpenGl_AspectMarker::Resources::BuildShader (const Handle(OpenGl_Workspace)& theWS,
1894 const Handle(Graphic3d_ShaderProgram)& theShader)
1896 const Handle(OpenGl_Context)& aContext = theWS->GetGlContext();
1897 if (!aContext->IsGlGreaterEqual (2, 0))
1902 // release old shader program resources
1903 if (!ShaderProgram.IsNull())
1905 aContext->ShaderManager()->Unregister (ShaderProgramId, ShaderProgram);
1906 ShaderProgramId.Clear();
1907 ShaderProgram.Nullify();
1909 if (theShader.IsNull())
1914 aContext->ShaderManager()->Create (theShader, ShaderProgramId, ShaderProgram);
1917 // =======================================================================
1918 // function : resourceKeys
1920 // =======================================================================
1921 void OpenGl_AspectMarker::Resources::SpriteKeys (const Handle(Graphic3d_MarkerImage)& theMarkerImage,
1922 const Aspect_TypeOfMarker theType,
1923 const Standard_ShortReal theScale,
1924 const TEL_COLOUR& theColor,
1925 TCollection_AsciiString& theKey,
1926 TCollection_AsciiString& theKeyA)
1928 // generate key for shared resource
1929 if (theType == Aspect_TOM_USERDEFINED)
1931 if (!theMarkerImage.IsNull())
1933 theKey = theMarkerImage->GetImageId();
1934 theKeyA = theMarkerImage->GetImageAlphaId();
1937 else if (theType != Aspect_TOM_POINT)
1939 // predefined markers
1940 const Standard_Integer aScale = Standard_Integer(theScale + 0.5f);
1941 theKey = TCollection_AsciiString ("OpenGl_AspectMarker") + theType + "_" + aScale;
1942 theKeyA = theKey + "A";
1943 if (theType == Aspect_TOM_BALL)
1945 unsigned int aColor[3] =
1947 (unsigned int )(255.0f * theColor.rgb[0]),
1948 (unsigned int )(255.0f * theColor.rgb[1]),
1949 (unsigned int )(255.0f * theColor.rgb[2])
1952 sprintf (aBytes, "%02X%02X%02X", aColor[0], aColor[1], aColor[2]);