Salome HOME
b178b6f300dadbc979396f2760c1dca2b41d34c8
[modules/hydro.git] / src / HYDROGUI / HYDROGUI_ImagePrs.cxx
1 #include "HYDROGUI_ImagePrs.h"
2
3 #include <Prs3d_Root.hxx>
4
5 #include <Graphic3d_Group.hxx>
6 #include <Graphic3d_Texture2Dmanual.hxx>
7 #include <Graphic3d_ArrayOfTriangles.hxx>
8 #include <Graphic3d_AspectFillArea3d.hxx>
9
10 IMPLEMENT_STANDARD_TYPE(HYDROGUI_ImagePrs)
11 IMPLEMENT_STANDARD_SUPERTYPE_ARRAY()
12   STANDARD_TYPE(AIS_InteractiveObject),
13   STANDARD_TYPE(SelectMgr_SelectableObject),
14   STANDARD_TYPE(PrsMgr_PresentableObject),
15   STANDARD_TYPE(MMgt_TShared),
16   STANDARD_TYPE(Standard_Transient),
17 IMPLEMENT_STANDARD_SUPERTYPE_ARRAY_END()
18 IMPLEMENT_STANDARD_TYPE_END(HYDROGUI_ImagePrs)
19
20 IMPLEMENT_DOWNCAST(HYDROGUI_ImagePrs,Standard_Transient)
21 IMPLEMENT_STANDARD_RTTI(HYDROGUI_ImagePrs)
22
23 HYDROGUI_ImagePrs::HYDROGUI_ImagePrs()
24     : AIS_InteractiveObject()
25 {
26 //    SetTransformPersistence( Graphic3d_TMF_2d );
27 //    SetZLayer( Graphic3d_ZLayerId_TopOSD );
28 }
29
30 HYDROGUI_ImagePrs::HYDROGUI_ImagePrs( const Handle(Image_PixMap)& theImage, const QPolygonF& theContour )
31     : AIS_InteractiveObject(),
32     myImage( theImage ),
33     myContour( theContour )
34 {
35 }
36
37 HYDROGUI_ImagePrs::~HYDROGUI_ImagePrs()
38 {
39 }
40
41 QPolygonF HYDROGUI_ImagePrs::GetContour() const
42 {
43     return myContour;
44 }
45
46 void HYDROGUI_ImagePrs::SetContour( const QPolygonF& theRect )
47 {
48     if ( myContour != theRect )
49         SetToUpdate();
50
51     myContour = theRect;
52 }
53
54 Handle(Image_PixMap) HYDROGUI_ImagePrs::GetImage() const
55 {
56     return myImage;
57 }
58
59 void HYDROGUI_ImagePrs::SetImage( const Handle(Image_PixMap)& theImage )
60 {
61     if ( myImage != theImage )
62         SetToUpdate();
63
64     myImage = theImage;
65 }
66
67 void HYDROGUI_ImagePrs::ComputeSelection( const Handle(SelectMgr_Selection)&, const Standard_Integer )
68 {
69 }
70
71 void HYDROGUI_ImagePrs::Compute( const Handle(PrsMgr_PresentationManager3d)&,
72                                  const Handle(Prs3d_Presentation)& aPrs, const Standard_Integer )
73 {
74     aPrs->Clear();
75
76     if ( aPrs.IsNull() || myImage.IsNull() )
77         return;
78
79     Handle(Graphic3d_Group) aGroup = Prs3d_Root::CurrentGroup( aPrs );
80
81     Graphic3d_MaterialAspect aMat( Graphic3d_NOM_PLASTIC );
82     aMat.SetTransparency( 0.5 );
83     Handle(Graphic3d_AspectFillArea3d) aFillAspect =
84         new Graphic3d_AspectFillArea3d( Aspect_IS_SOLID, Quantity_NOC_WHITE, Quantity_NOC_BLACK, Aspect_TOL_SOLID, 1.0, aMat, aMat );
85
86     Handle(Graphic3d_TextureMap) aTex = new Graphic3d_Texture2Dmanual( myImage );
87     aFillAspect->SetTextureMapOn();
88     aFillAspect->SetTextureMap( aTex );
89
90     Handle(Graphic3d_ArrayOfTriangles) aTriangles = new Graphic3d_ArrayOfTriangles( 6, 0, Standard_False, Standard_False, Standard_True );
91
92     aTriangles->AddVertex( convert( myContour[0] ), gp_Pnt2d( 0, myImage->IsTopDown() ? 0 : 1 ) );
93     aTriangles->AddVertex( convert( myContour[1] ), gp_Pnt2d( 1, myImage->IsTopDown() ? 0 : 1 ) );
94     aTriangles->AddVertex( convert( myContour[2] ), gp_Pnt2d( 1, myImage->IsTopDown() ? 1 : 0 ) );
95
96     aTriangles->AddVertex( convert( myContour[2] ), gp_Pnt2d( 1, myImage->IsTopDown() ? 1 : 0 ) );
97     aTriangles->AddVertex( convert( myContour[3] ), gp_Pnt2d( 0, myImage->IsTopDown() ? 1 : 0 ) );
98     aTriangles->AddVertex( convert( myContour[0] ), gp_Pnt2d( 0, myImage->IsTopDown() ? 0 : 1 ) );
99
100     aGroup->SetGroupPrimitivesAspect( aFillAspect );
101     aGroup->AddPrimitiveArray( aTriangles );
102 }
103
104 gp_Pnt HYDROGUI_ImagePrs::convert( const QPointF& thePoint ) const
105 {
106     return gp_Pnt( thePoint.x(), thePoint.y(), 0 );
107 }