Geant4 9.6.0
Toolkit for the simulation of the passage of particles through matter
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
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