511 {
512
513
514
515
517
518
519
521 if (!pGLViewer) return;
522
523
524
526
527
528
529
530
531 GLfloat* painting_colour;
532 GLfloat clear_colour[4];
533 GLfloat current_colour[4];
534 glGetFloatv (GL_CURRENT_COLOR, current_colour);
535
536 G4bool isTransparent =
false;
537 if (current_colour[3] < 1.) {
538 isTransparent = true;
539 }
540
542
543 glGetFloatv (GL_COLOR_CLEAR_VALUE, clear_colour);
544 painting_colour = clear_colour;
545 } else {
546 painting_colour = current_colour;
547 }
548
551
553
555
556
557 glDisable (GL_LIGHTING);
558
559 switch (drawing_style) {
561
563 glEnable (GL_STENCIL_TEST);
564
565
566 glStencilFunc (GL_ALWAYS, 0, 1);
567 glStencilOp (GL_INVERT, GL_INVERT, GL_INVERT);
568 glEnable (GL_DEPTH_TEST);
569 glDepthFunc (GL_LEQUAL);
570 if (isTransparent) {
571
572 glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE);
573 glEnable(GL_COLOR_MATERIAL);
574
575 glPolygonMode (GL_FRONT_AND_BACK, GL_LINE);
576 } else {
577
578 if (clipping) {
579 glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE);
580 glEnable(GL_COLOR_MATERIAL);
581
582 glPolygonMode (GL_FRONT_AND_BACK, GL_LINE);
583 } else {
584 glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);
585 glEnable(GL_COLOR_MATERIAL);
586
587
588 glPolygonMode (GL_FRONT, GL_LINE);
589 }
590 }
591 break;
593 glEnable (GL_DEPTH_TEST);
594 glDepthFunc (GL_LEQUAL);
595 if (isTransparent) {
596
597 glDepthMask (GL_FALSE);
598 glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE);
599 glEnable(GL_COLOR_MATERIAL);
600
601 glPolygonMode (GL_FRONT_AND_BACK, GL_FILL);
602 } else {
603
604 glDepthMask (GL_TRUE);
605 if (clipping) {
606 glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE);
607 glEnable(GL_COLOR_MATERIAL);
608
609 glPolygonMode (GL_FRONT_AND_BACK, GL_FILL);
610 } else {
611 glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);
612 glEnable(GL_COLOR_MATERIAL);
613
614
615 glPolygonMode (GL_FRONT, GL_FILL);
616 }
617 }
619 break;
621 default:
622 glEnable (GL_DEPTH_TEST);
623 glDepthFunc (GL_LEQUAL);
624
625 glPolygonMode (GL_FRONT_AND_BACK, GL_LINE);
626 break;
627 }
628
629
631 glBegin (GL_QUADS);
632 glEdgeFlag (GL_TRUE);
634 do {
635
636
641 notLastFace = polyhedron.
GetNextFacet(nEdges, vertex, edgeFlag, normals);
642
643
644 for(
G4int edgeCount = 0; edgeCount < nEdges; ++edgeCount) {
645
646 if (isAuxEdgeVisible) {
647 edgeFlag[edgeCount] = 1;
648 }
649 if (edgeFlag[edgeCount] > 0) {
651 glEdgeFlag (GL_TRUE);
653 }
654 } else {
656 glEdgeFlag (GL_FALSE);
658 }
659 }
660 glNormal3d (normals[edgeCount].x(),
661 normals[edgeCount].y(),
662 normals[edgeCount].z());
663 glVertex3d (vertex[edgeCount].x(),
664 vertex[edgeCount].y(),
665 vertex[edgeCount].z());
666 }
667
668
669
670 if (nEdges == 3) {
672 normals[edgeCount] = normals[0];
673 vertex[edgeCount] = vertex[0];
674 edgeFlag[edgeCount] = -1;
676 glEdgeFlag (GL_FALSE);
678 }
679
680 glNormal3d (normals[edgeCount].x(),
681 normals[edgeCount].y(),
682 normals[edgeCount].z());
683 glVertex3d (vertex[edgeCount].x(),
684 vertex[edgeCount].y(),
685 vertex[edgeCount].z());
686 }
687
688 if (nEdges > 4) {
690 "G4OpenGLSceneHandler::AddPrimitive(G4Polyhedron): WARNING"
691 "\n G4Polyhedron facet with " << nEdges <<
" edges" <<
G4endl;
692 }
693
694
695
698
699 glDisable(GL_COLOR_MATERIAL);
700 glEnd ();
701
702
703
704
705
706
707 glDisable (GL_LIGHTING);
708
709
710 glStencilFunc (GL_EQUAL, 0, 1);
711 glStencilOp (GL_KEEP, GL_KEEP, GL_KEEP);
714 }
715 glEnable (GL_DEPTH_TEST);
716 glDepthFunc (GL_LEQUAL);
717 if (isTransparent) {
718
719 glDepthMask (GL_FALSE);
720
721 glPolygonMode (GL_FRONT_AND_BACK, GL_FILL);
722 } else {
723
724 glDepthMask (GL_TRUE);
725 if (clipping) {
726
727 glPolygonMode (GL_FRONT_AND_BACK, GL_FILL);
728 } else {
729
730
731 glPolygonMode (GL_FRONT, GL_FILL);
732 }
733 }
735 if (isTransparent) {
736
737 goto end_of_drawing_through_stencil;
738 }
739 }
740 if (isTransparent) {
741
742 glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, painting_colour);
743 } else {
744
745 glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, painting_colour);
746 }
747 glColor4fv (painting_colour);
748 glBegin (GL_QUADS);
749 glEdgeFlag (GL_TRUE);
751
752 for (int edgeCount = 0; edgeCount < 4; ++edgeCount) {
753 if (edgeFlag[edgeCount] > 0) {
755 glEdgeFlag (GL_TRUE);
757 }
758 } else {
760 glEdgeFlag (GL_FALSE);
762 }
763 }
764 glNormal3d (normals[edgeCount].x(),
765 normals[edgeCount].y(),
766 normals[edgeCount].z());
767 glVertex3d (vertex[edgeCount].x(),
768 vertex[edgeCount].y(),
769 vertex[edgeCount].z());
770 }
771 glEnd ();
772 end_of_drawing_through_stencil:
773
774
775 glStencilFunc (GL_ALWAYS, 0, 1);
776 glStencilOp (GL_INVERT, GL_INVERT, GL_INVERT);
777 glDepthFunc (GL_LEQUAL);
778 if (isTransparent) {
779
780
781 glPolygonMode (GL_FRONT_AND_BACK, GL_LINE);
782 } else {
783
784 if (clipping) {
785
786 glPolygonMode (GL_FRONT_AND_BACK, GL_LINE);
787 } else {
788
789
790 glPolygonMode (GL_FRONT, GL_LINE);
791 }
792 }
793 glDisable (GL_LIGHTING);
794 glColor4fv (current_colour);
796 glBegin (GL_QUADS);
797 glEdgeFlag (GL_TRUE);
799 for (int edgeCount = 0; edgeCount < 4; ++edgeCount) {
800 if (edgeFlag[edgeCount] > 0) {
802 glEdgeFlag (GL_TRUE);
804 }
805 } else {
807 glEdgeFlag (GL_FALSE);
809 }
810 }
811 glNormal3d (normals[edgeCount].x(),
812 normals[edgeCount].y(),
813 normals[edgeCount].z());
814 glVertex3d (vertex[edgeCount].x(),
815 vertex[edgeCount].y(),
816 vertex[edgeCount].z());
817 }
818 glEnd ();
819
820 glDepthFunc (GL_LEQUAL);
822 glBegin (GL_QUADS);
823 glEdgeFlag (GL_TRUE);
825
826
827
828 }
829 } while (notLastFace);
830
831 glEnd ();
832 glDisable (GL_STENCIL_TEST);
833 glDepthMask (GL_TRUE);
834 glDisable (GL_LIGHTING);
835}
G4GLOB_DLL std::ostream G4cerr
void ChangeLineWidth(G4double width)
const G4VisAttributes * fpVisAttribs
G4ViewParameters::DrawingStyle GetDrawingStyle(const G4VisAttributes *)
G4double GetLineWidth(const G4VisAttributes *)
G4bool GetAuxEdgeVisible(const G4VisAttributes *)
G4int GetNoFacets() const
G4bool GetNextFacet(G4int &n, G4Point3D *nodes, G4int *edgeFlags=nullptr, G4Normal3D *normals=nullptr) const