Commit | Line | Data |
---|---|---|
b311480e | 1 | // Created on: 2001-07-02 |
2 | // Created by: Mathias BOSSHARD | |
3 | // Copyright (c) 2001-2012 OPEN CASCADE SAS | |
7fd59977 | 4 | // |
b311480e | 5 | // The content of this file is subject to the Open CASCADE Technology Public |
6 | // License Version 6.5 (the "License"). You may not use the content of this file | |
7 | // except in compliance with the License. Please obtain a copy of the License | |
8 | // at http://www.opencascade.org and read it completely before using this file. | |
7fd59977 | 9 | // |
b311480e | 10 | // The Initial Developer of the Original Code is Open CASCADE S.A.S., having its |
11 | // main offices at: 1, place des Freres Montgolfier, 78280 Guyancourt, France. | |
7fd59977 | 12 | // |
b311480e | 13 | // The Original Code and all software distributed under the License is |
14 | // distributed on an "AS IS" basis, without warranty of any kind, and the | |
15 | // Initial Developer hereby disclaims all such warranties, including without | |
16 | // limitation, any warranties of merchantability, fitness for a particular | |
17 | // purpose or non-infringement. Please see the License for the specific terms | |
18 | // and conditions governing the rights and limitations under the License. | |
19 | ||
20 | // Modified: | |
7fd59977 | 21 | //////////////////////////////////////////////////////////////////////// |
22 | ||
23 | ||
24 | #include <AIS_TexturedShape.ixx> | |
25 | #include <Standard_ErrorHandler.hxx> | |
26 | ||
2bd4c032 | 27 | #include <AIS_Drawer.hxx> |
28 | #include <AIS_InteractiveContext.hxx> | |
7fd59977 | 29 | #include <BRepTools.hxx> |
2bd4c032 | 30 | #include <gp_Pnt2d.hxx> |
31 | #include <Graphic3d_AspectFillArea3d.hxx> | |
32 | #include <Graphic3d_Group.hxx> | |
7fd59977 | 33 | #include <Graphic3d_StructureManager.hxx> |
34 | #include <Graphic3d_Texture2Dmanual.hxx> | |
2bd4c032 | 35 | #include <Precision.hxx> |
36 | #include <Prs3d_Presentation.hxx> | |
7fd59977 | 37 | #include <Prs3d_Root.hxx> |
2bd4c032 | 38 | #include <Prs3d_ShadingAspect.hxx> |
7fd59977 | 39 | #include <PrsMgr_PresentationManager3d.hxx> |
2bd4c032 | 40 | #include <StdPrs_ShadedShape.hxx> |
7fd59977 | 41 | #include <StdPrs_WFDeflectionShape.hxx> |
7fd59977 | 42 | #include <StdPrs_WFShape.hxx> |
2bd4c032 | 43 | #include <TopExp_Explorer.hxx> |
7fd59977 | 44 | |
45 | //======================================================================= | |
46 | //function : AIS_TexturedShape | |
2bd4c032 | 47 | //purpose : |
7fd59977 | 48 | //======================================================================= |
2bd4c032 | 49 | AIS_TexturedShape::AIS_TexturedShape (const TopoDS_Shape& theShape) |
50 | : AIS_Shape (theShape), | |
51 | myPredefTexture (Graphic3d_NameOfTexture2D(0)), | |
52 | myTextureFile (""), | |
53 | DoRepeat (Standard_True), | |
54 | myURepeat (1.0), | |
55 | myVRepeat (1.0), | |
56 | DoMapTexture (Standard_True), | |
57 | DoSetTextureOrigin (Standard_True), | |
58 | myUOrigin (0.0), | |
59 | myVOrigin (0.0), | |
60 | DoSetTextureScale (Standard_True), | |
61 | myScaleU (1.0), | |
62 | myScaleV (1.0), | |
63 | DoShowTriangles (Standard_False), | |
64 | myModulate (Standard_True) | |
7fd59977 | 65 | { |
66 | } | |
67 | ||
7fd59977 | 68 | //======================================================================= |
69 | //function : SetTextureFileName | |
2bd4c032 | 70 | //purpose : |
7fd59977 | 71 | //======================================================================= |
2bd4c032 | 72 | void AIS_TexturedShape::SetTextureFileName (const TCollection_AsciiString& theTextureFileName) |
7fd59977 | 73 | { |
2bd4c032 | 74 | if (theTextureFileName.IsIntegerValue()) |
75 | { | |
76 | if (theTextureFileName.IntegerValue() < Graphic3d_Texture2D::NumberOfTextures() | |
77 | && theTextureFileName.IntegerValue() >= 0) | |
7fd59977 | 78 | { |
2bd4c032 | 79 | myPredefTexture = Graphic3d_NameOfTexture2D (theTextureFileName.IntegerValue()); |
7fd59977 | 80 | } |
2bd4c032 | 81 | else |
7fd59977 | 82 | { |
2bd4c032 | 83 | std::cout << "Texture " << theTextureFileName << " doesn't exist \n"; |
84 | std::cout << "Using Texture 0 instead ...\n"; | |
85 | myPredefTexture = Graphic3d_NameOfTexture2D (0); | |
7fd59977 | 86 | } |
2bd4c032 | 87 | myTextureFile = ""; |
88 | } | |
89 | else | |
90 | { | |
91 | myTextureFile = theTextureFileName; | |
92 | myPredefTexture = Graphic3d_NameOfTexture2D (-1); | |
93 | } | |
7fd59977 | 94 | } |
95 | ||
96 | //======================================================================= | |
97 | //function : SetTextureRepeat | |
2bd4c032 | 98 | //purpose : |
7fd59977 | 99 | //======================================================================= |
100 | ||
2bd4c032 | 101 | void AIS_TexturedShape::SetTextureRepeat (const Standard_Boolean theRepeatYN, |
102 | const Standard_Real theURepeat, | |
103 | const Standard_Real theVRepeat) | |
7fd59977 | 104 | { |
2bd4c032 | 105 | DoRepeat = theRepeatYN; |
106 | myURepeat = theURepeat; | |
107 | myVRepeat = theVRepeat; | |
7fd59977 | 108 | } |
109 | ||
110 | //======================================================================= | |
111 | //function : SetTextureMapOn | |
2bd4c032 | 112 | //purpose : |
7fd59977 | 113 | //======================================================================= |
114 | ||
115 | void AIS_TexturedShape::SetTextureMapOn() | |
116 | { | |
117 | DoMapTexture = Standard_True; | |
118 | } | |
119 | ||
120 | //======================================================================= | |
121 | //function : SetTextureMapOff | |
2bd4c032 | 122 | //purpose : |
7fd59977 | 123 | //======================================================================= |
124 | ||
125 | void AIS_TexturedShape::SetTextureMapOff() | |
126 | { | |
127 | DoMapTexture = Standard_False; | |
128 | } | |
129 | ||
130 | //======================================================================= | |
131 | //function : SetTextureOrigin | |
2bd4c032 | 132 | //purpose : |
7fd59977 | 133 | //======================================================================= |
134 | ||
2bd4c032 | 135 | void AIS_TexturedShape::SetTextureOrigin (const Standard_Boolean toSetTextureOriginYN, |
136 | const Standard_Real theUOrigin, | |
137 | const Standard_Real theVOrigin) | |
7fd59977 | 138 | { |
2bd4c032 | 139 | DoSetTextureOrigin = toSetTextureOriginYN; |
140 | myUOrigin = theUOrigin; | |
141 | myVOrigin = theVOrigin; | |
7fd59977 | 142 | } |
143 | ||
144 | //======================================================================= | |
145 | //function : SetTextureScale | |
2bd4c032 | 146 | //purpose : |
7fd59977 | 147 | //======================================================================= |
148 | ||
2bd4c032 | 149 | void AIS_TexturedShape::SetTextureScale (const Standard_Boolean toSetTextureScaleYN, |
150 | const Standard_Real theScaleU, | |
151 | const Standard_Real theScaleV) | |
7fd59977 | 152 | { |
2bd4c032 | 153 | DoSetTextureScale = toSetTextureScaleYN; |
154 | myScaleU = theScaleU; | |
155 | myScaleV = theScaleV; | |
7fd59977 | 156 | } |
157 | ||
158 | //======================================================================= | |
159 | //function : ShowTriangles | |
2bd4c032 | 160 | //purpose : |
7fd59977 | 161 | //======================================================================= |
162 | ||
2bd4c032 | 163 | void AIS_TexturedShape::ShowTriangles (const Standard_Boolean toShowTrianglesYN) |
7fd59977 | 164 | { |
2bd4c032 | 165 | DoShowTriangles = toShowTrianglesYN; |
7fd59977 | 166 | } |
167 | ||
168 | //======================================================================= | |
169 | //function : EnableTextureModulate | |
2bd4c032 | 170 | //purpose : |
7fd59977 | 171 | //======================================================================= |
172 | ||
173 | void AIS_TexturedShape::EnableTextureModulate() | |
174 | { | |
175 | myModulate = Standard_True; | |
176 | } | |
177 | ||
178 | //======================================================================= | |
179 | //function : DisableTextureModulate | |
bf75be98 | 180 | //purpose : |
7fd59977 | 181 | //======================================================================= |
182 | ||
183 | void AIS_TexturedShape::DisableTextureModulate() | |
184 | { | |
185 | myModulate = Standard_False; | |
186 | } | |
187 | ||
188 | //======================================================================= | |
189 | //function : UpdateAttributes | |
2bd4c032 | 190 | //purpose : |
7fd59977 | 191 | //======================================================================= |
192 | ||
193 | void AIS_TexturedShape::UpdateAttributes() | |
194 | { | |
2bd4c032 | 195 | Prs3d_ShadingAspect aDummy; |
196 | myAspect = aDummy.Aspect(); | |
7fd59977 | 197 | Handle(Prs3d_Presentation) aPrs = Presentation(); |
198 | if (!DoMapTexture) | |
2bd4c032 | 199 | { |
200 | myAspect->SetTextureMapOff(); | |
201 | return; | |
202 | } | |
203 | ||
204 | if (myPredefTexture != -1) | |
bf75be98 | 205 | mytexture = new Graphic3d_Texture2Dmanual (myPredefTexture); |
7fd59977 | 206 | else |
bf75be98 | 207 | mytexture = new Graphic3d_Texture2Dmanual (myTextureFile.ToCString()); |
2bd4c032 | 208 | |
7fd59977 | 209 | myAspect->SetTextureMapOn(); |
2bd4c032 | 210 | |
211 | myAspect->SetTextureMap (mytexture); | |
7fd59977 | 212 | if (!mytexture->IsDone()) |
2bd4c032 | 213 | { |
214 | std::cout << "An error occured while building texture \n"; | |
215 | return; | |
216 | } | |
217 | ||
7fd59977 | 218 | if (DoShowTriangles) |
219 | myAspect->SetEdgeOn(); | |
220 | else | |
221 | myAspect->SetEdgeOff(); | |
2bd4c032 | 222 | |
223 | Prs3d_Root::CurrentGroup (aPrs)->SetGroupPrimitivesAspect (myAspect); | |
7fd59977 | 224 | } |
225 | ||
226 | //======================================================================= | |
227 | //function : Compute | |
2bd4c032 | 228 | //purpose : |
7fd59977 | 229 | //======================================================================= |
230 | ||
2bd4c032 | 231 | void AIS_TexturedShape::Compute (const Handle(PrsMgr_PresentationManager3d)& /*thePresManager*/, |
232 | const Handle(Prs3d_Presentation)& thePrs, | |
233 | const Standard_Integer theMode) | |
7fd59977 | 234 | { |
2bd4c032 | 235 | thePrs->Clear(); |
236 | ||
237 | if (myshape.IsNull()) | |
238 | { | |
239 | return; | |
240 | } | |
241 | ||
242 | if (myshape.ShapeType() > TopAbs_FACE && myshape.ShapeType() < TopAbs_SHAPE) | |
243 | { | |
244 | thePrs->SetVisual (Graphic3d_TOS_ALL); | |
245 | thePrs->SetDisplayPriority (myshape.ShapeType() + 2); | |
246 | } | |
7fd59977 | 247 | |
248 | if (myshape.ShapeType() == TopAbs_COMPOUND) | |
2bd4c032 | 249 | { |
250 | TopExp_Explorer anExplor (myshape, TopAbs_VERTEX); | |
251 | if (!anExplor.More()) | |
7fd59977 | 252 | { |
2bd4c032 | 253 | return; |
7fd59977 | 254 | } |
2bd4c032 | 255 | } |
7fd59977 | 256 | |
257 | if (IsInfinite()) | |
2bd4c032 | 258 | { |
259 | thePrs->SetInfiniteState (Standard_True); | |
260 | } | |
7fd59977 | 261 | |
2bd4c032 | 262 | switch (theMode) |
263 | { | |
7fd59977 | 264 | case 0: // Wireframe |
2bd4c032 | 265 | { |
266 | StdPrs_WFDeflectionShape::Add (thePrs, myshape, myDrawer); | |
7fd59977 | 267 | break; |
2bd4c032 | 268 | } |
269 | case 1: // Shading | |
270 | { | |
271 | Standard_Real prevangle; | |
272 | Standard_Real newangle; | |
273 | Standard_Real prevcoeff; | |
274 | Standard_Real newcoeff; | |
7fd59977 | 275 | |
bbf847ad P |
276 | Standard_Boolean isOwnDeviationAngle = OwnDeviationAngle(newangle,prevangle); |
277 | Standard_Boolean isOwnDeviationCoefficient = OwnDeviationCoefficient(newcoeff,prevcoeff); | |
278 | if (((Abs (newangle - prevangle) > Precision::Angular()) && isOwnDeviationAngle) || | |
279 | ((Abs (newcoeff - prevcoeff) > Precision::Confusion()) && isOwnDeviationCoefficient)) { | |
280 | BRepTools::Clean (myshape); | |
2bd4c032 | 281 | } |
282 | if (myshape.ShapeType() > TopAbs_FACE) | |
7fd59977 | 283 | { |
2bd4c032 | 284 | StdPrs_WFDeflectionShape::Add (thePrs, myshape, myDrawer); |
285 | break; | |
7fd59977 | 286 | } |
2bd4c032 | 287 | myDrawer->SetShadingAspectGlobal (Standard_False); |
288 | if (IsInfinite()) | |
289 | { | |
290 | StdPrs_WFDeflectionShape::Add (thePrs, myshape, myDrawer); | |
291 | break; | |
292 | } | |
293 | try | |
294 | { | |
295 | OCC_CATCH_SIGNALS | |
296 | StdPrs_ShadedShape::Add (thePrs, myshape, myDrawer); | |
297 | } | |
298 | catch (Standard_Failure) | |
299 | { | |
300 | std::cout << "AIS_TexturedShape::Compute() in ShadingMode failed \n"; | |
301 | StdPrs_WFShape::Add (thePrs, myshape, myDrawer); | |
302 | } | |
303 | break; | |
304 | } | |
7fd59977 | 305 | |
306 | case 2: // Bounding box | |
2bd4c032 | 307 | { |
308 | if (IsInfinite()) | |
7fd59977 | 309 | { |
2bd4c032 | 310 | StdPrs_WFDeflectionShape::Add (thePrs, myshape, myDrawer); |
7fd59977 | 311 | } |
2bd4c032 | 312 | else |
7fd59977 | 313 | { |
2bd4c032 | 314 | AIS_Shape::DisplayBox (thePrs, BoundingBox(), myDrawer); |
315 | } | |
316 | break; | |
317 | } | |
318 | ||
319 | case 3: // texture mapping on triangulation | |
320 | { | |
321 | BRepTools::Clean (myshape); | |
322 | BRepTools::Update (myshape); | |
7fd59977 | 323 | |
2bd4c032 | 324 | { |
325 | Handle(Prs3d_ShadingAspect) aPrs3d_ShadingAspect = new Prs3d_ShadingAspect(); | |
326 | myAspect = aPrs3d_ShadingAspect->Aspect(); | |
60761105 | 327 | |
328 | // Issue 23115: copy polygon offset settings passed through myDrawer | |
329 | if (HasPolygonOffsets()) | |
330 | { | |
331 | Standard_Integer aMode; | |
60be1f9b | 332 | Standard_ShortReal aFactor, aUnits; |
60761105 | 333 | PolygonOffsets(aMode, aFactor, aUnits); |
334 | myAspect->SetPolygonOffsets(aMode, aFactor, aUnits); | |
335 | } | |
2bd4c032 | 336 | } |
337 | if (!DoMapTexture) | |
338 | { | |
339 | myAspect->SetTextureMapOff(); | |
340 | return; | |
341 | } | |
342 | myAspect->SetTextureMapOn(); | |
7fd59977 | 343 | |
2bd4c032 | 344 | if (myPredefTexture != -1) |
bf75be98 | 345 | mytexture = new Graphic3d_Texture2Dmanual (myPredefTexture); |
2bd4c032 | 346 | else |
bf75be98 | 347 | mytexture = new Graphic3d_Texture2Dmanual (myTextureFile.ToCString()); |
7fd59977 | 348 | |
2bd4c032 | 349 | if (!mytexture->IsDone()) |
350 | { | |
351 | std::cout << "An error occured while building texture \n"; | |
352 | return; | |
353 | } | |
7fd59977 | 354 | |
2bd4c032 | 355 | if (myModulate) |
356 | mytexture->EnableModulate(); | |
357 | else | |
358 | mytexture->DisableModulate(); | |
7fd59977 | 359 | |
2bd4c032 | 360 | myAspect->SetTextureMap (mytexture); |
361 | if (DoShowTriangles) | |
362 | myAspect->SetEdgeOn(); | |
363 | else | |
364 | myAspect->SetEdgeOff(); | |
7fd59977 | 365 | |
2bd4c032 | 366 | if (DoRepeat) |
367 | mytexture->EnableRepeat(); | |
368 | else | |
369 | mytexture->DisableRepeat(); | |
7fd59977 | 370 | |
2bd4c032 | 371 | const gp_Pnt2d aUVOrigin (myUOrigin, myVOrigin); |
372 | const gp_Pnt2d aUVRepeat (myURepeat, myVRepeat); | |
373 | const gp_Pnt2d aUVScale (myScaleU, myScaleV); | |
374 | try | |
375 | { | |
376 | OCC_CATCH_SIGNALS | |
377 | StdPrs_ShadedShape::Add (thePrs, myshape, myDrawer, | |
378 | Standard_True, aUVOrigin, aUVRepeat, aUVScale); | |
379 | // within primitive arrays - object should be in one group of primitives | |
380 | Prs3d_Root::CurrentGroup (thePrs)->SetGroupPrimitivesAspect (myAspect); | |
381 | } | |
382 | catch (Standard_Failure) | |
383 | { | |
384 | std::cout << "AIS_TexturedShape::Compute() in ShadingMode failed \n"; | |
385 | StdPrs_WFShape::Add (thePrs, myshape, myDrawer); | |
386 | } | |
387 | break; | |
388 | } | |
389 | } | |
390 | } | |
7fd59977 | 391 | |
392 | Standard_Boolean AIS_TexturedShape::TextureMapState() const | |
393 | { | |
394 | return DoMapTexture; | |
395 | } | |
396 | ||
397 | Standard_Real AIS_TexturedShape::URepeat() const | |
398 | { | |
399 | return myURepeat; | |
400 | } | |
401 | ||
402 | Standard_Boolean AIS_TexturedShape::TextureRepeat() const | |
403 | { | |
404 | return DoRepeat; | |
405 | } | |
406 | ||
407 | Standard_Real AIS_TexturedShape::Deflection() const | |
408 | { | |
409 | return myDeflection; | |
410 | } | |
411 | ||
412 | Standard_CString AIS_TexturedShape::TextureFile() const | |
413 | { | |
414 | return myTextureFile.ToCString(); | |
415 | } | |
416 | ||
417 | Standard_Real AIS_TexturedShape::VRepeat() const | |
418 | { | |
419 | return myVRepeat; | |
420 | } | |
2bd4c032 | 421 | |
7fd59977 | 422 | Standard_Boolean AIS_TexturedShape::ShowTriangles() const |
423 | { | |
424 | return DoShowTriangles; | |
425 | } | |
2bd4c032 | 426 | |
7fd59977 | 427 | Standard_Real AIS_TexturedShape::TextureUOrigin() const |
428 | { | |
429 | return myUOrigin; | |
430 | } | |
2bd4c032 | 431 | |
7fd59977 | 432 | Standard_Real AIS_TexturedShape::TextureVOrigin() const |
433 | { | |
434 | return myVOrigin; | |
435 | } | |
2bd4c032 | 436 | |
7fd59977 | 437 | Standard_Real AIS_TexturedShape::TextureScaleU() const |
438 | { | |
439 | return myScaleU; | |
440 | } | |
2bd4c032 | 441 | |
7fd59977 | 442 | Standard_Real AIS_TexturedShape::TextureScaleV() const |
443 | { | |
444 | return myScaleV; | |
445 | } | |
2bd4c032 | 446 | |
447 | Standard_Boolean AIS_TexturedShape::TextureScale() const | |
7fd59977 | 448 | { |
449 | return DoSetTextureScale; | |
450 | } | |
2bd4c032 | 451 | |
452 | Standard_Boolean AIS_TexturedShape::TextureOrigin() const | |
7fd59977 | 453 | { |
454 | return DoSetTextureOrigin; | |
455 | } | |
2bd4c032 | 456 | |
457 | Standard_Boolean AIS_TexturedShape::TextureModulate() const | |
7fd59977 | 458 | { |
459 | return myModulate; | |
460 | } |