File indexing completed on 2025-01-18 10:04:36
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016 #ifndef _OpenGl_TileSampler_H
0017 #define _OpenGl_TileSampler_H
0018
0019 #include <OpenGl_Texture.hxx>
0020 #include <OpenGl_HaltonSampler.hxx>
0021
0022 #include <Image_PixMapTypedData.hxx>
0023
0024 #include <vector>
0025
0026 class Graphic3d_RenderingParams;
0027
0028
0029
0030
0031
0032
0033
0034
0035 class OpenGl_TileSampler
0036 {
0037 public:
0038
0039
0040 Standard_EXPORT OpenGl_TileSampler();
0041
0042
0043 Graphic3d_Vec2i TileSize() const { return Graphic3d_Vec2i (myTileSize, myTileSize); }
0044
0045
0046 float VarianceScaleFactor() const { return myScaleFactor; }
0047
0048
0049 int NbTilesX() const { return (int)myTiles.SizeX; }
0050
0051
0052 int NbTilesY() const { return (int)myTiles.SizeY; }
0053
0054
0055 int NbTiles() const { return int(myTiles.SizeX * myTiles.SizeY); }
0056
0057
0058 const Graphic3d_Vec2i& ViewSize() const { return myViewSize; }
0059
0060
0061 Graphic3d_Vec2i NbOffsetTiles (bool theAdaptive) const
0062 {
0063 return theAdaptive
0064 ? Graphic3d_Vec2i ((int )myOffsetsShrunk.SizeX, (int )myOffsetsShrunk.SizeY)
0065 : Graphic3d_Vec2i ((int )myOffsets.SizeX, (int )myOffsets.SizeY);
0066 }
0067
0068
0069 Graphic3d_Vec2i NbOffsetTilesMax() const { return NbOffsetTiles (true).cwiseMax (NbOffsetTiles (false)); }
0070
0071
0072 Graphic3d_Vec2i OffsetTilesViewport (bool theAdaptive) const { return NbOffsetTiles (theAdaptive) * myTileSize; }
0073
0074
0075 Graphic3d_Vec2i OffsetTilesViewportMax() const { return NbOffsetTilesMax() * myTileSize; }
0076
0077
0078 int MaxTileSamples() const
0079 {
0080 int aNbSamples = 0;
0081 for (Standard_Size aRowIter = 0; aRowIter < myTiles.SizeY; ++aRowIter)
0082 {
0083 for (Standard_Size aColIter = 0; aColIter < myTiles.SizeX; ++aColIter)
0084 {
0085 aNbSamples = Max (aNbSamples, myTiles.Value (aRowIter, aColIter));
0086 }
0087 }
0088 return aNbSamples;
0089 }
0090
0091
0092 Standard_EXPORT void SetSize (const Graphic3d_RenderingParams& theParams,
0093 const Graphic3d_Vec2i& theSize);
0094
0095
0096
0097 Standard_EXPORT void GrabVarianceMap (const Handle(OpenGl_Context)& theContext,
0098 const Handle(OpenGl_Texture)& theTexture);
0099
0100
0101 void Reset() { myLastSample = 0; }
0102
0103
0104 bool UploadSamples (const Handle(OpenGl_Context)& theContext,
0105 const Handle(OpenGl_Texture)& theSamplesTexture,
0106 const bool theAdaptive)
0107 {
0108 return upload (theContext, theSamplesTexture, Handle(OpenGl_Texture)(), theAdaptive);
0109 }
0110
0111
0112 bool UploadOffsets (const Handle(OpenGl_Context)& theContext,
0113 const Handle(OpenGl_Texture)& theOffsetsTexture,
0114 const bool theAdaptive)
0115 {
0116 return upload (theContext, Handle(OpenGl_Texture)(), theOffsetsTexture, theAdaptive);
0117 }
0118
0119 protected:
0120
0121
0122 int tileArea (int theX, int theY) const
0123 {
0124 const int aSizeX = Min (myTileSize, myViewSize.x() - theX * myTileSize);
0125 const int aSizeY = Min (myTileSize, myViewSize.y() - theY * myTileSize);
0126 return aSizeX * aSizeY;
0127 }
0128
0129
0130 Standard_EXPORT Graphic3d_Vec2i nextTileToSample();
0131
0132
0133 Standard_EXPORT bool upload (const Handle(OpenGl_Context)& theContext,
0134 const Handle(OpenGl_Texture)& theSamplesTexture,
0135 const Handle(OpenGl_Texture)& theOffsetsTexture,
0136 const bool theAdaptive);
0137
0138
0139 Standard_EXPORT void dumpMap (std::ostream& theStream,
0140 const Image_PixMapTypedData<int>& theMap,
0141 const char* theTitle) const;
0142
0143 protected:
0144
0145 Image_PixMapTypedData<unsigned int> myTiles;
0146 Image_PixMapTypedData<unsigned int> myTileSamples;
0147 Image_PixMapTypedData<float> myVarianceMap;
0148 Image_PixMapTypedData<int> myVarianceRaw;
0149 Image_PixMapTypedData<Graphic3d_Vec2i> myOffsets;
0150 Image_PixMapTypedData<Graphic3d_Vec2i> myOffsetsShrunk;
0151 std::vector<float> myMarginalMap;
0152 OpenGl_HaltonSampler mySampler;
0153 unsigned int myLastSample;
0154 float myScaleFactor;
0155 int myTileSize;
0156 Graphic3d_Vec2i myViewSize;
0157
0158 };
0159
0160 #endif