PrimitiveSetIndirect 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734
  1. /* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2006 Robert Osfield
  2. *
  3. * This library is open source and may be redistributed and/or modified under
  4. * the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
  5. * (at your option) any later version. The full license is in LICENSE file
  6. * included with this distribution, and on the openscenegraph.org website.
  7. *
  8. * This library is distributed in the hope that it will be useful,
  9. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11. * OpenSceneGraph Public License for more details.
  12. *
  13. * osg/PrimitiveSetIndirect
  14. * Author: Julien Valentin 2016-2017
  15. */
  16. #ifndef OSG_INDIRECTPRIMITIVESET
  17. #define OSG_INDIRECTPRIMITIVESET 1
  18. #include <osg/PrimitiveSet>
  19. namespace osg {
  20. ///common interface for IndirectCommandDrawArrayss
  21. class OSG_EXPORT IndirectCommandDrawArrays: public BufferData
  22. {
  23. public:
  24. IndirectCommandDrawArrays() : BufferData() { setBufferObject(new DrawIndirectBufferObject()); }
  25. IndirectCommandDrawArrays(const IndirectCommandDrawArrays& copy,const CopyOp& copyop/*=CopyOp::SHALLOW_COPY*/) :
  26. BufferData(copy, copyop) {}
  27. virtual unsigned int getTotalDataSize() const { return getNumElements()*getElementSize(); }
  28. virtual unsigned int & count(const unsigned int&index)=0;
  29. virtual unsigned int & instanceCount(const unsigned int&index)=0;
  30. virtual unsigned int & first(const unsigned int&index)=0;
  31. virtual unsigned int & baseInstance(const unsigned int&index)=0;
  32. virtual unsigned int getElementSize() const = 0;
  33. virtual unsigned int getNumElements() const = 0;
  34. virtual void reserveElements(const unsigned int) = 0;
  35. virtual void resizeElements(const unsigned int) = 0;
  36. };
  37. class OSG_EXPORT IndirectCommandDrawElements: public BufferData
  38. {
  39. public:
  40. IndirectCommandDrawElements() : BufferData() { setBufferObject(new DrawIndirectBufferObject()); }
  41. IndirectCommandDrawElements(const IndirectCommandDrawElements& copy,const CopyOp& copyop/*=CopyOp::SHALLOW_COPY*/)
  42. : BufferData(copy, copyop) {}
  43. virtual unsigned int getTotalDataSize() const { return getNumElements()*getElementSize(); }
  44. virtual unsigned int & count(const unsigned int&index)=0;
  45. virtual unsigned int & instanceCount(const unsigned int&index)=0;
  46. virtual unsigned int & firstIndex(const unsigned int&index)=0;
  47. virtual unsigned int & baseVertex(const unsigned int&index)=0;
  48. virtual unsigned int & baseInstance(const unsigned int&index)=0;
  49. virtual unsigned int getElementSize()const = 0;
  50. virtual unsigned int getNumElements() const = 0;
  51. virtual void reserveElements(const unsigned int) = 0;
  52. virtual void resizeElements(const unsigned int) = 0;
  53. };
  54. /// DrawArraysCommand
  55. struct DrawArraysIndirectCommand
  56. {
  57. DrawArraysIndirectCommand(unsigned int pcount = 0, unsigned int pinstanceCount = 0, unsigned int pfirst = 0, unsigned int pbaseInstance = 0) :
  58. count(pcount), instanceCount(pinstanceCount), first(pfirst), baseInstance(pbaseInstance) {}
  59. unsigned int count;
  60. unsigned int instanceCount;
  61. unsigned int first;
  62. unsigned int baseInstance;
  63. };
  64. /// default implementation of IndirectCommandDrawArrays
  65. /// DefaultIndirectCommandDrawArrays to be hosted on GPU
  66. class DefaultIndirectCommandDrawArrays: public IndirectCommandDrawArrays, public MixinVector<DrawArraysIndirectCommand>
  67. {
  68. public:
  69. META_Object(osg,DefaultIndirectCommandDrawArrays)
  70. DefaultIndirectCommandDrawArrays() : IndirectCommandDrawArrays(), MixinVector<DrawArraysIndirectCommand>() {}
  71. DefaultIndirectCommandDrawArrays(const DefaultIndirectCommandDrawArrays& copy,const CopyOp& copyop/*=CopyOp::SHALLOW_COPY*/) :
  72. IndirectCommandDrawArrays(copy, copyop),MixinVector<DrawArraysIndirectCommand>() {}
  73. virtual const GLvoid* getDataPointer() const { return empty()?0:&front(); }
  74. virtual unsigned int getElementSize()const { return 16u; };
  75. virtual unsigned int getNumElements() const { return static_cast<unsigned int>(size()); }
  76. virtual void reserveElements(const unsigned int n) {reserve(n);}
  77. virtual void resizeElements(const unsigned int n) {resize(n);}
  78. virtual unsigned int & count(const unsigned int&index) { return at(index).count; }
  79. virtual unsigned int & instanceCount(const unsigned int&index) { return at(index).instanceCount; }
  80. virtual unsigned int & first(const unsigned int&index) { return at(index).first; }
  81. virtual unsigned int & baseInstance(const unsigned int&index) { return at(index).baseInstance; }
  82. };
  83. /// default implementation of IndirectCommandDrawElements
  84. /// DrawElementsCommand
  85. struct DrawElementsIndirectCommand
  86. {
  87. DrawElementsIndirectCommand(unsigned int pcount = 0, unsigned int pinstanceCount = 0, unsigned int pfirstIndex = 0, unsigned int pbaseVertex = 0, unsigned int pbaseInstance = 0) :
  88. count(pcount), instanceCount(pinstanceCount), firstIndex(pfirstIndex), baseVertex(pbaseVertex), baseInstance(pbaseInstance) {}
  89. unsigned int count;
  90. unsigned int instanceCount;
  91. unsigned int firstIndex;
  92. unsigned int baseVertex;
  93. unsigned int baseInstance;
  94. };
  95. /// vector of DrawElementsCommand to be hosted on GPU
  96. class DefaultIndirectCommandDrawElements: public IndirectCommandDrawElements, public MixinVector<DrawElementsIndirectCommand>
  97. {
  98. public:
  99. META_Object(osg,DefaultIndirectCommandDrawElements)
  100. DefaultIndirectCommandDrawElements() : IndirectCommandDrawElements(), MixinVector<DrawElementsIndirectCommand>() {}
  101. DefaultIndirectCommandDrawElements(const DefaultIndirectCommandDrawElements& copy,const CopyOp& copyop/*=CopyOp::SHALLOW_COPY*/) :
  102. IndirectCommandDrawElements(copy, copyop), MixinVector<DrawElementsIndirectCommand>() {}
  103. virtual const GLvoid* getDataPointer() const { return empty()?0:&front(); }
  104. virtual unsigned int getNumElements() const { return static_cast<unsigned int>(size()); }
  105. virtual unsigned int getElementSize()const { return 20u; };
  106. virtual void reserveElements(const unsigned int n) {reserve(n);}
  107. virtual void resizeElements(const unsigned int n) {resize(n);}
  108. virtual unsigned int & count(const unsigned int&index) { return at(index).count; }
  109. virtual unsigned int & instanceCount(const unsigned int&index) { return at(index).instanceCount; }
  110. virtual unsigned int & firstIndex(const unsigned int&index) { return at(index).firstIndex; }
  111. virtual unsigned int & baseVertex(const unsigned int&index) { return at(index).baseVertex; }
  112. virtual unsigned int & baseInstance(const unsigned int&index) { return at(index).baseInstance; }
  113. };
  114. ///////////////////////////////////////////////////////////////////////////////////////
  115. /// \brief The DrawElementsIndirect base PrimitiveSet
  116. ///
  117. class OSG_EXPORT DrawElementsIndirect : public DrawElements
  118. {
  119. public:
  120. DrawElementsIndirect(Type primType=PrimitiveType, GLenum mode = 0,unsigned int firstCommand = 0, GLsizei stride = 0) :
  121. DrawElements(primType,mode, 0),_firstCommand(firstCommand),_stride(stride) { setIndirectCommandArray(new DefaultIndirectCommandDrawElements()); }
  122. DrawElementsIndirect(const DrawElementsIndirect& rhs,const CopyOp& copyop=CopyOp::SHALLOW_COPY) :
  123. DrawElements(rhs,copyop),_firstCommand(rhs._firstCommand), _stride(rhs._stride) { _indirectCommandArray=(DefaultIndirectCommandDrawElements*)copyop(rhs._indirectCommandArray.get()); }
  124. /// set command array of this indirect primitive set
  125. inline void setIndirectCommandArray(IndirectCommandDrawElements*idc)
  126. {
  127. _indirectCommandArray = idc;
  128. //ensure bo of idc is of the correct type
  129. if(!dynamic_cast<DrawIndirectBufferObject* >(_indirectCommandArray->getBufferObject()))
  130. _indirectCommandArray->setBufferObject(new DrawIndirectBufferObject());
  131. }
  132. /// get command array of this indirect primitive set
  133. inline IndirectCommandDrawElements* getIndirectCommandArray() { return _indirectCommandArray.get(); }
  134. inline const IndirectCommandDrawElements* getIndirectCommandArray() const { return _indirectCommandArray.get(); }
  135. ///Further methods are for advanced DI when you plan to use your own IndirectCommandElement (stride)
  136. ///or if you want to draw a particular command index of the IndirectCommandElement(FirstCommandToDraw)
  137. /// set offset of the first command to draw in the IndirectCommandDrawArrays
  138. inline void setFirstCommandToDraw( unsigned int i) { _firstCommand = i; }
  139. /// get offset of the first command in the IndirectCommandDrawArrays
  140. inline unsigned int getFirstCommandToDraw() const { return _firstCommand; }
  141. /// stride (to set if you use custom CommandArray)
  142. inline void setStride( GLsizei i) { _stride=i; }
  143. /// stride (to set if you use custom CommandArray)
  144. inline GLsizei getStride() const { return _stride; }
  145. virtual unsigned int getNumPrimitives() const=0;
  146. protected:
  147. virtual ~DrawElementsIndirect() {}
  148. unsigned int _firstCommand;
  149. GLsizei _stride;
  150. ref_ptr<IndirectCommandDrawElements> _indirectCommandArray;
  151. };
  152. ///////////////////////////////////////////////////////////////////////////////////////
  153. /// \brief The DrawElementsIndirectUByte PrimitiveSet
  154. ///
  155. class OSG_EXPORT DrawElementsIndirectUByte : public DrawElementsIndirect, public VectorGLubyte
  156. {
  157. public:
  158. typedef VectorGLubyte vector_type;
  159. DrawElementsIndirectUByte(GLenum mode = 0/*,unsigned int firstCommand = 0, GLsizei stride = 0*/) :
  160. DrawElementsIndirect(DrawElementsUByteIndirectPrimitiveType,mode) {}
  161. DrawElementsIndirectUByte(const DrawElementsIndirectUByte& array, const CopyOp& copyop=CopyOp::SHALLOW_COPY) :
  162. DrawElementsIndirect(array,copyop),
  163. vector_type(array) {}
  164. /**
  165. * \param mode One of osg::PrimitiveSet::Mode. Determines the type of primitives used.
  166. * \param no Number of intended elements. This will be the size of the underlying vector.
  167. * \param ptr Pointer to a GLubyte to copy index data from.
  168. */
  169. DrawElementsIndirectUByte(GLenum mode, unsigned int no, const GLubyte* ptr) :
  170. DrawElementsIndirect(DrawElementsUByteIndirectPrimitiveType,mode),
  171. vector_type(ptr,ptr+no) {}
  172. /**
  173. * \param mode One of osg::PrimitiveSet::Mode. Determines the type of primitives used.
  174. * \param no Number of intended elements. This will be the size of the underlying vector.
  175. */
  176. DrawElementsIndirectUByte(GLenum mode, unsigned int no) :
  177. DrawElementsIndirect(DrawElementsUByteIndirectPrimitiveType,mode),
  178. vector_type(no) {}
  179. virtual Object* cloneType() const { return new DrawElementsIndirectUByte(); }
  180. virtual Object* clone(const CopyOp& copyop) const { return new DrawElementsIndirectUByte(*this,copyop); }
  181. virtual bool isSameKindAs(const Object* obj) const { return dynamic_cast<const DrawElementsIndirectUByte*>(obj)!=NULL; }
  182. virtual const char* libraryName() const { return "osg"; }
  183. virtual const char* className() const { return "DrawElementsIndirectUByte"; }
  184. virtual const GLvoid* getDataPointer() const { return empty()?0:&front(); }
  185. virtual unsigned int getTotalDataSize() const { return static_cast<unsigned int>(size()); }
  186. virtual bool supportsBufferObject() const { return false; }
  187. virtual void draw(State& state, bool useVertexBufferObjects) const;
  188. virtual void accept(PrimitiveFunctor& functor) const;
  189. virtual void accept(PrimitiveIndexFunctor& functor) const;
  190. virtual unsigned int getNumIndices() const { return static_cast<unsigned int>(size()); }
  191. virtual unsigned int index(unsigned int pos) const { return (*this)[pos]; }
  192. virtual void offsetIndices(int offset);
  193. virtual GLenum getDataType() { return GL_UNSIGNED_BYTE; }
  194. virtual void resizeElements(unsigned int numIndices) { resize(numIndices); }
  195. virtual void reserveElements(unsigned int numIndices) { reserve(numIndices); }
  196. virtual void setElement(unsigned int i, unsigned int v) { (*this)[i] = v; }
  197. virtual unsigned int getElement(unsigned int i) { return (*this)[i]; }
  198. virtual void addElement(unsigned int v) { push_back(GLubyte(v)); }
  199. virtual unsigned int getNumPrimitives() const;
  200. protected:
  201. virtual ~DrawElementsIndirectUByte();
  202. };
  203. ///////////////////////////////////////////////////////////////////////////////////////
  204. /// \brief The DrawElementsIndirectUShort PrimitiveSet
  205. ///
  206. class OSG_EXPORT DrawElementsIndirectUShort : public DrawElementsIndirect, public VectorGLushort
  207. {
  208. public:
  209. typedef VectorGLushort vector_type;
  210. DrawElementsIndirectUShort(GLenum mode = 0/*,unsigned int firstCommand = 0, GLsizei stride = 0*/) :
  211. DrawElementsIndirect(DrawElementsUShortIndirectPrimitiveType,mode) {}
  212. DrawElementsIndirectUShort(const DrawElementsIndirectUShort& array,const CopyOp& copyop=CopyOp::SHALLOW_COPY) :
  213. DrawElementsIndirect(array,copyop),
  214. vector_type(array) {}
  215. /**
  216. * \param mode One of osg::PrimitiveSet::Mode. Determines the type of primitives used.
  217. * \param no Number of intended elements. This will be the size of the underlying vector.
  218. * \param ptr Pointer to a GLushort to copy index data from.
  219. */
  220. DrawElementsIndirectUShort(GLenum mode, unsigned int no, const GLushort* ptr) :
  221. DrawElementsIndirect(DrawElementsUShortIndirectPrimitiveType,mode),
  222. vector_type(ptr,ptr+no) {}
  223. /**
  224. * \param mode One of osg::PrimitiveSet::Mode. Determines the type of primitives used.
  225. * \param no Number of intended elements. This will be the size of the underlying vector.
  226. */
  227. DrawElementsIndirectUShort(GLenum mode, unsigned int no) :
  228. DrawElementsIndirect(DrawElementsUShortIndirectPrimitiveType,mode),
  229. vector_type(no) {}
  230. template <class InputIterator>
  231. DrawElementsIndirectUShort(GLenum mode, InputIterator first,InputIterator last) :
  232. DrawElementsIndirect(DrawElementsUShortIndirectPrimitiveType,mode),
  233. vector_type(first,last) {}
  234. virtual Object* cloneType() const { return new DrawElementsIndirectUShort(); }
  235. virtual Object* clone(const CopyOp& copyop) const { return new DrawElementsIndirectUShort(*this,copyop); }
  236. virtual bool isSameKindAs(const Object* obj) const { return dynamic_cast<const DrawElementsIndirectUShort*>(obj)!=NULL; }
  237. virtual const char* libraryName() const { return "osg"; }
  238. virtual const char* className() const { return "DrawElementsIndirectUShort"; }
  239. virtual const GLvoid* getDataPointer() const { return empty()?0:&front(); }
  240. virtual unsigned int getTotalDataSize() const { return 2u*static_cast<unsigned int>(size()); }
  241. virtual bool supportsBufferObject() const { return false; }
  242. virtual void draw(State& state, bool useVertexBufferObjects) const;
  243. virtual void accept(PrimitiveFunctor& functor) const;
  244. virtual void accept(PrimitiveIndexFunctor& functor) const;
  245. virtual unsigned int getNumIndices() const { return static_cast<unsigned int>(size()); }
  246. virtual unsigned int index(unsigned int pos) const { return (*this)[pos]; }
  247. virtual void offsetIndices(int offset);
  248. virtual GLenum getDataType() { return GL_UNSIGNED_SHORT; }
  249. virtual void resizeElements(unsigned int numIndices) { resize(numIndices); }
  250. virtual void reserveElements(unsigned int numIndices) { reserve(numIndices); }
  251. virtual void setElement(unsigned int i, unsigned int v) { (*this)[i] = v; }
  252. virtual unsigned int getElement(unsigned int i) { return (*this)[i]; }
  253. virtual void addElement(unsigned int v) { push_back(GLushort(v)); }
  254. virtual unsigned int getNumPrimitives() const;
  255. protected:
  256. virtual ~DrawElementsIndirectUShort();
  257. };
  258. ///////////////////////////////////////////////////////////////////////////////////////
  259. /// \brief The DrawElementsIndirectUInt PrimitiveSet
  260. ///
  261. class OSG_EXPORT DrawElementsIndirectUInt : public DrawElementsIndirect, public VectorGLuint
  262. {
  263. public:
  264. typedef VectorGLuint vector_type;
  265. DrawElementsIndirectUInt(GLenum mode = 0/*,unsigned int firstCommand = 0, GLsizei stride = 0*/) :
  266. DrawElementsIndirect(DrawElementsUIntIndirectPrimitiveType,mode) {}
  267. DrawElementsIndirectUInt(const DrawElementsIndirectUInt& array,const CopyOp& copyop=CopyOp::SHALLOW_COPY) :
  268. DrawElementsIndirect(array,copyop),
  269. vector_type(array) {}
  270. /**
  271. * \param mode One of osg::PrimitiveSet::Mode. Determines the type of primitives used.
  272. * \param no Number of intended elements. This will be the size of the underlying vector.
  273. * \param ptr Pointer to a GLunsigned int to copy index data from.
  274. */
  275. DrawElementsIndirectUInt(GLenum mode, unsigned int no, const GLuint* ptr) :
  276. DrawElementsIndirect(DrawElementsUIntIndirectPrimitiveType,mode),
  277. vector_type(ptr,ptr+no) {}
  278. /**
  279. * \param mode One of osg::PrimitiveSet::Mode. Determines the type of primitives used.
  280. * \param no Number of intended elements. This will be the size of the underlying vector.
  281. */
  282. DrawElementsIndirectUInt(GLenum mode, unsigned int no) :
  283. DrawElementsIndirect(DrawElementsUIntIndirectPrimitiveType,mode),
  284. vector_type(no) {}
  285. template <class InputIterator>
  286. DrawElementsIndirectUInt(GLenum mode, InputIterator first,InputIterator last) :
  287. DrawElementsIndirect(DrawElementsUIntIndirectPrimitiveType,mode),
  288. vector_type(first,last) {}
  289. virtual Object* cloneType() const { return new DrawElementsIndirectUInt(); }
  290. virtual Object* clone(const CopyOp& copyop) const { return new DrawElementsIndirectUInt(*this,copyop); }
  291. virtual bool isSameKindAs(const Object* obj) const { return dynamic_cast<const DrawElementsIndirectUInt*>(obj)!=NULL; }
  292. virtual const char* libraryName() const { return "osg"; }
  293. virtual const char* className() const { return "DrawElementsIndirectUInt"; }
  294. virtual const GLvoid* getDataPointer() const { return empty()?0:&front(); }
  295. virtual unsigned int getTotalDataSize() const { return 4u*static_cast<unsigned int>(size()); }
  296. virtual bool supportsBufferObject() const { return false; }
  297. virtual void draw(State& state, bool useVertexBufferObjects) const;
  298. virtual void accept(PrimitiveFunctor& functor) const;
  299. virtual void accept(PrimitiveIndexFunctor& functor) const;
  300. virtual unsigned int getNumIndices() const { return static_cast<unsigned int>(size()); }
  301. virtual unsigned int index(unsigned int pos) const { return (*this)[pos]; }
  302. virtual void offsetIndices(int offset);
  303. virtual GLenum getDataType() { return GL_UNSIGNED_INT; }
  304. virtual void resizeElements(unsigned int numIndices) { resize(numIndices); }
  305. virtual void reserveElements(unsigned int numIndices) { reserve(numIndices); }
  306. virtual void setElement(unsigned int i, unsigned int v) { (*this)[i] = v; }
  307. virtual unsigned int getElement(unsigned int i) { return (*this)[i]; }
  308. virtual void addElement(unsigned int v) { push_back(GLuint(v)); }
  309. virtual unsigned int getNumPrimitives() const;
  310. protected:
  311. virtual ~DrawElementsIndirectUInt();
  312. };
  313. ///////////////////////////////////////////////////////////////////////////////////////
  314. /// \brief The MultiDrawElementsIndirect PrimitiveSets
  315. ///
  316. class OSG_EXPORT MultiDrawElementsIndirectUShort : public DrawElementsIndirectUShort
  317. {
  318. public:
  319. MultiDrawElementsIndirectUShort(GLenum mode = 0/*,unsigned int firstCommand = 0, GLsizei stride = 0*/) :
  320. DrawElementsIndirectUShort(mode),
  321. _count(0)
  322. {
  323. _primitiveType=(Type(MultiDrawElementsUShortIndirectPrimitiveType));
  324. }
  325. MultiDrawElementsIndirectUShort(const MultiDrawElementsIndirectUShort& mdi,const CopyOp& copyop=CopyOp::SHALLOW_COPY) :
  326. DrawElementsIndirectUShort(mdi,copyop),
  327. _count(mdi._count)
  328. {
  329. }
  330. /**
  331. * \param mode One of osg::PrimitiveSet::Mode. Determines the type of primitives used.
  332. * \param no Number of intended elements. This will be the size of the underlying vector.
  333. * \param ptr Pointer to a GLunsigned int to copy index data from.
  334. */
  335. MultiDrawElementsIndirectUShort(GLenum mode, unsigned int no, const GLushort* ptr) :
  336. DrawElementsIndirectUShort(mode,no,ptr),
  337. _count(0)
  338. {
  339. _primitiveType=(Type(MultiDrawElementsUShortIndirectPrimitiveType));
  340. }
  341. /**
  342. * \param mode One of osg::PrimitiveSet::Mode. Determines the type of primitives used.
  343. * \param no Number of intended elements. This will be the size of the underlying vector.
  344. */
  345. MultiDrawElementsIndirectUShort(GLenum mode, unsigned int no) :
  346. DrawElementsIndirectUShort(mode,no),
  347. _count(0)
  348. {
  349. _primitiveType=(Type(MultiDrawElementsUShortIndirectPrimitiveType));
  350. }
  351. template <class InputIterator>
  352. MultiDrawElementsIndirectUShort(GLenum mode, InputIterator first,InputIterator last) :
  353. DrawElementsIndirectUShort(mode,first,last),
  354. _count(0)
  355. {
  356. _primitiveType=(Type(MultiDrawElementsUShortIndirectPrimitiveType));
  357. }
  358. virtual osg::Object* cloneType() const { return new MultiDrawElementsIndirectUShort(); }
  359. virtual osg::Object* clone(const osg::CopyOp& copyop) const { return new MultiDrawElementsIndirectUShort(*this,copyop); }
  360. virtual bool isSameKindAs(const osg::Object* obj) const { return dynamic_cast<const MultiDrawElementsIndirectUShort*>(obj)!=NULL; }
  361. virtual const char* className() const { return "MultiDrawElementsIndirectUShort"; }
  362. virtual void draw(State& state, bool useVertexBufferObjects) const;
  363. virtual void accept(PrimitiveFunctor& functor) const;
  364. virtual void accept(PrimitiveIndexFunctor& functor) const;
  365. virtual unsigned int getNumPrimitives() const;
  366. ///if you want to draw a subset of the IndirectCommandElement(FirstCommandToDraw,NumCommandsToDraw)
  367. /// count of Indirect Command to execute
  368. inline void setNumCommandsToDraw( unsigned int i) { _count=i; }
  369. /// count of Indirect Command to execute
  370. inline unsigned int getNumCommandsToDraw()const { return _count; }
  371. protected:
  372. unsigned int _count;
  373. virtual ~MultiDrawElementsIndirectUShort();
  374. };
  375. class OSG_EXPORT MultiDrawElementsIndirectUByte : public DrawElementsIndirectUByte
  376. {
  377. public:
  378. MultiDrawElementsIndirectUByte(GLenum mode = 0) :
  379. DrawElementsIndirectUByte(mode),
  380. _count(0)
  381. {
  382. _primitiveType=(Type(MultiDrawElementsUByteIndirectPrimitiveType));
  383. }
  384. MultiDrawElementsIndirectUByte(const MultiDrawElementsIndirectUByte& mdi,const CopyOp& copyop=CopyOp::SHALLOW_COPY) :
  385. DrawElementsIndirectUByte(mdi,copyop),
  386. _count(mdi._count)
  387. {
  388. }
  389. /**
  390. * \param mode One of osg::PrimitiveSet::Mode. Determines the type of primitives used.
  391. * \param no Number of intended elements. This will be the size of the underlying vector.
  392. * \param ptr Pointer to a GLunsigned int to copy index data from.
  393. */
  394. MultiDrawElementsIndirectUByte(GLenum mode, unsigned int no, const GLubyte* ptr) :
  395. DrawElementsIndirectUByte(mode,no,ptr),
  396. _count(0)
  397. {
  398. _primitiveType=(Type(MultiDrawElementsUByteIndirectPrimitiveType));
  399. }
  400. /**
  401. * \param mode One of osg::PrimitiveSet::Mode. Determines the type of primitives used.
  402. * \param no Number of intended elements. This will be the size of the underlying vector.
  403. */
  404. MultiDrawElementsIndirectUByte(GLenum mode, unsigned int no) :
  405. DrawElementsIndirectUByte(mode,no),
  406. _count(0)
  407. {
  408. _primitiveType=(Type(MultiDrawElementsUByteIndirectPrimitiveType));
  409. }
  410. template <class InputIterator>
  411. MultiDrawElementsIndirectUByte(GLenum mode, InputIterator first,InputIterator last) :
  412. DrawElementsIndirectUByte(mode,first,last),
  413. _count(0)
  414. {
  415. _primitiveType=(Type(MultiDrawElementsUByteIndirectPrimitiveType));
  416. }
  417. virtual osg::Object* cloneType() const { return new MultiDrawElementsIndirectUByte(); }
  418. virtual osg::Object* clone(const osg::CopyOp& copyop) const { return new MultiDrawElementsIndirectUByte(*this,copyop); }
  419. virtual bool isSameKindAs(const osg::Object* obj) const { return dynamic_cast<const MultiDrawElementsIndirectUByte*>(obj)!=NULL; }
  420. virtual const char* className() const { return "MultiDrawElementsIndirectUByte"; }
  421. virtual void draw(State& state, bool useVertexBufferObjects) const;
  422. virtual void accept(PrimitiveFunctor& functor) const;
  423. virtual void accept(PrimitiveIndexFunctor& functor) const;
  424. virtual unsigned int getNumPrimitives() const;
  425. /// count of Indirect Command to execute
  426. inline void setNumCommandsToDraw( unsigned int i) { _count=i; }
  427. /// count of Indirect Command to execute
  428. inline unsigned int getNumCommandsToDraw()const { return _count; }
  429. protected:
  430. unsigned int _count;
  431. virtual ~MultiDrawElementsIndirectUByte();
  432. };
  433. class OSG_EXPORT MultiDrawElementsIndirectUInt : public DrawElementsIndirectUInt
  434. {
  435. public:
  436. MultiDrawElementsIndirectUInt(GLenum mode = 0) :
  437. DrawElementsIndirectUInt(mode),
  438. _count(0)
  439. {
  440. _primitiveType=(Type(MultiDrawElementsUIntIndirectPrimitiveType));
  441. }
  442. MultiDrawElementsIndirectUInt(const MultiDrawElementsIndirectUInt& mdi,const CopyOp& copyop=CopyOp::SHALLOW_COPY) :
  443. DrawElementsIndirectUInt(mdi,copyop),
  444. _count(mdi._count)
  445. {}
  446. /**
  447. * \param mode One of osg::PrimitiveSet::Mode. Determines the type of primitives used.
  448. * \param no Number of intended elements. This will be the size of the underlying vector.
  449. * \param ptr Pointer to a GLunsigned int to copy index data from.
  450. */
  451. MultiDrawElementsIndirectUInt(GLenum mode, unsigned int no, const GLuint* ptr) :
  452. DrawElementsIndirectUInt(mode,no,ptr),
  453. _count(0)
  454. {
  455. _primitiveType=(Type(MultiDrawElementsUIntIndirectPrimitiveType));
  456. }
  457. /**
  458. * \param mode One of osg::PrimitiveSet::Mode. Determines the type of primitives used.
  459. * \param no Number of intended elements. This will be the size of the underlying vector.
  460. */
  461. MultiDrawElementsIndirectUInt(GLenum mode, unsigned int no) :
  462. DrawElementsIndirectUInt(mode,no),
  463. _count(0)
  464. {
  465. _primitiveType=(Type(MultiDrawElementsUIntIndirectPrimitiveType));
  466. }
  467. template <class InputIterator>
  468. MultiDrawElementsIndirectUInt(GLenum mode, InputIterator first,InputIterator last) :
  469. DrawElementsIndirectUInt(mode,first,last),
  470. _count(0)
  471. {
  472. _primitiveType=(Type(MultiDrawElementsUIntIndirectPrimitiveType));
  473. }
  474. virtual osg::Object* cloneType() const { return new MultiDrawElementsIndirectUInt(); }
  475. virtual osg::Object* clone(const osg::CopyOp& copyop) const { return new MultiDrawElementsIndirectUInt(*this,copyop); }
  476. virtual bool isSameKindAs(const osg::Object* obj) const { return dynamic_cast<const MultiDrawElementsIndirectUInt*>(obj)!=NULL; }
  477. virtual const char* className() const { return "MultiDrawElementsIndirectUInt"; }
  478. virtual void draw(State& state, bool useVertexBufferObjects) const;
  479. virtual void accept(PrimitiveFunctor& functor) const;
  480. virtual void accept(PrimitiveIndexFunctor& functor) const;
  481. virtual unsigned int getNumPrimitives() const;
  482. /// count of Indirect Command to execute
  483. inline void setNumCommandsToDraw( unsigned int i) { _count=i; }
  484. /// count of Indirect Command to execute
  485. inline unsigned int getNumCommandsToDraw()const { return _count; }
  486. protected:
  487. unsigned int _count;
  488. virtual ~MultiDrawElementsIndirectUInt();
  489. };
  490. ///////////////////////////////////////////////////////////////////////////////////////
  491. /// \brief The MultiDrawArraysIndirect PrimitiveSet
  492. ///
  493. class OSG_EXPORT DrawArraysIndirect : public osg::PrimitiveSet
  494. {
  495. public:
  496. DrawArraysIndirect(GLenum mode=0, unsigned int firstcommand = 0, GLsizei stride = 0) :
  497. osg::PrimitiveSet(Type(DrawArraysIndirectPrimitiveType), mode),
  498. _firstCommand(firstcommand),
  499. _stride(stride)
  500. {
  501. setIndirectCommandArray(new DefaultIndirectCommandDrawArrays);
  502. }
  503. DrawArraysIndirect(const DrawArraysIndirect& dal,const CopyOp& copyop=CopyOp::SHALLOW_COPY) :
  504. osg::PrimitiveSet(dal,copyop),
  505. _firstCommand(dal._firstCommand),
  506. _stride(dal._stride),
  507. _indirectCommandArray((DefaultIndirectCommandDrawArrays*)copyop( dal._indirectCommandArray.get()))
  508. {
  509. }
  510. virtual osg::Object* cloneType() const { return new DrawArraysIndirect(); }
  511. virtual osg::Object* clone(const osg::CopyOp& copyop) const { return new DrawArraysIndirect(*this,copyop); }
  512. virtual bool isSameKindAs(const osg::Object* obj) const { return dynamic_cast<const DrawArraysIndirect*>(obj)!=NULL; }
  513. virtual const char* libraryName() const { return "osg"; }
  514. virtual const char* className() const { return "DrawArraysIndirect"; }
  515. virtual void draw(State& state, bool useVertexBufferObjects) const;
  516. virtual void accept(PrimitiveFunctor& functor) const;
  517. virtual void accept(PrimitiveIndexFunctor& functor) const;
  518. virtual unsigned int getNumIndices() const;
  519. virtual unsigned int index(unsigned int pos) const;
  520. virtual void offsetIndices(int offset);
  521. virtual unsigned int getNumPrimitives() const;
  522. /// stride (to set if you use custom CommandArray)
  523. inline void setStride( GLsizei i) { _stride=i; }
  524. /// stride (to set if you use custom CommandArray)
  525. inline GLsizei getStride()const { return _stride; }
  526. /// set offset of the first command in the IndirectCommandDrawArrays
  527. inline void setFirstCommandToDraw( unsigned int i) { _firstCommand=i; }
  528. /// get offset of the first command in the IndirectCommandDrawArrays
  529. inline unsigned int getFirstCommandToDraw() const { return _firstCommand; }
  530. inline void setIndirectCommandArray(IndirectCommandDrawArrays*idc)
  531. {
  532. _indirectCommandArray = idc;
  533. //ensure bo of idc is of the correct type
  534. if(!dynamic_cast<DrawIndirectBufferObject* >(_indirectCommandArray->getBufferObject()))
  535. _indirectCommandArray->setBufferObject(new DrawIndirectBufferObject());
  536. }
  537. inline const IndirectCommandDrawArrays* getIndirectCommandArray() const { return _indirectCommandArray.get(); }
  538. inline IndirectCommandDrawArrays* getIndirectCommandArray() { return _indirectCommandArray.get(); }
  539. protected:
  540. unsigned int _firstCommand;
  541. GLsizei _stride;
  542. ref_ptr<IndirectCommandDrawArrays> _indirectCommandArray;
  543. };
  544. ///////////////////////////////////////////////////////////////////////////////////////
  545. /// \brief The MultiDrawArraysIndirect PrimitiveSet
  546. ///
  547. class OSG_EXPORT MultiDrawArraysIndirect : public DrawArraysIndirect
  548. {
  549. public:
  550. MultiDrawArraysIndirect(GLenum mode=0, unsigned int firstcommand = 0, unsigned int count = 0, GLsizei stride = 0) :
  551. osg::DrawArraysIndirect(mode, firstcommand, stride),
  552. _count(count)
  553. {
  554. _primitiveType=Type(MultiDrawArraysIndirectPrimitiveType);
  555. }
  556. MultiDrawArraysIndirect(const MultiDrawArraysIndirect& dal,const CopyOp& copyop=CopyOp::SHALLOW_COPY) :
  557. osg::DrawArraysIndirect(dal,copyop),
  558. _count(dal._count)
  559. {}
  560. virtual osg::Object* cloneType() const { return new MultiDrawArraysIndirect(); }
  561. virtual osg::Object* clone(const osg::CopyOp& copyop) const { return new MultiDrawArraysIndirect(*this,copyop); }
  562. virtual bool isSameKindAs(const osg::Object* obj) const { return dynamic_cast<const MultiDrawArraysIndirect*>(obj)!=NULL; }
  563. virtual const char* className() const { return "MultiDrawArraysIndirect"; }
  564. virtual void draw(State& state, bool useVertexBufferObjects) const;
  565. virtual void accept(PrimitiveFunctor& functor) const;
  566. virtual void accept(PrimitiveIndexFunctor& functor) const;
  567. virtual unsigned int getNumIndices() const;
  568. virtual unsigned int index(unsigned int pos) const;
  569. virtual void offsetIndices(int offset);
  570. virtual unsigned int getNumPrimitives() const;
  571. /// count of Indirect Command to execute
  572. inline void setNumCommandsToDraw( unsigned int i) { _count=i; }
  573. /// count of Indirect Command to execute
  574. inline unsigned int getNumCommandsToDraw()const { return _count; }
  575. protected:
  576. unsigned int _count;
  577. };
  578. }
  579. #endif