diff options
| author | Ethan Morgan <ethan@gweithio.com> | 2026-02-14 16:44:06 +0000 |
|---|---|---|
| committer | Ethan Morgan <ethan@gweithio.com> | 2026-02-14 16:44:06 +0000 |
| commit | 54409423f767d8b1cf30cb7d0efca6b4ca138823 (patch) | |
| tree | d915ac7828703ce4b963efdd9728a1777ba18c1e /apps/openmb/renderer/Mesh.cpp | |
Diffstat (limited to 'apps/openmb/renderer/Mesh.cpp')
| -rw-r--r-- | apps/openmb/renderer/Mesh.cpp | 147 |
1 files changed, 147 insertions, 0 deletions
diff --git a/apps/openmb/renderer/Mesh.cpp b/apps/openmb/renderer/Mesh.cpp new file mode 100644 index 0000000..4fb34ee --- /dev/null +++ b/apps/openmb/renderer/Mesh.cpp @@ -0,0 +1,147 @@ +#include "Mesh.hpp" + +namespace renderer { +Mesh::Mesh () : mVAO( 0 ), mVBO( 0 ), mEBO( 0 ), mVertexCount( 0 ), mIndexCount( 0 ), mMode( GL_TRIANGLES ) {} + +Mesh::~Mesh () { + if( mVBO ) { + glDeleteBuffers( 1, &mVBO ); + } + if( mEBO ) { + glDeleteBuffers( 1, &mEBO ); + } + if( mVAO ) { + glDeleteVertexArrays( 1, &mVAO ); + } +} + +bool Mesh::createFromPositions ( const std::vector<float>& positions, bool lines ) { + if( positions.empty() ) { + return false; + } + + mMode = lines ? GL_LINES : GL_TRIANGLES; + mVertexCount = static_cast<GLsizei>( positions.size() / 3 ); + + glGenVertexArrays( 1, &mVAO ); + glGenBuffers( 1, &mVBO ); + + glBindVertexArray( mVAO ); + glBindBuffer( GL_ARRAY_BUFFER, mVBO ); + glBufferData( GL_ARRAY_BUFFER, positions.size() * sizeof( float ), positions.data(), GL_STATIC_DRAW ); + + glEnableVertexAttribArray( 0 ); + glVertexAttribPointer( 0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof( float ), (void*)0 ); + + glBindVertexArray( 0 ); + + return true; +} + +bool Mesh::createFromPosTex ( const std::vector<float>& data ) { + if( data.empty() ) + return false; + + const size_t strideFloats = 5; + mMode = GL_TRIANGLES; + mVertexCount = static_cast<GLsizei>( data.size() / strideFloats ); + + glGenVertexArrays( 1, &mVAO ); + glGenBuffers( 1, &mVBO ); + + glBindVertexArray( mVAO ); + glBindBuffer( GL_ARRAY_BUFFER, mVBO ); + glBufferData( GL_ARRAY_BUFFER, data.size() * sizeof( float ), data.data(), GL_STATIC_DRAW ); + + glEnableVertexAttribArray( 0 ); + glVertexAttribPointer( 0, 3, GL_FLOAT, GL_FALSE, strideFloats * sizeof( float ), (void*)0 ); + + glEnableVertexAttribArray( 1 ); + glVertexAttribPointer( 1, 2, GL_FLOAT, GL_FALSE, strideFloats * sizeof( float ), + (void*)( 3 * sizeof( float ) ) ); + + glBindVertexArray( 0 ); + return true; +} + +bool Mesh::createFromPosTexNormal ( const std::vector<float>& data ) { + if( data.empty() ) + return false; + + const size_t strideFloats = 8; + mMode = GL_TRIANGLES; + mVertexCount = static_cast<GLsizei>( data.size() / strideFloats ); + + glGenVertexArrays( 1, &mVAO ); + glGenBuffers( 1, &mVBO ); + + glBindVertexArray( mVAO ); + glBindBuffer( GL_ARRAY_BUFFER, mVBO ); + glBufferData( GL_ARRAY_BUFFER, data.size() * sizeof( float ), data.data(), GL_STATIC_DRAW ); + + glEnableVertexAttribArray( 0 ); + glVertexAttribPointer( 0, 3, GL_FLOAT, GL_FALSE, strideFloats * sizeof( float ), (void*)0 ); + + glEnableVertexAttribArray( 1 ); + glVertexAttribPointer( 1, 2, GL_FLOAT, GL_FALSE, strideFloats * sizeof( float ), + (void*)( 3 * sizeof( float ) ) ); + + glEnableVertexAttribArray( 2 ); + glVertexAttribPointer( 2, 3, GL_FLOAT, GL_FALSE, strideFloats * sizeof( float ), + (void*)( 5 * sizeof( float ) ) ); + + glBindVertexArray( 0 ); + return true; +} + +bool Mesh::createFromPosTexNormalIndexed ( const std::vector<float>& data, + const std::vector<unsigned int>& indices ) { + if( data.empty() || indices.empty() ) + return false; + + const size_t strideFloats = 8; + mMode = GL_TRIANGLES; + mVertexCount = static_cast<GLsizei>( data.size() / strideFloats ); + mIndexCount = static_cast<GLsizei>( indices.size() ); + + glGenVertexArrays( 1, &mVAO ); + glGenBuffers( 1, &mVBO ); + glGenBuffers( 1, &mEBO ); + + glBindVertexArray( mVAO ); + glBindBuffer( GL_ARRAY_BUFFER, mVBO ); + glBufferData( GL_ARRAY_BUFFER, data.size() * sizeof( float ), data.data(), GL_STATIC_DRAW ); + + glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, mEBO ); + glBufferData( GL_ELEMENT_ARRAY_BUFFER, indices.size() * sizeof( unsigned int ), indices.data(), + GL_STATIC_DRAW ); + + glEnableVertexAttribArray( 0 ); + glVertexAttribPointer( 0, 3, GL_FLOAT, GL_FALSE, strideFloats * sizeof( float ), (void*)0 ); + + glEnableVertexAttribArray( 1 ); + glVertexAttribPointer( 1, 2, GL_FLOAT, GL_FALSE, strideFloats * sizeof( float ), + (void*)( 3 * sizeof( float ) ) ); + + glEnableVertexAttribArray( 2 ); + glVertexAttribPointer( 2, 3, GL_FLOAT, GL_FALSE, strideFloats * sizeof( float ), + (void*)( 5 * sizeof( float ) ) ); + + glBindVertexArray( 0 ); + return true; +} + +void Mesh::draw () const { + if( mVAO == 0 ) + return; + + glBindVertexArray( mVAO ); + if( mEBO && mIndexCount > 0 ) { + glDrawElements( mMode, mIndexCount, GL_UNSIGNED_INT, 0 ); + } else { + glDrawArrays( mMode, 0, mVertexCount ); + } + glBindVertexArray( 0 ); +} + +} // namespace renderer |