#endif
myToCullBackFaces (false),
myReadBuffer (0),
- myDrawBuffers (1),
+ myDrawBuffers (0, 7),
myDefaultVao (0),
myColorMask (true),
myAlphaToCoverage (false),
}
::glDrawBuffer (aDrawBuffer);
- myDrawBuffers.Clear();
-
- if (aDrawBuffer != GL_NONE)
- {
- myDrawBuffers.SetValue (0, aDrawBuffer);
- }
+ myDrawBuffers.Init (GL_NONE);
+ myDrawBuffers.SetValue (0, aDrawBuffer);
#else
(void )theDrawBuffer;
#endif
{
Standard_ASSERT_RETURN (hasDrawBuffers, "Multiple draw buffers feature is not supported by the context", Standard_ASSERT_DO_NOTHING());
- myDrawBuffers.Clear();
+ if (myDrawBuffers.Length() < theNb)
+ {
+ // should actually never happen here
+ myDrawBuffers.Resize (0, theNb - 1, false);
+ }
+ myDrawBuffers.Init (GL_NONE);
Standard_Boolean useDefaultFbo = Standard_False;
for (Standard_Integer anI = 0; anI < theNb; ++anI)
{
useDefaultFbo = Standard_True;
}
- else if (theDrawBuffers[anI] != GL_NONE)
+ else
{
myDrawBuffers.SetValue (anI, theDrawBuffers[anI]);
}
::glGetIntegerv (GL_READ_BUFFER, &myReadBuffer);
// cache draw buffers state
- myDrawBuffers.Clear();
+ if (myDrawBuffers.Length() < myMaxDrawBuffers)
+ {
+ myDrawBuffers.Resize (0, myMaxDrawBuffers - 1, false);
+ }
+ myDrawBuffers.Init (GL_NONE);
+ Standard_Integer aDrawBuffer = GL_NONE;
if (myMaxDrawBuffers == 1)
{
- Standard_Integer aDrawBuffer;
-
::glGetIntegerv (GL_DRAW_BUFFER, &aDrawBuffer);
-
- if (aDrawBuffer != GL_NONE)
- {
- myDrawBuffers.SetValue (0, aDrawBuffer);
- }
+ myDrawBuffers.SetValue (0, aDrawBuffer);
}
else
{
- Standard_Integer aDrawBuffer;
-
for (Standard_Integer anI = 0; anI < myMaxDrawBuffers; ++anI)
{
::glGetIntegerv (GL_DRAW_BUFFER0 + anI, &aDrawBuffer);
-
- if (aDrawBuffer != GL_NONE)
- {
- myDrawBuffers.SetValue (anI, aDrawBuffer);
- }
+ myDrawBuffers.SetValue (anI, aDrawBuffer);
}
}
#endif
{
glGetIntegerv (GL_MAX_DRAW_BUFFERS, &myMaxDrawBuffers);
glGetIntegerv (GL_MAX_COLOR_ATTACHMENTS, &myMaxColorAttachments);
+ if (myDrawBuffers.Length() < myMaxDrawBuffers)
+ {
+ myDrawBuffers.Resize (0, myMaxDrawBuffers - 1, false);
+ }
}
glGetIntegerv (GL_MAX_TEXTURE_SIZE, &myMaxTexDim);
Standard_EXPORT void SetReadBuffer (const Standard_Integer theReadBuffer);
//! Return active draw buffer attached to a render target referred by index (layout location).
- Standard_Integer DrawBuffer (const Standard_Integer theIndex = 0)
+ Standard_Integer DrawBuffer (Standard_Integer theIndex = 0) const
{
- return myDrawBuffers.IsBound (theIndex) ? myDrawBuffers.Value (theIndex) : GL_NONE;
+ return theIndex >= myDrawBuffers.Lower()
+ && theIndex <= myDrawBuffers.Upper()
+ ? myDrawBuffers.Value (theIndex)
+ : GL_NONE;
}
//! Switch draw buffer, wrapper for ::glDrawBuffer().
typedef NCollection_Shared< NCollection_DataMap<TCollection_AsciiString, Standard_Integer> > OpenGl_DelayReleaseMap;
typedef NCollection_Shared< NCollection_List<Handle(OpenGl_Resource)> > OpenGl_ResourcesStack;
- typedef NCollection_SparseArray<Standard_Integer> OpenGl_DrawBuffers;
Handle(OpenGl_ResourcesMap) mySharedResources; //!< shared resources with unique identification key
Handle(OpenGl_DelayReleaseMap) myDelayed; //!< shared resources for delayed release
Graphic3d_PolygonOffset myPolygonOffset; //!< currently applied polygon offset
bool myToCullBackFaces; //!< back face culling mode enabled state (glIsEnabled (GL_CULL_FACE))
Standard_Integer myReadBuffer; //!< current read buffer
- OpenGl_DrawBuffers myDrawBuffers; //!< current draw buffers
+ NCollection_Array1<Standard_Integer>
+ myDrawBuffers; //!< current draw buffers
unsigned int myDefaultVao; //!< default Vertex Array Object
Standard_Boolean myColorMask; //!< flag indicating writing into color buffer is enabled or disabled (glColorMask)
Standard_Boolean myAlphaToCoverage; //!< flag indicating GL_SAMPLE_ALPHA_TO_COVERAGE state