1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-05-01 10:26:12 +03:00
occt/src/AIS/AIS_TexturedShape.cxx
kgv bf75be9867 0023544: Texture management in TKOpenGl should be redesigned
Structures Graphic3d_CView, Graphic3d_CStructure, Graphic3d_CGroup become classes and their definitions moved from InterfaceGraphic to Graphic3d.
Introduced new class OpenGl_Texture as replacement for OpenGl_ResourceTexture class and static functions in OpenGl_TextureBox.
Graphic3d_TextureRoot now no more communicate within Graphic3d_GraphicalDriver.
Instead class returns image through GetImage() method.
OpenGl_AspectFace - avoid possible NULL-dereference
OpenGl_Texture::Init() - check gluBuild2DMipmaps() return value
OpenGl_Texture - check GL_BGRA_EXT for compatibility
OpenGl_Texture - scale NPOT image when required
Added more description to Graphic3d_TextureRoot class
OpenGl_Texture - added missing break statement for ImgBGR32 case
OpenGl_Workspace::setTextureParams() - fixed local variable aFilterMin overrides visibility of early declared variable
OpenGl_Workspace::DisableTexture() - reset texture matrix
FTGL do not reset texture matrix and corrupt text could be rendered if custom texture has not identity texture matrix.
2012-12-07 13:58:30 +04:00

462 lines
13 KiB
C++
Executable File

