Geant4 9.6.0
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
SoMarkerSet.cc
Go to the documentation of this file.
1//
2// ********************************************************************
3// * License and Disclaimer *
4// * *
5// * The Geant4 software is copyright of the Copyright Holders of *
6// * the Geant4 Collaboration. It is provided under the terms and *
7// * conditions of the Geant4 Software License, included in the file *
8// * LICENSE and available at http://cern.ch/geant4/license . These *
9// * include a list of copyright holders. *
10// * *
11// * Neither the authors of this software system, nor their employing *
12// * institutes,nor the agencies providing financial support for this *
13// * work make any representation or warranty, express or implied, *
14// * regarding this software system or assume any liability for its *
15// * use. Please see the license in the file LICENSE and URL above *
16// * for the full disclaimer and the limitation of liability. *
17// * *
18// * This code implementation is the result of the scientific and *
19// * technical work of the GEANT4 collaboration. *
20// * By using, copying, modifying or distributing the software (or *
21// * any work based on the software) you agree to acknowledge its *
22// * use in resulting scientific publications, and indicate your *
23// * acceptance of all terms of the Geant4 Software license. *
24// ********************************************************************
25//
26#ifdef G4VIS_BUILD_OI_DRIVER
27
28/*----------------------------HEPVis----------------------------------------*/
29/* */
30/* Node: SoMarkerSet */
31/* Author: Guy Barrand */
32/* */
33/*--------------------------------------------------------------------------*/
34
35// this :
37
38#include <Inventor/errors/SoDebugError.h>
39#include <Inventor/misc/SoState.h>
40#include <Inventor/actions/SoGLRenderAction.h>
41#include <Inventor/nodes/SoPointSet.h>
42
43#include <Inventor/elements/SoCoordinateElement.h>
44#include <Inventor/elements/SoCacheElement.h>
45#include <Inventor/elements/SoLazyElement.h>
46
47#include <HEPVis/SbGL.h>
49
50static void drawMarker(SoAction*,int);
51static GLubyte* getBitmap(int,int,char []);
52
53/*
54 " x "
55 " x "
56 "xxxxx"
57 " x "
58 " x "
59
60 Should produce bitmap :
61 0x20,0x20,0xf8,0x20,0x20
62
63 The rows will be rendered down to top ; first row at bottom, last at top.
64 In the below, '-' means that glBitmap will move the pointer to next byte.
65
66 32103210 32103210 32103210 32103210 32103210
67 ..1..--- ..1..--- 11111--- ..1..--- ..1..---
68
69 0x20 0x20 0xf8 0x20 0x20
70*/
71
72///////////////////////////////////////////////////////////////
73/// 5 5 ///////////////////////////////////////////////////////
74///////////////////////////////////////////////////////////////
75static char plus_5_5[] = {
76 " x "
77 " x "
78 "xxxxx"
79 " x "
80 " x "
81};
82static char asterisk_5_5[] = {
83 "x x x"
84 " xxx "
85 " x "
86 " xxx "
87 "x x x"
88};
89static char cross_5_5[] = {
90 "x x"
91 " x x "
92 " x "
93 " x x "
94 "x x"
95};
96static char star_5_5[] = {
97 "x x x"
98 " xxx "
99 "xxxxx"
100 " xxx "
101 "x x x"
102};
103static char circle_line_5_5[] = {
104 " xxx "
105 "x x"
106 "x x"
107 "x x"
108 " xxx "
109};
110static char circle_filled_5_5[] = {
111 " xxx "
112 "xxxxx"
113 "xxxxx"
114 "xxxxx"
115 " xxx "
116};
117static char triangle_up_line_5_5[] = { //OpenGL will draw with y reversed.
118 "xxxxx"
119 " x x "
120 " x x "
121 " x "
122 " x "
123};
124static char triangle_up_filled_5_5[] = {
125 "xxxxx"
126 " xxx "
127 " xxx "
128 " x "
129 " x "
130};
131static char triangle_down_line_5_5[] = {
132 " x "
133 " x "
134 " x x "
135 " x x "
136 "xxxxx"
137};
138static char triangle_down_filled_5_5[] = {
139 " x "
140 " x "
141 " xxx "
142 " xxx "
143 "xxxxx"
144};
145static char david_star_line_5_5[] = {
146 " x "
147 "xxxxx"
148 " x x "
149 "xxxxx"
150 " x "
151};
152static char david_star_filled_5_5[] = {
153 " x "
154 "xxxxx"
155 " xxx "
156 "xxxxx"
157 " x "
158};
159static char swiss_cross_line_5_5[] = {
160 " xxx "
161 "xx xx"
162 "x x"
163 "xx xx"
164 " xxx "
165};
166static char swiss_cross_filled_5_5[] = {
167 " xxx "
168 "xxxxx"
169 "xxxxx"
170 "xxxxx"
171 " xxx "
172};
173static char diamond_line_5_5[] = {
174 " x "
175 " x x "
176 "x x"
177 " x x "
178 " x "
179};
180static char diamond_filled_5_5[] = {
181 " x "
182 " xxx "
183 "xxxxx"
184 " xxx "
185 " x "
186};
187static char square_line_5_5[] = {
188 "xxxxx"
189 "x x"
190 "x x"
191 "x x"
192 "xxxxx"
193};
194static char square_filled_5_5[] = {
195 "xxxxx"
196 "xxxxx"
197 "xxxxx"
198 "xxxxx"
199 "xxxxx"
200};
201///////////////////////////////////////////////////////////////
202/// 7 7 ///////////////////////////////////////////////////////
203///////////////////////////////////////////////////////////////
204static char plus_7_7[] = {
205 " x "
206 " x "
207 " x "
208 "xxxxxxx"
209 " x "
210 " x "
211 " x "
212};
213static char asterisk_7_7[] = {
214 "x x x"
215 " x x x "
216 " xxx "
217 " x "
218 " xxx "
219 " x x x "
220 "x x x"
221};
222static char cross_7_7[] = {
223 "x x"
224 " x x "
225 " xxx "
226 " x "
227 " xxx "
228 " x x "
229 "x x"
230};
231static char star_7_7[] = {
232 "x x x"
233 " x x x "
234 " xxx "
235 "xxxxxxx"
236 " xxx "
237 " x x x "
238 "x x x"
239};
240static char circle_line_7_7[] = {
241 " xxxxx "
242 "x x"
243 "x x"
244 "x x"
245 "x x"
246 "x x"
247 " xxxxx "
248};
249static char circle_filled_7_7[] = {
250 " xxxxx "
251 "xxxxxxx"
252 "xxxxxxx"
253 "xxxxxxx"
254 "xxxxxxx"
255 "xxxxxxx"
256 " xxxxx "
257};
258static char triangle_up_line_7_7[] = { //OpenGL will draw with y reversed.
259 "xxxxxxx"
260 " x x "
261 " x x "
262 " x x "
263 " x x "
264 " x "
265 " x "
266};
267static char triangle_up_filled_7_7[] = {
268 "xxxxxxx"
269 " xxxxx "
270 " xxxxx "
271 " xxx "
272 " xxx "
273 " x "
274 " x "
275};
276static char triangle_down_line_7_7[] = {
277 " x "
278 " x "
279 " x x "
280 " x x "
281 " x x "
282 " x x "
283 "xxxxxxx"
284};
285static char triangle_down_filled_7_7[] = {
286 " x "
287 " x "
288 " xxx "
289 " xxx "
290 " xxxxx "
291 " xxxxx "
292 "xxxxxxx"
293};
294static char david_star_line_7_7[] = {
295 " x "
296 "xxxxxxx"
297 " x x "
298 " x x "
299 " x x "
300 "xxxxxxx"
301 " x "
302};
303static char david_star_filled_7_7[] = {
304 " x "
305 "xxxxxxx"
306 " xxxxx "
307 " xxx "
308 " xxxxx "
309 "xxxxxxx"
310 " x "
311};
312static char swiss_cross_line_7_7[] = {
313 " xxx "
314 " x x "
315 "xxx xxx"
316 "x x"
317 "xxx xxx"
318 " x x "
319 " xxx "
320};
321static char swiss_cross_filled_7_7[] = {
322 " xxx "
323 " xxx "
324 "xxxxxxx"
325 "xxxxxxx"
326 "xxxxxxx"
327 " xxx "
328 " xxx "
329};
330static char diamond_line_7_7[] = {
331 " x "
332 " x x "
333 " x x "
334 "x x"
335 " x x "
336 " x x "
337 " x "
338};
339static char diamond_filled_7_7[] = {
340 " x "
341 " xxx "
342 " xxxxx "
343 "xxxxxxx"
344 " xxxxx "
345 " xxx "
346 " x "
347};
348static char square_line_7_7[] = {
349 "xxxxxxx"
350 "x x"
351 "x x"
352 "x x"
353 "x x"
354 "x x"
355 "xxxxxxx"
356};
357static char square_filled_7_7[] = {
358 "xxxxxxx"
359 "xxxxxxx"
360 "xxxxxxx"
361 "xxxxxxx"
362 "xxxxxxx"
363 "xxxxxxx"
364 "xxxxxxx"
365};
366
367///////////////////////////////////////////////////////////////
368/// 9 9 ///////////////////////////////////////////////////////
369///////////////////////////////////////////////////////////////
370static char plus_9_9[] = {
371 " x "
372 " x "
373 " x "
374 " x "
375 "xxxxxxxxx"
376 " x "
377 " x "
378 " x "
379 " x "
380};
381static char asterisk_9_9[] = {
382 "x x x"
383 " x x x "
384 " x x x "
385 " xxx "
386 " x "
387 " xxx "
388 " x x x "
389 " x x x "
390 "x x x"
391};
392static char cross_9_9[] = {
393 "x x"
394 " x x "
395 " x x "
396 " x x "
397 " x "
398 " x x "
399 " x x "
400 " x x "
401 "x x"
402};
403static char star_9_9[] = {
404 "x x x"
405 " x x x "
406 " x x x "
407 " xxx "
408 "xxxxxxxxx"
409 " xxx "
410 " x x x "
411 " x x x "
412 "x x x"
413};
414static char circle_line_9_9[] = {
415 " xxx "
416 " xx xx "
417 " x x "
418 "x x"
419 "x x"
420 "x x"
421 " x x "
422 " xx xx "
423 " xxx "
424};
425static char circle_filled_9_9[] = {
426 " xxx "
427 " xxxxxxx "
428 " xxxxxxx "
429 "xxxxxxxxx"
430 "xxxxxxxxx"
431 "xxxxxxxxx"
432 " xxxxxxx "
433 " xxxxxxx "
434 " xxx "
435};
436static char triangle_up_line_9_9[] = { //OpenGL will draw with y reversed.
437 "xxxxxxxxx"
438 " x x "
439 " x x "
440 " x x "
441 " x x "
442 " x x "
443 " x x "
444 " x "
445 " x "
446};
447static char triangle_up_filled_9_9[] = {
448 "xxxxxxxxx"
449 " xxxxxxx "
450 " xxxxxxx "
451 " xxxxx "
452 " xxxxx "
453 " xxx "
454 " xxx "
455 " x "
456 " x "
457};
458static char triangle_down_line_9_9[] = {
459 " x "
460 " x "
461 " x x "
462 " x x "
463 " x x "
464 " x x "
465 " x x "
466 " x x "
467 "xxxxxxxxx"
468};
469static char triangle_down_filled_9_9[] = {
470 " x "
471 " x "
472 " xxx "
473 " xxx "
474 " xxxxx "
475 " xxxxx "
476 " xxxxxxx "
477 " xxxxxxx "
478 "xxxxxxxxx"
479};
480static char david_star_line_9_9[] = {
481 " x "
482 " x x "
483 "xxxxxxxxx"
484 " x x "
485 " x x "
486 " x x "
487 "xxxxxxxxx"
488 " x x "
489 " x "
490};
491static char david_star_filled_9_9[] = {
492 " x "
493 " xxx "
494 "xxxxxxxxx"
495 " xxxxxxx "
496 " xxxxx "
497 " xxxxxxx "
498 "xxxxxxxxx"
499 " xxx "
500 " x "
501};
502static char swiss_cross_line_9_9[] = {
503 " xxx "
504 " x x "
505 " x x "
506 "xxxx xxxx"
507 "x x"
508 "xxxx xxxx"
509 " x x "
510 " x x "
511 " xxx "
512};
513static char swiss_cross_filled_9_9[] = {
514 " xxx "
515 " xxx "
516 " xxx "
517 "xxxxxxxxx"
518 "xxxxxxxxx"
519 "xxxxxxxxx"
520 " xxx "
521 " xxx "
522 " xxx "
523};
524static char diamond_line_9_9[] = {
525 " x "
526 " x x "
527 " x x "
528 " x x "
529 "x x"
530 " x x "
531 " x x "
532 " x x "
533 " x "
534};
535static char diamond_filled_9_9[] = {
536 " x "
537 " xxx "
538 " xxxxx "
539 " xxxxxxx "
540 "xxxxxxxxx"
541 " xxxxxxx "
542 " xxxxx "
543 " xxx "
544 " x "
545};
546static char square_line_9_9[] = {
547 "xxxxxxxxx"
548 "x x"
549 "x x"
550 "x x"
551 "x x"
552 "x x"
553 "x x"
554 "x x"
555 "xxxxxxxxx"
556};
557static char square_filled_9_9[] = {
558 "xxxxxxxxx"
559 "xxxxxxxxx"
560 "xxxxxxxxx"
561 "xxxxxxxxx"
562 "xxxxxxxxx"
563 "xxxxxxxxx"
564 "xxxxxxxxx"
565 "xxxxxxxxx"
566 "xxxxxxxxx"
567};
568
569static char* sFigures[54] = {
570 plus_5_5, //0
571 asterisk_5_5,
572 cross_5_5,
573 star_5_5,
574 circle_line_5_5,
575 circle_filled_5_5,
576 triangle_up_line_5_5,
577 triangle_up_filled_5_5,
578 triangle_down_line_5_5,
579 triangle_down_filled_5_5,
580 david_star_line_5_5,
581 david_star_filled_5_5,
582 swiss_cross_line_5_5,
583 swiss_cross_filled_5_5,
584 diamond_line_5_5,
585 diamond_filled_5_5,
586 square_line_5_5,
587 square_filled_5_5, //17
588 plus_7_7,
589 asterisk_7_7,
590 cross_7_7,
591 star_7_7,
592 circle_line_7_7,
593 circle_filled_7_7,
594 triangle_up_line_7_7,
595 triangle_up_filled_7_7,
596 triangle_down_line_7_7,
597 triangle_down_filled_7_7,
598 david_star_line_7_7,
599 david_star_filled_7_7,
600 swiss_cross_line_7_7,
601 swiss_cross_filled_7_7,
602 diamond_line_7_7,
603 diamond_filled_7_7,
604 square_line_7_7,
605 square_filled_7_7, //35
606 plus_9_9,
607 asterisk_9_9,
608 cross_9_9,
609 star_9_9,
610 circle_line_9_9,
611 circle_filled_9_9,
612 triangle_up_line_9_9,
613 triangle_up_filled_9_9,
614 triangle_down_line_9_9,
615 triangle_down_filled_9_9,
616 david_star_line_9_9,
617 david_star_filled_9_9,
618 swiss_cross_line_9_9,
619 swiss_cross_filled_9_9,
620 diamond_line_9_9,
621 diamond_filled_9_9,
622 square_line_9_9,
623 square_filled_9_9 //53
624};
625
626SO_NODE_SOURCE(HEPVis_SoMarkerSet)
627//////////////////////////////////////////////////////////////////////////////
629)
630//////////////////////////////////////////////////////////////////////////////
631//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
632{
633 SO_NODE_INIT_CLASS(HEPVis_SoMarkerSet,SoPointSet,"PointSet");
634}
635//////////////////////////////////////////////////////////////////////////////
637)
638//////////////////////////////////////////////////////////////////////////////
639//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
640{
641 SO_NODE_CONSTRUCTOR(HEPVis_SoMarkerSet);
642
643 SO_NODE_ADD_FIELD(markerIndex,(CROSS_5_5));
644}
645//////////////////////////////////////////////////////////////////////////////
647)
648//////////////////////////////////////////////////////////////////////////////
649//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
650{
651}
652//////////////////////////////////////////////////////////////////////////////
654 SoGLRenderAction* aAction
655)
656//////////////////////////////////////////////////////////////////////////////
657//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
658{
659 SoState* state = aAction->getState();
660
661 const SoCoordinateElement* coordinateElement =
662 SoCoordinateElement::getInstance(state);
663 if(coordinateElement==NULL) return;
664
665 if(aAction->isOfType(SoGL2PSAction::getClassTypeId())) {
666 SoCacheElement::invalidate(state);
667 }
668
669 const SbColor& color = SoLazyElement::getDiffuse(aAction->getState(),0);
670 float red,green,blue;
671 color.getValue(red,green,blue);
672
673 int mark = markerIndex[0];
674
675 int starti = startIndex.getValue();
676 int pointn = numPoints.getValue();
677 int pointi;
678
679 glPushAttrib( (GLbitfield)(GL_CURRENT_BIT | GL_ENABLE_BIT));
680 glDisable(GL_LIGHTING);
681 glColor3f(red,green,blue);
682
683#ifdef WIN32
684 //WIN32 : depth test is out over bitmap !
685 glDisable(GL_DEPTH_TEST);
686#endif
687
688 glPixelStorei(GL_UNPACK_ALIGNMENT,1);
689 for(pointi=starti;pointi<pointn;pointi++){
690 const SbVec3f& vec = coordinateElement->get3(pointi);
691 glRasterPos3f(vec[0],vec[1],vec[2]);
692 // Do a push, pop to correct a deffect of Mesa-3.1.
693 // If not, further line drawing will have bad colors.
694 // The glPopAttrib will compell a reinitialisation of
695 // some internal Mesa state.
696 //glPushAttrib(GL_ALL_ATTRIB_BITS);
697 //glPopAttrib();
698 //
699 drawMarker(aAction,mark);
700 }
701
702 glPopAttrib();
703}
704//////////////////////////////////////////////////////////////////////////////
705void drawMarker(
706 SoAction* aAction
707,int aStyle
708)
709//////////////////////////////////////////////////////////////////////////////
710//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
711{
712 GLsizei w = 0,h = 0;
713 GLfloat xorig = 0,yorig = 0;
714 GLfloat xmove = 0,ymove = 0;
715
716 if((aStyle>=0)&&(aStyle<18)) {
717 w = h = 5;
718 xorig = yorig = 2;
719 GLubyte* bitmap = getBitmap(w,h,sFigures[aStyle]);
720 glBitmap(w,h,xorig,yorig,0.,0.,bitmap);
721 delete [] bitmap;
722 } else if((aStyle>=18)&&(aStyle<36)) {
723 w = h = 7;
724 xorig = yorig = 3;
725 GLubyte* bitmap = getBitmap(w,h,sFigures[aStyle]);
726 glBitmap(w,h,xorig,yorig,0.,0.,bitmap);
727 delete [] bitmap;
728 } else if((aStyle>=36)&&(aStyle<54)) {
729 w = h = 9;
730 xorig = yorig = 4;
731 GLubyte* bitmap = getBitmap(w,h,sFigures[aStyle]);
732 glBitmap(w,h,xorig,yorig,0.,0.,bitmap);
733 delete [] bitmap;
734 } else {
735 return;
736 }
737
738 if(aAction->isOfType(SoGL2PSAction::getClassTypeId())) {
739 ((SoGL2PSAction*)aAction)->addBitmap(w,h,xorig,yorig,xmove,ymove);
740 }
741
742}
743//////////////////////////////////////////////////////////////////////////////
744GLubyte* getBitmap(
745 int aW
746,int aH
747,char aFigure[]
748)
749//////////////////////////////////////////////////////////////////////////////
750//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
751{
752 int index = 0;
753 GLubyte* bitmap = new GLubyte[aW * aH + 1];
754 int ichar = 0;
755 int ibit = 0;
756 unsigned char byte = 0;
757 for ( int row = 0; row < aH; row++ ){
758 for ( int col = 0; col < aW; col++){
759 unsigned char c = aFigure[ichar];
760 ichar++;
761 if(c==' ') {
762 ibit++;
763 } else {
764 byte += (1<<(7-ibit));
765 ibit++;
766 }
767 if(ibit==8) {
768 //unsigned char h = byte / 16;
769 //unsigned char l = byte % 16;
770 //printf("0x%x%x\n",h,l);
771 bitmap[index] = byte;
772 index++;
773 ibit = 0;
774 byte = 0;
775 }
776
777 }
778 if(ibit!=8) { //Jump to next byte.
779 //unsigned char h = byte / 16;
780 //unsigned char l = byte % 16;
781 //printf("0x%x%x\n",h,l);
782 bitmap[index] = byte;
783 index++;
784 ibit = 0;
785 byte = 0;
786 }
787 }
788 return bitmap;
789}
790
791#endif
virtual void GLRender(SoGLRenderAction *)
virtual ~HEPVis_SoMarkerSet()
static void initClass()
SoMFInt32 markerIndex
Definition: SoMarkerSet.h:38