Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!
Werbeanzeige
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
#include <GL/glew.h> #include "vertexbuffer.hpp" using namespace std; class VertexBufferImplData { public: VertexBufferImplData() : nDataLength( 0 ) { } GLuint id; void* pMappedBufferPtr; unsigned int nDataLength; GLenum vertexformat; unsigned int nVertexSize; }; // class VertexBufferImplData VertexBuffer::VertexBuffer() : m_pImplData( new VertexBufferImplData() ), m_bDynamic( false ) { glGenBuffers( 1, &( m_pImplData->id ) ); } VertexBuffer::~VertexBuffer() { glDeleteBuffers( 1, &( m_pImplData->id ) ); delete m_pImplData; } void VertexBuffer::update( const void* pvData, unsigned int size, GLenum vertexformat, unsigned char vertexsize, bool bDynamic ) { glBindBuffer( GL_ARRAY_BUFFER, m_pImplData -> id ); glEnableClientState( GL_VERTEX_ARRAY ); glBufferData( GL_ARRAY_BUFFER, size, pvData, bDynamic ? GL_DYNAMIC_DRAW : GL_STATIC_DRAW ); m_bDynamic = bDynamic; m_pImplData -> nDataLength = size; m_pImplData -> vertexformat = vertexformat; m_pImplData -> nVertexSize = vertexsize; } void VertexBuffer::draw( GLenum mode, unsigned int offset, unsigned int datalength ) const { if( datalength == 0 ) { datalength = m_pImplData -> nDataLength; } glBindBuffer( GL_ARRAY_BUFFER, m_pImplData -> id ); glInterleavedArrays( m_pImplData -> vertexformat, m_pImplData -> nVertexSize, NULL ); glDrawArrays( mode, offset, datalength ); } |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
struct C3F_V3F : public VertexC3F, public VertexV3F, public VertexBaseType { unsigned char size() const { return sizeof( VertexC3F ) + sizeof( VertexV3F ); } GLenum format() const { return GL_C3F_V3F; } } __attribute__((packed)); struct VertexBaseType { public: virtual ~VertexBaseType() { } virtual unsigned char size() const = 0; virtual GLenum format() const = 0; protected: VertexBaseType() { } } __attribute__((packed)); struct VertexV3F { Vector3f position; } __attribute__((packed)); struct VertexC3F { Color3f color; } __attribute__((packed)); |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 |
#include <GL/glew.h> #include "vertexbuffer.hpp" using namespace std; using namespace vertexformats; const GLenum V3F ::format = GL_V3F; const GLenum T2F_C3F_V3F ::format = GL_T2F_C3F_V3F; const GLenum T2F_C4F_N3F_V3F ::format = GL_T2F_C4F_N3F_V3F; const GLenum T2F_C4UB_V3F ::format = GL_T2F_C4UB_V3F; const GLenum T2F_N3F_V3F ::format = GL_T2F_N3F_V3F; const GLenum T2F_V3F ::format = GL_T2F_V3F; const GLenum N3F_V3F ::format = GL_N3F_V3F; const GLenum C3F_V3F ::format = GL_C3F_V3F; const GLenum C4F_N3F_V3F ::format = GL_C4F_N3F_V3F; const GLenum C4UB_V3F ::format = GL_C4UB_V3F; class VertexBufferImplData { public: VertexBufferImplData() : nDataLength( 0 ) { } GLuint id; void* pMappedBufferPtr; unsigned int nDataLength; GLenum vertexformat; unsigned int nVertexSize; }; // class VertexBufferImplData VertexBuffer::VertexBuffer() : m_pImplData( new VertexBufferImplData() ), m_bDynamic( false ) { CHECK_GL_ERRORS; glGenBuffers( 1, &( m_pImplData->id ) ); CHECK_GL_ERRORS; } VertexBuffer::~VertexBuffer() { CHECK_GL_ERRORS; glDeleteBuffers( 1, &( m_pImplData->id ) ); CHECK_GL_ERRORS; delete m_pImplData; } void VertexBuffer::update( const void* pvData, unsigned int size, GLenum vertexformat, unsigned char vertexsize, bool bDynamic ) { CHECK_GL_ERRORS; glBindBuffer( GL_ARRAY_BUFFER, m_pImplData -> id ); glEnableClientState( GL_VERTEX_ARRAY ); glBufferData( GL_ARRAY_BUFFER, size, pvData, bDynamic ? GL_DYNAMIC_DRAW : GL_STATIC_DRAW ); m_bDynamic = bDynamic; m_pImplData -> nDataLength = size; m_pImplData -> vertexformat = vertexformat; m_pImplData -> nVertexSize = vertexsize; CHECK_GL_ERRORS; } void VertexBuffer::draw( GLenum mode, unsigned int offset, unsigned int datalength ) const { CHECK_GL_ERRORS; if( datalength == 0 ) { datalength = m_pImplData -> nDataLength; } glBindBuffer( GL_ARRAY_BUFFER, m_pImplData -> id ); glInterleavedArrays( m_pImplData -> vertexformat, m_pImplData -> nVertexSize, NULL ); glDrawArrays( mode, offset, datalength ); CHECK_GL_ERRORS; } |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 |
template<typename T> struct PackedVector2 { union { T x; T r; }; union { T y; T g; }; PackedVector2<T>& operator=( const Vector2f& v ) { x = v.x; y = v.y; return *this; } } __attribute__((packed)); template<typename T> struct PackedVector3 { union { T x; T r; }; union { T y; T g; }; union { T z; T b; }; PackedVector3<T>& operator=( const Vector3f& v ) { x = v.x; y = v.y; z = v.z; return *this; } } __attribute__((packed)); template<typename T> struct PackedVector4 { union { T x; T r; }; union { T y; T g; }; union { T z; T b; }; union { T w; T a; }; PackedVector4<T>& operator=( const Vector4f& v ) { x = v.x; y = v.y; z = v.z; w = v.w; return *this; } } __attribute__((packed)); typedef PackedVector2<float> PackedVector2f; typedef PackedVector3<float> PackedVector3f; typedef PackedVector4<float> PackedVector4f; typedef PackedVector4<unsigned char> PackedVector4ub; struct VertexV3F { PackedVector3f position; } __attribute__((packed)); struct VertexN3F { PackedVector3f normals; } __attribute__((packed)); struct VertexC3F { PackedVector3f color; } __attribute__((packed)); struct VertexT2F { PackedVector2f texture; } __attribute__((packed)); struct VertexC4F { PackedVector4f color; } __attribute__((packed)); struct VertexC4UB { PackedVector4ub color; } __attribute__((packed)); namespace vertexformats { struct V3F : public VertexV3F { const static GLenum format; } __attribute__((packed)); struct T2F_C3F_V3F : public VertexT2F, public VertexC3F, public VertexV3F { const static GLenum format; } __attribute__((packed)); struct T2F_C4F_N3F_V3F : public VertexT2F, public VertexC4F, public VertexN3F, public VertexV3F { const static GLenum format; } __attribute__((packed)); struct T2F_C4UB_V3F : public VertexT2F, public VertexC4UB, public VertexV3F { const static GLenum format; } __attribute__((packed)); struct T2F_N3F_V3F : public VertexT2F, public VertexN3F, public VertexV3F { const static GLenum format; } __attribute__((packed)); struct T2F_V3F : public VertexT2F, public VertexV3F { const static GLenum format; } __attribute__((packed)); struct N3F_V3F : public VertexN3F, public VertexV3F { const static GLenum format; } __attribute__((packed)); struct C3F_V3F : public VertexC3F, public VertexV3F { const static GLenum format; } __attribute__((packed)); struct C4F_N3F_V3F : public VertexC4F, public VertexN3F, public VertexV3F { const static GLenum format; } __attribute__((packed)); struct C4UB_V3F : public VertexC4UB, public VertexV3F { const static GLenum format; } __attribute__((packed)); } // namespace vertexformats |
Werbeanzeige