working on WaveMesh...
This commit is contained in:
parent
de87219bae
commit
9b65b32b55
@ -25,7 +25,7 @@ void GLObject::create() {
|
|||||||
glBindBuffer(GL_ARRAY_BUFFER, _vertexVbo);
|
glBindBuffer(GL_ARRAY_BUFFER, _vertexVbo);
|
||||||
glBufferData(GL_ARRAY_BUFFER, _vertexCount*sizeof(Vertex), nullptr, GL_STREAM_DRAW);
|
glBufferData(GL_ARRAY_BUFFER, _vertexCount*sizeof(Vertex), nullptr, GL_STREAM_DRAW);
|
||||||
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _indexVbo);
|
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _indexVbo);
|
||||||
glBufferData(GL_ELEMENT_ARRAY_BUFFER, _indexCount*sizeof(GLuint), _indices.get(), GL_STATIC_DRAW);
|
glBufferData(GL_ELEMENT_ARRAY_BUFFER, _indexCount*sizeof(GLuint), _indices.get(), GL_STREAM_DRAW);
|
||||||
|
|
||||||
_trianglesCount = _indexCount*sizeof(GLuint)/sizeof(GLuint);
|
_trianglesCount = _indexCount*sizeof(GLuint)/sizeof(GLuint);
|
||||||
|
|
||||||
|
|||||||
@ -4,8 +4,8 @@
|
|||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
|
||||||
Mesh::Mesh(ShaderProgram* shader, std::size_t size) : GLObject(shader), _size(size), _xs(size), _ys(size), _normals(2*size*size) {
|
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);
|
_vertexCount = _size*_size;
|
||||||
_indexCount = _vertexCount;
|
_indexCount = (_size - 1)*(_size - 1)*6;
|
||||||
_vertices = std::make_unique<Vertex[]>(_vertexCount);
|
_vertices = std::make_unique<Vertex[]>(_vertexCount);
|
||||||
_indices = std::make_unique<GLuint[]>(_indexCount);
|
_indices = std::make_unique<GLuint[]>(_indexCount);
|
||||||
}
|
}
|
||||||
@ -16,8 +16,8 @@ Mesh::~Mesh() {
|
|||||||
|
|
||||||
void Mesh::generateVertices() const {
|
void Mesh::generateVertices() const {
|
||||||
for(std::size_t j = 0; j < _size; ++j) {
|
for(std::size_t j = 0; j < _size; ++j) {
|
||||||
for (std::size_t i = 0; i <= _size; ++i) {
|
for (std::size_t i = 0; i < _size; ++i) {
|
||||||
size_t idx = j*(_size - 1) + i;
|
size_t idx = j*_size + i;
|
||||||
_vertices[idx].x = (float)i/_size - 0.5f;
|
_vertices[idx].x = (float)i/_size - 0.5f;
|
||||||
_vertices[idx].y = (float)j/_size - 0.5f;
|
_vertices[idx].y = (float)j/_size - 0.5f;
|
||||||
_vertices[idx].z = 0.f;
|
_vertices[idx].z = 0.f;
|
||||||
@ -28,45 +28,50 @@ void Mesh::generateVertices() const {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline size_t Mesh::normalIndex(size_t x, size_t y) {
|
||||||
|
return 2*(x + y*_size);
|
||||||
|
}
|
||||||
|
|
||||||
void Mesh::updateVertices() const {
|
void Mesh::updateVertices() const {
|
||||||
for(std::size_t j = 0; j < _size; ++j) {
|
for(std::size_t j = 0; j < _size; ++j) {
|
||||||
for(std::size_t i = 0; i <= _size; ++i) {
|
for(std::size_t i = 0; i < _size; ++i) {
|
||||||
std::size_t idx = j*(_size - 1) + i;
|
std::size_t idx = j*_size + i;
|
||||||
_vertices[idx].z = heightMap(i, j);
|
_vertices[idx].z = heightMap(i, j);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 1. Calc normals for all triangles
|
// 1. Calc normals for all triangles
|
||||||
// _normals.clear();
|
_normals.clear();
|
||||||
// for(std::size_t j = 0; j < _size; ++j) {
|
for(std::size_t j = 0; j < _size; ++j) {
|
||||||
// for(std::size_t i = 0; i <= _size; ++i) {
|
for(std::size_t i = 0; i < _size; ++i) {
|
||||||
// float x = _xs[i], x2 = _xs[i + 1];
|
float x = _xs[i], x2 = _xs[i + 1];
|
||||||
// float y = _ys[j], y2 = _ys[j + 1];
|
float y = _ys[j], y2 = _ys[j + 1];
|
||||||
//
|
|
||||||
// glm::vec3 p1(x, y, _vertices[j*(_size - 1) + i].z);
|
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 p2(x2, y, _vertices[j*(_size - 1) + i + 1].z);
|
||||||
// glm::vec3 p3(x, y2, _vertices[(j + 1)*(_size - 1) + i].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 p4(x2, y2, _vertices[(j + 1)*(_size - 1) + i + 1].z);
|
||||||
//
|
|
||||||
// glm::vec3 v1 = p1 - p3;
|
glm::vec3 v1 = p1 - p3;
|
||||||
// glm::vec3 v2 = p2 - p3;
|
glm::vec3 v2 = p2 - p3;
|
||||||
// glm::vec3 v3 = p4 - p3;
|
glm::vec3 v3 = p4 - p3;
|
||||||
//
|
|
||||||
// glm::vec3 norm1 = glm::cross(v2, v1);
|
glm::vec3 norm1 = glm::cross(v2, v1);
|
||||||
// glm::vec3 norm2 = glm::cross(v3, v2);
|
glm::vec3 norm2 = glm::cross(v3, v2);
|
||||||
//
|
|
||||||
// _normals.emplace_back(norm1);
|
_normals.emplace_back(norm1);
|
||||||
// _normals.emplace_back(norm2);
|
_normals.emplace_back(norm2);
|
||||||
// }
|
}
|
||||||
// }
|
}
|
||||||
|
|
||||||
// 2. Calc normals for all vertices based on precalculated normals for triangles
|
// 2. Calc normals for all vertices based on precalculated normals for triangles
|
||||||
// Normal of vertex is an average of normals of adjacent 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 j = 0; j < _size; ++j) {
|
||||||
// for (std::size_t i = 0; i <= _size; ++i) {
|
for (std::size_t i = 0; i < _size; ++i) {
|
||||||
//
|
size_t idx1 = normalIndex(i - 1, j - 1);
|
||||||
// }
|
size_t idx2 = normalIndex(i - 1, j);
|
||||||
// }
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Mesh::generateIndices() const {
|
void Mesh::generateIndices() const {
|
||||||
|
|||||||
@ -24,6 +24,9 @@ public:
|
|||||||
Mesh(ShaderProgram* shader, std::size_t size);
|
Mesh(ShaderProgram* shader, std::size_t size);
|
||||||
virtual ~Mesh();
|
virtual ~Mesh();
|
||||||
|
|
||||||
|
private:
|
||||||
|
size_t normalIndex(size_t x, size_t y);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void generateVertices() const override final;
|
void generateVertices() const override final;
|
||||||
void updateVertices() const override final;
|
void updateVertices() const override final;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user