Integration of OCCT 6.5.0 from SVN
[occt.git] / samples / mfc / occtdemo / TexturesExt / TexturesExt_Presentation.cpp
1 // TexturesExt_Presentation.cpp: implementation of the TexturesExt_Presentation class.
2 // Creation of textural presentation of shape
3 //////////////////////////////////////////////////////////////////////
4
5 #include "stdafx.h"
6 #include "TexturesExt_Presentation.h"
7
8 #include <TopExp.hxx>
9 #include <TopTools_IndexedMapOfShape.hxx>
10 #include <BRepBuilderAPI_MakeFace.hxx>
11 #include <AIS_TexturedShape.hxx>
12 #include <BRepTools.hxx>
13 #include <Graphic3d_Texture2D.hxx>
14 #include <BRep_Tool.hxx>
15 #include <TopoDS.hxx>
16 #include <BRepBuilderAPI_Transform.hxx>
17 #include <BRep_Builder.hxx>
18 #include <BRepTools.hxx>
19 #include <Geom_Surface.hxx>
20 #include <TopoDS_Face.hxx>
21 #include <V3d_DirectionalLight.hxx>
22
23 #define DISP(OBJ) getAISContext()->Display((OBJ), Standard_False)
24
25 // Initialization of global variable with an instance of this class
26 OCCDemo_Presentation* OCCDemo_Presentation::Current = new TexturesExt_Presentation;
27
28 // Initialization of array of samples
29 const TexturesExt_Presentation::PSampleFuncType TexturesExt_Presentation::SampleFuncs[] =
30 {
31   &TexturesExt_Presentation::sampleBottle,
32   &TexturesExt_Presentation::sampleTerrain,
33   &TexturesExt_Presentation::sampleKitchen
34 };
35
36 #ifdef WNT
37  #define EOL "\r\n"
38 #else
39  #define EOL "\n"
40 #endif
41
42 #define ZVIEW_SIZE 100
43
44 //////////////////////////////////////////////////////////////////////
45 // Construction/Destruction
46 //////////////////////////////////////////////////////////////////////
47
48 TexturesExt_Presentation::TexturesExt_Presentation()
49 {
50   myNbSamples = sizeof(SampleFuncs)/sizeof(PSampleFuncType);
51   setName ("Textured Shapes");
52 }
53
54 //////////////////////////////////////////////////////////////////////
55 // Sample execution
56 //////////////////////////////////////////////////////////////////////
57
58 void TexturesExt_Presentation::DoSample()
59 {
60   getAISContext()->EraseAll();
61   if (myIndex >=0 && myIndex < myNbSamples)
62   {
63     // turn lights on for terrain sample
64     lightsOnOff(myIndex==1);
65     (this->*SampleFuncs[myIndex])();
66   }
67 }
68
69 void TexturesExt_Presentation::Init()
70 {
71   // initialize v3d_view so it displays TexturesExt well
72   getViewer()->InitActiveViews();
73   Handle_V3d_View aView = getViewer()->ActiveView();
74   aView->SetSurfaceDetail(V3d_TEX_ALL);
75   aView->SetSize(ZVIEW_SIZE);
76
77   setResultTitle("Textured Shape");
78   setResultText(
79     "  TopoDS_Shape aShape;" EOL
80     "" EOL
81     "  // initialize aShape" EOL
82     "  // aShape = ..." EOL
83     "" EOL
84     "  // create a textured presentation object for aShape" EOL
85     "  Handle_AIS_TexturedShape aTShape = new AIS_TexturedShape(aShape);" EOL
86     "" EOL
87     "  TCollection_AsciiString aTFileName;" EOL
88     "" EOL
89     "  // initialize aTFileName with an existing texture file name" EOL
90     "  // (gif, bmp, xwd, rgb, and other formats are supported)" EOL
91     "  // OR with an integer value string (max = Graphic3d_Texture2D::NumberOfTexturesExt())" EOL
92     "  // which will indicate use of predefined texture of this number" EOL
93     "  // aTFileName = ..." EOL
94     "" EOL
95     "  aTShape->SetTextureFileName(aTFileName);" EOL
96     "" EOL
97     "  // do other initialization of AIS_TexturedShape" EOL
98     "  Standard_Real nRepeat;" EOL
99     "  Standard_Boolean toRepeat;" EOL
100     "  Standard_Boolean toScale;" EOL
101     "  // initialize aRepeat, toRepeat, toScale ..." EOL
102     "" EOL
103     "  aTShape->SetTextureMapOn();" EOL
104     "  aTShape->SetTextureRepeat(toRepeat, nRepeat, nRepeat);" EOL
105     "  aTShape->SetTexturesExtcale(toScale);" EOL
106     "  " EOL
107     "  // mode 3 is \"textured\" mode of AIS_TexturedShape, " EOL
108     "  // other modes will display the \"normal\", non-textured shape," EOL
109     "  // in wireframe(1) or shaded(2) modes correspondingly" EOL
110     "  aTShape->SetDisplayMode(3); " EOL
111     "" EOL
112     "  // V3d_TEX_ALL constant must be set as surface detail" EOL
113     "  // for current view to see AIS_TexturedShape" EOL
114     "  myCurrentView->SetSurfaceDetail(V3d_TEX_ALL);" EOL);
115 }
116
117 //////////////////////////////////////////////////////////////////////
118 // Sample functions
119 //////////////////////////////////////////////////////////////////////
120 //================================================================
121 // Function : TexturesExt_Presentation::Texturize
122 // display an AIS_TexturedShape based on a given shape with texture with given filename
123 // filename can also be an integer value ("2", "5", etc.), in this case
124 // a predefined texture from Graphic3d_NameOfTexture2D with number = this value
125 // is loaded.
126 //================================================================
127 Handle_AIS_TexturedShape TexturesExt_Presentation::Texturize(const TopoDS_Shape& aShape,
128                                                         TCollection_AsciiString aTFileName,
129                                                         Standard_Real toScaleU,
130                                                         Standard_Real toScaleV,
131                                                         Standard_Real toRepeatU,
132                                                         Standard_Real toRepeatV,
133                                                         Standard_Real originU,
134                                                         Standard_Real originV)
135 {
136   // create a textured presentation object for aShape
137   Handle_AIS_TexturedShape aTShape = new AIS_TexturedShape(aShape);
138
139   // load texture from file if it is not an integer value
140   // integer value indicates a number of texture in predefined TexturesExt enumeration
141   if (!aTFileName.IsIntegerValue())
142   {
143     TCollection_AsciiString aTmp(aTFileName);
144     aTFileName = GetDataDir();
145     aTFileName = aTFileName + "\\" + aTmp;
146   }
147
148   aTShape->SetTextureFileName(aTFileName);
149
150   // do other initialization of AIS_TexturedShape
151   aTShape->SetTextureMapOn();
152   aTShape->SetTextureScale(Standard_True, toScaleU, toScaleV);
153   aTShape->SetTextureRepeat(Standard_True, toRepeatU, toRepeatV);
154   aTShape->SetTextureOrigin(Standard_True, originU, originV);
155   
156   aTShape->SetDisplayMode(3); // mode 3 is "textured" mode
157
158   return aTShape;
159 }
160
161
162 //================================================================
163 // Function : TexturesExt_Presentation::loadShape
164 // loads a shape from a given brep file from data dir into a given TopoDS_Shape object
165 //================================================================
166 Standard_Boolean TexturesExt_Presentation::loadShape(TopoDS_Shape& aShape, 
167                                          TCollection_AsciiString aFileName)
168 {
169   // create a TopoDS_Shape -> read from a brep file
170   TCollection_AsciiString aPath(GetDataDir());
171   aPath = aPath + "\\" + aFileName;
172
173   BRep_Builder aBld;
174   Standard_Boolean isRead = BRepTools::Read (aShape, aPath.ToCString(), aBld);
175   if (!isRead)
176   {
177     aPath += " was not found.  The sample can not be shown.";
178     setResultText(aPath.ToCString());
179     return Standard_False;
180   }
181
182   return Standard_True;
183 }
184
185 //================================================================
186 // Function : lightsOnOff
187 // Purpose  : 6 lights are used for a brighter demonstration of textured shapes
188 //            call lightsOnOff(false) before showing normal shape
189 //            call lightsOnOff(true)  before showing textured shape
190 //================================================================
191 void TexturesExt_Presentation::lightsOnOff(Standard_Boolean isOn)
192 {
193   static Handle_V3d_Light aLight1 = new V3d_DirectionalLight(getViewer(), V3d_XnegYposZneg);
194   static Handle_V3d_Light aLight2 = new V3d_DirectionalLight(getViewer(), V3d_XnegYnegZpos);
195   static Handle_V3d_Light aLight3 = new V3d_DirectionalLight(getViewer(), V3d_XposYnegZpos);
196   static Handle_V3d_Light aLight4 = new V3d_DirectionalLight(getViewer(), V3d_XnegYnegZneg);
197   static Handle_V3d_Light aLight5 = new V3d_DirectionalLight(getViewer(), V3d_XnegYposZpos);
198   static Handle_V3d_Light aLight6 = new V3d_DirectionalLight(getViewer(), V3d_XposYposZpos);
199
200   if (isOn)
201   {
202     getViewer()->SetLightOn(aLight1);
203     getViewer()->SetLightOn(aLight2);
204     getViewer()->SetLightOn(aLight3);
205     getViewer()->SetLightOn(aLight4);
206     getViewer()->SetLightOn(aLight5);
207     getViewer()->SetLightOn(aLight6);
208   }
209   else 
210   {
211     getViewer()->SetLightOff(aLight1);
212     getViewer()->SetLightOff(aLight2);
213     getViewer()->SetLightOff(aLight3);
214     getViewer()->SetLightOff(aLight4);
215     getViewer()->SetLightOff(aLight5);
216     getViewer()->SetLightOff(aLight6);
217   }
218 }
219
220 //================================================================
221 // Function : TexturesExt_Presentation::sampleBottle
222 // Purpose  : 
223 //================================================================
224 void TexturesExt_Presentation::sampleBottle()
225 {  
226   TopoDS_Shape aShape;
227   if (!loadShape(aShape, "bottle.brep")) 
228     return;
229
230   // resize and move the shape to the center of the viewer
231   gp_Trsf aTrsf;
232   aTrsf.SetScale(gp_Pnt(0,0,0), 0.8);
233   aShape.Move(TopLoc_Location(aTrsf));
234   aTrsf.SetTranslation(gp_Pnt(0,0,0),gp_Pnt(0,0,-20));
235   aShape.Move(TopLoc_Location(aTrsf));
236
237   TopTools_IndexedMapOfShape aFaces;
238   TopExp::MapShapes(aShape, TopAbs_FACE, aFaces);
239
240   // display original shape in shaded display mode
241   Handle_AIS_Shape aShapeIO = drawShape(aShape, Graphic3d_NOM_BRASS, Standard_False);
242   getAISContext()->SetDisplayMode(aShapeIO, AIS_Shaded, Standard_False);
243   DISP(aShapeIO);
244
245   Handle_AIS_TexturedShape aTFace1 = Texturize(aFaces(16), "carrelage1.gif", 1, 1, 3, 2);
246   DISP(aTFace1);
247
248   Handle_AIS_TexturedShape aTFace2 = Texturize(aFaces(21), "carrelage1.gif", 1, 1, 3, 2);
249   DISP(aTFace2);
250
251   getViewer()->Update();
252 }
253
254
255 //================================================================
256 // Function : TexturesExt_Presentation::sampleLand
257 // Purpose  : 
258 //================================================================
259 void TexturesExt_Presentation::sampleTerrain()
260 {
261   TopoDS_Shape aShape;
262   if (!loadShape(aShape, "terrain.brep"))
263     return;
264
265   // a part of the landscape is textured
266   TopTools_IndexedMapOfShape aFaces;
267   TopExp::MapShapes(aShape, TopAbs_FACE, aFaces);
268
269 //  TopLoc_Location aLoc;
270 //  Handle_Geom_Surface aSur = BRep_Tool::Surface(TopoDS::Face(aFaces(1)), aLoc);
271 //  Standard_Real u1,u2,v1,v2;
272 //  aSur->Bounds(u1,u2,v1,v2);
273 //  gp_Pnt aPnt = aSur->Value(u1, v1);
274   gp_Pnt aPnt(82100,80300,10940);// point at u1,v1
275   // resize and move the shape to the center of the viewer
276   
277   gp_Trsf aMoveTrsf;
278   gp_Ax3 New(gp_Pnt(-30,-30, 0),gp_Dir(0,0,1));
279   gp_Ax3 Current(aPnt,gp_Dir(0,0,1));
280   aMoveTrsf.SetDisplacement(Current, New);
281
282   gp_Trsf aScaleTrsf;
283   aScaleTrsf.SetScale(aPnt,0.0075);
284
285   BRepBuilderAPI_Transform aTransform(aMoveTrsf*aScaleTrsf);
286
287   aTransform.Perform(aFaces(1));
288   aShape = aTransform;
289
290   getAISContext()->Display(Texturize(aShape, "terrain.gif"));
291 }
292
293
294 //================================================================
295 // Function : moveScale
296 // Purpose  : move a shape a little left and scale it to 15%.
297 //================================================================
298 static void moveScale(TopoDS_Shape& aShape)
299 {
300   gp_Trsf aMoveTrsf;
301   gp_Ax3 New(gp_Pnt(-30,-30, -10),gp_Dir(0,0,1));
302   gp_Ax3 Current(gp_Pnt(0,0,0),gp_Dir(0,0,1));
303   aMoveTrsf.SetDisplacement(Current, New);
304
305   gp_Trsf aScaleTrsf;
306   aScaleTrsf.SetScale(gp_Pnt(0,0,0),0.15);
307
308   BRepBuilderAPI_Transform aTransform(aMoveTrsf*aScaleTrsf);
309
310   aTransform.Perform(aShape);
311   aShape = aTransform;
312 }
313
314 //================================================================
315 // Function : TexturesExt_Presentation::sampleKitchen
316 // Purpose  : kitchen with texturized items in it.
317 //================================================================
318 void TexturesExt_Presentation::sampleKitchen()
319 {
320   TopoDS_Shape aShape;
321
322   if (!loadShape(aShape, "Kitchen\\Room.brep"))
323     return;
324
325   gp_Trsf aTrsf;
326   gp_Ax3 NewCoordSystem (gp_Pnt(-1,-1, -1),gp_Dir(0,0,1));
327   gp_Ax3 CurrentCoordSystem(gp_Pnt(0,0,0),gp_Dir(0,0,1));
328   aTrsf.SetDisplacement(CurrentCoordSystem, NewCoordSystem);
329   aShape.Location(TopLoc_Location(aTrsf));
330
331   moveScale(aShape);
332
333   // draw kitchen room whithout one wall (to better see the insides)
334   TopTools_IndexedMapOfShape aFaces;
335   TopExp::MapShapes(aShape, TopAbs_FACE, aFaces);  
336   Standard_Integer nbFaces = aFaces.Extent();
337
338   // create a wooden kitchen floor
339   // the floor's face will be textured with texture from chataignier.gif
340   DISP(Texturize(aFaces(5),"plancher.gif",1,1,2,1));
341
342   // texturize other faces of the room with texture from wallpaper.gif (walls)
343   DISP(Texturize(aFaces(1),"wallpaper.gif",1,1,8,6));
344   DISP(Texturize(aFaces(3),"wallpaper.gif",1,1,8,6));
345   DISP(Texturize(aFaces(4),"wallpaper.gif",1,1,8,6));
346
347 //  DISP(drawShape(aFaces(1), Quantity_NOC_LIGHTPINK, Standard_False));
348 //  DISP(drawShape(aFaces(3), Quantity_NOC_LIGHTPINK, Standard_False));
349 //  DISP(drawShape(aFaces(4), Quantity_NOC_LIGHTPINK, Standard_False));
350
351   // texturize furniture items with "wooden" texture
352   if (loadShape(aShape, "Kitchen\\MODERN_Table_1.brep"))
353   {
354     moveScale(aShape);
355     DISP(Texturize(aShape, "chataignier.gif"));
356   }
357   if (loadShape(aShape, "Kitchen\\MODERN_Chair_1.brep"))
358   {
359     moveScale(aShape);
360     DISP(Texturize(aShape, "chataignier.gif"));
361   }
362   if (loadShape(aShape, "Kitchen\\MODERN_Cooker_1.brep"))
363   {
364     moveScale(aShape);
365
366     aFaces.Clear();
367     TopExp::MapShapes(aShape, TopAbs_FACE, aFaces);  
368     nbFaces = aFaces.Extent();
369
370     for (Standard_Integer i = 1; i <= nbFaces; i++)
371     {
372       if (i >= 59)
373         DISP(drawShape(aFaces(i), Graphic3d_NOM_STEEL, Standard_False));
374       else if (i >= 29)
375         DISP(drawShape(aFaces(i), Graphic3d_NOM_ALUMINIUM, Standard_False));
376       else if (i == 28)
377         DISP(Texturize(aFaces(i), "cookerplate.gif"));
378       else  
379         DISP(Texturize(aFaces(i), "chataignier.gif"));
380     }
381   }
382   if (loadShape(aShape, "Kitchen\\MODERN_Cooker_1_opened.brep"))
383   {
384     moveScale(aShape);
385     DISP(Texturize(aShape, "chataignier.gif"));
386   }
387   if (loadShape(aShape, "Kitchen\\MODERN_Exhaust_1.brep"))
388   {
389     moveScale(aShape);
390     DISP(drawShape(aShape, Graphic3d_NOM_STONE, Standard_False));
391   }
392   if (loadShape(aShape, "Kitchen\\MODERN_MVCooker_1.brep"))
393   {
394     moveScale(aShape);
395     DISP(drawShape(aShape, Graphic3d_NOM_SILVER, Standard_False));
396   }
397   if (loadShape(aShape, "Kitchen\\MODERN_MVCooker_1_opened.brep"))
398   {
399     moveScale(aShape);
400     DISP(drawShape(aShape, Graphic3d_NOM_SILVER, Standard_False));
401   }
402   if (loadShape(aShape, "Kitchen\\MODERN_Sink_1.brep"))
403   {
404     moveScale(aShape);
405
406     aFaces.Clear();
407     TopExp::MapShapes(aShape, TopAbs_FACE, aFaces);  
408     nbFaces = aFaces.Extent();
409
410     for (Standard_Integer i = 1; i <= nbFaces; i++)
411     {
412       if (i < 145)
413         DISP(drawShape(aFaces(i), Graphic3d_NOM_ALUMINIUM, Standard_False));
414       else if (i == 145)
415         DISP(Texturize(aFaces(i), "cookerplate.gif"));
416       else  
417         DISP(Texturize(aFaces(i), "chataignier.gif"));
418     }
419   }
420   if (loadShape(aShape, "Kitchen\\MODERN_Sink_1_opened.brep"))
421   {
422     moveScale(aShape);
423     DISP(Texturize(aShape, "chataignier.gif"));
424   }
425   if (loadShape(aShape, "Kitchen\\MODERN_Refrigerator_1.brep"))
426   {
427     moveScale(aShape);
428     DISP(drawShape(aShape, Graphic3d_NOM_CHROME, Standard_False));
429   }
430   if (loadShape(aShape, "Kitchen\\MODERN_Refrigerator_1_opened.brep"))
431   {
432     moveScale(aShape);
433     DISP(drawShape(aShape, Graphic3d_NOM_CHROME, Standard_False));
434   }
435
436   getViewer()->Update();
437 }