/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2014 Robert Osfield * Copyright (C) 2012 David Callu * std::vector specialization : Pawel Ksiezopolski * * This library is open source and may be redistributed and/or modified under * the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or * (at your option) any later version. The full license is in LICENSE file * included with this distribution, and on the openscenegraph.org website. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * OpenSceneGraph Public License for more details. */ #ifndef OSG_BUFFERTEMPLATE #define OSG_BUFFERTEMPLATE 1 #include #include namespace osg { /** Template buffer class to be used with a struct as template parameter. * This class is usefull to send C++ structures on the GPU (e.g. for uniform blocks) but be carefull to the alignments rules on the GPU side ! */ template class BufferTemplate : public BufferData { public: BufferTemplate(): BufferData(), _data(T()) {} /** Copy constructor using CopyOp to manage deep vs shallow copy.*/ BufferTemplate(const BufferTemplate& bt,const CopyOp& copyop=CopyOp::SHALLOW_COPY): osg::BufferData(bt,copyop), _data(bt._data) {} virtual bool isSameKindAs(const Object* obj) const { return dynamic_cast*>(obj)!=NULL; } virtual const char* libraryName() const { return "osg"; } virtual const char* className() const { return "BufferTemplate"; } virtual Object* cloneType() const { return new BufferTemplate(); } virtual Object* clone(const CopyOp& copyop) const { return new BufferTemplate(*this,copyop); } virtual const GLvoid* getDataPointer() const { return &_data; } virtual unsigned int getTotalDataSize() const { return sizeof(T); } const T& getData() const { return _data; } T& getData() { return _data; } void setData(const T& data) { _data = data; dirty(); } protected: virtual ~BufferTemplate() {}; private: T _data; }; /** BufferTemplate specialization for std::vector */ template class BufferTemplate< std::vector > : public BufferData { public: BufferTemplate(): BufferData(), _data() {} /** Copy constructor using CopyOp to manage deep vs shallow copy.*/ BufferTemplate(const BufferTemplate< std::vector >& bt,const CopyOp& copyop=CopyOp::SHALLOW_COPY): osg::BufferData(bt,copyop), _data(bt._data) {} virtual bool isSameKindAs(const Object* obj) const { return dynamic_cast >*>(obj)!=NULL; } virtual const char* libraryName() const { return "osg"; } virtual const char* className() const { return "BufferTemplate >"; } virtual Object* cloneType() const { return new BufferTemplate< std::vector >(); } virtual Object* clone(const CopyOp& copyop) const { return new BufferTemplate< std::vector >(*this,copyop); } virtual const GLvoid* getDataPointer() const { return &_data[0]; } virtual unsigned int getTotalDataSize() const { return _data.size() * sizeof(T); } const std::vector& getData() const { return _data; } std::vector& getData() { return _data; } void setData(const std::vector& data) { _data = data; dirty(); } protected: virtual ~BufferTemplate() {}; private: std::vector _data; }; } #endif