From 6dcd3dfcdde78f576f1e00ebb4bd767d7905ac3c Mon Sep 17 00:00:00 2001 From: Adam Rohdin Date: Tue, 30 May 2023 20:35:55 +0200 Subject: [PATCH] Switched multiple OpenGL calls to single a call for better efficiency --- .../space/rendering/renderableorbitalkepler.cpp | 15 ++++++++++----- modules/space/rendering/renderableorbitalkepler.h | 3 ++- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/modules/space/rendering/renderableorbitalkepler.cpp b/modules/space/rendering/renderableorbitalkepler.cpp index 3ccbba24ac..13aecd8874 100644 --- a/modules/space/rendering/renderableorbitalkepler.cpp +++ b/modules/space/rendering/renderableorbitalkepler.cpp @@ -296,11 +296,11 @@ void RenderableOrbitalKepler::render(const RenderData& data, RendererTasks&) { //glDepthMask(false); //glBlendFunc(GL_SRC_ALPHA, GL_ONE) + GLint* _si = &_startIndex[0]; + GLint* _ss = &_segmentSize[0]; + glBindVertexArray(_vertexArray); - for (size_t i = 0; i < nrOrbits; ++i) { - glDrawArrays(GL_LINE_STRIP, vertices, static_cast(_segmentSize[i] + 1)); - vertices = vertices + static_cast(_segmentSize[i]) + 1; - } + glMultiDrawArrays(GL_LINE_STRIP, _si, _ss, static_cast(_startIndex.size())); glBindVertexArray(0); _programObject->deactivate(); @@ -363,12 +363,17 @@ void RenderableOrbitalKepler::updateBuffers() { } _segmentSize.clear(); - for (const kepler::Parameters& p : parameters) { + _startIndex.clear(); + _startIndex.push_back(0); + for (int i = 0; i < parameters.size(); ++i) { const double scale = static_cast(_segmentQuality) * 10.0; + const kepler::Parameters& p = parameters[i]; _segmentSize.push_back( static_cast(scale + (scale / pow(1 - p.eccentricity, 1.2))) ); + _startIndex.push_back(_startIndex[i] + static_cast(_segmentSize[i]) + 1); } + _startIndex.pop_back(); size_t nVerticesTotal = 0; diff --git a/modules/space/rendering/renderableorbitalkepler.h b/modules/space/rendering/renderableorbitalkepler.h index 42e1e59bfc..6352435f4e 100644 --- a/modules/space/rendering/renderableorbitalkepler.h +++ b/modules/space/rendering/renderableorbitalkepler.h @@ -58,7 +58,8 @@ private: bool _updateDataBuffersAtNextRender = false; std::streamoff _numObjects; - std::vector _segmentSize; + std::vector _segmentSize; + std::vector _startIndex; properties::UIntProperty _segmentQuality; properties::UIntProperty _startRenderIdx; properties::UIntProperty _sizeRender;