0022149: Strings with Japanese characters can not be displayed in 3D viewer
[occt.git] / src / OpenGl / OpenGl_GraphicDriver_703.cxx
CommitLineData
7fd59977 1
2// File OpenGl_GraphicDriver_703.cxx
3// Created Mardi 28 janvier 1997
4// Author CAL
5
6//-Copyright MatraDatavision 1997
7
8//-Version
9
10//-Design Declaration des variables specifiques aux Drivers
11
12//-Warning Un driver encapsule les Pex et OpenGl drivers
13
14//-References
15
16//-Language C++ 2.0
17
18//-Declarations
19
20// for the class
21#include <OpenGl_GraphicDriver.jxx>
22#include <Aspect_TypeOfMarker.hxx>
23
24#include <Aspect_DriverDefinitionError.hxx>
25
26#include <OpenGl_tgl_funcs.hxx>
27
28int GenerateMarkerBitmap( unsigned int theWidth, unsigned int theHeight, unsigned char* theArray);
29
30//-Aliases
31
32//-Global data definitions
33
34//-Methods, in order
35
36void OpenGl_GraphicDriver::Marker (const Graphic3d_CGroup& ACGroup, const Graphic3d_Vertex& APoint, const Standard_Boolean )
37{
38
39 Graphic3d_CGroup MyCGroup = ACGroup;
40
41 CALL_DEF_MARKER amarker;
42
43 amarker.x = float (APoint.X ());
44 amarker.y = float (APoint.Y ());
45 amarker.z = float (APoint.Z ());
46
47 Standard_Real AMR, AMG, AMB, R, G, B;
48 Aspect_TypeOfMarker AMType;
49 Standard_Real AMScale, AScale;
50
51 // Sauvegarde des valeurs initiales
52 AMR = R = Standard_Real (MyCGroup.ContextMarker.Color.r);
53 AMG = G = Standard_Real (MyCGroup.ContextMarker.Color.g);
54 AMB = B = Standard_Real (MyCGroup.ContextMarker.Color.b);
55 AMType = Aspect_TypeOfMarker (MyCGroup.ContextMarker.MarkerType);
56 AMScale = AScale = Standard_Real (MyCGroup.ContextMarker.Scale);
57
58 int noinsert = 0;
59 Standard_Real H, L, S;
60 Standard_Real LastS;
61 Standard_Real Limit=0, Delta;
62
63 switch (AMType)
64 {
65
66 case Aspect_TOM_POINT :
67 case Aspect_TOM_PLUS :
68 case Aspect_TOM_STAR :
69 case Aspect_TOM_O :
70 case Aspect_TOM_X :
71 case Aspect_TOM_USERDEFINED:
72 if (MyTraceLevel)
73 {
74 PrintFunction ("call_togl_marker");
75 PrintCGroup (MyCGroup, 1);
76 }
77 call_togl_marker (&MyCGroup, &amarker);
78 break;
79
80 case Aspect_TOM_O_POINT :
81 MyCGroup.ContextMarker.IsDef = 1;
82
83 // we draw the circle
84 MyCGroup.ContextMarker.MarkerType =
85 int (Aspect_TOM_O);
86 call_togl_markercontextgroup (&MyCGroup, noinsert);
87
88 MyCGroup.ContextMarker.IsSet = 1;
89
90 if (MyTraceLevel) {
91 PrintFunction ("call_togl_marker");
92 PrintCGroup (MyCGroup, 1);
93 }
94 call_togl_marker (&MyCGroup, &amarker);
95
96 // we draw the point
97 MyCGroup.ContextMarker.MarkerType =
98 int (Aspect_TOM_POINT);
99 call_togl_markercontextgroup (&MyCGroup, noinsert);
100 if (MyTraceLevel) {
101 PrintFunction ("call_togl_marker");
102 PrintCGroup (MyCGroup, 1);
103 }
104 call_togl_marker (&MyCGroup, &amarker);
105 break;
106
107 case Aspect_TOM_O_PLUS :
108 MyCGroup.ContextMarker.IsDef = 1;
109
110 // we draw the circle
111 MyCGroup.ContextMarker.MarkerType =
112 int (Aspect_TOM_O);
113 call_togl_markercontextgroup (&MyCGroup, noinsert);
114
115 MyCGroup.ContextMarker.IsSet = 1;
116
117 if (MyTraceLevel) {
118 PrintFunction ("call_togl_marker");
119 PrintCGroup (MyCGroup, 1);
120 }
121 call_togl_marker (&MyCGroup, &amarker);
122
123 // we draw the plus
124 MyCGroup.ContextMarker.MarkerType =
125 int (Aspect_TOM_PLUS);
126 call_togl_markercontextgroup (&MyCGroup, noinsert);
127 if (MyTraceLevel) {
128 PrintFunction ("call_togl_marker");
129 PrintCGroup (MyCGroup, 1);
130 }
131 call_togl_marker (&MyCGroup, &amarker);
132 break;
133
134 case Aspect_TOM_O_STAR :
135 MyCGroup.ContextMarker.IsDef = 1;
136
137 // we draw the circle
138 MyCGroup.ContextMarker.MarkerType =
139 int (Aspect_TOM_O);
140 call_togl_markercontextgroup (&MyCGroup, noinsert);
141
142 MyCGroup.ContextMarker.IsSet = 1;
143
144 if (MyTraceLevel) {
145 PrintFunction ("call_togl_marker");
146 PrintCGroup (MyCGroup, 1);
147 }
148 call_togl_marker (&MyCGroup, &amarker);
149
150 // we draw the star
151 MyCGroup.ContextMarker.MarkerType =
152 int (Aspect_TOM_STAR);
153 call_togl_markercontextgroup (&MyCGroup, noinsert);
154 if (MyTraceLevel) {
155 PrintFunction ("call_togl_marker");
156 PrintCGroup (MyCGroup, 1);
157 }
158 call_togl_marker (&MyCGroup, &amarker);
159 break;
160
161 case Aspect_TOM_O_X :
162 MyCGroup.ContextMarker.IsDef = 1;
163
164 // we draw the circle
165 MyCGroup.ContextMarker.MarkerType =
166 int (Aspect_TOM_O);
167 call_togl_markercontextgroup (&MyCGroup, noinsert);
168
169 MyCGroup.ContextMarker.IsSet = 1;
170
171 if (MyTraceLevel) {
172 PrintFunction ("call_togl_marker");
173 PrintCGroup (MyCGroup, 1);
174 }
175 call_togl_marker (&MyCGroup, &amarker);
176
177 // we draw the cross
178 MyCGroup.ContextMarker.MarkerType =
179 int (Aspect_TOM_X);
180 call_togl_markercontextgroup (&MyCGroup, noinsert);
181 if (MyTraceLevel) {
182 PrintFunction ("call_togl_marker");
183 PrintCGroup (MyCGroup, 1);
184 }
185 call_togl_marker (&MyCGroup, &amarker);
186 break;
187
188 case Aspect_TOM_BALL :
189 MyCGroup.ContextMarker.IsDef = 1;
190
191 // we draw a set of circles
192 MyCGroup.ContextMarker.MarkerType =
193 int (Aspect_TOM_O);
194 Delta = 0.1;
195 while (AScale >= 1.0) {
196 Quantity_Color::RgbHls (R, G, B, H, L, S);
197 // Modification de la saturation de 5 %
198 LastS = S;
199 S = S - S * 0.05;
200 if (S < 0.0) S = LastS;
201 Quantity_Color::HlsRgb (H, L, S, R, G, B);
202 MyCGroup.ContextMarker.Color.r = float (R);
203 MyCGroup.ContextMarker.Color.g = float (G);
204 MyCGroup.ContextMarker.Color.b = float (B);
205 MyCGroup.ContextMarker.Scale = float (AScale);
206 call_togl_markercontextgroup (&MyCGroup, noinsert);
207
208 MyCGroup.ContextMarker.IsSet = 1;
209
210 if (MyTraceLevel) {
211 PrintFunction ("call_togl_marker");
212 PrintCGroup (MyCGroup, 1);
213 }
214 call_togl_marker (&MyCGroup, &amarker);
215 AScale -= Delta;
216 }
217 break;
218
219 case Aspect_TOM_RING1 :
220 case Aspect_TOM_RING2 :
221 case Aspect_TOM_RING3 :
222 MyCGroup.ContextMarker.IsDef = 1;
223
224 // we draw a set of circles
225 MyCGroup.ContextMarker.MarkerType =
226 int (Aspect_TOM_O);
227 if (AMType == Aspect_TOM_RING1)
228 Limit = AScale - AScale * 0.8;
229 if (AMType == Aspect_TOM_RING2)
230 Limit = AScale - AScale * 0.5;
231 if (AMType == Aspect_TOM_RING3)
232 Limit = AScale - AScale * 0.2;
233 Delta = 0.1;
234 while (AScale > Limit && AScale >= 1.0) {
235 MyCGroup.ContextMarker.Scale = float (AScale);
236 call_togl_markercontextgroup (&MyCGroup, noinsert);
237
238 MyCGroup.ContextMarker.IsSet = 1;
239
240 if (MyTraceLevel) {
241 PrintFunction ("call_togl_marker");
242 PrintCGroup (MyCGroup, 1);
243 }
244 call_togl_marker (&MyCGroup, &amarker);
245 AScale -= Delta;
246 }
247 break ;
248 default:
249 break ;
250 }
251
252 // Restauration des valeurs initiales
253 MyCGroup.ContextMarker.Color.r = float (AMR);
254 MyCGroup.ContextMarker.Color.g = float (AMR);
255 MyCGroup.ContextMarker.Color.b = float (AMR);
256 MyCGroup.ContextMarker.MarkerType = int (AMType);
257 MyCGroup.ContextMarker.Scale = float (AMScale);
258
259}
260
261void OpenGl_GraphicDriver::MarkerSet (const Graphic3d_CGroup& ACGroup,
262 const Graphic3d_Array1OfVertex& ListVertex,
263 const Standard_Boolean )
264{
265 // const Standard_Boolean EvalMinMax) {
266
267 Graphic3d_CGroup MyCGroup = ACGroup;
268
269 //static void (*fp2) (Graphic3d_CGroup *, CALL_DEF_LISTMARKERS *) = NULL;
270
271 //if (! fp2) {
272 //OSD_Function osdfp = NULL;
273 //osdfp = MySharedLibrary.DlSymb ("call_togl_marker_set");
274 //fp2 = (void (*)(Graphic3d_CGroup *, CALL_DEF_LISTMARKERS *)) osdfp;
275 //if (! osdfp)
276 //Aspect_DriverDefinitionError::Raise
277 //(MySharedLibrary.DlError ());
278 //}
279
280 //static void (*fp3) (Graphic3d_CGroup *, int) = NULL;
281
282 //if (! fp3) {
283 //OSD_Function osdfp = NULL;
284 //osdfp = MySharedLibrary.DlSymb ("call_togl_markercontextgroup");
285 //fp3 = (void (*)(Graphic3d_CGroup *, int)) osdfp;
286 //if (! osdfp)
287 //Aspect_DriverDefinitionError::Raise
288 //(MySharedLibrary.DlError ());
289 //}
290
291 Standard_Integer Lower = ListVertex.Lower ();
292
293 CALL_DEF_LISTMARKERS almarkers;
294
295 almarkers.NbMarkers = int (ListVertex.Length ());
296 almarkers.Markers = (CALL_DEF_MARKER *) &ListVertex (Lower);
297
298 Standard_Real AMR, AMG, AMB, R, G, B;
299 Aspect_TypeOfMarker AMType;
300 Standard_Real AMScale, AScale;
301
302 // Sauvegarde des valeurs initiales
303 AMR = R = Standard_Real (MyCGroup.ContextMarker.Color.r);
304 AMG = G = Standard_Real (MyCGroup.ContextMarker.Color.g);
305 AMB = B = Standard_Real (MyCGroup.ContextMarker.Color.b);
306 AMType = Aspect_TypeOfMarker (MyCGroup.ContextMarker.MarkerType);
307 AMScale = AScale = Standard_Real (MyCGroup.ContextMarker.Scale);
308
309 int noinsert = 0;
310 Standard_Real H, L, S;
311 Standard_Real LastS;
312 Standard_Real Limit=0, Delta;
313
314 switch (AMType) {
315
316 case Aspect_TOM_POINT :
317 case Aspect_TOM_PLUS :
318 case Aspect_TOM_STAR :
319 case Aspect_TOM_O :
320 case Aspect_TOM_X :
321 case Aspect_TOM_USERDEFINED:
322 if (MyTraceLevel) {
323 PrintFunction ("call_togl_marker_set");
324 PrintCGroup (MyCGroup, 1);
325 }
326 call_togl_marker_set (&MyCGroup, &almarkers);
327 break;
328
329 case Aspect_TOM_O_POINT :
330 MyCGroup.ContextMarker.IsDef = 1;
331
332 // we draw the circle
333 MyCGroup.ContextMarker.MarkerType =
334 int (Aspect_TOM_O);
335 call_togl_markercontextgroup (&MyCGroup, noinsert);
336
337 MyCGroup.ContextMarker.IsSet = 1;
338
339 if (MyTraceLevel) {
340 PrintFunction ("call_togl_marker_set");
341 PrintCGroup (MyCGroup, 1);
342 }
343 call_togl_marker_set (&MyCGroup, &almarkers);
344
345 // we draw the point
346 MyCGroup.ContextMarker.MarkerType =
347 int (Aspect_TOM_POINT);
348 call_togl_markercontextgroup (&MyCGroup, noinsert);
349 if (MyTraceLevel) {
350 PrintFunction ("call_togl_marker_set");
351 PrintCGroup (MyCGroup, 1);
352 }
353 call_togl_marker_set (&MyCGroup, &almarkers);
354 break;
355
356 case Aspect_TOM_O_PLUS :
357 MyCGroup.ContextMarker.IsDef = 1;
358
359 // we draw the circle
360 MyCGroup.ContextMarker.MarkerType =
361 int (Aspect_TOM_O);
362 call_togl_markercontextgroup (&MyCGroup, noinsert);
363
364 MyCGroup.ContextMarker.IsSet = 1;
365
366 if (MyTraceLevel) {
367 PrintFunction ("call_togl_marker_set");
368 PrintCGroup (MyCGroup, 1);
369 }
370 call_togl_marker_set (&MyCGroup, &almarkers);
371
372 // we draw the plus
373 MyCGroup.ContextMarker.MarkerType =
374 int (Aspect_TOM_PLUS);
375 call_togl_markercontextgroup (&MyCGroup, noinsert);
376 if (MyTraceLevel) {
377 PrintFunction ("call_togl_marker_set");
378 PrintCGroup (MyCGroup, 1);
379 }
380 call_togl_marker_set (&MyCGroup, &almarkers);
381 break;
382
383 case Aspect_TOM_O_STAR :
384 MyCGroup.ContextMarker.IsDef = 1;
385
386 // we draw the circle
387 MyCGroup.ContextMarker.MarkerType =
388 int (Aspect_TOM_O);
389 call_togl_markercontextgroup (&MyCGroup, noinsert);
390
391 MyCGroup.ContextMarker.IsSet = 1;
392
393 if (MyTraceLevel) {
394 PrintFunction ("call_togl_marker_set");
395 PrintCGroup (MyCGroup, 1);
396 }
397 call_togl_marker_set (&MyCGroup, &almarkers);
398
399 // we draw the star
400 MyCGroup.ContextMarker.MarkerType =
401 int (Aspect_TOM_STAR);
402 call_togl_markercontextgroup (&MyCGroup, noinsert);
403 if (MyTraceLevel) {
404 PrintFunction ("call_togl_marker_set");
405 PrintCGroup (MyCGroup, 1);
406 }
407 call_togl_marker_set (&MyCGroup, &almarkers);
408 break;
409
410 case Aspect_TOM_O_X :
411 MyCGroup.ContextMarker.IsDef = 1;
412
413 // we draw the circle
414 MyCGroup.ContextMarker.MarkerType =
415 int (Aspect_TOM_O);
416 call_togl_markercontextgroup (&MyCGroup, noinsert);
417
418 MyCGroup.ContextMarker.IsSet = 1;
419
420 if (MyTraceLevel) {
421 PrintFunction ("call_togl_marker_set");
422 PrintCGroup (MyCGroup, 1);
423 }
424 call_togl_marker_set (&MyCGroup, &almarkers);
425
426 // we draw the cross
427 MyCGroup.ContextMarker.MarkerType =
428 int (Aspect_TOM_X);
429 call_togl_markercontextgroup (&MyCGroup, noinsert);
430 if (MyTraceLevel) {
431 PrintFunction ("call_togl_marker_set");
432 PrintCGroup (MyCGroup, 1);
433 }
434 call_togl_marker_set (&MyCGroup, &almarkers);
435 break;
436
437 case Aspect_TOM_BALL :
438 MyCGroup.ContextMarker.IsDef = 1;
439
440 // we draw a set of circles
441 MyCGroup.ContextMarker.MarkerType =
442 int (Aspect_TOM_O);
443 Delta = 0.1;
444 while (AScale >= 1.0) {
445 Quantity_Color::RgbHls (R, G, B, H, L, S);
446 // Modification de la saturation de 5 %
447 LastS = S;
448 S = S - S * 0.05;
449 if (S < 0.0) S = LastS;
450 Quantity_Color::HlsRgb (H, L, S, R, G, B);
451 MyCGroup.ContextMarker.Color.r = float (R);
452 MyCGroup.ContextMarker.Color.g = float (G);
453 MyCGroup.ContextMarker.Color.b = float (B);
454 MyCGroup.ContextMarker.Scale = float (AScale);
455 call_togl_markercontextgroup (&MyCGroup, noinsert);
456
457 MyCGroup.ContextMarker.IsSet = 1;
458
459 if (MyTraceLevel) {
460 PrintFunction ("call_togl_marker_set");
461 PrintCGroup (MyCGroup, 1);
462 }
463 call_togl_marker_set (&MyCGroup, &almarkers);
464 AScale -= Delta;
465 }
466 break;
467
468 case Aspect_TOM_RING1 :
469 case Aspect_TOM_RING2 :
470 case Aspect_TOM_RING3 :
471 MyCGroup.ContextMarker.IsDef = 1;
472
473 // we draw a set of circles
474 MyCGroup.ContextMarker.MarkerType =
475 int (Aspect_TOM_O);
476 if (AMType == Aspect_TOM_RING1)
477 Limit = AScale - AScale * 0.8;
478 if (AMType == Aspect_TOM_RING2)
479 Limit = AScale - AScale * 0.5;
480 if (AMType == Aspect_TOM_RING3)
481 Limit = AScale - AScale * 0.2;
482 Delta = 0.1;
483 while (AScale > Limit && AScale >= 1.0) {
484 MyCGroup.ContextMarker.Scale = float (AScale);
485 call_togl_markercontextgroup (&MyCGroup, noinsert);
486
487 MyCGroup.ContextMarker.IsSet = 1;
488
489 if (MyTraceLevel) {
490 PrintFunction ("call_togl_marker_set");
491 PrintCGroup (MyCGroup, 1);
492 }
493 call_togl_marker_set (&MyCGroup, &almarkers);
494 AScale -= Delta;
495 }
496 break;
497 default:
498 break;
499 }
500
501 // Restauration des valeurs initiales
502 MyCGroup.ContextMarker.Color.r = float (AMR);
503 MyCGroup.ContextMarker.Color.g = float (AMR);
504 MyCGroup.ContextMarker.Color.b = float (AMR);
505 MyCGroup.ContextMarker.MarkerType = int (AMType);
506 MyCGroup.ContextMarker.Scale = float (AMScale);
507
508}