File indexing completed on 2026-09-26 09:04:22
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016 #ifndef OpenGl_LayerList_HeaderFile
0017 #define OpenGl_LayerList_HeaderFile
0018
0019 #include <OpenGl_Layer.hxx>
0020 #include <OpenGl_LayerFilter.hxx>
0021
0022 #include <Graphic3d_ZLayerId.hxx>
0023 #include <NCollection_Array1.hxx>
0024 #include <NCollection_Handle.hxx>
0025 #include <NCollection_DataMap.hxx>
0026
0027 class OpenGl_FrameBuffer;
0028 class OpenGl_Structure;
0029 class OpenGl_Workspace;
0030 struct OpenGl_GlobalLayerSettings;
0031
0032
0033 class OpenGl_LayerList
0034 {
0035 public:
0036
0037 Standard_EXPORT OpenGl_LayerList();
0038
0039
0040 Standard_EXPORT virtual ~OpenGl_LayerList();
0041
0042
0043 int NbPriorities() const { return Graphic3d_DisplayPriority_NB; }
0044
0045
0046 int NbStructures() const { return myNbStructures; }
0047
0048
0049 int NbImmediateStructures() const { return myImmediateNbStructures; }
0050
0051
0052 Standard_EXPORT void InsertLayerBefore(const Graphic3d_ZLayerId theNewLayerId,
0053 const Graphic3d_ZLayerSettings& theSettings,
0054 const Graphic3d_ZLayerId theLayerAfter);
0055
0056
0057 Standard_EXPORT void InsertLayerAfter(const Graphic3d_ZLayerId theNewLayerId,
0058 const Graphic3d_ZLayerSettings& theSettings,
0059 const Graphic3d_ZLayerId theLayerBefore);
0060
0061
0062 Standard_EXPORT void RemoveLayer(const Graphic3d_ZLayerId theLayerId);
0063
0064
0065
0066
0067 Standard_EXPORT void AddStructure(const OpenGl_Structure* theStruct,
0068 const Graphic3d_ZLayerId theLayerId,
0069 const Graphic3d_DisplayPriority thePriority,
0070 bool isForChangePriority = false);
0071
0072
0073 Standard_EXPORT void RemoveStructure(const OpenGl_Structure* theStructure);
0074
0075
0076
0077
0078 Standard_EXPORT void ChangeLayer(const OpenGl_Structure* theStructure,
0079 const Graphic3d_ZLayerId theOldLayerId,
0080 const Graphic3d_ZLayerId theNewLayerId);
0081
0082
0083 Standard_EXPORT void ChangePriority(const OpenGl_Structure* theStructure,
0084 const Graphic3d_ZLayerId theLayerId,
0085 const Graphic3d_DisplayPriority theNewPriority);
0086
0087
0088 OpenGl_Layer& Layer(const Graphic3d_ZLayerId theLayerId) { return *myLayerIds.Find(theLayerId); }
0089
0090
0091 const OpenGl_Layer& Layer(const Graphic3d_ZLayerId theLayerId) const
0092 {
0093 return *myLayerIds.Find(theLayerId);
0094 }
0095
0096
0097 Standard_EXPORT void SetLayerSettings(const Graphic3d_ZLayerId theLayerId,
0098 const Graphic3d_ZLayerSettings& theSettings);
0099
0100
0101 Standard_EXPORT void UpdateCulling(const occ::handle<OpenGl_Workspace>& theWorkspace,
0102 const bool theToDrawImmediate);
0103
0104
0105 Standard_EXPORT void Render(const occ::handle<OpenGl_Workspace>& theWorkspace,
0106 const bool theToDrawImmediate,
0107 const OpenGl_LayerFilter theFilterMode,
0108 const Graphic3d_ZLayerId theLayersToProcess,
0109 OpenGl_FrameBuffer* theReadDrawFbo,
0110 OpenGl_FrameBuffer* theOitAccumFbo) const;
0111
0112
0113 const NCollection_List<occ::handle<Graphic3d_Layer>>& Layers() const { return myLayers; }
0114
0115
0116 const NCollection_DataMap<Graphic3d_ZLayerId, occ::handle<Graphic3d_Layer>>& LayerIDs() const
0117 {
0118 return myLayerIds;
0119 }
0120
0121
0122
0123 Standard_EXPORT void InvalidateBVHData(const Graphic3d_ZLayerId theLayerId);
0124
0125
0126 size_t ModificationStateOfRaytracable() const { return myModifStateOfRaytraceable; }
0127
0128
0129 const occ::handle<BVH_Builder3d>& FrustumCullingBVHBuilder() const { return myBVHBuilder; }
0130
0131
0132 Standard_EXPORT void SetFrustumCullingBVHBuilder(const occ::handle<BVH_Builder3d>& theBuilder);
0133
0134
0135 Standard_EXPORT void DumpJson(Standard_OStream& theOStream, int theDepth = -1) const;
0136
0137 protected:
0138
0139 class OpenGl_LayerStack
0140 {
0141 public:
0142 typedef NCollection_Array1<const Graphic3d_Layer*>::const_iterator const_iterator;
0143 typedef NCollection_Array1<const Graphic3d_Layer*>::iterator iterator;
0144
0145
0146 void Allocate(int theSize)
0147 {
0148 if (theSize > 0)
0149 {
0150 myStackSpace.Resize(1, theSize, false);
0151 myStackSpace.Init(nullptr);
0152 myBackPtr = myStackSpace.begin();
0153 }
0154 else
0155 {
0156 NCollection_Array1<const Graphic3d_Layer*> aDummy;
0157 myStackSpace.Move(std::move(aDummy));
0158 myBackPtr = iterator();
0159 }
0160 }
0161
0162
0163 void Clear()
0164 {
0165 myStackSpace.Init(nullptr);
0166 myBackPtr = myStackSpace.begin();
0167 }
0168
0169
0170 void Push(const OpenGl_Layer* theLayer) { (*myBackPtr++) = theLayer; }
0171
0172
0173 const_iterator Origin() const
0174 {
0175 return myStackSpace.IsEmpty() ? const_iterator() : myStackSpace.begin();
0176 }
0177
0178
0179 iterator Back() const { return myBackPtr; }
0180
0181
0182 iterator Origin() { return myStackSpace.IsEmpty() ? iterator() : myStackSpace.begin(); }
0183
0184
0185 bool IsEmpty() const { return Back() == Origin(); }
0186
0187 private:
0188 NCollection_Array1<const OpenGl_Layer*> myStackSpace;
0189 iterator myBackPtr;
0190 };
0191
0192
0193
0194
0195
0196
0197
0198
0199
0200
0201
0202 Standard_EXPORT void renderTransparent(const occ::handle<OpenGl_Workspace>& theWorkspace,
0203 OpenGl_LayerStack::iterator& theLayerIter,
0204 const OpenGl_GlobalLayerSettings& theGlobalSettings,
0205 OpenGl_FrameBuffer* theReadDrawFbo,
0206 OpenGl_FrameBuffer* theOitAccumFbo) const;
0207
0208
0209 Standard_EXPORT void renderLayer(const occ::handle<OpenGl_Workspace>& theWorkspace,
0210 const OpenGl_GlobalLayerSettings& theDefaultSettings,
0211 const Graphic3d_Layer& theLayer) const;
0212
0213 protected:
0214 NCollection_List<occ::handle<Graphic3d_Layer>> myLayers;
0215 NCollection_DataMap<Graphic3d_ZLayerId, occ::handle<Graphic3d_Layer>> myLayerIds;
0216 occ::handle<BVH_Builder3d> myBVHBuilder;
0217
0218 int myNbStructures;
0219
0220 int myImmediateNbStructures;
0221
0222
0223 mutable size_t myModifStateOfRaytraceable;
0224
0225
0226 mutable OpenGl_LayerStack myTransparentToProcess;
0227
0228 public:
0229 DEFINE_STANDARD_ALLOC
0230 };
0231
0232 #endif