UniShader  1.0.0a
Interface for GPGPU and working with shader programs
 All Classes Functions Typedefs Enumerations Enumerator
D:/Visual Studio 2010/Projects/Unishader project/Unishader/include/UniShader/Buffer.h
00001 #pragma once
00002 #ifndef BUFFER_H
00003 #define BUFFER_H
00004 
00005 #include <UniShader/Config.h>
00006 #include <UniShader/Utility.h>
00007 #include <UniShader/ObjectBase.h>
00008 
00009 #include <memory>
00010 #include <vector>
00011 #include <string>
00012 #include <typeinfo>
00013 
00014 UNISHADER_BEGIN
00015 
00017 
00021 class UniShader_API BufferBase : public ObjectBase{
00022 protected:
00023         BufferBase();
00024 public:
00025         typedef std::shared_ptr<BufferBase> Ptr; 
00026         virtual const std::string& getClassName() const; 
00027         ~BufferBase();
00028 
00030 
00033         class FrequencyMode{
00034         public:
00035                 enum myEnum{NONE, 
00036                                         STREAM, 
00037                                         STATIC, 
00038                                         DYNAMIC 
00039                 };
00040         private:
00041                 myEnum m_en;
00042         public:
00043                 FrequencyMode(){}
00044                 FrequencyMode(const FrequencyMode& ref):m_en(ref.m_en){}
00045                 FrequencyMode(myEnum en){ m_en = en; }
00046                 FrequencyMode& operator =(myEnum en){ m_en = en; return *this; }
00047                 operator myEnum(){ return m_en; }
00048         };
00049 
00051 
00054         class NatureMode{
00055         public:
00056                 enum myEnum{NONE, 
00057                                         DRAW, 
00058                                         READ, 
00059                                         COPY 
00060                 };
00061         private:
00062                 myEnum m_en;
00063         public:
00064                 NatureMode(){}
00065                 NatureMode(const NatureMode& ref):m_en(ref.m_en){}
00066                 NatureMode(myEnum en){ m_en = en; }
00067                 NatureMode& operator =(myEnum en){ m_en = en; return *this; }
00068                 operator myEnum(){ return m_en; }
00069         };
00070 
00072 
00075         class SignalID{
00076         public:
00077                 enum Types{CHANGED 
00078                 }; 
00079         };
00080 
00082 
00086         bool clear();
00087 
00089 
00092         unsigned int getGlID() const;
00093 
00095 
00098         FrequencyMode getFrequencyMode() const;
00099 
00101 
00104         NatureMode getNatureMode() const;
00105 
00107 
00111         void setFrequencyMode(FrequencyMode frequencyMode);
00112         
00114 
00118         void setNatureMode(NatureMode natureMode);
00119 
00120 protected:
00122 
00125         bool mapBuffer(void** mappedPtr) const;
00126 
00128         bool unmapBuffer() const;
00129 
00131 
00136         bool setPlainData(const void* data, size_t size);
00137 
00138         size_t m_byteSize;
00139 private:
00140         FrequencyMode m_frequencyMode;
00141         NatureMode m_natureMode;
00142         unsigned int m_bufferID;
00143 };
00144 
00146 
00152 template <typename T>
00153 class Buffer : public BufferBase{
00154 private:
00155         Buffer();
00156 public:
00157         typedef std::shared_ptr<Buffer<T>> Ptr; 
00158         typedef std::shared_ptr<const Buffer<T>> PtrConst; 
00159         virtual const std::string& getClassName() const; 
00160         ~Buffer();
00161 
00163 
00166         static Ptr create();
00167 
00169 
00174         bool getDataCopy(std::vector<T>& vec) const;
00175 
00177 
00183         bool getDataCopy(T* arr, unsigned int& size) const;
00184 
00186 
00193         std::string getString(unsigned int begin = 0, unsigned int count = 0, std::ostringstream& format = std::ostringstream()) const;
00194 
00196 
00200         bool setData(const std::vector<T>& vec);
00201 
00203 
00208         bool setData(const T* arr, unsigned int size);
00209 };
00210 
00211 UNISHADER_END
00212 
00213 #include <UniShader/Buffer.inl>
00214 
00215 #endif