// Created on: 2001-07-02
// Created by: Mathias BOSSHARD
// Copyright (c) 2001-2012 OPEN CASCADE SAS
//
// The content of this file is subject to the Open CASCADE Technology Public
// License Version 6.5 (the "License"). You may not use the content of this file
// except in compliance with the License. Please obtain a copy of the License
// at http://www.opencascade.org and read it completely before using this file.
//
// The Initial Developer of the Original Code is Open CASCADE S.A.S., having its
// main offices at: 1, place des Freres Montgolfier, 78280 Guyancourt, France.
//
// The Original Code and all software distributed under the License is
// distributed on an "AS IS" basis, without warranty of any kind, and the
// Initial Developer hereby disclaims all such warranties, including without
// limitation, any warranties of merchantability, fitness for a particular
// purpose or non-infringement. Please see the License for the specific terms
// and conditions governing the rights and limitations under the License.
// Modified:
////////////////////////////////////////////////////////////////////////
#include <AIS_TexturedShape.ixx>
#include <Standard_ErrorHandler.hxx>
#include <AIS_Drawer.hxx>
#include <AIS_InteractiveContext.hxx>
#include <BRepTools.hxx>
#include <gp_Pnt2d.hxx>
#include <Graphic3d_AspectFillArea3d.hxx>
#include <Graphic3d_Group.hxx>
#include <Graphic3d_StructureManager.hxx>
#include <Graphic3d_Texture2Dmanual.hxx>
#include <Precision.hxx>
#include <Prs3d_Presentation.hxx>
#include <Prs3d_Root.hxx>
#include <Prs3d_ShadingAspect.hxx>
#include <PrsMgr_PresentationManager3d.hxx>
#include <StdPrs_ShadedShape.hxx>
#include <StdPrs_WFDeflectionShape.hxx>
#include <StdPrs_WFShape.hxx>
#include <TopExp_Explorer.hxx>
//=======================================================================
//function : AIS_TexturedShape
//purpose :
//=======================================================================
AIS_TexturedShape::AIS_TexturedShape (const TopoDS_Shape& theShape)
: AIS_Shape (theShape),
myPredefTexture (Graphic3d_NameOfTexture2D(0)),
myTextureFile (""),
DoRepeat (Standard_True),
myURepeat (1.0),
myVRepeat (1.0),
DoMapTexture (Standard_True),
DoSetTextureOrigin (Standard_True),
myUOrigin (0.0),
myVOrigin (0.0),
DoSetTextureScale (Standard_True),
myScaleU (1.0),
myScaleV (1.0),
DoShowTriangles (Standard_False),
myModulate (Standard_True)
{
}
//=======================================================================
//function : SetTextureFileName
//purpose :
//=======================================================================
void AIS_TexturedShape::SetTextureFileName (const TCollection_AsciiString& theTextureFileName)
{
if (theTextureFileName.IsIntegerValue())
{
if (theTextureFileName.IntegerValue() < Graphic3d_Texture2D::NumberOfTextures()
&& theTextureFileName.IntegerValue() >= 0)
{
myPredefTexture = Graphic3d_NameOfTexture2D (theTextureFileName.IntegerValue());
}
else
{
std::cout << "Texture " << theTextureFileName << " doesn't exist \n";
std::cout << "Using Texture 0 instead ...\n";
myPredefTexture = Graphic3d_NameOfTexture2D (0);
}
myTextureFile = "";
}
else
{
myTextureFile = theTextureFileName;
myPredefTexture = Graphic3d_NameOfTexture2D (-1);
}
}
//=======================================================================
//function : SetTextureRepeat
//purpose :
//=======================================================================
void AIS_TexturedShape::SetTextureRepeat (const Standard_Boolean theRepeatYN,
const Standard_Real theURepeat,
const Standard_Real theVRepeat)
{
DoRepeat = theRepeatYN;
myURepeat = theURepeat;
myVRepeat = theVRepeat;
}
//=======================================================================
//function : SetTextureMapOn
//purpose :
//=======================================================================
void AIS_TexturedShape::SetTextureMapOn()
{
DoMapTexture = Standard_True;
}
//=======================================================================
//function : SetTextureMapOff
//purpose :
//=======================================================================
void AIS_TexturedShape::SetTextureMapOff()
{
DoMapTexture = Standard_False;
}
//=======================================================================
//function : SetTextureOrigin
//purpose :
//=======================================================================
void AIS_TexturedShape::SetTextureOrigin (const Standard_Boolean toSetTextureOriginYN,
const Standard_Real theUOrigin,
const Standard_Real theVOrigin)
{
DoSetTextureOrigin = toSetTextureOriginYN;
myUOrigin = theUOrigin;
myVOrigin = theVOrigin;
}
//=======================================================================
//function : SetTextureScale
//purpose :
//=======================================================================
void AIS_TexturedShape::SetTextureScale (const Standard_Boolean toSetTextureScaleYN,
const Standard_Real theScaleU,
const Standard_Real theScaleV)
{
DoSetTextureScale = toSetTextureScaleYN;
myScaleU = theScaleU;
myScaleV = theScaleV;
}
//=======================================================================
//function : ShowTriangles
//purpose :
//=======================================================================
void AIS_TexturedShape::ShowTriangles (const Standard_Boolean toShowTrianglesYN)
{
DoShowTriangles = toShowTrianglesYN;
}
//=======================================================================
//function : EnableTextureModulate
//purpose :
//=======================================================================
void AIS_TexturedShape::EnableTextureModulate()
{
myModulate = Standard_True;
}
//=======================================================================
//function : DisableTextureModulate
//purpose :
//=======================================================================
void AIS_TexturedShape::DisableTextureModulate()
{
myModulate = Standard_False;
}
//=======================================================================
//function : UpdateAttributes
//purpose :
//=======================================================================
void AIS_TexturedShape::UpdateAttributes()
{
Prs3d_ShadingAspect aDummy;
myAspect = aDummy.Aspect();
Handle(Prs3d_Presentation) aPrs = Presentation();
if (!DoMapTexture)
{
myAspect->SetTextureMapOff();
return;
}
if (myPredefTexture != -1)
mytexture = new Graphic3d_Texture2Dmanual (myPredefTexture);
else
mytexture = new Graphic3d_Texture2Dmanual (myTextureFile.ToCString());
myAspect->SetTextureMapOn();
myAspect->SetTextureMap (mytexture);
if (!mytexture->IsDone())
{
std::cout << "An error occured while building texture \n";
return;
}
if (DoShowTriangles)
myAspect->SetEdgeOn();
else
myAspect->SetEdgeOff();
Prs3d_Root::CurrentGroup (aPrs)->SetGroupPrimitivesAspect (myAspect);
}
//=======================================================================
//function : Compute
//purpose :
//=======================================================================
void AIS_TexturedShape::Compute (const Handle(PrsMgr_PresentationManager3d)& /*thePresManager*/,
const Handle(Prs3d_Presentation)& thePrs,
const Standard_Integer theMode)
{
thePrs->Clear();
if (myshape.IsNull())
{
return;
}
if (myshape.ShapeType() > TopAbs_FACE && myshape.ShapeType() < TopAbs_SHAPE)
{
thePrs->SetVisual (Graphic3d_TOS_ALL);
thePrs->SetDisplayPriority (myshape.ShapeType() + 2);
}
if (myshape.ShapeType() == TopAbs_COMPOUND)
{
TopExp_Explorer anExplor (myshape, TopAbs_VERTEX);
if (!anExplor.More())
{
return;
}
}
if (IsInfinite())
{
thePrs->SetInfiniteState (Standard_True);
}
switch (theMode)
{
case 0: // Wireframe
{
StdPrs_WFDeflectionShape::Add (thePrs, myshape, myDrawer);
break;
}
case 1: // Shading
{
Standard_Real prevangle;
Standard_Real newangle;
Standard_Real prevcoeff;
Standard_Real newcoeff;
if (OwnDeviationAngle (newangle, prevangle) || OwnDeviationCoefficient (newcoeff, prevcoeff))
{
if (Abs (newangle - prevangle) > Precision::Angular() || Abs (newcoeff - prevcoeff) > Precision::Confusion())
{
BRepTools::Clean (myshape);
}
}
if (myshape.ShapeType() > TopAbs_FACE)
{
StdPrs_WFDeflectionShape::Add (thePrs, myshape, myDrawer);
break;
}
myDrawer->SetShadingAspectGlobal (Standard_False);
if (IsInfinite())
{
StdPrs_WFDeflectionShape::Add (thePrs, myshape, myDrawer);
break;
}
try
{
OCC_CATCH_SIGNALS
StdPrs_ShadedShape::Add (thePrs, myshape, myDrawer);
}
catch (Standard_Failure)
{
std::cout << "AIS_TexturedShape::Compute() in ShadingMode failed \n";
StdPrs_WFShape::Add (thePrs, myshape, myDrawer);
}
break;
}
case 2: // Bounding box
{
if (IsInfinite())
{
StdPrs_WFDeflectionShape::Add (thePrs, myshape, myDrawer);
}
else
{
AIS_Shape::DisplayBox (thePrs, BoundingBox(), myDrawer);
}
break;
}
case 3: // texture mapping on triangulation
{
BRepTools::Clean (myshape);
BRepTools::Update (myshape);
{
Handle(Prs3d_ShadingAspect) aPrs3d_ShadingAspect = new Prs3d_ShadingAspect();
myAspect = aPrs3d_ShadingAspect->Aspect();
// Issue 23115: copy polygon offset settings passed through myDrawer
if (HasPolygonOffsets())
{
Standard_Integer aMode;
Standard_ShortReal aFactor, aUnits;
PolygonOffsets(aMode, aFactor, aUnits);
myAspect->SetPolygonOffsets(aMode, aFactor, aUnits);
}
}
if (!DoMapTexture)
{
myAspect->SetTextureMapOff();
return;
}
myAspect->SetTextureMapOn();
if (myPredefTexture != -1)
mytexture = new Graphic3d_Texture2Dmanual (myPredefTexture);
else
mytexture = new Graphic3d_Texture2Dmanual (myTextureFile.ToCString());
if (!mytexture->IsDone())
{
std::cout << "An error occured while building texture \n";
return;
}
if (myModulate)
mytexture->EnableModulate();
else
mytexture->DisableModulate();
myAspect->SetTextureMap (mytexture);
if (DoShowTriangles)
myAspect->SetEdgeOn();
else
myAspect->SetEdgeOff();
if (DoRepeat)
mytexture->EnableRepeat();
else
mytexture->DisableRepeat();
const gp_Pnt2d aUVOrigin (myUOrigin, myVOrigin);
const gp_Pnt2d aUVRepeat (myURepeat, myVRepeat);
const gp_Pnt2d aUVScale (myScaleU, myScaleV);
try
{
OCC_CATCH_SIGNALS
StdPrs_ShadedShape::Add (thePrs, myshape, myDrawer,
Standard_True, aUVOrigin, aUVRepeat, aUVScale);
// within primitive arrays - object should be in one group of primitives
Prs3d_Root::CurrentGroup (thePrs)->SetGroupPrimitivesAspect (myAspect);
}
catch (Standard_Failure)
{
std::cout << "AIS_TexturedShape::Compute() in ShadingMode failed \n";
StdPrs_WFShape::Add (thePrs, myshape, myDrawer);
}
break;
}
}
}
Standard_Boolean AIS_TexturedShape::TextureMapState() const
{
return DoMapTexture;
}
Standard_Real AIS_TexturedShape::URepeat() const
{
return myURepeat;
}
Standard_Boolean AIS_TexturedShape::TextureRepeat() const
{
return DoRepeat;
}
Standard_Real AIS_TexturedShape::Deflection() const
{
return myDeflection;
}
Standard_CString AIS_TexturedShape::TextureFile() const
{
return myTextureFile.ToCString();
}
Standard_Real AIS_TexturedShape::VRepeat() const
{
return myVRepeat;
}
Standard_Boolean AIS_TexturedShape::ShowTriangles() const
{
return DoShowTriangles;
}
Standard_Real AIS_TexturedShape::TextureUOrigin() const
{
return myUOrigin;
}
Standard_Real AIS_TexturedShape::TextureVOrigin() const
{
return myVOrigin;
}
Standard_Real AIS_TexturedShape::TextureScaleU() const
{
return myScaleU;
}
Standard_Real AIS_TexturedShape::TextureScaleV() const
{
return myScaleV;
}
Standard_Boolean AIS_TexturedShape::TextureScale() const
{
return DoSetTextureScale;
}
Standard_Boolean AIS_TexturedShape::TextureOrigin() const
{
return DoSetTextureOrigin;
}
Standard_Boolean AIS_TexturedShape::TextureModulate() const
{
return myModulate;
}