diff --git a/src/GLObjects/GLObject.cpp b/src/GLObjects/GLObject.cpp index b725734..d9b1036 100644 --- a/src/GLObjects/GLObject.cpp +++ b/src/GLObjects/GLObject.cpp @@ -12,8 +12,12 @@ GLObject::~GLObject() { } void GLObject::create() { - auto vData = generateVertices(); - auto iData = generateIndices(); + std::size_t iCount = 0, vCount = 0; + std::unique_ptr vArray; + std::unique_ptr iArray; + + std::tie(vArray, vCount) = generateVertices(); + std::tie(iArray, iCount) = generateIndices(); GLuint vbo[2]; glGenBuffers(2, vbo); @@ -21,11 +25,11 @@ void GLObject::create() { _indexVbo = vbo[1]; glBindBuffer(GL_ARRAY_BUFFER, _vertexVbo); - glBufferData(GL_ARRAY_BUFFER, std::get<1>(vData), std::get<0>(vData), GL_STREAM_DRAW); + glBufferData(GL_ARRAY_BUFFER, vCount, vArray.get(), GL_STREAM_DRAW); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _indexVbo); - glBufferData(GL_ELEMENT_ARRAY_BUFFER, std::get<1>(iData), std::get<0>(iData), GL_STATIC_DRAW); + glBufferData(GL_ELEMENT_ARRAY_BUFFER, iCount, iArray.get(), GL_STATIC_DRAW); - _trianglesCount = std::get<1>(iData)/sizeof(GLuint); + _trianglesCount = iCount/sizeof(GLuint); glGenVertexArrays(1, &_vao); glBindVertexArray(_vao); @@ -34,9 +38,6 @@ void GLObject::create() { glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), nullptr); glEnableVertexAttribArray(1); glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 6*sizeof(float), (GLchar*)(3*sizeof(float))); - - delete[] std::get<0>(vData); - delete[] std::get<0>(iData); } void GLObject::rotate(glm::vec3 angles) { @@ -68,9 +69,10 @@ void GLObject::draw() { } void GLObject::update() { - auto vData = generateVertices(); + std::size_t vCount = 0; + std::unique_ptr vArray; + std::tie(vArray, vCount) = generateVertices(); glBindBuffer(GL_ARRAY_BUFFER, _vertexVbo); // glBufferData(GL_ARRAY_BUFFER, _size*_size*sizeof(Vertex), NULL, GL_STREAM_DRAW); - glBufferData(GL_ARRAY_BUFFER, std::get<1>(vData), std::get<0>(vData), GL_STREAM_DRAW); - delete[] std::get<0>(vData); + glBufferData(GL_ARRAY_BUFFER, vCount, vArray.get(), GL_STREAM_DRAW); } diff --git a/src/GLObjects/GLObject.h b/src/GLObjects/GLObject.h index c8dc888..3798ba7 100644 --- a/src/GLObjects/GLObject.h +++ b/src/GLObjects/GLObject.h @@ -6,8 +6,15 @@ #include "vertex.h" #include +#include #include +template +using ArrayWithSize = std::tuple,std::size_t>; + +using VertexArray = ArrayWithSize; +using IndexArray = ArrayWithSize; + class GLObject: public IGLObject { private: GLuint _vertexVbo; @@ -29,8 +36,8 @@ public: void update() override final; protected: - virtual std::tuple generateVertices() const = 0; - virtual std::tuple generateIndices() const = 0; + virtual VertexArray generateVertices() const = 0; + virtual IndexArray generateIndices() const = 0; }; diff --git a/src/GLObjects/Mesh.cpp b/src/GLObjects/Mesh.cpp index df1eb07..a93a2c0 100644 --- a/src/GLObjects/Mesh.cpp +++ b/src/GLObjects/Mesh.cpp @@ -9,9 +9,9 @@ Mesh::~Mesh() { } -std::tuple Mesh::generateVertices() const { +VertexArray Mesh::generateVertices() const { std::size_t u = _size, v = _size; - Vertex* retVal = new Vertex[u*v]; + auto retVal = std::make_unique(u*v); const float step = (exp(4) - 1)/_size; for (std::size_t i = 0; i < u; i++) @@ -28,12 +28,12 @@ std::tuple Mesh::generateVertices() const { retVal[j*u+i].normal[2] = 1.0f; } - return std::make_tuple(retVal, u*v*sizeof(Vertex)); + return std::make_tuple(std::move(retVal), u*v*sizeof(Vertex)); } -std::tuple Mesh::generateIndices() const { +IndexArray Mesh::generateIndices() const { unsigned u = _size, v = _size; - unsigned int* indices = new unsigned int[(u-1)*(v-1)*6]; + auto indices = std::make_unique((u-1)*(v-1)*6); for (unsigned i = 0; i < (u - 1); i++) for (unsigned j = 0; j < (v - 1); j++) { @@ -48,5 +48,5 @@ std::tuple Mesh::generateIndices() const { indices[indexa*6+5]=indexb+u+1; } - return std::make_tuple(indices, (u-1)*(v-1)*6*sizeof(GLuint)); + return std::make_tuple(std::move(indices), (u-1)*(v-1)*6*sizeof(GLuint)); } diff --git a/src/GLObjects/Mesh.h b/src/GLObjects/Mesh.h index 3bae5d0..012f5e1 100644 --- a/src/GLObjects/Mesh.h +++ b/src/GLObjects/Mesh.h @@ -19,8 +19,8 @@ public: virtual ~Mesh(); protected: - std::tuple generateVertices() const override final; - std::tuple generateIndices() const override final; + VertexArray generateVertices() const override final; + IndexArray generateIndices() const override final; protected: virtual float heightMapFunc(std::size_t nx, std::size_t ny, float fx, float fy) const = 0;