diff options
author | Sebastian Park <SebPark03@gmail.com> | 2024-04-23 18:03:00 -0400 |
---|---|---|
committer | Sebastian Park <SebPark03@gmail.com> | 2024-04-23 18:03:00 -0400 |
commit | 5c8c2f86376050787f2960656ca5865fcf87c020 (patch) | |
tree | 19fa985f81099256e67184496179ebb2200964b5 /src/graphics/shape.cpp | |
parent | c1e29bb93fcc24bbbdadcefede3fc9cddc0df48c (diff) | |
parent | 84c0bfa85374e45f06c1b6d7311b80f78670fb7c (diff) |
Merge remote-tracking branch 'origin/jess_working_norms'
Diffstat (limited to 'src/graphics/shape.cpp')
-rw-r--r-- | src/graphics/shape.cpp | 44 |
1 files changed, 44 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()); |