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