From de87219bae57a9addfddc3da9e23fe1b740ff4e7 Mon Sep 17 00:00:00 2001 From: Selim Mustafaev Date: Mon, 29 Jan 2018 20:23:28 +0300 Subject: [PATCH] working with mesh... --- src/GLObjects/GLObject.cpp | 2 +- src/GLObjects/Mesh.cpp | 158 ++++++++++++++----------------------- src/GLObjects/Mesh.h | 3 + 3 files changed, 62 insertions(+), 101 deletions(-) diff --git a/src/GLObjects/GLObject.cpp b/src/GLObjects/GLObject.cpp index 1fb8387..fe9e7d5 100644 --- a/src/GLObjects/GLObject.cpp +++ b/src/GLObjects/GLObject.cpp @@ -72,7 +72,7 @@ void GLObject::draw() { } void GLObject::update() { - generateVertices(); + updateVertices(); glBindBuffer(GL_ARRAY_BUFFER, _vertexVbo); //glBufferData(GL_ARRAY_BUFFER, _vertexCount*sizeof(Vertex), _vertices.get(), GL_STATIC_DRAW); glBufferSubData(GL_ARRAY_BUFFER, 0, _vertexCount*sizeof(Vertex), _vertices.get()); diff --git a/src/GLObjects/Mesh.cpp b/src/GLObjects/Mesh.cpp index b3b46e8..50d0c6b 100644 --- a/src/GLObjects/Mesh.cpp +++ b/src/GLObjects/Mesh.cpp @@ -3,8 +3,8 @@ #include #include -Mesh::Mesh(ShaderProgram* shader, std::size_t size) : GLObject(shader), _size(size), _xs(size), _ys(size) { - _vertexCount = 2*3*(_size + 1)*(_size + 1); +Mesh::Mesh(ShaderProgram* shader, std::size_t size) : GLObject(shader), _size(size), _xs(size), _ys(size), _normals(2*size*size) { + _vertexCount = (_size + 1)*(_size + 1); _indexCount = _vertexCount; _vertices = std::make_unique(_vertexCount); _indices = std::make_unique(_indexCount); @@ -15,116 +15,74 @@ Mesh::~Mesh() { } void Mesh::generateVertices() const { - const float step = 1.0f/_size; -// const float expStep = (exp(4) - 1)/(_size - 2); - - for(std::size_t j = 0; j < _size; ++j) - for(std::size_t i = 0; i <= _size; ++i) { - float x = (float)i/_size - 0.5f; - float xStep = step; - float y = (float)j/_size - 0.5f; - //logf(j*expStep + 1)/4.0f - 0.5f; - -// float h1 = heightMapFunc(i, j, x, y); -// float h2 = heightMapFunc(i + 1, j, x + xStep, y); -// float h3 = heightMapFunc(i, j + 1, x, y + step); -// float h4 = heightMapFunc(i + 1, j + 1, x + xStep, y + step); - - glm::vec3 p1(x, y, 0.f); - glm::vec3 p2(p1.x + xStep, p1.y, 0.f); - glm::vec3 p3(p1.x, p1.y + step, 0.f); - glm::vec3 p4(p1.x + xStep, p1.y + step, 0.f); - glm::vec3 norm1 = glm::cross(p2 - p1, p3 - p1); - glm::vec3 norm2 = glm::cross(p3 - p4, p2 - p4); - - //std::cout << "p1 = [" << p1.x << "," << p1.y << "]" << std::endl; - - std::size_t idx = (j*(_size - 1) + i)*2*3; - - _vertices[idx].x = p1.x; - _vertices[idx].y = p1.y; - _vertices[idx].z = p1.z; - _vertices[idx].nx = norm1.x; - _vertices[idx].ny = norm1.y; - _vertices[idx].nz = norm1.z; - - idx += 1; - _vertices[idx].x = p2.x; - _vertices[idx].y = p2.y; - _vertices[idx].z = p2.z; - _vertices[idx].nx = norm1.x; - _vertices[idx].ny = norm1.y; - _vertices[idx].nz = norm1.z; - - idx += 1; - _vertices[idx].x = p3.x; - _vertices[idx].y = p3.y; - _vertices[idx].z = p3.z; - _vertices[idx].nx = norm1.x; - _vertices[idx].ny = norm1.y; - _vertices[idx].nz = norm1.z; - - idx += 1; - _vertices[idx].x = p3.x; - _vertices[idx].y = p3.y; - _vertices[idx].z = p3.z; - _vertices[idx].nx = norm2.x; - _vertices[idx].ny = norm2.y; - _vertices[idx].nz = norm2.z; - - idx += 1; - _vertices[idx].x = p2.x; - _vertices[idx].y = p2.y; - _vertices[idx].z = p2.z; - _vertices[idx].nx = norm2.x; - _vertices[idx].ny = norm2.y; - _vertices[idx].nz = norm2.z; - - idx += 1; - _vertices[idx].x = p4.x; - _vertices[idx].y = p4.y; - _vertices[idx].z = p4.z; - _vertices[idx].nx = norm2.x; - _vertices[idx].ny = norm2.y; - _vertices[idx].nz = norm2.z; - } + for(std::size_t j = 0; j < _size; ++j) { + for (std::size_t i = 0; i <= _size; ++i) { + size_t idx = j*(_size - 1) + i; + _vertices[idx].x = (float)i/_size - 0.5f; + _vertices[idx].y = (float)j/_size - 0.5f; + _vertices[idx].z = 0.f; + _vertices[idx].nx = 0.f; + _vertices[idx].ny = 0.f; + _vertices[idx].nz = 0.f; + } + } } void Mesh::updateVertices() const { for(std::size_t j = 0; j < _size; ++j) { for(std::size_t i = 0; i <= _size; ++i) { - std::size_t idx = (j*(_size - 1) + i)*2*3; + std::size_t idx = j*(_size - 1) + i; _vertices[idx].z = heightMap(i, j); } } - for(std::size_t j = 0; j < _size; ++j) { - for(std::size_t i = 0; i <= _size; ++i) { - std::size_t idx = (j*(_size - 1) + i)*2*3; - float x = _xs[i], x2 = _xs[i + 1]; - float y = _ys[j], y2 = _ys[j + 1]; - float z = _vertices[idx] + // 1. Calc normals for all triangles +// _normals.clear(); +// for(std::size_t j = 0; j < _size; ++j) { +// for(std::size_t i = 0; i <= _size; ++i) { +// float x = _xs[i], x2 = _xs[i + 1]; +// float y = _ys[j], y2 = _ys[j + 1]; +// +// glm::vec3 p1(x, y, _vertices[j*(_size - 1) + i].z); +// glm::vec3 p2(x2, y, _vertices[j*(_size - 1) + i + 1].z); +// glm::vec3 p3(x, y2, _vertices[(j + 1)*(_size - 1) + i].z); +// glm::vec3 p4(x2, y2, _vertices[(j + 1)*(_size - 1) + i + 1].z); +// +// glm::vec3 v1 = p1 - p3; +// glm::vec3 v2 = p2 - p3; +// glm::vec3 v3 = p4 - p3; +// +// glm::vec3 norm1 = glm::cross(v2, v1); +// glm::vec3 norm2 = glm::cross(v3, v2); +// +// _normals.emplace_back(norm1); +// _normals.emplace_back(norm2); +// } +// } - glm::vec3 p1(x, y, 0.f); - glm::vec3 p2(x2, y, 0.f); - glm::vec3 p3(p1.x, p1.y + step, 0.f); - glm::vec3 p4(p1.x + xStep, p1.y + step, 0.f); - glm::vec3 norm1 = glm::cross(p2 - p1, p3 - p1); - glm::vec3 norm2 = glm::cross(p3 - p4, p2 - p4); - } - } + // 2. Calc normals for all vertices based on precalculated normals for triangles + // Normal of vertex is an average of normals of adjacent triangles +// for(std::size_t j = 0; j < _size; ++j) { +// for (std::size_t i = 0; i <= _size; ++i) { +// +// } +// } } - void Mesh::generateIndices() const { - for(std::size_t i = 0; i < _size - 1; ++i) - for(std::size_t j = 0; j < _size - 1; ++j) { - std::size_t idx = (i*(_size - 1) + j)*6; - _indices[idx] = (GLuint)idx; - _indices[idx + 1] = (GLuint)idx + 1; - _indices[idx + 2] = (GLuint)idx + 2; - _indices[idx + 3] = (GLuint)idx + 3; - _indices[idx + 4] = (GLuint)idx + 4; - _indices[idx + 5] = (GLuint)idx + 5; + GLuint u = (GLuint)_size, v = (GLuint)_size; + for (unsigned i = 0; i < (u - 1); i++) + for (unsigned j = 0; j < (v - 1); j++) + { + GLuint indexa = j*(u - 1) + i; + GLuint indexb = j*u + i; + + _indices[indexa*6 + 0] = indexb; + _indices[indexa*6 + 1] = indexb + 1 + u; + _indices[indexa*6 + 2] = indexb + 1; + + _indices[indexa*6 + 3] = indexb; + _indices[indexa*6 + 4] = indexb + u; + _indices[indexa*6 + 5] = indexb + u + 1; } } diff --git a/src/GLObjects/Mesh.h b/src/GLObjects/Mesh.h index 5ae1475..87dd11a 100644 --- a/src/GLObjects/Mesh.h +++ b/src/GLObjects/Mesh.h @@ -9,6 +9,7 @@ #include #include #include +#include class Mesh: public GLObject { @@ -16,6 +17,8 @@ protected: size_t _size; std::vector _xs; std::vector _ys; + mutable std::vector _normals; + mutable std::array _adjacentTriangles; public: Mesh(ShaderProgram* shader, std::size_t size);