ECCE @ EIC Software
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
SoMarkerSet.cc
Go to the documentation of this file. Or view the newest version in sPHENIX GitHub for file SoMarkerSet.cc
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 
50 static void drawMarker(SoAction*,int);
51 static 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 
75 static char plus_5_5[] = {
76  " x "
77  " x "
78  "xxxxx"
79  " x "
80  " x "
81 };
82 static char asterisk_5_5[] = {
83  "x x x"
84  " xxx "
85  " x "
86  " xxx "
87  "x x x"
88 };
89 static char cross_5_5[] = {
90  "x x"
91  " x x "
92  " x "
93  " x x "
94  "x x"
95 };
96 static char star_5_5[] = {
97  "x x x"
98  " xxx "
99  "xxxxx"
100  " xxx "
101  "x x x"
102 };
103 static char circle_line_5_5[] = {
104  " xxx "
105  "x x"
106  "x x"
107  "x x"
108  " xxx "
109 };
110 static char circle_filled_5_5[] = {
111  " xxx "
112  "xxxxx"
113  "xxxxx"
114  "xxxxx"
115  " xxx "
116 };
117 static 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 };
124 static char triangle_up_filled_5_5[] = {
125  "xxxxx"
126  " xxx "
127  " xxx "
128  " x "
129  " x "
130 };
131 static char triangle_down_line_5_5[] = {
132  " x "
133  " x "
134  " x x "
135  " x x "
136  "xxxxx"
137 };
138 static char triangle_down_filled_5_5[] = {
139  " x "
140  " x "
141  " xxx "
142  " xxx "
143  "xxxxx"
144 };
145 static char david_star_line_5_5[] = {
146  " x "
147  "xxxxx"
148  " x x "
149  "xxxxx"
150  " x "
151 };
152 static char david_star_filled_5_5[] = {
153  " x "
154  "xxxxx"
155  " xxx "
156  "xxxxx"
157  " x "
158 };
159 static char swiss_cross_line_5_5[] = {
160  " xxx "
161  "xx xx"
162  "x x"
163  "xx xx"
164  " xxx "
165 };
166 static char swiss_cross_filled_5_5[] = {
167  " xxx "
168  "xxxxx"
169  "xxxxx"
170  "xxxxx"
171  " xxx "
172 };
173 static char diamond_line_5_5[] = {
174  " x "
175  " x x "
176  "x x"
177  " x x "
178  " x "
179 };
180 static char diamond_filled_5_5[] = {
181  " x "
182  " xxx "
183  "xxxxx"
184  " xxx "
185  " x "
186 };
187 static char square_line_5_5[] = {
188  "xxxxx"
189  "x x"
190  "x x"
191  "x x"
192  "xxxxx"
193 };
194 static char square_filled_5_5[] = {
195  "xxxxx"
196  "xxxxx"
197  "xxxxx"
198  "xxxxx"
199  "xxxxx"
200 };
204 static char plus_7_7[] = {
205  " x "
206  " x "
207  " x "
208  "xxxxxxx"
209  " x "
210  " x "
211  " x "
212 };
213 static 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 };
222 static char cross_7_7[] = {
223  "x x"
224  " x x "
225  " xxx "
226  " x "
227  " xxx "
228  " x x "
229  "x x"
230 };
231 static 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 };
240 static 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 };
249 static char circle_filled_7_7[] = {
250  " xxxxx "
251  "xxxxxxx"
252  "xxxxxxx"
253  "xxxxxxx"
254  "xxxxxxx"
255  "xxxxxxx"
256  " xxxxx "
257 };
258 static 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 };
267 static char triangle_up_filled_7_7[] = {
268  "xxxxxxx"
269  " xxxxx "
270  " xxxxx "
271  " xxx "
272  " xxx "
273  " x "
274  " x "
275 };
276 static 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 };
285 static char triangle_down_filled_7_7[] = {
286  " x "
287  " x "
288  " xxx "
289  " xxx "
290  " xxxxx "
291  " xxxxx "
292  "xxxxxxx"
293 };
294 static char david_star_line_7_7[] = {
295  " x "
296  "xxxxxxx"
297  " x x "
298  " x x "
299  " x x "
300  "xxxxxxx"
301  " x "
302 };
303 static char david_star_filled_7_7[] = {
304  " x "
305  "xxxxxxx"
306  " xxxxx "
307  " xxx "
308  " xxxxx "
309  "xxxxxxx"
310  " x "
311 };
312 static 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 };
321 static char swiss_cross_filled_7_7[] = {
322  " xxx "
323  " xxx "
324  "xxxxxxx"
325  "xxxxxxx"
326  "xxxxxxx"
327  " xxx "
328  " xxx "
329 };
330 static 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 };
339 static char diamond_filled_7_7[] = {
340  " x "
341  " xxx "
342  " xxxxx "
343  "xxxxxxx"
344  " xxxxx "
345  " xxx "
346  " x "
347 };
348 static 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 };
357 static char square_filled_7_7[] = {
358  "xxxxxxx"
359  "xxxxxxx"
360  "xxxxxxx"
361  "xxxxxxx"
362  "xxxxxxx"
363  "xxxxxxx"
364  "xxxxxxx"
365 };
366 
370 static char plus_9_9[] = {
371  " x "
372  " x "
373  " x "
374  " x "
375  "xxxxxxxxx"
376  " x "
377  " x "
378  " x "
379  " x "
380 };
381 static 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 };
392 static 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 };
403 static 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 };
414 static 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 };
425 static char circle_filled_9_9[] = {
426  " xxx "
427  " xxxxxxx "
428  " xxxxxxx "
429  "xxxxxxxxx"
430  "xxxxxxxxx"
431  "xxxxxxxxx"
432  " xxxxxxx "
433  " xxxxxxx "
434  " xxx "
435 };
436 static 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 };
447 static 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 };
458 static 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 };
469 static 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 };
480 static 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 };
491 static 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 };
502 static 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 };
513 static 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 };
524 static 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 };
535 static char diamond_filled_9_9[] = {
536  " x "
537  " xxx "
538  " xxxxx "
539  " xxxxxxx "
540  "xxxxxxxxx"
541  " xxxxxxx "
542  " xxxxx "
543  " xxx "
544  " x "
545 };
546 static 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 };
557 static 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 
569 static 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 
626 SO_NODE_SOURCE(HEPVis_SoMarkerSet)
628 void HEPVis_SoMarkerSet::initClass (
629 )
632 {
633  SO_NODE_INIT_CLASS(HEPVis_SoMarkerSet,SoPointSet,"PointSet");
634 }
637 )
640 {
641  SO_NODE_CONSTRUCTOR(HEPVis_SoMarkerSet);
642 
643  SO_NODE_ADD_FIELD(markerIndex,(CROSS_5_5));
644 }
647 )
650 {
651 }
654  SoGLRenderAction* aAction
655 )
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 }
705 void drawMarker(
706  SoAction* aAction
707 ,int aStyle
708 )
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 }
744 GLubyte* 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