summaryrefslogtreecommitdiff
path: root/src/graphics
diff options
context:
space:
mode:
Diffstat (limited to 'src/graphics')
-rw-r--r--src/graphics/shape.cpp44
-rw-r--r--src/graphics/shape.h8
2 files changed, 52 insertions, 0 deletions
diff --git a/src/graphics/shape.cpp b/src/graphics/shape.cpp
index 6c7ea00..fb0178f 100644
--- a/src/graphics/shape.cpp
+++ b/src/graphics/shape.cpp
@@ -99,6 +99,26 @@ void Shape::setVertices(const vector<Vector3f> &vertices)
glBindBuffer(GL_ARRAY_BUFFER, 0);
}
+void Shape::setVertices_and_Normals(const vector<Vector3f> &vertices, const vector<Vector3f> &calc_normals)
+{
+ m_vertices.clear();
+ copy(vertices.begin(), vertices.end(), back_inserter(m_vertices));
+
+ vector<Vector3f> verts;
+ vector<Vector3f> colors;
+ vector<Vector3f> normals;
+
+
+ updateMesh_withNormals(m_faces, vertices, calc_normals, verts, normals, colors);
+
+ glBindBuffer(GL_ARRAY_BUFFER, m_surfaceVbo);
+ glBufferData(GL_ARRAY_BUFFER, sizeof(float) * ((verts.size() * 3) + (normals.size() * 3) + (colors.size() * 3)), nullptr, GL_DYNAMIC_DRAW);
+ glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(float) * verts.size() * 3, static_cast<const void *>(verts.data()));
+ glBufferSubData(GL_ARRAY_BUFFER, sizeof(float) * verts.size() * 3, sizeof(float) * normals.size() * 3, static_cast<const void *>(normals.data()));
+ glBufferSubData(GL_ARRAY_BUFFER, sizeof(float) * ((verts.size() * 3) + (normals.size() * 3)), sizeof(float) * colors.size() * 3, static_cast<const void *>(colors.data()));
+ glBindBuffer(GL_ARRAY_BUFFER, 0);
+}
+
// ================== Model Matrix
void Shape::setModelMatrix(const Affine3f &model) { m_modelMatrix = model.matrix(); }
@@ -286,6 +306,30 @@ void Shape::updateMesh(const std::vector<Eigen::Vector3i> &faces,
}
}
+void Shape::updateMesh_withNormals(const std::vector<Eigen::Vector3i> &faces,
+ const std::vector<Eigen::Vector3f> &vertices,
+ const std::vector<Eigen::Vector3f> &calculated_norms,
+ std::vector<Eigen::Vector3f>& verts,
+ std::vector<Eigen::Vector3f>& normals,
+ std::vector<Eigen::Vector3f>& colors)
+{
+ verts.reserve(faces.size() * 3);
+ normals.reserve(faces.size() * 3);
+
+ for (const Eigen::Vector3i& face : faces) {
+ for (auto& v: {face[0], face[1], face[2]}) {
+ normals.push_back(calculated_norms[v]);
+ verts.push_back(vertices[v]);
+
+ if (m_anchors.find(v) == m_anchors.end()) {
+ colors.push_back(Vector3f(1,0,0));
+ } else {
+ colors.push_back(Vector3f(0, 1 - m_green, 1 - m_blue));
+ }
+ }
+ }
+}
+
void Shape::initGroundPlane(std::string texturePath, float depth, Shader* shader) {
QString ground_texture_filepath = QString(texturePath.c_str());
diff --git a/src/graphics/shape.h b/src/graphics/shape.h
index 4a3632c..165fa96 100644
--- a/src/graphics/shape.h
+++ b/src/graphics/shape.h
@@ -30,6 +30,8 @@ public:
void init(const std::vector<Eigen::Vector3f> &vertices, const std::vector<Eigen::Vector3i> &triangles);
void setVertices(const std::vector<Eigen::Vector3f> &vertices);
+ void setVertices_and_Normals(const std::vector<Eigen::Vector3f> &vertices, const std::vector<Eigen::Vector3f> &normals);
+
void setModelMatrix(const Eigen::Affine3f &model);
@@ -78,4 +80,10 @@ private:
std::vector<Eigen::Vector3f>& verts,
std::vector<Eigen::Vector3f>& normals,
std::vector<Eigen::Vector3f>& colors);
+ void updateMesh_withNormals(const std::vector<Eigen::Vector3i> &faces,
+ const std::vector<Eigen::Vector3f> &vertices,
+ const std::vector<Eigen::Vector3f> &calculated_norms,
+ std::vector<Eigen::Vector3f>& verts,
+ std::vector<Eigen::Vector3f>& normals,
+ std::vector<Eigen::Vector3f>& colors);
};