public:
+ //! State counter for OpenGl structures.
OpenGl_StateCounter* GetStateCounter() const { return &myStateCounter; }
+ //! Returns unique ID for primitive arrays.
+ const Standard_Size GetNextPrimitiveArrayUID() const { return myUIDGenerator.Increment(); }
+
private:
- mutable OpenGl_StateCounter myStateCounter;
+ mutable OpenGl_StateCounter myStateCounter; //!< State counter for OpenGl structures.
+ mutable OpenGl_StateCounter myUIDGenerator; //!< Unique ID counter for primitive arrays.
};
return;
}
- OpenGl_PrimitiveArray* anArray = new OpenGl_PrimitiveArray (theType, theIndices, theAttribs, theBounds);
+ OpenGl_Structure* aStruct = GlStruct();
+ const OpenGl_GraphicDriver* aDriver = aStruct->GlDriver();
+
+ OpenGl_PrimitiveArray* anArray = new OpenGl_PrimitiveArray (aDriver, theType, theIndices, theAttribs, theBounds);
AddElement (anArray);
Graphic3d_Group::AddPrimitiveArray (theType, theIndices, theAttribs, theBounds, theToEvalMinMax);
// function : OpenGl_PrimitiveArray
// purpose :
// =======================================================================
-OpenGl_PrimitiveArray::OpenGl_PrimitiveArray (const Graphic3d_TypeOfPrimitiveArray theType,
+OpenGl_PrimitiveArray::OpenGl_PrimitiveArray (const OpenGl_GraphicDriver* theDriver,
+ const Graphic3d_TypeOfPrimitiveArray theType,
const Handle(Graphic3d_IndexBuffer)& theIndices,
const Handle(Graphic3d_Buffer)& theAttribs,
const Handle(Graphic3d_BoundBuffer)& theBounds)
+
: myIndices (theIndices),
myAttribs (theAttribs),
myBounds (theBounds),
myDrawMode (DRAW_MODE_NONE),
- myIsVboInit (Standard_False)
+ myIsVboInit (Standard_False),
+ myUID (theDriver->GetNextPrimitiveArrayUID())
{
if (!myIndices.IsNull()
&& myIndices->NbElements < 1)
#include <OpenGl_Element.hxx>
+class OpenGl_GraphicDriver;
+
class OpenGl_PrimitiveArray : public OpenGl_Element
{
public:
};
//! Default constructor
- OpenGl_PrimitiveArray (const Graphic3d_TypeOfPrimitiveArray theType,
+ OpenGl_PrimitiveArray (const OpenGl_GraphicDriver* theDriver,
+ const Graphic3d_TypeOfPrimitiveArray theType,
const Handle(Graphic3d_IndexBuffer)& theIndices,
const Handle(Graphic3d_Buffer)& theAttribs,
const Handle(Graphic3d_BoundBuffer)& theBounds);
//! @return bounds array
const Handle(Graphic3d_BoundBuffer)& Bounds() const { return myBounds; }
+ //! Returns unique ID of primitive array.
+ const Standard_Size GetUID() const { return myUID; }
+
private:
//! VBO initialization procedures
GLint myDrawMode;
mutable Standard_Boolean myIsVboInit;
+ Standard_Size myUID; //!< Unique ID of primitive array.
+
public:
DEFINE_STANDARD_ALLOC
public:
//! Creates new OpenGL element triangulation.
- OpenGl_TriangleSet (const OpenGl_PrimitiveArray* theArray = NULL)
+ OpenGl_TriangleSet (const Standard_Size theArrayID)
: BVH_Triangulation<Standard_ShortReal, 4>(),
- myArray (theArray)
+ myArrayID (theArrayID)
{
//
}
//
}
- //! Returns associated OpenGl structure.
- const OpenGl_PrimitiveArray* AssociatedPArray() const
+ //! Returns Id of associated primitive array.
+ const Standard_Size AssociatedPArrayID() const
{
- return myArray;
+ return myArrayID;
}
//! Returns material index of triangle set.
private:
- const OpenGl_PrimitiveArray* myArray; //!< Reference to associated OpenGl structure.
+ Standard_Size myArrayID; //!< Id of associated primitive array.
};
std::map<const OpenGl_Structure*, Standard_Size> myStructureStates;
//! PrimitiveArray to TriangleSet map for scene partial update.
- std::map<const OpenGl_PrimitiveArray*, OpenGl_TriangleSet*> myArrayToTrianglesMap;
+ std::map<Standard_Size, OpenGl_TriangleSet*> myArrayToTrianglesMap;
//! Cached locations of frequently used uniform variables.
Standard_Integer myUniformLocations[2][OpenGl_RT_NbVariables];
std::set<const OpenGl_Structure*> anElements;
// Set of all currently visible and "raytracable" primitive arrays.
- std::set<const OpenGl_PrimitiveArray*> anArrays;
+ std::set<Standard_Size> anArrayIDs;
const OpenGl_LayerList& aList = myView->LayerList();
if (aPrimArray != NULL)
{
// Collect all primitive arrays in scene.
- anArrays.insert (aPrimArray);
+ anArrayIDs.insert (aPrimArray->GetUID());
}
}
}
// If primitive array of object not in "anArrays" set then it was hided or deleted.
// If primitive array present in "anArrays" set but we don't have associated object yet, then
// the object is new and still has to be built.
- if ((aTriangleSet != NULL) && ((anArrays.find (aTriangleSet->AssociatedPArray())) != anArrays.end()))
+ if ((aTriangleSet != NULL) && ((anArrayIDs.find (aTriangleSet->AssociatedPArrayID())) != anArrayIDs.end()))
{
anUnchangedObjects.Append (myRaytraceGeometry.Objects().Value (anObjectIdx));
- myArrayToTrianglesMap[aTriangleSet->AssociatedPArray()] = aTriangleSet;
+ myArrayToTrianglesMap[aTriangleSet->AssociatedPArrayID()] = aTriangleSet;
}
}
{
OpenGl_PrimitiveArray* aPrimArray = dynamic_cast<OpenGl_PrimitiveArray*> (aNode->elem);
- std::map<const OpenGl_PrimitiveArray*, OpenGl_TriangleSet*>::iterator aSetIter = myArrayToTrianglesMap.find (aPrimArray);
-
if (aPrimArray != NULL)
{
+ std::map<Standard_Size, OpenGl_TriangleSet*>::iterator aSetIter = myArrayToTrianglesMap.find (aPrimArray->GetUID());
+
if (aSetIter != myArrayToTrianglesMap.end())
{
OpenGl_TriangleSet* aSet = aSetIter->second;
}
#endif
- OpenGl_TriangleSet* aSet = new OpenGl_TriangleSet (theArray);
+ OpenGl_TriangleSet* aSet = new OpenGl_TriangleSet (theArray->GetUID());
{
aSet->Vertices.reserve (anAttribs->NbElements);
aSet->Normals .reserve (anAttribs->NbElements);