525 {
526
527
528
529
531
532
533
535 if (!pGLViewer) return;
536
537
538
540
541
542
543
544
545 GLfloat* painting_colour;
546 GLfloat clear_colour[4];
547 GLfloat current_colour[4];
548 glGetFloatv (GL_CURRENT_COLOR, current_colour);
549
550 G4bool isTransparent =
false;
551 if (current_colour[3] < 1.) {
552 isTransparent = true;
553 }
554
556
557 glGetFloatv (GL_COLOR_CLEAR_VALUE, clear_colour);
558 painting_colour = clear_colour;
559 } else {
560 painting_colour = current_colour;
561 }
562
565
567
569
570
571 glDisable (GL_LIGHTING);
572
573 switch (drawing_style) {
575
577 glEnable (GL_STENCIL_TEST);
578
579
580 glStencilFunc (GL_ALWAYS, 0, 1);
581 glStencilOp (GL_INVERT, GL_INVERT, GL_INVERT);
582 glEnable (GL_DEPTH_TEST);
583 glDepthFunc (GL_LEQUAL);
584 if (isTransparent) {
585
586 glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE);
587 glEnable(GL_COLOR_MATERIAL);
588
589 glPolygonMode (GL_FRONT_AND_BACK, GL_LINE);
590 } else {
591
592 if (clipping) {
593 glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE);
594 glEnable(GL_COLOR_MATERIAL);
595
596 glPolygonMode (GL_FRONT_AND_BACK, GL_LINE);
597 } else {
598 glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);
599 glEnable(GL_COLOR_MATERIAL);
600
601
602 glPolygonMode (GL_FRONT, GL_LINE);
603 }
604 }
605 break;
607 glEnable (GL_DEPTH_TEST);
608 glDepthFunc (GL_LEQUAL);
609 if (isTransparent) {
610
611 glDepthMask (GL_FALSE);
612 glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE);
613 glEnable(GL_COLOR_MATERIAL);
614
615 glPolygonMode (GL_FRONT_AND_BACK, GL_FILL);
616 } else {
617
618 glDepthMask (GL_TRUE);
619 if (clipping) {
620 glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE);
621 glEnable(GL_COLOR_MATERIAL);
622
623 glPolygonMode (GL_FRONT_AND_BACK, GL_FILL);
624 } else {
625 glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);
626 glEnable(GL_COLOR_MATERIAL);
627
628
629 glPolygonMode (GL_FRONT, GL_FILL);
630 }
631 }
633 break;
635 default:
636 glEnable (GL_DEPTH_TEST);
637 glDepthFunc (GL_LEQUAL);
638
639 glPolygonMode (GL_FRONT_AND_BACK, GL_LINE);
640 break;
641 }
642
643
645 glBegin (GL_QUADS);
646 glEdgeFlag (GL_TRUE);
648 do {
649
650
655 notLastFace = polyhedron.
GetNextFacet(nEdges, vertex, edgeFlag, normals);
656
657
658 for(
G4int edgeCount = 0; edgeCount < nEdges; ++edgeCount) {
659
660 if (isAuxEdgeVisible) {
661 edgeFlag[edgeCount] = 1;
662 }
663 if (edgeFlag[edgeCount] > 0) {
665 glEdgeFlag (GL_TRUE);
667 }
668 } else {
670 glEdgeFlag (GL_FALSE);
672 }
673 }
674 glNormal3d (normals[edgeCount].x(),
675 normals[edgeCount].y(),
676 normals[edgeCount].z());
677 glVertex3d (vertex[edgeCount].x(),
678 vertex[edgeCount].y(),
679 vertex[edgeCount].z());
680 }
681
682
683
684 if (nEdges == 3) {
686 normals[edgeCount] = normals[0];
687 vertex[edgeCount] = vertex[0];
688 edgeFlag[edgeCount] = -1;
690 glEdgeFlag (GL_FALSE);
692 }
693
694 glNormal3d (normals[edgeCount].x(),
695 normals[edgeCount].y(),
696 normals[edgeCount].z());
697 glVertex3d (vertex[edgeCount].x(),
698 vertex[edgeCount].y(),
699 vertex[edgeCount].z());
700 }
701
702 if (nEdges > 4) {
704 "G4OpenGLSceneHandler::AddPrimitive(G4Polyhedron): WARNING"
705 "\n G4Polyhedron facet with " << nEdges <<
" edges" <<
G4endl;
706 }
707
708
709
712
713 glDisable(GL_COLOR_MATERIAL);
714 glEnd ();
715
716
717
718
719
720
721 glDisable (GL_LIGHTING);
722
723
724 glStencilFunc (GL_EQUAL, 0, 1);
725 glStencilOp (GL_KEEP, GL_KEEP, GL_KEEP);
728 }
729 glEnable (GL_DEPTH_TEST);
730 glDepthFunc (GL_LEQUAL);
731 if (isTransparent) {
732
733 glDepthMask (GL_FALSE);
734
735 glPolygonMode (GL_FRONT_AND_BACK, GL_FILL);
736 } else {
737
738 glDepthMask (GL_TRUE);
739 if (clipping) {
740
741 glPolygonMode (GL_FRONT_AND_BACK, GL_FILL);
742 } else {
743
744
745 glPolygonMode (GL_FRONT, GL_FILL);
746 }
747 }
749 if (isTransparent) {
750
751 goto end_of_drawing_through_stencil;
752 }
753 }
754 if (isTransparent) {
755
756 glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, painting_colour);
757 } else {
758
759 glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, painting_colour);
760 }
761 glColor4fv (painting_colour);
762 glBegin (GL_QUADS);
763 glEdgeFlag (GL_TRUE);
765
766 for (int edgeCount = 0; edgeCount < 4; ++edgeCount) {
767 if (edgeFlag[edgeCount] > 0) {
769 glEdgeFlag (GL_TRUE);
771 }
772 } else {
774 glEdgeFlag (GL_FALSE);
776 }
777 }
778 glNormal3d (normals[edgeCount].x(),
779 normals[edgeCount].y(),
780 normals[edgeCount].z());
781 glVertex3d (vertex[edgeCount].x(),
782 vertex[edgeCount].y(),
783 vertex[edgeCount].z());
784 }
785 glEnd ();
786 end_of_drawing_through_stencil:
787
788
789 glStencilFunc (GL_ALWAYS, 0, 1);
790 glStencilOp (GL_INVERT, GL_INVERT, GL_INVERT);
791 glDepthFunc (GL_LEQUAL);
792 if (isTransparent) {
793
794
795 glPolygonMode (GL_FRONT_AND_BACK, GL_LINE);
796 } else {
797
798 if (clipping) {
799
800 glPolygonMode (GL_FRONT_AND_BACK, GL_LINE);
801 } else {
802
803
804 glPolygonMode (GL_FRONT, GL_LINE);
805 }
806 }
807 glDisable (GL_LIGHTING);
808 glColor4fv (current_colour);
810 glBegin (GL_QUADS);
811 glEdgeFlag (GL_TRUE);
813 for (int edgeCount = 0; edgeCount < 4; ++edgeCount) {
814 if (edgeFlag[edgeCount] > 0) {
816 glEdgeFlag (GL_TRUE);
818 }
819 } else {
821 glEdgeFlag (GL_FALSE);
823 }
824 }
825 glNormal3d (normals[edgeCount].x(),
826 normals[edgeCount].y(),
827 normals[edgeCount].z());
828 glVertex3d (vertex[edgeCount].x(),
829 vertex[edgeCount].y(),
830 vertex[edgeCount].z());
831 }
832 glEnd ();
833
834 glDepthFunc (GL_LEQUAL);
836 glBegin (GL_QUADS);
837 glEdgeFlag (GL_TRUE);
839
840
841
842 }
843 } while (notLastFace);
844
845 glEnd ();
846 glDisable (GL_STENCIL_TEST);
847 glDepthMask (GL_TRUE);
848 glDisable (GL_LIGHTING);
849}
HepGeom::Normal3D< G4double > G4Normal3D
HepGeom::Point3D< G4double > G4Point3D
G4GLOB_DLL std::ostream G4cerr
friend class G4OpenGLViewer
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