1 // Created by: Kirill GAVRILOV
2 // Copyright (c) 2013-2014 OPEN CASCADE SAS
4 // This file is part of Open CASCADE Technology software library.
6 // This library is free software; you can redistribute it and/or modify it under
7 // the terms of the GNU Lesser General Public License version 2.1 as published
8 // by the Free Software Foundation, with special exception defined in the file
9 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
10 // distribution for complete text of the license and disclaimer of any warranty.
12 // Alternatively, this file may be used under the terms of Open CASCADE
13 // commercial license or contractual agreement.
15 #include <OpenGl_VertexBufferCompat.hxx>
17 #include <NCollection_AlignedAllocator.hxx>
20 IMPLEMENT_STANDARD_RTTIEXT(OpenGl_VertexBufferCompat,OpenGl_VertexBuffer)
22 // =======================================================================
23 // function : OpenGl_VertexBufferCompat
25 // =======================================================================
26 OpenGl_VertexBufferCompat::OpenGl_VertexBufferCompat()
31 // =======================================================================
32 // function : ~OpenGl_VertexBufferCompat
34 // =======================================================================
35 OpenGl_VertexBufferCompat::~OpenGl_VertexBufferCompat()
40 // =======================================================================
43 // =======================================================================
44 bool OpenGl_VertexBufferCompat::Create (const Handle(OpenGl_Context)& )
46 if (myBufferId == NO_BUFFER)
48 myBufferId = (GLuint )-1; // dummy identifier...
49 Handle(NCollection_AlignedAllocator) anAlloc = new NCollection_AlignedAllocator (16);
50 myData = new NCollection_Buffer (anAlloc);
52 return myBufferId != NO_BUFFER;
55 // =======================================================================
58 // =======================================================================
59 void OpenGl_VertexBufferCompat::Release (OpenGl_Context* )
61 if (myBufferId == NO_BUFFER)
67 myBufferId = NO_BUFFER;
71 // =======================================================================
74 // =======================================================================
75 void OpenGl_VertexBufferCompat::Bind (const Handle(OpenGl_Context)& ) const
80 // =======================================================================
83 // =======================================================================
84 void OpenGl_VertexBufferCompat::Unbind (const Handle(OpenGl_Context)& ) const
89 // =======================================================================
90 // function : initLink
92 // =======================================================================
93 bool OpenGl_VertexBufferCompat::initLink (const Handle(NCollection_Buffer)& theData,
94 const GLuint theComponentsNb,
95 const GLsizei theElemsNb,
96 const GLenum theDataType)
104 if (myBufferId == NO_BUFFER)
106 myBufferId = (GLuint )-1; // dummy identifier...
109 myDataType = theDataType;
110 myComponentsNb = theComponentsNb;
111 myElemsNb = theElemsNb;
112 myOffset = myData->ChangeData();
116 // =======================================================================
119 // =======================================================================
120 bool OpenGl_VertexBufferCompat::init (const Handle(OpenGl_Context)& theCtx,
121 const GLuint theComponentsNb,
122 const GLsizei theElemsNb,
124 const GLenum theDataType,
125 const GLsizei theStride)
127 if (!Create (theCtx))
133 myDataType = theDataType;
134 myComponentsNb = theComponentsNb;
135 myElemsNb = theElemsNb;
137 const size_t aNbBytes = size_t(myElemsNb) * theStride;
138 if (!myData->Allocate (aNbBytes))
144 myOffset = myData->ChangeData();
147 memcpy (myData->ChangeData(), theData, aNbBytes);
152 // =======================================================================
153 // function : subData
155 // =======================================================================
156 bool OpenGl_VertexBufferCompat::subData (const Handle(OpenGl_Context)& ,
157 const GLsizei theElemFrom,
158 const GLsizei theElemsNb,
160 const GLenum theDataType)
162 if (!IsValid() || myDataType != theDataType ||
163 theElemFrom < 0 || ((theElemFrom + theElemsNb) > myElemsNb))
167 else if (theData == NULL)
172 const size_t aDataSize = sizeOfGlType (theDataType);
173 const size_t anOffset = size_t(theElemFrom) * size_t(myComponentsNb) * aDataSize;
174 const size_t aNbBytes = size_t(theElemsNb) * size_t(myComponentsNb) * aDataSize;
175 memcpy (myData->ChangeData() + anOffset, theData, aNbBytes);
179 // =======================================================================
180 // function : getSubData
182 // =======================================================================
183 bool OpenGl_VertexBufferCompat::getSubData (const Handle(OpenGl_Context)& ,
184 const GLsizei theElemFrom,
185 const GLsizei theElemsNb,
187 const GLenum theDataType)
189 if (!IsValid() || myDataType != theDataType
190 || theElemFrom < 0 || ((theElemFrom + theElemsNb) > myElemsNb)
196 const size_t aDataSize = sizeOfGlType (theDataType);
197 const size_t anOffset = size_t(theElemFrom) * size_t(myComponentsNb) * aDataSize;
198 const size_t aNbBytes = size_t(theElemsNb) * size_t(myComponentsNb) * aDataSize;
199 memcpy (theData, myData->Data() + anOffset, aNbBytes);