Geant4 Cross Reference |
1 // 1 2 // ******************************************* 3 // * License and Disclaimer 4 // * 5 // * The Geant4 software is copyright of th 6 // * the Geant4 Collaboration. It is provided 7 // * conditions of the Geant4 Software License 8 // * LICENSE and available at http://cern.ch/ 9 // * include a list of copyright holders. 10 // * 11 // * Neither the authors of this software syst 12 // * institutes,nor the agencies providing fin 13 // * work make any representation or warran 14 // * regarding this software system or assum 15 // * use. Please see the license in the file 16 // * for the full disclaimer and the limitatio 17 // * 18 // * This code implementation is the result 19 // * technical work of the GEANT4 collaboratio 20 // * By using, copying, modifying or distri 21 // * any work based on the software) you ag 22 // * use in resulting scientific publicati 23 // * acceptance of all terms of the Geant4 Sof 24 // ******************************************* 25 // 26 27 /*----------------------------HEPVis---------- 28 /* 29 /* Node: SoMarkerSet 30 /* Author: Guy Barrand 31 /* 32 /*-------------------------------------------- 33 34 // this : 35 #include <HEPVis/nodes/SoMarkerSet.h> 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/SoCoordinateElemen 43 #include <Inventor/elements/SoCacheElement.h> 44 #include <Inventor/elements/SoLazyElement.h> 45 46 #include <HEPVis/SbGL.h> 47 #include <HEPVis/actions/SoGL2PSAction.h> 48 49 static void drawMarker(SoAction*,int); 50 static 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 ; firs 63 In the below, '-' means that glBitmap will m 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 ////////////////////////////////////////////// 74 static char plus_5_5[] = { 75 " x " 76 " x " 77 "xxxxx" 78 " x " 79 " x " 80 }; 81 static char asterisk_5_5[] = { 82 "x x x" 83 " xxx " 84 " x " 85 " xxx " 86 "x x x" 87 }; 88 static char cross_5_5[] = { 89 "x x" 90 " x x " 91 " x " 92 " x x " 93 "x x" 94 }; 95 static char star_5_5[] = { 96 "x x x" 97 " xxx " 98 "xxxxx" 99 " xxx " 100 "x x x" 101 }; 102 static char circle_line_5_5[] = { 103 " xxx " 104 "x x" 105 "x x" 106 "x x" 107 " xxx " 108 }; 109 static char circle_filled_5_5[] = { 110 " xxx " 111 "xxxxx" 112 "xxxxx" 113 "xxxxx" 114 " xxx " 115 }; 116 static char triangle_up_line_5_5[] = { //OpenG 117 "xxxxx" 118 " x x " 119 " x x " 120 " x " 121 " x " 122 }; 123 static char triangle_up_filled_5_5[] = { 124 "xxxxx" 125 " xxx " 126 " xxx " 127 " x " 128 " x " 129 }; 130 static char triangle_down_line_5_5[] = { 131 " x " 132 " x " 133 " x x " 134 " x x " 135 "xxxxx" 136 }; 137 static char triangle_down_filled_5_5[] = { 138 " x " 139 " x " 140 " xxx " 141 " xxx " 142 "xxxxx" 143 }; 144 static char david_star_line_5_5[] = { 145 " x " 146 "xxxxx" 147 " x x " 148 "xxxxx" 149 " x " 150 }; 151 static char david_star_filled_5_5[] = { 152 " x " 153 "xxxxx" 154 " xxx " 155 "xxxxx" 156 " x " 157 }; 158 static char swiss_cross_line_5_5[] = { 159 " xxx " 160 "xx xx" 161 "x x" 162 "xx xx" 163 " xxx " 164 }; 165 static char swiss_cross_filled_5_5[] = { 166 " xxx " 167 "xxxxx" 168 "xxxxx" 169 "xxxxx" 170 " xxx " 171 }; 172 static char diamond_line_5_5[] = { 173 " x " 174 " x x " 175 "x x" 176 " x x " 177 " x " 178 }; 179 static char diamond_filled_5_5[] = { 180 " x " 181 " xxx " 182 "xxxxx" 183 " xxx " 184 " x " 185 }; 186 static char square_line_5_5[] = { 187 "xxxxx" 188 "x x" 189 "x x" 190 "x x" 191 "xxxxx" 192 }; 193 static char square_filled_5_5[] = { 194 "xxxxx" 195 "xxxxx" 196 "xxxxx" 197 "xxxxx" 198 "xxxxx" 199 }; 200 ////////////////////////////////////////////// 201 /// 7 7 ////////////////////////////////////// 202 ////////////////////////////////////////////// 203 static char plus_7_7[] = { 204 " x " 205 " x " 206 " x " 207 "xxxxxxx" 208 " x " 209 " x " 210 " x " 211 }; 212 static 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 }; 221 static char cross_7_7[] = { 222 "x x" 223 " x x " 224 " xxx " 225 " x " 226 " xxx " 227 " x x " 228 "x x" 229 }; 230 static 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 }; 239 static 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 }; 248 static char circle_filled_7_7[] = { 249 " xxxxx " 250 "xxxxxxx" 251 "xxxxxxx" 252 "xxxxxxx" 253 "xxxxxxx" 254 "xxxxxxx" 255 " xxxxx " 256 }; 257 static char triangle_up_line_7_7[] = { //OpenG 258 "xxxxxxx" 259 " x x " 260 " x x " 261 " x x " 262 " x x " 263 " x " 264 " x " 265 }; 266 static char triangle_up_filled_7_7[] = { 267 "xxxxxxx" 268 " xxxxx " 269 " xxxxx " 270 " xxx " 271 " xxx " 272 " x " 273 " x " 274 }; 275 static 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 }; 284 static char triangle_down_filled_7_7[] = { 285 " x " 286 " x " 287 " xxx " 288 " xxx " 289 " xxxxx " 290 " xxxxx " 291 "xxxxxxx" 292 }; 293 static char david_star_line_7_7[] = { 294 " x " 295 "xxxxxxx" 296 " x x " 297 " x x " 298 " x x " 299 "xxxxxxx" 300 " x " 301 }; 302 static char david_star_filled_7_7[] = { 303 " x " 304 "xxxxxxx" 305 " xxxxx " 306 " xxx " 307 " xxxxx " 308 "xxxxxxx" 309 " x " 310 }; 311 static 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 }; 320 static char swiss_cross_filled_7_7[] = { 321 " xxx " 322 " xxx " 323 "xxxxxxx" 324 "xxxxxxx" 325 "xxxxxxx" 326 " xxx " 327 " xxx " 328 }; 329 static 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 }; 338 static char diamond_filled_7_7[] = { 339 " x " 340 " xxx " 341 " xxxxx " 342 "xxxxxxx" 343 " xxxxx " 344 " xxx " 345 " x " 346 }; 347 static 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 }; 356 static 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 ////////////////////////////////////////////// 369 static char plus_9_9[] = { 370 " x " 371 " x " 372 " x " 373 " x " 374 "xxxxxxxxx" 375 " x " 376 " x " 377 " x " 378 " x " 379 }; 380 static 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 }; 391 static 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 }; 402 static 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 }; 413 static 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 }; 424 static char circle_filled_9_9[] = { 425 " xxx " 426 " xxxxxxx " 427 " xxxxxxx " 428 "xxxxxxxxx" 429 "xxxxxxxxx" 430 "xxxxxxxxx" 431 " xxxxxxx " 432 " xxxxxxx " 433 " xxx " 434 }; 435 static char triangle_up_line_9_9[] = { //OpenG 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 }; 446 static 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 }; 457 static 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 }; 468 static 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 }; 479 static 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 }; 490 static 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 }; 501 static 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 }; 512 static 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 }; 523 static 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 }; 534 static char diamond_filled_9_9[] = { 535 " x " 536 " xxx " 537 " xxxxx " 538 " xxxxxxx " 539 "xxxxxxxxx" 540 " xxxxxxx " 541 " xxxxx " 542 " xxx " 543 " x " 544 }; 545 static 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 }; 556 static 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 568 static 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 625 SO_NODE_SOURCE(HEPVis_SoMarkerSet) 626 ////////////////////////////////////////////// 627 void 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,SoPo 636 } 637 } 638 ////////////////////////////////////////////// 639 HEPVis_SoMarkerSet::HEPVis_SoMarkerSet ( 640 ) 641 ////////////////////////////////////////////// 642 //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 643 { 644 SO_NODE_CONSTRUCTOR(HEPVis_SoMarkerSet); 645 646 SO_NODE_ADD_FIELD(markerIndex,(CROSS_5_5)); 647 } 648 ////////////////////////////////////////////// 649 HEPVis_SoMarkerSet::~HEPVis_SoMarkerSet ( 650 ) 651 ////////////////////////////////////////////// 652 //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 653 { 654 } 655 ////////////////////////////////////////////// 656 void HEPVis_SoMarkerSet::GLRender ( 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::getClass 669 SoCacheElement::invalidate(state); 670 } 671 672 const SbColor& color = SoLazyElement::getDif 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 | 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->ge 694 glRasterPos3f(vec[0],vec[1],vec[2]); 695 // Do a push, pop to correct a deffect of 696 // If not, further line drawing will have 697 // The glPopAttrib will compell a reinitia 698 // some internal Mesa state. 699 //glPushAttrib(GL_ALL_ATTRIB_BITS); 700 //glPopAttrib(); 701 // 702 drawMarker(aAction,mark); 703 } 704 705 glPopAttrib(); 706 } 707 ////////////////////////////////////////////// 708 void 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[a 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[a 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[a 735 glBitmap(w,h,xorig,yorig,0.,0.,bitmap); 736 delete [] bitmap; 737 } else { 738 return; 739 } 740 741 if(aAction->isOfType(SoGL2PSAction::getClass 742 ((SoGL2PSAction*)aAction)->addBitmap(w,h,x 743 } 744 745 } 746 ////////////////////////////////////////////// 747 GLubyte* 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 } 793